@matheusbsbs / matheus-bagliano / commits / 8b4a77f2a1
Fork 0

Use information about prior splits to make sure merges work right.

Avery Pennarun committed Apr 24, 2009 at 16:48 UTC 8b4a77f2a16d730f7261d66991107ab404b3b4ac
1 file changed +36 -4
git-subtree.sh
+36 -4
@@ -46,7 +46,6 @@ assert()
46
47 while [ $# -gt 0 ]; do
48 opt="$1"
49 - debug "option: $1"
49 shift
50 case "$opt" in
51 -q) quiet=1 ;;
@@ -108,6 +107,30 @@ cache_set()
107 echo "$newrev" >"$cachedir/$oldrev"
108 }
109
110 +find_existing_splits()
111 +{
112 + debug "Looking for prior splits..."
113 + dir="$1"
114 + revs="$2"
115 + git log --grep="^git-subtree-dir: $dir\$" \
116 + --pretty=format:'%s%n%n%b%nEND' "$revs" |
117 + while read a b junk; do
118 + case "$a" in
119 + git-subtree-mainline:) main="$b" ;;
120 + git-subtree-split:) sub="$b" ;;
121 + *)
122 + if [ -n "$main" -a -n "$sub" ]; then
123 + debug " Prior: $main -> $sub"
124 + cache_set $main $sub
125 + echo "^$main^ ^$sub^"
126 + main=
127 + sub=
128 + fi
129 + ;;
130 + esac
131 + done
132 +}
133 +
134 copy_commit()
135 {
136 # We're doing to set some environment vars here, so
@@ -136,10 +159,11 @@ merge_msg()
159 latest_old="$2"
160 latest_new="$3"
161 cat <<-EOF
139 - Split changes from '$dir/' into commit '$latest_new'
162 + Split '$dir/' into commit '$latest_new'
163
164 git-subtree-dir: $dir
142 - git-subtree-includes: $latest_old
165 + git-subtree-mainline: $latest_old
166 + git-subtree-split: $latest_new
167 EOF
168 }
169
@@ -148,12 +172,20 @@ cmd_split()
172 debug "Splitting $dir..."
173 cache_setup || exit $?
174
151 - git rev-list --reverse --parents $revs -- "$dir" |
175 + unrevs="$(find_existing_splits "$dir" "$revs")"
176 +
177 + git rev-list --reverse --parents $revs $unrevs -- "$dir" |
178 while read rev parents; do
179 + exists=$(cache_get $rev)
180 newparents=$(cache_get $parents)
181 debug
182 debug "Processing commit: $rev / $newparents"
183
184 + if [ -n "$exists" ]; then
185 + debug " prior: $exists"
186 + continue
187 + fi
188 +
189 git ls-tree $rev -- "$dir" |
190 while read mode type tree name; do
191 assert [ "$name" = "$dir" ]