feat(i18n): Branch protection improvements

- adds a header to indicate creating a new rule
  - test that header is different between new and edit form
- consistently avoids colons in the form
- excludes some accessibility checks that require a global solution for
  forms
This commit is contained in:
Otto Richter 2024-08-18 00:33:50 +02:00
parent 3bbd129270
commit 00276dfc30
4 changed files with 40 additions and 13 deletions

View file

@ -2468,6 +2468,7 @@ settings.protected_branch = Branch protection
settings.protected_branch.save_rule = Save rule settings.protected_branch.save_rule = Save rule
settings.protected_branch.delete_rule = Delete rule settings.protected_branch.delete_rule = Delete rule
settings.branch_protection = Protection rules for branch "<b>%s</b>" settings.branch_protection = Protection rules for branch "<b>%s</b>"
settings.protect_new_rule = Create a new branch protection rule
settings.protect_this_branch = Enable branch protection settings.protect_this_branch = Enable branch protection
settings.protect_this_branch_desc = Prevents deletion and restricts Git pushing and merging to the branch. settings.protect_this_branch_desc = Prevents deletion and restricts Git pushing and merging to the branch.
settings.protect_disable_push = Disable push settings.protect_disable_push = Disable push
@ -2479,26 +2480,26 @@ settings.protect_enable_merge_desc = Anyone with write access will be allowed to
settings.protect_whitelist_committers = Whitelist restricted push settings.protect_whitelist_committers = Whitelist restricted push
settings.protect_whitelist_committers_desc = Only whitelisted users or teams will be allowed to push to this branch (but not force push). settings.protect_whitelist_committers_desc = Only whitelisted users or teams will be allowed to push to this branch (but not force push).
settings.protect_whitelist_deploy_keys = Whitelist deploy keys with write access to push. settings.protect_whitelist_deploy_keys = Whitelist deploy keys with write access to push.
settings.protect_whitelist_users = Whitelisted users for pushing: settings.protect_whitelist_users = Whitelisted users for pushing
settings.protect_whitelist_teams = Whitelisted teams for pushing: settings.protect_whitelist_teams = Whitelisted teams for pushing
settings.protect_merge_whitelist_committers = Enable merge whitelist settings.protect_merge_whitelist_committers = Enable merge whitelist
settings.protect_merge_whitelist_committers_desc = Allow only whitelisted users or teams to merge pull requests into this branch. settings.protect_merge_whitelist_committers_desc = Allow only whitelisted users or teams to merge pull requests into this branch.
settings.protect_merge_whitelist_users = Whitelisted users for merging: settings.protect_merge_whitelist_users = Whitelisted users for merging
settings.protect_merge_whitelist_teams = Whitelisted teams for merging: settings.protect_merge_whitelist_teams = Whitelisted teams for merging
settings.protect_check_status_contexts = Enable status check settings.protect_check_status_contexts = Enable status check
settings.protect_status_check_patterns = Status check patterns: settings.protect_status_check_patterns = Status check patterns
settings.protect_status_check_patterns_desc = Enter patterns to specify which status checks must pass before branches can be merged into a branch that matches this rule. Each line specifies a pattern. Patterns cannot be empty. settings.protect_status_check_patterns_desc = Enter patterns to specify which status checks must pass before branches can be merged into a branch that matches this rule. Each line specifies a pattern. Patterns cannot be empty.
settings.protect_check_status_contexts_desc = Require status checks to pass before merging. When enabled, commits must first be pushed to another branch, then merged or pushed directly to a branch that matches this rule after status checks have passed. If no contexts are matched, the last commit must be successful regardless of context. settings.protect_check_status_contexts_desc = Require status checks to pass before merging. When enabled, commits must first be pushed to another branch, then merged or pushed directly to a branch that matches this rule after status checks have passed. If no contexts are matched, the last commit must be successful regardless of context.
settings.protect_check_status_contexts_list = Status checks found in the last week for this repository settings.protect_check_status_contexts_list = Status checks found in the last week for this repository
settings.protect_status_check_matched = Matched settings.protect_status_check_matched = Matched
settings.protect_invalid_status_check_pattern = Invalid status check pattern: "%s". settings.protect_invalid_status_check_pattern = Invalid status check pattern: "%s".
settings.protect_no_valid_status_check_patterns = No valid status check patterns. settings.protect_no_valid_status_check_patterns = No valid status check patterns.
settings.protect_required_approvals = Required approvals: settings.protect_required_approvals = Required approvals
settings.protect_required_approvals_desc = Allow only to merge pull request with enough positive reviews. settings.protect_required_approvals_desc = Allow only to merge pull request with enough positive reviews.
settings.protect_approvals_whitelist_enabled = Restrict approvals to whitelisted users or teams settings.protect_approvals_whitelist_enabled = Restrict approvals to whitelisted users or teams
settings.protect_approvals_whitelist_enabled_desc = Only reviews from whitelisted users or teams will count to the required approvals. Without approval whitelist, reviews from anyone with write access count to the required approvals. settings.protect_approvals_whitelist_enabled_desc = Only reviews from whitelisted users or teams will count to the required approvals. Without approval whitelist, reviews from anyone with write access count to the required approvals.
settings.protect_approvals_whitelist_users = Whitelisted reviewers: settings.protect_approvals_whitelist_users = Whitelisted reviewers
settings.protect_approvals_whitelist_teams = Whitelisted teams for reviews: settings.protect_approvals_whitelist_teams = Whitelisted teams for reviews
settings.dismiss_stale_approvals = Dismiss stale approvals settings.dismiss_stale_approvals = Dismiss stale approvals
settings.dismiss_stale_approvals_desc = When new commits that change the content of the pull request are pushed to the branch, old approvals will be dismissed. settings.dismiss_stale_approvals_desc = When new commits that change the content of the pull request are pushed to the branch, old approvals will be dismissed.
settings.ignore_stale_approvals = Ignore stale approvals settings.ignore_stale_approvals = Ignore stale approvals
@ -2508,9 +2509,9 @@ settings.require_signed_commits_desc = Reject pushes to this branch if they are
settings.protect_branch_name_pattern = Protected branch name pattern settings.protect_branch_name_pattern = Protected branch name pattern
settings.protect_branch_name_pattern_desc = Protected branch name patterns. See <a href="https://github.com/gobwas/glob">the documentation</a> for pattern syntax. Examples: main, release/** settings.protect_branch_name_pattern_desc = Protected branch name patterns. See <a href="https://github.com/gobwas/glob">the documentation</a> for pattern syntax. Examples: main, release/**
settings.protect_patterns = Patterns settings.protect_patterns = Patterns
settings.protect_protected_file_patterns = Protected file patterns (separated using semicolon ";"): settings.protect_protected_file_patterns = Protected file patterns (separated using semicolon ";")
settings.protect_protected_file_patterns_desc = Protected files are not allowed to be changed directly even if user has rights to add, edit, or delete files in this branch. Multiple patterns can be separated using semicolon (";"). See <a href="https://pkg.go.dev/github.com/gobwas/glob#Compile">github.com/gobwas/glob</a> documentation for pattern syntax. Examples: <code>.drone.yml</code>, <code>/docs/**/*.txt</code>. settings.protect_protected_file_patterns_desc = Protected files are not allowed to be changed directly even if user has rights to add, edit, or delete files in this branch. Multiple patterns can be separated using semicolon (";"). See <a href="https://pkg.go.dev/github.com/gobwas/glob#Compile">github.com/gobwas/glob</a> documentation for pattern syntax. Examples: <code>.drone.yml</code>, <code>/docs/**/*.txt</code>.
settings.protect_unprotected_file_patterns = Unprotected file patterns (separated using semicolon ";"): settings.protect_unprotected_file_patterns = Unprotected file patterns (separated using semicolon ";")
settings.protect_unprotected_file_patterns_desc = Unprotected files that are allowed to be changed directly if user has write access, bypassing push restriction. Multiple patterns can be separated using semicolon (";"). See <a href="https://pkg.go.dev/github.com/gobwas/glob#Compile">github.com/gobwas/glob</a> documentation for pattern syntax. Examples: <code>.drone.yml</code>, <code>/docs/**/*.txt</code>. settings.protect_unprotected_file_patterns_desc = Unprotected files that are allowed to be changed directly if user has write access, bypassing push restriction. Multiple patterns can be separated using semicolon (";"). See <a href="https://pkg.go.dev/github.com/gobwas/glob#Compile">github.com/gobwas/glob</a> documentation for pattern syntax. Examples: <code>.drone.yml</code>, <code>/docs/**/*.txt</code>.
settings.add_protected_branch = Enable protection settings.add_protected_branch = Enable protection
settings.delete_protected_branch = Disable protection settings.delete_protected_branch = Disable protection

