Add projrc extension basic support
[hvutilities.git] / scripts / git-hg-sub-import
index 9789578..38f8621 100755 (executable)
@@ -5,7 +5,7 @@ set -o errexit
 #   http://felipec.wordpress.com/2012/11/13/git-remote-hg-bzr-2/
 
 # Uncomment to have verbose debug output
-#debug=1
+debug=1
 
 print_usage()
 {
@@ -16,7 +16,9 @@ print_usage()
 # git-remote-hg doesn't work with Mercurial subpaths extension,
 # so use it manually
 hg_subpaths_config() {
-    subpaths=$(hg showconfig | grep "subpaths")
+    subpaths=$(hg showconfig | grep "subpaths" | grep "HG_REPO")
+
+    echo "subpaths = ${subpaths}"
 
     if [ -n ${subpaths} ]; then
         sp_src=${subpaths//subpaths./}
@@ -31,6 +33,41 @@ hg_subpaths_config() {
     fi
 }
 
+# git-remote-hg doesn't work with Mercurial projrc extension,
+# so use it manually.
+# We parse the projrc file in the assembly (on the server), to check
+# for any projrc substitutions.
+#
+# Arg 1: subproject (path and name)
+#
+# Return the new substitution name if found, and original subrepo name if not
+# (with the path stripped)
+hg_check_projrc_config() {
+    if [ ${#} -lt 1 ]; then
+        echo "Missing subrepos name"
+    fi
+
+    # Repo name can have spaces in it, hence the use of ${*}
+    local subrepo_orig="${*}"
+    local subrepo="${*}"
+
+    # Quote spaces
+    subrepo=${subrepo// /\\\\ }
+
+    asm=$(cat .git/config | grep "hg::" | sed "s/.*url = hg::\(.*\)/\1/")
+
+    local baserepo=$(basename "${subrepo}")
+
+    if cat "${asm}/.hg/projrc" | grep -q "${baserepo}" ; then
+        projrc=$(cat "${asm}/.hg/projrc" | grep "${baserepo}" | sed "s/.*= \(.*\)/\1/")
+    else
+        # No substitution, return same name as original
+        projrc=$(basename "${subrepo_orig}")
+    fi
+
+    echo "${projrc}"
+}
+
 # Map a revision to a branch name in HG subrepository
 # Use hg log (in original repo) to get branch name corresponding to that
 # revision.
@@ -43,7 +80,7 @@ subrepo_find_branch() {
     local id="${2}"
     local rev="${3}"
 
-    pushd "${src}"
+    pushd "${src}" 1> /dev/null
 
     branch=$(hg log -r ${rev} | grep "branch:" | sed "s/branch:\ *//")
 
@@ -60,7 +97,7 @@ subrepo_find_branch() {
         echo "  num:    ${num}"
     fi
 
-    popd
+    popd 1> /dev/null
 }
 
 if [ "x${1}" = "x--help" ]; then
@@ -101,12 +138,20 @@ while read sub; do
         # Get revision of subrepository (remove CR from .hgsubstate)
         rev=$(cat .hgsubstate | tr -d '\r' | grep "${id}" | sed "s/ .*//")
 
+        # Original name
+        repo=$(basename "${src}")
+        srcpath=$(dirname "${src}")
+
+        projrc_sub=$(hg_check_projrc_config "${src}")
+        src="${srcpath}/${projrc_sub}"
+
         if [ -n "${debug}" ]; then
-            echo "repo: ${src}"
+            echo "repo: ${repo}"
+            echo "  path:   ${srcpath}"
             echo "  id:     ${id}"
-            echo "  rev:    ${rev}"
-            echo "  src:    ${src}"
+            echo "  src:    ${projrc_sub}"
             echo "  dest:   ${dest}"
+            echo "  rev:    ${rev}"
         fi
 
         if [ ! -d "${dest}" ]; then
@@ -118,11 +163,22 @@ while read sub; do
             #   "BRANCH___-___NAME"
             branch="${branch// /___}"
 
+            if [ -n "${debug}" ]; then
+                echo "branch: ${branch}"
+            fi
+
             git clone "hg::${src}" "${dest}"
 
+            cd "${dest}"
+
+            if [ -x ${HOME}/scripts/git-set-local-author.sh ]; then
+                # Make sure commits have correct author for LSI
+                ${HOME}/scripts/git-set-local-author.sh
+            fi
+
             if [ "x${branch}" != "xdefault" ]; then
-                cd "${dest}"
-                git checkout "branches/${branch}"
+                # Make tracking branch
+                git checkout -f "branches/${branch}"
 
                 # Adjusting git tree to specific commit specified in
                 # .hgsubstate:
@@ -131,18 +187,14 @@ while read sub; do
                 # to a hash in git using the ${num} variable:
                 git_rev=$(git log --oneline | sed -n "${num}p" | awk '{print $1}')
                 git reset --hard ${git_rev}
-
-                cd ..
             fi
 
+            cd ..
+
             if ! grep -q "${dest}" .gitignore ; then
                 # Ignore subrepo in top-level git repository
                 echo "${dest}" >> .gitignore
             fi
-        else
-            pushd "${dest}"
-            git pull
-            popd
         fi
     fi
 done < .hgsub