From: Junio C Hamano <gitster@pobox.com>
Date: Tue, 5 Feb 2019 22:26:09 +0000 (-0800)
Subject: Merge branch 'sb/more-repo-in-api'
X-Git-Tag: v2.21.0-rc0~56
X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b99a579f8e434a7757f90895945b5711b3f159d5;p=git

Merge branch 'sb/more-repo-in-api'

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
  ...
---

b99a579f8e434a7757f90895945b5711b3f159d5
diff --cc commit-reach.h
index fb8082a2ec,a0d4a29d25..99a43e8b64
--- a/commit-reach.h
+++ b/commit-reach.h
@@@ -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 sha1-file.c
index 10f9e9936a,e77273ccfd..c8da9f3475
--- a/sha1-file.c
+++ b/sha1-file.c
@@@ -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 submodule.c
index 7b5cea8522,d9c06767a1..a5f2694a5f
--- a/submodule.c
+++ b/submodule.c
@@@ -494,20 -482,46 +495,52 @@@ void prepare_submodule_repo_env(struct 
  			 DEFAULT_GIT_DIR_ENVIRONMENT);
  }
  
 +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);
 +}
 +
- /* 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.
+ /*
+  * 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)
  {