Merge branch 'sb/more-repo-in-api'
authorJunio C Hamano <gitster@pobox.com>
Tue, 5 Feb 2019 22:26:09 +0000 (14:26 -0800)
committerJunio C Hamano <gitster@pobox.com>
Tue, 5 Feb 2019 22:26:09 +0000 (14:26 -0800)
The in-core repository instances are passed through more codepaths.

* sb/more-repo-in-api: (23 commits)
t/helper/test-repository: celebrate independence from the_repository
path.h: make REPO_GIT_PATH_FUNC repository agnostic
commit: prepare free_commit_buffer and release_commit_memory for any repo
commit-graph: convert remaining functions to handle any repo
submodule: don't add submodule as odb for push
submodule: use submodule repos for object lookup
pretty: prepare format_commit_message to handle arbitrary repositories
commit: prepare logmsg_reencode to handle arbitrary repositories
commit: prepare repo_unuse_commit_buffer to handle any repo
commit: prepare get_commit_buffer to handle any repo
commit-reach: prepare in_merge_bases[_many] to handle any repo
commit-reach: prepare get_merge_bases to handle any repo
commit-reach.c: allow get_merge_bases_many_0 to handle any repo
commit-reach.c: allow remove_redundant to handle any repo
commit-reach.c: allow merge_bases_many to handle any repo
commit-reach.c: allow paint_down_to_common to handle any repo
commit: allow parse_commit* to handle any repo
object: parse_object to honor its repository argument
object-store: prepare has_{sha1, object}_file to handle any repo
object-store: prepare read_object_file to deal with any repo
...

17 files changed:
1  2 
builtin/fsck.c
builtin/log.c
builtin/rev-list.c
commit-graph.c
commit-reach.c
commit-reach.h
commit.c
commit.h
object-store.h
object.c
packfile.c
packfile.h
pretty.c
pretty.h
sha1-file.c
streaming.c
submodule.c
diff --cc builtin/fsck.c
Simple merge
diff --cc builtin/log.c
Simple merge
Simple merge
diff --cc commit-graph.c
Simple merge
diff --cc commit-reach.c
Simple merge
diff --cc commit-reach.h
index fb8082a2ece94a94cf2f9a55ba95950caa41a914,a0d4a29d259ae8e4bc08463d848d28f5fa06728e..99a43e8b64fc803d7b7f4d09d11c2ec31fdb0a76
@@@ -1,29 -1,42 +1,43 @@@
 -#ifndef __COMMIT_REACH_H__
 -#define __COMMIT_REACH_H__
 +#ifndef COMMIT_REACH_H
 +#define COMMIT_REACH_H
  
 +#include "commit.h"
  #include "commit-slab.h"
  
 -struct commit;
  struct commit_list;
 -struct contains_cache;
  struct ref_filter;
 +struct object_id;
 +struct object_array;
  
- struct commit_list *get_merge_bases_many(struct commit *one,
-                                        int n,
-                                        struct commit **twos);
- struct commit_list *get_merge_bases_many_dirty(struct commit *one,
-                                              int n,
-                                              struct commit **twos);
- struct commit_list *get_merge_bases(struct commit *one, struct commit *two);
- struct commit_list *get_octopus_merge_bases(struct commit_list *in);
+ struct commit_list *repo_get_merge_bases(struct repository *r,
+                                        struct commit *rev1,
+                                        struct commit *rev2);
+ struct commit_list *repo_get_merge_bases_many(struct repository *r,
+                                             struct commit *one, int n,
+                                             struct commit **twos);
  /* To be used only when object flags after this call no longer matter */
- struct commit_list *get_merge_bases_many_dirty(struct commit *one, int n, struct commit **twos);
+ struct commit_list *repo_get_merge_bases_many_dirty(struct repository *r,
+                                                   struct commit *one, int n,
+                                                   struct commit **twos);
+ #ifndef NO_THE_REPOSITORY_COMPATIBILITY_MACROS
+ #define get_merge_bases(r1, r2)           repo_get_merge_bases(the_repository, r1, r2)
+ #define get_merge_bases_many(one, n, two) repo_get_merge_bases_many(the_repository, one, n, two)
+ #define get_merge_bases_many_dirty(one, n, twos) repo_get_merge_bases_many_dirty(the_repository, one, n, twos)
+ #endif
+ struct commit_list *get_octopus_merge_bases(struct commit_list *in);
  
  int is_descendant_of(struct commit *commit, struct commit_list *with_commit);
