Merge branch 'main' into lowercase-personal-data
This commit is contained in:
73
.github/workflows/dry-run-elasticsearch-indexing.yml
vendored
Normal file
73
.github/workflows/dry-run-elasticsearch-indexing.yml
vendored
Normal file
@@ -0,0 +1,73 @@
|
||||
name: Dry run Elasticsearch indexing
|
||||
|
||||
# **What it does**: Tests to index records into a local Elasticsearch
|
||||
# **Why we have it**: To make sure the indexing code works.
|
||||
# **Who does it impact**: Docs engineering.
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- gh-readonly-queue/main/**
|
||||
pull_request:
|
||||
paths:
|
||||
- script/search/index-elasticsearch.mjs
|
||||
- 'package*.json'
|
||||
- .github/workflows/dry-run-elasticsearch-indexing.yml
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
dry-run-elasticsearch-indexing:
|
||||
# Avoid github/docs and forks of it
|
||||
if: github.repository == 'github/docs-internal'
|
||||
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: getong/elasticsearch-action@95b501ab0c83dee0aac7c39b7cea3723bef14954
|
||||
with:
|
||||
elasticsearch version: '8.2.0'
|
||||
host port: 9200
|
||||
container port: 9200
|
||||
host node port: 9300
|
||||
node port: 9300
|
||||
discovery type: 'single-node'
|
||||
|
||||
- name: Checkout
|
||||
uses: actions/checkout@dcd71f646680f2efd8db4afa5ad64fdcba30e748
|
||||
with:
|
||||
lfs: 'true'
|
||||
|
||||
- name: Check out LFS objects
|
||||
run: git lfs checkout
|
||||
|
||||
- name: Setup node
|
||||
uses: actions/setup-node@1f8c6b94b26d0feae1e387ca63ccbdc44d27b561
|
||||
with:
|
||||
node-version: 16.15.x
|
||||
cache: npm
|
||||
|
||||
- name: Install
|
||||
run: npm ci
|
||||
|
||||
# Serves two purposes;
|
||||
# 1. Be confident that the Elasticsearch server start-up worked at all
|
||||
# 2. Sometimes Elasticsearch will bind to the port but still not
|
||||
# technically be ready. By using `curl --retry` we can know it's
|
||||
# also genuinely ready to use.
|
||||
- name: Ping Elasticsearch
|
||||
run: curl --retry-connrefused --retry 5 -I http://localhost:9200/
|
||||
|
||||
- name: Index some
|
||||
env:
|
||||
ELASTICSEARCH_URL: 'http://localhost:9200'
|
||||
run: |
|
||||
./script/search/index-elasticsearch.mjs --verbose \
|
||||
-l en -l ja \
|
||||
-V dotcom -V ghes-3.5
|
||||
|
||||
- name: Show created indexes and aliases
|
||||
run: |
|
||||
curl http://localhost:9200/_cat/indices?v
|
||||
curl http://localhost:9200/_cat/aliases?v
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 15 KiB |
@@ -4,6 +4,7 @@ import useSWR from 'swr'
|
||||
import cx from 'classnames'
|
||||
import { Flash, Label, ActionList, ActionMenu } from '@primer/react'
|
||||
import { ItemInput } from '@primer/react/lib/deprecated/ActionList/List'
|
||||
import { InfoIcon } from '@primer/octicons-react'
|
||||
|
||||
import { useTranslation } from 'components/hooks/useTranslation'
|
||||
import { sendEvent, EventType } from 'components/lib/events'
|
||||
@@ -323,12 +324,13 @@ function ShowSearchResults({
|
||||
debug: boolean
|
||||
query: string
|
||||
}) {
|
||||
const { t } = useTranslation('search')
|
||||
const { t } = useTranslation(['pages', 'search'])
|
||||
const router = useRouter()
|
||||
const { currentVersion } = useVersion()
|
||||
const { allVersions } = useMainContext()
|
||||
const searchVersion = allVersions[currentVersion].versionTitle
|
||||
const [selectedVersion, setSelectedVersion] = useState<ItemInput | undefined>()
|
||||
const currentVersionPathSegment = currentVersion === DEFAULT_VERSION ? '' : `/${currentVersion}`
|
||||
|
||||
const latestVersions = new Set(
|
||||
Object.keys(allVersions)
|
||||
@@ -413,6 +415,13 @@ function ShowSearchResults({
|
||||
</ActionList.Item>
|
||||
)
|
||||
})}
|
||||
|
||||
<ActionList.LinkItem
|
||||
className="f6"
|
||||
href={`/${router.locale}${currentVersionPathSegment}/get-started/learning-about-github/about-versions-of-github-docs`}
|
||||
>
|
||||
{t('about_versions')} <InfoIcon />
|
||||
</ActionList.LinkItem>
|
||||
</ActionList>
|
||||
</ActionMenu.Overlay>
|
||||
</ActionMenu>
|
||||
@@ -432,12 +441,12 @@ function ShowSearchResults({
|
||||
{t('matches_displayed')}: {results.length === 0 ? t('no_results') : results.length}
|
||||
</p>
|
||||
|
||||
<ActionList as="div" variant="full">
|
||||
<ActionList variant="full">
|
||||
{results.map(({ url, breadcrumbs, title, content, score, popularity }) => {
|
||||
return (
|
||||
<ActionList.Item className="width-full" key={url} as="div">
|
||||
<ActionList.Item className="width-full" key={url}>
|
||||
<Link href={url} className="no-underline color-fg-default">
|
||||
<li
|
||||
<div
|
||||
data-testid="search-result"
|
||||
className={cx('list-style-none', styles.resultsContainer)}
|
||||
>
|
||||
@@ -483,7 +492,7 @@ function ShowSearchResults({
|
||||
}
|
||||
/>
|
||||
</div>
|
||||
</li>
|
||||
</div>
|
||||
</Link>
|
||||
</ActionList.Item>
|
||||
)
|
||||
|
||||
@@ -53,7 +53,7 @@ const article: PlaygroundArticleT = {
|
||||
|
||||
To set up your repository to use a custom dev container, you will need to create one or more \`devcontainer.json\` files. You can add these either from a template, in Visual Studio Code, or you can write your own. For more information on dev container configurations, see "[Introduction to dev containers](/codespaces/setting-up-your-codespace/configuring-codespaces-for-your-project)".
|
||||
|
||||
1. Access the Command Palette (\`Shift + Command + P\` / \`Ctrl + Shift + P\`), then start typing "dev container". Select **Codespaces: Add Development Container Configuration Files...**.
|
||||
1. Access the Command Palette (\`<kbd>Shift</kbd>+<kbd>Command</kbd>+<kbd>P</kbd>\` / \`<kbd>Ctrl</kbd>+<kbd>Shift</kbd>+<kbd>P</kbd>\`), then start typing "dev container". Select **Codespaces: Add Development Container Configuration Files...**.
|
||||

|
||||
2. For this example, click **Python 3**. If you need additional features you can select any container that’s specific to Python or a combination of tools such as Python 3 and PostgreSQL.
|
||||

|
||||
@@ -62,7 +62,7 @@ const article: PlaygroundArticleT = {
|
||||
4. Accept the default option to add Node.js to your customization.
|
||||

|
||||
5. Select any additional features to install and click **OK**.
|
||||
6. Access the command palette (\`Shift + Command + P\`/ \`Ctrl + Shift + P\`), then start typing "rebuild". Select **Codespaces: Rebuild Container**.
|
||||
6. Access the command palette (\`<kbd>Shift</kbd>+<kbd>Command</kbd>+<kbd>P</kbd>\`/ \`<kbd>Ctrl</kbd>+<kbd>Shift</kbd>+<kbd>P</kbd>\`), then start typing "rebuild". Select **Codespaces: Rebuild Container**.
|
||||

|
||||
`,
|
||||
},
|
||||
@@ -197,7 +197,7 @@ const article: PlaygroundArticleT = {
|
||||
"postCreateCommand": "pip3 install --user -r requirements.txt",
|
||||
\`\`\`
|
||||
|
||||
4. Access the command palette (\`Shift + Command + P\`/ \`Ctrl + Shift + P\`), then start typing "rebuild". Select **Codespaces: Rebuild Container**.
|
||||
4. Access the command palette (\`<kbd>Shift</kbd>+<kbd>Command</kbd>+<kbd>P</kbd>\`/ \`<kbd>Ctrl</kbd>+<kbd>Shift</kbd>+<kbd>P</kbd>\`), then start typing "rebuild". Select **Codespaces: Rebuild Container**.
|
||||
|
||||

|
||||
|
||||
|
||||
@@ -12,3 +12,7 @@
|
||||
.statusTable {
|
||||
table-layout: fixed !important;
|
||||
}
|
||||
|
||||
.codeBlock code {
|
||||
word-break: break-all;
|
||||
}
|
||||
|
||||
@@ -46,7 +46,10 @@ export function RestOperation({ operation }: Props) {
|
||||
)}
|
||||
<div className={cx(styles.restOperation, 'd-flex flex-wrap gutter mt-4')}>
|
||||
<div className="col-md-12 col-lg-6">
|
||||
<div dangerouslySetInnerHTML={{ __html: operation.descriptionHTML }} />
|
||||
<div
|
||||
className={cx(styles.codeBlock)}
|
||||
dangerouslySetInnerHTML={{ __html: operation.descriptionHTML }}
|
||||
/>
|
||||
|
||||
{hasParameters && (
|
||||
<RestParameterTable
|
||||
|
||||
@@ -111,6 +111,7 @@ For more information, see "[Viewing workflow run history](/actions/managing-work
|
||||
|
||||
For the overall list of included tools for each runner operating system, see the links below:
|
||||
|
||||
* [Ubuntu 22.04 LTS](https://github.com/actions/virtual-environments/blob/main/images/linux/Ubuntu2204-Readme.md)
|
||||
* [Ubuntu 20.04 LTS](https://github.com/actions/virtual-environments/blob/main/images/linux/Ubuntu2004-Readme.md)
|
||||
* [Ubuntu 18.04 LTS](https://github.com/actions/virtual-environments/blob/main/images/linux/Ubuntu1804-Readme.md)
|
||||
* [Windows Server 2022](https://github.com/actions/virtual-environments/blob/main/images/win/Windows2022-Readme.md)
|
||||
|
||||
@@ -50,9 +50,9 @@ To use {% data variables.product.prodname_copilot %}, you must first install the
|
||||
{% data reusables.copilot.supported-languages %} The following samples are in C#, but other languages will work similarly.
|
||||
|
||||
{% data reusables.copilot.create-c-file %}
|
||||
1. In the C# file, type the following function header. {% data variables.product.prodname_copilot %} will automatically suggest an entire function body in grayed text, as shown below. The exact suggestion may vary.
|
||||
1. In the C# file, type the following function signature. {% data variables.product.prodname_copilot %} will automatically suggest an entire function body in grayed text, as shown below. The exact suggestion may vary.
|
||||
```csharp{:copy}
|
||||
function calculateDaysBetweenDates(begin, end) {
|
||||
int CalculateDaysBetweenDates(
|
||||
```
|
||||

|
||||
{% data reusables.copilot.accept-suggestion %}
|
||||
@@ -60,10 +60,10 @@ To use {% data variables.product.prodname_copilot %}, you must first install the
|
||||
## Seeing alternative suggestions
|
||||
{% data reusables.copilot.alternative-suggestions %}
|
||||
{% data reusables.copilot.create-c-file %}
|
||||
1. In the C# file, type the following function header. {% data variables.product.prodname_copilot %} will show you a suggestion.
|
||||
1. In the C# file, type the following function signature. {% data variables.product.prodname_copilot %} will show you a suggestion.
|
||||
|
||||
```csharp{:copy}
|
||||
function calculateDaysBetweenDates(begin, end) {
|
||||
int CalculateDaysBetweenDates(
|
||||
```
|
||||
1. If alternative suggestions are available, you can see these alternatives by pressing <kbd>Alt</kbd>+<kbd>]</kbd> (or <kbd>Alt</kbd>+<kbd>[</kbd>).
|
||||
1. Optionally, you can hover over the suggestion to see the {% data variables.product.prodname_copilot %} command palette for choosing suggestions.
|
||||
|
||||
@@ -27,7 +27,7 @@ In this guide, you'll create a {% data variables.product.prodname_actions %} wor
|
||||
3. Create an `index.js` file and add a basic alert to say "Hello world!"
|
||||
{% raw %}
|
||||
```javascript{:copy}
|
||||
alert("Hello, World!");
|
||||
console.log("Hello, World!");
|
||||
```
|
||||
{% endraw %}
|
||||
4. Initialize an npm package with `npm init`. In the package initialization wizard, enter your package with the name: _`@YOUR-USERNAME/YOUR-REPOSITORY`_, and set the test script to `exit 0`. This will generate a `package.json` file with information about your package.
|
||||
|
||||
@@ -123,7 +123,8 @@ request would look like this:
|
||||
|
||||
``` shell
|
||||
curl -H 'Accept: application/vnd.github.text-match+json' \
|
||||
'{% data variables.product.api_url_pre %}/search/issues?q=windows+label:bug+language:python+state:open&sort=created&order=asc'
|
||||
'{% data variables.product.api_url_pre %}/search/issues?q=windows+label:bug \
|
||||
+language:python+state:open&sort=created&order=asc'
|
||||
```
|
||||
|
||||
The response will include a `text_matches` array for each search result. In the JSON below, we have two objects in the `text_matches` array.
|
||||
@@ -139,7 +140,9 @@ The second text match occurred in the `body` property of one of the issue's comm
|
||||
"object_url": "https://api.github.com/repositories/215335/issues/132",
|
||||
"object_type": "Issue",
|
||||
"property": "body",
|
||||
"fragment": "comprehensive windows font I know of).\n\nIf we can find a commonly distributed windows font that supports them then no problem (we can use html font tags) but otherwise the '(21)' style is probably better.\n",
|
||||
"fragment": "comprehensive windows font I know of).\n\nIf we can find a commonly
|
||||
distributed windows font that supports them then no problem (we can use html
|
||||
font tags) but otherwise the '(21)' style is probably better.\n",
|
||||
"matches": [
|
||||
{
|
||||
"text": "windows",
|
||||
@@ -161,7 +164,9 @@ The second text match occurred in the `body` property of one of the issue's comm
|
||||
"object_url": "https://api.github.com/repositories/215335/issues/comments/25688",
|
||||
"object_type": "IssueComment",
|
||||
"property": "body",
|
||||
"fragment": " right after that are a bit broken IMHO :). I suppose we could have some hack that maxes out at whatever the font does...\n\nI'll check what the state of play is on Windows.\n",
|
||||
"fragment": " right after that are a bit broken IMHO :). I suppose we could
|
||||
have some hack that maxes out at whatever the font does...\n\nI'll check
|
||||
what the state of play is on Windows.\n",
|
||||
"matches": [
|
||||
{
|
||||
"text": "Windows",
|
||||
|
||||
@@ -1,10 +1,42 @@
|
||||
content | emoji
|
||||
-----------|------
|
||||
`+1` | :+1:
|
||||
`-1` | :-1:
|
||||
`laugh` | :smile:
|
||||
`confused` | :confused:
|
||||
`heart` | :heart:
|
||||
`hooray` | :tada:
|
||||
`rocket` | :rocket:
|
||||
`eyes` | :eyes:
|
||||
<table style="width:20%">
|
||||
<thead>
|
||||
<tr>
|
||||
<th style="text-align:left">content</th>
|
||||
<th style="text-align:left">emoji</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td style="text-align:left"><code>+1</code></td>
|
||||
<td style="text-align:left">👍</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="text-align:left"><code>-1</code></td>
|
||||
<td style="text-align:left">👎</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="text-align:left"><code>laugh</code></td>
|
||||
<td style="text-align:left">😄</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="text-align:left"><code>confused</code></td>
|
||||
<td style="text-align:left">😕</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="text-align:left"><code>heart</code></td>
|
||||
<td style="text-align:left">❤️</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="text-align:left"><code>hooray</code></td>
|
||||
<td style="text-align:left">🎉</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="text-align:left"><code>rocket</code></td>
|
||||
<td style="text-align:left">🚀</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="text-align:left"><code>eyes</code></td>
|
||||
<td style="text-align:left">👀</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
@@ -175275,7 +175275,7 @@
|
||||
},
|
||||
{
|
||||
"name": "state",
|
||||
"description": "<p>Set to <code>open</code>, <code>closed</code>, <code>fixed</code>, or <code>dismissed</code> to list code scanning alerts in a specific state.</p>",
|
||||
"description": "<p>If specified, only code scanning alerts with this state will be returned.</p>",
|
||||
"in": "query",
|
||||
"required": false,
|
||||
"schema": {
|
||||
@@ -176565,7 +176565,7 @@
|
||||
}
|
||||
],
|
||||
"previews": [],
|
||||
"descriptionHTML": "<p>Lists all code scanning alerts for the default branch (usually <code>main</code>\nor <code>master</code>) for all eligible repositories in an organization.\nTo use this endpoint, you must be an administrator or security manager for the organization, and you must use an access token with the <code>repo</code> scope or <code>security_events</code> scope.</p>\n<p>GitHub Apps must have the <code>security_events</code> read permission to use this endpoint.</p>",
|
||||
"descriptionHTML": "<p>Lists code scanning alerts for the default branch for all eligible repositories in an organization. Eligible repositories are repositories that are owned by organizations that you own or for which you are a security manager. For more information, see \"<a href=\"https://docs.github.com/organizations/managing-peoples-access-to-your-organization-with-roles/managing-security-managers-in-your-organization\">Managing security managers in your organization</a>.\"</p>\n<p>To use this endpoint, you must be an owner or security manager for the organization, and you must use an access token with the <code>repo</code> scope or <code>security_events</code> scope.</p>\n<p>GitHub Apps must have the <code>security_events</code> read permission to use this endpoint.</p>",
|
||||
"statusCodes": [
|
||||
{
|
||||
"httpStatusCode": "200",
|
||||
@@ -176692,7 +176692,7 @@
|
||||
},
|
||||
{
|
||||
"name": "state",
|
||||
"description": "<p>Set to <code>open</code>, <code>closed</code>, <code>fixed</code>, or <code>dismissed</code> to list code scanning alerts in a specific state.</p>",
|
||||
"description": "<p>If specified, only code scanning alerts with this state will be returned.</p>",
|
||||
"in": "query",
|
||||
"required": false,
|
||||
"schema": {
|
||||
@@ -177268,7 +177268,7 @@
|
||||
}
|
||||
],
|
||||
"previews": [],
|
||||
"descriptionHTML": "<p>Lists all open code scanning alerts for the default branch (usually <code>main</code>\nor <code>master</code>). You must use an access token with the <code>security_events</code> scope to use\nthis endpoint with private repos, the <code>public_repo</code> scope also grants permission to read\nsecurity events on public repos only. GitHub Apps must have the <code>security_events</code> read\npermission to use this endpoint.</p>\n<p>The response includes a <code>most_recent_instance</code> object.\nThis provides details of the most recent instance of this alert\nfor the default branch or for the specified Git reference\n(if you used <code>ref</code> in the request).</p>",
|
||||
"descriptionHTML": "<p>Lists code scanning alerts.</p>\n<p>To use this endpoint, you must use an access token with the <code>security_events</code> scope or, for alerts from public repositories only, an access token with the <code>public_repo</code> scope.</p>\n<p>GitHub Apps must have the <code>security_events</code> read\npermission to use this endpoint.</p>\n<p>The response includes a <code>most_recent_instance</code> object.\nThis provides details of the most recent instance of this alert\nfor the default branch (or for the specified Git reference if you used <code>ref</code> in the request).</p>",
|
||||
"statusCodes": [
|
||||
{
|
||||
"httpStatusCode": "200",
|
||||
|
||||
@@ -161539,7 +161539,7 @@
|
||||
},
|
||||
{
|
||||
"name": "state",
|
||||
"description": "<p>Set to <code>open</code>, <code>closed</code>, <code>fixed</code>, or <code>dismissed</code> to list code scanning alerts in a specific state.</p>",
|
||||
"description": "<p>If specified, only code scanning alerts with this state will be returned.</p>",
|
||||
"in": "query",
|
||||
"required": false,
|
||||
"schema": {
|
||||
@@ -162105,7 +162105,7 @@
|
||||
}
|
||||
],
|
||||
"previews": [],
|
||||
"descriptionHTML": "<p>Lists all open code scanning alerts for the default branch (usually <code>main</code>\nor <code>master</code>). You must use an access token with the <code>security_events</code> scope to use\nthis endpoint with private repos, the <code>public_repo</code> scope also grants permission to read\nsecurity events on public repos only. GitHub Apps must have the <code>security_events</code> read\npermission to use this endpoint.</p>\n<p>The response includes a <code>most_recent_instance</code> object.\nThis provides details of the most recent instance of this alert\nfor the default branch or for the specified Git reference\n(if you used <code>ref</code> in the request).</p>",
|
||||
"descriptionHTML": "<p>Lists code scanning alerts.</p>\n<p>To use this endpoint, you must use an access token with the <code>security_events</code> scope or, for alerts from public repositories only, an access token with the <code>public_repo</code> scope.</p>\n<p>GitHub Apps must have the <code>security_events</code> read\npermission to use this endpoint.</p>\n<p>The response includes a <code>most_recent_instance</code> object.\nThis provides details of the most recent instance of this alert\nfor the default branch (or for the specified Git reference if you used <code>ref</code> in the request).</p>",
|
||||
"statusCodes": [
|
||||
{
|
||||
"httpStatusCode": "200",
|
||||
|
||||
@@ -170064,7 +170064,7 @@
|
||||
},
|
||||
{
|
||||
"name": "state",
|
||||
"description": "<p>Set to <code>open</code>, <code>closed</code>, <code>fixed</code>, or <code>dismissed</code> to list code scanning alerts in a specific state.</p>",
|
||||
"description": "<p>If specified, only code scanning alerts with this state will be returned.</p>",
|
||||
"in": "query",
|
||||
"required": false,
|
||||
"schema": {
|
||||
@@ -171344,7 +171344,7 @@
|
||||
}
|
||||
],
|
||||
"previews": [],
|
||||
"descriptionHTML": "<p>Lists all code scanning alerts for the default branch (usually <code>main</code>\nor <code>master</code>) for all eligible repositories in an organization.\nTo use this endpoint, you must be an administrator or security manager for the organization, and you must use an access token with the <code>repo</code> scope or <code>security_events</code> scope.</p>\n<p>GitHub Apps must have the <code>security_events</code> read permission to use this endpoint.</p>",
|
||||
"descriptionHTML": "<p>Lists code scanning alerts for the default branch for all eligible repositories in an organization. Eligible repositories are repositories that are owned by organizations that you own or for which you are a security manager. For more information, see \"<a href=\"https://docs.github.com/enterprise-server@3.5/organizations/managing-peoples-access-to-your-organization-with-roles/managing-security-managers-in-your-organization\">Managing security managers in your organization</a>.\"</p>\n<p>To use this endpoint, you must be an owner or security manager for the organization, and you must use an access token with the <code>repo</code> scope or <code>security_events</code> scope.</p>\n<p>GitHub Apps must have the <code>security_events</code> read permission to use this endpoint.</p>",
|
||||
"statusCodes": [
|
||||
{
|
||||
"httpStatusCode": "200",
|
||||
@@ -171471,7 +171471,7 @@
|
||||
},
|
||||
{
|
||||
"name": "state",
|
||||
"description": "<p>Set to <code>open</code>, <code>closed</code>, <code>fixed</code>, or <code>dismissed</code> to list code scanning alerts in a specific state.</p>",
|
||||
"description": "<p>If specified, only code scanning alerts with this state will be returned.</p>",
|
||||
"in": "query",
|
||||
"required": false,
|
||||
"schema": {
|
||||
@@ -172037,7 +172037,7 @@
|
||||
}
|
||||
],
|
||||
"previews": [],
|
||||
"descriptionHTML": "<p>Lists all open code scanning alerts for the default branch (usually <code>main</code>\nor <code>master</code>). You must use an access token with the <code>security_events</code> scope to use\nthis endpoint with private repos, the <code>public_repo</code> scope also grants permission to read\nsecurity events on public repos only. GitHub Apps must have the <code>security_events</code> read\npermission to use this endpoint.</p>\n<p>The response includes a <code>most_recent_instance</code> object.\nThis provides details of the most recent instance of this alert\nfor the default branch or for the specified Git reference\n(if you used <code>ref</code> in the request).</p>",
|
||||
"descriptionHTML": "<p>Lists code scanning alerts.</p>\n<p>To use this endpoint, you must use an access token with the <code>security_events</code> scope or, for alerts from public repositories only, an access token with the <code>public_repo</code> scope.</p>\n<p>GitHub Apps must have the <code>security_events</code> read\npermission to use this endpoint.</p>\n<p>The response includes a <code>most_recent_instance</code> object.\nThis provides details of the most recent instance of this alert\nfor the default branch (or for the specified Git reference if you used <code>ref</code> in the request).</p>",
|
||||
"statusCodes": [
|
||||
{
|
||||
"httpStatusCode": "200",
|
||||
|
||||
@@ -80939,7 +80939,7 @@
|
||||
"/orgs/{org}/code-scanning/alerts": {
|
||||
"get": {
|
||||
"summary": "List code scanning alerts for an organization",
|
||||
"description": "Lists all code scanning alerts for the default branch (usually `main`\nor `master`) for all eligible repositories in an organization.\nTo use this endpoint, you must be an administrator or security manager for the organization, and you must use an access token with the `repo` scope or `security_events` scope.\n\nGitHub Apps must have the `security_events` read permission to use this endpoint.",
|
||||
"description": "Lists code scanning alerts for the default branch for all eligible repositories in an organization. Eligible repositories are repositories that are owned by organizations that you own or for which you are a security manager. For more information, see \"[Managing security managers in your organization](https://docs.github.com/organizations/managing-peoples-access-to-your-organization-with-roles/managing-security-managers-in-your-organization).\"\n\nTo use this endpoint, you must be an owner or security manager for the organization, and you must use an access token with the `repo` scope or `security_events` scope.\n\nGitHub Apps must have the `security_events` read permission to use this endpoint.",
|
||||
"tags": [
|
||||
"code-scanning"
|
||||
],
|
||||
@@ -81033,7 +81033,7 @@
|
||||
},
|
||||
{
|
||||
"name": "state",
|
||||
"description": "Set to `open`, `closed`, `fixed`, or `dismissed` to list code scanning alerts in a specific state.",
|
||||
"description": "If specified, only code scanning alerts with this state will be returned.",
|
||||
"in": "query",
|
||||
"required": false,
|
||||
"schema": {
|
||||
@@ -241476,7 +241476,7 @@
|
||||
"/repos/{owner}/{repo}/code-scanning/alerts": {
|
||||
"get": {
|
||||
"summary": "List code scanning alerts for a repository",
|
||||
"description": "Lists all open code scanning alerts for the default branch (usually `main`\nor `master`). You must use an access token with the `security_events` scope to use\nthis endpoint with private repos, the `public_repo` scope also grants permission to read\nsecurity events on public repos only. GitHub Apps must have the `security_events` read\npermission to use this endpoint.\n\nThe response includes a `most_recent_instance` object.\nThis provides details of the most recent instance of this alert\nfor the default branch or for the specified Git reference\n(if you used `ref` in the request).",
|
||||
"description": "Lists code scanning alerts.\n\nTo use this endpoint, you must use an access token with the `security_events` scope or, for alerts from public repositories only, an access token with the `public_repo` scope.\n\nGitHub Apps must have the `security_events` read\npermission to use this endpoint.\n\nThe response includes a `most_recent_instance` object.\nThis provides details of the most recent instance of this alert\nfor the default branch (or for the specified Git reference if you used `ref` in the request).",
|
||||
"tags": [
|
||||
"code-scanning"
|
||||
],
|
||||
@@ -241585,7 +241585,7 @@
|
||||
},
|
||||
{
|
||||
"name": "state",
|
||||
"description": "Set to `open`, `closed`, `fixed`, or `dismissed` to list code scanning alerts in a specific state.",
|
||||
"description": "If specified, only code scanning alerts with this state will be returned.",
|
||||
"in": "query",
|
||||
"required": false,
|
||||
"schema": {
|
||||
|
||||
@@ -213746,7 +213746,7 @@
|
||||
"/repos/{owner}/{repo}/code-scanning/alerts": {
|
||||
"get": {
|
||||
"summary": "List code scanning alerts for a repository",
|
||||
"description": "Lists all open code scanning alerts for the default branch (usually `main`\nor `master`). You must use an access token with the `security_events` scope to use\nthis endpoint with private repos, the `public_repo` scope also grants permission to read\nsecurity events on public repos only. GitHub Apps must have the `security_events` read\npermission to use this endpoint.\n\nThe response includes a `most_recent_instance` object.\nThis provides details of the most recent instance of this alert\nfor the default branch or for the specified Git reference\n(if you used `ref` in the request).",
|
||||
"description": "Lists code scanning alerts.\n\nTo use this endpoint, you must use an access token with the `security_events` scope or, for alerts from public repositories only, an access token with the `public_repo` scope.\n\nGitHub Apps must have the `security_events` read\npermission to use this endpoint.\n\nThe response includes a `most_recent_instance` object.\nThis provides details of the most recent instance of this alert\nfor the default branch (or for the specified Git reference if you used `ref` in the request).",
|
||||
"tags": [
|
||||
"code-scanning"
|
||||
],
|
||||
@@ -213855,7 +213855,7 @@
|
||||
},
|
||||
{
|
||||
"name": "state",
|
||||
"description": "Set to `open`, `closed`, `fixed`, or `dismissed` to list code scanning alerts in a specific state.",
|
||||
"description": "If specified, only code scanning alerts with this state will be returned.",
|
||||
"in": "query",
|
||||
"required": false,
|
||||
"schema": {
|
||||
|
||||
@@ -84441,7 +84441,7 @@
|
||||
"/orgs/{org}/code-scanning/alerts": {
|
||||
"get": {
|
||||
"summary": "List code scanning alerts for an organization",
|
||||
"description": "Lists all code scanning alerts for the default branch (usually `main`\nor `master`) for all eligible repositories in an organization.\nTo use this endpoint, you must be an administrator or security manager for the organization, and you must use an access token with the `repo` scope or `security_events` scope.\n\nGitHub Apps must have the `security_events` read permission to use this endpoint.",
|
||||
"description": "Lists code scanning alerts for the default branch for all eligible repositories in an organization. Eligible repositories are repositories that are owned by organizations that you own or for which you are a security manager. For more information, see \"[Managing security managers in your organization](https://docs.github.com/enterprise-server@3.5/organizations/managing-peoples-access-to-your-organization-with-roles/managing-security-managers-in-your-organization).\"\n\nTo use this endpoint, you must be an owner or security manager for the organization, and you must use an access token with the `repo` scope or `security_events` scope.\n\nGitHub Apps must have the `security_events` read permission to use this endpoint.",
|
||||
"tags": [
|
||||
"code-scanning"
|
||||
],
|
||||
@@ -84535,7 +84535,7 @@
|
||||
},
|
||||
{
|
||||
"name": "state",
|
||||
"description": "Set to `open`, `closed`, `fixed`, or `dismissed` to list code scanning alerts in a specific state.",
|
||||
"description": "If specified, only code scanning alerts with this state will be returned.",
|
||||
"in": "query",
|
||||
"required": false,
|
||||
"schema": {
|
||||
@@ -223653,7 +223653,7 @@
|
||||
"/repos/{owner}/{repo}/code-scanning/alerts": {
|
||||
"get": {
|
||||
"summary": "List code scanning alerts for a repository",
|
||||
"description": "Lists all open code scanning alerts for the default branch (usually `main`\nor `master`). You must use an access token with the `security_events` scope to use\nthis endpoint with private repos, the `public_repo` scope also grants permission to read\nsecurity events on public repos only. GitHub Apps must have the `security_events` read\npermission to use this endpoint.\n\nThe response includes a `most_recent_instance` object.\nThis provides details of the most recent instance of this alert\nfor the default branch or for the specified Git reference\n(if you used `ref` in the request).",
|
||||
"description": "Lists code scanning alerts.\n\nTo use this endpoint, you must use an access token with the `security_events` scope or, for alerts from public repositories only, an access token with the `public_repo` scope.\n\nGitHub Apps must have the `security_events` read\npermission to use this endpoint.\n\nThe response includes a `most_recent_instance` object.\nThis provides details of the most recent instance of this alert\nfor the default branch (or for the specified Git reference if you used `ref` in the request).",
|
||||
"tags": [
|
||||
"code-scanning"
|
||||
],
|
||||
@@ -223762,7 +223762,7 @@
|
||||
},
|
||||
{
|
||||
"name": "state",
|
||||
"description": "Set to `open`, `closed`, `fixed`, or `dismissed` to list code scanning alerts in a specific state.",
|
||||
"description": "If specified, only code scanning alerts with this state will be returned.",
|
||||
"in": "query",
|
||||
"required": false,
|
||||
"schema": {
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:e290ccd3586718c59e8362d2198029b63be9469da7a4eb5e2f9f1665a9852991
|
||||
size 766155
|
||||
oid sha256:e3a3f0417193343b56b59683ccd44259422b06080ac40fb5819ebb3690b0735d
|
||||
size 786450
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:4627ba28f9e93dd94908aa3b8a2470be8c0b82e0160e91eeb9a6e481682edddc
|
||||
size 1599546
|
||||
oid sha256:6b14594af2b2cfe7f1c87e38d841dd9e84e2b3895cb3e7749cb10ad65bbbaf67
|
||||
size 1590857
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:9eb1d17950df0a9026420c0d1aa4075a88bd6ddd92d9c533cdde4d2fef993b55
|
||||
size 1039808
|
||||
oid sha256:916035553d595a48090142c099e8aaa6e1b889ace7fa1facbb1fbc3e510e4231
|
||||
size 1089463
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:4f8edaa92f8253c8ac4d750fe3891d2d6137b59c2581298449a65d8d0c4b42a4
|
||||
size 4178705
|
||||
oid sha256:36c753df354a9ad038e8d3f7729f8b438909aac8a88315a137068a18a45c3a1e
|
||||
size 4388511
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:df48196f3c4748217af74064021a1c6a9ad19ad4ca69bb95a8e2c16048f8f02a
|
||||
size 705559
|
||||
oid sha256:22037ef7c2a97dd45c7501b6efb09b65daa9756ab20401fc7a48be7b49af7e75
|
||||
size 725562
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:a482d5c628d4c6c1ac1e538944018175ededccfba9fe8f4b2a72dc26dee9b80c
|
||||
size 3065418
|
||||
oid sha256:26a0a4b47aa4d79b2754d3ab9d46c0b41afa45229013ba99824ff38bbfacdd1c
|
||||
size 3079897
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:84a324c0172005423682680f45d722e63fa5622af5d1c1e7d47fccd327c2b1a1
|
||||
size 776716
|
||||
oid sha256:cd692020cb2ccb99c6edb4d03f2f64b30473bd8c1c1f68841aa868b3b61839d7
|
||||
size 798456
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:4c27ca2d5fe36e4c74d2f3f0d9755e42134e1291ec4c91999274c935ca7b6578
|
||||
size 4260676
|
||||
oid sha256:a7c0000d5ed54de7c2ea34bb73b5a35e6169fe2b174e4bfa2f567bfa8dc7672c
|
||||
size 4382020
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:6a0595099c4b7616465bea7f4dc6a645a953767b9a909813d05647fa5f38ec51
|
||||
size 695172
|
||||
oid sha256:0ec77ade036878d0987b864c2883aaa992390de7bd990298d15246d6de753b40
|
||||
size 714283
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:d7cbecc24ef642dc2980353d96d01d78a18edf71c48d2f9742a61811d1ba7177
|
||||
size 2961118
|
||||
oid sha256:50d739323599e7dc518718a4fc57fdedc6dee6ab8703781351795b12c9867713
|
||||
size 2971852
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:8885afc7ccf0effc5318027f954ade5083f1c2a8c93ac3ec21efe8489b2c360f
|
||||
size 789819
|
||||
oid sha256:52fd1860fdc44fae351bf3f1d186d8c2e1dc973842f8163191a48b499212d0d2
|
||||
size 811570
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:61561d9afcfbc0c645fc38b0b68b4e56b1a23fdbc51089af0773142bbfc23692
|
||||
size 1640009
|
||||
oid sha256:595c901d3602fabb5d6cb247838a97824a122dfacfd8efa15448f29b75f21eb0
|
||||
size 1639854
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:7f16ca06aa4ec347866ceb8bd5cd1ccb1402bebb9e7ddac1a0a801be39ca160e
|
||||
size 1074821
|
||||
oid sha256:1000be5bae8bfde31b830ca0f4b5c79aacea7dbb9447fa5b89ac04494c1c64c2
|
||||
size 1125098
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:1a0fc1013613a61901c45114972baf5f99e3cb20a6f74e6c2551bd9fdb7795bf
|
||||
size 4275228
|
||||
oid sha256:1bdd44a22b2a37293bc57b274ec7634df604b994f85739cfdfb81d05e804cf4f
|
||||
size 4495941
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:9d3384821b55285853c7fb39b98e9267bb468bbd018f4c4e2fd3a292ef14fabf
|
||||
size 725300
|
||||
oid sha256:ca6c89108e101b2031b242c6ace54974f5899fc95f6832b5117279b6ef1fa0e7
|
||||
size 746724
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:7b35de3c957143ae8160549891aafb96ebe9e6b889faba07c4e37a5fbc4d3862
|
||||
size 3145931
|
||||
oid sha256:de26b6a693b0cc712b5fa31c7d9c02d12f7d7b09ac914714149e9761d035907d
|
||||
size 3166452
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:f7c56cb63daa44bcb04df9754bc0ddbb19922e4a2260ca31c638a68d00f9ef69
|
||||
size 800228
|
||||
oid sha256:7fa485851d9e6066b6846ab6ae40941be4cf186b0cb2a17094678008f75a2f77
|
||||
size 823422
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:d4c619aa65a45b4e342ee1b27d5ed15247bb94293ea481057ba15d02ac3c68cb
|
||||
size 4382959
|
||||
oid sha256:8c39fda21c4e7819d7d22ab0bb8ea86333b581c3f88a43ce9a4aeae938206802
|
||||
size 4516326
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:b0856168ec11ffa81950aefea69f9d2bd94dafa4f2c6fd9c391b190de22ca387
|
||||
size 714693
|
||||
oid sha256:f7f5ec9fc002a8a20666c8212e20e194e0eba3751bff1695105da8ca52d329ae
|
||||
size 735627
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:523436b9eb70a948d03dccc93986c08ce5135483093d1fc57507d82cab5c8147
|
||||
size 3038620
|
||||
oid sha256:15ec0166de52946de4c17845862a96408c1c61d0cf1a2047017c78d67233710a
|
||||
size 3058356
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:5114ca13346e0236eab0826ba915e3495148b17f7823b831c7cec4a6cdf97aef
|
||||
size 791928
|
||||
oid sha256:75790eeeb3627554f6e3bd1390f5dd75bd62417071baa44c42723ccc53f4804d
|
||||
size 813701
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:32f17e401b1ea8c565a4bda0b87ba2e6a9d3f755be2f5ee9fdb311f4c3e83384
|
||||
size 1651465
|
||||
oid sha256:02dc7ecceae0c22a79103748ee578ccb05478ff929af1fd7fec34087fc9dd33e
|
||||
size 1650706
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:d6e9e4a19107c0fe9aee6c90ea477f3c357f54580e228aee7cd70abe77a22320
|
||||
size 1083585
|
||||
oid sha256:87aa2fb1637b46d649438f0cd1dfe6f29159f15d2c8cbe89941a997aacab0887
|
||||
size 1135173
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:88bd72fb35bb0b83a0c2601da6b622369ff22e460cedc76edd5aeb69f23893a6
|
||||
size 4314911
|
||||
oid sha256:28a009072f0abd44f28719a67e0577ca8f2092b84ef5d8a8cf57110368375946
|
||||
size 4548839
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:9fbbc254c6a77f06c3681a5411b41fb108fd01ac3322ca8e9a1511b67af452e9
|
||||
size 728856
|
||||
oid sha256:d876dfa02cecc78ca93448930b441bd1712c91e11cbb09a6535aceb1eef45525
|
||||
size 750397
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:118052d41441d99ed71c9d4178b214d74298f73b246dd9a56ff61c06d1fde4b3
|
||||
size 3164713
|
||||
oid sha256:5c730e38311057ebf0aab213095d9d92a9df86624daf874c8aa11b44ae4df220
|
||||
size 3185128
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:8e2007d36d3ffce0e05341480b752e9f11e2ca824b35012c9f6f387e4fc433bb
|
||||
size 803752
|
||||
oid sha256:b395df8da420ffc90b99c25a4bb699c1b451386e6286adbbd818282084f5263d
|
||||
size 826593
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:54ead17b9b8451619ba8c26f737e09ed08416dc4020cec07956d03a1109458c2
|
||||
size 4412019
|
||||
oid sha256:b704af22a7f8d3e779bda2a319760b958ae5e7022e116d45f1301391ec999429
|
||||
size 4546604
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:c3f2e6c344a1f53000134acc3319cfb43b4a1cda79676401812f8eea71db85e2
|
||||
size 718036
|
||||
oid sha256:7926d0b1c86e6e37358359451a3daf26e7ce0886871f2b7f638f66a36837b7c7
|
||||
size 739468
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:c6e6662abe3fd24335bc7c492a352a4b77c26ae4cc66b898ff13810f7a3a5a07
|
||||
size 3057493
|
||||
oid sha256:2a20122b14f9059f9c22e936446d7bd4992ab9b3bb6499f056400843626c327e
|
||||
size 3080183
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:baa20cc80a1cf44314615f1768c26438d14dded420afd613f06d70cac2ca66d0
|
||||
size 820914
|
||||
oid sha256:d15f0805d4c7c76b67ff71fc60839057e3c1d93b7ff048f2280e6b7ed738072e
|
||||
size 843122
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:8c075dc0186d1ee3612e60b65bc5bdeacea710a8bcb2ce8fbfd2413755c37cab
|
||||
size 1714767
|
||||
oid sha256:4a616dc03431d5efae4e34bcf19d46cb945508ff20eaaad9546275bedb70264e
|
||||
size 1712712
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:0f2e0feea315b9bd92b5e9be52b2f249da4af923ac72da85ad53e66e4d710c23
|
||||
size 1122458
|
||||
oid sha256:4fe04f9a5ab7ffc9b8e642da3371cb1fe7580b98421fadee48b2d5dacc38a05a
|
||||
size 1173352
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:8bb016c2198e226eb6c868f57b2aa6e5ef3083cd4622fe673ece255d14c597bb
|
||||
size 4477454
|
||||
oid sha256:d30f81012e8ca132f0e7ea1ffa66059770f5f3420d9dcafee7f29b8a0d5a21a1
|
||||
size 4707056
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:2a8fdc6a092c695191692f3b9453a5498d1634757b81e26c96c8599975b8ea9b
|
||||
size 751619
|
||||
oid sha256:2cf75d18f0cf39e5b8564c9089d38882e4ef652ea72e4e786abdf48bb99c6ce5
|
||||
size 774316
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:4684ce32b3175ddfa7a5cf70f50fd9cca6cb35558e7445750bf8d67db1c89ef6
|
||||
size 3279126
|
||||
oid sha256:7dc9d08324b3f0fd0ffa859fa59c0c53fba0f73340bdde45c0039976cb4476d0
|
||||
size 3300893
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:dc9b8f49369519a28370ad7f93507bcf9825aee40479f777b4cf289c0e927c7a
|
||||
size 830636
|
||||
oid sha256:6320c771817f4fe6314727a28855170b324c81587ecec8359ed8edbc8b6b4198
|
||||
size 853767
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:b18937de7553ca90c885152cba003a037f4ccdc481b2db695ecf26ecd8bc7411
|
||||
size 4576704
|
||||
oid sha256:a11fa86e22da20fae25b234d1a015eca0cf0fc7e268e113c914a5429b4d1f8b4
|
||||
size 4714636
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:a5ed2709266f59bab790202e168c0ecde47f52d9d2e18456baeb304365d82050
|
||||
size 740016
|
||||
oid sha256:dae683e7b6bb89bb6d75fbe97d0fe54565d5f6287eeef0347fb231d328f592f2
|
||||
size 763062
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:12b4a2a48d22637088b6302c8725e2a4daf8459770b82b6a127826d76ab7ef68
|
||||
size 3164166
|
||||
oid sha256:4072a23014a04ed888a4f2f839d03cfd1a1ca7680057ae059fda207a70b4fd57
|
||||
size 3189709
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:7012f974e4658e1823a9896cb3617c070e7d40bea3e734a8df2ca600020d207f
|
||||
size 1001092
|
||||
oid sha256:55b11b71ebd662ccac76fab5944396aef6b95e12491971a1b474c1668b9ad2a5
|
||||
size 1023636
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:21296b3b66570d8259c8954a4eb55148ce7b811225cb661663ffafb40962f094
|
||||
size 1753013
|
||||
oid sha256:d7cf6291456bea7c9405c303634912176be190ff9013488051053f31bbded155
|
||||
size 1746872
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:e25057094c2ed3c70cd8734c2f1785f06ecd7980d0977a9705da151f1400f51c
|
||||
size 1376716
|
||||
oid sha256:152063a51ea3d7289d4d51aa261197471ad8ab069d64f90d17a1c430e9ca2fcd
|
||||
size 1437724
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:1e49e39ce8691aebd88c816905dfc35f78c97414876b2c50881b750f4dd1a128
|
||||
size 5247862
|
||||
oid sha256:3e895c90d4a87fd0517ee7a71eb636d46f7669e0346401dac5487b65df9a4359
|
||||
size 5500139
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:960a884a76c0f5045950e41028db7db1e8290362e75eee6336d45b8acfc1a989
|
||||
size 900452
|
||||
oid sha256:af3039965d7aa53f1166363c7874feccafcf0b982c69cf80abb9ebe03cd7ccd8
|
||||
size 922981
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:cdddc041674f0b095136d493aec931ed5c7aa537a3251832da3b8762c1bd65a7
|
||||
size 3762834
|
||||
oid sha256:4466536249964f9bc47f340ac57fcfa1a7e8df25a79f6dd7b3adc7e7dbcce5ed
|
||||
size 3797229
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:986c68b28dab23a46fa0e4bb5a91712aabcd4b5068820e4bf9cecfec53c70949
|
||||
size 1005088
|
||||
oid sha256:a64196553f517168c03958921aa4eb9a14a70d6def4ed68cf74c5bc9a15a94ac
|
||||
size 1029997
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:1d6dd233bd623e6b028d47f415ea74bf11746addba8ab015974f14081c16682a
|
||||
size 5352567
|
||||
oid sha256:19db7c2c9d9cc830bc84d0120152654e79756c7a41a0a3e76b5af4b36341de7b
|
||||
size 5501301
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:c3bfed9d682b54c81dda1b88aa4f46986d67afa4937d9e35183364c9cf59df41
|
||||
size 890012
|
||||
oid sha256:b6577e8162e2c89b2059391b9e625de68bdba231fe895681b952db9ebabd1965
|
||||
size 911745
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:ac11c1850ec5f15c49653c4403f091c4b133960ced8137b101f399bc672ca791
|
||||
size 3657141
|
||||
oid sha256:b9d0b81cdfc10ae714aa320d65fe46606132145ed0e8e2f2c59df8aed6b20357
|
||||
size 3687145
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:2fb9a0d73989454c444ce47e8f251da62cf998c3afbec8295373383a935c88b1
|
||||
size 626347
|
||||
oid sha256:1c1a8a0a02b4b69a81fee41d5f7e82f318d18249deaa512225e38d8b011fe1e8
|
||||
size 645300
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:687d6c276edbdfb2f0bbb2c13974d3865e463bfa61d4a71ad381302d0d1d54c1
|
||||
size 1263927
|
||||
oid sha256:78ba79932aed75a2cd75b0bc7895d4a4270061a865b0c9c3359a5eb068c58640
|
||||
size 1263083
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:7a395a9a9be03db12c1b80d53d02be03cb7062655f0bd096a216b32599775dcb
|
||||
size 871952
|
||||
oid sha256:c1de65cb28f54a887eba5641dd86ac4697083fc956fa1f7f32f94d59844c7052
|
||||
size 919390
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:db72b3c7c49e78dbf96fb8d64351439c696d57d482c7bafb37ae0f4370e0757d
|
||||
size 3426974
|
||||
oid sha256:7188cc8e045c83aebef5c592e91b88bb2e0d9c60580d56a06cb77dceb91d62ad
|
||||
size 3639119
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:a132dc386fe304599651d9900a7c84ce1d7461e14da26b8819bd7f1026686534
|
||||
size 583161
|
||||
oid sha256:b216a7a4efbb266c380328b5e6b78e5e69b18a5b9e624af9b4c5632d63ca89bc
|
||||
size 601292
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:f7d4784d238763ee50dc85593cf1d6d85f001f60ec8cc977452484cafa67ea3a
|
||||
size 2461195
|
||||
oid sha256:2e1d41bd4e1f25a75165b24b3ca6aeeea3a40ffebbb86c3040c593ce8537386f
|
||||
size 2472940
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:74a32775d9291b4b89f2bc04e4bc0be9d371cfd7ab7b696b84571f3101872728
|
||||
size 638480
|
||||
oid sha256:87b9ab6a7dc19fe3df1a3ff2be26c16a8cbfcbf76708e93badfe361a75226c8d
|
||||
size 658845
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:bd790b75437d96ee8659708895adc618abcbea92494df51ef10373fdac56291c
|
||||
size 3385895
|
||||
oid sha256:fffa79136aa5a92d6db717b560035a40287e85c0d55867feab975e5068821291
|
||||
size 3522585
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:98e97a9f4ca2c13ed0e6fcc8b29ba7ad86bb8158a3a87710c2b08ebff6019148
|
||||
size 575103
|
||||
oid sha256:b825c2225f64082b5db7ff6f15c1e2efb8c30eb99c9ccd0577d5565865d75bfa
|
||||
size 592386
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:7b372fc260d7f2a24979a3f7c8d00fd6f98449a9caa52e2f47b9e7d24a18091b
|
||||
size 2355199
|
||||
oid sha256:d8e8cc40992efbbfd2562b9bf25371b8078b37377978b4be6b679c97ed3735bd
|
||||
size 2369002
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:a3cb971a3188b8c0addc1a1aef0230d292c0d43f9c0ed79ebf91c617076a0ade
|
||||
size 967801
|
||||
oid sha256:00883b352cfc27c6487110ccbffc737f899b4012fb3b37b85869d469dead0526
|
||||
size 989856
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:db9c864e9074f5a0e38595dfa66c11b45302f61d1bb805f82768faae36a82fc8
|
||||
size 1873856
|
||||
oid sha256:f33a1ebc2bf0d9209f98cddc1e3ebeb7593b85611e7e89976789900ad5ff87bf
|
||||
size 1870922
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:3115bc20d644991737805831ca004762eda8061efea8e1db0bb1d0b3ed2a2aa0
|
||||
size 1311527
|
||||
oid sha256:d038715aa0c38170693fc32d810648b9b8e4dac171aacdfb4643f09ee255ac1c
|
||||
size 1370887
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:1d8ad0ad94a04bcb084d64827d83ae27a58701a03a3202289a598935c3c7d060
|
||||
size 5254484
|
||||
oid sha256:53cb34bd761834c4b29ade055f23dff91081f07b8989e18a50ead19e44a468c5
|
||||
size 5509320
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:4d7dd46859c9ed2dd71ea609148d95cea6afe59df371a27c9266c0bc547dfcab
|
||||
size 891090
|
||||
oid sha256:c542ebac9ae8f7e8fa5338640e2e94e78481dd2707d635a63d6fa85f7bcfd2a8
|
||||
size 914002
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:5e14f3eadd09b3c9521af91c255f9d2f4319b3ced2a06dbddb30a82362b5c155
|
||||
size 3876252
|
||||
oid sha256:321a61b1de98ab2cb05c9fda204158624ab765f209748280331214de855fcb95
|
||||
size 3911721
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:d907f8599df8f49a7444859eee65581ebc7c76cb710743e6813a752847897b81
|
||||
size 976533
|
||||
oid sha256:3a3f3a26f67596ea05462c699b5ab159ffd56a79de0cd7540b325932c7d81364
|
||||
size 1000796
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:1dbe1fe322562f85266aa0133d33e142a44afc8cad37c5553557ed80794f63c5
|
||||
size 5414384
|
||||
oid sha256:bf99ea18bfbc541845ca516ec6eaec9a37bc31fde4bb4d971a5591aa125add7b
|
||||
size 5569830
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:8970f1ca207e5db425220d775855d75b574c4ee09292f804e7b5bad8a4160bde
|
||||
size 880199
|
||||
oid sha256:c86c98a0dadb8dde548bfe703898c8bf40f8b8b3f452981af8692999ee5d4730
|
||||
size 903663
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:f9b08813a563837d76c12294786af79f17dfca9a46a62ac3849cc9759d714c5b
|
||||
size 3756991
|
||||
oid sha256:523f9952155e544d5fc8b57a8a9f200d12a4b505c30d62b20b97c0cf5b4b659e
|
||||
size 3799592
|
||||
|
||||
7061
package-lock.json
generated
7061
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -9,6 +9,7 @@
|
||||
".next/cache"
|
||||
],
|
||||
"dependencies": {
|
||||
"@elastic/elasticsearch": "8.2.1",
|
||||
"@github/failbot": "0.8.0",
|
||||
"@primer/css": "^19.8.2",
|
||||
"@primer/octicons": "17.3.0",
|
||||
@@ -176,7 +177,6 @@
|
||||
"esm": "^3.2.25",
|
||||
"image-size": "^1.0.1",
|
||||
"jest-puppeteer": "^5.0.4",
|
||||
"jimp": "^0.16.1",
|
||||
"puppeteer": "^9.1.1",
|
||||
"website-scraper": "^5.0.0"
|
||||
},
|
||||
|
||||
@@ -1,72 +0,0 @@
|
||||
#!/usr/bin/env node
|
||||
import fs from 'fs/promises'
|
||||
import path from 'path'
|
||||
import walk from 'walk-sync'
|
||||
import jimp from 'jimp' // this is an optional dependency, install with `npm i --include=optional`
|
||||
|
||||
// iterate through enterprise images from most recent to oldest
|
||||
// check if the image in the /assets/enterprise/... directory
|
||||
// is an exact match to the assets/images in relative path and content
|
||||
// if exact match, delete the /assets/enterprise/... version
|
||||
|
||||
const enterpriseAssetDirectories = [
|
||||
'/assets/enterprise/3.0',
|
||||
'/assets/enterprise/github-ae',
|
||||
'/assets/enterprise/2.22',
|
||||
'/assets/enterprise/2.21',
|
||||
'/assets/enterprise/2.20',
|
||||
]
|
||||
|
||||
async function main() {
|
||||
for (const directory of enterpriseAssetDirectories) {
|
||||
const fullDirectoryPath = path.join(process.cwd(), directory)
|
||||
const files = walk(fullDirectoryPath, {
|
||||
includeBasePath: true,
|
||||
directories: false,
|
||||
})
|
||||
|
||||
for (const file of files) {
|
||||
// get the /assets/images file that currently exists, which
|
||||
// would be the equivalent to the enterprise asset
|
||||
const enterpriseRegex = /\/assets\/enterprise\/(2\.20|2\.21|2\.22|3\.0|github-ae)/
|
||||
const existingFileToCompare = file.replace(enterpriseRegex, '')
|
||||
const fileExt = path.extname(file)
|
||||
|
||||
// if the file in the enterprise directory is an exact copy of
|
||||
// the image in the local /assets/images directory, then we can
|
||||
// delete the enterprise image and the reference in the Markdown
|
||||
// will just work
|
||||
if (await fs.readFile(existingFileToCompare)) {
|
||||
// Buffer.compare and Jimp both return 0 if files match
|
||||
let compareResult = 1
|
||||
try {
|
||||
// Jimp gives slightly better results comparing image files
|
||||
// over using a buffer compare. Of the assets we have,
|
||||
// Jimp only supports png and gif
|
||||
if (fileExt === '.png' || fileExt === '.gif') {
|
||||
const existingImageToCompare = await jimp.read(existingFileToCompare)
|
||||
const enterpriseImage = await jimp.read(file)
|
||||
// if the diff.percent value is 0, images are identical
|
||||
const diff = await jimp.diff(existingImageToCompare, enterpriseImage)
|
||||
compareResult = diff.percent
|
||||
} else {
|
||||
const existingImageToCompare = await fs.readFile(existingFileToCompare)
|
||||
const enterpriseImage = await fs.readFile(file)
|
||||
compareResult = Buffer.compare(
|
||||
Buffer.from(existingImageToCompare),
|
||||
Buffer.from(enterpriseImage)
|
||||
)
|
||||
}
|
||||
} catch (err) {
|
||||
console.log(file)
|
||||
console.log(err)
|
||||
}
|
||||
if (compareResult === 0) await fs.unlink(file)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
main()
|
||||
.catch(console.error)
|
||||
.finally(() => console.log('Done!'))
|
||||
287
script/search/index-elasticsearch.mjs
Executable file
287
script/search/index-elasticsearch.mjs
Executable file
@@ -0,0 +1,287 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
// [start-readme]
|
||||
//
|
||||
// Creates Elasticsearch index, populates from records,
|
||||
// moves the index alias, deletes old indexes.
|
||||
//
|
||||
// [end-readme]
|
||||
|
||||
import fs from 'fs/promises'
|
||||
import path from 'path'
|
||||
|
||||
import { Client } from '@elastic/elasticsearch'
|
||||
import { program, Option } from 'commander'
|
||||
import chalk from 'chalk'
|
||||
|
||||
import { languageKeys } from '../../lib/languages.js'
|
||||
import { allVersions } from '../../lib/all-versions.js'
|
||||
import { decompress } from '../../lib/search/compress.js'
|
||||
|
||||
// Create an object that maps the "short name" of a version to
|
||||
// all information about it. E.g
|
||||
//
|
||||
// {
|
||||
// 'ghes-3.5': {
|
||||
// hasNumberedReleases: true,
|
||||
// currentRelease: '3.5',
|
||||
// version: 'enterprise-server@3.5',
|
||||
// miscBaseName: 'ghes-'
|
||||
// ...
|
||||
// },
|
||||
// ...
|
||||
//
|
||||
// We need this later to be able to map CLI arguments to what the
|
||||
// records are called when found on disk.
|
||||
const shortNames = Object.fromEntries(
|
||||
Object.values(allVersions).map((info) => {
|
||||
const shortName = info.hasNumberedReleases
|
||||
? info.miscBaseName + info.currentRelease
|
||||
: info.miscBaseName
|
||||
return [shortName, info]
|
||||
})
|
||||
)
|
||||
console.log({ shortNames })
|
||||
|
||||
const allVersionKeys = Object.keys(shortNames)
|
||||
|
||||
program
|
||||
.description('Creates Elasticsearch index from records')
|
||||
.option('-v, --verbose', 'Verbose outputs')
|
||||
.addOption(new Option('-V, --version <VERSION...>', 'Specific versions').choices(allVersionKeys))
|
||||
.addOption(
|
||||
new Option('-l, --language <LANGUAGE...>', 'Which languages to focus on').choices(languageKeys)
|
||||
)
|
||||
.addOption(
|
||||
new Option('--not-language <LANGUAGE...>', 'Specific language to omit').choices(languageKeys)
|
||||
)
|
||||
.option('-u, --elasticsearch-url <url>', 'If different from $ELASTICSEARCH_URL')
|
||||
.parse(process.argv)
|
||||
|
||||
main(program.opts())
|
||||
|
||||
async function main(opts) {
|
||||
if (!opts.elasticsearchUrl && !process.env.ELASTICSEARCH_URL) {
|
||||
throw new Error(
|
||||
'Must passed the elasticsearch URL option or ' +
|
||||
'set the environment variable ELASTICSEARCH_URL'
|
||||
)
|
||||
}
|
||||
let node = opts.elasticsearchUrl || process.env.ELASTICSEARCH_URL
|
||||
|
||||
// Allow the user to lazily set it to `localhost:9200` for example.
|
||||
if (!node.startsWith('http') && !node.startsWith('://') && node.split(':').length === 2) {
|
||||
node = `http://${node}`
|
||||
}
|
||||
|
||||
try {
|
||||
const parsed = new URL(node)
|
||||
if (!parsed.hostname) throw new Error('no valid hostname')
|
||||
} catch (err) {
|
||||
console.error(chalk.bold('URL for Elasticsearch not a valid URL', err))
|
||||
}
|
||||
|
||||
const { verbose, language, notLanguage } = opts
|
||||
|
||||
// The notLanguage is useful you want to, for example, index all languages
|
||||
// *except* English.
|
||||
if (language && notLanguage) {
|
||||
throw new Error("Can't combine --language and --not-language")
|
||||
}
|
||||
|
||||
if (verbose) {
|
||||
console.log(`Connecting to ${chalk.bold(safeUrlDisplay(node))}`)
|
||||
}
|
||||
|
||||
const client = new Client({
|
||||
node,
|
||||
sniffOnStart: true,
|
||||
})
|
||||
|
||||
// This will throw if it can't ping
|
||||
await client.ping()
|
||||
|
||||
const versionKeys = opts.version || allVersionKeys
|
||||
const languages =
|
||||
opts.language || languageKeys.filter((lang) => !notLanguage || !notLanguage.includes(lang))
|
||||
if (verbose) {
|
||||
console.log(`Indexing on languages ${chalk.bold(languages.join(', '))}`)
|
||||
}
|
||||
|
||||
for (const language of languages) {
|
||||
for (const versionKey of versionKeys) {
|
||||
console.log(chalk.yellow(`Indexing ${chalk.bold(versionKey)} in ${chalk.bold(language)}`))
|
||||
const indexName = `github-docs-${versionKey}-${language}`
|
||||
|
||||
console.time(`Indexing ${indexName}`)
|
||||
await indexVersion(client, indexName, versionKey, language, verbose)
|
||||
console.timeEnd(`Indexing ${indexName}`)
|
||||
if (verbose) {
|
||||
console.log(`To view index: ${safeUrlDisplay(node + `/${indexName}`)}`)
|
||||
console.log(`To search index: ${safeUrlDisplay(node + `/${indexName}/_search`)}`)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function safeUrlDisplay(url) {
|
||||
const parsed = new URL(url)
|
||||
if (parsed.password) {
|
||||
parsed.password = '***'
|
||||
}
|
||||
if (parsed.username) {
|
||||
parsed.username = parsed.username.slice(0, 4) + '***'
|
||||
}
|
||||
return parsed.toString()
|
||||
}
|
||||
|
||||
function utcTimestamp() {
|
||||
const d = new Date()
|
||||
return [
|
||||
d.getUTCFullYear(),
|
||||
d.getUTCMonth(),
|
||||
d.getUTCDate(),
|
||||
d.getUTCHours(),
|
||||
d.getUTCMinutes(),
|
||||
d.getUTCSeconds(),
|
||||
]
|
||||
.map((x) => x.toString())
|
||||
.join('')
|
||||
}
|
||||
|
||||
// Consider moving this to lib
|
||||
async function indexVersion(client, indexName, version, language, verbose = false) {
|
||||
// Note, it's a bit "weird" that numbered releases versions are
|
||||
// called the number but that's how the lib/search/indexes
|
||||
// files are named at the moment.
|
||||
const indexVersion = shortNames[version].hasNumberedReleases
|
||||
? shortNames[version].currentRelease
|
||||
: shortNames[version].miscBaseName
|
||||
const recordsName = `github-docs-${indexVersion}-${language}`
|
||||
|
||||
const records = await loadRecords(recordsName)
|
||||
|
||||
const thisAlias = `${indexName}__${utcTimestamp()}`
|
||||
|
||||
// CREATE INDEX
|
||||
const settings = {
|
||||
analysis: {
|
||||
analyzer: {
|
||||
text_analyzer: {
|
||||
filter: ['lowercase', 'stop', 'asciifolding'],
|
||||
tokenizer: 'standard',
|
||||
type: 'custom',
|
||||
},
|
||||
},
|
||||
filter: {
|
||||
// Will later, conditionally, put the snowball configuration here.
|
||||
},
|
||||
},
|
||||
}
|
||||
const snowballLanguage = getSnowballLanguage(language)
|
||||
if (snowballLanguage) {
|
||||
settings.analysis.analyzer.text_analyzer.filter.push('languaged_snowball')
|
||||
settings.analysis.filter.languaged_snowball = {
|
||||
type: 'snowball',
|
||||
language: snowballLanguage,
|
||||
}
|
||||
} else {
|
||||
if (verbose) {
|
||||
console.warn(`No snowball language for '${language}'`)
|
||||
}
|
||||
}
|
||||
|
||||
await client.indices.create({
|
||||
index: thisAlias,
|
||||
mappings: {
|
||||
properties: {
|
||||
url: { type: 'keyword' },
|
||||
title: { type: 'text', analyzer: 'text_analyzer', norms: false },
|
||||
title_autocomplete: {
|
||||
type: 'search_as_you_type',
|
||||
doc_values: false,
|
||||
max_shingle_size: 3,
|
||||
},
|
||||
content: { type: 'text', analyzer: 'text_analyzer' },
|
||||
headings: { type: 'text' },
|
||||
breadcrumbs: { type: 'text' },
|
||||
topics: { type: 'text' },
|
||||
popularity: { type: 'float' },
|
||||
},
|
||||
},
|
||||
settings,
|
||||
})
|
||||
|
||||
// POPULATE
|
||||
const operations = Object.values(records).flatMap((doc) => {
|
||||
const { title, objectID, content, breadcrumbs, headings, topics } = doc
|
||||
const record = {
|
||||
url: objectID,
|
||||
title,
|
||||
title_autocomplete: title,
|
||||
content,
|
||||
breadcrumbs,
|
||||
headings,
|
||||
topics: topics.filter(Boolean),
|
||||
// This makes sure the popularities are always greater than 1.
|
||||
// Generally the 'popularity' is a ratio where the most popular
|
||||
// one of all is 1.0.
|
||||
// By making it >=1.0 when we multiply a relevance score,
|
||||
// you never get a product of 0.0.
|
||||
popularity: doc.popularity + 1,
|
||||
}
|
||||
return [{ index: { _index: thisAlias } }, record]
|
||||
})
|
||||
|
||||
const bulkResponse = await client.bulk({ refresh: true, operations })
|
||||
|
||||
if (bulkResponse.errors) {
|
||||
// Some day, when we're more confident how and why this might happen
|
||||
// we can rewrite this code to "massage" the errors better.
|
||||
// For now, if it fails, it's "OK". It means we won't be proceeding,
|
||||
// an error is thrown in Actions and we don't have to worry about
|
||||
// an incompletion index.
|
||||
console.error(bulkResponse.errors)
|
||||
throw new Error('Bulk errors happened.')
|
||||
}
|
||||
|
||||
const { count } = await client.count({ index: thisAlias })
|
||||
console.log(`Documents now in ${chalk.bold(thisAlias)}: ${chalk.bold(count.toLocaleString())}`)
|
||||
|
||||
// POINT THE ALIAS
|
||||
await client.indices.putAlias({
|
||||
index: thisAlias,
|
||||
name: indexName,
|
||||
})
|
||||
console.log(`Alias ${indexName} -> ${thisAlias}`)
|
||||
|
||||
// DELETE ALL OTHER OLDER INDEXES
|
||||
const indices = await client.cat.indices({ format: 'json' })
|
||||
for (const index of indices) {
|
||||
if (index.index !== thisAlias && index.index.startsWith(indexName)) {
|
||||
await client.indices.delete({ index: index.index })
|
||||
console.log('Deleted', index.index)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async function loadRecords(indexName) {
|
||||
const filePath = path.join('lib', 'search', 'indexes', `${indexName}-records.json.br`)
|
||||
// Do not set to 'utf8' on file reads
|
||||
return fs.readFile(filePath).then(decompress).then(JSON.parse)
|
||||
}
|
||||
|
||||
function getSnowballLanguage(language) {
|
||||
// Based on https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-snowball-tokenfilter.html
|
||||
// Note, not all languages are supported. So this function might return
|
||||
// undefined. That implies that you can't use snowballing.
|
||||
return {
|
||||
en: 'English',
|
||||
fr: 'French',
|
||||
es: 'Spanish',
|
||||
ru: 'Russian',
|
||||
it: 'Italian',
|
||||
de: 'German',
|
||||
pt: 'Portuguese',
|
||||
}[language]
|
||||
}
|
||||
@@ -59,13 +59,16 @@ export default function parsePageSectionsIntoRecords(page) {
|
||||
// pages that yields some decent content to be searched on, because
|
||||
// when you view these pages in a browser, there's clearly text there.
|
||||
if ($root.length > 0) {
|
||||
body = getAllText($, $root)
|
||||
body = getAllText($root)
|
||||
}
|
||||
|
||||
if (!body && !intro) {
|
||||
console.warn(`${objectID} has no body and no intro.`)
|
||||
}
|
||||
|
||||
// These below lines can be deleted (along with the `maxContentLength`
|
||||
// config) once we've stopped generating Lunr indexes on disk that
|
||||
// we store as Git LFS.
|
||||
if (languageCode !== 'en' && body.length > maxContentLength) {
|
||||
body = body.slice(0, maxContentLength)
|
||||
}
|
||||
@@ -82,55 +85,42 @@ export default function parsePageSectionsIntoRecords(page) {
|
||||
}
|
||||
}
|
||||
|
||||
function getAllText($, $root) {
|
||||
let text = ''
|
||||
function getAllText($root) {
|
||||
const inlineElements = new Set(
|
||||
`a,abbr,acronym,audio,b,bdi,bdo,big,br,button,canvas,cite,code,data,
|
||||
datalist,del,dfn,em,embed,i,iframe,img,input,ins,kbd,label,map,mark,
|
||||
meter,noscript,object,output,picture,progress,q,ruby,s,samp,script,
|
||||
select,slot,small,span,strong,sub,sup,svg,template,textarea,time,
|
||||
tt,u,var,video,wbr`
|
||||
.split(',')
|
||||
.map((s) => s.trim())
|
||||
)
|
||||
|
||||
// We need this so we can know if we processed, for example,
|
||||
// a <td> followed by a <p> because if that's the case, don't use
|
||||
// a ' ' to concatenate the texts together but a '\n' instead.
|
||||
// That means, given this input:
|
||||
//
|
||||
// <p>Bla</p><table><tr><td>Foo</td><td>Bar</td></table><p>Hi again</p>
|
||||
//
|
||||
// we can produce this outcome:
|
||||
//
|
||||
// 'Bla\nFoo Bar\nHi again'
|
||||
//
|
||||
let previousTagName = ''
|
||||
const walkTree = (node, callback, index = 0, level = 0) => {
|
||||
callback(node, index, level)
|
||||
for (let i = 0; i < (node.children || []).length; i++) {
|
||||
walkTree(node.children[i], callback, i, ++level)
|
||||
level--
|
||||
}
|
||||
}
|
||||
|
||||
$('p, h2, h3, td, pre, li', $root).each((i, element) => {
|
||||
const $element = $(element)
|
||||
if (previousTagName === 'td' && element.tagName !== 'td') {
|
||||
text += '\n'
|
||||
const fragments = []
|
||||
|
||||
walkTree($root[0], (element) => {
|
||||
if (element.name === 'body') return
|
||||
|
||||
if (element.type === 'text') {
|
||||
const parentElement = element.parent || {}
|
||||
const previousElement = element.prev || {}
|
||||
let { data } = element
|
||||
if (data.trim()) {
|
||||
if (!inlineElements.has(parentElement.name) && !inlineElements.has(previousElement.name)) {
|
||||
data = `\n${data}`
|
||||
}
|
||||
fragments.push(data)
|
||||
}
|
||||
}
|
||||
// Because our cheerio selector is all the block level tags,
|
||||
// what you might end up with is, from:
|
||||
//
|
||||
// <li><p>Text</p></li>
|
||||
// <li><pre>Code</pre></li>
|
||||
//
|
||||
// ['Text', 'Text', 'Code', 'Code']
|
||||
//
|
||||
// because it will spot both the <li> and the <p>.
|
||||
// If all HTML was exactly like that, you could omit the <li> selector,
|
||||
// but a lot of HTML is like this:
|
||||
//
|
||||
// <li>Bare text<li>
|
||||
//
|
||||
// So we need to bail if we're inside a block level element whose parent
|
||||
// already was a <li>.
|
||||
if ((element.tagName === 'p' || element.tagName === 'pre') && element.parent.tagName === 'li') {
|
||||
return
|
||||
}
|
||||
text += $element.text()
|
||||
if (element.tagName === 'td') {
|
||||
text += ' '
|
||||
} else {
|
||||
text += '\n'
|
||||
}
|
||||
previousTagName = element.tagName
|
||||
})
|
||||
text = text.trim().replace(/\s*[\r\n]+/g, '\n')
|
||||
|
||||
return text
|
||||
return fragments.join('').trim()
|
||||
}
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
<div data-search="breadcrumbs">
|
||||
<nav class="breadcrumbs">
|
||||
<a href="#">GitHub Actions</a>
|
||||
<a href="#">actions learning path</a>
|
||||
<a href="#">I am the page title</a>
|
||||
</nav>
|
||||
</div>
|
||||
|
||||
<h1>I am the page title</h1>
|
||||
|
||||
<div data-search="lead">
|
||||
<p>This is an introduction to the article.</p>
|
||||
</div>
|
||||
|
||||
<div data-search="article-body">
|
||||
<h1>Heading</h1>
|
||||
|
||||
<!-- Deliberately no whitespace between tags -->
|
||||
<div><ul><ul><li><div><span><div><a href="foo"><h2>Adding an email address to your GitHub account</h2><p>GitHub, see "<a href="/en/articles/setting-your-commit-email-address">Setting your commit email address</a>."</p></a></div></span></div></li>
|
||||
<li><div><div><a href="/"><h2>Changing your primary email address</h2><p>You can change the email address associated with your personal account at any time.</p></a></div></span></div></li>
|
||||
</ul></ul></div>
|
||||
|
||||
</div>
|
||||
File diff suppressed because one or more lines are too long
@@ -1,7 +1,10 @@
|
||||
import { fileURLToPath } from 'url'
|
||||
import path from 'path'
|
||||
import fs from 'fs/promises'
|
||||
|
||||
import cheerio from 'cheerio'
|
||||
import { expect, test } from '@jest/globals'
|
||||
|
||||
import parsePageSectionsIntoRecords from '../../../script/search/parse-page-sections-into-records.js'
|
||||
const __dirname = path.dirname(fileURLToPath(import.meta.url))
|
||||
|
||||
@@ -22,6 +25,10 @@ const fixtures = {
|
||||
path.join(__dirname, 'fixtures/page-with-multiple-h1s.html'),
|
||||
'utf8'
|
||||
),
|
||||
pageHeadingParagraphNoWhitespace: await fs.readFile(
|
||||
path.join(__dirname, 'fixtures/page-with-heading-and-paragraph-no-whitespace.html'),
|
||||
'utf8'
|
||||
),
|
||||
}
|
||||
|
||||
describe('search parsePageSectionsIntoRecords module', () => {
|
||||
@@ -40,7 +47,7 @@ describe('search parsePageSectionsIntoRecords module', () => {
|
||||
"In this article\nThis won't be ignored.\nFirst heading\n" +
|
||||
"Here's a paragraph.\nAnd another.\nSecond heading\n" +
|
||||
"Here's a paragraph in the second section.\nAnd another.\n" +
|
||||
'Table heading\nPeter Human\n' +
|
||||
'Table heading\nPeter\nHuman\n' +
|
||||
'Bullet\nPoint\nNumbered\nList\n' +
|
||||
"Further reading\nThis won't be ignored.",
|
||||
topics: ['topic1', 'topic2', 'GitHub Actions', 'Actions'],
|
||||
@@ -90,4 +97,27 @@ describe('search parsePageSectionsIntoRecords module', () => {
|
||||
const record = parsePageSectionsIntoRecords({ href, $, languageCode: 'en' })
|
||||
expect(record.title).toEqual('I am the page title')
|
||||
})
|
||||
|
||||
test("content doesn't lump headings with paragraphs together", () => {
|
||||
const html = fixtures.pageHeadingParagraphNoWhitespace
|
||||
const $ = cheerio.load(html)
|
||||
const href = '/example/href'
|
||||
const record = parsePageSectionsIntoRecords({ href, $, languageCode: 'en' })
|
||||
|
||||
// This is a <h2> inside the page but it should only appear once.
|
||||
// We had a bug where the heading would be injected twice.
|
||||
// E.g.
|
||||
//
|
||||
// <h2>Heading</h2><p>Text here</p>
|
||||
//
|
||||
// would become:
|
||||
//
|
||||
// Heading\nHeadingText here
|
||||
//
|
||||
// So now we make sure it only appears exactly once.
|
||||
expect(record.content.match(/Changing your primary email address/g).length).toBe(1)
|
||||
// But note also that it would also concatenate the text of the heading
|
||||
// with the text of the paragraph without a whitespace in between.
|
||||
expect(record.content.includes('email addressYou can set')).toBeFalsy()
|
||||
})
|
||||
})
|
||||
|
||||
@@ -126,7 +126,6 @@ includeGuides:
|
||||
- /admin/monitoring-activity-in-your-enterprise/exploring-user-activity/log-forwarding
|
||||
- /admin/monitoring-activity-in-your-enterprise/exploring-user-activity/managing-global-webhooks
|
||||
- /admin/user-management/managing-organizations-in-your-enterprise/adding-organizations-to-your-enterprise
|
||||
- /admin/user-management/managing-organizations-in-your-enterprise/managing-unowned-organizations-in-your-enterprise
|
||||
- /admin/user-management/managing-projects-using-jira
|
||||
- /admin/user-management/managing-users-in-your-enterprise/inviting-people-to-manage-your-enterprise
|
||||
- /admin/user-management/managing-users-in-your-enterprise/managing-support-entitlements-for-your-enterprise
|
||||
|
||||
@@ -30,6 +30,7 @@ children:
|
||||
- /username-considerations-for-external-authentication
|
||||
- /changing-authentication-methods
|
||||
- /allowing-built-in-authentication-for-users-outside-your-provider
|
||||
- /troubleshooting-identity-and-access-management-for-your-enterprise
|
||||
shortTitle: Manage IAM for your enterprise
|
||||
---
|
||||
|
||||
|
||||
@@ -0,0 +1,44 @@
|
||||
---
|
||||
title: Troubleshooting identity and access management for your enterprise
|
||||
shortTitle: Troubleshoot IAM
|
||||
intro: Review common issues and solutions for identity and access management for your enterprise.
|
||||
versions:
|
||||
ghec: '*'
|
||||
ghes: '*'
|
||||
type: how_to
|
||||
topics:
|
||||
- Accounts
|
||||
- Authentication
|
||||
- Enterprise
|
||||
- Identity
|
||||
- Security
|
||||
- SSO
|
||||
- Troubleshooting
|
||||
---
|
||||
|
||||
## Username conflicts
|
||||
|
||||
{% ifversion ghec %}If your enterprise uses {% data variables.product.prodname_emus %}, {% endif %}{% data variables.product.product_name %} normalizes an identifier provided by your identity provider (IdP) to create each person's username on {% data variables.product.prodname_dotcom %}. If multiple accounts are normalized into the same {% data variables.product.prodname_dotcom %} username, a username conflict occurs, and only the first user account is created. For more information, see "[Username considerations for external authentication](/admin/identity-and-access-management/managing-iam-for-your-enterprise/username-considerations-for-external-authentication)."
|
||||
|
||||
{% ifversion ghec %}
|
||||
## Errors when switching authentication configurations
|
||||
|
||||
If you're experiencing problems while switching between different authentication configurations, such as changing your SAML SSO configuration from an organization to an enterprise account or migrating from SAML to OIDC for {% data variables.product.prodname_emus %}, ensure you're following our best practices for the change.
|
||||
|
||||
- "[Switching your SAML configuration from an organization to an enterprise account](/admin/identity-and-access-management/using-saml-for-enterprise-iam/switching-your-saml-configuration-from-an-organization-to-an-enterprise-account)"
|
||||
- "[Migrating from SAML to OIDC](/admin/identity-and-access-management/using-enterprise-managed-users-for-iam/migrating-from-saml-to-oidc)"
|
||||
|
||||
## Accessing your enterprise when SSO is not available
|
||||
|
||||
When a configuration error or an issue with your identity provider IdP prevents you from using SSO, you can use a recovery code to access your enterprise. For more information, see "[Accessing your enterprise account if your identity provider is unavailable](/admin/identity-and-access-management/managing-recovery-codes-for-your-enterprise/accessing-your-enterprise-account-if-your-identity-provider-is-unavailable)."
|
||||
{% endif %}
|
||||
|
||||
## SAML authentication errors
|
||||
|
||||
If users are experiencing errors when attempting to authenticate with SAML, see "[Troubleshooting SAML authentication](/admin/identity-and-access-management/using-saml-for-enterprise-iam/troubleshooting-saml-authentication)."
|
||||
|
||||
{% ifversion ghec %}
|
||||
## 参考リンク
|
||||
|
||||
- "[Troubleshooting identity and access management for your organization](/organizations/managing-saml-single-sign-on-for-your-organization/troubleshooting-identity-and-access-management-for-your-organization)"
|
||||
{% endif %}
|
||||
@@ -51,9 +51,3 @@ Alternatively, you can also configure SAML SSO using Okta for an organization th
|
||||
1. [**Save**] をクリックします。
|
||||
{% data reusables.saml.okta-view-setup-instructions %}
|
||||
1. 設定手順の情報を使用して、Enterprise アカウントの SAML を有効にします。 詳しい情報については、「[Enterprise 向けのSAML シングルサインオンを設定する](/admin/authentication/managing-identity-and-access-for-your-enterprise/configuring-saml-single-sign-on-for-your-enterprise)」を参照してください。
|
||||
|
||||
## Okta でグループを作成する
|
||||
|
||||
1. Okta で、Enterprise アカウントが所有する各 Organization に合わせてグループを作成します。 各グループの名前は、Organization のアカウント名 (Organization の表示名ではく) に一致する必要があります。 たとえば、Organization の URL が `https://github.com/octo-org` の場合は、グループに `octo-org` という名前をつけます。
|
||||
1. Enterprise アカウントに作成したアプリケーションを各グループに割り当てます。 {% data variables.product.prodname_dotcom %} が、ユーザごとに `groups` データをすべて受け取ります。
|
||||
1. ユーザを所属させたい Organization に基づいて、ユーザをグループに追加します。
|
||||
|
||||
@@ -136,6 +136,10 @@ To prevent a person from authenticating with your IdP and staying authorized ind
|
||||
|
||||
To customize the session duration, you may be able to define the value of the `SessionNotOnOrAfter` attribute on your IdP. If you define a value less than 24 hours, {% data variables.product.product_name %} may prompt people to authenticate every time {% data variables.product.product_name %} initiates a redirect.
|
||||
|
||||
{% ifversion ghec %}
|
||||
To prevent authentication errors, we recommend a minimum session duration of 4 hours. For more information, see "[Troubleshooting SAML authentication](/admin/identity-and-access-management/using-saml-for-enterprise-iam/troubleshooting-saml-authentication#users-are-repeatedly-redirected-to-authenticate)."
|
||||
{% endif %}
|
||||
|
||||
{% note %}
|
||||
|
||||
**Notes**:
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user