From c276ac79f4257817203f72311ffb1386ab3ddb35 Mon Sep 17 00:00:00 2001 From: Thayne McCombs Date: Wed, 25 Mar 2026 01:44:41 -0600 Subject: [PATCH] build: Create archive script Move the code for creating the archive from the GHA yaml into a dedicated script file. --- .github/workflows/CICD.yml | 40 +++-------------------- .gitignore | 1 + Makefile | 14 +++++++- scripts/create-archive.sh | 67 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 85 insertions(+), 37 deletions(-) create mode 100755 scripts/create-archive.sh diff --git a/.github/workflows/CICD.yml b/.github/workflows/CICD.yml index f656463b..80f2a468 100644 --- a/.github/workflows/CICD.yml +++ b/.github/workflows/CICD.yml @@ -205,44 +205,12 @@ jobs: - name: Create tarball id: package shell: bash + run: bash scripts/create-archive.sh env: BIN_PATH: ${{ steps.bin.outputs.BIN_PATH }} - version: ${{ needs.crate_metadata.outputs.version }} - run: | - PKG_suffix=".tar.gz" - case ${target} in - *-pc-windows-*) PKG_suffix=".zip" ;; - esac - PKG_BASENAME=${name}-v${version}-${target} - PKG_NAME=${PKG_BASENAME}${PKG_suffix} - echo "PKG_NAME=${PKG_NAME}" >> $GITHUB_OUTPUT - - PKG_STAGING="${CICD_INTERMEDIATES_DIR}/package" - ARCHIVE_DIR="${PKG_STAGING}/${PKG_BASENAME}/" - mkdir -p "${ARCHIVE_DIR}" - - # Binary - cp "${BIN_PATH}" "$ARCHIVE_DIR" - - # README, LICENSE and CHANGELOG files - cp "README.md" "LICENSE-MIT" "LICENSE-APACHE" "CHANGELOG.md" "$ARCHIVE_DIR" - - # Man page - cp "doc/${name}.1" "$ARCHIVE_DIR" - - # Autocompletion files - cp -r autocomplete "${ARCHIVE_DIR}" - - # base compressed package - pushd "${PKG_STAGING}/" >/dev/null - case ${target} in - *-pc-windows-*) 7z -y a "${PKG_NAME}" "${PKG_BASENAME}"/* | tail -2 ;; - *) tar czf "${PKG_NAME}" "${PKG_BASENAME}"/* ;; - esac; - popd >/dev/null - - # Let subsequent steps know where to find the compressed package - echo "PKG_PATH=${PKG_STAGING}/${PKG_NAME}" >> $GITHUB_OUTPUT + TARGET: ${{ env.target }} + ARCHIVE_NAME: ${{ env.name }}-v${{ needs.crate_metadata.outputs.version }}-${{ env.target }} + PKG_STAGING: "${{ env.CICD_INTERMEDIATES_DIR }}/package" - name: Create Debian package id: debian-package diff --git a/.gitignore b/.gitignore index fddac437..90c7e46b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ target/ /autocomplete/ +/package/ **/*.rs.bk diff --git a/Makefile b/Makefile index a505740f..78ab0a99 100644 --- a/Makefile +++ b/Makefile @@ -1,9 +1,16 @@ -PROFILE=release +PROFILE?=release EXE=target/$(PROFILE)/fd prefix=/usr/local bindir=$(prefix)/bin datadir=$(prefix)/share exe_name=fd +ifdef VERSION + ARCHIVE_NAME = fd-v$(VERSION) +else + ARCHIVE_NAME = fd +endif +export ARCHIVE_NAME +archive_path=package/$(ARCHIVE_NAME).tar.gz $(EXE): Cargo.toml src/**/*.rs cargo build --profile $(PROFILE) --locked @@ -41,6 +48,11 @@ autocomplete/fdfind.fish: contrib/completion/fdfind.fish $(comp_dir) cp $< $@ +archive: $(archive_path) + +$(archive_path): completions $(EXE) + bash scripts/create-archive.sh + install: $(EXE) completions install -Dm755 $(EXE) $(DESTDIR)$(bindir)/fd install -Dm644 autocomplete/fd.bash $(DESTDIR)/$(datadir)/bash-completion/completions/$(exe_name) diff --git a/scripts/create-archive.sh b/scripts/create-archive.sh new file mode 100755 index 00000000..ad0823a9 --- /dev/null +++ b/scripts/create-archive.sh @@ -0,0 +1,67 @@ +#!/bin/bash +# +# Create a .tar.gz archive of the fd project for distribution +# +# Expected environment variables: +# +# TARGET: rust target to publish. Defaults to default rustc target +# BIN_PATH: path to fd binary +# PKG_STAGING: directory to use for staging files to include in the archive +# ARCHIVE_NAME: Name of output file, minus extension, defaults to "fd" with a version appended +# if VERSION is specified +# VERSION: version to publish +# GITHUB_OUTPUT: file to store github output variables in + +if [[ -z "$TARGET" ]]; then + TARGET="$(rustc -vV | sed -n 's/host: //p')" +fi + +PKG_suffix=".tar.gz" +EXE_suffix="" +case ${TARGET} in +*-pc-windows-*) + PKG_suffix=".zip" + EXE_suffix=".exe" + ;; +esac + +if [[ -z $BIN_PATH ]]; then + BIN_PATH=target/${PROFILE:-release}/fd +fi + +if [[ -z "$ARCHIVE_NAME" ]]; then + ARCHIVE_NAME=fd + [[ -n "$VERSION" ]] && ARCHIVE_NAME+="-v$VERSION" +fi + +PKG_NAME=${ARCHIVE_NAME}${PKG_suffix} + +staging_dir="${PKG_STAGING:-package}" +ARCHIVE_DIR="${staging_dir}/${ARCHIVE_NAME}/" +mkdir -p "${ARCHIVE_DIR}" + +# Binary +cp "${BIN_PATH}" "$ARCHIVE_DIR" + +# README, LICENSE and CHANGELOG files +cp "README.md" "LICENSE-MIT" "LICENSE-APACHE" "CHANGELOG.md" "$ARCHIVE_DIR" + +# Man page +cp "doc/fd.1" "$ARCHIVE_DIR" + +# Autocompletion files +cp -r autocomplete "${ARCHIVE_DIR}" + +# base compressed package +pushd "${staging_dir}/" >/dev/null +case ${TARGET} in +*-pc-windows-*) 7z -y a "${PKG_NAME}" "${ARCHIVE_NAME}"/* | tail -2 ;; +*) tar czf "${PKG_NAME}" "${ARCHIVE_NAME}"/* ;; +esac; +popd >/dev/null + +if [[ -n "$GITHUB_OUTPUT" ]]; then + echo "PKG_NAME=${PKG_NAME}" >> $GITHUB_OUTPUT + # Let subsequent steps know where to find the compressed package + echo "PKG_PATH=${PKG_STAGING}/${PKG_NAME}" >> $GITHUB_OUTPUT +fi