diff --git a/content/actions/reference/limits.md b/content/actions/reference/limits.md index 1568d44f23a3..742269994691 100644 --- a/content/actions/reference/limits.md +++ b/content/actions/reference/limits.md @@ -26,32 +26,17 @@ These limits are subject to change. | Limit category | Limit | Threshold | Description | Can {% data variables.product.github %} Support increase? | | :---- | :---- | :---- | :---- | :---- | -| {% ifversion fpt or ghec %} | -| Workflows queuing | Webhook events received (Free) | 100 events / 10 seconds / repository | Each repository is limited to incoming webhook events, whether or not they match a workflow trigger. If this front-door limit is exceeded, subsequent events are rejected until the event rate falls below the limit. | {% octicon "x" aria-label="No" %} | -| Workflows queuing | Webhook events received (Pro) | 500 events / 10 seconds / repository | Each repository is limited to incoming webhook events, whether or not they match a workflow trigger. If this front-door limit is exceeded, subsequent events are rejected until the event rate falls below the limit. | {% octicon "x" aria-label="No" %} | -| Workflows queuing | Webhook events received (Team) | 500 events / 10 seconds / repository | Each repository is limited to incoming webhook events, whether or not they match a workflow trigger. If this front-door limit is exceeded, subsequent events are rejected until the event rate falls below the limit. | {% octicon "x" aria-label="No" %} | -| Workflows queuing | Webhook events received (Legacy paid plans) | 500 events / 10 seconds / repository | Each repository is limited to incoming webhook events, whether or not they match a workflow trigger. If this front-door limit is exceeded, subsequent events are rejected until the event rate falls below the limit. | {% octicon "x" aria-label="No" %} | -| Workflows queuing | Webhook events received (Enterprise) | 1,500 events / 10 seconds / repository | Each repository is limited to incoming webhook events, whether or not they match a workflow trigger. If this front-door limit is exceeded, subsequent events are rejected until the event rate falls below the limit. | {% octicon "x" aria-label="No" %} | -| Workflows queuing | Events eligible to trigger workflows (Free, public repository) | 20 events / 10 seconds / repository | Each repository is limited to events that match any workflow. If this limit is exceeded, subsequent events are rejected until the event rate falls below the limit. | {% octicon "x" aria-label="No" %} | -| Workflows queuing | Events eligible to trigger workflows (Free, private repository) | 10 events / 10 seconds / repository | Each repository is limited to events that match any workflow. If this limit is exceeded, subsequent events are rejected until the event rate falls below the limit. | {% octicon "x" aria-label="No" %} | -| Workflows queuing | Events eligible to trigger workflows (Pro) | 200 events / 10 seconds / repository | Each repository is limited to events that match any workflow. If this limit is exceeded, subsequent events are rejected until the event rate falls below the limit. | {% octicon "x" aria-label="No" %} | -| Workflows queuing | Events eligible to trigger workflows (Team) | 200 events / 10 seconds / repository | Each repository is limited to events that match any workflow. If this limit is exceeded, subsequent events are rejected until the event rate falls below the limit. | {% octicon "x" aria-label="No" %} | -| Workflows queuing | Events eligible to trigger workflows (Legacy paid plans) | 200 events / 10 seconds / repository | Each repository is limited to events that match any workflow. If this limit is exceeded, subsequent events are rejected until the event rate falls below the limit. | {% octicon "x" aria-label="No" %} | -| Workflows queuing | Events eligible to trigger workflows (Enterprise) | 400 events / 10 seconds / repository | Each repository is limited to events that match any workflow. If this limit is exceeded, subsequent events are rejected until the event rate falls below the limit. | {% octicon "x" aria-label="No" %} | -| Workflows queuing | Workflow runs queued | 500 workflow runs / 10 seconds / repository | Each repository is limited to workflow runs queued. One eligible event can create multiple workflow runs, while a run with reusable workflows counts as one workflow run. When the limit is reached, additional workflow runs are blocked and will not be queued. | {% octicon "x" aria-label="No" %} | -| {% else %} | -| Workflows queuing | Webhook event limit | 1500 events / 10 seconds / repository | This limit controls the number of webhook events that a repository can receive within a 10-second period. Not every webhook event triggers a workflow run. | {% octicon "check" aria-label="Yes" %} Support ticket | -| Workflows queuing | Workflow run queued | 500 workflow runs / 10 seconds | When the limit is reached, the workflow runs that were supposed to be triggered by the webhook events will be blocked and will not be queued. Reusable workflows are viewed as a single entity. For example, a run with 30 reusable workflows counts as 1 in this instance. | {% octicon "x" aria-label="No" %} | -| {% endif %} | -| {% ifversion actions-nga %} | -| Workflows queuing | Concurrency group queue | 100 workflow runs / concurrency group | When using `queue: max` in the `concurrency` section, up to 100 jobs or workflow runs can be queued per concurrency group. Runs beyond this limit will be rejected. | {% octicon "x" aria-label="No" %} | -| {% endif %} | | Workflow execution limit | Workflow run time | 35 days / workflow run | If a workflow run reaches this limit, the workflow run is cancelled. This period includes execution duration, and time spent on waiting and approval. | {% octicon "x" aria-label="No" %} | | Workflow execution limit | Gate approval time | 30 days | A workflow may wait for up to [30 days on environment approvals](/actions/reference/workflows-and-actions/deployments-and-environments#wait-timer). | {% octicon "x" aria-label="No" %} | | Workflow execution limit | Job Matrix | 256 jobs / workflow run | A job matrix can generate a maximum of 256 jobs per workflow run. This limit applies to both {% data variables.product.github %}-hosted and self-hosted runners. | {% octicon "x" aria-label="No" %} | | Workflow execution limit | Re-run | 50 re-runs | A workflow run can be re-run a maximum of 50 times. This limit includes both full re-runs and re-runs of a subset of jobs. | {% octicon "check" aria-label="Yes" %} Support ticket | | Workflow file | Workflow file size | 500 KB per file | A workflow file larger than 500 KB will not start runs. See [Workflow file size](#workflow-file-size). | {% octicon "x" aria-label="No" %} | | Checks | Check runs per check suite | 50,000 check runs / check suite | A check suite can have a maximum of 50,000 check runs. This limit applies to check runs created through the Checks API and by {% data variables.product.prodname_actions %} workflow runs. When a check suite reaches this limit, additional check runs cannot be created for that check suite. | {% octicon "check" aria-label="Yes" %} Support ticket | +| Workflows queuing | Workflow trigger event rate limit | 1500 events / 10 seconds / repository | Each repository is limited to events triggering a workflow run. | {% octicon "check" aria-label="Yes" %} Support ticket | +| Workflows queuing | Workflow run queued | 500 workflow runs / 10 seconds | When the limit is reached, the workflow runs that were supposed to be triggered by the webhook events will be blocked and will not be queued. Reusable workflows are viewed as a single entity. For example, a run with 30 reusable workflows counts as 1 in this instance. | {% octicon "x" aria-label="No" %} | +| {% ifversion actions-nga %} | +| Workflows queuing | Concurrency group queue | 100 workflow runs / concurrency group | When using `queue: max` in the `concurrency` section, up to 100 jobs or workflow runs can be queued per concurrency group. Runs beyond this limit will be rejected. | {% octicon "x" aria-label="No" %} | +| {% endif %} | | Self-hosted | Runner registrations | 1500 runners / 5 minutes / repository/org/enterprise | Runners can be registered per repository/organization/enterprise. | {% octicon "check" aria-label="Yes" %} Support ticket | | Self-hosted | Runners per runner group | 10,000 runners | Runners registered at the same time per runner group. | {% octicon "x" aria-label="No" %} | | Self-hosted | Job execution time | 5 days | Each job in a workflow can run for up to 5 days of execution time. If a job reaches this limit, the job is terminated and fails. | {% octicon "x" aria-label="No" %} | diff --git a/src/languages/lib/correct-translation-content.ts b/src/languages/lib/correct-translation-content.ts index 5281cb466d00..9d615af94351 100644 --- a/src/languages/lib/correct-translation-content.ts +++ b/src/languages/lib/correct-translation-content.ts @@ -204,6 +204,8 @@ export function correctTranslatedContentStrings( ) content = content.replaceAll('{{ glosario.term }}', '{{ glossary.term }}') content = content.replaceAll('{{ glosario.description }}', '{{ glossary.description }}') + // `{{ glosario.descripción }}` — accented Spanish translation of "description" + content = content.replaceAll('{{ glosario.descripción }}', '{{ glossary.description }}') // Catch "o" and "y/o" between any plan names in ifversion/elsif/if tags content = content.replace( /\{%-? (?:ifversion|elsif|if) [^%]*?(?:\by\/o\b|\bo\b)[^%]*?%\}/g, @@ -267,6 +269,18 @@ export function correctTranslatedContentStrings( content = content.replaceAll('{% de escritorio %}', '{% desktop %}') content = content.replaceAll('{%- de escritorio %}', '{%- desktop %}') + // [SCRAPE-6883] data/reusables/apps/generate-installation-access-token.md: + // the `{% endif %}` closing the `{% ifversion enterprise-installed-apps %}` + // block was dropped after the "siempre reciben todos esos permisos" + // sentence, leaving the tag unclosed. This reusable is rendered on + // apps/creating-github-apps/authenticating-with-a-github-app/ + // authenticating-as-a-github-app-installation.md and + // generating-an-installation-access-token-for-a-github-app.md too. + content = content.replaceAll( + 'Solo tienen acceso a los permisos de empresa que se les han concedido y siempre reciben todos esos permisos.\n', + 'Solo tienen acceso a los permisos de empresa que se les han concedido y siempre reciben todos esos permisos.{% endif %}\n', + ) + // `{% variablesdatos.producto.` — translator fused "variables" + "datos" (data) // without the `data` keyword and used "producto" (product) instead of "variables.product". // e.g. `{% variablesdatos.producto.prodname_dotcom %}` → `{% data variables.product.prodname_dotcom %}` @@ -301,6 +315,20 @@ export function correctTranslatedContentStrings( '{% ifversion ghec %}SCIM{% else %} con Okta{% endif %}', ) + // [SCRAPE-6781] codespaces/managing-codespaces-for-your-organization/ + // enabling-or-disabling-github-codespaces-for-your-organization.md: the + // translator reordered the inline Liquid tags to match Spanish word + // order, so `{% endif %}` lands before the `{% ifversion ghec %}` that + // opens the block. English source is `...private {% ifversion ghec %} + // and internal {% endif %}repositories`. Reorder the tags around the + // existing translated words so ghec reads "internos y privados" and fpt + // reads "privados". This pattern occurs 3 times in the file (intro plus + // two body paragraphs), all with the identical scrambled substring. + content = content.replaceAll( + 'los repositorios internos y {% endif %}privados {% ifversion ghec %}de la organización', + 'los repositorios privados {% ifversion ghec %}e internos {% endif %}de la organización', + ) + // data/reusables/repositories/you-can-fork.md: translation starts with // `{% elsif ghes or ghec %}` instead of `{% ifversion ghes or ghec %}` — // the opening `{% ifversion %}` was replaced with `{% elsif %}`, leaving no @@ -931,6 +959,18 @@ export function correctTranslatedContentStrings( // appears as `{% modelo %}` orphaned. Drop unmatched bare `{% modelo %}` is // risky; instead, leave as-is (Liquid will raise but rare). + // [SCRAPE-6885] apps/creating-github-apps/about-creating-github-apps/ + // about-creating-github-apps.md: the translator dropped the closing + // `{% endif %}` (and the word "enterprise,") from the + // `{% ifversion enterprise-installed-apps %}enterprise, {% endif %}` + // fragment, leaving the tag unclosed. English: `...install it on your + // {% ifversion enterprise-installed-apps %}enterprise, {% endif %} + // organization or personal account.` + content = content.replaceAll( + 'você precisa instalá-lo em sua conta corporativa, {% ifversion enterprise-installed-apps %}organização ou conta pessoal.', + 'você precisa instalá-lo na sua {% ifversion enterprise-installed-apps %}empresa, {% endif %}organização ou conta pessoal.', + ) + // Per-file targeted fixes for translator-scrambled Liquid that we can't // catch via generic patterns. These are scoped tightly to the originating // file so they're a no-op everywhere else, and they touch only the @@ -1327,8 +1367,9 @@ export function correctTranslatedContentStrings( content = content.replaceAll('{%- конечным %}', '{%- endif %}') // `{%- конец %}` — dash-trimmed form of "end" = endif content = content.replaceAll('{%- конец %}', '{%- endif %}') - // `{%- конец для %}` — "end for" = endfor + // `{%- конец для %}` / `{% конец для %}` — "end for" = endfor content = content.replaceAll('{%- конец для %}', '{%- endfor %}') + content = content.replaceAll('{% конец для %}', '{% endfor %}') // `{% заголовки строк %}` — "row headers" = rowheaders (opener; `{% endrowheaders %}` stays in English) content = content.replaceAll('{% заголовки строк %}', '{% rowheaders %}') content = content.replaceAll('{%- заголовки строк %}', '{%- rowheaders %}') @@ -2211,6 +2252,21 @@ export function correctTranslatedContentStrings( '1. "리포지토리 외부 협력자 초대{% ifversion ghec %}에서 설정 변경에 대한 정보를 검토합니다{% elsif ghes %}." {% data reusables.enterprise-accounts.view-current-policy-config-orgs %}', '1. "리포지토리{% ifversion ghec %} 외부 협력자{% elsif ghes %} 초대{% endif %}"에서 설정 변경에 대한 정보를 검토합니다. {% data reusables.enterprise-accounts.view-current-policy-config-orgs %}', ) + + // [SCRAPE-6886] data/reusables/package_registry/public-or-private-packages.md: + // the translator scrambled the `{% ifversion fpt or ghec %}...{% else %} + // ...{% endif %}` fragment, moving `{% else %}` to the front (with no + // opener) and leaving the true `{% ifversion %}` opener stranded after + // the `{% endif %}` it should have preceded (`tag "else" not found`). + // This reusable is rendered on introduction-to-github-packages.md and + // publishing-a-package.md too. English: `...to share with + // {% ifversion fpt or ghec %}all of {% data variables.product.prodname_dotcom %} + // {% else %}everyone on your enterprise{% endif %}, or in a private + // repository...` + content = content.replaceAll( + '퍼블릭 리포지토리(퍼블릭 패키지)에 패키지를 게시하여 {% else %}엔터프라이즈의 모든 사용자{% endif %}{% ifversion fpt or ghec %} 모두{% data variables.product.prodname_dotcom %}과(와) 공유하거나 프라이빗 리포지토리의 패키지(프라이빗 패키지)를 게시하여 협력자 또는 조직과 공유할 수 있습니다.', + '퍼블릭 리포지토리(퍼블릭 패키지)에 패키지를 게시하여 {% ifversion fpt or ghec %}모두 {% data variables.product.prodname_dotcom %}과(와){% else %}엔터프라이즈의 모든 사용자와{% endif %} 공유하거나 프라이빗 리포지토리의 패키지(프라이빗 패키지)를 게시하여 협력자 또는 조직과 공유할 수 있습니다.', + ) } if (context.code === 'de') { diff --git a/src/languages/tests/correct-translation-content.ts b/src/languages/tests/correct-translation-content.ts index f08625f0e9d9..4eb1a3ba321c 100644 --- a/src/languages/tests/correct-translation-content.ts +++ b/src/languages/tests/correct-translation-content.ts @@ -103,6 +103,7 @@ describe('correctTranslatedContentStrings', () => { expect(fix('{% para glosario en glosarios %}', 'es')).toBe('{% for glossary in glossaries %}') expect(fix('{{ glosario.term }}', 'es')).toBe('{{ glossary.term }}') expect(fix('{{ glosario.description }}', 'es')).toBe('{{ glossary.description }}') + expect(fix('{{ glosario.descripción }}', 'es')).toBe('{{ glossary.description }}') }) test('fixes o and y/o → or in ifversion tags', () => { @@ -941,6 +942,8 @@ describe('correctTranslatedContentStrings', () => { expect(fix('{% для глоссария в глоссариях %}', 'ru')).toBe('{% for glossary in glossaries %}') expect(fix('{{ глоссарий.term }}', 'ru')).toBe('{{ glossary.term }}') expect(fix('{{ глоссарий.description }}', 'ru')).toBe('{{ glossary.description }}') + expect(fix('{% конец для %}', 'ru')).toBe('{% endfor %}') + expect(fix('{%- конец для %}', 'ru')).toBe('{%- endfor %}') }) test('fixes rearranged data tag patterns', () => { @@ -3318,4 +3321,48 @@ Para más información, consulta "[AUTOTITLE](/path)". expect(fix(fixed, 'ko')).toBe(fixed) }) }) + + describe('enabling-or-disabling-github-codespaces-for-your-organization.md per-file fix', () => { + test('es: reorders the scrambled ifversion/endif tags around "privados e internos"', () => { + const broken = + 'Puede habilitar {% data variables.product.prodname_github_codespaces %} para los repositorios internos y {% endif %}privados {% ifversion ghec %}de la organización.' + const fixed = + 'Puede habilitar {% data variables.product.prodname_github_codespaces %} para los repositorios privados {% ifversion ghec %}e internos {% endif %}de la organización.' + expect(fix(broken, 'es')).toBe(fixed) + expect(fix(fixed, 'es')).toBe(fixed) + }) + }) + + describe('data/reusables/apps/generate-installation-access-token.md per-file fix', () => { + test('es: appends the dropped endif after the enterprise scoping sentence', () => { + const broken = + 'Solo tienen acceso a los permisos de empresa que se les han concedido y siempre reciben todos esos permisos.\nLa respuesta incluirá un token.' + const fixed = + 'Solo tienen acceso a los permisos de empresa que se les han concedido y siempre reciben todos esos permisos.{% endif %}\nLa respuesta incluirá un token.' + expect(fix(broken, 'es')).toBe(fixed) + expect(fix(fixed, 'es')).toBe(fixed) + }) + }) + + describe('about-creating-github-apps.md per-file fix', () => { + test('pt: restores the dropped ifversion/endif around "empresa,"', () => { + const broken = + 'Para usar seu {% data variables.product.prodname_github_app %}, você precisa instalá-lo em sua conta corporativa, {% ifversion enterprise-installed-apps %}organização ou conta pessoal.' + const fixed = + 'Para usar seu {% data variables.product.prodname_github_app %}, você precisa instalá-lo na sua {% ifversion enterprise-installed-apps %}empresa, {% endif %}organização ou conta pessoal.' + expect(fix(broken, 'pt')).toBe(fixed) + expect(fix(fixed, 'pt')).toBe(fixed) + }) + }) + + describe('data/reusables/package_registry/public-or-private-packages.md per-file fix', () => { + test('ko: reorders the scrambled ifversion/else/endif fragment', () => { + const broken = + '퍼블릭 리포지토리(퍼블릭 패키지)에 패키지를 게시하여 {% else %}엔터프라이즈의 모든 사용자{% endif %}{% ifversion fpt or ghec %} 모두{% data variables.product.prodname_dotcom %}과(와) 공유하거나 프라이빗 리포지토리의 패키지(프라이빗 패키지)를 게시하여 협력자 또는 조직과 공유할 수 있습니다.' + const fixed = + '퍼블릭 리포지토리(퍼블릭 패키지)에 패키지를 게시하여 {% ifversion fpt or ghec %}모두 {% data variables.product.prodname_dotcom %}과(와){% else %}엔터프라이즈의 모든 사용자와{% endif %} 공유하거나 프라이빗 리포지토리의 패키지(프라이빗 패키지)를 게시하여 협력자 또는 조직과 공유할 수 있습니다.' + expect(fix(broken, 'ko')).toBe(fixed) + expect(fix(fixed, 'ko')).toBe(fixed) + }) + }) })