-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add the --submodule option to the diff option family
When you use the option --submodule=log you can see the submodule summaries inlined in the diff, instead of not-quite-helpful SHA-1 pairs. The format imitates what "git submodule summary" shows. To do that, <path>/.git/objects/ is added to the alternate object databases (if that directory exists). This option was requested by Jens Lehmann at the GitTogether in Berlin. Signed-off-by: Johannes Schindelin <[email protected]> Signed-off-by: Jens Lehmann <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
- Loading branch information
Showing
6 changed files
with
151 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,113 @@ | ||
#include "cache.h" | ||
#include "submodule.h" | ||
#include "dir.h" | ||
#include "diff.h" | ||
#include "commit.h" | ||
#include "revision.h" | ||
|
||
int add_submodule_odb(const char *path) | ||
{ | ||
struct strbuf objects_directory = STRBUF_INIT; | ||
struct alternate_object_database *alt_odb; | ||
|
||
strbuf_addf(&objects_directory, "%s/.git/objects/", path); | ||
if (!is_directory(objects_directory.buf)) | ||
return -1; | ||
|
||
/* avoid adding it twice */ | ||
for (alt_odb = alt_odb_list; alt_odb; alt_odb = alt_odb->next) | ||
if (alt_odb->name - alt_odb->base == objects_directory.len && | ||
!strncmp(alt_odb->base, objects_directory.buf, | ||
objects_directory.len)) | ||
return 0; | ||
|
||
alt_odb = xmalloc(objects_directory.len + 42 + sizeof(*alt_odb)); | ||
alt_odb->next = alt_odb_list; | ||
strcpy(alt_odb->base, objects_directory.buf); | ||
alt_odb->name = alt_odb->base + objects_directory.len; | ||
alt_odb->name[2] = '/'; | ||
alt_odb->name[40] = '\0'; | ||
alt_odb->name[41] = '\0'; | ||
alt_odb_list = alt_odb; | ||
prepare_alt_odb(); | ||
return 0; | ||
} | ||
|
||
void show_submodule_summary(FILE *f, const char *path, | ||
unsigned char one[20], unsigned char two[20], | ||
const char *del, const char *add, const char *reset) | ||
{ | ||
struct rev_info rev; | ||
struct commit *commit, *left = left, *right; | ||
struct commit_list *merge_bases, *list; | ||
const char *message = NULL; | ||
struct strbuf sb = STRBUF_INIT; | ||
static const char *format = " %m %s"; | ||
int fast_forward = 0, fast_backward = 0; | ||
|
||
if (is_null_sha1(two)) | ||
message = "(submodule deleted)"; | ||
else if (add_submodule_odb(path)) | ||
message = "(not checked out)"; | ||
else if (is_null_sha1(one)) | ||
message = "(new submodule)"; | ||
else if (!(left = lookup_commit_reference(one)) || | ||
!(right = lookup_commit_reference(two))) | ||
message = "(commits not present)"; | ||
|
||
if (!message) { | ||
init_revisions(&rev, NULL); | ||
setup_revisions(0, NULL, &rev, NULL); | ||
rev.left_right = 1; | ||
rev.first_parent_only = 1; | ||
left->object.flags |= SYMMETRIC_LEFT; | ||
add_pending_object(&rev, &left->object, path); | ||
add_pending_object(&rev, &right->object, path); | ||
merge_bases = get_merge_bases(left, right, 1); | ||
if (merge_bases) { | ||
if (merge_bases->item == left) | ||
fast_forward = 1; | ||
else if (merge_bases->item == right) | ||
fast_backward = 1; | ||
} | ||
for (list = merge_bases; list; list = list->next) { | ||
list->item->object.flags |= UNINTERESTING; | ||
add_pending_object(&rev, &list->item->object, | ||
sha1_to_hex(list->item->object.sha1)); | ||
} | ||
if (prepare_revision_walk(&rev)) | ||
message = "(revision walker failed)"; | ||
} | ||
|
||
strbuf_addf(&sb, "Submodule %s %s..", path, | ||
find_unique_abbrev(one, DEFAULT_ABBREV)); | ||
if (!fast_backward && !fast_forward) | ||
strbuf_addch(&sb, '.'); | ||
strbuf_addf(&sb, "%s", find_unique_abbrev(two, DEFAULT_ABBREV)); | ||
if (message) | ||
strbuf_addf(&sb, " %s\n", message); | ||
else | ||
strbuf_addf(&sb, "%s:\n", fast_backward ? " (rewind)" : ""); | ||
fwrite(sb.buf, sb.len, 1, f); | ||
|
||
if (!message) { | ||
while ((commit = get_revision(&rev))) { | ||
strbuf_setlen(&sb, 0); | ||
if (commit->object.flags & SYMMETRIC_LEFT) { | ||
if (del) | ||
strbuf_addstr(&sb, del); | ||
} | ||
else if (add) | ||
strbuf_addstr(&sb, add); | ||
format_commit_message(commit, format, &sb, | ||
rev.date_mode); | ||
if (reset) | ||
strbuf_addstr(&sb, reset); | ||
strbuf_addch(&sb, '\n'); | ||
fprintf(f, "%s", sb.buf); | ||
} | ||
clear_commit_marks(left, ~0); | ||
clear_commit_marks(right, ~0); | ||
} | ||
strbuf_release(&sb); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
#ifndef SUBMODULE_H | ||
#define SUBMODULE_H | ||
|
||
void show_submodule_summary(FILE *f, const char *path, | ||
unsigned char one[20], unsigned char two[20], | ||
const char *del, const char *add, const char *reset); | ||
|
||
#endif |