John Keeping <[email protected]> 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 [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html