+linearize()
+{
+ if test ! -f "$playground/^BASE"; then
+ head="$(git rev-parse --verify "$_dep")"
+ echo "$head" > "$playground/^BASE"
+ git checkout -q "$head"
+ return;
+ fi;
+
+ head=$(git rev-parse --verify HEAD)
+
+ if [ -z "$_dep_is_tgish" ]; then
+ # merge in $_dep unless already included
+ rev="$(git rev-parse --verify "$_dep")";
+ common="$(git merge-base --all HEAD "$_dep")";
+ if test "$rev" = "$common"; then
+ # already included, just skip
+ :;
+ else
+ 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 </dev/tty;
+ fi;
+ fi;
+ else
+ 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 </dev/tty;
+ fi
+
+ result_tree=$(git write-tree)
+ # testing branch_empty might not always give the right answer.
+ # It can happen that the patch is non-empty but still after
+ # linearizing there is no change. So compare the trees.
+ if test "x$result_tree" = "x$(git rev-parse $head^{tree})"; then
+ echo "skip empty commit $_dep";
+ else
+ newcommit=$(create_tg_commit "$_dep" "$result_tree" HEAD)
+ git update-ref HEAD $newcommit $head
+ echo "exported commit $_dep";
+ fi
+ fi
+}