Created
December 21, 2012 09:23
-
-
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.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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