Skip to content

Instantly share code, notes, and snippets.

Created December 21, 2012 09:23
Show Gist options
  • Save anonymous/4351702 to your computer and use it in GitHub Desktop.
Save anonymous/4351702 to your computer and use it in GitHub Desktop.
A semi-auto merge script for command-line Subversion. Place it in the branch source tree and run it.
#!/bin/bash
# get_src_url([url])
get_src_url()
{
local url=$1
if [ "$url" == "" ]; then
local merged_path=`svn propget svn:mergeinfo | head -n 1 | cut -d':' -f1`
local root=`svn info | sed -n '/^Repository Root: / { s/Repository Root: //g; p; }'`
echo "$root$merged_path"
return 0
fi
echo "$url"
return 0
}
# get_src_rev_list([url])
get_src_rev_list()
{
local src_url=$(get_src_url "$1")
echo `svn log -ql99 $src_url | sed -n '/^r/ { s/^r\([0-9]\+\).\+$/\1/g; p; };'`
return 0
}
# get_merge_info()
get_merge_info()
{
echo `svn propget svn:mergeinfo | head -n 1 | cut -d':' -f2 | sed 's/,/ /g'`
return 0
}
# is_member(value, list)
is_member()
{
local value=$1
local list=$2
local e
for e in $list; do
if [ "$value" == "$e" ]; then
return 0
elif [ "`echo "$e" | grep -`" != "" ]; then
local lower_bound=`echo "$e" | cut -d'-' -f1`
local upper_bound=`echo "$e" | cut -d'-' -f2`
if [ $value -ge $lower_bound -a $value -le $upper_bound ]; then
return 0
fi
fi
done
return 1
}
# get_src_unmerged_rev_list([url])
get_src_unmerged_rev_list()
{
local src_rev_list=$(get_src_rev_list "$1")
local merge_info=$(get_merge_info)
local e
for e in $src_rev_list; do
if is_member "$e" "$merge_info"; then
echo -n
else
echo "$e"
fi
done
return 0
}
# show_src_unmerged_log(url, rev_str)
show_src_unmerged_log()
{
local src_url=$(get_src_url "$1")
local rev_str=$2
if [ "$rev_str" == "" ]; then
echo "No changes." | less
else
svn log -v -c $rev_str $src_url | less
fi
return $?
}
# do_merge(url, rev_str)
do_merge()
{
local src_url=$(get_src_url "$1")
local rev_str=$2
if [ "$rev_str" == "" ]; then
echo "Nothing to merge."
else
svn merge -c $rev_str $src_url
fi
return $?
}
# do_sep_merge(url, rev_list)
do_sep_merge()
{
local src_url=$(get_src_url "$1")
local rev_list=$2
local rev
local m_answer
local rev_str=""
for rev in $rev_list; do
svn log -vc $rev "$src_url"
echo
echo -n "Merge rev. $rev? (y/N) "
read m_answer
echo
if [ "$m_answer" == "y" -o "$m_answer" == "Y" ]; then
rev_str="$rev_str,$rev"
fi
done
if [ "$rev_str" != "" ]; then
rev_str=${rev_str:1}
svn merge -c $rev_str "$src_url"
echo
echo "Done merging $rev_str."
echo
else
echo
echo "No revision(s) selected."
echo
fi
}
# ./merge_helper.sh [src url]
raw_unmerged=$(get_src_unmerged_rev_list "$1")
sorted_raw_unmerged=`echo "$raw_unmerged" | sort -g`
unmerged=`echo $sorted_raw_unmerged | sed 's/ /,/g'`
show_src_unmerged_log "$1" "$unmerged"
echo
echo "$unmerged"
echo
if [ "$unmerged" != "" ]; then
echo -n "Merge all? (y/n/Abort) "
read merge_answer
echo
if [ "$merge_answer" == "y" -o "$merge_answer" == "Y" ]; then
do_merge "$1" "$unmerged"
elif [ "$merge_answer" == "n" -o "$merge_answer" == "N" ]; then
rev_list=`echo $sorted_raw_unmerged`
do_sep_merge "$1" "$rev_list"
else
exit 0
fi
fi
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment