From c6744349df5089133b7662e67aba28282b6a963f Mon Sep 17 00:00:00 2001 From: Timo Hirvonen Date: Sat, 24 Jun 2006 20:21:53 +0300 Subject: Merge with_raw, with_stat and summary variables to output_format DIFF_FORMAT_* are now bit-flags instead of enumerated values. Signed-off-by: Timo Hirvonen Signed-off-by: Junio C Hamano --- diff.c | 183 +++++++++++++++++++++++++++++++---------------------------------- 1 file changed, 88 insertions(+), 95 deletions(-) (limited to 'diff.c') diff --git a/diff.c b/diff.c index fbb6c26cd9..49b2eeb741 100644 --- a/diff.c +++ b/diff.c @@ -1438,23 +1438,27 @@ int diff_setup_done(struct diff_options *options) (0 <= options->rename_limit && !options->detect_rename)) return -1; + if (options->output_format & DIFF_FORMAT_NO_OUTPUT) + options->output_format = 0; + + if (options->output_format & (DIFF_FORMAT_NAME | + DIFF_FORMAT_NAME_STATUS | + DIFF_FORMAT_CHECKDIFF | + DIFF_FORMAT_NO_OUTPUT)) + options->output_format &= ~(DIFF_FORMAT_RAW | + DIFF_FORMAT_DIFFSTAT | + DIFF_FORMAT_SUMMARY | + DIFF_FORMAT_PATCH); + /* * These cases always need recursive; we do not drop caller-supplied * recursive bits for other formats here. */ - if ((options->output_format == DIFF_FORMAT_PATCH) || - (options->output_format == DIFF_FORMAT_DIFFSTAT) || - (options->output_format == DIFF_FORMAT_CHECKDIFF)) + if (options->output_format & (DIFF_FORMAT_PATCH | + DIFF_FORMAT_DIFFSTAT | + DIFF_FORMAT_CHECKDIFF)) options->recursive = 1; - /* - * These combinations do not make sense. - */ - if (options->output_format == DIFF_FORMAT_RAW) - options->with_raw = 0; - if (options->output_format == DIFF_FORMAT_DIFFSTAT) - options->with_stat = 0; - if (options->detect_rename && options->rename_limit < 0) options->rename_limit = diff_rename_limit_default; if (options->setup & DIFF_SETUP_USE_CACHE) { @@ -1526,22 +1530,20 @@ int diff_opt_parse(struct diff_options *options, const char **av, int ac) { const char *arg = av[0]; if (!strcmp(arg, "-p") || !strcmp(arg, "-u")) - options->output_format = DIFF_FORMAT_PATCH; + options->output_format |= DIFF_FORMAT_PATCH; else if (opt_arg(arg, 'U', "unified", &options->context)) - options->output_format = DIFF_FORMAT_PATCH; + options->output_format |= DIFF_FORMAT_PATCH; else if (!strcmp(arg, "--patch-with-raw")) { - options->output_format = DIFF_FORMAT_PATCH; - options->with_raw = 1; + options->output_format |= DIFF_FORMAT_PATCH | DIFF_FORMAT_RAW; } else if (!strcmp(arg, "--stat")) - options->output_format = DIFF_FORMAT_DIFFSTAT; + options->output_format |= DIFF_FORMAT_DIFFSTAT; else if (!strcmp(arg, "--check")) - options->output_format = DIFF_FORMAT_CHECKDIFF; + options->output_format |= DIFF_FORMAT_CHECKDIFF; else if (!strcmp(arg, "--summary")) - options->summary = 1; + options->output_format |= DIFF_FORMAT_SUMMARY; else if (!strcmp(arg, "--patch-with-stat")) { - options->output_format = DIFF_FORMAT_PATCH; - options->with_stat = 1; + options->output_format |= DIFF_FORMAT_PATCH | DIFF_FORMAT_DIFFSTAT; } else if (!strcmp(arg, "-z")) options->line_termination = 0; @@ -1550,19 +1552,20 @@ int diff_opt_parse(struct diff_options *options, const char **av, int ac) else if (!strcmp(arg, "--full-index")) options->full_index = 1; else if (!strcmp(arg, "--binary")) { - options->output_format = DIFF_FORMAT_PATCH; + options->output_format |= DIFF_FORMAT_PATCH; options->full_index = options->binary = 1; } else if (!strcmp(arg, "--name-only")) - options->output_format = DIFF_FORMAT_NAME; + options->output_format |= DIFF_FORMAT_NAME; else if (!strcmp(arg, "--name-status")) - options->output_format = DIFF_FORMAT_NAME_STATUS; + options->output_format |= DIFF_FORMAT_NAME_STATUS; else if (!strcmp(arg, "-R")) options->reverse_diff = 1; else if (!strncmp(arg, "-S", 2)) options->pickaxe = arg + 2; - else if (!strcmp(arg, "-s")) - options->output_format = DIFF_FORMAT_NO_OUTPUT; + else if (!strcmp(arg, "-s")) { + options->output_format |= DIFF_FORMAT_NO_OUTPUT; + } else if (!strncmp(arg, "-O", 2)) options->orderfile = arg + 2; else if (!strncmp(arg, "--diff-filter=", 14)) @@ -1737,15 +1740,17 @@ const char *diff_unique_abbrev(const unsigned char *sha1, int len) } static void diff_flush_raw(struct diff_filepair *p, - int line_termination, - int inter_name_termination, - struct diff_options *options, - int output_format) + struct diff_options *options) { int two_paths; char status[10]; int abbrev = options->abbrev; const char *path_one, *path_two; + int inter_name_termination = '\t'; + int line_termination = options->line_termination; + + if (!line_termination) + inter_name_termination = 0; path_one = p->one->path; path_two = p->two->path; @@ -1774,7 +1779,7 @@ static void diff_flush_raw(struct diff_filepair *p, two_paths = 0; break; } - if (output_format != DIFF_FORMAT_NAME_STATUS) { + if (!(options->output_format & DIFF_FORMAT_NAME_STATUS)) { printf(":%06o %06o %s ", p->one->mode, p->two->mode, diff_unique_abbrev(p->one->sha1, abbrev)); @@ -1983,48 +1988,30 @@ static void diff_resolve_rename_copy(void) diff_debug_queue("resolve-rename-copy done", q); } -static void flush_one_pair(struct diff_filepair *p, - int diff_output_format, - struct diff_options *options, - struct diffstat_t *diffstat) +static int check_pair_status(struct diff_filepair *p) { - int inter_name_termination = '\t'; - int line_termination = options->line_termination; - if (!line_termination) - inter_name_termination = 0; - switch (p->status) { case DIFF_STATUS_UNKNOWN: - break; + return 0; case 0: die("internal error in diff-resolve-rename-copy"); - break; default: - switch (diff_output_format) { - case DIFF_FORMAT_DIFFSTAT: - diff_flush_stat(p, options, diffstat); - break; - case DIFF_FORMAT_CHECKDIFF: - diff_flush_checkdiff(p, options); - break; - case DIFF_FORMAT_PATCH: - diff_flush_patch(p, options); - break; - case DIFF_FORMAT_RAW: - case DIFF_FORMAT_NAME_STATUS: - diff_flush_raw(p, line_termination, - inter_name_termination, - options, diff_output_format); - break; - case DIFF_FORMAT_NAME: - diff_flush_name(p, line_termination); - break; - case DIFF_FORMAT_NO_OUTPUT: - break; - } + return 1; } } +static void flush_one_pair(struct diff_filepair *p, struct diff_options *opt) +{ + int fmt = opt->output_format; + + if (fmt & DIFF_FORMAT_CHECKDIFF) + diff_flush_checkdiff(p, opt); + else if (fmt & (DIFF_FORMAT_RAW | DIFF_FORMAT_NAME_STATUS)) + diff_flush_raw(p, opt); + else if (fmt & DIFF_FORMAT_NAME) + diff_flush_name(p, opt->line_termination); +} + static void show_file_mode_name(const char *newdelete, struct diff_filespec *fs) { if (fs->mode) @@ -2107,55 +2094,61 @@ static void diff_summary(struct diff_filepair *p) void diff_flush(struct diff_options *options) { struct diff_queue_struct *q = &diff_queued_diff; - int i; - int diff_output_format = options->output_format; - struct diffstat_t *diffstat = NULL; + int i, output_format = options->output_format; - if (diff_output_format == DIFF_FORMAT_DIFFSTAT || options->with_stat) { - diffstat = xcalloc(sizeof (struct diffstat_t), 1); - diffstat->xm.consume = diffstat_consume; - } + /* + * Order: raw, stat, summary, patch + * or: name/name-status/checkdiff (other bits clear) + */ - if (options->with_raw) { + if (output_format & (DIFF_FORMAT_RAW | + DIFF_FORMAT_NAME | + DIFF_FORMAT_NAME_STATUS | + DIFF_FORMAT_CHECKDIFF)) { for (i = 0; i < q->nr; i++) { struct diff_filepair *p = q->queue[i]; - flush_one_pair(p, DIFF_FORMAT_RAW, options, NULL); + if (check_pair_status(p)) + flush_one_pair(p, options); } - putchar(options->line_termination); } - if (options->with_stat) { + + if (output_format & DIFF_FORMAT_DIFFSTAT) { + struct diffstat_t *diffstat; + + diffstat = xcalloc(sizeof (struct diffstat_t), 1); + diffstat->xm.consume = diffstat_consume; for (i = 0; i < q->nr; i++) { struct diff_filepair *p = q->queue[i]; - flush_one_pair(p, DIFF_FORMAT_DIFFSTAT, options, - diffstat); + if (check_pair_status(p)) + diff_flush_stat(p, options, diffstat); } show_stats(diffstat); free(diffstat); - diffstat = NULL; - if (options->summary) - for (i = 0; i < q->nr; i++) - diff_summary(q->queue[i]); - if (options->stat_sep) - fputs(options->stat_sep, stdout); - else - putchar(options->line_termination); - } - for (i = 0; i < q->nr; i++) { - struct diff_filepair *p = q->queue[i]; - flush_one_pair(p, diff_output_format, options, diffstat); } - if (diffstat) { - show_stats(diffstat); - free(diffstat); + if (output_format & DIFF_FORMAT_SUMMARY) { + for (i = 0; i < q->nr; i++) + diff_summary(q->queue[i]); } - for (i = 0; i < q->nr; i++) { - if (diffstat && options->summary) - diff_summary(q->queue[i]); - diff_free_filepair(q->queue[i]); + if (output_format & DIFF_FORMAT_PATCH) { + if (output_format & (DIFF_FORMAT_DIFFSTAT | + DIFF_FORMAT_SUMMARY)) { + if (options->stat_sep) + fputs(options->stat_sep, stdout); + else + putchar(options->line_termination); + } + + for (i = 0; i < q->nr; i++) { + struct diff_filepair *p = q->queue[i]; + if (check_pair_status(p)) + diff_flush_patch(p, options); + } } + for (i = 0; i < q->nr; i++) + diff_free_filepair(q->queue[i]); free(q->queue); q->queue = NULL; q->nr = q->alloc = 0; -- cgit v1.3 From a610786f4bc282410d348aba97316115a57740a0 Mon Sep 17 00:00:00 2001 From: Timo Hirvonen Date: Sat, 24 Jun 2006 20:23:06 +0300 Subject: Make --raw option available for all diff commands Signed-off-by: Timo Hirvonen Signed-off-by: Junio C Hamano --- builtin-diff.c | 48 ++++++++++++------------------------------------ diff.c | 2 ++ 2 files changed, 14 insertions(+), 36 deletions(-) (limited to 'diff.c') diff --git a/builtin-diff.c b/builtin-diff.c index 3b44296ff4..91235a118a 100644 --- a/builtin-diff.c +++ b/builtin-diff.c @@ -39,8 +39,6 @@ static int builtin_diff_files(struct rev_info *revs, revs->max_count = 3; else if (!strcmp(arg, "-q")) silent = 1; - else if (!strcmp(arg, "--raw")) - revs->diffopt.output_format = DIFF_FORMAT_RAW; else usage(builtin_diff_usage); argv++; argc--; @@ -107,14 +105,9 @@ static int builtin_diff_b_f(struct rev_info *revs, /* Blob vs file in the working tree*/ struct stat st; - while (1 < argc) { - const char *arg = argv[1]; - if (!strcmp(arg, "--raw")) - revs->diffopt.output_format = DIFF_FORMAT_RAW; - else - usage(builtin_diff_usage); - argv++; argc--; - } + if (argc > 1) + usage(builtin_diff_usage); + if (lstat(path, &st)) die("'%s': %s", path, strerror(errno)); if (!(S_ISREG(st.st_mode) || S_ISLNK(st.st_mode))) @@ -137,14 +130,9 @@ static int builtin_diff_blobs(struct rev_info *revs, */ unsigned mode = canon_mode(S_IFREG | 0644); - while (1 < argc) { - const char *arg = argv[1]; - if (!strcmp(arg, "--raw")) - revs->diffopt.output_format = DIFF_FORMAT_RAW; - else - usage(builtin_diff_usage); - argv++; argc--; - } + if (argc > 1) + usage(builtin_diff_usage); + stuff_change(&revs->diffopt, mode, mode, blob[1].sha1, blob[0].sha1, @@ -162,8 +150,6 @@ static int builtin_diff_index(struct rev_info *revs, const char *arg = argv[1]; if (!strcmp(arg, "--cached")) cached = 1; - else if (!strcmp(arg, "--raw")) - revs->diffopt.output_format = DIFF_FORMAT_RAW; else usage(builtin_diff_usage); argv++; argc--; @@ -185,14 +171,9 @@ static int builtin_diff_tree(struct rev_info *revs, { const unsigned char *(sha1[2]); int swap = 0; - while (1 < argc) { - const char *arg = argv[1]; - if (!strcmp(arg, "--raw")) - revs->diffopt.output_format = DIFF_FORMAT_RAW; - else - usage(builtin_diff_usage); - argv++; argc--; - } + + if (argc > 1) + usage(builtin_diff_usage); /* We saw two trees, ent[0] and ent[1]. * if ent[1] is unintesting, they are swapped @@ -214,14 +195,9 @@ static int builtin_diff_combined(struct rev_info *revs, const unsigned char (*parent)[20]; int i; - while (1 < argc) { - const char *arg = argv[1]; - if (!strcmp(arg, "--raw")) - revs->diffopt.output_format = DIFF_FORMAT_RAW; - else - usage(builtin_diff_usage); - argv++; argc--; - } + if (argc > 1) + usage(builtin_diff_usage); + if (!revs->dense_combined_merges && !revs->combine_merges) revs->dense_combined_merges = revs->combine_merges = 1; parent = xmalloc(ents * sizeof(*parent)); diff --git a/diff.c b/diff.c index 49b2eeb741..12f655a2fa 100644 --- a/diff.c +++ b/diff.c @@ -1533,6 +1533,8 @@ int diff_opt_parse(struct diff_options *options, const char **av, int ac) options->output_format |= DIFF_FORMAT_PATCH; else if (opt_arg(arg, 'U', "unified", &options->context)) options->output_format |= DIFF_FORMAT_PATCH; + else if (!strcmp(arg, "--raw")) + options->output_format |= DIFF_FORMAT_RAW; else if (!strcmp(arg, "--patch-with-raw")) { options->output_format |= DIFF_FORMAT_PATCH | DIFF_FORMAT_RAW; } -- cgit v1.3 From c9b5ef998a3027d9f11b0820bb13896096833ccb Mon Sep 17 00:00:00 2001 From: Timo Hirvonen Date: Sat, 24 Jun 2006 20:24:14 +0300 Subject: Set default diff output format after parsing command line Initialize output_format to 0 instead of DIFF_FORMAT_RAW so that we can see later if any command line options changed it. Default value is set only if output format was not specified. Signed-off-by: Timo Hirvonen Signed-off-by: Junio C Hamano --- builtin-diff-files.c | 3 +++ builtin-diff-index.c | 3 +++ builtin-diff-stages.c | 3 +++ builtin-diff-tree.c | 3 +++ builtin-diff.c | 4 +++- builtin-log.c | 4 +++- diff.c | 1 - 7 files changed, 18 insertions(+), 3 deletions(-) (limited to 'diff.c') diff --git a/builtin-diff-files.c b/builtin-diff-files.c index 5afc1d7208..a655eea91e 100644 --- a/builtin-diff-files.c +++ b/builtin-diff-files.c @@ -36,6 +36,9 @@ int cmd_diff_files(int argc, const char **argv, char **envp) usage(diff_files_usage); argv++; argc--; } + if (!rev.diffopt.output_format) + rev.diffopt.output_format = DIFF_FORMAT_RAW; + /* * Make sure there are NO revision (i.e. pending object) parameter, * rev.max_count is reasonable (0 <= n <= 3), diff --git a/builtin-diff-index.c b/builtin-diff-index.c index c42ef9a7a7..b37c9e8ccb 100644 --- a/builtin-diff-index.c +++ b/builtin-diff-index.c @@ -28,6 +28,9 @@ int cmd_diff_index(int argc, const char **argv, char **envp) else usage(diff_cache_usage); } + if (!rev.diffopt.output_format) + rev.diffopt.output_format = DIFF_FORMAT_RAW; + /* * Make sure there is one revision (i.e. pending object), * and there is no revision filtering parameters. diff --git a/builtin-diff-stages.c b/builtin-diff-stages.c index 7c157ca889..30931fe049 100644 --- a/builtin-diff-stages.c +++ b/builtin-diff-stages.c @@ -85,6 +85,9 @@ int cmd_diff_stages(int ac, const char **av, char **envp) ac--; av++; } + if (!diff_options.output_format) + diff_options.output_format = DIFF_FORMAT_RAW; + if (ac < 3 || sscanf(av[1], "%d", &stage1) != 1 || ! (0 <= stage1 && stage1 <= 3) || diff --git a/builtin-diff-tree.c b/builtin-diff-tree.c index 3409a39a9f..ae1cde9d00 100644 --- a/builtin-diff-tree.c +++ b/builtin-diff-tree.c @@ -84,6 +84,9 @@ int cmd_diff_tree(int argc, const char **argv, char **envp) usage(diff_tree_usage); } + if (!opt->diffopt.output_format) + opt->diffopt.output_format = DIFF_FORMAT_RAW; + /* * NOTE! We expect "a ^b" to be equal to "a..b", so we * reverse the order of the objects if the second one diff --git a/builtin-diff.c b/builtin-diff.c index 91235a118a..47e0a37e21 100644 --- a/builtin-diff.c +++ b/builtin-diff.c @@ -252,9 +252,11 @@ int cmd_diff(int argc, const char **argv, char **envp) git_config(git_diff_config); init_revisions(&rev); - rev.diffopt.output_format = DIFF_FORMAT_PATCH; argc = setup_revisions(argc, argv, &rev, NULL); + if (!rev.diffopt.output_format) + rev.diffopt.output_format = DIFF_FORMAT_PATCH; + /* Do we have --cached and not have a pending object, then * default to HEAD by hand. Eek. */ diff --git a/builtin-log.c b/builtin-log.c index e321959c56..c1bf9d4ee1 100644 --- a/builtin-log.c +++ b/builtin-log.c @@ -178,7 +178,6 @@ int cmd_format_patch(int argc, const char **argv, char **envp) rev.diff = 1; rev.combine_merges = 0; rev.ignore_merges = 1; - rev.diffopt.output_format = DIFF_FORMAT_DIFFSTAT | DIFF_FORMAT_PATCH; git_config(git_format_config); rev.extra_headers = extra_headers; @@ -247,6 +246,9 @@ int cmd_format_patch(int argc, const char **argv, char **envp) if (argc > 1) die ("unrecognized argument: %s", argv[1]); + if (!rev.diffopt.output_format) + rev.diffopt.output_format = DIFF_FORMAT_DIFFSTAT | DIFF_FORMAT_PATCH; + if (output_directory) { if (use_stdout) die("standard output, or directory, which one?"); diff --git a/diff.c b/diff.c index 12f655a2fa..928345199d 100644 --- a/diff.c +++ b/diff.c @@ -1420,7 +1420,6 @@ static void run_checkdiff(struct diff_filepair *p, struct diff_options *o) void diff_setup(struct diff_options *options) { memset(options, 0, sizeof(*options)); - options->output_format = DIFF_FORMAT_RAW; options->line_termination = '\n'; options->break_opt = -1; options->rename_limit = -1; -- cgit v1.3 From 39bc9a6c2051a9fc31dc9b34b40bdd3dd94a8afb Mon Sep 17 00:00:00 2001 From: Timo Hirvonen Date: Sun, 25 Jun 2006 13:54:14 +0300 Subject: Add msg_sep to diff_options Add msg_sep variable to struct diff_options. msg_sep is printed after commit message. Default is "\n", format-patch sets it to "---\n". This also removes the second argument from show_log() because all callers derived it from the first argument: show_log(rev, rev->loginfo, ... Signed-off-by: Timo Hirvonen Signed-off-by: Junio C Hamano --- builtin-log.c | 1 + combine-diff.c | 7 ++++--- diff.c | 1 + diff.h | 1 + log-tree.c | 15 ++++++--------- log-tree.h | 2 +- 6 files changed, 14 insertions(+), 13 deletions(-) (limited to 'diff.c') diff --git a/builtin-log.c b/builtin-log.c index 4e5273aecf..71ae6c98a5 100644 --- a/builtin-log.c +++ b/builtin-log.c @@ -175,6 +175,7 @@ int cmd_format_patch(int argc, const char **argv, char **envp) rev.diff = 1; rev.combine_merges = 0; rev.ignore_merges = 1; + rev.diffopt.msg_sep = "---\n"; git_config(git_format_config); rev.extra_headers = extra_headers; diff --git a/combine-diff.c b/combine-diff.c index 3daa8cb13e..39fb10c145 100644 --- a/combine-diff.c +++ b/combine-diff.c @@ -701,7 +701,7 @@ static int show_patch_diff(struct combine_diff_path *elem, int num_parent, const char *abb; if (rev->loginfo) - show_log(rev, rev->loginfo, "\n"); + show_log(rev, opt->msg_sep); dump_quoted_path(dense ? "diff --cc " : "diff --combined ", elem->path); printf("index "); for (i = 0; i < num_parent; i++) { @@ -769,7 +769,7 @@ static void show_raw_diff(struct combine_diff_path *p, int num_parent, struct re inter_name_termination = 0; if (rev->loginfo) - show_log(rev, rev->loginfo, "\n"); + show_log(rev, opt->msg_sep); if (opt->output_format & DIFF_FORMAT_RAW) { offset = strlen(COLONS) - num_parent; @@ -855,7 +855,8 @@ void diff_tree_combined(const unsigned char *sha1, paths = intersect_paths(paths, i, num_parent); if (opt->output_format & DIFF_FORMAT_DIFFSTAT && rev->loginfo) - show_log(rev, rev->loginfo, "---\n"); + show_log(rev, opt->msg_sep); + diff_flush(&diffopts); if (opt->output_format & DIFF_FORMAT_DIFFSTAT) putchar('\n'); diff --git a/diff.c b/diff.c index 928345199d..491b846f62 100644 --- a/diff.c +++ b/diff.c @@ -1424,6 +1424,7 @@ void diff_setup(struct diff_options *options) options->break_opt = -1; options->rename_limit = -1; options->context = 3; + options->msg_sep = "\n"; options->change = diff_change; options->add_remove = diff_addremove; diff --git a/diff.h b/diff.h index 2b6dc0cbe4..729cd02510 100644 --- a/diff.h +++ b/diff.h @@ -57,6 +57,7 @@ struct diff_options { int rename_limit; int setup; int abbrev; + const char *msg_sep; const char *stat_sep; long xdl_opts; diff --git a/log-tree.c b/log-tree.c index 7d4c51f954..ab6b682223 100644 --- a/log-tree.c +++ b/log-tree.c @@ -43,9 +43,10 @@ static int append_signoff(char *buf, int buf_sz, int at, const char *signoff) return at; } -void show_log(struct rev_info *opt, struct log_info *log, const char *sep) +void show_log(struct rev_info *opt, const char *sep) { static char this_header[16384]; + struct log_info *log = opt->loginfo; struct commit *commit = log->commit, *parent = log->parent; int abbrev = opt->diffopt.abbrev; int abbrev_commit = opt->abbrev_commit ? opt->abbrev : 40; @@ -163,13 +164,9 @@ int log_tree_diff_flush(struct rev_info *opt) return 0; } - if (opt->loginfo && !opt->no_commit_id) { - if (opt->diffopt.output_format & DIFF_FORMAT_DIFFSTAT) { - show_log(opt, opt->loginfo, "---\n"); - } else { - show_log(opt, opt->loginfo, "\n"); - } - } + if (opt->loginfo && !opt->no_commit_id) + show_log(opt, opt->diffopt.msg_sep); + diff_flush(&opt->diffopt); return 1; } @@ -266,7 +263,7 @@ int log_tree_commit(struct rev_info *opt, struct commit *commit) shown = log_tree_diff(opt, commit, &log); if (!shown && opt->loginfo && opt->always_show_header) { log.parent = NULL; - show_log(opt, opt->loginfo, ""); + show_log(opt, ""); shown = 1; } opt->loginfo = NULL; diff --git a/log-tree.h b/log-tree.h index a26e4841ff..e82b56a20d 100644 --- a/log-tree.h +++ b/log-tree.h @@ -11,6 +11,6 @@ void init_log_tree_opt(struct rev_info *); int log_tree_diff_flush(struct rev_info *); int log_tree_commit(struct rev_info *, struct commit *); int log_tree_opt_parse(struct rev_info *, const char **, int); -void show_log(struct rev_info *opt, struct log_info *log, const char *sep); +void show_log(struct rev_info *opt, const char *sep); #endif -- cgit v1.3 From 5e2b0636c709884e45ef941cd4514c225f204982 Mon Sep 17 00:00:00 2001 From: Timo Hirvonen Date: Sun, 25 Jun 2006 14:28:19 +0300 Subject: Don't xcalloc() struct diffstat_t Signed-off-by: Timo Hirvonen Signed-off-by: Junio C Hamano --- diff.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) (limited to 'diff.c') diff --git a/diff.c b/diff.c index 491b846f62..54698f511a 100644 --- a/diff.c +++ b/diff.c @@ -2115,17 +2115,16 @@ void diff_flush(struct diff_options *options) } if (output_format & DIFF_FORMAT_DIFFSTAT) { - struct diffstat_t *diffstat; + struct diffstat_t diffstat; - diffstat = xcalloc(sizeof (struct diffstat_t), 1); - diffstat->xm.consume = diffstat_consume; + memset(&diffstat, 0, sizeof(struct diffstat_t)); + diffstat.xm.consume = diffstat_consume; for (i = 0; i < q->nr; i++) { struct diff_filepair *p = q->queue[i]; if (check_pair_status(p)) - diff_flush_stat(p, options, diffstat); + diff_flush_stat(p, options, &diffstat); } - show_stats(diffstat); - free(diffstat); + show_stats(&diffstat); } if (output_format & DIFF_FORMAT_SUMMARY) { -- cgit v1.3 From 946c3784a3586e70c70c3a676f590654ca39a3cb Mon Sep 17 00:00:00 2001 From: Timo Hirvonen Date: Tue, 27 Jun 2006 15:09:17 +0300 Subject: Print empty line between raw, stat, summary and patch Signed-off-by: Timo Hirvonen Signed-off-by: Junio C Hamano --- diff.c | 47 ++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 42 insertions(+), 5 deletions(-) (limited to 'diff.c') diff --git a/diff.c b/diff.c index 54698f511a..71fb0967fd 100644 --- a/diff.c +++ b/diff.c @@ -2093,15 +2093,43 @@ static void diff_summary(struct diff_filepair *p) } } +static int is_summary_empty(const struct diff_queue_struct *q) +{ + int i; + + for (i = 0; i < q->nr; i++) { + const struct diff_filepair *p = q->queue[i]; + + switch (p->status) { + case DIFF_STATUS_DELETED: + case DIFF_STATUS_ADDED: + case DIFF_STATUS_COPIED: + case DIFF_STATUS_RENAMED: + return 0; + default: + if (p->score) + return 0; + if (p->one->mode && p->two->mode && + p->one->mode != p->two->mode) + return 0; + break; + } + } + return 1; +} + void diff_flush(struct diff_options *options) { struct diff_queue_struct *q = &diff_queued_diff; int i, output_format = options->output_format; + int separator = 0; /* * Order: raw, stat, summary, patch * or: name/name-status/checkdiff (other bits clear) */ + if (!q->nr) + goto free_queue; if (output_format & (DIFF_FORMAT_RAW | DIFF_FORMAT_NAME | @@ -2112,11 +2140,15 @@ void diff_flush(struct diff_options *options) if (check_pair_status(p)) flush_one_pair(p, options); } + separator++; } if (output_format & DIFF_FORMAT_DIFFSTAT) { struct diffstat_t diffstat; + if (separator++) + putchar('\n'); + memset(&diffstat, 0, sizeof(struct diffstat_t)); diffstat.xm.consume = diffstat_consume; for (i = 0; i < q->nr; i++) { @@ -2127,18 +2159,22 @@ void diff_flush(struct diff_options *options) show_stats(&diffstat); } - if (output_format & DIFF_FORMAT_SUMMARY) { + if (output_format & DIFF_FORMAT_SUMMARY && !is_summary_empty(q)) { + if (separator++) + putchar('\n'); + for (i = 0; i < q->nr; i++) diff_summary(q->queue[i]); } if (output_format & DIFF_FORMAT_PATCH) { - if (output_format & (DIFF_FORMAT_DIFFSTAT | - DIFF_FORMAT_SUMMARY)) { - if (options->stat_sep) + if (separator) { + if (options->stat_sep) { + /* attach patch instead of inline */ fputs(options->stat_sep, stdout); - else + } else { putchar(options->line_termination); + } } for (i = 0; i < q->nr; i++) { @@ -2150,6 +2186,7 @@ void diff_flush(struct diff_options *options) for (i = 0; i < q->nr; i++) diff_free_filepair(q->queue[i]); +free_queue: free(q->queue); q->queue = NULL; q->nr = q->alloc = 0; -- cgit v1.3 From 3223847a8fbd6200e38f4a8f1146ca9dc20a813e Mon Sep 17 00:00:00 2001 From: Timo Hirvonen Date: Tue, 27 Jun 2006 19:43:22 +0300 Subject: Fix diff-tree -s setup_revisions() calls diff_setup_done() before we can set default value for output_format. Don't convert DIFF_FORMAT_NO_OUTPUT to 0 in diff_setup_done(), it is useless and makes diff-tree believe no diff format parameters were given and thus lets it reset output_format to DIFF_FORMAT_RAW. Signed-off-by: Timo Hirvonen Signed-off-by: Junio C Hamano --- diff.c | 3 --- 1 file changed, 3 deletions(-) (limited to 'diff.c') diff --git a/diff.c b/diff.c index 71fb0967fd..6d04be49de 100644 --- a/diff.c +++ b/diff.c @@ -1438,9 +1438,6 @@ int diff_setup_done(struct diff_options *options) (0 <= options->rename_limit && !options->detect_rename)) return -1; - if (options->output_format & DIFF_FORMAT_NO_OUTPUT) - options->output_format = 0; - if (options->output_format & (DIFF_FORMAT_NAME | DIFF_FORMAT_NAME_STATUS | DIFF_FORMAT_CHECKDIFF | -- cgit v1.3 From 3969cf7db1a13a78f3b7a36d8c1084bbe0a53459 Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Tue, 27 Jun 2006 15:08:19 -0700 Subject: Fix some more diff options changes. This fixes various problems in the new diff options code. - Fix --cc/-c --patch; it showed two-tree diff used internally. - Use "---\n" only where it matters -- that is, use it immediately after the commit log text when we show a commit log and something else before the patch text. - Do not output spurious extra "\n"; have an extra newline after the commit log text always when we have diff output and we are not doing oneline. - When running a pickaxe you need to go recursive. Signed-off-by: Junio C Hamano --- builtin-diff-tree.c | 1 - combine-diff.c | 24 +++++++++++++++--------- diff.c | 15 ++++++++------- log-tree.c | 17 +++++++++++++++-- 4 files changed, 38 insertions(+), 19 deletions(-) (limited to 'diff.c') diff --git a/builtin-diff-tree.c b/builtin-diff-tree.c index 1e66fcac21..ae1cde9d00 100644 --- a/builtin-diff-tree.c +++ b/builtin-diff-tree.c @@ -72,7 +72,6 @@ int cmd_diff_tree(int argc, const char **argv, char **envp) init_revisions(opt); opt->abbrev = 0; opt->diff = 1; - opt->diffopt.msg_sep = "---\n"; argc = setup_revisions(argc, argv, opt, NULL); while (--argc > 0) { diff --git a/combine-diff.c b/combine-diff.c index 39fb10c145..7178b25c53 100644 --- a/combine-diff.c +++ b/combine-diff.c @@ -835,31 +835,33 @@ void diff_tree_combined(const unsigned char *sha1, struct diff_options *opt = &rev->diffopt; struct diff_options diffopts; struct combine_diff_path *p, *paths = NULL; - int i, num_paths; + int i, num_paths, needsep, show_log_first; diffopts = *opt; - diffopts.output_format &= ~(DIFF_FORMAT_RAW | DIFF_FORMAT_DIFFSTAT); + diffopts.output_format = DIFF_FORMAT_NO_OUTPUT; diffopts.recursive = 1; + show_log_first = rev->loginfo; + needsep = 0; /* find set of paths that everybody touches */ for (i = 0; i < num_parent; i++) { /* show stat against the first parent even * when doing combined diff. */ if (i == 0 && opt->output_format & DIFF_FORMAT_DIFFSTAT) - diffopts.output_format |= DIFF_FORMAT_DIFFSTAT; + diffopts.output_format = DIFF_FORMAT_DIFFSTAT; else - diffopts.output_format |= DIFF_FORMAT_NO_OUTPUT; + diffopts.output_format = DIFF_FORMAT_NO_OUTPUT; diff_tree_sha1(parent[i], sha1, "", &diffopts); diffcore_std(&diffopts); paths = intersect_paths(paths, i, num_parent); - if (opt->output_format & DIFF_FORMAT_DIFFSTAT && rev->loginfo) + if (show_log_first && i == 0) { show_log(rev, opt->msg_sep); - + if (rev->verbose_header && opt->output_format) + putchar(opt->line_termination); + } diff_flush(&diffopts); - if (opt->output_format & DIFF_FORMAT_DIFFSTAT) - putchar('\n'); } /* find out surviving paths */ @@ -875,9 +877,13 @@ void diff_tree_combined(const unsigned char *sha1, if (p->len) show_raw_diff(p, num_parent, rev); } - putchar(opt->line_termination); + needsep = 1; } + else if (opt->output_format & DIFF_FORMAT_DIFFSTAT) + needsep = 1; if (opt->output_format & DIFF_FORMAT_PATCH) { + if (needsep) + putchar(opt->line_termination); for (p = paths; p; p = p->next) { if (p->len) show_patch_diff(p, num_parent, dense, diff --git a/diff.c b/diff.c index 6d04be49de..1c131ff4dc 100644 --- a/diff.c +++ b/diff.c @@ -1424,7 +1424,7 @@ void diff_setup(struct diff_options *options) options->break_opt = -1; options->rename_limit = -1; options->context = 3; - options->msg_sep = "\n"; + options->msg_sep = ""; options->change = diff_change; options->add_remove = diff_addremove; @@ -1455,6 +1455,11 @@ int diff_setup_done(struct diff_options *options) DIFF_FORMAT_DIFFSTAT | DIFF_FORMAT_CHECKDIFF)) options->recursive = 1; + /* + * Also pickaxe would not work very well if you do not say recursive + */ + if (options->pickaxe) + options->recursive = 1; if (options->detect_rename && options->rename_limit < 0) options->rename_limit = diff_rename_limit_default; @@ -2143,9 +2148,6 @@ void diff_flush(struct diff_options *options) if (output_format & DIFF_FORMAT_DIFFSTAT) { struct diffstat_t diffstat; - if (separator++) - putchar('\n'); - memset(&diffstat, 0, sizeof(struct diffstat_t)); diffstat.xm.consume = diffstat_consume; for (i = 0; i < q->nr; i++) { @@ -2154,14 +2156,13 @@ void diff_flush(struct diff_options *options) diff_flush_stat(p, options, &diffstat); } show_stats(&diffstat); + separator++; } if (output_format & DIFF_FORMAT_SUMMARY && !is_summary_empty(q)) { - if (separator++) - putchar('\n'); - for (i = 0; i < q->nr; i++) diff_summary(q->queue[i]); + separator++; } if (output_format & DIFF_FORMAT_PATCH) { diff --git a/log-tree.c b/log-tree.c index ab6b682223..9d8d46fa00 100644 --- a/log-tree.c +++ b/log-tree.c @@ -164,9 +164,22 @@ int log_tree_diff_flush(struct rev_info *opt) return 0; } - if (opt->loginfo && !opt->no_commit_id) + if (opt->loginfo && !opt->no_commit_id) { + /* When showing a verbose header (i.e. log message), + * and not in --pretty=oneline format, we would want + * an extra newline between the end of log and the + * output for readability. + */ show_log(opt, opt->diffopt.msg_sep); - + if (opt->verbose_header && + opt->commit_format != CMIT_FMT_ONELINE) { + int pch = DIFF_FORMAT_DIFFSTAT | DIFF_FORMAT_PATCH; + if ((pch & opt->diffopt.output_format) == pch) + printf("---%c", opt->diffopt.line_termination); + else + putchar(opt->diffopt.line_termination); + } + } diff_flush(&opt->diffopt); return 1; } -- cgit v1.3 From 12f6c308d53509dcb11e309604457d21d60438db Mon Sep 17 00:00:00 2001 From: Joachim B Haga Date: Mon, 3 Jul 2006 22:11:47 +0200 Subject: Make zlib compression level configurable, and change default. With the change in default, "git add ." on kernel dir is about twice as fast as before, with only minimal (0.5%) change in object size. The speed difference is even more noticeable when committing large files, which is now up to 8 times faster. The configurability is through setting core.compression = [-1..9] which maps to the zlib constants; -1 is the default, 0 is no compression, and 1..9 are various speed/size tradeoffs, 9 being slowest. Signed-off-by: Joachim B Haga (cjhaga@fys.uio.no) Acked-by: Linus Torvalds Signed-off-by: Junio C Hamano --- Documentation/config.txt | 6 ++++++ cache.h | 1 + config.c | 10 ++++++++++ csum-file.c | 2 +- diff.c | 2 +- environment.c | 1 + http-push.c | 2 +- sha1_file.c | 4 ++-- 8 files changed, 23 insertions(+), 5 deletions(-) (limited to 'diff.c') diff --git a/Documentation/config.txt b/Documentation/config.txt index a04c5adf8e..16bdd55233 100644 --- a/Documentation/config.txt +++ b/Documentation/config.txt @@ -91,6 +91,12 @@ core.warnAmbiguousRefs:: If true, git will warn you if the ref name you passed it is ambiguous and might match multiple refs in the .git/refs/ tree. True by default. +core.compression: + An integer -1..9, indicating the compression level for objects that + are not in a pack file. -1 is the zlib and git default. 0 means no + compression, and 1..9 are various speed/size tradeoffs, 9 being + slowest. + alias.*:: Command aliases for the gitlink:git[1] command wrapper - e.g. after defining "alias.last = cat-file commit HEAD", the invocation diff --git a/cache.h b/cache.h index 87199396a0..84770bf67a 100644 --- a/cache.h +++ b/cache.h @@ -183,6 +183,7 @@ extern int log_all_ref_updates; extern int warn_ambiguous_refs; extern int shared_repository; extern const char *apply_default_whitespace; +extern int zlib_compression_level; #define GIT_REPO_VERSION 0 extern int repository_format_version; diff --git a/config.c b/config.c index ec44827da4..b23f4bf487 100644 --- a/config.c +++ b/config.c @@ -279,6 +279,16 @@ int git_default_config(const char *var, const char *value) return 0; } + if (!strcmp(var, "core.compression")) { + int level = git_config_int(var, value); + if (level == -1) + level = Z_DEFAULT_COMPRESSION; + else if (level < 0 || level > Z_BEST_COMPRESSION) + die("bad zlib compression level %d", level); + zlib_compression_level = level; + return 0; + } + if (!strcmp(var, "user.name")) { strlcpy(git_default_name, value, sizeof(git_default_name)); return 0; diff --git a/csum-file.c b/csum-file.c index ebaad0397f..6a7b40fd09 100644 --- a/csum-file.c +++ b/csum-file.c @@ -122,7 +122,7 @@ int sha1write_compressed(struct sha1file *f, void *in, unsigned int size) void *out; memset(&stream, 0, sizeof(stream)); - deflateInit(&stream, Z_DEFAULT_COMPRESSION); + deflateInit(&stream, zlib_compression_level); maxsize = deflateBound(&stream, size); out = xmalloc(maxsize); diff --git a/diff.c b/diff.c index 5a71489a47..428ff786eb 100644 --- a/diff.c +++ b/diff.c @@ -583,7 +583,7 @@ static unsigned char *deflate_it(char *data, z_stream stream; memset(&stream, 0, sizeof(stream)); - deflateInit(&stream, Z_BEST_COMPRESSION); + deflateInit(&stream, zlib_compression_level); bound = deflateBound(&stream, size); deflated = xmalloc(bound); stream.next_out = deflated; diff --git a/environment.c b/environment.c index 3de8eb3b2a..43823ff7d6 100644 --- a/environment.c +++ b/environment.c @@ -20,6 +20,7 @@ int repository_format_version = 0; char git_commit_encoding[MAX_ENCODING_LENGTH] = "utf-8"; int shared_repository = PERM_UMASK; const char *apply_default_whitespace = NULL; +int zlib_compression_level = Z_DEFAULT_COMPRESSION; static char *git_dir, *git_object_dir, *git_index_file, *git_refs_dir, *git_graft_file; diff --git a/http-push.c b/http-push.c index e281f70e54..f761584d7e 100644 --- a/http-push.c +++ b/http-push.c @@ -492,7 +492,7 @@ static void start_put(struct transfer_request *request) /* Set it up */ memset(&stream, 0, sizeof(stream)); - deflateInit(&stream, Z_BEST_COMPRESSION); + deflateInit(&stream, zlib_compression_level); size = deflateBound(&stream, len + hdrlen); request->buffer.buffer = xmalloc(size); diff --git a/sha1_file.c b/sha1_file.c index 817963045b..bc35808440 100644 --- a/sha1_file.c +++ b/sha1_file.c @@ -1458,7 +1458,7 @@ int write_sha1_file(void *buf, unsigned long len, const char *type, unsigned cha /* Set it up */ memset(&stream, 0, sizeof(stream)); - deflateInit(&stream, Z_BEST_COMPRESSION); + deflateInit(&stream, zlib_compression_level); size = deflateBound(&stream, len+hdrlen); compressed = xmalloc(size); @@ -1511,7 +1511,7 @@ static void *repack_object(const unsigned char *sha1, unsigned long *objsize) /* Set it up */ memset(&stream, 0, sizeof(stream)); - deflateInit(&stream, Z_BEST_COMPRESSION); + deflateInit(&stream, zlib_compression_level); size = deflateBound(&stream, len + hdrlen); buf = xmalloc(size); -- cgit v1.3 From c9c95bbc9c9f7b8a3c87ab486b4aec220a239577 Mon Sep 17 00:00:00 2001 From: Stephan Feder Date: Fri, 7 Jul 2006 12:33:44 +0200 Subject: Do not drop data from '\0' until eol in patch output The binary file detection is just a heuristic which can well fail. Do not produce garbage patches in these cases. Signed-off-by: Stephan Feder Signed-off-by: Junio C Hamano --- diff.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'diff.c') diff --git a/diff.c b/diff.c index 507e4019e8..f0450a8b0b 100644 --- a/diff.c +++ b/diff.c @@ -329,7 +329,9 @@ static void fn_out_consume(void *priv, char *line, unsigned long len) } if (len > 0 && line[len-1] == '\n') len--; - printf("%s%.*s%s\n", set, (int) len, line, reset); + fputs (set, stdout); + fwrite (line, len, 1, stdout); + puts (reset); } static char *pprint_rename(const char *a, const char *b) -- cgit v1.3 From 6d64ea965bc2894ef0aee16ac23a5e47f20eb824 Mon Sep 17 00:00:00 2001 From: Stephan Feder Date: Fri, 7 Jul 2006 12:33:57 +0200 Subject: Teach --text option to diff Add new item text to struct diff_options. If set then do not try to detect binary files. Signed-off-by: Stephan Feder Signed-off-by: Junio C Hamano --- diff.c | 5 ++++- diff.h | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) (limited to 'diff.c') diff --git a/diff.c b/diff.c index f0450a8b0b..1f0219dbe4 100644 --- a/diff.c +++ b/diff.c @@ -723,7 +723,7 @@ static void builtin_diff(const char *name_a, if (fill_mmfile(&mf1, one) < 0 || fill_mmfile(&mf2, two) < 0) die("unable to read files to diff"); - if (mmfile_is_binary(&mf1) || mmfile_is_binary(&mf2)) { + if (!o->text && (mmfile_is_binary(&mf1) || mmfile_is_binary(&mf2))) { /* Quite common confusing case */ if (mf1.size == mf2.size && !memcmp(mf1.ptr, mf2.ptr, mf1.size)) @@ -1561,6 +1561,9 @@ int diff_opt_parse(struct diff_options *options, const char **av, int ac) options->output_format |= DIFF_FORMAT_PATCH; options->full_index = options->binary = 1; } + else if (!strcmp(arg, "--text")) { + options->text = 1; + } else if (!strcmp(arg, "--name-only")) options->output_format |= DIFF_FORMAT_NAME; else if (!strcmp(arg, "--name-status")) diff --git a/diff.h b/diff.h index d5573947b3..f80f64608a 100644 --- a/diff.h +++ b/diff.h @@ -42,6 +42,7 @@ struct diff_options { unsigned recursive:1, tree_in_recursive:1, binary:1, + text:1, full_index:1, silent_on_remove:1, find_copies_harder:1, -- cgit v1.3 From 63ac4501199ca768e95ad3442f6580e41a002a33 Mon Sep 17 00:00:00 2001 From: Stephan Feder Date: Fri, 7 Jul 2006 15:57:07 +0200 Subject: Teach diff -a as shorthand for --text Signed-off-by: Stephan Feder Signed-off-by: Junio C Hamano --- diff.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'diff.c') diff --git a/diff.c b/diff.c index 1f0219dbe4..b423491f60 100644 --- a/diff.c +++ b/diff.c @@ -1561,7 +1561,7 @@ int diff_opt_parse(struct diff_options *options, const char **av, int ac) options->output_format |= DIFF_FORMAT_PATCH; options->full_index = options->binary = 1; } - else if (!strcmp(arg, "--text")) { + else if (!strcmp(arg, "-a") || !strcmp(arg, "--text")) { options->text = 1; } else if (!strcmp(arg, "--name-only")) -- cgit v1.3 From b68ea12e305043a7feef085b6ba098f42357af9b Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Fri, 7 Jul 2006 04:01:23 -0700 Subject: diff.c: respect diff.renames config option diff.renames is mentioned several times in the documentation, but to my surprise it didn't do anything before this patch. Also add the --no-renames option to override this from the command-line. Signed-off-by: Eric Wong Signed-off-by: Junio C Hamano --- Documentation/config.txt | 5 +++++ diff.c | 14 ++++++++++++++ 2 files changed, 19 insertions(+) (limited to 'diff.c') diff --git a/Documentation/config.txt b/Documentation/config.txt index f075f19815..5290a8fd1f 100644 --- a/Documentation/config.txt +++ b/Documentation/config.txt @@ -114,6 +114,11 @@ diff.renameLimit:: The number of files to consider when performing the copy/rename detection; equivalent to the git diff option '-l'. +diff.renames:: + Tells git to detect renames. If set to any boolean value, it + will enable basic rename detection. If set to "copies" or + "copy", it will detect copies, as well. + format.headers:: Additional email headers to include in a patch to be submitted by mail. See gitlink:git-format-patch[1]. diff --git a/diff.c b/diff.c index b423491f60..4bea3066a8 100644 --- a/diff.c +++ b/diff.c @@ -13,6 +13,7 @@ static int use_size_cache; +static int diff_detect_rename_default = 0; static int diff_rename_limit_default = -1; static int diff_use_color_default = 0; @@ -120,6 +121,16 @@ int git_diff_config(const char *var, const char *value) diff_use_color_default = git_config_bool(var, value); return 0; } + if (!strcmp(var, "diff.renames")) { + if (!value) + diff_detect_rename_default = DIFF_DETECT_RENAME; + else if (!strcasecmp(value, "copies") || + !strcasecmp(value, "copy")) + diff_detect_rename_default = DIFF_DETECT_COPY; + else if (git_config_bool(var,value)) + diff_detect_rename_default = DIFF_DETECT_RENAME; + return 0; + } if (!strncmp(var, "diff.color.", 11)) { int slot = parse_diff_color_slot(var, 11); diff_colors[slot] = parse_diff_color_value(value, var); @@ -1431,6 +1442,7 @@ void diff_setup(struct diff_options *options) options->change = diff_change; options->add_remove = diff_addremove; options->color_diff = diff_use_color_default; + options->detect_rename = diff_detect_rename_default; } int diff_setup_done(struct diff_options *options) @@ -1617,6 +1629,8 @@ int diff_opt_parse(struct diff_options *options, const char **av, int ac) options->xdl_opts |= XDF_IGNORE_WHITESPACE; else if (!strcmp(arg, "-b") || !strcmp(arg, "--ignore-space-change")) options->xdl_opts |= XDF_IGNORE_WHITESPACE_CHANGE; + else if (!strcmp(arg, "--no-renames")) + options->detect_rename = 0; else return 0; return 1; -- cgit v1.3 From fef88bb0134dfd47b4bd17e668bbb860588dcb39 Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Fri, 7 Jul 2006 05:27:24 -0700 Subject: diff.c: --no-color to defeat diff.color configuration. Signed-off-by: Junio C Hamano --- diff.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'diff.c') diff --git a/diff.c b/diff.c index 4bea3066a8..1bf1ed0967 100644 --- a/diff.c +++ b/diff.c @@ -1625,6 +1625,8 @@ int diff_opt_parse(struct diff_options *options, const char **av, int ac) } else if (!strcmp(arg, "--color")) options->color_diff = 1; + else if (!strcmp(arg, "--no-color")) + options->color_diff = 0; else if (!strcmp(arg, "-w") || !strcmp(arg, "--ignore-all-space")) options->xdl_opts |= XDF_IGNORE_WHITESPACE; else if (!strcmp(arg, "-b") || !strcmp(arg, "--ignore-space-change")) -- cgit v1.3 From a0c2089c1d48dc9969822126170d35c6e5aa141f Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Fri, 7 Jul 2006 17:48:02 -0700 Subject: colored diff: diff.color = auto fix Even if the standard output is connected to a tty, do not colorize the diff if we are talking to a dumb terminal when diff.color configuration variable is set to "auto". Signed-off-by: Junio C Hamano --- diff.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) (limited to 'diff.c') diff --git a/diff.c b/diff.c index f0450a8b0b..aab246c97e 100644 --- a/diff.c +++ b/diff.c @@ -110,8 +110,14 @@ int git_diff_config(const char *var, const char *value) if (!strcmp(var, "diff.color")) { if (!value) diff_use_color_default = 1; /* bool */ - else if (!strcasecmp(value, "auto")) - diff_use_color_default = isatty(1); + else if (!strcasecmp(value, "auto")) { + diff_use_color_default = 0; + if (isatty(1)) { + char *term = getenv("TERM"); + if (term && strcmp(term, "dumb")) + diff_use_color_default = 1; + } + } else if (!strcasecmp(value, "never")) diff_use_color_default = 0; else if (!strcasecmp(value, "always")) -- cgit v1.3 From 83ad63cfebdf652ff7c7b255d700d8b12c756913 Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Sat, 8 Jul 2006 01:05:16 -0700 Subject: diff: do not use configuration magic at the core-level The Porcelainish has become so much usable as the UI that there is not much reason people should be using the core programs by hand anymore. At this point we are better off making the behaviour of the core programs predictable by keeping them unaffected by the configuration variables. Otherwise they will become very hard to use as reliable building blocks. For example, "git-commit -a" internally uses git-diff-files to figure out the set of paths that need to be updated in the index, and we should never allow diff.renames that happens to be in the configuration to interfere (or slow down the process). The UI level configuration such as showing renamed diff and coloring are still honored by the Porcelainish ("git log" family and "git diff"), but not by the core anymore. Signed-off-by: Junio C Hamano --- builtin-diff-files.c | 2 +- builtin-diff-index.c | 2 +- builtin-diff-stages.c | 2 +- builtin-diff-tree.c | 2 +- builtin-diff.c | 2 +- builtin-log.c | 8 ++++---- diff.c | 8 +++++++- diff.h | 2 +- 8 files changed, 17 insertions(+), 11 deletions(-) (limited to 'diff.c') diff --git a/builtin-diff-files.c b/builtin-diff-files.c index a655eea91e..81ac2fe64a 100644 --- a/builtin-diff-files.c +++ b/builtin-diff-files.c @@ -18,7 +18,7 @@ int cmd_diff_files(int argc, const char **argv, char **envp) struct rev_info rev; int silent = 0; - git_config(git_diff_config); + git_config(git_default_config); /* no "diff" UI options */ init_revisions(&rev); rev.abbrev = 0; diff --git a/builtin-diff-index.c b/builtin-diff-index.c index b37c9e8ccb..a1fa1b85cf 100644 --- a/builtin-diff-index.c +++ b/builtin-diff-index.c @@ -15,7 +15,7 @@ int cmd_diff_index(int argc, const char **argv, char **envp) int cached = 0; int i; - git_config(git_diff_config); + git_config(git_default_config); /* no "diff" UI options */ init_revisions(&rev); rev.abbrev = 0; diff --git a/builtin-diff-stages.c b/builtin-diff-stages.c index 30931fe049..9c62702941 100644 --- a/builtin-diff-stages.c +++ b/builtin-diff-stages.c @@ -61,7 +61,7 @@ int cmd_diff_stages(int ac, const char **av, char **envp) const char *prefix = setup_git_directory(); const char **pathspec = NULL; - git_config(git_diff_config); + git_config(git_default_config); /* no "diff" UI options */ read_cache(); diff_setup(&diff_options); while (1 < ac && av[1][0] == '-') { diff --git a/builtin-diff-tree.c b/builtin-diff-tree.c index ae1cde9d00..b610668594 100644 --- a/builtin-diff-tree.c +++ b/builtin-diff-tree.c @@ -67,7 +67,7 @@ int cmd_diff_tree(int argc, const char **argv, char **envp) static struct rev_info *opt = &log_tree_opt; int read_stdin = 0; - git_config(git_diff_config); + git_config(git_default_config); /* no "diff" UI options */ nr_sha1 = 0; init_revisions(opt); opt->abbrev = 0; diff --git a/builtin-diff.c b/builtin-diff.c index d520c7ca29..1df531ba28 100644 --- a/builtin-diff.c +++ b/builtin-diff.c @@ -250,7 +250,7 @@ int cmd_diff(int argc, const char **argv, char **envp) * Other cases are errors. */ - git_config(git_diff_config); + git_config(git_diff_ui_config); init_revisions(&rev); argc = setup_revisions(argc, argv, &rev, NULL); diff --git a/builtin-log.c b/builtin-log.c index 698b71ecc8..dd5a5a2b14 100644 --- a/builtin-log.c +++ b/builtin-log.c @@ -47,7 +47,7 @@ int cmd_whatchanged(int argc, const char **argv, char **envp) { struct rev_info rev; - git_config(git_diff_config); + git_config(git_diff_ui_config); init_revisions(&rev); rev.diff = 1; rev.diffopt.recursive = 1; @@ -62,7 +62,7 @@ int cmd_show(int argc, const char **argv, char **envp) { struct rev_info rev; - git_config(git_diff_config); + git_config(git_diff_ui_config); init_revisions(&rev); rev.diff = 1; rev.diffopt.recursive = 1; @@ -79,7 +79,7 @@ int cmd_log(int argc, const char **argv, char **envp) { struct rev_info rev; - git_config(git_diff_config); + git_config(git_diff_ui_config); init_revisions(&rev); rev.always_show_header = 1; cmd_log_init(argc, argv, envp, &rev); @@ -105,7 +105,7 @@ static int git_format_config(const char *var, const char *value) strcat(extra_headers, value); return 0; } - return git_diff_config(var, value); + return git_diff_ui_config(var, value); } diff --git a/diff.c b/diff.c index 1bf1ed0967..493650cc0e 100644 --- a/diff.c +++ b/diff.c @@ -102,7 +102,13 @@ static const char *parse_diff_color_value(const char *value, const char *var) die("bad config value '%s' for variable '%s'", value, var); } -int git_diff_config(const char *var, const char *value) +/* + * These are to give UI layer defaults. + * The core-level commands such as git-diff-files should + * never be affected by the setting of diff.renames + * the user happens to have in the configuration file. + */ +int git_diff_ui_config(const char *var, const char *value) { if (!strcmp(var, "diff.renamelimit")) { diff_rename_limit_default = git_config_int(var, value); diff --git a/diff.h b/diff.h index 8ab0448a12..a06f959938 100644 --- a/diff.h +++ b/diff.h @@ -123,7 +123,7 @@ extern int diff_scoreopt_parse(const char *opt); #define DIFF_SETUP_USE_CACHE 2 #define DIFF_SETUP_USE_SIZE_CACHE 4 -extern int git_diff_config(const char *var, const char *value); +extern int git_diff_ui_config(const char *var, const char *value); extern void diff_setup(struct diff_options *); extern int diff_opt_parse(struct diff_options *, const char **, int); extern int diff_setup_done(struct diff_options *); -- cgit v1.3 From 85fb65ed6e41e93760a91b33b512d3d9dc67ac66 Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Tue, 6 Jun 2006 16:58:40 -0700 Subject: "git -p cmd" to page anywhere This allows you to say: git -p diff v2.6.16-rc5.. and the command pipes the output of any git command to your pager. [jc: this resurrects a month old RFC patch with improvement suggested by Linus to call it --paginate instead of --less.] Signed-off-by: Junio C Hamano --- cache.h | 1 + diff.c | 2 +- git.c | 5 +++++ pager.c | 4 ++++ 4 files changed, 11 insertions(+), 1 deletion(-) (limited to 'diff.c') diff --git a/cache.h b/cache.h index 7b5c91c996..b5e3f8fa21 100644 --- a/cache.h +++ b/cache.h @@ -382,6 +382,7 @@ extern int receive_keep_pack(int fd[2], const char *me, int quiet, int); /* pager.c */ extern void setup_pager(void); +extern int pager_in_use; /* base85 */ int decode_85(char *dst, char *line, int linelen); diff --git a/diff.c b/diff.c index 3e26180f08..a00f9d1e52 100644 --- a/diff.c +++ b/diff.c @@ -112,7 +112,7 @@ int git_diff_config(const char *var, const char *value) diff_use_color_default = 1; /* bool */ else if (!strcasecmp(value, "auto")) { diff_use_color_default = 0; - if (isatty(1)) { + if (isatty(1) || pager_in_use) { char *term = getenv("TERM"); if (term && strcmp(term, "dumb")) diff_use_color_default = 1; diff --git a/git.c b/git.c index 256730112e..49062ca66e 100644 --- a/git.c +++ b/git.c @@ -251,6 +251,11 @@ int main(int argc, const char **argv, char **envp) cmd = *++argv; argc--; + if (!strcmp(cmd, "-p") || !strcmp(cmd, "--paginate")) { + setup_pager(); + continue; + } + if (strncmp(cmd, "--", 2)) break; diff --git a/pager.c b/pager.c index 2d186e8bde..bb14e99735 100644 --- a/pager.c +++ b/pager.c @@ -5,6 +5,8 @@ * something different on Windows, for example. */ +int pager_in_use; + static void run_pager(const char *pager) { execlp(pager, pager, NULL); @@ -24,6 +26,8 @@ void setup_pager(void) else if (!*pager || !strcmp(pager, "cat")) return; + pager_in_use = 1; /* means we are emitting to terminal */ + if (pipe(fd) < 0) return; pid = fork(); -- cgit v1.3 From 344c52aee5f2dfaad2a065f8dcc8566d52d0d6c9 Mon Sep 17 00:00:00 2001 From: Shawn Pearce Date: Sat, 8 Jul 2006 14:34:02 -0400 Subject: Avoid C99 initializers In a handful places, we use C99 structure and array initializers, which some compilers do not support. This can be handy when you are trying to compile GIT on a Solaris system that has an older C compiler, for example. Signed-off-by: Junio C Hamano --- builtin-read-tree.c | 18 ++++++++---------- checkout-index.c | 10 ++-------- diff.c | 12 ++++++------ 3 files changed, 16 insertions(+), 24 deletions(-) (limited to 'diff.c') diff --git a/builtin-read-tree.c b/builtin-read-tree.c index 23a8d92a4b..6df5d7c5cb 100644 --- a/builtin-read-tree.c +++ b/builtin-read-tree.c @@ -43,10 +43,7 @@ struct tree_entry_list { const unsigned char *sha1; }; -static struct tree_entry_list df_conflict_list = { - .name = NULL, - .next = &df_conflict_list -}; +static struct tree_entry_list df_conflict_list; typedef int (*merge_fn_t)(struct cache_entry **src); @@ -333,14 +330,9 @@ static void setup_progress_signal(void) setitimer(ITIMER_REAL, &v, NULL); } +static struct checkout state; static void check_updates(struct cache_entry **src, int nr) { - static struct checkout state = { - .base_dir = "", - .force = 1, - .quiet = 1, - .refresh_cache = 1, - }; unsigned short mask = htons(CE_UPDATE); unsigned last_percent = 200, cnt = 0, total = 0; @@ -884,6 +876,12 @@ int cmd_read_tree(int argc, const char **argv, char **envp) unsigned char sha1[20]; merge_fn_t fn = NULL; + df_conflict_list.next = &df_conflict_list; + state.base_dir = ""; + state.force = 1; + state.quiet = 1; + state.refresh_cache = 1; + setup_git_directory(); git_config(git_default_config); diff --git a/checkout-index.c b/checkout-index.c index 2927955508..61152f34b7 100644 --- a/checkout-index.c +++ b/checkout-index.c @@ -49,14 +49,7 @@ static int checkout_stage; /* default to checkout stage0 */ static int to_tempfile; static char topath[4][MAXPATHLEN+1]; -static struct checkout state = { - .base_dir = "", - .base_dir_len = 0, - .force = 0, - .quiet = 0, - .not_new = 0, - .refresh_cache = 0, -}; +static struct checkout state; static void write_tempfile_record (const char *name) { @@ -177,6 +170,7 @@ int main(int argc, char **argv) int all = 0; int read_from_stdin = 0; + state.base_dir = ""; prefix = setup_git_directory(); git_config(git_default_config); prefix_length = prefix ? strlen(prefix) : 0; diff --git a/diff.c b/diff.c index e101bfd8c8..287a927ce3 100644 --- a/diff.c +++ b/diff.c @@ -44,12 +44,12 @@ enum color_diff { #define COLOR_WHITE "\033[37m" static const char *diff_colors[] = { - [DIFF_RESET] = COLOR_RESET, - [DIFF_PLAIN] = COLOR_NORMAL, - [DIFF_METAINFO] = COLOR_BOLD, - [DIFF_FRAGINFO] = COLOR_CYAN, - [DIFF_FILE_OLD] = COLOR_RED, - [DIFF_FILE_NEW] = COLOR_GREEN, + COLOR_RESET, + COLOR_NORMAL, + COLOR_BOLD, + COLOR_CYAN, + COLOR_RED, + COLOR_GREEN }; static int parse_diff_color_slot(const char *var, int ofs) -- cgit v1.3 From f37399e6b0689b8b9a5a4cf9149ede5a39fca549 Mon Sep 17 00:00:00 2001 From: Timo Hirvonen Date: Thu, 13 Jul 2006 19:06:12 +0300 Subject: diff: Support both attributes and colors Make it possible to set both colors and a attribute for diff colors. Background colors are supported too. Syntax is now: [attr] [fg [bg]] [fg [bg]] [attr] Empty value is same as "normal normal", ie use default colors. The new syntax is backwards compatible. Signed-off-by: Timo Hirvonen Signed-off-by: Junio C Hamano --- diff.c | 164 ++++++++++++++++++++++++++++++++++++++++++----------------------- 1 file changed, 107 insertions(+), 57 deletions(-) (limited to 'diff.c') diff --git a/diff.c b/diff.c index 287a927ce3..f350c6ba91 100644 --- a/diff.c +++ b/diff.c @@ -26,30 +26,14 @@ enum color_diff { DIFF_FILE_NEW = 5, }; -#define COLOR_NORMAL "" -#define COLOR_BOLD "\033[1m" -#define COLOR_DIM "\033[2m" -#define COLOR_UL "\033[4m" -#define COLOR_BLINK "\033[5m" -#define COLOR_REVERSE "\033[7m" -#define COLOR_RESET "\033[m" - -#define COLOR_BLACK "\033[30m" -#define COLOR_RED "\033[31m" -#define COLOR_GREEN "\033[32m" -#define COLOR_YELLOW "\033[33m" -#define COLOR_BLUE "\033[34m" -#define COLOR_MAGENTA "\033[35m" -#define COLOR_CYAN "\033[36m" -#define COLOR_WHITE "\033[37m" - -static const char *diff_colors[] = { - COLOR_RESET, - COLOR_NORMAL, - COLOR_BOLD, - COLOR_CYAN, - COLOR_RED, - COLOR_GREEN +/* "\033[1;30;47m\0" is 11 bytes */ +static char diff_colors[][16] = { + "\033[m", /* reset */ + "", /* normal */ + "\033[1m", /* bold */ + "\033[36m", /* cyan */ + "\033[31m", /* red */ + "\033[32m" /* green */ }; static int parse_diff_color_slot(const char *var, int ofs) @@ -67,38 +51,104 @@ static int parse_diff_color_slot(const char *var, int ofs) die("bad config variable '%s'", var); } -static const char *parse_diff_color_value(const char *value, const char *var) -{ - if (!strcasecmp(value, "normal")) - return COLOR_NORMAL; - if (!strcasecmp(value, "bold")) - return COLOR_BOLD; - if (!strcasecmp(value, "dim")) - return COLOR_DIM; - if (!strcasecmp(value, "ul")) - return COLOR_UL; - if (!strcasecmp(value, "blink")) - return COLOR_BLINK; - if (!strcasecmp(value, "reverse")) - return COLOR_REVERSE; - if (!strcasecmp(value, "reset")) - return COLOR_RESET; - if (!strcasecmp(value, "black")) - return COLOR_BLACK; - if (!strcasecmp(value, "red")) - return COLOR_RED; - if (!strcasecmp(value, "green")) - return COLOR_GREEN; - if (!strcasecmp(value, "yellow")) - return COLOR_YELLOW; - if (!strcasecmp(value, "blue")) - return COLOR_BLUE; - if (!strcasecmp(value, "magenta")) - return COLOR_MAGENTA; - if (!strcasecmp(value, "cyan")) - return COLOR_CYAN; - if (!strcasecmp(value, "white")) - return COLOR_WHITE; +static int parse_color(const char *name, int len) +{ + static const char * const color_names[] = { + "normal", "black", "red", "green", "yellow", + "blue", "magenta", "cyan", "white" + }; + int i; + for (i = 0; i < ARRAY_SIZE(color_names); i++) { + const char *str = color_names[i]; + if (!strncasecmp(name, str, len) && !str[len]) + return i - 1; + } + return -2; +} + +static int parse_attr(const char *name, int len) +{ + static const int attr_values[] = { 1, 2, 4, 5, 7 }; + static const char * const attr_names[] = { + "bold", "dim", "ul", "blink", "reverse" + }; + int i; + for (i = 0; i < ARRAY_SIZE(attr_names); i++) { + const char *str = attr_names[i]; + if (!strncasecmp(name, str, len) && !str[len]) + return attr_values[i]; + } + return -1; +} + +static void parse_diff_color_value(const char *value, const char *var, char *dst) +{ + const char *ptr = value; + int attr = -1; + int fg = -2; + int bg = -2; + + if (!strcasecmp(value, "reset")) { + strcpy(dst, "\033[m"); + return; + } + + /* [fg [bg]] [attr] */ + while (*ptr) { + const char *word = ptr; + int val, len = 0; + + while (word[len] && !isspace(word[len])) + len++; + + ptr = word + len; + while (*ptr && isspace(*ptr)) + ptr++; + + val = parse_color(word, len); + if (val >= -1) { + if (fg == -2) { + fg = val; + continue; + } + if (bg == -2) { + bg = val; + continue; + } + goto bad; + } + val = parse_attr(word, len); + if (val < 0 || attr != -1) + goto bad; + attr = val; + } + + if (attr >= 0 || fg >= 0 || bg >= 0) { + int sep = 0; + + *dst++ = '\033'; + *dst++ = '['; + if (attr >= 0) { + *dst++ = '0' + attr; + sep++; + } + if (fg >= 0) { + if (sep++) + *dst++ = ';'; + *dst++ = '3'; + *dst++ = '0' + fg; + } + if (bg >= 0) { + if (sep++) + *dst++ = ';'; + *dst++ = '4'; + *dst++ = '0' + bg; + } + *dst++ = 'm'; + } + *dst = 0; + return; +bad: die("bad config value '%s' for variable '%s'", value, var); } @@ -145,7 +195,7 @@ int git_diff_ui_config(const char *var, const char *value) } if (!strncmp(var, "diff.color.", 11)) { int slot = parse_diff_color_slot(var, 11); - diff_colors[slot] = parse_diff_color_value(value, var); + parse_diff_color_value(value, var, diff_colors[slot]); return 0; } return git_default_config(var, value); -- cgit v1.3 From f5b571fcf7929ca6e85b3c35c4bb96db305d0b1e Mon Sep 17 00:00:00 2001 From: Timo Hirvonen Date: Thu, 13 Jul 2006 19:08:06 +0300 Subject: diff: Support 256 colors Add support for more than 8 colors. Colors can be specified as numbers -1..255. -1 is same as "normal". Signed-off-by: Timo Hirvonen Signed-off-by: Junio C Hamano --- diff.c | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) (limited to 'diff.c') diff --git a/diff.c b/diff.c index f350c6ba91..8b44756136 100644 --- a/diff.c +++ b/diff.c @@ -26,8 +26,8 @@ enum color_diff { DIFF_FILE_NEW = 5, }; -/* "\033[1;30;47m\0" is 11 bytes */ -static char diff_colors[][16] = { +/* "\033[1;38;5;2xx;48;5;2xxm\0" is 23 bytes */ +static char diff_colors[][24] = { "\033[m", /* reset */ "", /* normal */ "\033[1m", /* bold */ @@ -57,12 +57,16 @@ static int parse_color(const char *name, int len) "normal", "black", "red", "green", "yellow", "blue", "magenta", "cyan", "white" }; + char *end; int i; for (i = 0; i < ARRAY_SIZE(color_names); i++) { const char *str = color_names[i]; if (!strncasecmp(name, str, len) && !str[len]) return i - 1; } + i = strtol(name, &end, 10); + if (*name && !*end && i >= -1 && i <= 255) + return i; return -2; } @@ -135,14 +139,22 @@ static void parse_diff_color_value(const char *value, const char *var, char *dst if (fg >= 0) { if (sep++) *dst++ = ';'; - *dst++ = '3'; - *dst++ = '0' + fg; + if (fg < 8) { + *dst++ = '3'; + *dst++ = '0' + fg; + } else { + dst += sprintf(dst, "38;5;%d", fg); + } } if (bg >= 0) { if (sep++) *dst++ = ';'; - *dst++ = '4'; - *dst++ = '0' + bg; + if (bg < 8) { + *dst++ = '4'; + *dst++ = '0' + bg; + } else { + dst += sprintf(dst, "48;5;%d", bg); + } } *dst++ = 'm'; } -- cgit v1.3 From ce43697379ad8ffcaf061a4709489728c1dbe911 Mon Sep 17 00:00:00 2001 From: Jeff King Date: Sun, 23 Jul 2006 05:24:18 -0400 Subject: Colorize 'commit' lines in log ui When paging through the output of git-whatchanged, the color cues help to visually navigate within a diff. However, it is difficult to notice when a new commit starts, because the commit and log are shown in the "normal" color. This patch colorizes the 'commit' line, customizable through diff.colors.commit and defaulting to yellow. As a side effect, some of the diff color engine (slot enum, get_color) has become accessible outside of diff.c. Signed-off-by: Jeff King Signed-off-by: Junio C Hamano --- diff.c | 28 +++++++++++----------------- diff.h | 11 +++++++++++ log-tree.c | 5 ++++- 3 files changed, 26 insertions(+), 18 deletions(-) (limited to 'diff.c') diff --git a/diff.c b/diff.c index 8b44756136..6a71376483 100644 --- a/diff.c +++ b/diff.c @@ -17,15 +17,6 @@ static int diff_detect_rename_default = 0; static int diff_rename_limit_default = -1; static int diff_use_color_default = 0; -enum color_diff { - DIFF_RESET = 0, - DIFF_PLAIN = 1, - DIFF_METAINFO = 2, - DIFF_FRAGINFO = 3, - DIFF_FILE_OLD = 4, - DIFF_FILE_NEW = 5, -}; - /* "\033[1;38;5;2xx;48;5;2xxm\0" is 23 bytes */ static char diff_colors[][24] = { "\033[m", /* reset */ @@ -33,7 +24,8 @@ static char diff_colors[][24] = { "\033[1m", /* bold */ "\033[36m", /* cyan */ "\033[31m", /* red */ - "\033[32m" /* green */ + "\033[32m", /* green */ + "\033[33m" /* yellow */ }; static int parse_diff_color_slot(const char *var, int ofs) @@ -48,6 +40,8 @@ static int parse_diff_color_slot(const char *var, int ofs) return DIFF_FILE_OLD; if (!strcasecmp(var+ofs, "new")) return DIFF_FILE_NEW; + if (!strcasecmp(var+ofs, "commit")) + return DIFF_COMMIT; die("bad config variable '%s'", var); } @@ -370,7 +364,7 @@ struct emit_callback { const char **label_path; }; -static inline const char *get_color(int diff_use_color, enum color_diff ix) +const char *diff_get_color(int diff_use_color, enum color_diff ix) { if (diff_use_color) return diff_colors[ix]; @@ -381,8 +375,8 @@ static void fn_out_consume(void *priv, char *line, unsigned long len) { int i; struct emit_callback *ecbdata = priv; - const char *set = get_color(ecbdata->color_diff, DIFF_METAINFO); - const char *reset = get_color(ecbdata->color_diff, DIFF_RESET); + const char *set = diff_get_color(ecbdata->color_diff, DIFF_METAINFO); + const char *reset = diff_get_color(ecbdata->color_diff, DIFF_RESET); if (ecbdata->label_path[0]) { printf("%s--- %s%s\n", set, ecbdata->label_path[0], reset); @@ -397,7 +391,7 @@ static void fn_out_consume(void *priv, char *line, unsigned long len) ; if (2 <= i && i < len && line[i] == ' ') { ecbdata->nparents = i - 1; - set = get_color(ecbdata->color_diff, DIFF_FRAGINFO); + set = diff_get_color(ecbdata->color_diff, DIFF_FRAGINFO); } else if (len < ecbdata->nparents) set = reset; @@ -410,7 +404,7 @@ static void fn_out_consume(void *priv, char *line, unsigned long len) else if (line[i] == '+') color = DIFF_FILE_NEW; } - set = get_color(ecbdata->color_diff, color); + set = diff_get_color(ecbdata->color_diff, color); } if (len > 0 && line[len-1] == '\n') len--; @@ -767,8 +761,8 @@ static void builtin_diff(const char *name_a, mmfile_t mf1, mf2; const char *lbl[2]; char *a_one, *b_two; - const char *set = get_color(o->color_diff, DIFF_METAINFO); - const char *reset = get_color(o->color_diff, DIFF_RESET); + const char *set = diff_get_color(o->color_diff, DIFF_METAINFO); + const char *reset = diff_get_color(o->color_diff, DIFF_RESET); a_one = quote_two("a/", name_a); b_two = quote_two("b/", name_b); diff --git a/diff.h b/diff.h index a06f959938..2cced530fa 100644 --- a/diff.h +++ b/diff.h @@ -69,6 +69,17 @@ struct diff_options { add_remove_fn_t add_remove; }; +enum color_diff { + DIFF_RESET = 0, + DIFF_PLAIN = 1, + DIFF_METAINFO = 2, + DIFF_FRAGINFO = 3, + DIFF_FILE_OLD = 4, + DIFF_FILE_NEW = 5, + DIFF_COMMIT = 6, +}; +const char *diff_get_color(int diff_use_color, enum color_diff ix); + extern const char mime_boundary_leader[]; extern void diff_tree_setup_paths(const char **paths, struct diff_options *); diff --git a/log-tree.c b/log-tree.c index 9d8d46fa00..b71cf9ba41 100644 --- a/log-tree.c +++ b/log-tree.c @@ -129,7 +129,8 @@ void show_log(struct rev_info *opt, const char *sep) opt->diffopt.stat_sep = buffer; } } else { - printf("%s%s", + printf("%s%s%s", + diff_get_color(opt->diffopt.color_diff, DIFF_COMMIT), opt->commit_format == CMIT_FMT_ONELINE ? "" : "commit ", diff_unique_abbrev(commit->object.sha1, abbrev_commit)); if (opt->parents) @@ -139,6 +140,8 @@ void show_log(struct rev_info *opt, const char *sep) diff_unique_abbrev(parent->object.sha1, abbrev_commit)); putchar(opt->commit_format == CMIT_FMT_ONELINE ? ' ' : '\n'); + printf("%s", + diff_get_color(opt->diffopt.color_diff, DIFF_RESET)); } /* -- cgit v1.3 From aa086eb813d4fe21aac556a94efe5e29b44d8ca4 Mon Sep 17 00:00:00 2001 From: Matthias Lederhofer Date: Sun, 30 Jul 2006 00:27:43 +0200 Subject: pager: config variable pager.color enable/disable colored output when the pager is in use Signed-off-by: Matthias Lederhofer Signed-off-by: Junio C Hamano --- Documentation/config.txt | 4 ++++ cache.h | 1 + config.c | 5 +++++ diff.c | 2 +- environment.c | 1 + 5 files changed, 12 insertions(+), 1 deletion(-) (limited to 'diff.c') diff --git a/Documentation/config.txt b/Documentation/config.txt index 465eb13e76..e669003f72 100644 --- a/Documentation/config.txt +++ b/Documentation/config.txt @@ -116,6 +116,10 @@ apply.whitespace:: Tells `git-apply` how to handle whitespaces, in the same way as the '--whitespace' option. See gitlink:git-apply[1]. +pager.color:: + A boolean to enable/disable colored output when the pager is in + use (default is true). + diff.color:: When true (or `always`), always use colors in patch. When false (or `never`), never. When set to `auto`, use diff --git a/cache.h b/cache.h index c575b8a996..b8c21e07b2 100644 --- a/cache.h +++ b/cache.h @@ -386,6 +386,7 @@ extern int receive_keep_pack(int fd[2], const char *me, int quiet, int); /* pager.c */ extern void setup_pager(void); extern int pager_in_use; +extern int pager_use_color; /* base85 */ int decode_85(char *dst, char *line, int linelen); diff --git a/config.c b/config.c index 0ac6aebbbc..82b3562454 100644 --- a/config.c +++ b/config.c @@ -309,6 +309,11 @@ int git_default_config(const char *var, const char *value) return 0; } + if (!strcmp(var, "pager.color")) { + pager_use_color = git_config_bool(var,value); + return 0; + } + /* Add other config variables here and to Documentation/config.txt. */ return 0; } diff --git a/diff.c b/diff.c index 6a71376483..607c357f5a 100644 --- a/diff.c +++ b/diff.c @@ -175,7 +175,7 @@ int git_diff_ui_config(const char *var, const char *value) diff_use_color_default = 1; /* bool */ else if (!strcasecmp(value, "auto")) { diff_use_color_default = 0; - if (isatty(1) || pager_in_use) { + if (isatty(1) || (pager_in_use && pager_use_color)) { char *term = getenv("TERM"); if (term && strcmp(term, "dumb")) diff_use_color_default = 1; diff --git a/environment.c b/environment.c index 42f39d657e..87162b2572 100644 --- a/environment.c +++ b/environment.c @@ -23,6 +23,7 @@ int shared_repository = PERM_UMASK; const char *apply_default_whitespace = NULL; int zlib_compression_level = Z_DEFAULT_COMPRESSION; int pager_in_use; +int pager_use_color = 1; static char *git_dir, *git_object_dir, *git_index_file, *git_refs_dir, *git_graft_file; -- cgit v1.3 From ef677686efe1868432d3cc9d4c41a93b44f3def8 Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Thu, 3 Aug 2006 12:01:01 -0700 Subject: diff.c: do not use pathname comparison to tell renames The final output from diff used to compare pathnames between preimage and postimage to tell if the filepair is a rename/copy. By explicitly marking the filepair created by diffcore_rename(), the output routine, resolve_rename_copy(), does not have to do so anymore. This helps feeding a filepair that has different pathnames in one and two elements to the diff machinery (most notably, comparing two blobs). Signed-off-by: Junio C Hamano --- diff.c | 6 +----- diffcore-rename.c | 1 + diffcore.h | 3 ++- 3 files changed, 4 insertions(+), 6 deletions(-) (limited to 'diff.c') diff --git a/diff.c b/diff.c index 607c357f5a..895c137655 100644 --- a/diff.c +++ b/diff.c @@ -1786,13 +1786,9 @@ struct diff_filepair *diff_queue(struct diff_queue_struct *queue, struct diff_filespec *one, struct diff_filespec *two) { - struct diff_filepair *dp = xmalloc(sizeof(*dp)); + struct diff_filepair *dp = xcalloc(1, sizeof(*dp)); dp->one = one; dp->two = two; - dp->score = 0; - dp->status = 0; - dp->source_stays = 0; - dp->broken_pair = 0; if (queue) diff_q(queue, dp); return dp; diff --git a/diffcore-rename.c b/diffcore-rename.c index 1de8d32502..0ec488a903 100644 --- a/diffcore-rename.c +++ b/diffcore-rename.c @@ -205,6 +205,7 @@ static void record_rename_pair(int dst_index, int src_index, int score) fill_filespec(two, dst->sha1, dst->mode); dp = diff_queue(NULL, one, two); + dp->renamed_pair = 1; if (!strcmp(src->path, dst->path)) dp->score = rename_src[src_index].score; else diff --git a/diffcore.h b/diffcore.h index 73c7842cc7..2249bc2c05 100644 --- a/diffcore.h +++ b/diffcore.h @@ -53,11 +53,12 @@ struct diff_filepair { char status; /* M C R N D U (see Documentation/diff-format.txt) */ unsigned source_stays : 1; /* all of R/C are copies */ unsigned broken_pair : 1; + unsigned renamed_pair : 1; }; #define DIFF_PAIR_UNMERGED(p) \ (!DIFF_FILE_VALID((p)->one) && !DIFF_FILE_VALID((p)->two)) -#define DIFF_PAIR_RENAME(p) (strcmp((p)->one->path, (p)->two->path)) +#define DIFF_PAIR_RENAME(p) ((p)->renamed_pair) #define DIFF_PAIR_BROKEN(p) \ ( (!DIFF_FILE_VALID((p)->one) != !DIFF_FILE_VALID((p)->two)) && \ -- cgit v1.3