To avoid creeping in the dependency of the_repository,
use GIT_NO_THE_REPOSITORY in the test to prove it still works.

Signed-off-by: Stefan Beller <sbel...@google.com>
---

This doesn't work yet, as we have not converted get_oid, yet.
It proves that GIT_NO_THE_REPOSITORY works, though.

Stefan

 builtin/merge-base.c  | 67 ++++++++++++++++++++++++++-----------------
 t/t6010-merge-base.sh |  3 +-
 2 files changed, 43 insertions(+), 27 deletions(-)

diff --git a/builtin/merge-base.c b/builtin/merge-base.c
index 1c92099070..29341f8839 100644
--- a/builtin/merge-base.c
+++ b/builtin/merge-base.c
@@ -1,3 +1,4 @@
+#define NO_THE_REPOSITORY_COMPATIBILITY_MACROS
 #include "builtin.h"
 #include "cache.h"
 #include "config.h"
@@ -37,27 +38,28 @@ static const char * const merge_base_usage[] = {
        NULL
 };
 
-static struct commit *get_commit_reference(const char *arg)
+static struct commit *get_commit_reference(struct repository *r,
+                                          const char *arg)
 {
        struct object_id revkey;
-       struct commit *r;
+       struct commit *ref;
 
        if (get_oid(arg, &revkey))
                die("Not a valid object name %s", arg);
-       r = lookup_commit_reference(the_repository, &revkey);
-       if (!r)
+       ref = lookup_commit_reference(r, &revkey);
+       if (!ref)
                die("Not a valid commit name %s", arg);
 
-       return r;
+       return ref;
 }
 
-static int handle_independent(int count, const char **args)
+static int handle_independent(struct repository *r, int count, const char 
**args)
 {
        struct commit_list *revs = NULL, *rev;
        int i;
 
        for (i = count - 1; i >= 0; i--)
-               commit_list_insert(get_commit_reference(args[i]), &revs);
+               commit_list_insert(get_commit_reference(r, args[i]), &revs);
 
        reduce_heads_replace(&revs);
 
@@ -71,14 +73,16 @@ static int handle_independent(int count, const char **args)
        return 0;
 }
 
-static int handle_octopus(int count, const char **args, int show_all)
+static int handle_octopus(struct repository *r,
+                         int count, const char **args,
+                         int show_all)
 {
        struct commit_list *revs = NULL;
        struct commit_list *result, *rev;
        int i;
 
        for (i = count - 1; i >= 0; i--)
-               commit_list_insert(get_commit_reference(args[i]), &revs);
+               commit_list_insert(get_commit_reference(r, args[i]), &revs);
 
        result = get_octopus_merge_bases(revs);
        free_commit_list(revs);
@@ -97,15 +101,15 @@ static int handle_octopus(int count, const char **args, 
int show_all)
        return 0;
 }
 
