From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id od2EB581l2rP1hsAWB0awg (envelope-from ) for ; Tue, 01 Sep 2026 16:29:19 -0400 Authentication-Results: simark.ca; dkim=pass (1024-bit key; unprotected) header.d=suse.de header.i=@suse.de header.a=rsa-sha256 header.s=susede2_rsa header.b=WyAtciTK; dkim=pass header.d=suse.de header.i=@suse.de header.a=ed25519-sha256 header.s=susede2_ed25519 header.b=QuwuLG4B; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.a=rsa-sha256 header.s=susede2_rsa header.b=KCehBPxO; dkim=neutral header.d=suse.de header.i=@suse.de header.a=ed25519-sha256 header.s=susede2_ed25519 header.b=zavuQLyl; dkim-atps=neutral Received: by simark.ca (Postfix, from userid 112) id 185BA1E166; Tue, 01 Sep 2026 16:29:19 -0400 (EDT) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-25) on simark.ca X-Spam-Level: X-Spam-Status: No, score=-5.4 required=5.0 tests=ARC_SIGNED,ARC_VALID,BAYES_00, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,MAILING_LIST_MULTI, RCVD_IN_DNSWL_MED autolearn=ham autolearn_force=no version=4.0.1 Received: from vm01.sourceware.org (vm01.sourceware.org [IPv6:2620:52:6:3111::32]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature ECDSA (prime256v1) server-digest SHA256) (No client certificate requested) by simark.ca (Postfix) with ESMTPS id B6BDC1E033 for ; Tue, 01 Sep 2026 16:29:17 -0400 (EDT) Received: from vm01.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 672564BA79B0 for ; Tue, 1 Sep 2026 20:29:16 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 672564BA79B0 Authentication-Results: sourceware.org; dkim=pass (1024-bit key, unprotected) header.d=suse.de header.i=@suse.de header.a=rsa-sha256 header.s=susede2_rsa header.b=WyAtciTK; dkim=pass header.d=suse.de header.i=@suse.de header.a=ed25519-sha256 header.s=susede2_ed25519 header.b=QuwuLG4B; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.a=rsa-sha256 header.s=susede2_rsa header.b=KCehBPxO; dkim=neutral header.d=suse.de header.i=@suse.de header.a=ed25519-sha256 header.s=susede2_ed25519 header.b=zavuQLyl Received: from smtp-out1.suse.de (smtp-out1.suse.de [IPv6:2a07:de40:b251:101:10:150:64:1]) by sourceware.org (Postfix) with ESMTPS id CEB454BA2E22 for ; Tue, 1 Sep 2026 20:27:52 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org CEB454BA2E22 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=suse.de Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=suse.de ARC-Filter: OpenARC Filter v1.0.0 sourceware.org CEB454BA2E22 Authentication-Results: sourceware.org; arc=none smtp.remote-ip=2a07:de40:b251:101:10:150:64:1 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1788294473; cv=none; b=P5pykPdC1fMjrrBwA8zAYKdp/7Vgf9CLSX/Em5l5aJApdQZrgZFuCBwU3Q6u8KhZX8CZNSA2nWn0ezy6duTrYowGaI6iO6ADJjwpqe1+vM+VGVV4ZzLGD9+6qhA2OzJeDgRmixdZ8Ne18cpNtU7GYC6E+mdE1TYv0VBwCipOFls= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1788294473; c=relaxed/simple; bh=JNcqCAGAxKfu7iHLjIlvpvTfEQe7Df6zlCZhMZVAyyM=; h=DKIM-Signature:DKIM-Signature:DKIM-Signature:DKIM-Signature:From: To:Subject:Date:Message-ID:MIME-Version; b=NDj1fyYyWrPKdTLanjd7NscBkwtcY0MKgSoSp/D59Kc5V4KDURfKngKD0pJFyte8D17OpiGxJWYzu4E6cIfz/UcQfIZ+2pBHlR/I0Grlm2nNXkQoW23xCwR6DZYU+a3peNKXmXbrs/O0/br3j6MkfyPBSHZn7mLpuB6LNa1fDHY= ARC-Authentication-Results: i=1; sourceware.org; dkim=pass (1024-bit key, unprotected) header.d=suse.de header.i=@suse.de header.a=rsa-sha256 header.s=susede2_rsa header.b=WyAtciTK; dkim=pass header.d=suse.de header.i=@suse.de header.a=ed25519-sha256 header.s=susede2_ed25519 header.b=QuwuLG4B; dkim=pass (1024-bit key) header.d=suse.de header.i=@suse.de header.a=rsa-sha256 header.s=susede2_rsa header.b=KCehBPxO; dkim=neutral header.d=suse.de header.i=@suse.de header.a=ed25519-sha256 header.s=susede2_ed25519 header.b=zavuQLyl DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org CEB454BA2E22 Received: from imap1.dmz-prg2.suse.org (imap1.dmz-prg2.suse.org [IPv6:2a07:de40:b281:104:10:150:64:97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by smtp-out1.suse.de (Postfix) with ESMTPS id 54E61222F9 for ; Tue, 1 Sep 2026 20:27:43 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1788294467; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=L0EQ7+g3WrJ2PyWBJ4S1ZI5CnVQtk+bMcmM10o0s6Ek=; b=WyAtciTKOXjDJ3x9Lgtzr5+kHG0fU9Ifks4Wct+zVj/ufqQQzQM2ngRTLEDb0275LJeltI m/pEjV3Rq6WFR4ap9L4WQgiPkAOBhsK0PKPEPcRnisGBTvXqSkJWV50Hg1YKIHuaKq2jkZ kM1pwBeHiuOktdK1y3dWTd/HCR1yCtY= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1788294467; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=L0EQ7+g3WrJ2PyWBJ4S1ZI5CnVQtk+bMcmM10o0s6Ek=; b=QuwuLG4BJ02cz0+gnfEmwqNTRF1FYyW1LdYfTJtO4I5UZP/v4x8z5wbkfyidArDsvZtWJo JTY651nPHCsZqACw== Authentication-Results: smtp-out1.suse.de; dkim=pass header.d=suse.de header.s=susede2_rsa header.b=KCehBPxO; dkim=pass header.d=suse.de header.s=susede2_ed25519 header.b=zavuQLyl DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1788294463; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=L0EQ7+g3WrJ2PyWBJ4S1ZI5CnVQtk+bMcmM10o0s6Ek=; b=KCehBPxOQ5MrsLADt9bIctq1c9DmyLZCLmh7CYAZ/rvGntk7AsVecNGaozgXA/KeT8GqUA wG6EAVHtqXYTpc7d5ovNW3VuVEvhaiCPqRjoa89H+bE3B7sLBBxZb07wbAg8Mo3UbqLsQ3 sSJWDIZMCXOSGnHVACCeOiNig99whUI= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1788294463; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=L0EQ7+g3WrJ2PyWBJ4S1ZI5CnVQtk+bMcmM10o0s6Ek=; b=zavuQLyllPDGkXliQN6vcVcbOCJTSyT7bzW6Kt5K2WI+mB0VJYSeVmaN8dD3BDofSJYFn2 +MvYV/tTfrWeoLAA== Received: from imap1.dmz-prg2.suse.org (localhost [127.0.0.1]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by imap1.dmz-prg2.suse.org (Postfix) with ESMTPS id 23B1F136C7 for ; Tue, 1 Sep 2026 20:27:43 +0000 (UTC) Received: from dovecot-director2.suse.de ([2a07:de40:b281:106:10:150:64:167]) by imap1.dmz-prg2.suse.org with ESMTPSA id OJO1Bj81l2qzUgAAD6G6ig (envelope-from ) for ; Tue, 01 Sep 2026 20:27:43 +0000 From: Tom de Vries To: gdb-patches@sourceware.org Subject: [PATCH 2/2] [pre-commit] Add check-copies Date: Tue, 1 Sep 2026 22:27:42 +0200 Message-ID: <20260901202742.320498-3-tdevries@suse.de> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260901202742.320498-1-tdevries@suse.de> References: <20260901202742.320498-1-tdevries@suse.de> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Rspamd-Action: no action X-Rspamd-Server: rspamd2.dmz-prg2.suse.org X-Rspamd-Queue-Id: 54E61222F9 X-Spamd-Result: default: False [-3.01 / 50.00]; BAYES_HAM(-3.00)[100.00%]; MID_CONTAINS_FROM(1.00)[]; NEURAL_HAM_LONG(-1.00)[-1.000]; R_MISSING_CHARSET(0.50)[]; R_DKIM_ALLOW(-0.20)[suse.de:s=susede2_rsa,suse.de:s=susede2_ed25519]; NEURAL_HAM_SHORT(-0.20)[-0.999]; MIME_GOOD(-0.10)[text/plain]; MX_GOOD(-0.01)[]; TO_MATCH_ENVRCPT_ALL(0.00)[]; URIBL_BLOCKED(0.00)[suse.de:dkim,suse.de:mid,imap1.dmz-prg2.suse.org:rdns,imap1.dmz-prg2.suse.org:helo,sourceware.org:url]; RBL_SPAMHAUS_BLOCKED_OPENRESOLVER(0.00)[2a07:de40:b281:104:10:150:64:97:from]; RCPT_COUNT_ONE(0.00)[1]; ARC_NA(0.00)[]; DKIM_SIGNED(0.00)[suse.de:s=susede2_rsa,suse.de:s=susede2_ed25519]; DKIM_TRACE(0.00)[suse.de:+]; MIME_TRACE(0.00)[0:+]; RCVD_COUNT_TWO(0.00)[2]; FROM_EQ_ENVFROM(0.00)[]; FROM_HAS_DN(0.00)[]; RCVD_TLS_ALL(0.00)[]; TO_DN_NONE(0.00)[]; PREVIOUSLY_DELIVERED(0.00)[gdb-patches@sourceware.org]; DNSWL_BLOCKED(0.00)[2a07:de40:b281:104:10:150:64:97:from]; RCVD_VIA_SMTP_AUTH(0.00)[]; RECEIVED_SPAMHAUS_BLOCKED_OPENRESOLVER(0.00)[2a07:de40:b281:106:10:150:64:167:received]; DBL_BLOCKED_OPENRESOLVER(0.00)[imap1.dmz-prg2.suse.org:rdns, imap1.dmz-prg2.suse.org:helo, suse.de:dkim, suse.de:mid] X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gdb-patches-bounces~public-inbox=simark.ca@sourceware.org Instead of using symlinks we maintain identical files, which is error-prone [1]. Add pre-commit hook check-copies: ... $ pre-commit run check-copies --all-files -v check-copies............................................................Passed - hook id: check-copies - duration: 0.51s ... that checks that: - files that need to be copies are in fact copies, and - no other files are copies. I've excluded the testsuite from this check, to avoid having to handle: ... Accidental copies found: [ \ 'gdb/testsuite/config/arm-ice.exp', 'gdb/testsuite/config/bfin.exp', \ 'gdb/testsuite/config/cygmon.exp', 'gdb/testsuite/config/h8300.exp', \ 'gdb/testsuite/config/i386-bozo.exp'] Accidental copies found: [ \ 'gdb/testsuite/gdb.base/kill-detach-inferiors-cmd.c', \ 'gdb/testsuite/gdb.base/run-after-attach.c'] Accidental copies found: [ \ 'gdb/testsuite/gdb.rocm/addr-bp-gpu-no-deb-info.cpp', \ 'gdb/testsuite/gdb.rocm/break-kernel-no-debug-info.cpp'] ... [1] https://sourceware.org/pipermail/gdb-patches/2026-September/229897.html --- .pre-commit-config.yaml | 11 ++++++-- gdb/contrib/check-copies.py | 54 +++++++++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+), 2 deletions(-) create mode 100755 gdb/contrib/check-copies.py diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 34d2cba40b9..6d60f81c483 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -123,14 +123,14 @@ repos: entry: gdb/check-include-guards.py # All gdb header files, but not headers in the test suite. files: '^(gdb(support|server)?)/.*\.h$' - exclude: '.*/testsuite/.*' + exclude: &testsuite_files '.*/testsuite/.*' - id: &id1 check-gnu-style name: *id1 language: python additional_dependencies: ['termcolor', 'unidiff'] entry: gdb/contrib/check-gnu-style-pre-commit.sh files: '^(gdb(support|server)?)/.*\.(c|h|cc)$' - exclude: '.*/testsuite/.*' + exclude: *testsuite_files verbose: true - id: &id2 check-whitespace name: *id2 @@ -173,6 +173,13 @@ repos: args: [--config-check] additional_dependencies: ["pyyaml"] files: *pre_commit_config_file + - id: &id7 check-copies + name: *id7 + language: unsupported_script + entry: gdb/contrib/check-copies.py + files: *gdb_files + exclude: *testsuite_files + require_serial: true # Local Variables: # indent-tabs-mode: nil diff --git a/gdb/contrib/check-copies.py b/gdb/contrib/check-copies.py new file mode 100755 index 00000000000..11c226bb9d2 --- /dev/null +++ b/gdb/contrib/check-copies.py @@ -0,0 +1,54 @@ +#! /usr/bin/env python3 + +import subprocess +import sys +from itertools import chain + +# These files are required to be identical. +required_list = [ + ["gdb/.dir-locals.el", "gdbserver/.dir-locals.el", "gdbsupport/.dir-locals.el"], + ["gdb/.shellcheckrc", "gdbserver/.shellcheckrc", "gdbsupport/.shellcheckrc"], +] + + +def run_cmd(cmd, **kwargs): + res = subprocess.run(cmd, **kwargs) + if res.returncode != 0: + raise RuntimeError( + "command %s failed with exit status %s" % (cmd, res.returncode) + ) + return res + + +files = sys.argv[1:] +always_check_files = list(chain.from_iterable(required_list)) +cmd = ["git", "ls-files", "--stage"] + files + always_check_files +res = run_cmd(cmd, capture_output=True, text=True) + +hash_dict = {} +for line in res.stdout.splitlines(): + parts = line.split(maxsplit=3) + hash = parts[1] + file = parts[3] + hash_dict.setdefault(hash, []).append(file) + +copies = [] +for hash in hash_dict: + files = hash_dict[hash] + if len(files) == 1: + continue + copies.append(set(files)) + +required_set = [set(r) for r in required_list] + +for required in required_set: + if required in copies: + continue + print("No longer copies: %s" % required) + sys.exit(1) + +for copy in copies: + if copy in required_set: + continue + print("Accidental copies found: %s" % copy) + sys.exit(1) -- 2.51.0