name="$(git symbolic-ref HEAD | sed 's#^refs/heads/##')"
base_rev="$(git rev-parse --short --verify "refs/top-bases/$name" 2>/dev/null)" ||
die "not on a TopGit-controlled branch"
+ branches="$name"
+else
+ name="${branches##*,}" # the last of the comma-separated items
fi
+# $name holds the current branch
+# $branches holds the comma-separated list of branches
+# $name is equal to the last of the list of branches
-playground="$(mktemp -d -t tg-export.XXXXXX)"
-trap 'rm -rf "$playground"' EXIT
+playground="$(get_temp tg-export -d)"
## Collapse driver
-# pretty_tree NAME
-# Output tree ID of a cleaned-up tree without tg's artifacts.
-pretty_tree()
-{
- (export GIT_INDEX_FILE="$playground/^index"
- git read-tree "$1"
- git update-index --force-remove ".topmsg" ".topdeps"
- git write-tree)
-}
-
create_tg_commit()
{
name="$1"
# Produce a collapsed commit of branch NAME.
collapsed_commit()
{
- name="$1"
+ local name; name="$1"
rm -f "$playground/^pre" "$playground/^post"
>"$playground/^body"
echo "TopGit-driven merge of branches:"
echo
cut -f 2 "$playground/$name^parents"
- } | git commit-tree "$(pretty_tree "refs/top-bases/$name")" \
+ } | git commit-tree "$(pretty_tree "$name" -b)" \
$(for p in $parent; do echo -p $p; done))"
fi
echo "Skip empty patch $_dep";
else
if "$numbered"; then
- number="$(printf "%04u" $(($(cat "$playground/^number" 2>/dev/null) + 1)))";
- bn="$number-$bn";
+ number="$(echo $(($(cat "$playground/^number" 2>/dev/null) + 1)))";
+ bn="$(printf "%04u-$bn" $number)";
echo "$number" >"$playground/^number";
fi;
# already included, just skip
:;
else
- git merge -s recursive "$_dep";
- retmerge="$?";
+ retmerge=0;
+
+ git merge -s recursive "$_dep" || retmerge="$?";
if test "x$retmerge" != "x0"; then
echo fix up the merge, commit and then exit;
#todo error handling
- sh -i
+ sh -i </dev/tty;
fi;
fi;
else
- git merge-recursive "$(pretty_tree "refs/top-bases/$_dep")" -- HEAD "$(pretty_tree "refs/heads/$_dep")";
- retmerge="$?";
+ retmerge=0;
+
+ git merge-recursive "$(pretty_tree "$_dep" -b)" -- HEAD "$(pretty_tree "refs/heads/$_dep")" || retmerge="$?";
if test "x$retmerge" != "x0"; then
+ git rerere;
echo "fix up the merge and update the index. Don't commit!"
#todo error handling
- sh -i
+ sh -i </dev/tty;
fi
result_tree=$(git write-tree)
# Call driver on all the branches - this will happen
# in topological order.
-if [ -z "$branches" ]; then
+echo "$branches" | tr , '\n' | while read name; do
recurse_deps driver "$name"
(_ret=0; _dep="$name"; _name=""; _dep_is_tgish=1; driver)
-else
- echo "$branches" | tr ',' '\n' | while read _dep; do
- _dep_is_tgish=1
- $driver
- done
- name="$(echo "$branches" | sed 's/.*,//')"
-fi
-
+done
if [ "$driver" = "collapse" ]; then
git update-ref "refs/heads/$output" "$(cat "$playground/$name")" ""