View file

@ -1,7 +1,11 @@
{{template "repo/settings/layout_head" (dict "ctxData" . "pageClass" "repository settings branches")}} {{template "repo/settings/layout_head" (dict "ctxData" . "pageClass" "repository settings branches")}}
<div class="repo-setting-content"> <div class="repo-setting-content">
<h4 class="ui top attached header"> <h4 class="ui top attached header">
{{if .Rule.RuleName}}
{{ctx.Locale.Tr "repo.settings.branch_protection" .Rule.RuleName}} {{ctx.Locale.Tr "repo.settings.branch_protection" .Rule.RuleName}}
{{else}}
{{ctx.Locale.Tr "repo.settings.protect_new_rule"}}
{{end}}
</h4> </h4>
<form class="ui form attached segment" action="{{.Link}}" method="post"> <form class="ui form attached segment" action="{{.Link}}" method="post">
{{.CsrfTokenHtml}} {{.CsrfTokenHtml}}

View file

@ -31,6 +31,18 @@ test('repo branch protection settings', async ({browser}, workerInfo) => {
const response = await page.goto('/user2/repo1/settings/branches/edit'); const response = await page.goto('/user2/repo1/settings/branches/edit');
await expect(response?.status()).toBe(200); await expect(response?.status()).toBe(200);
// not yet accessible :( await validate_form({page}, 'fieldset');
// await validate_form({page}, 'fieldset');
// verify header is new
await expect(page.locator('h4')).toContainText('new');
await page.locator('input[name="rule_name"]').fill('testrule');
await page.getByText('Save rule').click();
// verify header is in edit mode
await page.waitForLoadState('networkidle');
await page.getByText('Edit').click();
await expect(page.locator('h4')).toContainText('Protection rules for branch');
// delete the rule for the next test
await page.goBack();
await page.getByText('Delete rule').click();
await page.getByText('Yes').click();
}); });