-static int handle_is_ancestor(int argc, const char **argv)
+static int handle_is_ancestor(struct repository *r, int argc, const char 
**argv)
 {
        struct commit *one, *two;
 
        if (argc != 2)
                die("--is-ancestor takes exactly two commits");
-       one = get_commit_reference(argv[0]);
-       two = get_commit_reference(argv[1]);
-       if (in_merge_bases(one, two))
+       one = get_commit_reference(r, argv[0]);
+       two = get_commit_reference(r, argv[1]);
+       if (repo_in_merge_bases(r, one, two))
                return 0;
        else
                return 1;
@@ -116,19 +120,22 @@ struct rev_collect {
        int nr;
        int alloc;
        unsigned int initial : 1;
+       struct repository *repo;
 };
 
-static void add_one_commit(struct object_id *oid, struct rev_collect *revs)
+static void add_one_commit(struct repository *r,
+                          struct object_id *oid,
+                          struct rev_collect *revs)
 {
        struct commit *commit;
 
        if (is_null_oid(oid))
                return;
 
-       commit = lookup_commit(the_repository, oid);
+       commit = lookup_commit(r, oid);
        if (!commit ||
            (commit->object.flags & TMP_MARK) ||
-           parse_commit(commit))
+           repo_parse_commit(r, commit))
                return;
 
        ALLOC_GROW(revs->commit, revs->nr + 1, revs->alloc);
@@ -144,13 +151,13 @@ static int collect_one_reflog_ent(struct object_id *ooid, 
struct object_id *noid
 
        if (revs->initial) {
                revs->initial = 0;
-               add_one_commit(ooid, revs);
+               add_one_commit(revs->repo, ooid, revs);
        }
-       add_one_commit(noid, revs);
+       add_one_commit(revs->repo, noid, revs);
        return 0;
 }
 
-static int handle_fork_point(int argc, const char **argv)
+static int handle_fork_point(struct repository *r, int argc, const char **argv)
 {
        struct object_id oid;
        char *refname;
@@ -173,13 +180,14 @@ static int handle_fork_point(int argc, const char **argv)
        if (get_oid(commitname, &oid))
                die("Not a valid object name: '%s'", commitname);
 
-       derived = lookup_commit_reference(the_repository, &oid);
+       derived = lookup_commit_reference(r, &oid);
        memset(&revs, 0, sizeof(revs));
        revs.initial = 1;
+       revs.repo = r;
        for_each_reflog_ent(refname, collect_one_reflog_ent, &revs);
 
        if (!revs.nr && !get_oid(refname, &oid))
-               add_one_commit(&oid, &revs);
+               add_one_commit(r, &oid, &revs);
 
        for (i = 0; i < revs.nr; i++)
                revs.commit[i]->object.flags &= ~TMP_MARK;
@@ -217,6 +225,7 @@ int cmd_merge_base(int argc, const char **argv, const char 
*prefix)
        int rev_nr = 0;
        int show_all = 0;
        int cmdmode = 0;
+       struct repository *r;
 
        struct option options[] = {
                OPT_BOOL('a', "all", &show_all, N_("output all common 
ancestors")),
@@ -234,27 +243,33 @@ int cmd_merge_base(int argc, const char **argv, const 
char *prefix)
        git_config(git_default_config, NULL);
        argc = parse_options(argc, argv, prefix, options, merge_base_usage, 0);
 
+       /*
+        * TODO: once the config machinery can cope without proper setup of
+        * the_repository, move this call up
+        */
+       r = get_the_repository();
+
        if (cmdmode == 'a') {
                if (argc < 2)
                        usage_with_options(merge_base_usage, options);
                if (show_all)
                        die("--is-ancestor cannot be used with --all");
-               return handle_is_ancestor(argc, argv);
+               return handle_is_ancestor(r, argc, argv);
        }
 
        if (cmdmode == 'r' && show_all)
                die("--independent cannot be used with --all");
 
        if (cmdmode == 'o')
-               return handle_octopus(argc, argv, show_all);
+               return handle_octopus(r, argc, argv, show_all);
 
        if (cmdmode == 'r')
-               return handle_independent(argc, argv);
+               return handle_independent(r, argc, argv);
 
        if (cmdmode == 'f') {
                if (argc < 1 || 2 < argc)
                        usage_with_options(merge_base_usage, options);
-               return handle_fork_point(argc, argv);
+               return handle_fork_point(r, argc, argv);
        }
 
        if (argc < 2)
@@ -262,6 +277,6 @@ int cmd_merge_base(int argc, const char **argv, const char 
*prefix)
 
        ALLOC_ARRAY(rev, argc);
        while (argc-- > 0)
-               rev[rev_nr++] = get_commit_reference(*argv++);
+               rev[rev_nr++] = get_commit_reference(r, *argv++);
        return show_merge_base(rev, rev_nr, show_all);
 }
diff --git a/t/t6010-merge-base.sh b/t/t6010-merge-base.sh
index 44c726ea39..ae1c85ee8d 100755
--- a/t/t6010-merge-base.sh
+++ b/t/t6010-merge-base.sh
@@ -15,7 +15,8 @@ GIT_COMMITTER_EMAIL=g...@comm.iter.xz
 GIT_COMMITTER_NAME='C O Mmiter'
 GIT_AUTHOR_NAME='A U Thor'
 GIT_AUTHOR_EMAIL=g...@au.thor.xz
-export GIT_COMMITTER_EMAIL GIT_COMMITTER_NAME GIT_AUTHOR_NAME GIT_AUTHOR_EMAIL
+GIT_NO_THE_REPOSITORY=1
+export GIT_COMMITTER_EMAIL GIT_COMMITTER_NAME GIT_AUTHOR_NAME GIT_AUTHOR_EMAIL 
GIT_NO_THE_REPOSITORY
 
 doit () {
        OFFSET=$1 &&
-- 
2.19.0

Reply via email to