#!/bin/bash
set -o errexit
-# Uncomment to have verboswe debug output
-#debug=1
+SCRIPT="`readlink -e $0`"
+SCRIPTPATH=$(dirname ${SCRIPT})
+source ${SCRIPTPATH}/hv-hg-functions.sh
# for use with git-remote-hg:
# http://felipec.wordpress.com/2012/11/13/git-remote-hg-bzr-2/
-LSI_SRV=/mnt/server/research/Projects/HG_Repo
+# Uncomment to have verbose debug output
+#debug=1
print_usage()
{
echo "Usage: $(basename $0) [OPTIONS...]"
}
-# Map a revision to a branch name in HG subrepository
-# Use hg log (in original repo) to get branch name corresponding to that
-# revision.
-#
-# Arg 1: subrepository URL
-# Arg 2: id
-# Arg 3: revision
-subrepo_find_branch() {
- local src="${1}"
- local id="${2}"
- local rev="${3}"
-
- pushd "${LSI_SRV}/${src}"
-
- branch=$(hg log -r ${rev} | grep "branch:" | sed "s/branch:\ *//")
-
- if [ -z "${branch}" ]; then
- # If "branch:" is null, this indicate we are on the default branch
- branch=default
- fi
-
- if [ -n "${debug}" ]; then
- echo " branch: ${branch}"
- fi
-
- popd
-}
-
if [ "x${1}" = "x--help" ]; then
print_usage
exit 1
exit 1
fi
+if [ ! -f .gitignore ]; then
+ # We do not want to track .gitignore itself
+ echo ".gitignore" > .gitignore
+fi
+
+asm=$(cat .git/config | grep "hg::" | sed "s/.*url = hg::\(.*\)/\1/")
+hg_parse_projrc ${asm}
+
+hg_parse_subpaths
+
+HGSUB_TMP="/tmp/$(basename $0).hgsub-$$.tmp"
+
+# Create temporary copy to replace backslashes with slashes.
+cat .hgsub | sed 's/\\/\//g' > ${HGSUB_TMP}
+
# Read lines from .hgsub
while read sub; do
# Remove CR (DOS)
if [ "${sub}" != "" ]; then
# Get subrepository URL
- src="${sub//*\/HG_REPO/}"
+ src="${sub//*= /}"
+
+ # Replace using Mercurial subpaths substitutions (either projrc or from hgrc)
+ src=$(apply_substitutions ${src})
+
+ # Original name
+ repo=$(basename "${src}")
+ srcpath=$(dirname "${src}")
# Get subrepository local alias or label
dest="${sub// =*}"
# Get project ID (example: S0289)
- id=$(echo ${sub} | sed "s/.*HG_REPO\(S[0-9][0-9][0-9][0-9]\).*/\1/")
+ id=$(echo ${sub} | sed "s/.*\(S[0-9][0-9][0-9][0-9]\).*/\1/")
# Get revision of subrepository (remove CR from .hgsubstate)
rev=$(cat .hgsubstate | tr -d '\r' | grep "${id}" | sed "s/ .*//")
if [ -n "${debug}" ]; then
- echo "repo: ${src}"
- echo " id: ${id}"
- echo " rev: ${rev}"
- echo " dest: ${dest}"
+ echo "repo: ${repo}"
+ echo " path: ${srcpath}"
+ echo " id: ${id}"
+ echo " local: ${dest}"
+ echo " rev: ${rev}"
fi
if [ ! -d "${dest}" ]; then
# "BRANCH___-___NAME"
branch="${branch// /___}"
- git clone "hg::${LSI_SRV}/${src}" "${dest}"
+ 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}"
- cd ..
+ # Make tracking branch
+ git checkout -f "branches/${branch}"
+
+ # Adjusting git tree to specific commit specified in
+ # .hgsubstate:
+ # The SHA from hg and git are not the same, therefore, we must
+ # find the commit sequence in hg and map this
+ # 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}
+ 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
+done < ${HGSUB_TMP}
+
+rm ${HGSUB_TMP}