From: Junio C Hamano 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://git.lorimer.id.au/gitweb.git/diff_plain/b99a579f8e434a7757f90895945b5711b3f159d5 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) {