From: Junio C Hamano <gitster@pobox.com>
To: Miklos Vajna <vmiklos@frugalware.org>
Cc: git@vger.kernel.org, Stephan Beyer <s-beyer@gmx.net>
Subject: Re: What's cooking in git.git (Aug 2008, #05; Tue, 19)
Date: Tue, 02 Sep 2008 13:43:30 -0700 [thread overview]
Message-ID: <7vfxoijn2l.fsf@gitster.siamese.dyndns.org> (raw)
In-Reply-To: <7v1w02l3jc.fsf@gitster.siamese.dyndns.org> (Junio C. Hamano's message of "Tue, 02 Sep 2008 13:02:31 -0700")
Junio C Hamano <gitster@pobox.com> writes:
> Miklos Vajna <vmiklos@frugalware.org> writes:
>
>> I tried to let cmd_revert() use merge_trees() only and not
>> merge_recursive_generic(), but something is fishy with it.
> Here is a partial fix to address the above issues I noticed on
> top of your version; untested.
This has a few fix-ups in addition to the one I sent earlier (not
incremental, this applies directly on top of yours, bypassing the earlier
one), and has passed the self tests.
builtin-revert.c | 47 +++++++++++++++++++++++++++++++++++++----------
1 files changed, 37 insertions(+), 10 deletions(-)
diff --git i/builtin-revert.c w/builtin-revert.c
index 3071518..8486539 100644
--- i/builtin-revert.c
+++ w/builtin-revert.c
@@ -234,16 +234,27 @@ static int index_is_dirty(void)
return !!DIFF_OPT_TST(&rev.diffopt, HAS_CHANGES);
}
+static struct tree *empty_tree(void)
+{
+ struct tree *tree = xcalloc(1, sizeof(struct tree));
+
+ tree->object.parsed = 1;
+ tree->object.type = OBJ_TREE;
+ pretend_sha1_file(NULL, 0, OBJ_TREE, tree->object.sha1);
+ return tree;
+}
+
static int revert_or_cherry_pick(int argc, const char **argv)
{
unsigned char head[20];
struct commit *base, *next, *parent;
- int i;
+ int i, index_fd, clean;
char *oneline, *reencoded_message = NULL;
const char *message, *encoding;
const char *defmsg = xstrdup(git_path("MERGE_MSG"));
struct merge_options o;
- struct tree *result;
+ struct tree *result, *next_tree, *base_tree, *head_tree;
+ static struct lock_file index_lock;
git_config(git_default_config, NULL);
me = action == REVERT ? "revert" : "cherry-pick";
@@ -254,6 +265,8 @@ static int revert_or_cherry_pick(int argc, const char **argv)
if (action == REVERT && !no_replay)
die("revert is incompatible with replay");
+ if (read_cache() < 0)
+ die("git %s: failed to read the index", me);
if (no_commit) {
/*
* We do not intend to commit immediately. We just want to
@@ -266,12 +279,12 @@ static int revert_or_cherry_pick(int argc, const char **argv)
} else {
if (get_sha1("HEAD", head))
die ("You do not have a valid HEAD");
- if (read_cache() < 0)
- die("could not read the index");
if (index_is_dirty())
die ("Dirty index: cannot %s", me);
- discard_cache();
}
+ discard_cache();
+
+ index_fd = hold_locked_index(&index_lock, 1);
if (!commit->parents) {
if (action == REVERT)
@@ -305,6 +318,10 @@ static int revert_or_cherry_pick(int argc, const char **argv)
die ("Cannot get commit message for %s",
sha1_to_hex(commit->object.sha1));
+ if (parent && parse_commit(parent) < 0)
+ die("%s: cannot parse parent commit %s",
+ me, sha1_to_hex(parent->object.sha1));
+
/*
* "commit" is an existing commit. We would want to apply
* the difference it introduces since its first parent "prev"
@@ -351,11 +368,21 @@ static int revert_or_cherry_pick(int argc, const char **argv)
init_merge_options(&o);
o.branch1 = "HEAD";
o.branch2 = oneline;
- parse_commit(next);
- parse_commit(base);
- if (!merge_trees(&o, lookup_commit_reference_gently(head, 0)->tree,
- next->tree, base->tree, &result) ||
- write_cache_as_tree(head, 0, NULL)) {
+
+ head_tree = parse_tree_indirect(head);
+ next_tree = next ? next->tree : empty_tree();
+ base_tree = base ? base->tree : empty_tree();
+
+ clean = merge_trees(&o,
+ head_tree,
+ next_tree, base_tree, &result);
+
+ if (active_cache_changed &&
+ (write_cache(index_fd, active_cache, active_nr) ||
+ commit_locked_index(&index_lock)))
+ die("%s: Unable to write new index file", me);
+
+ if (!clean) {
add_to_msg("\nConflicts:\n\n");
for (i = 0; i < active_nr;) {
struct cache_entry *ce = active_cache[i++];
next prev parent reply other threads:[~2008-09-02 20:44 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-08-19 9:05 What's cooking in git.git (Aug 2008, #05; Tue, 19) Junio C Hamano
2008-08-19 11:02 ` Johannes Sixt
2008-08-19 12:35 ` Andreas Färber
2008-08-19 12:54 ` Miklos Vajna
2008-08-19 19:19 ` Junio C Hamano
2008-08-19 20:59 ` Miklos Vajna
2008-08-19 22:00 ` Junio C Hamano
2008-08-20 22:42 ` Miklos Vajna
2008-08-25 1:44 ` [PATCH] merge-recursive: introduce merge_options Miklos Vajna
2008-08-25 6:06 ` Junio C Hamano
2008-08-25 14:25 ` Miklos Vajna
2008-08-28 4:50 ` Junio C Hamano
2008-08-30 15:42 ` [PATCH] merge-recursive: fix subtree merge Miklos Vajna
2008-08-30 16:39 ` Junio C Hamano
2008-08-30 17:55 ` Junio C Hamano
2008-08-31 23:49 ` Miklos Vajna
2008-09-01 1:06 ` What's cooking in git.git (Aug 2008, #05; Tue, 19) Miklos Vajna
2008-09-01 1:09 ` [PATCH] builtin-revert: use merge_recursive_generic() Miklos Vajna
2008-09-02 20:02 ` What's cooking in git.git (Aug 2008, #05; Tue, 19) Junio C Hamano
2008-09-02 20:43 ` Junio C Hamano [this message]
2008-09-02 22:05 ` [PATCH 0/2] Move call_depth and index_only to struct merge_options Miklos Vajna
2008-09-02 22:05 ` [PATCH 1/2] merge-recursive: move call_depth " Miklos Vajna
2008-09-02 22:05 ` [PATCH 2/2] merge-recursive: move index_only " Miklos Vajna
2008-09-02 22:13 ` [PATCH] Makefile: add merge_recursive.h to LIB_H Miklos Vajna
2008-09-02 22:39 ` Junio C Hamano
2008-09-02 23:49 ` Miklos Vajna
2008-09-02 22:39 ` [PATCH 0/2] Move call_depth and index_only to struct merge_options Junio C Hamano
2008-09-03 0:16 ` [PATCH] merge-recursive: get rid of the index_only global variable Miklos Vajna
2008-09-03 0:39 ` [PATCH] merge-recursive: move the global obuf to struct merge_options Miklos Vajna
2008-09-03 17:34 ` Miklos Vajna
2008-09-03 17:34 ` [PATCH 1/2] merge-recursive: move current_{file,directory}_set " Miklos Vajna
2008-09-03 17:34 ` [PATCH 2/2] merge-recursive: move make_virtual_commit()'s virtual_id to merge_options Miklos Vajna
2008-09-04 19:03 ` Junio C Hamano
2008-09-05 17:26 ` [PATCH] merge-recursive: get rid of virtual_id Miklos Vajna
2008-09-04 19:05 ` [PATCH] merge-recursive: move the global obuf to struct merge_options Junio C Hamano
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=7vfxoijn2l.fsf@gitster.siamese.dyndns.org \
--to=gitster@pobox.com \
--cc=git@vger.kernel.org \
--cc=s-beyer@gmx.net \
--cc=vmiklos@frugalware.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).