John Keeping <j...@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);
 
        /*
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to