Skip over empty commits.
But we still need to get rid of unnecessary merge commits somehow...
Avery Pennarun committed
Apr 24, 2009 at 17:53 UTC
768d6d10051cbf2d0261b9cf671b1f969fb77a61
1 file changed
+42
-13
git-subtree.sh
+42
-13
@@ -167,6 +167,32 @@ merge_msg()
167
EOF
168
}
169
170
+tree_for_commit()
171
+{
172
+ git ls-tree "$1" -- "$dir" |
173
+ while read mode type tree name; do
174
+ assert [ "$name" = "$dir" ]
175
+ echo $tree
176
+ break
177
+ done
178
+}
179
+
180
+tree_changed()
181
+{
182
+ tree=$1
183
+ shift
184
+ if [ $# -ne 1 ]; then
185
+ return 0 # weird parents, consider it changed
186
+ else
187
+ ptree=$(tree_for_commit $1)
188
+ if [ "$ptree" != "$tree" ]; then
189
+ return 0 # changed
190
+ else
191
+ return 1 # not changed
192
+ fi
193
+ fi
194
+}
195
+
196
cmd_split()
197
{
198
debug "Splitting $dir..."
@@ -199,21 +225,24 @@ cmd_split()
225
newparents=$(cache_get $parents)
226
debug " newparents: $newparents"
227
202
- git ls-tree $rev -- "$dir" |
203
- while read mode type tree name; do
204
- assert [ "$name" = "$dir" ]
205
- debug " tree is: $tree"
206
- p=""
207
- for parent in $newparents; do
208
- p="$p -p $parent"
209
- done
228
+ tree=$(tree_for_commit $rev)
229
+ debug " tree is: $tree"
230
+ [ -z $tree ] && continue
231
+
232
+ p=""
233
+ for parent in $newparents; do
234
+ p="$p -p $parent"
235
+ done
236
237
+ if tree_changed $tree $parents; then
238
newrev=$(copy_commit $rev $tree "$p") || exit $?
212
- debug " newrev is: $newrev"
213
- cache_set $rev $newrev
214
- cache_set latest_new $newrev
215
- cache_set latest_old $rev
216
- done || exit $?
239
+ else
240
+ newrev="$newparents"
241
+ fi
242
+ debug " newrev is: $newrev"
243
+ cache_set $rev $newrev
244
+ cache_set latest_new $newrev
245
+ cache_set latest_old $rev
246
done || exit $?
247
latest_new=$(cache_get latest_new)
248
if [ -z "$latest_new" ]; then