From 88a8b7955666ed8fa5924fadbb3bb58984eaa6af Mon Sep 17 00:00:00 2001 From: Fredrik Kuivinen Date: Fri, 17 Mar 2006 22:49:28 +0100 Subject: blame: Nicer output As pointed out by Junio, it may be dangerous to cut off people's names after 15 bytes. If the name is encoded in an encoding which uses more than one byte per code point we may end up with outputting garbage. Instead of trying to do something smart, just output the entire name. We don't gain much screen space by chopping it off anyway. Furthermore, only output the file name if we actually found any renames. Signed-off-by: Fredrik Kuivinen Signed-off-by: Junio C Hamano --- blame.c | 35 ++++++++++++++++++++++++++++++----- 1 file changed, 30 insertions(+), 5 deletions(-) diff --git a/blame.c b/blame.c index 1fb507028b..8af4b54300 100644 --- a/blame.c +++ b/blame.c @@ -742,6 +742,8 @@ int main(int argc, const char **argv) struct commit_info ci; const char *buf; int max_digits; + size_t longest_file, longest_author; + int found_rename; const char* prefix = setup_git_directory(); @@ -818,6 +820,25 @@ int main(int argc, const char **argv) for (max_digits = 1, i = 10; i <= num_blame_lines + 1; max_digits++) i *= 10; + longest_file = 0; + longest_author = 0; + found_rename = 0; + for (i = 0; i < num_blame_lines; i++) { + struct commit *c = blame_lines[i]; + struct util_info* u; + if (!c) + c = initial; + u = c->object.util; + + if (!found_rename && strcmp(filename, u->pathname)) + found_rename = 1; + if (longest_file < strlen(u->pathname)) + longest_file = strlen(u->pathname); + get_commit_info(c, &ci); + if (longest_author < strlen(ci.author)) + longest_author = strlen(ci.author); + } + for (i = 0; i < num_blame_lines; i++) { struct commit *c = blame_lines[i]; struct util_info* u; @@ -828,14 +849,18 @@ int main(int argc, const char **argv) u = c->object.util; get_commit_info(c, &ci); fwrite(sha1_to_hex(c->object.sha1), sha1_len, 1, stdout); - if(compability) + if(compability) { printf("\t(%10s\t%10s\t%d)", ci.author, format_time(ci.author_time, ci.author_tz), i+1); - else - printf(" %s (%-15.15s %10s %*d) ", u->pathname, - ci.author, format_time(ci.author_time, - ci.author_tz), + } else { + if (found_rename) + printf(" %-*.*s", longest_file, longest_file, + u->pathname); + printf(" (%-*.*s %10s %*d) ", + longest_author, longest_author, ci.author, + format_time(ci.author_time, ci.author_tz), max_digits, i+1); + } if(i == num_blame_lines - 1) { fwrite(buf, blame_len - (buf - blame_contents), -- cgit v1.2.3 From 53dc4636275c966bb0781709fd0dded1cced4458 Mon Sep 17 00:00:00 2001 From: Fredrik Kuivinen Date: Fri, 17 Mar 2006 22:49:31 +0100 Subject: blame: Fix git-blame Before this patch git-blame gave non-sensible output. (It assigned blame to some random file in ) Abort with an error message instead. Signed-off-by: Fredrik Kuivinen Signed-off-by: Junio C Hamano --- blame.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/blame.c b/blame.c index 8af4b54300..9c97aeca45 100644 --- a/blame.c +++ b/blame.c @@ -180,11 +180,13 @@ static int get_blob_sha1_internal(unsigned char *sha1, const char *base, unsigned mode, int stage); static unsigned char blob_sha1[20]; +static const char* blame_file; static int get_blob_sha1(struct tree *t, const char *pathname, unsigned char *sha1) { int i; const char *pathspec[2]; + blame_file = pathname; pathspec[0] = pathname; pathspec[1] = NULL; memset(blob_sha1, 0, sizeof(blob_sha1)); @@ -209,6 +211,10 @@ static int get_blob_sha1_internal(unsigned char *sha1, const char *base, if (S_ISDIR(mode)) return READ_TREE_RECURSIVE; + if (strncmp(blame_file, base, baselen) || + strcmp(blame_file + baselen, pathname)) + return -1; + memcpy(blob_sha1, sha1, 20); return -1; } -- cgit v1.2.3 From cb85bfe5dfd7504dfee43ae49a76edb92e8d8eb0 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Tue, 7 Mar 2006 05:52:02 -0800 Subject: ls-tree: add --abbrev[=] option Signed-off-by: Eric Wong Signed-off-by: Junio C Hamano --- Documentation/git-ls-tree.txt | 9 ++++++++- ls-tree.c | 19 +++++++++++++++++-- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/Documentation/git-ls-tree.txt b/Documentation/git-ls-tree.txt index 5bf6d8b613..018c401953 100644 --- a/Documentation/git-ls-tree.txt +++ b/Documentation/git-ls-tree.txt @@ -8,7 +8,9 @@ git-ls-tree - Lists the contents of a tree object SYNOPSIS -------- -'git-ls-tree' [-d] [-r] [-t] [-z] [--name-only] [--name-status] [paths...] +'git-ls-tree' [-d] [-r] [-t] [-z] + [--name-only] [--name-status] [--full-name] [--abbrev=[]] + [paths...] DESCRIPTION ----------- @@ -40,6 +42,11 @@ OPTIONS --name-status:: List only filenames (instead of the "long" output), one per line. +--abbrev[=]:: + Instead of showing the full 40-byte hexadecimal object + lines, show only handful hexdigits prefix. + Non default number of digits can be specified with --abbrev=. + paths:: When paths are given, show them (note that this isn't really raw pathnames, but rather a list of patterns to match). Otherwise diff --git a/ls-tree.c b/ls-tree.c index d005643ee0..97f09bdf81 100644 --- a/ls-tree.c +++ b/ls-tree.c @@ -13,13 +13,14 @@ static int line_termination = '\n'; #define LS_TREE_ONLY 2 #define LS_SHOW_TREES 4 #define LS_NAME_ONLY 8 +static int abbrev = 0; static int ls_options = 0; const char **pathspec; static int chomp_prefix = 0; static const char *prefix; static const char ls_tree_usage[] = - "git-ls-tree [-d] [-r] [-t] [-z] [--name-only] [--name-status] [--full-name] [path...]"; + "git-ls-tree [-d] [-r] [-t] [-z] [--name-only] [--name-status] [--full-name] [--abbrev[=]] [path...]"; static int show_recursive(const char *base, int baselen, const char *pathname) { @@ -73,7 +74,9 @@ static int show_tree(unsigned char *sha1, const char *base, int baselen, return 0; if (!(ls_options & LS_NAME_ONLY)) - printf("%06o %s %s\t", mode, type, sha1_to_hex(sha1)); + printf("%06o %s %s\t", mode, type, + abbrev ? find_unique_abbrev(sha1,abbrev) + : sha1_to_hex(sha1)); write_name_quoted(base + chomp_prefix, baselen - chomp_prefix, pathname, line_termination, stdout); @@ -113,6 +116,18 @@ int main(int argc, const char **argv) chomp_prefix = 0; break; } + if (!strncmp(argv[1]+2, "abbrev=",7)) { + abbrev = strtoul(argv[1]+9, NULL, 10); + if (abbrev && abbrev < MINIMUM_ABBREV) + abbrev = MINIMUM_ABBREV; + else if (abbrev > 40) + abbrev = 40; + break; + } + if (!strcmp(argv[1]+2, "abbrev")) { + abbrev = DEFAULT_ABBREV; + break; + } /* otherwise fallthru */ default: usage(ls_tree_usage); -- cgit v1.2.3 From ad0cae4cb9364b02b74b17f98f818a8e07372693 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Tue, 7 Mar 2006 11:59:17 -0800 Subject: ls-files: add --abbrev[=] option Signed-off-by: Eric Wong Signed-off-by: Junio C Hamano --- Documentation/git-ls-files.txt | 9 +++++++-- ls-files.c | 19 +++++++++++++++++-- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/Documentation/git-ls-files.txt b/Documentation/git-ls-files.txt index e813f84202..59f6adc494 100644 --- a/Documentation/git-ls-files.txt +++ b/Documentation/git-ls-files.txt @@ -14,9 +14,9 @@ SYNOPSIS (-[c|d|o|i|s|u|k|m])\* [-x |--exclude=] [-X |--exclude-from=] - [--exclude-per-directory=] + [--exclude-per-directory=] [--error-unmatch] - [--full-name] [--] []\* + [--full-name] [--abbrev] [--] []\* DESCRIPTION ----------- @@ -98,6 +98,11 @@ OPTIONS option forces paths to be output relative to the project top directory. +--abbrev[=]:: + Instead of showing the full 40-byte hexadecimal object + lines, show only handful hexdigits prefix. + Non default number of digits can be specified with --abbrev=. + --:: Do not interpret any more arguments as options. diff --git a/ls-files.c b/ls-files.c index df25c8c012..585f6a7ff2 100644 --- a/ls-files.c +++ b/ls-files.c @@ -11,6 +11,7 @@ #include "cache.h" #include "quote.h" +static int abbrev = 0; static int show_deleted = 0; static int show_cached = 0; static int show_others = 0; @@ -488,7 +489,8 @@ static void show_ce_entry(const char *tag, struct cache_entry *ce) printf("%s%06o %s %d\t", tag, ntohl(ce->ce_mode), - sha1_to_hex(ce->sha1), + abbrev ? find_unique_abbrev(ce->sha1,abbrev) + : sha1_to_hex(ce->sha1), ce_stage(ce)); write_name_quoted("", 0, ce->name + offset, line_terminator, stdout); @@ -629,7 +631,8 @@ static void verify_pathspec(void) static const char ls_files_usage[] = "git-ls-files [-z] [-t] [-v] (--[cached|deleted|others|stage|unmerged|killed|modified])* " "[ --ignored ] [--exclude=] [--exclude-from=] " - "[ --exclude-per-directory= ] [--full-name] [--] []*"; + "[ --exclude-per-directory= ] [--full-name] [--abbrev] " + "[--] []*"; int main(int argc, const char **argv) { @@ -736,6 +739,18 @@ int main(int argc, const char **argv) error_unmatch = 1; continue; } + if (!strncmp(arg, "--abbrev=", 9)) { + abbrev = strtoul(arg+9, NULL, 10); + if (abbrev && abbrev < MINIMUM_ABBREV) + abbrev = MINIMUM_ABBREV; + else if (abbrev > 40) + abbrev = 40; + continue; + } + if (!strcmp(arg, "--abbrev")) { + abbrev = DEFAULT_ABBREV; + continue; + } if (*arg == '-') usage(ls_files_usage); break; -- cgit v1.2.3