View file

@ -4,9 +4,13 @@ import AxeBuilder from '@axe-core/playwright';
export async function validate_form({page}, scope) { export async function validate_form({page}, scope) {
scope ??= 'form'; scope ??= 'form';
const accessibilityScanResults = await new AxeBuilder({page}) const accessibilityScanResults = await new AxeBuilder({page})
// disable checking for link style - should be fixed, but not now
.disableRules('link-in-text-block')
.include(scope) .include(scope)
// exclude automated tooltips from accessibility scan, remove when fixed // exclude automated tooltips from accessibility scan, remove when fixed
.exclude('span[data-tooltip-content') .exclude('span[data-tooltip-content')
// exclude weird non-semantic HTML disabled content
.exclude('.disabled')
.analyze(); .analyze();
expect(accessibilityScanResults.violations).toEqual([]); expect(accessibilityScanResults.violations).toEqual([]);
@ -17,4 +21,10 @@ export async function validate_form({page}, scope) {
await expect(b).toHaveCSS('margin-top', '0px'); await expect(b).toHaveCSS('margin-top', '0px');
await expect(b).toHaveCSS('vertical-align', 'baseline'); await expect(b).toHaveCSS('vertical-align', 'baseline');
} }
// assert no (trailing) colon is used in labels
// might be necessary to adjust in case colons are strictly necessary in help text
for (const l of await page.locator('label').all()) {
const str = await l.textContent();
await expect(str.split('\n')[0]).not.toContain(':');
}
} }