* [PATCH v2] scripts: add helper for generating Origin-URL references
@ 2025-12-18 15:18 Ahmad Fatoum
0 siblings, 0 replies; only message in thread
From: Ahmad Fatoum @ 2025-12-18 15:18 UTC (permalink / raw)
To: barebox; +Cc: Ahmad Fatoum, Jonas Rebmann
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 with the assumption that
the origin project is checked out at exactly the version the code was
copied from.
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
This is mostly useful for new code that's being ported. It does have no
support to find out similarity between the files specified.
Cc: Jonas Rebmann <jre@pengutronix.de>
Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
---
v1 -> v2:
- mention that this is meant for new code in commit and usage message
(Jonas)
- add comment explaining included hashes (Jonas)
---
scripts/git-origin-url.sh | 99 +++++++++++++++++++++++++++++++++++++++
1 file changed, 99 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..3aa15561c474
--- /dev/null
+++ b/scripts/git-origin-url.sh
@@ -0,0 +1,99 @@
+#!/usr/bin/env bash
+# SPDX-License-Identifier: BSD-0-Clause
+
+set -euo pipefail
+
+# Some very early hashes to identify the projects by
+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 [-s] <path-to-remote-file> [local-file]
+
+Generate an Origin-URL comment from a remote file with the assumption
+that it is in a git repository checked out at the correct version
+from which the code in question was originally copied."
+
+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
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2025-12-18 15:18 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-12-18 15:18 [PATCH v2] scripts: add helper for generating Origin-URL references Ahmad Fatoum
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox