From: "Uwe Kleine-König" <u.kleine-koenig@pengutronix.de>
To: git@vger.kernel.org
Subject: [PATCH] [TOPGIT] implement linearize export method
Date: Wed, 25 Feb 2009 21:04:00 +0100 [thread overview]
Message-ID: <1235592240-12616-5-git-send-email-u.kleine-koenig@pengutronix.de> (raw)
In-Reply-To: <1235592240-12616-4-git-send-email-u.kleine-koenig@pengutronix.de>
This is a draft that seems to work for my test case. The error handling
is to be improved though.
Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
---
tg-export.sh | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 65 insertions(+), 2 deletions(-)
diff --git a/tg-export.sh b/tg-export.sh
index dea24d9..748ca54 100644
--- a/tg-export.sh
+++ b/tg-export.sh
@@ -27,8 +27,10 @@ while [ -n "$1" ]; do
driver=quilt;;
--collapse)
driver=collapse;;
+ --linearize)
+ driver=linearize;;
-*)
- echo "Usage: tg [...] export ([--collapse] NEWBRANCH | [-b BRANCH1,BRANCH2...] --quilt DIRECTORY)" >&2
+ echo "Usage: tg [...] export ([--collapse] NEWBRANCH | [-b BRANCH1,BRANCH2...] --quilt DIRECTORY | --linearize NEWBRANCH)" >&2
exit 1;;
*)
[ -z "$output" ] || die "output already specified ($output)"
@@ -195,10 +197,60 @@ quilt()
fi
}
+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
+ 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
+ fi;
+ fi;
+ else
+ git merge-recursive "$(pretty_tree "refs/top-bases/$_dep")" -- HEAD "$(pretty_tree "refs/heads/$_dep")";
+ retmerge="$?";
+
+ if test "x$retmerge" != "x0"; then
+ echo "fix up the merge and update the index. Don't commit!"
+ #todo error handling
+ sh -i
+ 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
+}
## Machinery
-if [ "$driver" = "collapse" ]; then
+if [ "$driver" = "collapse" ] || [ "$driver" = "linearize" ]; then
[ -n "$output" ] ||
die "no target branch specified"
! ref_exists "$output" ||
@@ -247,6 +299,17 @@ if [ "$driver" = "collapse" ]; then
elif [ "$driver" = "quilt" ]; then
depcount="$(cat "$output/series" | wc -l)"
echo "Exported topic branch $name (total $depcount topics) to directory $output"
+
+elif [ "$driver" = "linearize" ]; then
+ git checkout -q -b $output
+
+ echo $name
+ if test $(git rev-parse "$(pretty_tree $name)^{tree}") != $(git rev-parse "HEAD^{tree}"); then
+ echo "Warning: Exported result doesn't match";
+ echo "tg-head=$(git rev-parse "$name"), exported=$(git rev-parse "HEAD")";
+ #git diff $head HEAD;
+ fi;
+
fi
# vim:noet
--
1.5.6.5
next prev parent reply other threads:[~2009-02-25 20:05 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-02-25 19:58 topgit patches Uwe Kleine-König
2009-02-25 20:03 ` [PATCH] [TOPGIT] limit rev-list in branch_contains to a single rev Uwe Kleine-König
2009-02-25 20:03 ` [PATCH] [TOPGIT] allow working with annihilated branches Uwe Kleine-König
2009-02-25 20:03 ` [PATCH] [TOPGIT] make tg remote idempotent Uwe Kleine-König
2009-02-25 20:03 ` [PATCH] [TOPGIT] make creating a commit from a topgit branch a function Uwe Kleine-König
2009-02-25 20:04 ` Uwe Kleine-König [this message]
2009-02-25 21:23 ` topgit patches Petr Baudis
2009-02-25 23:15 ` Uwe Kleine-König
2009-02-25 23:22 ` Petr Baudis
2009-02-26 13:47 ` Uwe Kleine-König
2009-02-26 6:06 ` martin f krafft
2009-02-26 14:15 ` Uwe Kleine-König
2009-02-27 12:37 ` martin f krafft
2009-02-27 19:42 ` Uwe Kleine-König
2009-03-02 16:26 ` Uwe Kleine-König
2009-03-03 7:54 ` martin f krafft
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1235592240-12616-5-git-send-email-u.kleine-koenig@pengutronix.de \
--to=u.kleine-koenig@pengutronix.de \
--cc=git@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).