submodule: use submodule repos for object lookup
This converts the 'show_submodule_header' function to use the repository API properly, such that the submodule objects are not added to the main object store. Signed-off-by: Stefan Beller <sbeller@google.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
f54fbf5eef
commit
605f0ec135
75
submodule.c
75
submodule.c
@ -443,7 +443,7 @@ static int prepare_submodule_summary(struct rev_info *rev, const char *path,
|
|||||||
return prepare_revision_walk(rev);
|
return prepare_revision_walk(rev);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void print_submodule_summary(struct rev_info *rev, struct diff_options *o)
|
static void print_submodule_summary(struct repository *r, struct rev_info *rev, struct diff_options *o)
|
||||||
{
|
{
|
||||||
static const char format[] = " %m %s";
|
static const char format[] = " %m %s";
|
||||||
struct strbuf sb = STRBUF_INIT;
|
struct strbuf sb = STRBUF_INIT;
|
||||||
@ -454,7 +454,8 @@ static void print_submodule_summary(struct rev_info *rev, struct diff_options *o
|
|||||||
ctx.date_mode = rev->date_mode;
|
ctx.date_mode = rev->date_mode;
|
||||||
ctx.output_encoding = get_log_output_encoding();
|
ctx.output_encoding = get_log_output_encoding();
|
||||||
strbuf_setlen(&sb, 0);
|
strbuf_setlen(&sb, 0);
|
||||||
format_commit_message(commit, format, &sb, &ctx);
|
repo_format_commit_message(r, commit, format, &sb,
|
||||||
|
&ctx);
|
||||||
strbuf_addch(&sb, '\n');
|
strbuf_addch(&sb, '\n');
|
||||||
if (commit->object.flags & SYMMETRIC_LEFT)
|
if (commit->object.flags & SYMMETRIC_LEFT)
|
||||||
diff_emit_submodule_del(o, sb.buf);
|
diff_emit_submodule_del(o, sb.buf);
|
||||||
@ -481,14 +482,46 @@ void prepare_submodule_repo_env(struct argv_array *out)
|
|||||||
DEFAULT_GIT_DIR_ENVIRONMENT);
|
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
|
* Initialize a repository struct for a submodule based on the provided 'path'.
|
||||||
* attempt to lookup both the left and right commits and put them into the
|
*
|
||||||
* left and right pointers.
|
* 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,
|
struct object_id *one, struct object_id *two,
|
||||||
unsigned dirty_submodule,
|
unsigned dirty_submodule,
|
||||||
|
struct repository *sub,
|
||||||
struct commit **left, struct commit **right,
|
struct commit **left, struct commit **right,
|
||||||
struct commit_list **merge_bases)
|
struct commit_list **merge_bases)
|
||||||
{
|
{
|
||||||
@ -507,7 +540,7 @@ static void show_submodule_header(struct diff_options *o, const char *path,
|
|||||||
else if (is_null_oid(two))
|
else if (is_null_oid(two))
|
||||||
message = "(submodule deleted)";
|
message = "(submodule deleted)";
|
||||||
|
|
||||||
if (add_submodule_odb(path)) {
|
if (!sub) {
|
||||||
if (!message)
|
if (!message)
|
||||||
message = "(commits not present)";
|
message = "(commits not present)";
|
||||||
goto output_header;
|
goto output_header;
|
||||||
@ -517,8 +550,8 @@ static void show_submodule_header(struct diff_options *o, const char *path,
|
|||||||
* Attempt to lookup the commit references, and determine if this is
|
* Attempt to lookup the commit references, and determine if this is
|
||||||
* a fast forward or fast backwards update.
|
* a fast forward or fast backwards update.
|
||||||
*/
|
*/
|
||||||
*left = lookup_commit_reference(the_repository, one);
|
*left = lookup_commit_reference(sub, one);
|
||||||
*right = lookup_commit_reference(the_repository, two);
|
*right = lookup_commit_reference(sub, two);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Warn about missing commits in the submodule project, but only if
|
* Warn about missing commits in the submodule project, but only if
|
||||||
@ -528,7 +561,7 @@ static void show_submodule_header(struct diff_options *o, const char *path,
|
|||||||
(!is_null_oid(two) && !*right))
|
(!is_null_oid(two) && !*right))
|
||||||
message = "(commits not present)";
|
message = "(commits not present)";
|
||||||
|
|
||||||
*merge_bases = get_merge_bases(*left, *right);
|
*merge_bases = repo_get_merge_bases(sub, *left, *right);
|
||||||
if (*merge_bases) {
|
if (*merge_bases) {
|
||||||
if ((*merge_bases)->item == *left)
|
if ((*merge_bases)->item == *left)
|
||||||
fast_forward = 1;
|
fast_forward = 1;
|
||||||
@ -562,16 +595,18 @@ void show_submodule_summary(struct diff_options *o, const char *path,
|
|||||||
struct rev_info rev;
|
struct rev_info rev;
|
||||||
struct commit *left = NULL, *right = NULL;
|
struct commit *left = NULL, *right = NULL;
|
||||||
struct commit_list *merge_bases = NULL;
|
struct commit_list *merge_bases = NULL;
|
||||||
|
struct repository *sub;
|
||||||
|
|
||||||
|
sub = open_submodule(path);
|
||||||
show_submodule_header(o, path, one, two, dirty_submodule,
|
show_submodule_header(o, path, one, two, dirty_submodule,
|
||||||
&left, &right, &merge_bases);
|
sub, &left, &right, &merge_bases);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If we don't have both a left and a right pointer, there is no
|
* If we don't have both a left and a right pointer, there is no
|
||||||
* reason to try and display a summary. The header line should contain
|
* reason to try and display a summary. The header line should contain
|
||||||
* all the information the user needs.
|
* all the information the user needs.
|
||||||
*/
|
*/
|
||||||
if (!left || !right)
|
if (!left || !right || !sub)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
/* Treat revision walker failure the same as missing commits */
|
/* Treat revision walker failure the same as missing commits */
|
||||||
@ -580,13 +615,17 @@ void show_submodule_summary(struct diff_options *o, const char *path,
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
print_submodule_summary(&rev, o);
|
print_submodule_summary(sub, &rev, o);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
if (merge_bases)
|
if (merge_bases)
|
||||||
free_commit_list(merge_bases);
|
free_commit_list(merge_bases);
|
||||||
clear_commit_marks(left, ~0);
|
clear_commit_marks(left, ~0);
|
||||||
clear_commit_marks(right, ~0);
|
clear_commit_marks(right, ~0);
|
||||||
|
if (sub) {
|
||||||
|
repo_clear(sub);
|
||||||
|
free(sub);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void show_submodule_inline_diff(struct diff_options *o, const char *path,
|
void show_submodule_inline_diff(struct diff_options *o, const char *path,
|
||||||
@ -598,9 +637,11 @@ void show_submodule_inline_diff(struct diff_options *o, const char *path,
|
|||||||
struct commit_list *merge_bases = NULL;
|
struct commit_list *merge_bases = NULL;
|
||||||
struct child_process cp = CHILD_PROCESS_INIT;
|
struct child_process cp = CHILD_PROCESS_INIT;
|
||||||
struct strbuf sb = STRBUF_INIT;
|
struct strbuf sb = STRBUF_INIT;
|
||||||
|
struct repository *sub;
|
||||||
|
|
||||||
|
sub = open_submodule(path);
|
||||||
show_submodule_header(o, path, one, two, dirty_submodule,
|
show_submodule_header(o, path, one, two, dirty_submodule,
|
||||||
&left, &right, &merge_bases);
|
sub, &left, &right, &merge_bases);
|
||||||
|
|
||||||
/* We need a valid left and right commit to display a difference */
|
/* We need a valid left and right commit to display a difference */
|
||||||
if (!(left || is_null_oid(one)) ||
|
if (!(left || is_null_oid(one)) ||
|
||||||
@ -661,6 +702,10 @@ done:
|
|||||||
clear_commit_marks(left, ~0);
|
clear_commit_marks(left, ~0);
|
||||||
if (right)
|
if (right)
|
||||||
clear_commit_marks(right, ~0);
|
clear_commit_marks(right, ~0);
|
||||||
|
if (sub) {
|
||||||
|
repo_clear(sub);
|
||||||
|
free(sub);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int should_update_submodules(void)
|
int should_update_submodules(void)
|
||||||
|
Loading…
Reference in New Issue
Block a user