diff mbox series

[2/3] scripts: Add root dir to arguments

Message ID 20250408-jag-sysctl-v1-2-3f4f38b751be@kernel.org (mailing list archive)
State New
Headers show
Series scripts: Add a root dir in archve-source.sh | expand

Commit Message

Joel Granados April 8, 2025, 8:14 p.m. UTC
The archive-source script appended everything directly on the tar root
making it unusable for creating nix overlays; nix expects all files to
be under a directory in the tarbal.

Add a "-d|--dir" argument that places all files under a custom root.
Behaviour is unchanged when the argument is not given.

Signed-off-by: Joel Granados <joel.granados@kernel.org>
---
 scripts/archive-source.sh | 78 ++++++++++++++++++++++++++++++++++++++---------
 1 file changed, 63 insertions(+), 15 deletions(-)
diff mbox series

Patch

diff --git a/scripts/archive-source.sh b/scripts/archive-source.sh
index a469a5e2dec4b05e51474f0a1af190c1ccf23c7e..7143aaefc1133fe991b329df3c78e6ed7726322f 100755
--- a/scripts/archive-source.sh
+++ b/scripts/archive-source.sh
@@ -9,19 +9,6 @@ 
 # This code is licensed under the GPL version 2 or later.  See
 # the COPYING file in the top-level directory.
 
-error() {
-    printf %s\\n "$*" >&2
-    exit 1
-}
-
-if test $# -lt 1; then
-    error "Usage: $0 <output tarball>"
-fi
-
-tar_file=$(realpath "$1")
-sub_tdir=$(mktemp -d "${tar_file%.tar}.sub.XXXXXXXX")
-sub_file="${sub_tdir}/submodule.tar"
-
 # We want a predictable list of submodules for builds, that is
 # independent of what the developer currently has initialized
 # in their checkout, because the build environment is completely
@@ -32,6 +19,61 @@  subprojects="keycodemapdb libvfio-user berkeley-softfloat-3
   proc-macro-error-1-rs proc-macro-error-attr-1-rs quote-1-rs
   syn-2-rs unicode-ident-1-rs"
 sub_deinit=""
+git_archive_prefix=""
+tar_transform=""
+
+BASENAME="$(basename "${BASH_SOURCE[0]}")"
+USAGE="Usage: ${BASENAME} [OPTIONS] <tarball>
+  <tarball>             Resulting tarball name
+
+  OPTIONS:
+    -d, --dir <DIR>     Files will be placed into DIR inside the tarball
+"
+
+error() {
+    printf %s\\n "$*" >&2
+    exit 1
+}
+
+get_opts() {
+    local short="d:"
+    local long="dir:"
+
+    if ! tmp=$(getopt -o "$short" --long "$long" -n "$BASENAME" -- "$@"); then
+        exit 1
+    fi
+    eval set -- "$tmp"
+    unset tmp
+
+    while true; do
+      case "$1" in
+        '-d' | '--dir' )
+            local tar_dir_name=$"$2/"; shift 2
+            git_archive_prefix="--prefix ${tar_dir_name}"
+            tar_transform="--transform=s|^|${tar_dir_name}|"
+            ;;
+
+        '--' )
+            shift 1
+            ;;
+
+        * )
+            tar_file_name="$1"; shift
+            break
+            ;;
+
+      esac
+    done
+
+    if [ $# -gt 0 ]; then
+        echo "Superfluous args: $@"
+        error "${USAGE}"
+    fi
+
+    tar_file=$(realpath "$tar_file_name")
+    sub_tdir=$(mktemp -d "${tar_file%.tar}.sub.XXXXXXXX")
+    sub_file="${sub_tdir}/submodule.tar"
+}
 
 function cleanup() {
     local status=$?
@@ -73,13 +115,19 @@  function subproject_dir() {
     echo "${dir:-$1}"
 }
 
-git archive --format tar "$(tree_ish)" > "$tar_file"
+get_opts "$@"
+
+git archive --format tar ${git_archive_prefix} "$(tree_ish)" > "$tar_file"
 test $? -ne 0 && error "failed to archive qemu"
 
 for sp in $subprojects; do
     meson subprojects download $sp
     test $? -ne 0 && error "failed to download subproject $sp"
-    tar --append --file "$tar_file" --exclude=.git subprojects/"$(subproject_dir $sp)"
+    tar --append \
+        --file "$tar_file" \
+        --exclude=.git \
+        ${tar_transform} \
+        subprojects/"$(subproject_dir $sp)"
     test $? -ne 0 && error "failed to append subproject $sp to $tar_file"
 done
 exit 0