From: Junio C Hamano Date: Fri, 22 Dec 2006 06:56:04 +0000 (-0800) Subject: Merge branch 'maint' X-Git-Tag: v1.5.0-rc0~43 X-Git-Url: https://git.lorimer.id.au/gitweb.git/diff_plain/27e4dd8de76bdd60c88003e0f27cee8ad26c5cd6?hp=-c Merge branch 'maint' * maint: diff --check: fix off by one error spurious .sp in manpages --- 27e4dd8de76bdd60c88003e0f27cee8ad26c5cd6 diff --combined diff.c index 91f956b23b,b003c00016..f14288bb8a --- a/diff.c +++ b/diff.c @@@ -1,6 -1,9 +1,6 @@@ /* * Copyright (C) 2005 Junio C Hamano */ -#include -#include -#include #include "cache.h" #include "quote.h" #include "diff.h" @@@ -9,12 -12,6 +9,12 @@@ #include "xdiff-interface.h" #include "color.h" +#ifdef NO_FAST_WORKING_DIRECTORY +#define FAST_WORKING_DIRECTORY 0 +#else +#define FAST_WORKING_DIRECTORY 1 +#endif + static int use_size_cache; static int diff_detect_rename_default; @@@ -63,7 -60,7 +63,7 @@@ int git_diff_ui_config(const char *var diff_rename_limit_default = git_config_int(var, value); return 0; } - if (!strcmp(var, "diff.color")) { + if (!strcmp(var, "diff.color") || !strcmp(var, "color.diff")) { diff_use_color_default = git_config_colorbool(var, value); return 0; } @@@ -77,7 -74,7 +77,7 @@@ diff_detect_rename_default = DIFF_DETECT_RENAME; return 0; } - if (!strncmp(var, "diff.color.", 11)) { + if (!strncmp(var, "diff.color.", 11) || !strncmp(var, "color.diff.", 11)) { int slot = parse_diff_color_slot(var, 11); color_parse(value, var, diff_colors[slot]); return 0; @@@ -798,35 -795,6 +798,35 @@@ static void show_stats(struct diffstat_ set, total_files, adds, dels, reset); } +static void show_shortstats(struct diffstat_t* data) +{ + int i, adds = 0, dels = 0, total_files = data->nr; + + if (data->nr == 0) + return; + + for (i = 0; i < data->nr; i++) { + if (!data->files[i]->is_binary && + !data->files[i]->is_unmerged) { + int added = data->files[i]->added; + int deleted= data->files[i]->deleted; + if (!data->files[i]->is_renamed && + (added + deleted == 0)) { + total_files--; + } else { + adds += added; + dels += deleted; + } + } + free(data->files[i]->name); + free(data->files[i]); + } + free(data->files); + + printf(" %d files changed, %d insertions(+), %d deletions(-)\n", + total_files, adds, dels); +} + static void show_numstat(struct diffstat_t* data, struct diff_options *options) { int i; @@@ -834,10 -802,7 +834,10 @@@ for (i = 0; i < data->nr; i++) { struct diffstat_file *file = data->files[i]; - printf("%d\t%d\t", file->added, file->deleted); + if (file->is_binary) + printf("-\t-\t"); + else + printf("%d\t%d\t", file->added, file->deleted); if (options->line_termination && quote_c_style(file->name, NULL, NULL, 0)) quote_c_style(file->name, NULL, stdout, 0); @@@ -860,8 -825,6 +860,6 @@@ static void checkdiff_consume(void *pri if (line[0] == '+') { int i, spaces = 0; - data->lineno++; - /* check space before tab */ for (i = 1; i < len && (line[i] == ' ' || line[i] == '\t'); i++) if (line[i] == ' ') @@@ -876,6 -839,8 +874,8 @@@ if (isspace(line[len - 1])) printf("%s:%d: white space at end: %.*s\n", data->filename, data->lineno, (int)len, line); + + data->lineno++; } else if (line[0] == ' ') data->lineno++; else if (line[0] == '@') { @@@ -1190,7 -1155,7 +1190,7 @@@ void fill_filespec(struct diff_filespe * the work tree has that object contents, return true, so that * prepare_temp_file() does not have to inflate and extract. */ -static int work_tree_matches(const char *name, const unsigned char *sha1) +static int reuse_worktree_file(const char *name, const unsigned char *sha1, int want_file) { struct cache_entry *ce; struct stat st; @@@ -1211,18 -1176,6 +1211,18 @@@ if (!active_cache) return 0; + /* We want to avoid the working directory if our caller + * doesn't need the data in a normal file, this system + * is rather slow with its stat/open/mmap/close syscalls, + * and the object is contained in a pack file. The pack + * is probably already open and will be faster to obtain + * the data through than the working directory. Loose + * objects however would tend to be slower as they need + * to be individually opened and inflated. + */ + if (!FAST_WORKING_DIRECTORY && !want_file && has_sha1_pack(sha1, NULL)) + return 0; + len = strlen(name); pos = cache_name_pos(name, len); if (pos < 0) @@@ -1309,7 -1262,7 +1309,7 @@@ int diff_populate_filespec(struct diff_ if (s->data) return err; if (!s->sha1_valid || - work_tree_matches(s->path, s->sha1)) { + reuse_worktree_file(s->path, s->sha1, 0)) { struct stat st; int fd; if (lstat(s->path, &st) < 0) { @@@ -1416,7 -1369,7 +1416,7 @@@ static void prepare_temp_file(const cha } if (!one->sha1_valid || - work_tree_matches(name, one->sha1)) { + reuse_worktree_file(name, one->sha1, 1)) { struct stat st; if (lstat(name, &st) < 0) { if (errno == ENOENT) @@@ -1797,7 -1750,6 +1797,7 @@@ int diff_setup_done(struct diff_option options->output_format &= ~(DIFF_FORMAT_RAW | DIFF_FORMAT_NUMSTAT | DIFF_FORMAT_DIFFSTAT | + DIFF_FORMAT_SHORTSTAT | DIFF_FORMAT_SUMMARY | DIFF_FORMAT_PATCH); @@@ -1808,7 -1760,6 +1808,7 @@@ if (options->output_format & (DIFF_FORMAT_PATCH | DIFF_FORMAT_NUMSTAT | DIFF_FORMAT_DIFFSTAT | + DIFF_FORMAT_SHORTSTAT | DIFF_FORMAT_SUMMARY | DIFF_FORMAT_CHECKDIFF)) options->recursive = 1; @@@ -1900,9 -1851,6 +1900,9 @@@ int diff_opt_parse(struct diff_options else if (!strcmp(arg, "--numstat")) { options->output_format |= DIFF_FORMAT_NUMSTAT; } + else if (!strcmp(arg, "--shortstat")) { + options->output_format |= DIFF_FORMAT_SHORTSTAT; + } else if (!strncmp(arg, "--stat", 6)) { char *end; int width = options->stat_width; @@@ -2677,7 -2625,7 +2677,7 @@@ void diff_flush(struct diff_options *op separator++; } - if (output_format & (DIFF_FORMAT_DIFFSTAT|DIFF_FORMAT_NUMSTAT)) { + if (output_format & (DIFF_FORMAT_DIFFSTAT|DIFF_FORMAT_SHORTSTAT|DIFF_FORMAT_NUMSTAT)) { struct diffstat_t diffstat; memset(&diffstat, 0, sizeof(struct diffstat_t)); @@@ -2691,8 -2639,6 +2691,8 @@@ show_numstat(&diffstat, options); if (output_format & DIFF_FORMAT_DIFFSTAT) show_stats(&diffstat, options); + else if (output_format & DIFF_FORMAT_SHORTSTAT) + show_shortstats(&diffstat); separator++; }