#!/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