/network` for each affected repository and click the **Schedule** button.
+
+ backups:
+ - '{% data variables.product.prodname_ghe_server %} 3.3 requires at least [GitHub Enterprise Backup Utilities 3.3.0](https://github.com/github/backup-utils) for [Backups and Disaster Recovery](/admin/configuration/configuring-your-enterprise/configuring-backups-on-your-appliance).'
diff --git a/data/release-notes/github-ae/2021-06/2021-12-06.yml b/data/release-notes/github-ae/2021-06/2021-12-06.yml
index 7daad8a7fc..1b0a3fcaa6 100644
--- a/data/release-notes/github-ae/2021-06/2021-12-06.yml
+++ b/data/release-notes/github-ae/2021-06/2021-12-06.yml
@@ -61,6 +61,8 @@ sections:
- A self-hosted runner's version is updated.
- heading: 'Authentication'
notes:
+ - |
+ GitHub AE now officially supports Okta for SAML single sign-on (SSO) and user provisioning with SCIM. You can also map groups in Okta to teams on GitHub AE. For more information, see "[Configuring authentication and provisioning for your enterprise using Okta](/admin/authentication/configuring-authentication-and-provisioning-with-your-identity-provider/configuring-authentication-and-provisioning-for-your-enterprise-using-okta)" and "[Mapping Okta groups to teams](/admin/authentication/configuring-authentication-and-provisioning-with-your-identity-provider/mapping-okta-groups-to-teams)."
- |
The format of authentication tokens for {% data variables.product.product_name %} has changed. The change affects the format of personal access tokens and access tokens for OAuth Apps, as well as user-to-server, server-to-server, and refresh tokens for GitHub Apps. {% data variables.product.company_short %} recommends updating existing tokens as soon as possible to improve security and allow secret scanning to detect the tokens. For more information, see "[About authentication to {% data variables.product.prodname_dotcom %}](/github/authenticating-to-github/keeping-your-account-and-data-secure/about-authentication-to-github#githubs-token-formats)" and "[About secret scanning](/code-security/secret-security/about-secret-scanning)."
- |
diff --git a/data/reusables/classroom/classroom-admins-link.md b/data/reusables/classroom/classroom-admins-link.md
new file mode 100644
index 0000000000..238033da6d
--- /dev/null
+++ b/data/reusables/classroom/classroom-admins-link.md
@@ -0,0 +1 @@
+For more information on classroom admins, see "[About management of classrooms](/education/manage-coursework-with-github-classroom/teach-with-github-classroom/manage-classrooms#about-management-of-classrooms)."
\ No newline at end of file
diff --git a/data/reusables/enterprise/navigate-to-log-streaming-tab.md b/data/reusables/enterprise/navigate-to-log-streaming-tab.md
new file mode 100644
index 0000000000..84e6987d24
--- /dev/null
+++ b/data/reusables/enterprise/navigate-to-log-streaming-tab.md
@@ -0,0 +1,4 @@
+{% data reusables.enterprise-accounts.access-enterprise %}
+{% data reusables.enterprise-accounts.settings-tab %}
+{% data reusables.enterprise-accounts.audit-log-tab %}
+1. Click the **Log streaming** tab.
\ No newline at end of file
diff --git a/data/reusables/enterprise/verify-audit-log-streaming-endpoint.md b/data/reusables/enterprise/verify-audit-log-streaming-endpoint.md
new file mode 100644
index 0000000000..37b1ab5120
--- /dev/null
+++ b/data/reusables/enterprise/verify-audit-log-streaming-endpoint.md
@@ -0,0 +1 @@
+1. Verify the endpoint, then click **Save**.
diff --git a/data/reusables/enterprise_installation/proxy-incompatible-with-aws-nlbs.md b/data/reusables/enterprise_installation/proxy-incompatible-with-aws-nlbs.md
new file mode 100644
index 0000000000..690abb634f
--- /dev/null
+++ b/data/reusables/enterprise_installation/proxy-incompatible-with-aws-nlbs.md
@@ -0,0 +1,5 @@
+{% note %}
+
+**Note:** {% data variables.product.prodname_ghe_server %} supports PROXY Protocol V1, which is incompatible with AWS Network Load Balancers. If you use AWS Network Load Balancers with {% data variables.product.prodname_ghe_server %}, do not enable PROXY support.
+
+{% endnote %}
\ No newline at end of file
diff --git a/data/reusables/github-actions/self-hosted-runner-groups-navigate-to-repo-org-enterprise.md b/data/reusables/github-actions/self-hosted-runner-groups-navigate-to-repo-org-enterprise.md
index 3cf61b3670..2efea4d2c3 100644
--- a/data/reusables/github-actions/self-hosted-runner-groups-navigate-to-repo-org-enterprise.md
+++ b/data/reusables/github-actions/self-hosted-runner-groups-navigate-to-repo-org-enterprise.md
@@ -6,7 +6,7 @@
{% elsif ghec or ghes or ghae %}
1. Navigate to where your self-hosted runner groups are located:
* **In an organization**: navigate to the main page and click {% octicon "gear" aria-label="The Settings gear" %} **Settings**.{% ifversion ghec %}
- * **If using an enterprise account**: navigate to your enterprise account by visiting `https://github.com/enterprises/ENTERPRISE-NAME`, replacing `ENTERPRISE-NAME` with your enterprise account's name.{% elsif ghes or ghae %}
+ * **If using an enterprise account**: navigate to your enterprise account by clicking your profile photo in the top-right corner of {% data variables.product.prodname_dotcom_the_website %}, then clicking **Your enterprises**, then clicking the enterprise.{% elsif ghes or ghae %}
* **If using an enterprise-level runner**:
1. In the upper-right corner of any page, click {% octicon "rocket" aria-label="The rocket ship" %}.
2. In the left sidebar, click **Enterprise overview**.
diff --git a/data/reusables/github-actions/self-hosted-runner-navigate-to-org-enterprise.md b/data/reusables/github-actions/self-hosted-runner-navigate-to-org-enterprise.md
index e42d737c5b..f3dc1d11ca 100644
--- a/data/reusables/github-actions/self-hosted-runner-navigate-to-org-enterprise.md
+++ b/data/reusables/github-actions/self-hosted-runner-navigate-to-org-enterprise.md
@@ -6,7 +6,7 @@
{% elsif ghec or ghes or ghae %}
1. Navigate to where your self-hosted runner is registered:
* **In an organization**: navigate to the main page and click {% octicon "gear" aria-label="The Settings gear" %} **Settings**.
- * {% ifversion ghec %}**If using an enterprise account**: navigate to your enterprise account by visiting `https://github.com/enterprises/ENTERPRISE-NAME`, replacing `ENTERPRISE-NAME` with your enterprise account's name.{% elsif ghes or ghae %}**If using an enterprise-level runner**:
+ * {% ifversion ghec %}**If using an enterprise account**: navigate to your enterprise account by clicking your profile photo in the top-right corner of {% data variables.product.prodname_dotcom_the_website %}, then clicking **Your enterprises**, then clicking the enterprise.{% elsif ghes or ghae %}**If using an enterprise-level runner**:
1. In the upper-right corner of any page, click {% octicon "rocket" aria-label="The rocket ship" %}.
1. In the left sidebar, click **Enterprise overview**.
diff --git a/data/reusables/github-actions/self-hosted-runner-navigate-to-repo-org-enterprise.md b/data/reusables/github-actions/self-hosted-runner-navigate-to-repo-org-enterprise.md
index 668aeeded6..afa35a6828 100644
--- a/data/reusables/github-actions/self-hosted-runner-navigate-to-repo-org-enterprise.md
+++ b/data/reusables/github-actions/self-hosted-runner-navigate-to-repo-org-enterprise.md
@@ -6,7 +6,7 @@
{% elsif ghec or ghes or ghae %}
1. Navigate to where your self-hosted runner is registered:
* **In an organization or repository**: navigate to the main page and click {% octicon "gear" aria-label="The Settings gear" %} **Settings**. {% ifversion ghec %}
- * **If using an enterprise account**: navigate to your enterprise account by visiting `https://github.com/enterprises/ENTERPRISE-NAME`, replacing `ENTERPRISE-NAME` with your enterprise account's name.{% elsif ghes or ghae %}
+ * **If using an enterprise account**: navigate to your enterprise account by clicking your profile photo in the top-right corner of {% data variables.product.prodname_dotcom_the_website %}, then clicking **Your enterprises**, then clicking the enterprise.{% elsif ghes or ghae %}
* **If using an enterprise-level runner**:
1. In the upper-right corner of any page, click {% octicon "rocket" aria-label="The rocket ship" %}.
2. In the left sidebar, click **Enterprise overview**.
diff --git a/data/reusables/github-ae/saml-idp-table.md b/data/reusables/github-ae/saml-idp-table.md
new file mode 100644
index 0000000000..8e58629e1f
--- /dev/null
+++ b/data/reusables/github-ae/saml-idp-table.md
@@ -0,0 +1,4 @@
+IdP | SAML | User provisioning | Team mapping|
+--- | --- | ---------------- | --------- |
+[Azure Active Directory (Azure AD)](/admin/authentication/configuring-authentication-and-provisioning-with-your-identity-provider/configuring-authentication-and-provisioning-for-your-enterprise-using-azure-ad) | {% octicon "check-circle-fill" aria-label="The check icon" %} | {% octicon "check-circle-fill" aria-label="The check icon" %}| {% octicon "check-circle-fill" aria-label="The check icon" %} |
+[Okta](/admin/authentication/configuring-authentication-and-provisioning-with-your-identity-provider/configuring-authentication-and-provisioning-for-your-enterprise-using-okta) | {% octicon "check-circle-fill" aria-label="The check icon" %}[Beta](/admin/authentication/configuring-authentication-and-provisioning-with-your-identity-provider/configuring-authentication-and-provisioning-for-your-enterprise-using-okta)| {% octicon "check-circle-fill" aria-label="The check icon" %}[Beta](/admin/authentication/configuring-authentication-and-provisioning-with-your-identity-provider/configuring-authentication-and-provisioning-for-your-enterprise-using-okta)| {% octicon "check-circle-fill" aria-label= "The check icon" %}[Beta](/admin/authentication/configuring-authentication-and-provisioning-with-your-identity-provider/mapping-okta-groups-to-teams) |
\ No newline at end of file
diff --git a/data/reusables/organizations/organizations_include.md b/data/reusables/organizations/organizations_include.md
index b956eb9e65..ae6b8032bf 100644
--- a/data/reusables/organizations/organizations_include.md
+++ b/data/reusables/organizations/organizations_include.md
@@ -3,7 +3,8 @@ Organizations include:
- The ability to give members [a range of access permissions to your organization's repositories](/articles/repository-permission-levels-for-an-organization)
- [Nested teams that reflect your company or group's structure](/articles/about-teams) with cascading access permissions and mentions{% ifversion not ghae %}
- The ability for organization owners to view members' [two-factor authentication (2FA) status](/articles/about-two-factor-authentication)
-- The option to [require all organization members to use two-factor authentication](/articles/requiring-two-factor-authentication-in-your-organization){% endif %}
+- The option to [require all organization members to use two-factor authentication](/articles/requiring-two-factor-authentication-in-your-organization){% endif %}{% ifversion fpt%}
+- The ability to [create and administer classrooms with GitHub Classroom](/education/manage-coursework-with-github-classroom/teach-with-github-classroom/manage-classrooms){% endif %}
{% ifversion fpt or ghec %}
You can use organizations for free, with {% data variables.product.prodname_free_team %}, which includes unlimited collaborators on unlimited public repositories with full features, and unlimited private repositories with limited features.
diff --git a/data/reusables/saml/external-group-audit-events.md b/data/reusables/saml/external-group-audit-events.md
new file mode 100644
index 0000000000..9ae8e1b431
--- /dev/null
+++ b/data/reusables/saml/external-group-audit-events.md
@@ -0,0 +1,7 @@
+| Action | Description
+|------------------|-------------------
+| `external_group.delete` | Triggered when your Okta group is deleted. For more information, see ["Mapping Okta groups to teams](/admin/authentication/configuring-authentication-and-provisioning-with-your-identity-provider/mapping-okta-groups-to-teams)."
+| `external_group.link` | Triggered when your Okta group is mapped to your {% data variables.product.prodname_ghe_managed %} team. For more information, see ["Mapping Okta groups to teams](/admin/authentication/configuring-authentication-and-provisioning-with-your-identity-provider/mapping-okta-groups-to-teams)."
+| `external_group.provision` | Triggered when an Okta group is mapped to your team on {% data variables.product.prodname_ghe_managed %}. For more information, see ["Mapping Okta groups to teams](/admin/authentication/configuring-authentication-and-provisioning-with-your-identity-provider/mapping-okta-groups-to-teams)."
+| `external_group.unlink` | Triggered when your Okta group is unmapped from your {% data variables.product.prodname_ghe_managed %} team. For more information, see ["Mapping Okta groups to teams](/admin/authentication/configuring-authentication-and-provisioning-with-your-identity-provider/mapping-okta-groups-to-teams)."
+| `external_group.update` | Triggered when your Okta group's settings are updated. For more information, see ["Mapping Okta groups to teams](/admin/authentication/configuring-authentication-and-provisioning-with-your-identity-provider/mapping-okta-groups-to-teams)."
\ No newline at end of file
diff --git a/data/reusables/saml/external-identity-audit-events.md b/data/reusables/saml/external-identity-audit-events.md
new file mode 100644
index 0000000000..a2c44df73b
--- /dev/null
+++ b/data/reusables/saml/external-identity-audit-events.md
@@ -0,0 +1,5 @@
+| Action | Description
+|------------------|-------------------
+| `external_identity.deprovision` | Triggered when a user is removed from your Okta group and is subsequently deprovisioned from {% data variables.product.prodname_ghe_managed %}. For more information, see ["Mapping Okta groups to teams](/admin/authentication/configuring-authentication-and-provisioning-with-your-identity-provider/mapping-okta-groups-to-teams)."
+| `external_identity.provision` | Triggered when an Okta user is added to your Okta group and is subsequently provisioned to the mapped team on {% data variables.product.prodname_ghe_managed %}. For more information, see ["Mapping Okta groups to teams](/admin/authentication/configuring-authentication-and-provisioning-with-your-identity-provider/mapping-okta-groups-to-teams)."
+| `external_identity.update` | Triggered when an Okta user's settings are updated. For more information, see ["Mapping Okta groups to teams](/admin/authentication/configuring-authentication-and-provisioning-with-your-identity-provider/mapping-okta-groups-to-teams)."
\ No newline at end of file
diff --git a/data/reusables/saml/okta-ae-applications-menu.md b/data/reusables/saml/okta-ae-applications-menu.md
new file mode 100644
index 0000000000..e20691a67e
--- /dev/null
+++ b/data/reusables/saml/okta-ae-applications-menu.md
@@ -0,0 +1,3 @@
+1. In the Okta Dashboard, expand the **Applications** menu, then click **Applications**.
+
+ 
diff --git a/data/reusables/saml/okta-ae-configure-app.md b/data/reusables/saml/okta-ae-configure-app.md
new file mode 100644
index 0000000000..ba304314fb
--- /dev/null
+++ b/data/reusables/saml/okta-ae-configure-app.md
@@ -0,0 +1,3 @@
+1. Click on the {% data variables.product.prodname_ghe_managed %} app.
+
+ 
diff --git a/data/reusables/saml/okta-ae-provisioning-tab.md b/data/reusables/saml/okta-ae-provisioning-tab.md
new file mode 100644
index 0000000000..b3f2c37263
--- /dev/null
+++ b/data/reusables/saml/okta-ae-provisioning-tab.md
@@ -0,0 +1,3 @@
+1. Click **Provisioning**.
+
+ 
diff --git a/data/reusables/saml/okta-ae-sso-beta.md b/data/reusables/saml/okta-ae-sso-beta.md
new file mode 100644
index 0000000000..599020093b
--- /dev/null
+++ b/data/reusables/saml/okta-ae-sso-beta.md
@@ -0,0 +1,5 @@
+{% note %}
+
+**Note:** {% data variables.product.prodname_ghe_managed %} single sign-on (SSO) support for Okta is currently in beta.
+
+{% endnote %}
\ No newline at end of file
diff --git a/data/reusables/saml/saml-supported-idps.md b/data/reusables/saml/saml-supported-idps.md
index 468450dbe9..cf46365b0a 100644
--- a/data/reusables/saml/saml-supported-idps.md
+++ b/data/reusables/saml/saml-supported-idps.md
@@ -11,4 +11,5 @@
- Shibboleth
{% elsif ghae %}
- Azure Active Directory (Azure AD)
+- Okta (beta)
{% endif %}
diff --git a/data/reusables/scim/supported-idps.md b/data/reusables/scim/supported-idps.md
index fbcb9c559d..8ac2514209 100644
--- a/data/reusables/scim/supported-idps.md
+++ b/data/reusables/scim/supported-idps.md
@@ -2,4 +2,5 @@ The following IdPs can provision or deprovision user accounts on {% data variabl
{% ifversion ghae %}
- Azure AD
+- Okta (currently in beta)
{% endif %}
diff --git a/data/variables/release_candidate.yml b/data/variables/release_candidate.yml
index 5a2bacfc2a..026d2f7e61 100644
--- a/data/variables/release_candidate.yml
+++ b/data/variables/release_candidate.yml
@@ -1 +1 @@
-version: enterprise-server@3.3
+version: ''
diff --git a/lib/rest/static/decorated/github.ae.json b/lib/rest/static/decorated/github.ae.json
index e961c7b48c..5da83708b5 100644
--- a/lib/rest/static/decorated/github.ae.json
+++ b/lib/rest/static/decorated/github.ae.json
@@ -30414,18 +30414,6 @@
"rawType": "boolean",
"rawDescription": "Requires all conversations on code to be resolved before a pull request can be merged into a branch that matches this rule. Set to `false` to disable. Default: `false`.",
"childParamsGroups": []
- },
- "contexts": {
- "type": "array of strings",
- "description": "The list of status checks to require in order to merge into this branch.
",
- "items": {
- "type": "string"
- },
- "name": "contexts",
- "in": "body",
- "rawType": "array",
- "rawDescription": "The list of status checks to require in order to merge into this branch.",
- "childParamsGroups": []
}
},
"required": [
@@ -31108,18 +31096,6 @@
"rawType": "boolean",
"rawDescription": "Requires all conversations on code to be resolved before a pull request can be merged into a branch that matches this rule. Set to `false` to disable. Default: `false`.",
"childParamsGroups": []
- },
- {
- "type": "array of strings",
- "description": "The list of status checks to require in order to merge into this branch.
",
- "items": {
- "type": "string"
- },
- "name": "contexts",
- "in": "body",
- "rawType": "array",
- "rawDescription": "The list of status checks to require in order to merge into this branch.",
- "childParamsGroups": []
}
]
},
@@ -32330,15 +32306,76 @@
"contexts": {
"type": "array of strings",
"deprecated": true,
- "description": "The list of status checks to require in order to merge into this branch
",
+ "description": "Deprecated: The list of status checks to require in order to merge into this branch. If any of these checks have recently been set by a particular GitHub App, they will be required to come from that app in future for the branch to merge. Use checks instead of contexts for more fine-grained control.
",
"items": {
"type": "string"
},
"name": "contexts",
"in": "body",
"rawType": "array",
- "rawDescription": "The list of status checks to require in order to merge into this branch",
+ "rawDescription": "**Deprecated**: The list of status checks to require in order to merge into this branch. If any of these checks have recently been set by a particular GitHub App, they will be required to come from that app in future for the branch to merge. Use `checks` instead of `contexts` for more fine-grained control.\n",
"childParamsGroups": []
+ },
+ "checks": {
+ "type": "array of objects",
+ "description": "The list of status checks to require in order to merge into this branch.
",
+ "items": {
+ "type": "object",
+ "required": [
+ "context"
+ ],
+ "properties": {
+ "context": {
+ "type": "string",
+ "description": "Required. The name of the required check
",
+ "name": "context",
+ "in": "body",
+ "rawType": "string",
+ "rawDescription": "The name of the required check",
+ "childParamsGroups": []
+ },
+ "app_id": {
+ "type": "integer",
+ "description": "The ID of the GitHub App that must provide this check. Omit this field to automatically select the GitHub App that has recently provided this check, or any app if it was not set by a GitHub App. Pass -1 to explicitly allow any app to set the status.
",
+ "name": "app_id",
+ "in": "body",
+ "rawType": "integer",
+ "rawDescription": "The ID of the GitHub App that must provide this check. Omit this field to automatically select the GitHub App that has recently provided this check, or any app if it was not set by a GitHub App. Pass -1 to explicitly allow any app to set the status.",
+ "childParamsGroups": []
+ }
+ }
+ },
+ "name": "checks",
+ "in": "body",
+ "rawType": "array",
+ "rawDescription": "The list of status checks to require in order to merge into this branch.",
+ "childParamsGroups": [
+ {
+ "parentName": "checks",
+ "parentType": "items",
+ "id": "checks-items",
+ "params": [
+ {
+ "type": "string",
+ "description": "Required. The name of the required check
",
+ "name": "context",
+ "in": "body",
+ "rawType": "string",
+ "rawDescription": "The name of the required check",
+ "childParamsGroups": []
+ },
+ {
+ "type": "integer",
+ "description": "The ID of the GitHub App that must provide this check. Omit this field to automatically select the GitHub App that has recently provided this check, or any app if it was not set by a GitHub App. Pass -1 to explicitly allow any app to set the status.
",
+ "name": "app_id",
+ "in": "body",
+ "rawType": "integer",
+ "rawDescription": "The ID of the GitHub App that must provide this check. Omit this field to automatically select the GitHub App that has recently provided this check, or any app if it was not set by a GitHub App. Pass -1 to explicitly allow any app to set the status.",
+ "childParamsGroups": []
+ }
+ ]
+ }
+ ]
}
}
},
@@ -32365,30 +32402,6 @@
"contentType": "application/json",
"notes": [],
"descriptionHTML": "Protected branches are available in public repositories with GitHub Free and GitHub Free for organizations, and in public and private repositories with GitHub Pro, GitHub Team, GitHub Enterprise Cloud, and GitHub Enterprise Server. For more information, see GitHub's products in the GitHub Help documentation.
\nUpdating required status checks requires admin or owner permissions to the repository and branch protection to be enabled.
",
- "bodyParameters": [
- {
- "type": "boolean",
- "description": "Require branches to be up to date before merging.
",
- "name": "strict",
- "in": "body",
- "rawType": "boolean",
- "rawDescription": "Require branches to be up to date before merging.",
- "childParamsGroups": []
- },
- {
- "type": "array of strings",
- "deprecated": true,
- "description": "The list of status checks to require in order to merge into this branch
",
- "items": {
- "type": "string"
- },
- "name": "contexts",
- "in": "body",
- "rawType": "array",
- "rawDescription": "The list of status checks to require in order to merge into this branch",
- "childParamsGroups": []
- }
- ],
"responses": [
{
"httpStatusCode": "200",
@@ -32406,6 +32419,91 @@
"httpStatusMessage": "Unprocessable Entity",
"description": "Validation failed"
}
+ ],
+ "bodyParameters": [
+ {
+ "type": "boolean",
+ "description": "Require branches to be up to date before merging.
",
+ "name": "strict",
+ "in": "body",
+ "rawType": "boolean",
+ "rawDescription": "Require branches to be up to date before merging.",
+ "childParamsGroups": []
+ },
+ {
+ "type": "array of strings",
+ "deprecated": true,
+ "description": "Deprecated: The list of status checks to require in order to merge into this branch. If any of these checks have recently been set by a particular GitHub App, they will be required to come from that app in future for the branch to merge. Use checks instead of contexts for more fine-grained control.
",
+ "items": {
+ "type": "string"
+ },
+ "name": "contexts",
+ "in": "body",
+ "rawType": "array",
+ "rawDescription": "**Deprecated**: The list of status checks to require in order to merge into this branch. If any of these checks have recently been set by a particular GitHub App, they will be required to come from that app in future for the branch to merge. Use `checks` instead of `contexts` for more fine-grained control.\n",
+ "childParamsGroups": []
+ },
+ {
+ "type": "array of objects",
+ "description": "The list of status checks to require in order to merge into this branch.
",
+ "items": {
+ "type": "object",
+ "required": [
+ "context"
+ ],
+ "properties": {
+ "context": {
+ "type": "string",
+ "description": "Required. The name of the required check
",
+ "name": "context",
+ "in": "body",
+ "rawType": "string",
+ "rawDescription": "The name of the required check",
+ "childParamsGroups": []
+ },
+ "app_id": {
+ "type": "integer",
+ "description": "The ID of the GitHub App that must provide this check. Omit this field to automatically select the GitHub App that has recently provided this check, or any app if it was not set by a GitHub App. Pass -1 to explicitly allow any app to set the status.
",
+ "name": "app_id",
+ "in": "body",
+ "rawType": "integer",
+ "rawDescription": "The ID of the GitHub App that must provide this check. Omit this field to automatically select the GitHub App that has recently provided this check, or any app if it was not set by a GitHub App. Pass -1 to explicitly allow any app to set the status.",
+ "childParamsGroups": []
+ }
+ }
+ },
+ "name": "checks",
+ "in": "body",
+ "rawType": "array",
+ "rawDescription": "The list of status checks to require in order to merge into this branch.",
+ "childParamsGroups": [
+ {
+ "parentName": "checks",
+ "parentType": "items",
+ "id": "checks-items",
+ "params": [
+ {
+ "type": "string",
+ "description": "Required. The name of the required check
",
+ "name": "context",
+ "in": "body",
+ "rawType": "string",
+ "rawDescription": "The name of the required check",
+ "childParamsGroups": []
+ },
+ {
+ "type": "integer",
+ "description": "The ID of the GitHub App that must provide this check. Omit this field to automatically select the GitHub App that has recently provided this check, or any app if it was not set by a GitHub App. Pass -1 to explicitly allow any app to set the status.
",
+ "name": "app_id",
+ "in": "body",
+ "rawType": "integer",
+ "rawDescription": "The ID of the GitHub App that must provide this check. Omit this field to automatically select the GitHub App that has recently provided this check, or any app if it was not set by a GitHub App. Pass -1 to explicitly allow any app to set the status.",
+ "childParamsGroups": []
+ }
+ ]
+ }
+ ]
+ }
]
},
{
@@ -40513,6 +40611,113 @@
}
]
},
+ {
+ "verb": "delete",
+ "requestPath": "/repos/{owner}/{repo}/code-scanning/analyses/{analysis_id}",
+ "serverUrl": "https://{hostname}/api/v3",
+ "parameters": [
+ {
+ "name": "owner",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string"
+ },
+ "descriptionHTML": ""
+ },
+ {
+ "name": "repo",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string"
+ },
+ "descriptionHTML": ""
+ },
+ {
+ "name": "analysis_id",
+ "in": "path",
+ "description": "The ID of the analysis, as returned from the `GET /repos/{owner}/{repo}/code-scanning/analyses` operation.",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ },
+ "descriptionHTML": "The ID of the analysis, as returned from the GET /repos/{owner}/{repo}/code-scanning/analyses operation.
"
+ },
+ {
+ "name": "confirm_delete",
+ "in": "query",
+ "description": "Allow deletion if the specified analysis is the last in a set. If you attempt to delete the final analysis in a set without setting this parameter to `true`, you'll get a 400 response with the message: `Analysis is last of its type and deletion may result in the loss of historical alert data. Please specify confirm_delete.`",
+ "required": false,
+ "schema": {
+ "type": "string",
+ "nullable": true
+ },
+ "descriptionHTML": "Allow deletion if the specified analysis is the last in a set. If you attempt to delete the final analysis in a set without setting this parameter to true, you'll get a 400 response with the message: Analysis is last of its type and deletion may result in the loss of historical alert data. Please specify confirm_delete.
"
+ }
+ ],
+ "x-codeSamples": [
+ {
+ "lang": "Shell",
+ "source": "curl \\\n -X DELETE \\\n -H \"Accept: application/vnd.github.v3+json\" \\\n https://{hostname}/api/v3/repos/octocat/hello-world/code-scanning/analyses/42",
+ "html": "curl \\\n -X DELETE \\\n -H \"Accept: application/vnd.github.v3+json\" \\\n https://{hostname}/api/v3/repos/octocat/hello-world/code-scanning/analyses/42
"
+ },
+ {
+ "lang": "JavaScript",
+ "source": "await octokit.request('DELETE /repos/{owner}/{repo}/code-scanning/analyses/{analysis_id}', {\n owner: 'octocat',\n repo: 'hello-world',\n analysis_id: 42\n})",
+ "html": "await octokit.request('DELETE /repos/{owner}/{repo}/code-scanning/analyses/{analysis_id}', {\n owner: 'octocat',\n repo: 'hello-world',\n analysis_id: 42\n})\n
"
+ }
+ ],
+ "summary": "Delete a code scanning analysis from a repository",
+ "description": "Deletes a specified code scanning analysis from a repository. For\nprivate repositories, you must use an access token with the `repo` scope. For public repositories,\nyou must use an access token with `public_repo` and `repo:security_events` scopes.\nGitHub Apps must have the `security_events` write permission to use this endpoint.\n\nYou can delete one analysis at a time.\nTo delete a series of analyses, start with the most recent analysis and work backwards.\nConceptually, the process is similar to the undo function in a text editor.\n\nWhen you list the analyses for a repository,\none or more will be identified as deletable in the response:\n\n```\n\"deletable\": true\n```\n\nAn analysis is deletable when it's the most recent in a set of analyses.\nTypically, a repository will have multiple sets of analyses\nfor each enabled code scanning tool,\nwhere a set is determined by a unique combination of analysis values:\n\n* `ref`\n* `tool`\n* `analysis_key`\n* `environment`\n\nIf you attempt to delete an analysis that is not the most recent in a set,\nyou'll get a 400 response with the message:\n\n```\nAnalysis specified is not deletable.\n```\n\nThe response from a successful `DELETE` operation provides you with\ntwo alternative URLs for deleting the next analysis in the set:\n`next_analysis_url` and `confirm_delete_url`.\nUse the `next_analysis_url` URL if you want to avoid accidentally deleting the final analysis\nin a set. This is a useful option if you want to preserve at least one analysis\nfor the specified tool in your repository.\nUse the `confirm_delete_url` URL if you are content to remove all analyses for a tool.\nWhen you delete the last analysis in a set, the value of `next_analysis_url` and `confirm_delete_url`\nin the 200 response is `null`.\n\nAs an example of the deletion process,\nlet's imagine that you added a workflow that configured a particular code scanning tool\nto analyze the code in a repository. This tool has added 15 analyses:\n10 on the default branch, and another 5 on a topic branch.\nYou therefore have two separate sets of analyses for this tool.\nYou've now decided that you want to remove all of the analyses for the tool.\nTo do this you must make 15 separate deletion requests.\nTo start, you must find an analysis that's identified as deletable.\nEach set of analyses always has one that's identified as deletable.\nHaving found the deletable analysis for one of the two sets,\ndelete this analysis and then continue deleting the next analysis in the set until they're all deleted.\nThen repeat the process for the second set.\nThe procedure therefore consists of a nested loop:\n\n**Outer loop**:\n* List the analyses for the repository, filtered by tool.\n* Parse this list to find a deletable analysis. If found:\n\n **Inner loop**:\n * Delete the identified analysis.\n * Parse the response for the value of `confirm_delete_url` and, if found, use this in the next iteration.\n\nThe above process assumes that you want to remove all trace of the tool's analyses from the GitHub user interface, for the specified repository, and it therefore uses the `confirm_delete_url` value. Alternatively, you could use the `next_analysis_url` value, which would leave the last analysis in each set undeleted to avoid removing a tool's analysis entirely.",
+ "operationId": "code-scanning/delete-analysis",
+ "tags": [
+ "code-scanning"
+ ],
+ "externalDocs": {
+ "description": "API method documentation",
+ "url": "https://docs.github.com/github-ae@latest/rest/reference/code-scanning#delete-a-code-scanning-analysis-from-a-repository"
+ },
+ "x-github": {
+ "enabledForGitHubApps": true,
+ "githubCloudOnly": false,
+ "category": "code-scanning"
+ },
+ "slug": "delete-a-code-scanning-analysis-from-a-repository",
+ "category": "code-scanning",
+ "categoryLabel": "Code scanning",
+ "notes": [],
+ "bodyParameters": [],
+ "descriptionHTML": "Deletes a specified code scanning analysis from a repository. For\nprivate repositories, you must use an access token with the repo scope. For public repositories,\nyou must use an access token with public_repo and repo:security_events scopes.\nGitHub Apps must have the security_events write permission to use this endpoint.
\nYou can delete one analysis at a time.\nTo delete a series of analyses, start with the most recent analysis and work backwards.\nConceptually, the process is similar to the undo function in a text editor.
\nWhen you list the analyses for a repository,\none or more will be identified as deletable in the response:
\n\"deletable\": true\n
\nAn analysis is deletable when it's the most recent in a set of analyses.\nTypically, a repository will have multiple sets of analyses\nfor each enabled code scanning tool,\nwhere a set is determined by a unique combination of analysis values:
\n\nref \ntool \nanalysis_key \nenvironment \n
\nIf you attempt to delete an analysis that is not the most recent in a set,\nyou'll get a 400 response with the message:
\nAnalysis specified is not deletable.\n
\nThe response from a successful DELETE operation provides you with\ntwo alternative URLs for deleting the next analysis in the set:\nnext_analysis_url and confirm_delete_url.\nUse the next_analysis_url URL if you want to avoid accidentally deleting the final analysis\nin a set. This is a useful option if you want to preserve at least one analysis\nfor the specified tool in your repository.\nUse the confirm_delete_url URL if you are content to remove all analyses for a tool.\nWhen you delete the last analysis in a set, the value of next_analysis_url and confirm_delete_url\nin the 200 response is null.
\nAs an example of the deletion process,\nlet's imagine that you added a workflow that configured a particular code scanning tool\nto analyze the code in a repository. This tool has added 15 analyses:\n10 on the default branch, and another 5 on a topic branch.\nYou therefore have two separate sets of analyses for this tool.\nYou've now decided that you want to remove all of the analyses for the tool.\nTo do this you must make 15 separate deletion requests.\nTo start, you must find an analysis that's identified as deletable.\nEach set of analyses always has one that's identified as deletable.\nHaving found the deletable analysis for one of the two sets,\ndelete this analysis and then continue deleting the next analysis in the set until they're all deleted.\nThen repeat the process for the second set.\nThe procedure therefore consists of a nested loop:
\nOuter loop:
\n\n- \n
List the analyses for the repository, filtered by tool.
\n \n- \n
Parse this list to find a deletable analysis. If found:
\nInner loop:
\n\n- Delete the identified analysis.
\n- Parse the response for the value of
confirm_delete_url and, if found, use this in the next iteration. \n
\n \n
\nThe above process assumes that you want to remove all trace of the tool's analyses from the GitHub user interface, for the specified repository, and it therefore uses the confirm_delete_url value. Alternatively, you could use the next_analysis_url value, which would leave the last analysis in each set undeleted to avoid removing a tool's analysis entirely.
",
+ "responses": [
+ {
+ "httpStatusCode": "200",
+ "httpStatusMessage": "OK",
+ "description": "Default response",
+ "payload": "{\n \"next_analysis_url\": \"https://api.github.com/repos/octocat/hello-world/code-scanning/analyses/41\",\n \"confirm_delete_url\": \"https://api.github.com/repos/octocat/hello-world/code-scanning/analyses/41?confirm_delete\"\n}\n
"
+ },
+ {
+ "httpStatusCode": "400",
+ "httpStatusMessage": "Bad Request",
+ "description": "Bad Request"
+ },
+ {
+ "httpStatusCode": "403",
+ "httpStatusMessage": "Forbidden",
+ "description": "Response if the repository is archived or if github advanced security is not enabled for this repository"
+ },
+ {
+ "httpStatusCode": "404",
+ "httpStatusMessage": "Not Found",
+ "description": "Resource not found"
+ },
+ {
+ "httpStatusCode": "503",
+ "httpStatusMessage": "Service Unavailable",
+ "description": "Service unavailable"
+ }
+ ]
+ },
{
"verb": "post",
"requestPath": "/repos/{owner}/{repo}/code-scanning/sarifs",
@@ -40550,7 +40755,7 @@
}
],
"summary": "Upload an analysis as SARIF data",
- "description": "Uploads SARIF data containing the results of a code scanning analysis to make the results available in a repository. You must use an access token with the `security_events` scope to use this endpoint. GitHub Apps must have the `security_events` write permission to use this endpoint.\n\nThere are two places where you can upload code scanning results.\n - If you upload to a pull request, for example `--ref refs/pull/42/merge` or `--ref refs/pull/42/head`, then the results appear as alerts in a pull request check. For more information, see \"[Triaging code scanning alerts in pull requests](/code-security/secure-coding/triaging-code-scanning-alerts-in-pull-requests).\"\n - If you upload to a branch, for example `--ref refs/heads/my-branch`, then the results appear in the **Security** tab for your repository. For more information, see \"[Managing code scanning alerts for your repository](/code-security/secure-coding/managing-code-scanning-alerts-for-your-repository#viewing-the-alerts-for-a-repository).\"\n\nYou must compress the SARIF-formatted analysis data that you want to upload, using `gzip`, and then encode it as a Base64 format string. For example:\n\n```\ngzip -c analysis-data.sarif | base64 -w0\n```\n\nSARIF upload supports a maximum of 1000 results per analysis run. Any results over this limit are ignored. Typically, but not necessarily, a SARIF file contains a single run of a single tool. If a code scanning tool generates too many results, you should update the analysis configuration to run only the most important rules or queries.\n\nThe `202 Accepted`, response includes an `id` value.\nYou can use this ID to check the status of the upload by using this for the `/sarifs/{sarif_id}` endpoint.\nFor more information, see \"[Get information about a SARIF upload](/rest/reference/code-scanning#get-information-about-a-sarif-upload).\"",
+ "description": "Uploads SARIF data containing the results of a code scanning analysis to make the results available in a repository. You must use an access token with the `security_events` scope to use this endpoint. GitHub Apps must have the `security_events` write permission to use this endpoint.\n\nThere are two places where you can upload code scanning results.\n - If you upload to a pull request, for example `--ref refs/pull/42/merge` or `--ref refs/pull/42/head`, then the results appear as alerts in a pull request check. For more information, see \"[Triaging code scanning alerts in pull requests](/code-security/secure-coding/triaging-code-scanning-alerts-in-pull-requests).\"\n - If you upload to a branch, for example `--ref refs/heads/my-branch`, then the results appear in the **Security** tab for your repository. For more information, see \"[Managing code scanning alerts for your repository](/code-security/secure-coding/managing-code-scanning-alerts-for-your-repository#viewing-the-alerts-for-a-repository).\"\n\nYou must compress the SARIF-formatted analysis data that you want to upload, using `gzip`, and then encode it as a Base64 format string. For example:\n\n```\ngzip -c analysis-data.sarif | base64 -w0\n```\n\nSARIF upload supports a maximum of 5000 results per analysis run. Any results over this limit are ignored and any SARIF uploads with more than 25,000 results are rejected. Typically, but not necessarily, a SARIF file contains a single run of a single tool. If a code scanning tool generates too many results, you should update the analysis configuration to run only the most important rules or queries.\n\nThe `202 Accepted`, response includes an `id` value.\nYou can use this ID to check the status of the upload by using this for the `/sarifs/{sarif_id}` endpoint.\nFor more information, see \"[Get information about a SARIF upload](/rest/reference/code-scanning#get-information-about-a-sarif-upload).\"",
"operationId": "code-scanning/upload-sarif",
"tags": [
"code-scanning"
@@ -40646,7 +40851,7 @@
"categoryLabel": "Code scanning",
"contentType": "application/json",
"notes": [],
- "descriptionHTML": "Uploads SARIF data containing the results of a code scanning analysis to make the results available in a repository. You must use an access token with the security_events scope to use this endpoint. GitHub Apps must have the security_events write permission to use this endpoint.
\nThere are two places where you can upload code scanning results.
\n\nYou must compress the SARIF-formatted analysis data that you want to upload, using gzip, and then encode it as a Base64 format string. For example:
\ngzip -c analysis-data.sarif | base64 -w0\n
\nSARIF upload supports a maximum of 1000 results per analysis run. Any results over this limit are ignored. Typically, but not necessarily, a SARIF file contains a single run of a single tool. If a code scanning tool generates too many results, you should update the analysis configuration to run only the most important rules or queries.
\nThe 202 Accepted, response includes an id value.\nYou can use this ID to check the status of the upload by using this for the /sarifs/{sarif_id} endpoint.\nFor more information, see \"Get information about a SARIF upload.\"
",
+ "descriptionHTML": "Uploads SARIF data containing the results of a code scanning analysis to make the results available in a repository. You must use an access token with the security_events scope to use this endpoint. GitHub Apps must have the security_events write permission to use this endpoint.
\nThere are two places where you can upload code scanning results.
\n\nYou must compress the SARIF-formatted analysis data that you want to upload, using gzip, and then encode it as a Base64 format string. For example:
\ngzip -c analysis-data.sarif | base64 -w0\n
\nSARIF upload supports a maximum of 5000 results per analysis run. Any results over this limit are ignored and any SARIF uploads with more than 25,000 results are rejected. Typically, but not necessarily, a SARIF file contains a single run of a single tool. If a code scanning tool generates too many results, you should update the analysis configuration to run only the most important rules or queries.
\nThe 202 Accepted, response includes an id value.\nYou can use this ID to check the status of the upload by using this for the /sarifs/{sarif_id} endpoint.\nFor more information, see \"Get information about a SARIF upload.\"
",
"bodyParameters": [
{
"description": "Required. The SHA of the commit to which the analysis you are uploading relates.
",
diff --git a/lib/rest/static/dereferenced/github.ae.deref.json b/lib/rest/static/dereferenced/github.ae.deref.json
index fa36070b30..c2165606cc 100644
--- a/lib/rest/static/dereferenced/github.ae.deref.json
+++ b/lib/rest/static/dereferenced/github.ae.deref.json
@@ -107536,13 +107536,6 @@
"required_conversation_resolution": {
"type": "boolean",
"description": "Requires all conversations on code to be resolved before a pull request can be merged into a branch that matches this rule. Set to `false` to disable. Default: `false`."
- },
- "contexts": {
- "type": "array",
- "description": "The list of status checks to require in order to merge into this branch.",
- "items": {
- "type": "string"
- }
}
},
"required": [
@@ -107629,6 +107622,26 @@
"type": "string"
}
},
+ "checks": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "context": {
+ "type": "string",
+ "example": "continuous-integration/travis-ci"
+ },
+ "app_id": {
+ "type": "integer",
+ "nullable": true
+ }
+ },
+ "required": [
+ "context",
+ "app_id"
+ ]
+ }
+ },
"contexts_url": {
"type": "string",
"format": "uri",
@@ -107639,7 +107652,8 @@
"url",
"contexts_url",
"strict",
- "contexts"
+ "contexts",
+ "checks"
]
},
"required_pull_request_reviews": {
@@ -110222,6 +110236,26 @@
"type": "string"
}
},
+ "checks": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "context": {
+ "type": "string",
+ "example": "continuous-integration/travis-ci"
+ },
+ "app_id": {
+ "type": "integer",
+ "nullable": true
+ }
+ },
+ "required": [
+ "context",
+ "app_id"
+ ]
+ }
+ },
"contexts_url": {
"type": "string",
"format": "uri",
@@ -110232,7 +110266,8 @@
"url",
"contexts_url",
"strict",
- "contexts"
+ "contexts",
+ "checks"
]
},
"examples": {
@@ -110337,10 +110372,30 @@
"contexts": {
"type": "array",
"deprecated": true,
- "description": "The list of status checks to require in order to merge into this branch",
+ "description": "**Deprecated**: The list of status checks to require in order to merge into this branch. If any of these checks have recently been set by a particular GitHub App, they will be required to come from that app in future for the branch to merge. Use `checks` instead of `contexts` for more fine-grained control.\n",
"items": {
"type": "string"
}
+ },
+ "checks": {
+ "type": "array",
+ "description": "The list of status checks to require in order to merge into this branch.",
+ "items": {
+ "type": "object",
+ "required": [
+ "context"
+ ],
+ "properties": {
+ "context": {
+ "type": "string",
+ "description": "The name of the required check"
+ },
+ "app_id": {
+ "type": "integer",
+ "description": "The ID of the GitHub App that must provide this check. Omit this field to automatically select the GitHub App that has recently provided this check, or any app if it was not set by a GitHub App. Pass -1 to explicitly allow any app to set the status."
+ }
+ }
+ }
}
}
},
@@ -110381,6 +110436,26 @@
"type": "string"
}
},
+ "checks": {
+ "type": "array",
+ "items": {
+ "type": "object",
+ "properties": {
+ "context": {
+ "type": "string",
+ "example": "continuous-integration/travis-ci"
+ },
+ "app_id": {
+ "type": "integer",
+ "nullable": true
+ }
+ },
+ "required": [
+ "context",
+ "app_id"
+ ]
+ }
+ },
"contexts_url": {
"type": "string",
"format": "uri",
@@ -110391,7 +110466,8 @@
"url",
"contexts_url",
"strict",
- "contexts"
+ "contexts",
+ "checks"
]
},
"examples": {
@@ -133103,12 +133179,242 @@
"githubCloudOnly": false,
"category": "code-scanning"
}
+ },
+ "delete": {
+ "summary": "Delete a code scanning analysis from a repository",
+ "description": "Deletes a specified code scanning analysis from a repository. For\nprivate repositories, you must use an access token with the `repo` scope. For public repositories,\nyou must use an access token with `public_repo` and `repo:security_events` scopes.\nGitHub Apps must have the `security_events` write permission to use this endpoint.\n\nYou can delete one analysis at a time.\nTo delete a series of analyses, start with the most recent analysis and work backwards.\nConceptually, the process is similar to the undo function in a text editor.\n\nWhen you list the analyses for a repository,\none or more will be identified as deletable in the response:\n\n```\n\"deletable\": true\n```\n\nAn analysis is deletable when it's the most recent in a set of analyses.\nTypically, a repository will have multiple sets of analyses\nfor each enabled code scanning tool,\nwhere a set is determined by a unique combination of analysis values:\n\n* `ref`\n* `tool`\n* `analysis_key`\n* `environment`\n\nIf you attempt to delete an analysis that is not the most recent in a set,\nyou'll get a 400 response with the message:\n\n```\nAnalysis specified is not deletable.\n```\n\nThe response from a successful `DELETE` operation provides you with\ntwo alternative URLs for deleting the next analysis in the set:\n`next_analysis_url` and `confirm_delete_url`.\nUse the `next_analysis_url` URL if you want to avoid accidentally deleting the final analysis\nin a set. This is a useful option if you want to preserve at least one analysis\nfor the specified tool in your repository.\nUse the `confirm_delete_url` URL if you are content to remove all analyses for a tool.\nWhen you delete the last analysis in a set, the value of `next_analysis_url` and `confirm_delete_url`\nin the 200 response is `null`.\n\nAs an example of the deletion process,\nlet's imagine that you added a workflow that configured a particular code scanning tool\nto analyze the code in a repository. This tool has added 15 analyses:\n10 on the default branch, and another 5 on a topic branch.\nYou therefore have two separate sets of analyses for this tool.\nYou've now decided that you want to remove all of the analyses for the tool.\nTo do this you must make 15 separate deletion requests.\nTo start, you must find an analysis that's identified as deletable.\nEach set of analyses always has one that's identified as deletable.\nHaving found the deletable analysis for one of the two sets,\ndelete this analysis and then continue deleting the next analysis in the set until they're all deleted.\nThen repeat the process for the second set.\nThe procedure therefore consists of a nested loop:\n\n**Outer loop**:\n* List the analyses for the repository, filtered by tool.\n* Parse this list to find a deletable analysis. If found:\n\n **Inner loop**:\n * Delete the identified analysis.\n * Parse the response for the value of `confirm_delete_url` and, if found, use this in the next iteration.\n\nThe above process assumes that you want to remove all trace of the tool's analyses from the GitHub user interface, for the specified repository, and it therefore uses the `confirm_delete_url` value. Alternatively, you could use the `next_analysis_url` value, which would leave the last analysis in each set undeleted to avoid removing a tool's analysis entirely.",
+ "operationId": "code-scanning/delete-analysis",
+ "tags": [
+ "code-scanning"
+ ],
+ "externalDocs": {
+ "description": "API method documentation",
+ "url": "https://docs.github.com/github-ae@latest/rest/reference/code-scanning#delete-a-code-scanning-analysis-from-a-repository"
+ },
+ "parameters": [
+ {
+ "name": "owner",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "repo",
+ "in": "path",
+ "required": true,
+ "schema": {
+ "type": "string"
+ }
+ },
+ {
+ "name": "analysis_id",
+ "in": "path",
+ "description": "The ID of the analysis, as returned from the `GET /repos/{owner}/{repo}/code-scanning/analyses` operation.",
+ "required": true,
+ "schema": {
+ "type": "integer"
+ }
+ },
+ {
+ "name": "confirm_delete",
+ "in": "query",
+ "description": "Allow deletion if the specified analysis is the last in a set. If you attempt to delete the final analysis in a set without setting this parameter to `true`, you'll get a 400 response with the message: `Analysis is last of its type and deletion may result in the loss of historical alert data. Please specify confirm_delete.`",
+ "required": false,
+ "schema": {
+ "type": "string",
+ "nullable": true
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "Response",
+ "content": {
+ "application/json": {
+ "schema": {
+ "title": "Analysis deletion",
+ "description": "Successful deletion of a code scanning analysis",
+ "type": "object",
+ "properties": {
+ "next_analysis_url": {
+ "type": "string",
+ "description": "Next deletable analysis in chain, without last analysis deletion confirmation",
+ "format": "uri",
+ "readOnly": true,
+ "nullable": true
+ },
+ "confirm_delete_url": {
+ "type": "string",
+ "description": "Next deletable analysis in chain, with last analysis deletion confirmation",
+ "format": "uri",
+ "readOnly": true,
+ "nullable": true
+ }
+ },
+ "required": [
+ "next_analysis_url",
+ "confirm_delete_url"
+ ]
+ },
+ "examples": {
+ "default-response": {
+ "summary": "Default response",
+ "value": {
+ "next_analysis_url": "https://api.github.com/repos/octocat/hello-world/code-scanning/analyses/41",
+ "confirm_delete_url": "https://api.github.com/repos/octocat/hello-world/code-scanning/analyses/41?confirm_delete"
+ }
+ }
+ }
+ }
+ }
+ },
+ "400": {
+ "description": "Bad Request",
+ "content": {
+ "application/json": {
+ "schema": {
+ "title": "Basic Error",
+ "description": "Basic Error",
+ "type": "object",
+ "properties": {
+ "message": {
+ "type": "string"
+ },
+ "documentation_url": {
+ "type": "string"
+ },
+ "url": {
+ "type": "string"
+ },
+ "status": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "application/scim+json": {
+ "schema": {
+ "title": "Scim Error",
+ "description": "Scim Error",
+ "type": "object",
+ "properties": {
+ "message": {
+ "type": "string",
+ "nullable": true
+ },
+ "documentation_url": {
+ "type": "string",
+ "nullable": true
+ },
+ "detail": {
+ "type": "string",
+ "nullable": true
+ },
+ "status": {
+ "type": "integer"
+ },
+ "scimType": {
+ "type": "string",
+ "nullable": true
+ },
+ "schemas": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "403": {
+ "description": "Response if the repository is archived or if github advanced security is not enabled for this repository",
+ "content": {
+ "application/json": {
+ "schema": {
+ "title": "Basic Error",
+ "description": "Basic Error",
+ "type": "object",
+ "properties": {
+ "message": {
+ "type": "string"
+ },
+ "documentation_url": {
+ "type": "string"
+ },
+ "url": {
+ "type": "string"
+ },
+ "status": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ },
+ "404": {
+ "description": "Resource not found",
+ "content": {
+ "application/json": {
+ "schema": {
+ "title": "Basic Error",
+ "description": "Basic Error",
+ "type": "object",
+ "properties": {
+ "message": {
+ "type": "string"
+ },
+ "documentation_url": {
+ "type": "string"
+ },
+ "url": {
+ "type": "string"
+ },
+ "status": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ },
+ "503": {
+ "description": "Service unavailable",
+ "content": {
+ "application/json": {
+ "schema": {
+ "type": "object",
+ "properties": {
+ "code": {
+ "type": "string"
+ },
+ "message": {
+ "type": "string"
+ },
+ "documentation_url": {
+ "type": "string"
+ }
+ }
+ }
+ }
+ }
+ }
+ },
+ "x-github": {
+ "enabledForGitHubApps": true,
+ "githubCloudOnly": false,
+ "category": "code-scanning"
+ }
}
},
"/repos/{owner}/{repo}/code-scanning/sarifs": {
"post": {
"summary": "Upload an analysis as SARIF data",
- "description": "Uploads SARIF data containing the results of a code scanning analysis to make the results available in a repository. You must use an access token with the `security_events` scope to use this endpoint. GitHub Apps must have the `security_events` write permission to use this endpoint.\n\nThere are two places where you can upload code scanning results.\n - If you upload to a pull request, for example `--ref refs/pull/42/merge` or `--ref refs/pull/42/head`, then the results appear as alerts in a pull request check. For more information, see \"[Triaging code scanning alerts in pull requests](/code-security/secure-coding/triaging-code-scanning-alerts-in-pull-requests).\"\n - If you upload to a branch, for example `--ref refs/heads/my-branch`, then the results appear in the **Security** tab for your repository. For more information, see \"[Managing code scanning alerts for your repository](/code-security/secure-coding/managing-code-scanning-alerts-for-your-repository#viewing-the-alerts-for-a-repository).\"\n\nYou must compress the SARIF-formatted analysis data that you want to upload, using `gzip`, and then encode it as a Base64 format string. For example:\n\n```\ngzip -c analysis-data.sarif | base64 -w0\n```\n\nSARIF upload supports a maximum of 1000 results per analysis run. Any results over this limit are ignored. Typically, but not necessarily, a SARIF file contains a single run of a single tool. If a code scanning tool generates too many results, you should update the analysis configuration to run only the most important rules or queries.\n\nThe `202 Accepted`, response includes an `id` value.\nYou can use this ID to check the status of the upload by using this for the `/sarifs/{sarif_id}` endpoint.\nFor more information, see \"[Get information about a SARIF upload](/rest/reference/code-scanning#get-information-about-a-sarif-upload).\"",
+ "description": "Uploads SARIF data containing the results of a code scanning analysis to make the results available in a repository. You must use an access token with the `security_events` scope to use this endpoint. GitHub Apps must have the `security_events` write permission to use this endpoint.\n\nThere are two places where you can upload code scanning results.\n - If you upload to a pull request, for example `--ref refs/pull/42/merge` or `--ref refs/pull/42/head`, then the results appear as alerts in a pull request check. For more information, see \"[Triaging code scanning alerts in pull requests](/code-security/secure-coding/triaging-code-scanning-alerts-in-pull-requests).\"\n - If you upload to a branch, for example `--ref refs/heads/my-branch`, then the results appear in the **Security** tab for your repository. For more information, see \"[Managing code scanning alerts for your repository](/code-security/secure-coding/managing-code-scanning-alerts-for-your-repository#viewing-the-alerts-for-a-repository).\"\n\nYou must compress the SARIF-formatted analysis data that you want to upload, using `gzip`, and then encode it as a Base64 format string. For example:\n\n```\ngzip -c analysis-data.sarif | base64 -w0\n```\n\nSARIF upload supports a maximum of 5000 results per analysis run. Any results over this limit are ignored and any SARIF uploads with more than 25,000 results are rejected. Typically, but not necessarily, a SARIF file contains a single run of a single tool. If a code scanning tool generates too many results, you should update the analysis configuration to run only the most important rules or queries.\n\nThe `202 Accepted`, response includes an `id` value.\nYou can use this ID to check the status of the upload by using this for the `/sarifs/{sarif_id}` endpoint.\nFor more information, see \"[Get information about a SARIF upload](/rest/reference/code-scanning#get-information-about-a-sarif-upload).\"",
"operationId": "code-scanning/upload-sarif",
"tags": [
"code-scanning"
diff --git a/lib/search/indexes/github-docs-3.0-cn-records.json.br b/lib/search/indexes/github-docs-3.0-cn-records.json.br
index fc2eb225de..9d792c1686 100644
--- a/lib/search/indexes/github-docs-3.0-cn-records.json.br
+++ b/lib/search/indexes/github-docs-3.0-cn-records.json.br
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:7cafabad17e1a97057be1b8d590ed0cfa947f880a020a8d24c5f3541c408be1a
-size 628268
+oid sha256:9c2c73f4a2b06107b5f007c4f1b134d4669a638649dbb7dae0147b1270344927
+size 624988
diff --git a/lib/search/indexes/github-docs-3.0-cn.json.br b/lib/search/indexes/github-docs-3.0-cn.json.br
index c34caafc45..04a6d3a920 100644
--- a/lib/search/indexes/github-docs-3.0-cn.json.br
+++ b/lib/search/indexes/github-docs-3.0-cn.json.br
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:dd4253038257244436f230eec1e2fe4734a65740e0b442d54a7de6ed81c01aaa
-size 1357450
+oid sha256:5036d45db925a4ea465767fdfc855dd3606a73948a4576f20e61896a64b39488
+size 1366309
diff --git a/lib/search/indexes/github-docs-3.0-en-records.json.br b/lib/search/indexes/github-docs-3.0-en-records.json.br
index 50433bad5d..1fe214355f 100644
--- a/lib/search/indexes/github-docs-3.0-en-records.json.br
+++ b/lib/search/indexes/github-docs-3.0-en-records.json.br
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:ed1bb5929cf73689c7a06555251e2151321182dc033a677d2248d0474d8207cf
-size 948157
+oid sha256:3974113f62f15b35c0af1b265db7c851f3ad62f7665cc956a756b5c1d572a227
+size 947384
diff --git a/lib/search/indexes/github-docs-3.0-en.json.br b/lib/search/indexes/github-docs-3.0-en.json.br
index ec183ad1a0..c1f9508cae 100644
--- a/lib/search/indexes/github-docs-3.0-en.json.br
+++ b/lib/search/indexes/github-docs-3.0-en.json.br
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:27b0a2232130f7ffc9b7410183e9f074b306c1a8c61eab92a78e7266f6310c94
-size 3869360
+oid sha256:c0d252e596f1857334dbeb347131a1040bb7dd0b4f37380f06bf920eb5eeb719
+size 3862152
diff --git a/lib/search/indexes/github-docs-3.0-es-records.json.br b/lib/search/indexes/github-docs-3.0-es-records.json.br
index 3dff8c049b..16884b018c 100644
--- a/lib/search/indexes/github-docs-3.0-es-records.json.br
+++ b/lib/search/indexes/github-docs-3.0-es-records.json.br
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:22476e45d352f64cb6444c5ca99215e94f243d356a3e8cd17ca736c5183ec1ba
-size 593604
+oid sha256:4ca30b3ad929c10fe7f334edcbe89decd00a9bb5587269552ff22c320f5ad839
+size 593686
diff --git a/lib/search/indexes/github-docs-3.0-es.json.br b/lib/search/indexes/github-docs-3.0-es.json.br
index 8c86c5c7e2..fdfd261c99 100644
--- a/lib/search/indexes/github-docs-3.0-es.json.br
+++ b/lib/search/indexes/github-docs-3.0-es.json.br
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:d8628e42919356fc9846f5b196e4a5a0d5a222d2470634343080abfac53f6d0d
-size 2609591
+oid sha256:e93de396da7e555bb51b3445d2706b60115a9e34962e37504d8b863601d20e1a
+size 2612094
diff --git a/lib/search/indexes/github-docs-3.0-ja-records.json.br b/lib/search/indexes/github-docs-3.0-ja-records.json.br
index 7cadc8699c..3544464a14 100644
--- a/lib/search/indexes/github-docs-3.0-ja-records.json.br
+++ b/lib/search/indexes/github-docs-3.0-ja-records.json.br
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:e05c4e2e712095fb8be6bf160e79613a6cafd8d5e85a5165003827eb7b34be26
-size 644510
+oid sha256:e597d891db389b4c14d446b9d63c9e73d6b334d5ab7f6982646e9bbec0a8ed25
+size 642911
diff --git a/lib/search/indexes/github-docs-3.0-ja.json.br b/lib/search/indexes/github-docs-3.0-ja.json.br
index cc8b402fef..f3d8dcb0e8 100644
--- a/lib/search/indexes/github-docs-3.0-ja.json.br
+++ b/lib/search/indexes/github-docs-3.0-ja.json.br
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:2462e7a395d9c4d6bb7da4e684c30d0b6cbd8a424f1e2dcad60d54b11dbd53a8
-size 3415573
+oid sha256:f4b58f1d603e885c8b63a3eb13177d01177992feb8506067c8682ac4d8110e54
+size 3412645
diff --git a/lib/search/indexes/github-docs-3.0-pt-records.json.br b/lib/search/indexes/github-docs-3.0-pt-records.json.br
index 713e2dc8b9..2387c7554b 100644
--- a/lib/search/indexes/github-docs-3.0-pt-records.json.br
+++ b/lib/search/indexes/github-docs-3.0-pt-records.json.br
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:bd1b271d4299ee4e31242b4e7c60f4720cfa2810db74785dcfbefae09719c8a7
-size 590593
+oid sha256:3ea48367914d379db7f7d50660242883e1e7e3c4732760122159baa035f37284
+size 591028
diff --git a/lib/search/indexes/github-docs-3.0-pt.json.br b/lib/search/indexes/github-docs-3.0-pt.json.br
index fa46aedbe8..55f26b3378 100644
--- a/lib/search/indexes/github-docs-3.0-pt.json.br
+++ b/lib/search/indexes/github-docs-3.0-pt.json.br
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:8c36cc65a68c7636896dc6d4277a8ea7eea7e0f993db2fc67b031501fe48fc27
-size 2496762
+oid sha256:0ee4ba52dc61a5b54b72ff6a2678ee73c77c188193be94a63bdf5c866a069379
+size 2503713
diff --git a/lib/search/indexes/github-docs-3.1-cn-records.json.br b/lib/search/indexes/github-docs-3.1-cn-records.json.br
index e345e68b4d..870d47370b 100644
--- a/lib/search/indexes/github-docs-3.1-cn-records.json.br
+++ b/lib/search/indexes/github-docs-3.1-cn-records.json.br
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:48320784ce7bb2e9d4873c469b33092cc130442cb5e496e9381d734a92d1b97e
-size 641512
+oid sha256:5951e4fe7acf1e0448dff132b12e6209c8e93475c8c834ebd5a5c85202e25345
+size 638789
diff --git a/lib/search/indexes/github-docs-3.1-cn.json.br b/lib/search/indexes/github-docs-3.1-cn.json.br
index 9c1d999361..20e9e09282 100644
--- a/lib/search/indexes/github-docs-3.1-cn.json.br
+++ b/lib/search/indexes/github-docs-3.1-cn.json.br
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:caf890ffee71a9f4e8bde014da179e4b0af244fcb1fa96eb5ac9ad514c1a5a5d
-size 1392946
+oid sha256:a9545ec6bf1c2f36d53fe0dc05bc1d9a1e36001dc67ceb3af8288852afbf64d2
+size 1401612
diff --git a/lib/search/indexes/github-docs-3.1-en-records.json.br b/lib/search/indexes/github-docs-3.1-en-records.json.br
index 9b3c9cac6e..2fd6fcf5db 100644
--- a/lib/search/indexes/github-docs-3.1-en-records.json.br
+++ b/lib/search/indexes/github-docs-3.1-en-records.json.br
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:7066a887b32d1b5c09d753594990ba773bcc48234583756d117512e75a41c5a4
-size 972643
+oid sha256:f339906f39a6b76af6f43f8199cd82590ee43169ffce836b7ea47187c9e4a1de
+size 972091
diff --git a/lib/search/indexes/github-docs-3.1-en.json.br b/lib/search/indexes/github-docs-3.1-en.json.br
index 9c4f9f8090..74c34ba1ea 100644
--- a/lib/search/indexes/github-docs-3.1-en.json.br
+++ b/lib/search/indexes/github-docs-3.1-en.json.br
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:9fca60ad8391bfdc49c086f39b7562beb2888b6a2bc43b119918a5678dfb0b59
-size 3959747
+oid sha256:921e095e4625e06be2e5aa8942e81ca33609543d2b55778624b1fa7d6274fc4c
+size 3952123
diff --git a/lib/search/indexes/github-docs-3.1-es-records.json.br b/lib/search/indexes/github-docs-3.1-es-records.json.br
index e89d1845c3..78c05d4651 100644
--- a/lib/search/indexes/github-docs-3.1-es-records.json.br
+++ b/lib/search/indexes/github-docs-3.1-es-records.json.br
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:f537573fff1b1318802bbdc756f4fc73967afb1b89c570b1b2f224db0a6545f4
-size 606269
+oid sha256:0fff4bb5e6e85f4e17fa967aa2bb452eef76a0a2332d47c31af8a34f197fca44
+size 606159
diff --git a/lib/search/indexes/github-docs-3.1-es.json.br b/lib/search/indexes/github-docs-3.1-es.json.br
index b925473b31..352a4d525c 100644
--- a/lib/search/indexes/github-docs-3.1-es.json.br
+++ b/lib/search/indexes/github-docs-3.1-es.json.br
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:fe2e0c6bab36ff967977a3af41a79f6d80c5ce78be7be51da23c7af78b378233
-size 2669704
+oid sha256:cbbbc3209564377b74096f305cf704fd034b80cd3c10af4522a2187e7b8897d3
+size 2672388
diff --git a/lib/search/indexes/github-docs-3.1-ja-records.json.br b/lib/search/indexes/github-docs-3.1-ja-records.json.br
index c819258c05..64c760f27a 100644
--- a/lib/search/indexes/github-docs-3.1-ja-records.json.br
+++ b/lib/search/indexes/github-docs-3.1-ja-records.json.br
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:0b307e7713ff923aec51e6dfe6d09f6973e564d94157a1ad0f62b556376e406f
-size 658080
+oid sha256:57db6726a148ed554c2ad7610058e1dd5fe47b8896646847daca0920f64390cc
+size 656496
diff --git a/lib/search/indexes/github-docs-3.1-ja.json.br b/lib/search/indexes/github-docs-3.1-ja.json.br
index 2baf5f42fe..694dfa13d0 100644
--- a/lib/search/indexes/github-docs-3.1-ja.json.br
+++ b/lib/search/indexes/github-docs-3.1-ja.json.br
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:7616fa4fb3164a3873aaffad7a51407c0acaed13c8f00e5a32afd3f9001b6e2f
-size 3493138
+oid sha256:3452be24a047be6d61bc88c6ab5f7ea21c0e445eedd3c5548431688944b34824
+size 3490062
diff --git a/lib/search/indexes/github-docs-3.1-pt-records.json.br b/lib/search/indexes/github-docs-3.1-pt-records.json.br
index c3aec90bef..3525868dcf 100644
--- a/lib/search/indexes/github-docs-3.1-pt-records.json.br
+++ b/lib/search/indexes/github-docs-3.1-pt-records.json.br
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:1dbb866b4e2f6af87eb0fb9d5b08699646c98b9991ae4888541dc0571713c354
-size 603054
+oid sha256:8bdfea8743bcc332c5dabca276a5fb71410b0cecaefdbadc0756a426334b58c9
+size 603591
diff --git a/lib/search/indexes/github-docs-3.1-pt.json.br b/lib/search/indexes/github-docs-3.1-pt.json.br
index 58b93fd9bb..5b4c172c4f 100644
--- a/lib/search/indexes/github-docs-3.1-pt.json.br
+++ b/lib/search/indexes/github-docs-3.1-pt.json.br
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:70a4260f21aa76ebea7670d5063cb53b5ab9318bae5b2874dbcc9021d7489900
-size 2551902
+oid sha256:aa480efe082c7ae6740439f3598f8192d17d6e5e30d054d98d30856d7f60748a
+size 2561078
diff --git a/lib/search/indexes/github-docs-3.2-cn-records.json.br b/lib/search/indexes/github-docs-3.2-cn-records.json.br
index 5a48d9491c..e29a613dde 100644
--- a/lib/search/indexes/github-docs-3.2-cn-records.json.br
+++ b/lib/search/indexes/github-docs-3.2-cn-records.json.br
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:7b9cb20eceaede643cba4df3eb39e17f8842b082bba2f7bb41356e445d0db216
-size 653540
+oid sha256:679e4b08243cb952c28a02786b6c9a4978a9fda366a760193cd420fd520c39d5
+size 650501
diff --git a/lib/search/indexes/github-docs-3.2-cn.json.br b/lib/search/indexes/github-docs-3.2-cn.json.br
index 7e1c724349..52f9c914c8 100644
--- a/lib/search/indexes/github-docs-3.2-cn.json.br
+++ b/lib/search/indexes/github-docs-3.2-cn.json.br
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:35c28ccccc8572749fb15b260fb84875937cf59484830c06334d9ed694520755
-size 1418683
+oid sha256:a9a11cfef035638b689ea8c1f82131c3718ca0b2bc32bffbcf5d43edd80f1bfa
+size 1427587
diff --git a/lib/search/indexes/github-docs-3.2-en-records.json.br b/lib/search/indexes/github-docs-3.2-en-records.json.br
index cb96250877..00cc1a54c5 100644
--- a/lib/search/indexes/github-docs-3.2-en-records.json.br
+++ b/lib/search/indexes/github-docs-3.2-en-records.json.br
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:9f1703173f1c727943c5e78dd2889504fa0b18eb55e7ade20cf3de44e33bb6f7
-size 1003540
+oid sha256:ad382cefc842c7576eed67dae81e4ecb4adf02157c11312848d991e0d1f22a49
+size 1002454
diff --git a/lib/search/indexes/github-docs-3.2-en.json.br b/lib/search/indexes/github-docs-3.2-en.json.br
index 1aefb80781..4d58375cd1 100644
--- a/lib/search/indexes/github-docs-3.2-en.json.br
+++ b/lib/search/indexes/github-docs-3.2-en.json.br
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:07e3c4f86972578263d768cf6b205390655c0972961302bcfb9a1587121e45b7
-size 4080110
+oid sha256:60e9eb3aac3cdd9e0c5feae1362395a9f4ea25ac4cccefe4b0b4ad1479d10f38
+size 4074120
diff --git a/lib/search/indexes/github-docs-3.2-es-records.json.br b/lib/search/indexes/github-docs-3.2-es-records.json.br
index e5e57e04cc..58dfebbff4 100644
--- a/lib/search/indexes/github-docs-3.2-es-records.json.br
+++ b/lib/search/indexes/github-docs-3.2-es-records.json.br
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:09fa801f126e40d9a3d65934f822e9973b4265d0595fbc512ced1b761b298813
-size 616812
+oid sha256:d5e19a31977c4d432e6639d3101b6f2934c7aafec7367c1abdc4a7c261fb4028
+size 616795
diff --git a/lib/search/indexes/github-docs-3.2-es.json.br b/lib/search/indexes/github-docs-3.2-es.json.br
index 5d4d4431ed..927f8b2dbf 100644
--- a/lib/search/indexes/github-docs-3.2-es.json.br
+++ b/lib/search/indexes/github-docs-3.2-es.json.br
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:9dcb1bfc318b46faefdd7f5547316b836e5fcca703f7deaad41911e9b72903a9
-size 2724466
+oid sha256:8f9f90160dcdc305a2f750305f1e76eb59453368318561f5be2539159f9edcd8
+size 2727352
diff --git a/lib/search/indexes/github-docs-3.2-ja-records.json.br b/lib/search/indexes/github-docs-3.2-ja-records.json.br
index f52f2b46f0..5cccfdd088 100644
--- a/lib/search/indexes/github-docs-3.2-ja-records.json.br
+++ b/lib/search/indexes/github-docs-3.2-ja-records.json.br
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:a3bbce825d340d3dc03af48de1881897f7abb8c10503fbdd75c84bac45387c69
-size 669526
+oid sha256:f629e3600838b6e8af34d6de9f086eb22ee07429ca2b9e6efcca835a338150bf
+size 668052
diff --git a/lib/search/indexes/github-docs-3.2-ja.json.br b/lib/search/indexes/github-docs-3.2-ja.json.br
index 19f022ee4f..7c495afdf4 100644
--- a/lib/search/indexes/github-docs-3.2-ja.json.br
+++ b/lib/search/indexes/github-docs-3.2-ja.json.br
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:e53484d8a4d5c075113135e3b8ab3c3f36824022653f24692a20a6c4d74b4943
-size 3561488
+oid sha256:b6f65fea917c996a885ac4f1e4564e92657523535ab98a08a367795a17a9008e
+size 3559437
diff --git a/lib/search/indexes/github-docs-3.2-pt-records.json.br b/lib/search/indexes/github-docs-3.2-pt-records.json.br
index 6107c126fc..b3c485fbcd 100644
--- a/lib/search/indexes/github-docs-3.2-pt-records.json.br
+++ b/lib/search/indexes/github-docs-3.2-pt-records.json.br
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:2c00749199df157473d11104f702778c4992672f42c5f2b45d307a79413dae13
-size 613902
+oid sha256:1bbebf522434bacc8ebaf4ccaa2b17abe30bad6fedefbc32b8f568944c354b28
+size 614331
diff --git a/lib/search/indexes/github-docs-3.2-pt.json.br b/lib/search/indexes/github-docs-3.2-pt.json.br
index 75b6107371..86745e40ca 100644
--- a/lib/search/indexes/github-docs-3.2-pt.json.br
+++ b/lib/search/indexes/github-docs-3.2-pt.json.br
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:38808720dbcf07cff19f78244e2ec59d30feabb6dcef26943df38aad081d9e0d
-size 2600361
+oid sha256:4100431bfe371d717187882edcced5a6d2451f528cda66de0a7890e5b8b66acf
+size 2607905
diff --git a/lib/search/indexes/github-docs-3.3-cn-records.json.br b/lib/search/indexes/github-docs-3.3-cn-records.json.br
index b7ba9b7c79..c8eb5eda09 100644
--- a/lib/search/indexes/github-docs-3.3-cn-records.json.br
+++ b/lib/search/indexes/github-docs-3.3-cn-records.json.br
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:7f087c96551299f4c204fbebbb31b593ce2c691265ac2381da0037ab4e06edb1
-size 674658
+oid sha256:dfc8c88d0cf0dd1d4303d3062068830e419605535da9adc29cc08a75ef48ff6f
+size 671962
diff --git a/lib/search/indexes/github-docs-3.3-cn.json.br b/lib/search/indexes/github-docs-3.3-cn.json.br
index 9fc0ab9ced..56554f170b 100644
--- a/lib/search/indexes/github-docs-3.3-cn.json.br
+++ b/lib/search/indexes/github-docs-3.3-cn.json.br
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:62f0279e2e3e43c3f988110517ffc68c3371742b0686d9b76cf142b7645099c5
-size 1478763
+oid sha256:22b8314a1a28bb5ead958495254217b049b92f01b31e1411adcc2e16ce0a69dc
+size 1486373
diff --git a/lib/search/indexes/github-docs-3.3-en-records.json.br b/lib/search/indexes/github-docs-3.3-en-records.json.br
index be0e70ddcb..4b84f948b3 100644
--- a/lib/search/indexes/github-docs-3.3-en-records.json.br
+++ b/lib/search/indexes/github-docs-3.3-en-records.json.br
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:47b47acb155c7fb242210cff51220868cc0f03a18366a205d6da64eba3a0f27c
-size 1037132
+oid sha256:fa74f1062f53543241d3c02de88dfb83d3ac04d38bb73fe65e713023894e1428
+size 1036207
diff --git a/lib/search/indexes/github-docs-3.3-en.json.br b/lib/search/indexes/github-docs-3.3-en.json.br
index 06346a746a..5b453d988a 100644
--- a/lib/search/indexes/github-docs-3.3-en.json.br
+++ b/lib/search/indexes/github-docs-3.3-en.json.br
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:f630f0c024f20d23701806164ecf03fb9a68698efbf7d7e31024fc35d86d9030
-size 4179316
+oid sha256:7e79b1b555b60a32a98e6b01300e6a2ad8efdbd8384e6d5c8c0295aeab410d19
+size 4174930
diff --git a/lib/search/indexes/github-docs-3.3-es-records.json.br b/lib/search/indexes/github-docs-3.3-es-records.json.br
index 08714955bd..ed7e94b11b 100644
--- a/lib/search/indexes/github-docs-3.3-es-records.json.br
+++ b/lib/search/indexes/github-docs-3.3-es-records.json.br
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:413ad9df0bddf6f51c9f46020634394384f746cd8676216d27e8401f4ff3198f
-size 635011
+oid sha256:1f55e6ef93ccc515230b27dd8d9bac9de534709e6fde58e3fa3872d88af556f5
+size 635096
diff --git a/lib/search/indexes/github-docs-3.3-es.json.br b/lib/search/indexes/github-docs-3.3-es.json.br
index 00e894ca21..f149f34b8d 100644
--- a/lib/search/indexes/github-docs-3.3-es.json.br
+++ b/lib/search/indexes/github-docs-3.3-es.json.br
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:2546da84463cdb98a0cbd2ae9683d5c6dd84851830d787a9044f41e9a6c0a2e0
-size 2823363
+oid sha256:450be6a83715090819203e371b2153b86977f077b9302a20165a03f3e21363fa
+size 2827486
diff --git a/lib/search/indexes/github-docs-3.3-ja-records.json.br b/lib/search/indexes/github-docs-3.3-ja-records.json.br
index 92a1160eed..a6ebbdabd5 100644
--- a/lib/search/indexes/github-docs-3.3-ja-records.json.br
+++ b/lib/search/indexes/github-docs-3.3-ja-records.json.br
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:cf7467a5915bc4ea1bb7f127cb792991b5ccae60938ec633128e13744c200373
-size 691145
+oid sha256:ef52e2026c8c156268a8b85e70fedfd565ce96c425656ddb3116b03c3221b8d9
+size 690007
diff --git a/lib/search/indexes/github-docs-3.3-ja.json.br b/lib/search/indexes/github-docs-3.3-ja.json.br
index 36c2408a5d..f44f721ee7 100644
--- a/lib/search/indexes/github-docs-3.3-ja.json.br
+++ b/lib/search/indexes/github-docs-3.3-ja.json.br
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:03c6678d5d8a43195decd8c69fbc8f0751326abf3715b66c3ad255cb99535e50
-size 3684038
+oid sha256:564c555367a378e07282aa9ae8133adb8bfc119dca2106a08d62186d55e5ea9c
+size 3681473
diff --git a/lib/search/indexes/github-docs-3.3-pt-records.json.br b/lib/search/indexes/github-docs-3.3-pt-records.json.br
index 2835ed0522..4de92fc5e6 100644
--- a/lib/search/indexes/github-docs-3.3-pt-records.json.br
+++ b/lib/search/indexes/github-docs-3.3-pt-records.json.br
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:5aef481bb6c0f013afd6242a67ed57867c6d79e089982f0593161d481cb3cd8a
-size 633275
+oid sha256:904fc398ba9dfdad9ad0eb06894fa09fe11292cbe90c71884f9354964d71b600
+size 633677
diff --git a/lib/search/indexes/github-docs-3.3-pt.json.br b/lib/search/indexes/github-docs-3.3-pt.json.br
index 2e14346d30..3b34ae58f0 100644
--- a/lib/search/indexes/github-docs-3.3-pt.json.br
+++ b/lib/search/indexes/github-docs-3.3-pt.json.br
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:5a17c7f9598fee39ee313d822bc33b10711df65dc2c57d3e37f86fe011669743
-size 2685601
+oid sha256:fdf6e33a44c45c6aa3ded6a0a20ccc49a450052da0067476eb5a05bca58e5e58
+size 2694331
diff --git a/lib/search/indexes/github-docs-dotcom-cn-records.json.br b/lib/search/indexes/github-docs-dotcom-cn-records.json.br
index 1d956f49f8..58b00d3f6e 100644
--- a/lib/search/indexes/github-docs-dotcom-cn-records.json.br
+++ b/lib/search/indexes/github-docs-dotcom-cn-records.json.br
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:8e42c21b47e61499344b3cf7af4caf15ab93e29411ac481be641c44680873756
-size 879925
+oid sha256:53d82350b37e099ed63bb4abf1cd922875ffc105b532b599180e5e7cafeba968
+size 878088
diff --git a/lib/search/indexes/github-docs-dotcom-cn.json.br b/lib/search/indexes/github-docs-dotcom-cn.json.br
index 13c35a78d8..2a7219eb1f 100644
--- a/lib/search/indexes/github-docs-dotcom-cn.json.br
+++ b/lib/search/indexes/github-docs-dotcom-cn.json.br
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:d3eba62e82e6511c1f34c6120b5e35b8252276b9621bfd6d213da3f4a86a96bb
-size 1661706
+oid sha256:d6620d5d1aaca2411b1467f593c35c5ebbf2ecf91eca1601a3aea388328d3df8
+size 1665982
diff --git a/lib/search/indexes/github-docs-dotcom-en-records.json.br b/lib/search/indexes/github-docs-dotcom-en-records.json.br
index e205bb177a..ee67c009d8 100644
--- a/lib/search/indexes/github-docs-dotcom-en-records.json.br
+++ b/lib/search/indexes/github-docs-dotcom-en-records.json.br
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:252463d4acd6a3d97e22245adffbfb75148a41efb0212f29a472ead5825eff9e
-size 1325772
+oid sha256:dd7e0658c21eaf442da89287dff6612a6983bba9daead9d66b7141b0192d06f4
+size 1318657
diff --git a/lib/search/indexes/github-docs-dotcom-en.json.br b/lib/search/indexes/github-docs-dotcom-en.json.br
index 1e9a263c7f..44d08ff322 100644
--- a/lib/search/indexes/github-docs-dotcom-en.json.br
+++ b/lib/search/indexes/github-docs-dotcom-en.json.br
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:a5b7992b5cf7251c0ac4a332f8e0832e94ee5f2a4d512753e10e16c7811a1917
-size 5048402
+oid sha256:bc602b8108da96884d0d2e5b81ae83d11e409c16480fbaee2b52d4e811a468ac
+size 5048009
diff --git a/lib/search/indexes/github-docs-dotcom-es-records.json.br b/lib/search/indexes/github-docs-dotcom-es-records.json.br
index 76dcbd0a67..8bbac824fe 100644
--- a/lib/search/indexes/github-docs-dotcom-es-records.json.br
+++ b/lib/search/indexes/github-docs-dotcom-es-records.json.br
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:204c15f4518cea4d3b7a3633732e548e482e9307eb8fafa1c547b8aaf51020f3
-size 811588
+oid sha256:15893df036bdcaa228aab4aa855f4652daa8ccee44342aa1374aa9b092098220
+size 811374
diff --git a/lib/search/indexes/github-docs-dotcom-es.json.br b/lib/search/indexes/github-docs-dotcom-es.json.br
index 7d7d1e86d7..545203a5bd 100644
--- a/lib/search/indexes/github-docs-dotcom-es.json.br
+++ b/lib/search/indexes/github-docs-dotcom-es.json.br
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:b231b180b3ac6d6e7ad84bfd27ef7e6e2a96ada10d6be378c16cb2498fe2e3aa
-size 3429655
+oid sha256:e8e2b1201af79b1d7f84d573cc5975e8401e6918ed61302c11f8c8e9ff567e32
+size 3429756
diff --git a/lib/search/indexes/github-docs-dotcom-ja-records.json.br b/lib/search/indexes/github-docs-dotcom-ja-records.json.br
index a8bc255672..3b85541b70 100644
--- a/lib/search/indexes/github-docs-dotcom-ja-records.json.br
+++ b/lib/search/indexes/github-docs-dotcom-ja-records.json.br
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:9ee7e426755a44430fb4f02f93557c8d792028d51264cf1c70cd16e68c37f321
-size 898541
+oid sha256:378e619aa80017f274a6d2a042bcf952f106602c45c610147992b04d2cee23ef
+size 897419
diff --git a/lib/search/indexes/github-docs-dotcom-ja.json.br b/lib/search/indexes/github-docs-dotcom-ja.json.br
index cf8064f3ea..07fc432126 100644
--- a/lib/search/indexes/github-docs-dotcom-ja.json.br
+++ b/lib/search/indexes/github-docs-dotcom-ja.json.br
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:a173f3037f401915ba98a226a539452f477ba08e86c75e5ce0b067741d3a9622
-size 4581308
+oid sha256:5cc107a9cdef40b516c063154a7bc5e2845cff6a14a5fc02a8d1820fcca325a0
+size 4578285
diff --git a/lib/search/indexes/github-docs-dotcom-pt-records.json.br b/lib/search/indexes/github-docs-dotcom-pt-records.json.br
index 9564ed1178..ed55712099 100644
--- a/lib/search/indexes/github-docs-dotcom-pt-records.json.br
+++ b/lib/search/indexes/github-docs-dotcom-pt-records.json.br
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:94d4f18330dbd51b288d11b02bf0f83b68ff1e499da7b3ca23aec0d1c4686c12
-size 809173
+oid sha256:75d831b75eb342cc5fca12b152463f18cb450e0b9302708a64d8313a88c76749
+size 809028
diff --git a/lib/search/indexes/github-docs-dotcom-pt.json.br b/lib/search/indexes/github-docs-dotcom-pt.json.br
index 56c20f49d4..4ba3286640 100644
--- a/lib/search/indexes/github-docs-dotcom-pt.json.br
+++ b/lib/search/indexes/github-docs-dotcom-pt.json.br
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:6cf163e3139867d55e4a731c725379114e5c9a5b0a3f6e15c321136455e587d8
-size 3276997
+oid sha256:3c44c825785ee76713ae7f56c76c02c11b36833562ea78b6725092443f05d834
+size 3280451
diff --git a/lib/search/indexes/github-docs-ghae-cn-records.json.br b/lib/search/indexes/github-docs-ghae-cn-records.json.br
index a8a3c6dfe1..7b6d808de3 100644
--- a/lib/search/indexes/github-docs-ghae-cn-records.json.br
+++ b/lib/search/indexes/github-docs-ghae-cn-records.json.br
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:d9a29d7f50847cf83747cc863b4fe0f84fbee423315d7d5b9b8fc6774a30b136
-size 508621
+oid sha256:8e5bca111966411503fc2304d22c0263889738cb42f005a1da92aad16032d27e
+size 502489
diff --git a/lib/search/indexes/github-docs-ghae-cn.json.br b/lib/search/indexes/github-docs-ghae-cn.json.br
index e0a6b25630..d91c1add96 100644
--- a/lib/search/indexes/github-docs-ghae-cn.json.br
+++ b/lib/search/indexes/github-docs-ghae-cn.json.br
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:4b65929f3324b20a3c8ed9895830cfbe623ae104085a5ee4de942378e8c1bf55
-size 1051132
+oid sha256:59f75265d5789524e1eacbea35790660d34e708a478bea194c034d637eb95961
+size 1047305
diff --git a/lib/search/indexes/github-docs-ghae-en-records.json.br b/lib/search/indexes/github-docs-ghae-en-records.json.br
index 1fd91eb1f6..8bf36ff66e 100644
--- a/lib/search/indexes/github-docs-ghae-en-records.json.br
+++ b/lib/search/indexes/github-docs-ghae-en-records.json.br
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:8a89671a8fb3823191b3a59a2d32b08e387ace0604d6434df1553373a0ecd6be
-size 799974
+oid sha256:47badd95ed63904b231b58c7a666e0d60e10f3bf441bab2a9d2ca4885851fb36
+size 825829
diff --git a/lib/search/indexes/github-docs-ghae-en.json.br b/lib/search/indexes/github-docs-ghae-en.json.br
index 2db43cce9c..a2f2ef6e3d 100644
--- a/lib/search/indexes/github-docs-ghae-en.json.br
+++ b/lib/search/indexes/github-docs-ghae-en.json.br
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:67cc8ba8e588ab31d9cec0d375589a4be75ec8ef042a64ff1a6e75bf6f5db23f
-size 3210734
+oid sha256:4a6c3ecc6f74a6dabecd33ca3ff559d5bbaad7a07b2e4b713cb3e173bee14961
+size 3297440
diff --git a/lib/search/indexes/github-docs-ghae-es-records.json.br b/lib/search/indexes/github-docs-ghae-es-records.json.br
index aa3c6a2744..b9dca70a0d 100644
--- a/lib/search/indexes/github-docs-ghae-es-records.json.br
+++ b/lib/search/indexes/github-docs-ghae-es-records.json.br
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:8bead9614fe31f2aa96aa5edec8c0dbebbe571bf64bac9047fe44ea27c60c8a8
-size 481289
+oid sha256:cc455ecdd034580edc0c10f6026dad7b0b287894f664c480f5d7da4b989c42e1
+size 477369
diff --git a/lib/search/indexes/github-docs-ghae-es.json.br b/lib/search/indexes/github-docs-ghae-es.json.br
index 85d2870f07..5ccec56c45 100644
--- a/lib/search/indexes/github-docs-ghae-es.json.br
+++ b/lib/search/indexes/github-docs-ghae-es.json.br
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:85c9ee56b0309a861e519a3070207efc5dc785121b3d8a6be27ff78ab23619d6
-size 2043066
+oid sha256:49f537248f9731eac024c2ad037052a041fade943b1238072b01793ef63b4e21
+size 2027019
diff --git a/lib/search/indexes/github-docs-ghae-ja-records.json.br b/lib/search/indexes/github-docs-ghae-ja-records.json.br
index 6adacc9d3f..8c042fcdf1 100644
--- a/lib/search/indexes/github-docs-ghae-ja-records.json.br
+++ b/lib/search/indexes/github-docs-ghae-ja-records.json.br
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:333f2c9608bf4ab238c2af4bf8d588418178a68e1907654682ffe79025738d5d
-size 521452
+oid sha256:668f2bd2b152e4c30e946f59c25ed80156ce81da985e706c4bf8b06ba55db410
+size 516184
diff --git a/lib/search/indexes/github-docs-ghae-ja.json.br b/lib/search/indexes/github-docs-ghae-ja.json.br
index 2ac3f7b666..e7ed5c1d18 100644
--- a/lib/search/indexes/github-docs-ghae-ja.json.br
+++ b/lib/search/indexes/github-docs-ghae-ja.json.br
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:91bf8dc84f7d96435dca5f5400f27c6dcd265756942dc286c21dbc6ba0c9c969
-size 2656578
+oid sha256:cc7c39d0336984e50b5a26d2449d91e1dc74b40ac467be3d4fc5565a9da5cb17
+size 2628417
diff --git a/lib/search/indexes/github-docs-ghae-pt-records.json.br b/lib/search/indexes/github-docs-ghae-pt-records.json.br
index 023bfc3d48..153e5149bc 100644
--- a/lib/search/indexes/github-docs-ghae-pt-records.json.br
+++ b/lib/search/indexes/github-docs-ghae-pt-records.json.br
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:a0a93e96e733899c17749dfe95f67f09f74ff948c95584faa8d52a9cef131c51
-size 479465
+oid sha256:d7ba58e30ecaf6ece6ce9ede3b06b7f2d62bdbc369ccf0340ba102b1c22c09e9
+size 475532
diff --git a/lib/search/indexes/github-docs-ghae-pt.json.br b/lib/search/indexes/github-docs-ghae-pt.json.br
index fe09f327fd..df7ff8f438 100644
--- a/lib/search/indexes/github-docs-ghae-pt.json.br
+++ b/lib/search/indexes/github-docs-ghae-pt.json.br
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:25f2c3b1f13b405bb4c2eb06b32dc6152994909921636bd00e3f39fa96090588
-size 1949124
+oid sha256:db5d7d68578e2c232a19a3d493f1ac49c4e2eacb5c732bcbf660a89d3b27b897
+size 1935333
diff --git a/lib/search/indexes/github-docs-ghec-cn-records.json.br b/lib/search/indexes/github-docs-ghec-cn-records.json.br
index 18cc23e329..844217f761 100644
--- a/lib/search/indexes/github-docs-ghec-cn-records.json.br
+++ b/lib/search/indexes/github-docs-ghec-cn-records.json.br
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:830a27c3f0059d2e36cb3bda22ccafe2bca2346bfa31d38cd18c56b4ef96ff9a
-size 783550
+oid sha256:56a129cb5a0d3207da7f5a70ad74fcf0642e494fcd5761666fcb160f65d71883
+size 782050
diff --git a/lib/search/indexes/github-docs-ghec-cn.json.br b/lib/search/indexes/github-docs-ghec-cn.json.br
index 558a374b1e..016f189be6 100644
--- a/lib/search/indexes/github-docs-ghec-cn.json.br
+++ b/lib/search/indexes/github-docs-ghec-cn.json.br
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:cb29b43c8413972c77da526bf10ac4e8f5d91d43751a3351113e9ef61a0c3e69
-size 1672646
+oid sha256:2f799b7f7e226972c404200a5a3108c7b8f00e9ff372384d45c31ea1c2c136e0
+size 1676403
diff --git a/lib/search/indexes/github-docs-ghec-en-records.json.br b/lib/search/indexes/github-docs-ghec-en-records.json.br
index 755825eb21..5b5befa2ca 100644
--- a/lib/search/indexes/github-docs-ghec-en-records.json.br
+++ b/lib/search/indexes/github-docs-ghec-en-records.json.br
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:cd5da029bab36eeaf6d18eb337d468ec35b16bd9121552e08602e1688ead8323
-size 1177667
+oid sha256:5fc18fa34565a79c0b04f4b16061a04e3e1b6e9475854fac1378c89ca3364fae
+size 1178062
diff --git a/lib/search/indexes/github-docs-ghec-en.json.br b/lib/search/indexes/github-docs-ghec-en.json.br
index 4fe00f0b48..edb20b0386 100644
--- a/lib/search/indexes/github-docs-ghec-en.json.br
+++ b/lib/search/indexes/github-docs-ghec-en.json.br
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:338baef09149fc3a984d1104a5589bc89b1f4d66dc7159e4f18553484c17b38e
-size 4735406
+oid sha256:c18432497c57c778ed3a89d016ef4b3d3aa09f3597865f535f21074ed7ff5147
+size 4734839
diff --git a/lib/search/indexes/github-docs-ghec-es-records.json.br b/lib/search/indexes/github-docs-ghec-es-records.json.br
index cdd3d02fb5..e06fe6c49a 100644
--- a/lib/search/indexes/github-docs-ghec-es-records.json.br
+++ b/lib/search/indexes/github-docs-ghec-es-records.json.br
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:afba73e2b6c2dd78bdd82d7039565a83c3db8e37d65f6ec9ca63cfe1ba00466e
-size 747771
+oid sha256:8c536b3a52693fe747105927e491ba5d270b7ba4915677819b42f54668448ab3
+size 747566
diff --git a/lib/search/indexes/github-docs-ghec-es.json.br b/lib/search/indexes/github-docs-ghec-es.json.br
index f6c58fb558..d9f5fccbcb 100644
--- a/lib/search/indexes/github-docs-ghec-es.json.br
+++ b/lib/search/indexes/github-docs-ghec-es.json.br
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:0d0068360fe7490b2abc3b091b539917b4a4608e59625854e416d9752f4a4c09
-size 3333078
+oid sha256:9586631083715ea084b1171daad6862f529753df877849d3f535a944a5421541
+size 3333730
diff --git a/lib/search/indexes/github-docs-ghec-ja-records.json.br b/lib/search/indexes/github-docs-ghec-ja-records.json.br
index 53b6f5258e..da880116ef 100644
--- a/lib/search/indexes/github-docs-ghec-ja-records.json.br
+++ b/lib/search/indexes/github-docs-ghec-ja-records.json.br
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:5e0a3fe8b0e6f422da7436d93ccb7482ba98b68a5cfb2bf7127c4e8e1e69b7d2
-size 806354
+oid sha256:f470f062f79e5894fb26a1851f2ee0a8e3c485d2da10e967c3775eec816ef3d4
+size 805764
diff --git a/lib/search/indexes/github-docs-ghec-ja.json.br b/lib/search/indexes/github-docs-ghec-ja.json.br
index e029af985a..7208123716 100644
--- a/lib/search/indexes/github-docs-ghec-ja.json.br
+++ b/lib/search/indexes/github-docs-ghec-ja.json.br
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:f3fb77852d3daeaa20cf4d366594b9bec3e31b135e5eb6120b2a29fce937f071
-size 4322619
+oid sha256:45554562bf21b95edee0c528bd5a04ead401d638daf57ee43514c600b726afdf
+size 4321683
diff --git a/lib/search/indexes/github-docs-ghec-pt-records.json.br b/lib/search/indexes/github-docs-ghec-pt-records.json.br
index 73f3bef1bb..2c31ba1aa7 100644
--- a/lib/search/indexes/github-docs-ghec-pt-records.json.br
+++ b/lib/search/indexes/github-docs-ghec-pt-records.json.br
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:b2ba243fa871d159004d5f23c0293e3f69e8ea7dbad6360e3c1d2569e9d369c0
-size 746634
+oid sha256:b73ae4d40865e404b653aef23c64eb2b6cdec6b8f82472c8d311330a940afdce
+size 746848
diff --git a/lib/search/indexes/github-docs-ghec-pt.json.br b/lib/search/indexes/github-docs-ghec-pt.json.br
index 7f0b7dfb91..81fa2789a1 100644
--- a/lib/search/indexes/github-docs-ghec-pt.json.br
+++ b/lib/search/indexes/github-docs-ghec-pt.json.br
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
-oid sha256:0b58ab2d7c9c4bc6b82043f6839a67297d5641ff604e8cc9535407fc80a10e46
-size 3173757
+oid sha256:25e08ecee768348eeab1198edaffef2a692cb929c26f2db32ba41c019db82a59
+size 3176832
diff --git a/middleware/archived-enterprise-versions.js b/middleware/archived-enterprise-versions.js
index 2bd686e3b4..86a30831c8 100644
--- a/middleware/archived-enterprise-versions.js
+++ b/middleware/archived-enterprise-versions.js
@@ -9,6 +9,7 @@ import {
import patterns from '../lib/patterns.js'
import versionSatisfiesRange from '../lib/version-satisfies-range.js'
import isArchivedVersion from '../lib/is-archived-version.js'
+import { setFastlySurrogateKey, SURROGATE_ENUMS } from './set-fastly-surrogate-key.js'
import got from 'got'
import { readCompressedJsonFileFallback } from '../lib/read-json-file.js'
import { cacheControlFactory } from './cache-control.js'
@@ -55,11 +56,52 @@ const archivedFrontmatterFallbacks = readJsonFileLazily(
const cacheControl = cacheControlFactory(60 * 60 * 24 * 365)
-async function getRemoteJSON(url) {
+// Combine all the things you need to make sure the response is
+// aggresively cached.
+const cacheAggressively = (res) => {
+ cacheControl(res)
+
+ // This sets a custom Fastly surrogate key so that this response
+ // won't get updated in every deployment.
+ // Essentially, this sets a surrogate key such that Fastly
+ // doesn't do soft-purges on these responses on every
+ // automated deployment.
+ setFastlySurrogateKey(res, SURROGATE_ENUMS.MANUAL)
+
+ // Because this middleware has (quite possibly) been executed before
+ // the CSRF middleware, that would have set a cookie. Remove that.
+ // The reason for removing the 'Set-Cookie' header is because
+ // otherwise Fastly won't cache it.
+ res.removeHeader('set-cookie')
+}
+
+// The way `got` does retries:
+//
+// sleep = 1000 * Math.pow(2, retry - 1) + Math.random() * 100
+//
+// So, it means:
+//
+// 1. ~1000ms
+// 2. ~2000ms
+// 3. ~4000ms
+//
+// ...if the limit we set is 3.
+// Our own timeout, in ./middleware/timeout.js defaults to 10 seconds.
+// So there's no point in trying more attempts than 3 because it would
+// just timeout on the 10s. (i.e. 1000 + 2000 + 4000 + 8000 > 10,000)
+const retryConfiguration = {
+ limit: 3,
+}
+// According to our Datadog metrics, the *average* time for the
+// the 'archive_enterprise_proxy' metric is ~70ms (excluding spikes)
+// which much less than 500ms.
+const timeoutConfiguration = 500
+
+async function getRemoteJSON(url, config) {
if (_getRemoteJSONCache.has(url)) {
return _getRemoteJSONCache.get(url)
}
- const body = await got(url).json()
+ const body = await got(url, config).json()
_getRemoteJSONCache.set(url, body)
return body
}
@@ -97,23 +139,27 @@ export default async function archivedEnterpriseVersions(req, res, next) {
// and memoized so calling it is cheap.
const redirect = archivedRedirects()[req.path]
if (redirect && redirect !== req.path) {
- cacheControl(res)
+ cacheAggressively(res)
return res.redirect(redirectCode, redirect)
}
}
if (versionSatisfiesRange(requestedVersion, `>${lastVersionWithoutArchivedRedirectsFile}`)) {
- try {
- const redirectJson = await getRemoteJSON(getProxyPath('redirects.json', requestedVersion))
+ const redirectJson = await getRemoteJSON(getProxyPath('redirects.json', requestedVersion), {
+ retry: retryConfiguration,
+ // This is allowed to be different compared to the other requests
+ // we make because downloading the `redirects.json` once is very
+ // useful because it caches so well.
+ // And, as of 2021 that `redirects.json` is 10MB so it's more likely
+ // to time out.
+ timeout: 1000,
+ })
- // make redirects found via redirects.json redirect with a 301
- if (redirectJson[req.path]) {
- res.set('x-robots-tag', 'noindex')
- cacheControl(res)
- return res.redirect(redirectCode, redirectJson[req.path])
- }
- } catch (err) {
- // noop
+ // make redirects found via redirects.json redirect with a 301
+ if (redirectJson[req.path]) {
+ res.set('x-robots-tag', 'noindex')
+ cacheAggressively(res)
+ return res.redirect(redirectCode, redirectJson[req.path])
}
}
@@ -121,6 +167,8 @@ export default async function archivedEnterpriseVersions(req, res, next) {
const doGet = () =>
got(getProxyPath(req.path, requestedVersion), {
throwHttpErrors: false,
+ retry: retryConfiguration,
+ timeout: timeoutConfiguration,
})
const r = await statsd.asyncTimer(doGet, 'archive_enterprise_proxy', [
...statsdTags,
@@ -132,11 +180,14 @@ export default async function archivedEnterpriseVersions(req, res, next) {
// make stubbed redirect files (which exist in versions <2.13) redirect with a 301
const staticRedirect = r.body.match(patterns.staticRedirect)
if (staticRedirect) {
- cacheControl(res)
+ cacheAggressively(res)
return res.redirect(redirectCode, staticRedirect[1])
}
res.set('content-type', r.headers['content-type'])
+
+ cacheAggressively(res)
+
return res.send(r.body)
}
@@ -144,6 +195,8 @@ export default async function archivedEnterpriseVersions(req, res, next) {
const doGet = () =>
got(getProxyPath(fallbackRedirect, requestedVersion), {
throwHttpErrors: false,
+ retry: retryConfiguration,
+ timeout: timeoutConfiguration,
})
const r = await statsd.asyncTimer(doGet, 'archive_enterprise_proxy_fallback', [
@@ -151,7 +204,7 @@ export default async function archivedEnterpriseVersions(req, res, next) {
`fallback:${fallbackRedirect}`,
])()
if (r.statusCode === 200) {
- cacheControl(res)
+ cacheAggressively(res)
return res.redirect(redirectCode, fallbackRedirect)
}
}
diff --git a/middleware/index.js b/middleware/index.js
index fcfcdec24a..c42d918943 100644
--- a/middleware/index.js
+++ b/middleware/index.js
@@ -14,7 +14,7 @@ import csrf from './csrf.js'
import handleCsrfErrors from './handle-csrf-errors.js'
import compression from 'compression'
import disableCachingOnSafari from './disable-caching-on-safari.js'
-import setFastlySurrogateKey from './set-fastly-surrogate-key.js'
+import setDefaultFastlySurrogateKey from './set-fastly-surrogate-key.js'
import setFastlyCacheHeaders from './set-fastly-cache-headers.js'
import catchBadAcceptLanguage from './catch-bad-accept-language.js'
import reqUtils from './req-utils.js'
@@ -84,7 +84,7 @@ export default function (app) {
// Must appear before static assets and all other requests
// otherwise we won't be able to benefit from that functionality
// for static assets as well.
- app.use(setFastlySurrogateKey)
+ app.use(setDefaultFastlySurrogateKey)
// Must come before `csrf` otherwise you get a Set-Cookie on successful
// asset requests. And it can come before `rateLimit` because if it's a
diff --git a/middleware/set-fastly-surrogate-key.js b/middleware/set-fastly-surrogate-key.js
index 593c11f651..b1f6ee5d11 100644
--- a/middleware/set-fastly-surrogate-key.js
+++ b/middleware/set-fastly-surrogate-key.js
@@ -1,12 +1,29 @@
-export default function setFastlySurrogateKey(req, res, next) {
- // Fastly provides a Soft Purge feature that allows you to mark content as outdated (stale) instead of permanently
- // purging and thereby deleting it from Fastly's caches. Objects invalidated with Soft Purge will be treated as
- // outdated (stale) while Fastly fetches a new version from origin.
- //
- // Use of a surrogate key is required for soft purging
- // https://docs.fastly.com/en/guides/soft-purges
- // https://docs.fastly.com/en/guides/getting-started-with-surrogate-keys
- res.set('surrogate-key', 'all-the-things')
+// Fastly provides a Soft Purge feature that allows you to mark content as outdated (stale) instead of permanently
+// purging and thereby deleting it from Fastly's caches. Objects invalidated with Soft Purge will be treated as
+// outdated (stale) while Fastly fetches a new version from origin.
+//
+// Use of a surrogate key is required for soft purging
+// https://docs.fastly.com/en/guides/soft-purges
+// https://docs.fastly.com/en/guides/getting-started-with-surrogate-keys
+// What the header needs to be called for Fastly to recognize it.
+const KEY = 'surrogate-key'
+
+export const SURROGATE_ENUMS = {
+ DEFAULT: 'every-deployment',
+ MANUAL: 'manual-purge',
+}
+
+export function setFastlySurrogateKey(res, enumKey) {
+ if (!Object.values(SURROGATE_ENUMS).includes(enumKey)) {
+ throw new Error(
+ `Unrecognizes surrogate enumKey. ${enumKey} is not one of ${Object.values(SURROGATE_ENUMS)}`
+ )
+ }
+ res.set(KEY, enumKey)
+}
+
+export default function setDefaultFastlySurrogateKey(req, res, next) {
+ res.set(KEY, SURROGATE_ENUMS.DEFAULT)
return next()
}
diff --git a/package-lock.json b/package-lock.json
index c20dfee58a..513523b4aa 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -55,7 +55,7 @@
"mdast-util-from-markdown": "^1.2.0",
"mdast-util-to-string": "^3.1.0",
"morgan": "^1.10.0",
- "next": "^11.1.2",
+ "next": "^11.1.3",
"node-fetch": "^3.1.0",
"parse5": "^6.0.1",
"port-used": "^2.0.8",
@@ -3253,19 +3253,19 @@
"integrity": "sha512-jDJTpta+P4p1NZTFVLHJ/TLFVYVcOqv6l8xwOeBKNPMgY/zDYH/YH7SJbvrr/h1RcS9GzbPcLKGzpuK9cV56UA=="
},
"node_modules/@next/env": {
- "version": "11.1.2",
- "resolved": "https://registry.npmjs.org/@next/env/-/env-11.1.2.tgz",
- "integrity": "sha512-+fteyVdQ7C/OoulfcF6vd1Yk0FEli4453gr8kSFbU8sKseNSizYq6df5MKz/AjwLptsxrUeIkgBdAzbziyJ3mA=="
+ "version": "11.1.3",
+ "resolved": "https://registry.npmjs.org/@next/env/-/env-11.1.3.tgz",
+ "integrity": "sha512-5+vaeooJuWmICSlmVaAC8KG3O8hwKasACVfkHj58xQuCB5SW0TKW3hWxgxkBuefMBn1nM0yEVPKokXCsYjBtng=="
},
"node_modules/@next/polyfill-module": {
- "version": "11.1.2",
- "resolved": "https://registry.npmjs.org/@next/polyfill-module/-/polyfill-module-11.1.2.tgz",
- "integrity": "sha512-xZmixqADM3xxtqBV0TpAwSFzWJP0MOQzRfzItHXf1LdQHWb0yofHHC+7eOrPFic8+ZGz5y7BdPkkgR1S25OymA=="
+ "version": "11.1.3",
+ "resolved": "https://registry.npmjs.org/@next/polyfill-module/-/polyfill-module-11.1.3.tgz",
+ "integrity": "sha512-7yr9cr4a0SrBoVE8psxXWK1wTFc8UzsY8Wc2cWGL7qA0hgtqACHaXC47M1ByJB410hFZenGrpE+KFaT1unQMyw=="
},
"node_modules/@next/react-dev-overlay": {
- "version": "11.1.2",
- "resolved": "https://registry.npmjs.org/@next/react-dev-overlay/-/react-dev-overlay-11.1.2.tgz",
- "integrity": "sha512-rDF/mGY2NC69mMg2vDqzVpCOlWqnwPUXB2zkARhvknUHyS6QJphPYv9ozoPJuoT/QBs49JJd9KWaAzVBvq920A==",
+ "version": "11.1.3",
+ "resolved": "https://registry.npmjs.org/@next/react-dev-overlay/-/react-dev-overlay-11.1.3.tgz",
+ "integrity": "sha512-zIwtMliSUR+IKl917ToFNB+0fD7bI5kYMdjHU/UEKpfIXAZPnXRHHISCvPDsczlr+bRsbjlUFW1CsNiuFedeuQ==",
"dependencies": {
"@babel/code-frame": "7.12.11",
"anser": "1.4.9",
@@ -3366,9 +3366,9 @@
}
},
"node_modules/@next/react-refresh-utils": {
- "version": "11.1.2",
- "resolved": "https://registry.npmjs.org/@next/react-refresh-utils/-/react-refresh-utils-11.1.2.tgz",
- "integrity": "sha512-hsoJmPfhVqjZ8w4IFzoo8SyECVnN+8WMnImTbTKrRUHOVJcYMmKLL7xf7T0ft00tWwAl/3f3Q3poWIN2Ueql/Q==",
+ "version": "11.1.3",
+ "resolved": "https://registry.npmjs.org/@next/react-refresh-utils/-/react-refresh-utils-11.1.3.tgz",
+ "integrity": "sha512-144kD8q2nChw67V3AJJlPQ6NUJVFczyn10bhTynn9o2rY5DEnkzuBipcyMuQl2DqfxMkV7sn+yOCOYbrLCk9zg==",
"peerDependencies": {
"react-refresh": "0.8.3",
"webpack": "^4 || ^5"
@@ -3379,6 +3379,66 @@
}
}
},
+ "node_modules/@next/swc-darwin-arm64": {
+ "version": "11.1.3",
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-11.1.3.tgz",
+ "integrity": "sha512-TwP4krjhs+uU9pesDYCShEXZrLSbJr78p12e7XnLBBaNf20SgWLlVmQUT9gX9KbWan5V0sUbJfmcS8MRNHgYuA==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-darwin-x64": {
+ "version": "11.1.3",
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-11.1.3.tgz",
+ "integrity": "sha512-ZSWmkg/PxccHFNUSeBdrfaH8KwSkoeUtewXKvuYYt7Ph0yRsbqSyNIvhUezDua96lApiXXq6EL2d1THfeWomvw==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-linux-x64-gnu": {
+ "version": "11.1.3",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-11.1.3.tgz",
+ "integrity": "sha512-PrTBN0iZudAuj4jSbtXcdBdmfpaDCPIneG4Oms4zcs93KwMgLhivYW082Mvlgx9QVEiRm7+RkFpIVtG/i7JitA==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-win32-x64-msvc": {
+ "version": "11.1.3",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-11.1.3.tgz",
+ "integrity": "sha512-mRwbscVjRoHk+tDY7XbkT5d9FCwujFIQJpGp0XNb1i5OHCSDO8WW/C9cLEWS4LxKRbIZlTLYg1MTXqLQkvva8w==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
"node_modules/@node-rs/helper": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/@node-rs/helper/-/helper-1.2.1.tgz",
@@ -15363,16 +15423,16 @@
"peer": true
},
"node_modules/next": {
- "version": "11.1.2",
- "resolved": "https://registry.npmjs.org/next/-/next-11.1.2.tgz",
- "integrity": "sha512-azEYL0L+wFjv8lstLru3bgvrzPvK0P7/bz6B/4EJ9sYkXeW8r5Bjh78D/Ol7VOg0EIPz0CXoe72hzAlSAXo9hw==",
+ "version": "11.1.3",
+ "resolved": "https://registry.npmjs.org/next/-/next-11.1.3.tgz",
+ "integrity": "sha512-ud/gKmnKQ8wtHC+pd1ZiqPRa7DdgulPkAk94MbpsspfNliwZkYs9SIYWhlLSyg+c661LzdUI2nZshvrtggSYWA==",
"dependencies": {
"@babel/runtime": "7.15.3",
"@hapi/accept": "5.0.2",
- "@next/env": "11.1.2",
- "@next/polyfill-module": "11.1.2",
- "@next/react-dev-overlay": "11.1.2",
- "@next/react-refresh-utils": "11.1.2",
+ "@next/env": "11.1.3",
+ "@next/polyfill-module": "11.1.3",
+ "@next/react-dev-overlay": "11.1.3",
+ "@next/react-refresh-utils": "11.1.3",
"@node-rs/helper": "1.2.1",
"assert": "2.0.0",
"ast-types": "0.13.2",
@@ -15425,10 +15485,10 @@
"node": ">=12.0.0"
},
"optionalDependencies": {
- "@next/swc-darwin-arm64": "11.1.2",
- "@next/swc-darwin-x64": "11.1.2",
- "@next/swc-linux-x64-gnu": "11.1.2",
- "@next/swc-win32-x64-msvc": "11.1.2"
+ "@next/swc-darwin-arm64": "11.1.3",
+ "@next/swc-darwin-x64": "11.1.3",
+ "@next/swc-linux-x64-gnu": "11.1.3",
+ "@next/swc-win32-x64-msvc": "11.1.3"
},
"peerDependencies": {
"fibers": ">= 3.1.0",
@@ -25404,19 +25464,19 @@
"integrity": "sha512-jDJTpta+P4p1NZTFVLHJ/TLFVYVcOqv6l8xwOeBKNPMgY/zDYH/YH7SJbvrr/h1RcS9GzbPcLKGzpuK9cV56UA=="
},
"@next/env": {
- "version": "11.1.2",
- "resolved": "https://registry.npmjs.org/@next/env/-/env-11.1.2.tgz",
- "integrity": "sha512-+fteyVdQ7C/OoulfcF6vd1Yk0FEli4453gr8kSFbU8sKseNSizYq6df5MKz/AjwLptsxrUeIkgBdAzbziyJ3mA=="
+ "version": "11.1.3",
+ "resolved": "https://registry.npmjs.org/@next/env/-/env-11.1.3.tgz",
+ "integrity": "sha512-5+vaeooJuWmICSlmVaAC8KG3O8hwKasACVfkHj58xQuCB5SW0TKW3hWxgxkBuefMBn1nM0yEVPKokXCsYjBtng=="
},
"@next/polyfill-module": {
- "version": "11.1.2",
- "resolved": "https://registry.npmjs.org/@next/polyfill-module/-/polyfill-module-11.1.2.tgz",
- "integrity": "sha512-xZmixqADM3xxtqBV0TpAwSFzWJP0MOQzRfzItHXf1LdQHWb0yofHHC+7eOrPFic8+ZGz5y7BdPkkgR1S25OymA=="
+ "version": "11.1.3",
+ "resolved": "https://registry.npmjs.org/@next/polyfill-module/-/polyfill-module-11.1.3.tgz",
+ "integrity": "sha512-7yr9cr4a0SrBoVE8psxXWK1wTFc8UzsY8Wc2cWGL7qA0hgtqACHaXC47M1ByJB410hFZenGrpE+KFaT1unQMyw=="
},
"@next/react-dev-overlay": {
- "version": "11.1.2",
- "resolved": "https://registry.npmjs.org/@next/react-dev-overlay/-/react-dev-overlay-11.1.2.tgz",
- "integrity": "sha512-rDF/mGY2NC69mMg2vDqzVpCOlWqnwPUXB2zkARhvknUHyS6QJphPYv9ozoPJuoT/QBs49JJd9KWaAzVBvq920A==",
+ "version": "11.1.3",
+ "resolved": "https://registry.npmjs.org/@next/react-dev-overlay/-/react-dev-overlay-11.1.3.tgz",
+ "integrity": "sha512-zIwtMliSUR+IKl917ToFNB+0fD7bI5kYMdjHU/UEKpfIXAZPnXRHHISCvPDsczlr+bRsbjlUFW1CsNiuFedeuQ==",
"requires": {
"@babel/code-frame": "7.12.11",
"anser": "1.4.9",
@@ -25500,11 +25560,35 @@
}
},
"@next/react-refresh-utils": {
- "version": "11.1.2",
- "resolved": "https://registry.npmjs.org/@next/react-refresh-utils/-/react-refresh-utils-11.1.2.tgz",
- "integrity": "sha512-hsoJmPfhVqjZ8w4IFzoo8SyECVnN+8WMnImTbTKrRUHOVJcYMmKLL7xf7T0ft00tWwAl/3f3Q3poWIN2Ueql/Q==",
+ "version": "11.1.3",
+ "resolved": "https://registry.npmjs.org/@next/react-refresh-utils/-/react-refresh-utils-11.1.3.tgz",
+ "integrity": "sha512-144kD8q2nChw67V3AJJlPQ6NUJVFczyn10bhTynn9o2rY5DEnkzuBipcyMuQl2DqfxMkV7sn+yOCOYbrLCk9zg==",
"requires": {}
},
+ "@next/swc-darwin-arm64": {
+ "version": "11.1.3",
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-11.1.3.tgz",
+ "integrity": "sha512-TwP4krjhs+uU9pesDYCShEXZrLSbJr78p12e7XnLBBaNf20SgWLlVmQUT9gX9KbWan5V0sUbJfmcS8MRNHgYuA==",
+ "optional": true
+ },
+ "@next/swc-darwin-x64": {
+ "version": "11.1.3",
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-11.1.3.tgz",
+ "integrity": "sha512-ZSWmkg/PxccHFNUSeBdrfaH8KwSkoeUtewXKvuYYt7Ph0yRsbqSyNIvhUezDua96lApiXXq6EL2d1THfeWomvw==",
+ "optional": true
+ },
+ "@next/swc-linux-x64-gnu": {
+ "version": "11.1.3",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-11.1.3.tgz",
+ "integrity": "sha512-PrTBN0iZudAuj4jSbtXcdBdmfpaDCPIneG4Oms4zcs93KwMgLhivYW082Mvlgx9QVEiRm7+RkFpIVtG/i7JitA==",
+ "optional": true
+ },
+ "@next/swc-win32-x64-msvc": {
+ "version": "11.1.3",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-11.1.3.tgz",
+ "integrity": "sha512-mRwbscVjRoHk+tDY7XbkT5d9FCwujFIQJpGp0XNb1i5OHCSDO8WW/C9cLEWS4LxKRbIZlTLYg1MTXqLQkvva8w==",
+ "optional": true
+ },
"@node-rs/helper": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/@node-rs/helper/-/helper-1.2.1.tgz",
@@ -34896,20 +34980,20 @@
"peer": true
},
"next": {
- "version": "11.1.2",
- "resolved": "https://registry.npmjs.org/next/-/next-11.1.2.tgz",
- "integrity": "sha512-azEYL0L+wFjv8lstLru3bgvrzPvK0P7/bz6B/4EJ9sYkXeW8r5Bjh78D/Ol7VOg0EIPz0CXoe72hzAlSAXo9hw==",
+ "version": "11.1.3",
+ "resolved": "https://registry.npmjs.org/next/-/next-11.1.3.tgz",
+ "integrity": "sha512-ud/gKmnKQ8wtHC+pd1ZiqPRa7DdgulPkAk94MbpsspfNliwZkYs9SIYWhlLSyg+c661LzdUI2nZshvrtggSYWA==",
"requires": {
"@babel/runtime": "7.15.3",
"@hapi/accept": "5.0.2",
- "@next/env": "11.1.2",
- "@next/polyfill-module": "11.1.2",
- "@next/react-dev-overlay": "11.1.2",
- "@next/react-refresh-utils": "11.1.2",
- "@next/swc-darwin-arm64": "11.1.2",
- "@next/swc-darwin-x64": "11.1.2",
- "@next/swc-linux-x64-gnu": "11.1.2",
- "@next/swc-win32-x64-msvc": "11.1.2",
+ "@next/env": "11.1.3",
+ "@next/polyfill-module": "11.1.3",
+ "@next/react-dev-overlay": "11.1.3",
+ "@next/react-refresh-utils": "11.1.3",
+ "@next/swc-darwin-arm64": "11.1.3",
+ "@next/swc-darwin-x64": "11.1.3",
+ "@next/swc-linux-x64-gnu": "11.1.3",
+ "@next/swc-win32-x64-msvc": "11.1.3",
"@node-rs/helper": "1.2.1",
"assert": "2.0.0",
"ast-types": "0.13.2",
diff --git a/package.json b/package.json
index ef00629b21..b148086fc8 100644
--- a/package.json
+++ b/package.json
@@ -57,7 +57,7 @@
"mdast-util-from-markdown": "^1.2.0",
"mdast-util-to-string": "^3.1.0",
"morgan": "^1.10.0",
- "next": "^11.1.2",
+ "next": "^11.1.3",
"node-fetch": "^3.1.0",
"parse5": "^6.0.1",
"port-used": "^2.0.8",
@@ -194,7 +194,7 @@
"repository": "https://github.com/github/docs",
"scripts": {
"browser-test": "start-server-and-test browser-test-server 4001 browser-test-tests",
- "browser-test-server": "cross-env NODE_ENV=production WEB_CONCURRENCY=1 PORT=4001 node server.mjs",
+ "browser-test-server": "cross-env NODE_ENV=production WEB_CONCURRENCY=1 PORT=4001 ENABLED_LANGUAGES=en,ja node server.mjs",
"browser-test-tests": "cross-env BROWSER=1 NODE_OPTIONS=--experimental-vm-modules jest tests/browser/browser.js",
"build": "next build",
"debug": "cross-env NODE_ENV=development ENABLED_LANGUAGES='en,ja' nodemon --inspect server.mjs",
@@ -210,6 +210,7 @@
"prebrowser-test": "npm run build",
"prepare": "husky install",
"prettier": "prettier -w \"**/*.{ts,tsx,js,mjs,scss,yml,yaml}\"",
+ "prettier-check": "prettier -c \"**/*.{ts,tsx,js,mjs,scss,yml,yaml}\"",
"prevent-pushes-to-main": "node script/prevent-pushes-to-main.js",
"rest-dev": "script/rest/update-files.js && npm run dev",
"start": "cross-env NODE_ENV=development ENABLED_LANGUAGES='en,ja' nodemon server.mjs",
diff --git a/script/i18n/liquid-diff.js b/script/i18n/liquid-diff.js
index ef096aea6c..c2b7777bfc 100755
--- a/script/i18n/liquid-diff.js
+++ b/script/i18n/liquid-diff.js
@@ -7,7 +7,10 @@ import languages from '../../lib/languages.js'
program
.argument('', 'The file name(s) without the language dir. \nI.E. content/foo.md')
.description('Shows the differences of liquid tags between two files')
- .requiredOption('-l, --language ', `Choose one of these languages to compare: ${Object.keys(languages).filter(l => l !== 'en')}`)
+ .requiredOption(
+ '-l, --language ',
+ `Choose one of these languages to compare: ${Object.keys(languages).filter((l) => l !== 'en')}`
+ )
.parse(process.argv)
function reportFileDifference(diff) {
diff --git a/script/i18n/reset-files-with-broken-liquid-tags.js b/script/i18n/reset-files-with-broken-liquid-tags.js
old mode 100644
new mode 100755
index 987c191201..22297153e4
--- a/script/i18n/reset-files-with-broken-liquid-tags.js
+++ b/script/i18n/reset-files-with-broken-liquid-tags.js
@@ -32,7 +32,8 @@ async function main() {
throw new Error(`Language ${options.language} not found`)
}
- const files = languageFiles(language, 'content')
+ const files = [languageFiles(language, 'content'), languageFiles(language, 'data')].flat()
+
const brokenFiles = []
files.forEach((file) => {
diff --git a/stylesheets/images.scss b/stylesheets/images.scss
index 939810fa74..59fb8261be 100644
--- a/stylesheets/images.scss
+++ b/stylesheets/images.scss
@@ -12,8 +12,9 @@
padding: 0;
box-shadow: var(--color-shadow-medium);
}
-
- img[src*="https://github.githubassets.com/images/icons/emoji"] {
+
+ img[src*="https://github.githubassets.com/images/icons/emoji"]
+ {
box-shadow: none;
}
}
diff --git a/tests/rendering/server.js b/tests/rendering/server.js
index 95459c3fd7..7eadd98fac 100644
--- a/tests/rendering/server.js
+++ b/tests/rendering/server.js
@@ -5,6 +5,7 @@ import { describeViaActionsOnly } from '../helpers/conditional-runs.js'
import { loadPages } from '../../lib/page-data.js'
import CspParse from 'csp-parse'
import { productMap } from '../../lib/all-products.js'
+import { SURROGATE_ENUMS } from '../../middleware/set-fastly-surrogate-key.js'
import { jest } from '@jest/globals'
const AZURE_STORAGE_URL = 'githubdocs.azureedge.net'
@@ -137,7 +138,7 @@ describe('server', () => {
const res = await get('/en')
expect(res.headers['cache-control']).toBe('private, no-store')
expect(res.headers['surrogate-control']).toBe('private, no-store')
- expect(res.headers['surrogate-key']).toBe('all-the-things')
+ expect(res.headers['surrogate-key']).toBe(SURROGATE_ENUMS.DEFAULT)
})
test('does not render duplicate or tags', async () => {
diff --git a/tests/routing/deprecated-enterprise-versions.js b/tests/routing/deprecated-enterprise-versions.js
index a1dfda04ed..6b6074eef1 100644
--- a/tests/routing/deprecated-enterprise-versions.js
+++ b/tests/routing/deprecated-enterprise-versions.js
@@ -1,6 +1,7 @@
import createApp from '../../lib/app.js'
import enterpriseServerReleases from '../../lib/enterprise-server-releases.js'
import { get, getDOM } from '../helpers/supertest.js'
+import { SURROGATE_ENUMS } from '../../middleware/set-fastly-surrogate-key.js'
import supertest from 'supertest'
import { jest } from '@jest/globals'
@@ -54,10 +55,12 @@ describe('enterprise deprecation', () => {
expect($('h1').text()).toBe('About branches')
})
- test('sets the expected x-robots-tag header for deprecated Enterprise pages', async () => {
+ test('sets the expected headers for deprecated Enterprise pages', async () => {
const res = await get('/en/enterprise/2.13/user/articles/about-branches')
expect(res.statusCode).toBe(200)
expect(res.get('x-robots-tag')).toBe('noindex')
+ expect(res.get('surrogate-key')).toBe(SURROGATE_ENUMS.MANUAL)
+ expect(res.get('set-cookie')).toBeUndefined()
})
test('handles requests for deprecated Enterprise pages ( <2.13 )', async () => {