Merge branch 'jk/diff-submodule-diff-inline'
The "git diff --submodule={short,log}" mechanism has been enhanced to allow "--submodule=diff" to show the patch between the submodule commits bound to the superproject. * jk/diff-submodule-diff-inline: diff: teach diff to display submodule difference with an inline diff submodule: refactor show_submodule_summary with helper function submodule: convert show_submodule_summary to use struct object_id * allow do_submodule_path to work even if submodule isn't checked out diff: prepare for additional submodule formats graph: add support for --line-prefix on all graph-aware output diff.c: remove output_prefix_length field cache: add empty_tree_oid object and helper function
This commit is contained in:
64
diff.c
64
diff.c
@ -18,6 +18,7 @@
|
||||
#include "ll-merge.h"
|
||||
#include "string-list.h"
|
||||
#include "argv-array.h"
|
||||
#include "graph.h"
|
||||
|
||||
#ifdef NO_FAST_WORKING_DIRECTORY
|
||||
#define FAST_WORKING_DIRECTORY 0
|
||||
@ -131,9 +132,11 @@ static int parse_dirstat_params(struct diff_options *options, const char *params
|
||||
static int parse_submodule_params(struct diff_options *options, const char *value)
|
||||
{
|
||||
if (!strcmp(value, "log"))
|
||||
DIFF_OPT_SET(options, SUBMODULE_LOG);
|
||||
options->submodule_format = DIFF_SUBMODULE_LOG;
|
||||
else if (!strcmp(value, "short"))
|
||||
DIFF_OPT_CLR(options, SUBMODULE_LOG);
|
||||
options->submodule_format = DIFF_SUBMODULE_SHORT;
|
||||
else if (!strcmp(value, "diff"))
|
||||
options->submodule_format = DIFF_SUBMODULE_INLINE_DIFF;
|
||||
else
|
||||
return -1;
|
||||
return 0;
|
||||
@ -1625,7 +1628,7 @@ static void show_stats(struct diffstat_t *data, struct diff_options *options)
|
||||
*/
|
||||
|
||||
if (options->stat_width == -1)
|
||||
width = term_columns() - options->output_prefix_length;
|
||||
width = term_columns() - strlen(line_prefix);
|
||||
else
|
||||
width = options->stat_width ? options->stat_width : 80;
|
||||
number_width = decimal_width(max_change) > number_width ?
|
||||
@ -2299,24 +2302,6 @@ static void builtin_diff(const char *name_a,
|
||||
struct strbuf header = STRBUF_INIT;
|
||||
const char *line_prefix = diff_line_prefix(o);
|
||||
|
||||
if (DIFF_OPT_TST(o, SUBMODULE_LOG) &&
|
||||
(!one->mode || S_ISGITLINK(one->mode)) &&
|
||||
(!two->mode || S_ISGITLINK(two->mode))) {
|
||||
const char *del = diff_get_color_opt(o, DIFF_FILE_OLD);
|
||||
const char *add = diff_get_color_opt(o, DIFF_FILE_NEW);
|
||||
show_submodule_summary(o->file, one->path ? one->path : two->path,
|
||||
line_prefix,
|
||||
one->oid.hash, two->oid.hash,
|
||||
two->dirty_submodule,
|
||||
meta, del, add, reset);
|
||||
return;
|
||||
}
|
||||
|
||||
if (DIFF_OPT_TST(o, ALLOW_TEXTCONV)) {
|
||||
textconv_one = get_textconv(one);
|
||||
textconv_two = get_textconv(two);
|
||||
}
|
||||
|
||||
diff_set_mnemonic_prefix(o, "a/", "b/");
|
||||
if (DIFF_OPT_TST(o, REVERSE_DIFF)) {
|
||||
a_prefix = o->b_prefix;
|
||||
@ -2326,6 +2311,35 @@ static void builtin_diff(const char *name_a,
|
||||
b_prefix = o->b_prefix;
|
||||
}
|
||||
|
||||
if (o->submodule_format == DIFF_SUBMODULE_LOG &&
|
||||
(!one->mode || S_ISGITLINK(one->mode)) &&
|
||||
(!two->mode || S_ISGITLINK(two->mode))) {
|
||||
const char *del = diff_get_color_opt(o, DIFF_FILE_OLD);
|
||||
const char *add = diff_get_color_opt(o, DIFF_FILE_NEW);
|
||||
show_submodule_summary(o->file, one->path ? one->path : two->path,
|
||||
line_prefix,
|
||||
&one->oid, &two->oid,
|
||||
two->dirty_submodule,
|
||||
meta, del, add, reset);
|
||||
return;
|
||||
} else if (o->submodule_format == DIFF_SUBMODULE_INLINE_DIFF &&
|
||||
(!one->mode || S_ISGITLINK(one->mode)) &&
|
||||
(!two->mode || S_ISGITLINK(two->mode))) {
|
||||
const char *del = diff_get_color_opt(o, DIFF_FILE_OLD);
|
||||
const char *add = diff_get_color_opt(o, DIFF_FILE_NEW);
|
||||
show_submodule_inline_diff(o->file, one->path ? one->path : two->path,
|
||||
line_prefix,
|
||||
&one->oid, &two->oid,
|
||||
two->dirty_submodule,
|
||||
meta, del, add, reset, o);
|
||||
return;
|
||||
}
|
||||
|
||||
if (DIFF_OPT_TST(o, ALLOW_TEXTCONV)) {
|
||||
textconv_one = get_textconv(one);
|
||||
textconv_two = get_textconv(two);
|
||||
}
|
||||
|
||||
/* Never use a non-valid filename anywhere if at all possible */
|
||||
name_a = DIFF_FILE_VALID(one) ? name_a : name_b;
|
||||
name_b = DIFF_FILE_VALID(two) ? name_b : name_a;
|
||||
@ -3915,7 +3929,7 @@ int diff_opt_parse(struct diff_options *options,
|
||||
DIFF_OPT_SET(options, OVERRIDE_SUBMODULE_CONFIG);
|
||||
handle_ignore_submodules_arg(options, arg);
|
||||
} else if (!strcmp(arg, "--submodule"))
|
||||
DIFF_OPT_SET(options, SUBMODULE_LOG);
|
||||
options->submodule_format = DIFF_SUBMODULE_LOG;
|
||||
else if (skip_prefix(arg, "--submodule=", &arg))
|
||||
return parse_submodule_opt(options, arg);
|
||||
else if (skip_prefix(arg, "--ws-error-highlight=", &arg))
|
||||
@ -3966,6 +3980,12 @@ int diff_opt_parse(struct diff_options *options,
|
||||
options->a_prefix = optarg;
|
||||
return argcount;
|
||||
}
|
||||
else if ((argcount = parse_long_opt("line-prefix", av, &optarg))) {
|
||||
options->line_prefix = optarg;
|
||||
options->line_prefix_length = strlen(options->line_prefix);
|
||||
graph_setup_line_prefix(options);
|
||||
return argcount;
|
||||
}
|
||||
else if ((argcount = parse_long_opt("dst-prefix", av, &optarg))) {
|
||||
options->b_prefix = optarg;
|
||||
return argcount;
|
||||
|
Reference in New Issue
Block a user