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: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:05 ` [PATCH 2/2] merge-recursive: move index_only to struct merge_options Miklos Vajna
2008-09-02 22:39 ` [PATCH 0/2] Move call_depth and " 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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.