From f3a4440d8032b5d8a1178aa765ae26152fc6c7e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Arsen=20Arsenovi=C4=87?= Date: Thu, 16 Apr 2026 12:49:45 +0200 Subject: [PATCH] Make is_revert stricter, to match GCCs changelog scripts Reverts like https://gcc.gnu.org/cgit/gcc/commit/?id=eec8da328cf1f91db302ab4cee803e269e68ad33 are let through by the hooks, but then lead to failures in the changelog generating script: https://inbox.sourceware.org/gccadmin/20260415001632.71DF64BA23C4@sourceware.org/ This check should prevent that. --- hooks/config.py | 1 + hooks/pre_commit_checks.py | 24 +++++ hooks/updates/commits.py | 19 +++- .../bare_repo_config | 0 .../git-repos.tar.bz2 | Bin 0 -> 44201 bytes .../GCC__stricter_revert_pattern/hooks_config | 95 ++++++++++++++++++ .../GCC__stricter_revert_pattern/run_test.py | 52 ++++++++++ 7 files changed, 186 insertions(+), 5 deletions(-) create mode 100644 testsuite/tests/GCC__stricter_revert_pattern/bare_repo_config create mode 100644 testsuite/tests/GCC__stricter_revert_pattern/git-repos.tar.bz2 create mode 100644 testsuite/tests/GCC__stricter_revert_pattern/hooks_config create mode 100644 testsuite/tests/GCC__stricter_revert_pattern/run_test.py diff --git a/hooks/config.py b/hooks/config.py index aafe0f94..85943472 100644 --- a/hooks/config.py +++ b/hooks/config.py @@ -93,6 +93,7 @@ "hooks.no-precommit-check": {"default": (), "type": tuple}, "hooks.no-rh-character-range-check": {"default": False, "type": bool}, "hooks.no-rh-style-checks": {"default": (), "type": tuple}, + "hooks.no-rh-near-revert-check": {"default": False, "type": bool}, "hooks.no-style-checks": {"default": (), "type": tuple}, "hooks.pre-receive-hook": {"default": None}, "hooks.post-receive-hook": {"default": None}, diff --git a/hooks/pre_commit_checks.py b/hooks/pre_commit_checks.py index 1fc39abd..8d976a9c 100644 --- a/hooks/pre_commit_checks.py +++ b/hooks/pre_commit_checks.py @@ -309,6 +309,29 @@ def check_missing_ticket_number(commit): ) +def reject_almost_reversions(commit): + """Raise InvalidUpdate if the commit's revlog contains "This reverts + commit" in it. + + The GCC ChangeLog scripts expect a line that contains that sentence to also + contain a reference to the commit being reverted. If this line is altered, + therefore, they will fail. + + PARAMETERS + commit: A CommitInfo object corresponding to the commit being checked. + """ + if git_config("hooks.no-rh-near-revert-check"): + return + + if "This reverts commit" in commit.raw_revlog: + raise InvalidUpdate( + "Commit %s looks like it was intended as a revert." % commit.rev, + "", + "When reverting, you should leave the 'This reverts commit'", + "line unaltered.", + ) + + def check_revision_history(commit): """Apply pre-commit checks to the commit's revision history. @@ -321,6 +344,7 @@ def check_revision_history(commit): return # Various checks on the revision history... + reject_almost_reversions(commit) ensure_iso_8859_15_only(commit) ensure_empty_line_after_subject(commit) reject_lines_too_long(commit) diff --git a/hooks/updates/commits.py b/hooks/updates/commits.py index 717cd836..d8c93590 100644 --- a/hooks/updates/commits.py +++ b/hooks/updates/commits.py @@ -4,6 +4,19 @@ from io_utils import safe_decode from updates.mailinglists import expanded_mailing_list from utils import debug +import re + + +_REVERT_COMMIT_RE = re.compile( + r"^This reverts commit (?P[0-9a-f]+)\.$", + re.M +) +"""A regex that matches the same revert lines as ``revert_regex`` does in +``contrib/gcc-changelog/git_commit.py``. + +Note that this regex is matched against an entire body of a commit rather than +each line in it, though. +""" class CommitInfo(object): @@ -235,11 +248,7 @@ def is_revert(self): revision log of such commits, hoping that a user is not deleting them afterwards. """ - if "This reverts commit" in self.raw_revlog: - return True - - # No recognizable pattern. Probably not a revert commit. - return False + return bool(_REVERT_COMMIT_RE.search(self.raw_revlog)); @classmethod def __all_files_from_commit_rev(cls, rev): diff --git a/testsuite/tests/GCC__stricter_revert_pattern/bare_repo_config b/testsuite/tests/GCC__stricter_revert_pattern/bare_repo_config new file mode 100644 index 00000000..e69de29b diff --git a/testsuite/tests/GCC__stricter_revert_pattern/git-repos.tar.bz2 b/testsuite/tests/GCC__stricter_revert_pattern/git-repos.tar.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..c058cede5f2467fb2590adf2bad5fc5e534a1b36 GIT binary patch literal 44201 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 literal 0 HcmV?d00001 diff --git a/testsuite/tests/GCC__stricter_revert_pattern/hooks_config b/testsuite/tests/GCC__stricter_revert_pattern/hooks_config new file mode 100644 index 00000000..11b37fed --- /dev/null +++ b/testsuite/tests/GCC__stricter_revert_pattern/hooks_config @@ -0,0 +1,95 @@ +[hooks] + from-domain = gcc.gnu.org + mailinglist = true + + # We do not want to force a maximum line length in commit + # revision logs, as they get in the way of copy-pasting + # debugging session, error messages, logs, etc. + max-rh-line-length = 0 + + # We allow a 0.5MiB email diff maximum. + max-email-diff-size = 524288 + + # Reject merge commits on a certain number of branches: + # - on master: We request that people rebase their changes + # before pushing instead (merge commits tend to confuse + # git newcomers). + # - on release: We apply the same policy to release branches + # as we have on master. + reject-merge-commits = refs/heads/master,refs/heads/trunk,refs/heads/releases/.* + + # The URL where we can inspect the commit, inserted in the commit + # notification email, and also copy sent to the file-commit-cmd. + commit-url = "https://gcc.gnu.org/g:%(rev)s" + + # This style checker does nothing at present. + # style-checker = /git/gcc.git/hooks-bin/style_checker + + # Send a copy to bugzilla if a commit has a PR number in it. + # The script is a wrapper around + # /sourceware/infra/bin/email-to-bugzilla. + # file-commit-cmd = "/git/gcc.git/hooks-bin/email-to-bugzilla-filtered" + + # Work around + # to allow larger merges. + max-commit-emails = 5000 + + # Allow deliberate merges to use the default commit message. + # Branches that do not allow merge commits are listed in + # reject-merge-commits. + disable-merge-commit-checks = true + + # Do not send emails for commits that are already in the + # repository being added to development branches or user or + # vendor branches (through merges or rebases). + email-new-commits-only = refs/heads/devel/.* + email-new-commits-only = refs/users/.* + email-new-commits-only = refs/vendors/.* + + # GCC-specific ref naming conventions for user and vendor + # branches. + branch-ref-namespace = refs/users/[^/]*/heads/.* + branch-ref-namespace = refs/vendors/[^/]*/heads/.* + + # GCC-specific ref naming conventions for user and vendor + # tags. + tag-ref-namespace = refs/users/[^/]*/tags/.* + tag-ref-namespace = refs/vendors/[^/]*/tags/.* + + # Branch deletion is disabled by default. + restrict-branch-deletion = true + + # Branch deletion is allowed for user and vendor branches. + allow-delete-branch = refs/users/[^/]*/heads/.* + allow-delete-branch = refs/vendors/[^/]*/heads/.* + + # Non-fast-forward updates are allowed in the user and vendor + # namespaces. + allow-non-fast-forward = refs/users/.* + allow-non-fast-forward = refs/vendors/.* + + # Message to give for rejected branch deletion. + rejected-branch-deletion-tip = Branch deletion is only allowed for user and vendor branches. If another branch was created by mistake, contact an administrator to delete it on the server with git update-ref. If a development branch is dead, also contact an administrator to move it under refs/dead/heads/ rather than deleting it. + + # Commit messages should not be restricted to ISO-8859-15. + no-rh-character-range-check = true + + # Custom checker script for each new commit of each ref being + # updated. This makes several checks on the commit message, + # including for ChangeLog formatting and contents. + # commit-extra-checker = /git/gcc.git/hooks-bin/commit_checker + + # Custom checker script for ref updates. This checks for + # branch naming conventions and not introducing new references + # to the git-svn history. + # update-hook = /git/gcc.git/hooks-bin/update_hook + + # Custom email formatter. This inserts GCC monotonically + # increasing commit ids in the commit emails. + # commit-email-formatter = /git/gcc.git/hooks-bin/commit_email_formatter + + # For GCC/Rust development that happens outside of GCC proper, + # , the Git commit messages + # don't always adhere to standard GCC style; see + # . + no-precommit-check = refs/heads/devel/rust/.* diff --git a/testsuite/tests/GCC__stricter_revert_pattern/run_test.py b/testsuite/tests/GCC__stricter_revert_pattern/run_test.py new file mode 100644 index 00000000..cdc8c69a --- /dev/null +++ b/testsuite/tests/GCC__stricter_revert_pattern/run_test.py @@ -0,0 +1,52 @@ +def test_push_bad_revert_commit(testcase): + """Try pushing trunk...""" + p = testcase.run("git push origin trunk".split()) + testcase.assertNotEqual(p.status, 0, p.image) + testcase.assertRunOutputEqual(p, """\ +remote: *** Commit df3a09266b6685060fb1e11268922b491e3e5cd8 looks like it was intended as a revert. +remote: *** +remote: *** When reverting, you should leave the 'This reverts commit' +remote: *** line unaltered. +remote: error: hook declined to update refs/heads/trunk +To ../bare/repo.git/ + ! [remote rejected] trunk -> trunk (hook declined) +error: failed to push some refs to '../bare/repo.git/' +""") + + +def test_push_good_revert_commit(testcase): + """Try pushing trunk...""" + p = testcase.run("git push origin trunk-good:trunk".split()) + testcase.assertEqual(p.status, 0, p.image) + testcase.assertRunOutputEqual(p, """\ +remote: DEBUG: Content-Type: text/plain; charset="utf-8" +remote: MIME-Version: 1.0 +remote: Content-Transfer-Encoding: quoted-printable +remote: From: Test Suite +remote: To: true +remote: Subject: [repo/trunk] Revert "rs6000: Disassemble opaque modes using subregs to allow optimizations" +remote: X-Act-Checkin: repo +remote: X-Git-Author: Surya Kumari Jangala +remote: X-Git-Refname: refs/heads/trunk +remote: X-Git-Oldrev: dc366d741ae38b1dfb105a67176c1de93cf1ed55 +remote: X-Git-Newrev: 12ec343fa812ffa793dd0f41ecb47d2d06109673 +remote: +remote: https://gcc.gnu.org/g:12ec343fa812ffa793dd0f41ecb47d2d06109673 +remote: +remote: commit 12ec343fa812ffa793dd0f41ecb47d2d06109673 +remote: Author: Surya Kumari Jangala +remote: Date: Sat Apr 11 12:19:45 2026 -0500 +remote: +remote: Revert "rs6000: Disassemble opaque modes using subregs to allow optimizations" +remote: +remote: This reverts commit 69a2c243dd2cf9f77150c0eb86dfbc0931876bc1. +remote: +remote: This will resolve the issue reported in PR124804. +remote: +remote: Diff: +remote: --- +remote: +remote: hooks/post-update: line 5: exec: git-update-server-info: not found +To ../bare/repo.git/ + dc366d7..12ec343 trunk-good -> trunk +""")