mail archive of the barebox mailing list
 help / color / mirror / Atom feed
From: Ahmad Fatoum <a.fatoum@pengutronix.de>
To: barebox@lists.infradead.org
Cc: Ahmad Fatoum <a.fatoum@pengutronix.de>,
	Jonas Rebmann <jre@pengutronix.de>
Subject: [PATCH] scripts: add helper for generating Origin-URL references
Date: Wed, 17 Dec 2025 11:35:46 +0100	[thread overview]
Message-ID: <20251217103547.4046898-1-a.fatoum@pengutronix.de> (raw)

To improve tracking where code originated from, e.g. when porting from
Linux or U-Boot, some recent commits have started using Origin-URL
comments. Add a script that can generate them.

Examples in Vim:

  # add into highlight URL pointing at specified file
  V:!git origin-url ../linux/lib/ucs2_string.c

  # as above, but consult buffer extension for comment style
  V:!git origin-url ../linux/lib/ucs2_string.c %

  # generate in snippet syntax
  V:!git origin-url -s ../linux/lib/ucs2_string.c

Cc: Jonas Rebmann <jre@pengutronix.de>
Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
---
I've been using this for my recent ports and I think it's generally
useful and helps with deciding on a common format.
---
 scripts/git-origin-url.sh | 94 +++++++++++++++++++++++++++++++++++++++
 1 file changed, 94 insertions(+)
 create mode 100755 scripts/git-origin-url.sh

diff --git a/scripts/git-origin-url.sh b/scripts/git-origin-url.sh
new file mode 100755
index 000000000000..d31008b1b761
--- /dev/null
+++ b/scripts/git-origin-url.sh
@@ -0,0 +1,94 @@
+#!/usr/bin/env bash
+# SPDX-License-Identifier: BSD-0-Clause
+
+set -euo pipefail
+
+declare -A repos=(
+    ["a3ffa97f40dc81f2d6b07ee964f2340fe0c1ba97"]="https://git.pengutronix.de/cgit/barebox"
+    ["1da177e4c3f41524e886b7f1b8a0c1fc7321cac2"]="https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git"
+    ["cc8ed39b240180b58810784f844e253263594ac3"]="https://git.busybox.net/busybox"
+    ["7e492d8258182e31c988bbf9917d4a3d41949d56"]="https://github.com/u-boot/u-boot"
+    ["afe1be4dbdf142513f6ac1d92e6a20bdc4b20c80"]="https://github.com/systemd/systemd"
+)
+
+err() { echo "error: $* " >&2; exit 1; }
+usage="Usage: $0 <path-to-file> [destination-file]"
+
+snippet=""
+while getopts "sh" opt; do
+    case "$opt" in
+        s)
+            snippet="Snippet-"
+            ;;
+        h)
+            echo "$usage"
+            exit 0
+            ;;
+        *)
+            err "$usage"
+            ;;
+	esac
+done
+
+shift $((OPTIND-1))
+
+if [ $# -ne 1 ] && [ $# -ne 2 ]; then
+    err "$usage"
+fi
+
+# Optional second argument to allow e.g. !git origin-url $remote_file % im vim
+# In cases where local file has different extension then the original
+dstbasename="$(basename ${2:-$1})"
+
+[ -e "$1" ] || err "File not found"
+
+filepath="$(realpath "$1")"
+
+repo_root="$(git -C "$(dirname "$filepath")" rev-parse --show-toplevel 2>/dev/null \
+    || err "Not inside a Git repository: $filepath")"
+
+rel_path="$(realpath --relative-to="$repo_root" "$filepath")"
+
+# newest commit that touched this file
+file_commit="$(git -C "$repo_root" log -n1 --format=%H -- "$rel_path")"
+
+origin_url=""
+
+# find which repo this file ultimately came from
+for commit in "${!repos[@]}"; do
+    if git -C "$repo_root" merge-base --is-ancestor "$commit" "$file_commit" 2>/dev/null; then
+        origin_url="${repos[$commit]}"
+        break
+    fi
+done
+
+[ -z "$origin_url" ] && err "No matching repo base found for file commit $file_commit"
+
+# output uses the newest file commit, not the origin commit
+if [[ $origin_url == https://github.com/* ]] ; then
+    tree_url="$origin_url/blob/$file_commit/$rel_path"
+else
+    # assume cgit as fallback
+    tree_url="$origin_url/tree/$rel_path?id=$file_commit"
+fi
+
+case "${dstbasename##*.}" in
+    h|S|imxcfg|y|l|lds)
+        comment_begin='/* '
+        comment_end=' */'
+        ;;
+    c|dts*)
+        comment_begin='// '
+        comment_end=''
+        ;;
+    *)
+        comment_begin='# '
+        comment_end=''
+        ;;
+esac
+
+comment() { echo "${comment_begin}${*}${comment_end}"; }
+
+[ -z "${snippet}" ] || comment "SPDX-SnippetBegin"
+comment "SPDX-${snippet}Comment: Origin-URL: ${tree_url}"
+[ -z "${snippet}" ] || comment "SPDX-SnippetEnd"
-- 
2.47.3




             reply	other threads:[~2025-12-17 10:36 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-12-17 10:35 Ahmad Fatoum [this message]
2025-12-17 10:59 ` Jonas Rebmann

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20251217103547.4046898-1-a.fatoum@pengutronix.de \
    --to=a.fatoum@pengutronix.de \
    --cc=barebox@lists.infradead.org \
    --cc=jre@pengutronix.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox