From 8aee1fd032bbfcee3ef0618f683723d119850da0 Mon Sep 17 00:00:00 2001
From: Mohammad Akhlaghi <mohammad@akhlaghi.org>
Date: Tue, 22 Jan 2019 03:56:44 +0000
Subject: Using fork of metastore to work when getpwuid isn't usable

After testing the built of Metastore on a server, I noticed that because
its `/etc/passwd' doesn't have the list of users, the `getpwuid' call
within metastore failed and wouldn't let it finish.

So I looked into the code and was able to implement a solution to this
problem by adding two options to it for default values for the user and
group. Also, file attributes are not necessary in our (current) use case of
metastore and caused crashes on our server, so they are also disabled.
---
 reproduce/config/pipeline/dependency-versions.mk |  2 +-
 reproduce/src/bash/git-post-checkout             |  2 +-
 reproduce/src/bash/git-pre-commit                |  4 +--
 reproduce/src/make/dependencies-basic.mk         |  0
 reproduce/src/make/dependencies.mk               | 46 +++++++++++++++++-------
 5 files changed, 37 insertions(+), 17 deletions(-)
 mode change 100755 => 100644 reproduce/src/make/dependencies-basic.mk

(limited to 'reproduce')

diff --git a/reproduce/config/pipeline/dependency-versions.mk b/reproduce/config/pipeline/dependency-versions.mk
index 14a9635..e86a0fe 100644
--- a/reproduce/config/pipeline/dependency-versions.mk
+++ b/reproduce/config/pipeline/dependency-versions.mk
@@ -22,7 +22,7 @@ libtool-version     = 2.4.6
 libbsd-version      = 0.9.1
 lzip-version        = 1.20
 make-version        = 4.2.90
-metastore-version   = 1.1.2
+metastore-version   = v1.1.2-17-g6c56e14
 mpfr-version        = 4.0.1
 mpc-version         = 1.1.0
 ncurses-version     = 6.1
diff --git a/reproduce/src/bash/git-post-checkout b/reproduce/src/bash/git-post-checkout
index 4ec2fa6..4c69b2d 100644
--- a/reproduce/src/bash/git-post-checkout
+++ b/reproduce/src/bash/git-post-checkout
@@ -25,6 +25,6 @@ if [ ! -e "$MSFILE" ]; then
 fi
 
 exit_on_fail \
-	@BINDIR@/metastore -a -m -e -E -q -f "$MSFILE"
+       @BINDIR@/metastore -a -m -e -E -q -O @USER@ -G @GROUP@ -f "$MSFILE"
 
 exit 0
diff --git a/reproduce/src/bash/git-pre-commit b/reproduce/src/bash/git-pre-commit
index 295c033..4373898 100644
--- a/reproduce/src/bash/git-pre-commit
+++ b/reproduce/src/bash/git-pre-commit
@@ -31,12 +31,12 @@ exit_on_fail() {
 }
 
 exit_on_fail \
-	@BINDIR@/metastore -s -f "$MSFILE"
+	@BINDIR@/metastore -O @USER@ -G @GROUP@ -s -f "$MSFILE"
 
 # If it's first metastore commit, store again to include $MSFILE in $MSFILE.
 if ! git-ls-tree --name-only HEAD 2>/dev/null | grep -Fqx "$MSFILE"; then
 	exit_on_fail \
-		@BINDIR@/metastore -s -f "$MSFILE"
+	        @BINDIR@/metastore -O @USER@ -G @GROUP@ -s -f "$MSFILE"
 fi
 
 if [ ! -e "$MSFILE" ]; then
diff --git a/reproduce/src/make/dependencies-basic.mk b/reproduce/src/make/dependencies-basic.mk
old mode 100755
new mode 100644
diff --git a/reproduce/src/make/dependencies.mk b/reproduce/src/make/dependencies.mk
index 128e4e5..9f3436d 100644
--- a/reproduce/src/make/dependencies.mk
+++ b/reproduce/src/make/dependencies.mk
@@ -138,7 +138,7 @@ $(tarballs): $(tdir)/%:
 	  elif [ $$n = libgit      ]; then
 	    mergenames=0
 	    w=https://github.com/libgit2/libgit2/archive/v$(libgit2-version).tar.gz
-	  elif [ $$n = metastore   ]; then w=http://ftp.przemoc.net/pub/software/utils/metastore
+	  elif [ $$n = metastore   ]; then w=http://akhlaghi.org/src
 	  elif [ $$n = tiff        ]; then w=https://download.osgeo.org/libtiff
 	  elif [ $$n = wcslib      ]; then w=ftp://ftp.atnf.csiro.au/pub/software/wcslib
 	  else
@@ -359,26 +359,46 @@ $(ibdir)/git: $(tdir)/git-$(git-version).tar.xz \
 $(ibdir)/metastore: $(tdir)/metastore-$(metastore-version).tar.gz \
                     $(ilidir)/libbsd                              \
                     $(ibdir)/git
+
+        # The build command below will change the current directory of this
+        # build, so we'll fix its value here.
+	current_dir=$$(pwd)
+
         # Metastore doesn't have any `./configure' script. So we'll just
         # call `pwd' as a place-holder for the `./configure' command.
-	current_dir=$$(pwd)
-	$(call gbuild, $<, metastore-$(metastore-version), static,,V=1,, \
-	               pwd, PREFIX=$(idir))
+        #
+        # File attributes are also not available on some systems, since the
+        # main purpose here is modification dates (and not attributes),
+        # we'll also set the `NO_XATTR' flag.
+	$(call gbuild, $<, metastore-$(metastore-version), static,, \
+	               NO_XATTR=1 V=1,,pwd,PREFIX=$(idir))
 
         # Write the relevant hooks into this system's Git hooks, so Git
         # calls metastore properly on every commit and every checkout.
+        #
+        # Note that the -O and -G options used here are currently only in a
+        # fork of `metastore' currently hosted at:
+        # https://github.com/mohammad-akhlaghi/metastore
+	user=$$(whoami)
+	group=$$(groups $$user | awk '{print $$1}')
 	cd $$current_dir
 	if [ -f $@ ]; then
-	  rm -f .git/hooks/pre-commit .git/hooks/post-checkout
-	  sed -e's|@BINDIR[@]|$(ibdir)|g' \
-	      reproduce/src/bash/git-pre-commit    > .git/hooks/pre-commit
-	  sed -e's|@BINDIR[@]|$(ibdir)|g' \
-	      reproduce/src/bash/git-post-checkout > .git/hooks/post-checkout
-	  chmod +x .git/hooks/pre-commit .git/hooks/post-checkout
+	  for f in pre-commit post-checkout; do
+	    sed -e's|@USER[@]|'$$user'|g'    \
+	        -e's|@GROUP[@]|'$$group'|g'  \
+	        -e's|@BINDIR[@]|$(ibdir)|g'  \
+	        reproduce/src/bash/git-$$f > .git/hooks/$$f
+	    chmod +x .git/hooks/$$f
+	  done
 	else
-	  echo; echo; echo "Metastore couldn't be built on this system!"
-	  echo "Please contact mohammad@akhlaghi.org to try fixing the problem."
-	  echo; echo "But this is not a vital element of the pipeline. You "
+	  echo; echo; echo;
+	  echo "*****************"
+	  echo "metastore couldn't be installed!"
+	  echo
+	  echo "Its used for preserving timestamps on Git commits."
+	  echo "Its useful for development, not simple running of the pipeline."
+	  echo "So we won't stop the pipeline because it wasn't built."
+	  echo "*****************"
 	fi
 
 # The order of dependencies is based on how long they take to build (how
-- 
cgit v1.2.1