From 90d81277864ce74f0e2340b0c24d6e61de605a96 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 1/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 870fa984e05..253a423fe6c 100644 --- a/common/environment/setup/git.sh +++ b/common/environment/setup/git.sh @@ -11,7 +11,7 @@ if [ -z "${SOURCE_DATE_EPOCH}" -a -n "$IN_CHROOT" ]; then GIT_CMD=$(command -v git) fi # 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 [ -z "$($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="$($GIT_CMD -C ${XBPS_DISTDIR} log --pretty='%ct' -n1 HEAD)" From 8a195001732443eb859dd1db6be91ff8c632e2f9 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:02:29 +0700 Subject: [PATCH 2/4] fixup??! setup/git.sh: prefer git plumbing command Technically, git-log(1) is also a porcelain, but I _think_ `%ct` is stable enough to stay there. If we chose to switch to all plumbing command, squash this change to previous change and update the commit message there. If we prefer to use git-log(1) instead, just drop this one. --- common/environment/setup/git.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/common/environment/setup/git.sh b/common/environment/setup/git.sh index 253a423fe6c..f9b0c058c4a 100644 --- a/common/environment/setup/git.sh +++ b/common/environment/setup/git.sh @@ -14,6 +14,7 @@ if [ -z "${SOURCE_DATE_EPOCH}" -a -n "$IN_CHROOT" ]; then if [ -z "$($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="$($GIT_CMD -C ${XBPS_DISTDIR} log --pretty='%ct' -n1 HEAD)" + export SOURCE_DATE_EPOCH="$($GIT_CMD -C ${XBPS_DISTDIR} cat-file commit HEAD | + sed -ne '/^committer/{s/.* \([0-9]\+\) [-+][0-9][0-9][0-9][0-9]$/\1/p;q}')" fi fi From 5db66db4498289aa84b4bfad019034f7006d7f9d 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 | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/common/environment/setup/git.sh b/common/environment/setup/git.sh index f9b0c058c4a..7372de1fed0 100644 --- a/common/environment/setup/git.sh +++ b/common/environment/setup/git.sh @@ -2,19 +2,16 @@ # only run this, if SOURCE_DATE_EPOCH isn't set. 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}" ]; then + if [ -n "$IN_CHROOT" ]; then + msg_error "xbps-src's BUG: SOURCE_DATE_EPOCH is undefined\n" + elif ! command -v git &>/dev/null; then + msg_error "command not found: git\n" # check if the template is under version control: - if [ -z "$($GIT_CMD -C ${XBPS_SRCPKGDIR}/${basepkg} ls-files template)" ]; then + elif [ -z "$(git -C ${XBPS_SRCPKGDIR}/${basepkg} ls-files template)" ]; then export SOURCE_DATE_EPOCH="$(stat -c %Y ${XBPS_SRCPKGDIR}/${basepkg}/template)" else - export SOURCE_DATE_EPOCH="$($GIT_CMD -C ${XBPS_DISTDIR} cat-file commit HEAD | + export SOURCE_DATE_EPOCH="$(git -C ${XBPS_DISTDIR} cat-file commit HEAD | sed -ne '/^committer/{s/.* \([0-9]\+\) [-+][0-9][0-9][0-9][0-9]$/\1/p;q}')" fi fi From c1c995094da67c7fb6a0130d74386eed7e8865b0 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 | 14 ++++++++++++++ common/hooks/post-install/05-generate-gitrevs.sh | 14 ++++---------- common/xbps-src/shutils/chroot.sh | 1 + 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/common/environment/setup/git.sh b/common/environment/setup/git.sh index 7372de1fed0..dffd69ec00d 100644 --- a/common/environment/setup/git.sh +++ b/common/environment/setup/git.sh @@ -15,3 +15,17 @@ elif [ -z "${SOURCE_DATE_EPOCH}" ]; then sed -ne '/^committer/{s/.* \([0-9]\+\) [-+][0-9][0-9][0-9][0-9]$/\1/p;q}')" 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" + elif ! command -v git &>/dev/null; then + msg_error "command not found: git\n" + else + export XBPS_GIT_REVS="$(git -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 82b2ab1a786..29485a6ad6d 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 GIT_CMD rev # If XBPS_USE_GIT_REVS is disabled in conf file don't continue. if [ -z $XBPS_USE_GIT_REVS ]; then @@ -14,16 +13,11 @@ 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_REVS" ]; then + msg_error "xbps-src's BUG: XBPS_GIT_REVS should be defined.\n" fi cd $XBPS_SRCPKGDIR - rev="$($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" \