Merge branch 'jc/blame'
authorJunio C Hamano <junkio@cox.net>
Wed, 20 Dec 2006 21:58:10 +0000 (13:58 -0800)
committerJunio C Hamano <junkio@cox.net>
Wed, 20 Dec 2006 21:58:10 +0000 (13:58 -0800)
* jc/blame:
blame: -b (blame.blankboundary) and --root (blame.showroot)

1  2 
builtin-blame.c
diff --combined builtin-blame.c
index 9bf6ec951fb5d7535441a8db5b73d20f509ed982,211bdb3a758eaf813f54b1895ff2e971d170500a..4a1accf13c1220745c73999c6c345735aeadc3e5
  #include "revision.h"
  #include "xdiff-interface.h"
  
 -#include <time.h>
 -#include <sys/time.h>
 -#include <regex.h>
 -
  static char blame_usage[] =
  "git-blame [-c] [-l] [-t] [-f] [-n] [-p] [-L n,m] [-S <revs-file>] [-M] [-C] [-C] [commit] [--] file\n"
  "  -c, --compatibility Use the same output mode as git-annotate (Default: off)\n"
+ "  -b                  Show blank SHA-1 for boundary commits (Default: off)\n"
  "  -l, --long          Show long commit SHA1 (Default: off)\n"
+ "  --root              Do not treat root commits as boundaries (Default: off)\n"
  "  -t, --time          Show raw timestamp (Default: off)\n"
  "  -f, --show-name     Show original filename (Default: auto)\n"
  "  -n, --show-number   Show original linenumber (Default: off)\n"
@@@ -32,6 -38,8 +34,8 @@@ static int longest_author
  static int max_orig_digits;
  static int max_digits;
  static int max_score_digits;
+ static int show_root;
+ static int blank_boundary;
  
  #ifndef DEBUG
  #define DEBUG 0
@@@ -1091,6 -1099,9 +1095,9 @@@ static void assign_blame(struct scorebo
                        if (commit->object.parsed)
                                mark_parents_uninteresting(commit);
                }
+               /* treat root commit as boundary */
+               if (!commit->parents && !show_root)
+                       commit->object.flags |= UNINTERESTING;
  
                /* Take responsibility for the remaining entries */
                for (ent = sb->ent; ent; ent = ent->next)
@@@ -1314,8 -1325,12 +1321,12 @@@ static void emit_other(struct scoreboar
                int length = (opt & OUTPUT_LONG_OBJECT_NAME) ? 40 : 8;
  
                if (suspect->commit->object.flags & UNINTERESTING) {
-                       length--;
-                       putchar('^');
+                       if (!blank_boundary) {
+                               length--;
+                               putchar('^');
+                       }
+                       else
+                               memset(hex, ' ', length);
                }
  
                printf("%.*s", length, hex);
@@@ -1635,6 -1650,19 +1646,19 @@@ static void prepare_blame_range(struct 
                usage(blame_usage);
  }
  
+ static int git_blame_config(const char *var, const char *value)
+ {
+       if (!strcmp(var, "blame.showroot")) {
+               show_root = git_config_bool(var, value);
+               return 0;
+       }
+       if (!strcmp(var, "blame.blankboundary")) {
+               blank_boundary = git_config_bool(var, value);
+               return 0;
+       }
+       return git_default_config(var, value);
+ }
  int cmd_blame(int argc, const char **argv, const char *prefix)
  {
        struct rev_info revs;
        char type[10];
        const char *bottomtop = NULL;
  
+       git_config(git_blame_config);
        save_commit_buffer = 0;
  
        opt = 0;
                const char *arg = argv[i];
                if (*arg != '-')
                        break;
+               else if (!strcmp("-b", arg))
+                       blank_boundary = 1;
+               else if (!strcmp("--root", arg))
+                       show_root = 1;
                else if (!strcmp("-c", arg))
                        output_option |= OUTPUT_ANNOTATE_COMPAT;
                else if (!strcmp("-t", arg))