Fix for cache handling 89/4589/6
authorStefan K. Berg <stefan.k.berg@ericsson.com>
Tue, 15 Dec 2015 14:57:46 +0000 (15:57 +0100)
committerStefan K. Berg <stefan.k.berg@ericsson.com>
Thu, 17 Dec 2015 23:37:25 +0000 (00:37 +0100)
Introduced a separate function "getcommitid" in the cache.sh
- a.k.a. $(CACHETOOL) - so that given a repo and a tag, branch
or commitid the corresponding commitid is returned.

The same principle should be used in all caching functions where
not a strict tag or head is specified (as git ls-remote will not
be able to figure out the commit id in those cases).

Change-Id: I3540dca7ab408c872eaabdc68d4058f9d6d7c45f
Signed-off-by: Stefan K. Berg <stefan.k.berg@ericsson.com>
build/cache.sh
build/f_isoroot/f_bgpvpn-pluginbuild/Makefile

index c8cd1b0..ed90056 100755 (executable)
@@ -9,6 +9,15 @@
 # http://www.apache.org/licenses/LICENSE-2.0
 ##############################################################################
 
+
+exit_trap() {
+    if [ -d "$TMPDIR" ]; then
+        rm -rf $TMPDIR
+    fi
+}
+
+trap exit_trap EXIT
+
 CACHETRANSPORT=${CACHETRANSPORT:-"curl --silent"}
 CACHEBASE=${CACHEBASE:-"file://${HOME}/cache"}
 CACHEMAXAGE=${CACHEMAXAGE:-$[14*24*3600]}
@@ -20,8 +29,9 @@ debugmsg () {
     fi
 }
 
-errormsg () {
+errorexit () {
     echo "$@" >&2
+    exit 1
 }
 
 # Get a SHA1 based on what's piped into the cache command
@@ -84,22 +94,45 @@ validSHA1() {
     fi
 }
 
+# Figure out commit ID from URI and tag/branch/commit ID
+getcommitid() {
+    HEADMATCH=`git ls-remote $1 | grep "refs/heads/$2$" | awk '{ print $1 }'`
+    TAGMATCH=`git ls-remote $1 | grep "refs/tags/$2$" | awk '{ print $1 }'`
+
+    if [ -n "$HEADMATCH" ]; then
+        echo "$HEADMATCH"
+    elif [ -n "$TAGMATCH" ]; then
+        echo "$TAGMATCH"
+    else
+        TMPDIR=`mktemp -d /tmp/cacheXXXXX`
+        cd $TMPDIR
+        git clone $1 &>/dev/null || errorexit "Could not clone $1"
+        cd * || errorexit "Could not enter clone of $1"
+        git show $2 &>/dev/null || errorexit "Could not find commit $2"
+        git show $2 | head -1 | awk '{ print $2 }'
+    fi
+}
+
 case $1 in
+    getcommitid)
+        if [ $# -ne 3 ]; then
+            errorexit "Arg 1 needs to be URI and arg 2 tag/branch/commit"
+        fi
+        shift
+        getcommitid $@
+        ;;
     getid)
         if [ $# -ne 1 ]; then
-            errormsg "No arguments can be given to getid!"
-            exit 1
+            errorexit "No arguments can be given to getid!"
         fi
         getid
         ;;
     get|check|put)
         if [ $# -ne 2 ]; then
-            errormsg "Only one argument, the SHA1 sum, can be given to getid!"
-            exit 1
+            errorexit "Only one argument, the SHA1 sum, can be given to getid!"
         else
             if ! validSHA1 $2; then
-                errormsg "Invalid SHA1 format!"
-                exit 1
+                errorexit "Invalid SHA1 format!"
             fi
         fi
 
@@ -107,6 +140,5 @@ case $1 in
         exit $rc
         ;;
     *)
-        errormsg "I only know about getid, check, get and put!"
-        exit 1
+        errorexit "I only know about getcommitid, getid, check, get and put!"
 esac
index 443a8e3..3da8d38 100644 (file)
@@ -61,7 +61,11 @@ release:.bgpvpnbuild
 #   - The SHA1 hash of the HEAD on the plugin repo's $(BGPVPN_BRANCH)
 #   - The contents of this Makefile
 .cacheid:
-       git ls-remote --heads $(BGPVPN_REPO) | grep $(BGPVPN_BRANCH) > .cachedata
+       if [ ! -z $(BGPVPN_CHANGE) ]; then \
+         $(CACHETOOL) getcommitid $(BGPVPN_REPO) $(BGPVPN_CHANGE) > .cachedata; \
+       else \
+         $(CACHETOOL) getcommitid $(BGPVPN_REPO) $(BGPVPN_BRANCH) > .cachedata; \
+       fi
        sha1sum Makefile >> .cachedata
        sha1sum config.mk >> .cachedata
        cat .cachedata | $(CACHETOOL) getid > .cacheid