From: Junio C Hamano <gitster@pobox.com>
To: John Keeping <john@keeping.me.uk>
Cc: git@vger.kernel.org, Martin von Zweigbergk <martinvonz@gmail.com>,
Jonathan Nieder <jrnieder@gmail.com>
Subject: Re: [PATCH 0/2] finding the fork point from reflog entries
Date: Thu, 24 Oct 2013 19:46:57 -0700 [thread overview]
Message-ID: <xmqqeh7akqxq.fsf@gitster.dls.corp.google.com> (raw)
In-Reply-To: <20131024214007.GE10779@serenity.lan> (John Keeping's message of "Thu, 24 Oct 2013 22:40:07 +0100")
John Keeping <john@keeping.me.uk> writes:
> To clarify: the particular commit in the calls above happens to be the
> oldest entry in the reflog, if I pick a newer entry then it works.
>
> It seems that for_each_reflog_ent isn't returning the oldest entry;
> revs.nr is 62 whereas "git rev-list -g origin/master | wc -l" gives 63.
Perhaps this on top.
One thing I somehow feel dirty about this change is that we have to
include diff.h only to include revision.h only to get the definition
of TMP_MARK. Perhaps object.h should be the header that defines the
bit assignment for objects.flags bit-field.
builtin/merge-base.c | 28 ++++++++++++++++++++++++----
1 file changed, 24 insertions(+), 4 deletions(-)
diff --git a/builtin/merge-base.c b/builtin/merge-base.c
index 7b9bc15..7fdc3de 100644
--- a/builtin/merge-base.c
+++ b/builtin/merge-base.c
@@ -2,6 +2,8 @@
#include "cache.h"
#include "commit.h"
#include "refs.h"
+#include "diff.h"
+#include "revision.h"
#include "parse-options.h"
static int show_merge_base(struct commit **rev, int rev_nr, int show_all)
@@ -91,18 +93,32 @@ struct rev_collect {
struct commit **commit;
int nr;
int alloc;
+ unsigned int initial : 1;
};
+static void add_one_commit(unsigned char *sha1, struct rev_collect *revs)
+{
+ struct commit *commit = lookup_commit(sha1);
+
+ if (!commit || (commit->object.flags & TMP_MARK))
+ return;
+
+ ALLOC_GROW(revs->commit, revs->nr + 1, revs->alloc);
+ revs->commit[revs->nr++] = commit;
+ commit->object.flags |= TMP_MARK;
+}
+
static int collect_one_reflog_ent(unsigned char *osha1, unsigned char *nsha1,
const char *ident, unsigned long timestamp,
int tz, const char *message, void *cbdata_)
{
struct rev_collect *revs = cbdata_;
- struct commit *commit = lookup_commit(nsha1);
- if (commit) {
- ALLOC_GROW(revs->commit, revs->nr + 1, revs->alloc);
- revs->commit[revs->nr++] = commit;
+
+ if (revs->initial) {
+ add_one_commit(osha1, revs);
+ revs->initial = 0;
}
+ add_one_commit(nsha1, revs);
return 0;
}
@@ -131,8 +147,12 @@ static int handle_reflog(int argc, const char **argv)
derived = lookup_commit_reference(sha1);
memset(&revs, 0, sizeof(revs));
+ revs.initial = 1;
for_each_reflog_ent(refname, collect_one_reflog_ent, &revs);
+ for (i = 0; i < revs.nr; i++)
+ revs.commit[i]->object.flags &= ~TMP_MARK;
+
bases = get_merge_bases_many(derived, revs.nr, revs.commit, 0);
/*
next prev parent reply other threads:[~2013-10-25 2:47 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-10-16 18:53 [PATCH] rebase: use reflog to find common base with upstream John Keeping
2013-10-16 19:24 ` Jonathan Nieder
2013-10-16 19:44 ` John Keeping
2013-10-21 5:03 ` Martin von Zweigbergk
2013-10-21 11:24 ` John Keeping
2013-10-22 6:24 ` Martin von Zweigbergk
2013-10-24 19:04 ` Junio C Hamano
2013-10-24 19:11 ` [PATCH 0/2] finding the fork point from reflog entries Junio C Hamano
2013-10-24 19:11 ` [PATCH 1/2] merge-base: use OPT_CMDMODE and clarify the command line parsing Junio C Hamano
2013-10-24 19:11 ` [PATCH 2/2] merge-base: "--reflog" mode finds fork point from reflog entries Junio C Hamano
2013-10-24 21:01 ` Eric Sunshine
2013-10-24 21:26 ` Junio C Hamano
2013-10-24 21:43 ` Eric Sunshine
2013-10-24 22:13 ` Junio C Hamano
2013-10-24 22:21 ` [PATCH v2 " Junio C Hamano
2013-10-25 7:12 ` Johannes Sixt
2013-10-25 8:09 ` John Keeping
2013-10-25 8:17 ` Johannes Sixt
2013-10-25 16:53 ` Junio C Hamano
2013-10-25 21:38 ` [PATCH v3 2/2] merge-base: teach "--fork-point" mode Junio C Hamano
2013-10-25 21:56 ` Eric Sunshine
2013-10-26 5:15 ` Martin von Zweigbergk
2013-10-28 14:47 ` Junio C Hamano
2013-10-26 9:00 ` John Keeping
2013-10-28 19:13 ` Junio C Hamano
2013-10-29 8:51 ` John Keeping
2013-10-29 20:11 ` Junio C Hamano
2013-10-24 20:54 ` [PATCH 0/2] finding the fork point from reflog entries John Keeping
2013-10-24 21:20 ` Junio C Hamano
2013-10-24 21:31 ` John Keeping
2013-10-24 21:40 ` John Keeping
2013-10-24 21:50 ` John Keeping
2013-10-25 2:46 ` Junio C Hamano [this message]
2013-10-22 5:40 ` [PATCH] rebase: use reflog to find common base with upstream Martin von Zweigbergk
2013-10-24 20:26 ` John Keeping
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=xmqqeh7akqxq.fsf@gitster.dls.corp.google.com \
--to=gitster@pobox.com \
--cc=git@vger.kernel.org \
--cc=john@keeping.me.uk \
--cc=jrnieder@gmail.com \
--cc=martinvonz@gmail.com \
/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.