Add script to get status of each subrepository
[hvutilities.git] / scripts / vs-sub
diff --git a/scripts/vs-sub b/scripts/vs-sub
new file mode 100755 (executable)
index 0000000..a08d1e8
--- /dev/null
@@ -0,0 +1,109 @@
+#!/bin/bash
+set -o errexit
+
+# Version control status command for all subrepositories.
+# For use with git-remote-hg:
+#   http://felipec.wordpress.com/2012/11/13/git-remote-hg-bzr-2/
+
+# Uncomment to have verbose debug output
+#debug=1
+
+print_usage()
+{
+    echo "$(basename $0) -- Version control subrepository status"
+    echo "Usage: $(basename $0) [OPTIONS...]"
+    echo "Options:"
+    echo "  -h   display this help and exit"
+    echo "  -m   display only subrepositories with local modifications"
+}
+
+# git-remote-hg doesn't work with Mercurial subpaths extension,
+# so use it manually
+hg_subpaths_config()
+{
+    subpaths=$(hg showconfig | grep "subpaths")
+
+    if [ -n "${subpaths}" ]; then
+        sp_src=${subpaths//subpaths./}
+        sp_src=${sp_src//=*/}
+        sp_src=${sp_src//\\/} # Remove windows separator (LSI)
+        sp_dst=${subpaths//*=/}
+
+        if [ -n "${debug}" ]; then
+            echo "sp_src = $sp_src"
+            echo "sp_dst = $sp_dst"
+        fi
+    fi
+}
+
+display_subrepo_name()
+{
+    COLOR_BLUE='\033[1;34m'
+    COLOR_NORMAL='\033[0m'
+
+    echo -en "${COLOR_BLUE}"
+    echo "[${dest}]"
+    echo -en "${COLOR_NORMAL}"
+}
+
+if [ "x${1}" = "x--help" ]; then
+    print_usage
+    exit 1
+fi
+
+if [ ! -f .hgsub ]; then
+    echo "No Mercurial subrepositories found"
+    exit 1
+fi
+
+if [ ! -f .gitignore ]; then
+    # We do not want to track .gitignore itself
+    echo ".gitignore" > .gitignore
+fi
+
+hg_subpaths_config
+
+# Read lines from .hgsub
+while read sub; do
+    # Remove CR (DOS)
+    sub="${sub//$'\r'/}"
+
+    if [ "${sub}" != "" ]; then
+        # Get subrepository URL
+        src="${sub//*= /}"
+
+        # Replace using subpaths extension content
+        src=${src/${sp_src}/${sp_dst}}
+
+        # Get subrepository local alias or label
+        dest="${sub// =*}"
+
+        # Get project ID (example: S0289)
+        id=$(echo ${sub} | sed "s/.*\(S[0-9][0-9][0-9][0-9]\).*/\1/")
+
+        if [ -n "${debug}" ]; then
+            echo "repo: ${src}"
+            echo "  id:     ${id}"
+            echo "  src:    ${src}"
+            echo "  dest:   ${dest}"
+        fi
+
+        if [ -d "${dest}" ]; then
+            pushd "${dest}" 1> /dev/null
+
+            changed=$(vs --porcelain)
+
+            if [ -n "${changed}" ]; then
+                display_subrepo_name
+                vs -s
+                echo # Blank line
+            fi
+
+            popd 1> /dev/null
+        else
+            display_subrepo_name
+            echo "Error: missing local subrepository"
+            echo # Blank line
+        fi
+    fi
+done < .hgsub