- int in_merge_bases_many(struct commit *commit, int nr_reference, struct commit **reference);
- int in_merge_bases(struct commit *commit, struct commit *reference);
+ int repo_in_merge_bases(struct repository *r,
+                       struct commit *commit,
+                       struct commit *reference);
+ int repo_in_merge_bases_many(struct repository *r,
+                            struct commit *commit,
+                            int nr_reference, struct commit **reference);
+ #ifndef NO_THE_REPOSITORY_COMPATIBILITY_MACROS
+ #define in_merge_bases(c1, c2) repo_in_merge_bases(the_repository, c1, c2)
+ #define in_merge_bases_many(c1, n, cs) repo_in_merge_bases_many(the_repository, c1, n, cs)
+ #endif
  
  /*
   * Takes a list of commits and returns a new list where those
diff --cc commit.c
Simple merge
diff --cc commit.h
Simple merge
diff --cc object-store.h
Simple merge
diff --cc object.c
Simple merge
diff --cc packfile.c
Simple merge
diff --cc packfile.h
Simple merge
diff --cc pretty.c
Simple merge
diff --cc pretty.h
Simple merge
diff --cc sha1-file.c
index 10f9e9936aa0a9e5285ac3efb41af3c939dd0ac7,e77273ccfd4bd5e840e99f1eb47af1fd8753e3c6..c8da9f34752c4d8f6518c8ed8c42164368e973a3
@@@ -1814,10 -1758,10 +1817,10 @@@ int force_object_loose(const struct obj
  
        if (has_loose_object(oid))
                return 0;
-       buf = read_object(oid->hash, &type, &len);
+       buf = read_object(the_repository, oid->hash, &type, &len);
        if (!buf)
                return error(_("cannot read sha1_file for %s"), oid_to_hex(oid));
 -      hdrlen = xsnprintf(hdr, sizeof(hdr), "%s %lu", type_name(type), len) + 1;
 +      hdrlen = xsnprintf(hdr, sizeof(hdr), "%s %"PRIuMAX , type_name(type), (uintmax_t)len) + 1;
        ret = write_loose_object(oid, hdr, hdrlen, buf, len, mtime);
        free(buf);
  
diff --cc streaming.c
Simple merge
diff --cc submodule.c
index 7b5cea8522edb9a2b12b46a7ba2055345b64da88,d9c06767a168cbe48906389a2c8af2879d9cf5eb..a5f2694a5f651a51b3012ce4a454e63698a7e0e7
@@@ -494,20 -482,46 +495,52 @@@ void prepare_submodule_repo_env(struct 
                         DEFAULT_GIT_DIR_ENVIRONMENT);
  }
  
- /* Helper function to display the submodule header line prior to the full
-  * summary output. If it can locate the submodule objects directory it will
-  * attempt to lookup both the left and right commits and put them into the
-  * left and right pointers.
 +static void prepare_submodule_repo_env_in_gitdir(struct argv_array *out)
 +{
 +      prepare_submodule_repo_env_no_git_dir(out);
 +      argv_array_pushf(out, "%s=.", GIT_DIR_ENVIRONMENT);
 +}
 +
+ /*
+  * Initialize a repository struct for a submodule based on the provided 'path'.
+  *
+  * Unlike repo_submodule_init, this tolerates submodules not present
+  * in .gitmodules. This function exists only to preserve historical behavior,
+  *
+  * Returns the repository struct on success,
+  * NULL when the submodule is not present.
   */
- static void show_submodule_header(struct diff_options *o, const char *path,
+ static struct repository *open_submodule(const char *path)
+ {
+       struct strbuf sb = STRBUF_INIT;
+       struct repository *out = xmalloc(sizeof(*out));
+       if (submodule_to_gitdir(&sb, path) || repo_init(out, sb.buf, NULL)) {
+               strbuf_release(&sb);
+               free(out);
+               return NULL;
+       }
+       /* Mark it as a submodule */
+       out->submodule_prefix = xstrdup(path);
+       strbuf_release(&sb);
+       return out;
+ }
+ /*
+  * Helper function to display the submodule header line prior to the full
+  * summary output.
+  *
+  * If it can locate the submodule git directory it will create a repository
+  * handle for the submodule and lookup both the left and right commits and
+  * put them into the left and right pointers.
+  */
+ static void show_submodule_header(struct diff_options *o,
+               const char *path,
                struct object_id *one, struct object_id *two,
                unsigned dirty_submodule,
+               struct repository *sub,
                struct commit **left, struct commit **right,
                struct commit_list **merge_bases)
  {