From 11e89fb9c97182b1e8c444390ef056345168c69c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=90o=C3=A0n=20Tr=E1=BA=A7n=20C=C3=B4ng=20Danh?= Date: Wed, 22 Apr 2020 20:59:26 +0700 Subject: [PATCH 1/4] xbps-src: use $XBPS_GIT_CMD for git --- common/environment/setup/git.sh | 18 ++++++++---------- .../hooks/post-install/05-generate-gitrevs.sh | 12 ++++-------- xbps-src | 5 ++--- 3 files changed, 14 insertions(+), 21 deletions(-) diff --git a/common/environment/setup/git.sh b/common/environment/setup/git.sh index 870fa984e05..a2f7f0a28ee 100644 --- a/common/environment/setup/git.sh +++ b/common/environment/setup/git.sh @@ -1,19 +1,17 @@ # If XBPS_USE_BUILD_MTIME is enabled in conf file don't continue. # only run this, if SOURCE_DATE_EPOCH isn't set. + +if [ -z "$XBPS_GIT_CMD" ]; then + msg_error "BUG: environment/setup: XBPS_GIT_CMD is not set\n" +fi + if [ -n "$XBPS_USE_BUILD_MTIME" ]; then unset SOURCE_DATE_EPOCH - return 0 -fi -if [ -z "${SOURCE_DATE_EPOCH}" -a -n "$IN_CHROOT" ]; then - if command -v chroot-git &>/dev/null; then - GIT_CMD=$(command -v chroot-git) - elif command -v git &>/dev/null; then - GIT_CMD=$(command -v git) - fi +elif [ -z "${SOURCE_DATE_EPOCH}" -a -n "$IN_CHROOT" ]; then # check if the template is under version control: - if $GIT_CMD -C ${XBPS_SRCPKGDIR}/${basepkg} status -u normal --porcelain template | grep "^?? " &> /dev/null; then + if $XBPS_GIT_CMD -C ${XBPS_SRCPKGDIR}/${basepkg} status -u normal --porcelain template | grep "^?? " &> /dev/null; then export SOURCE_DATE_EPOCH="$(stat -c %Y ${XBPS_SRCPKGDIR}/${basepkg}/template)" else - export SOURCE_DATE_EPOCH="$($GIT_CMD -C ${XBPS_DISTDIR} log --pretty='%ct' -n1 HEAD)" + export SOURCE_DATE_EPOCH="$($XBPS_GIT_CMD -C ${XBPS_DISTDIR} log --pretty='%ct' -n1 HEAD)" fi fi diff --git a/common/hooks/post-install/05-generate-gitrevs.sh b/common/hooks/post-install/05-generate-gitrevs.sh index 82b2ab1a786..754ba8865b9 100644 --- a/common/hooks/post-install/05-generate-gitrevs.sh +++ b/common/hooks/post-install/05-generate-gitrevs.sh @@ -3,7 +3,7 @@ hook() { local GITREVS_FILE=${XBPS_STATEDIR}/gitrev - local GIT_CMD rev + local rev # If XBPS_USE_GIT_REVS is disabled in conf file don't continue. if [ -z $XBPS_USE_GIT_REVS ]; then @@ -14,16 +14,12 @@ hook() { return fi - if command -v chroot-git &>/dev/null; then - GIT_CMD=$(command -v chroot-git) - elif command -v git &>/dev/null; then - GIT_CMD=$(command -v git) - else - msg_error "$pkgver: cannot find chroot-git or git utility, exiting...\n" + if [ -z "$XBPS_GIT_CMD" ]; then + msg_error "BUG: post-install: XBPS_GIT_CMD is not set\n" fi cd $XBPS_SRCPKGDIR - rev="$($GIT_CMD rev-parse --short HEAD)" + rev="$($XBPS_GIT_CMD rev-parse --short HEAD)" echo "${sourcepkg}:${rev}" echo "${sourcepkg}:${rev}" > $GITREVS_FILE } diff --git a/xbps-src b/xbps-src index 888bc3c474a..5eeb3045e35 100755 --- a/xbps-src +++ b/xbps-src @@ -502,14 +502,13 @@ fi # Try using chroot-git then git from the host system if command -v chroot-git &>/dev/null; then - XBPS_GIT_CMD=$(command -v chroot-git) + export XBPS_GIT_CMD=$(command -v chroot-git) elif command -v git &>/dev/null; then - XBPS_GIT_CMD=$(command -v git) + export XBPS_GIT_CMD=$(command -v git) else echo "neither chroot-git or git are available in your system!" 1>&2 exit 1 fi -readonly XBPS_GIT_CMD if [ -n "$XBPS_HOSTDIR" ]; then export XBPS_REPOSITORY=$XBPS_HOSTDIR/binpkgs From 0b0d555edf7841ecce7a69a372958db5755e5399 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=90o=C3=A0n=20Tr=E1=BA=A7n=20C=C3=B4ng=20Danh?= Date: Mon, 20 Apr 2020 23:18:14 +0700 Subject: [PATCH 2/4] setup/git.sh: prefer git plumbing command MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-ls-files(1) is plumbing command, its output will never change regardless of configuration, version. git-status(1) output will be changed depends on configuration. At least, 986d4dbc7d (common/environment/setup/git.sh: ensure untracked files are checked., 2017-11-24) was added to address a different output on `status.showUntrackedFiles`. By doing this, also reduce a pipe, and a fork-exec. Technically, git-log(1) is also a porcelain, but I _think_ `%ct` is stable enough to stay there. If the day has come, that `git-log(1)` can be replaced with: git cat-file commit HEAD | sed -ne '/^committer/{s/.* \([0-9]*\) [-+][0-9][0-9][0-9][0-9]$/\1/p;q}' --- common/environment/setup/git.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/environment/setup/git.sh b/common/environment/setup/git.sh index a2f7f0a28ee..a7395ef53f3 100644 --- a/common/environment/setup/git.sh +++ b/common/environment/setup/git.sh @@ -9,7 +9,7 @@ if [ -n "$XBPS_USE_BUILD_MTIME" ]; then unset SOURCE_DATE_EPOCH elif [ -z "${SOURCE_DATE_EPOCH}" -a -n "$IN_CHROOT" ]; then # check if the template is under version control: - if $XBPS_GIT_CMD -C ${XBPS_SRCPKGDIR}/${basepkg} status -u normal --porcelain template | grep "^?? " &> /dev/null; then + if [ -z "$($XBPS_GIT_CMD -C ${XBPS_SRCPKGDIR}/${basepkg} ls-files template)" ]; then export SOURCE_DATE_EPOCH="$(stat -c %Y ${XBPS_SRCPKGDIR}/${basepkg}/template)" else export SOURCE_DATE_EPOCH="$($XBPS_GIT_CMD -C ${XBPS_DISTDIR} log --pretty='%ct' -n1 HEAD)" From 1162f735a5f32be7e9bece95c7fefa4fa316234d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=90o=C3=A0n=20Tr=E1=BA=A7n=20C=C3=B4ng=20Danh?= Date: Tue, 21 Apr 2020 00:14:49 +0700 Subject: [PATCH 3/4] setup: export SOURCE_DATE_EPOCH from outside of chroot git-worktree(1), and Git shared repository can use a plain text file named `.git` at the root of working tree, containing `gitdir: ` to point to the real directory that has repository. See: gitrepository-layout(5). But, that directory is usually inaccessible inside chroot. In order to support git-worktree(1) and Git shared repository, compute SOURCE_DATE_EPOCH from outside of chroot, and the chroot will carry it over to inside chroot. I've only tested again xbps-uunshare(1). --- common/environment/setup/git.sh | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/common/environment/setup/git.sh b/common/environment/setup/git.sh index a7395ef53f3..5f9b157a895 100644 --- a/common/environment/setup/git.sh +++ b/common/environment/setup/git.sh @@ -7,9 +7,12 @@ fi if [ -n "$XBPS_USE_BUILD_MTIME" ]; then unset SOURCE_DATE_EPOCH -elif [ -z "${SOURCE_DATE_EPOCH}" -a -n "$IN_CHROOT" ]; then +elif [ -z "${SOURCE_DATE_EPOCH}" ]; then + if [ -n "$IN_CHROOT" ]; then + msg_error "xbps-src's BUG: SOURCE_DATE_EPOCH is undefined\n" + fi # check if the template is under version control: - if [ -z "$($XBPS_GIT_CMD -C ${XBPS_SRCPKGDIR}/${basepkg} ls-files template)" ]; then + if [ -n "$basepkg" -a -z "$($XBPS_GIT_CMD -C ${XBPS_SRCPKGDIR}/${basepkg} ls-files template)" ]; then export SOURCE_DATE_EPOCH="$(stat -c %Y ${XBPS_SRCPKGDIR}/${basepkg}/template)" else export SOURCE_DATE_EPOCH="$($XBPS_GIT_CMD -C ${XBPS_DISTDIR} log --pretty='%ct' -n1 HEAD)" From 41306a3c59c922dd5174c8ec63423826755855c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=90o=C3=A0n=20Tr=E1=BA=A7n=20C=C3=B4ng=20Danh?= Date: Tue, 21 Apr 2020 22:52:38 +0700 Subject: [PATCH 4/4] setup: compute gitrev from outside of chroot Together with previous commit, `xbps-src` is able to support git-worktree and shared repository by now. --- common/environment/setup/git.sh | 12 ++++++++++++ common/hooks/post-install/05-generate-gitrevs.sh | 10 ++++------ common/xbps-src/shutils/chroot.sh | 1 + 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/common/environment/setup/git.sh b/common/environment/setup/git.sh index 5f9b157a895..13e5178ccff 100644 --- a/common/environment/setup/git.sh +++ b/common/environment/setup/git.sh @@ -18,3 +18,15 @@ elif [ -z "${SOURCE_DATE_EPOCH}" ]; then export SOURCE_DATE_EPOCH="$($XBPS_GIT_CMD -C ${XBPS_DISTDIR} log --pretty='%ct' -n1 HEAD)" fi fi + +# if XBPS_USE_GIT_REVS is enabled in conf file, +# compute XBPS_GIT_REVS to use in pkg hooks +if [ -z "$XBPS_USE_GIT_REVS" ]; then + unset XBPS_GIT_REVS +elif [ -z "$XBPS_GIT_REVS" ]; then + if [ -n "$IN_CHROOT" ]; then + msg_error "xbps-src's BUG: XBPS_GIT_REVS is undefined\n" + else + export XBPS_GIT_REVS="$($XBPS_GIT_CMD -C "${XBPS_DISTDIR}" rev-parse --verify --short HEAD)" + fi +fi diff --git a/common/hooks/post-install/05-generate-gitrevs.sh b/common/hooks/post-install/05-generate-gitrevs.sh index 754ba8865b9..c5a51f0d101 100644 --- a/common/hooks/post-install/05-generate-gitrevs.sh +++ b/common/hooks/post-install/05-generate-gitrevs.sh @@ -3,7 +3,6 @@ hook() { local GITREVS_FILE=${XBPS_STATEDIR}/gitrev - local rev # If XBPS_USE_GIT_REVS is disabled in conf file don't continue. if [ -z $XBPS_USE_GIT_REVS ]; then @@ -14,12 +13,11 @@ hook() { return fi - if [ -z "$XBPS_GIT_CMD" ]; then - msg_error "BUG: post-install: XBPS_GIT_CMD is not set\n" + if [ -z "$XBPS_GIT_REVS" ]; then + msg_error "BUG: XBPS_GIT_REVS is not set\n" fi cd $XBPS_SRCPKGDIR - rev="$($XBPS_GIT_CMD rev-parse --short HEAD)" - echo "${sourcepkg}:${rev}" - echo "${sourcepkg}:${rev}" > $GITREVS_FILE + echo "${sourcepkg}:${XBPS_GIT_REVS}" + echo "${sourcepkg}:${XBPS_GIT_REVS}" > $GITREVS_FILE } diff --git a/common/xbps-src/shutils/chroot.sh b/common/xbps-src/shutils/chroot.sh index 1298952fd40..436f8866cd4 100644 --- a/common/xbps-src/shutils/chroot.sh +++ b/common/xbps-src/shutils/chroot.sh @@ -175,6 +175,7 @@ chroot_handler() { ${HTTP_PROXY_AUTH:+HTTP_PROXY_AUTH="${HTTP_PROXY_AUTH}"} \ ${FTP_RETRIES:+FTP_RETRIES="${FTP_RETRIES}"} \ SOURCE_DATE_EPOCH="$SOURCE_DATE_EPOCH" \ + XBPS_GIT_REVS="$XBPS_GIT_REVS" \ XBPS_ALLOW_CHROOT_BREAKOUT="$XBPS_ALLOW_CHROOT_BREAKOUT" \ $XBPS_COMMONDIR/chroot-style/${XBPS_CHROOT_CMD:=uunshare}.sh \ $XBPS_MASTERDIR $XBPS_DISTDIR "$XBPS_HOSTDIR" "$XBPS_CHROOT_CMD_ARGS" \