Merge branch 'maint-1.5.4' into maint
authorJunio C Hamano <gitster@pobox.com>
Sat, 12 Apr 2008 22:41:19 +0000 (15:41 -0700)
committerJunio C Hamano <gitster@pobox.com>
Sat, 12 Apr 2008 22:41:19 +0000 (15:41 -0700)
* maint-1.5.4:
Docs gitk: Explicitly mention the files that gitk uses (~/.gitk)
Document -w option to shortlog
bisect: report bad rev better

1  2 
builtin-shortlog.c
git-bisect.sh
diff --combined builtin-shortlog.c
index bd795b1db7a4054a0218d1ec96794ad25d656896,01cfd7b47c120133eafaf0701bc721fbf50fddc5..e6a2865019cceadfcbfc8575a2bd1f97b7159dcb
@@@ -6,11 -6,13 +6,11 @@@
  #include "revision.h"
  #include "utf8.h"
  #include "mailmap.h"
 +#include "shortlog.h"
  
  static const char shortlog_usage[] =
- "git-shortlog [-n] [-s] [-e] [<commit-id>... ]";
+ "git-shortlog [-n] [-s] [-e] [-w] [<commit-id>... ]";
  
 -static char *common_repo_prefix;
 -static int email;
 -
  static int compare_by_number(const void *a1, const void *a2)
  {
        const struct path_list_item *i1 = a1, *i2 = a2;
                return -1;
  }
  
 -static struct path_list mailmap = {NULL, 0, 0, 0};
 -
 -static void insert_one_record(struct path_list *list,
 +static void insert_one_record(struct shortlog *log,
                              const char *author,
                              const char *oneline)
  {
 -      const char *dot3 = common_repo_prefix;
 +      const char *dot3 = log->common_repo_prefix;
        char *buffer, *p;
        struct path_list_item *item;
        struct path_list *onelines;
@@@ -43,7 -47,7 +43,7 @@@
        eoemail = strchr(boemail, '>');
        if (!eoemail)
                return;
 -      if (!map_email(&mailmap, boemail+1, namebuf, sizeof(namebuf))) {
 +      if (!map_email(&log->mailmap, boemail+1, namebuf, sizeof(namebuf))) {
                while (author < boemail && isspace(*author))
                        author++;
                for (len = 0;
        else
                len = strlen(namebuf);
  
 -      if (email) {
 +      if (log->email) {
                size_t room = sizeof(namebuf) - len - 1;
                int maillen = eoemail - boemail + 1;
                snprintf(namebuf + len, room, " %.*s", maillen, boemail);
        }
  
        buffer = xstrdup(namebuf);
 -      item = path_list_insert(buffer, list);
 +      item = path_list_insert(buffer, &log->list);
        if (item->util == NULL)
                item->util = xcalloc(1, sizeof(struct path_list));
        else
        onelines->items[onelines->nr++].path = buffer;
  }
  
 -static void read_from_stdin(struct path_list *list)
 +static void read_from_stdin(struct shortlog *log)
  {
        char author[1024], oneline[1024];
  
                while (fgets(oneline, sizeof(oneline), stdin) &&
                       oneline[0] == '\n')
                        ; /* discard blanks */
 -              insert_one_record(list, author + 8, oneline);
 +              insert_one_record(log, author + 8, oneline);
        }
  }
  
 -static void get_from_rev(struct rev_info *rev, struct path_list *list)
 +void shortlog_add_commit(struct shortlog *log, struct commit *commit)
  {
 -      struct commit *commit;
 -
 -      prepare_revision_walk(rev);
 -      while ((commit = get_revision(rev)) != NULL) {
 -              const char *author = NULL, *buffer;
 +      const char *author = NULL, *buffer;
  
 -              buffer = commit->buffer;
 -              while (*buffer && *buffer != '\n') {
 -                      const char *eol = strchr(buffer, '\n');
 +      buffer = commit->buffer;
 +      while (*buffer && *buffer != '\n') {
 +              const char *eol = strchr(buffer, '\n');
  
 -                      if (eol == NULL)
 -                              eol = buffer + strlen(buffer);
 -                      else
 -                              eol++;
 +              if (eol == NULL)
 +                      eol = buffer + strlen(buffer);
 +              else
 +                      eol++;
  
 -                      if (!prefixcmp(buffer, "author "))
 -                              author = buffer + 7;
 -                      buffer = eol;
 -              }
 -              if (!author)
 -                      die("Missing author: %s",
 -                          sha1_to_hex(commit->object.sha1));
 -              if (*buffer)
 -                      buffer++;
 -              insert_one_record(list, author, !*buffer ? "<none>" : buffer);
 +              if (!prefixcmp(buffer, "author "))
 +                      author = buffer + 7;
 +              buffer = eol;
        }
 +      if (!author)
 +              die("Missing author: %s",
 +                  sha1_to_hex(commit->object.sha1));
 +      if (*buffer)
 +              buffer++;
 +      insert_one_record(log, author, !*buffer ? "<none>" : buffer);
 +}
 +
 +static void get_from_rev(struct rev_info *rev, struct shortlog *log)
 +{
 +      struct commit *commit;
 +
 +      if (prepare_revision_walk(rev))
 +              die("revision walk setup failed");
 +      while ((commit = get_revision(rev)) != NULL)
 +              shortlog_add_commit(log, commit);
  }
  
  static int parse_uint(char const **arg, int comma)
@@@ -213,40 -212,29 +213,40 @@@ static void parse_wrap_args(const char 
                die(wrap_arg_usage);
  }
  
 +void shortlog_init(struct shortlog *log)
 +{
 +      memset(log, 0, sizeof(*log));
 +
 +      read_mailmap(&log->mailmap, ".mailmap", &log->common_repo_prefix);
 +
 +      log->list.strdup_paths = 1;
 +      log->wrap = DEFAULT_WRAPLEN;
 +      log->in1 = DEFAULT_INDENT1;
 +      log->in2 = DEFAULT_INDENT2;
 +}
 +
  int cmd_shortlog(int argc, const char **argv, const char *prefix)
  {
 +      struct shortlog log;
        struct rev_info rev;
 -      struct path_list list = { NULL, 0, 0, 1 };
 -      int i, j, sort_by_number = 0, summary = 0;
 -      int wrap_lines = 0;
 -      int wrap = DEFAULT_WRAPLEN;
 -      int in1 = DEFAULT_INDENT1;
 -      int in2 = DEFAULT_INDENT2;
 +      int nongit;
 +
 +      prefix = setup_git_directory_gently(&nongit);
 +      shortlog_init(&log);
  
        /* since -n is a shadowed rev argument, parse our args first */
        while (argc > 1) {
                if (!strcmp(argv[1], "-n") || !strcmp(argv[1], "--numbered"))
 -                      sort_by_number = 1;
 +                      log.sort_by_number = 1;
                else if (!strcmp(argv[1], "-s") ||
                                !strcmp(argv[1], "--summary"))
 -                      summary = 1;
 +                      log.summary = 1;
                else if (!strcmp(argv[1], "-e") ||
                         !strcmp(argv[1], "--email"))
 -                      email = 1;
 +                      log.email = 1;
                else if (!prefixcmp(argv[1], "-w")) {
 -                      wrap_lines = 1;
 -                      parse_wrap_args(argv[1], &in1, &in2, &wrap);
 +                      log.wrap_lines = 1;
 +                      parse_wrap_args(argv[1], &log.in1, &log.in2, &log.wrap);
                }
                else if (!strcmp(argv[1], "-h") || !strcmp(argv[1], "--help"))
                        usage(shortlog_usage);
        if (argc > 1)
                die ("unrecognized argument: %s", argv[1]);
  
 -      read_mailmap(&mailmap, ".mailmap", &common_repo_prefix);
 -
        /* assume HEAD if from a tty */
 -      if (!rev.pending.nr && isatty(0))
 +      if (!nongit && !rev.pending.nr && isatty(0))
                add_head_to_pending(&rev);
        if (rev.pending.nr == 0) {
 -              read_from_stdin(&list);
 +              read_from_stdin(&log);
        }
        else
 -              get_from_rev(&rev, &list);
 +              get_from_rev(&rev, &log);
  
 -      if (sort_by_number)
 -              qsort(list.items, list.nr, sizeof(struct path_list_item),
 -                      compare_by_number);
 +      shortlog_output(&log);
 +      return 0;
 +}
  
 -      for (i = 0; i < list.nr; i++) {
 -              struct path_list *onelines = list.items[i].util;
 +void shortlog_output(struct shortlog *log)
 +{
 +      int i, j;
 +      if (log->sort_by_number)
 +              qsort(log->list.items, log->list.nr, sizeof(struct path_list_item),
 +                      compare_by_number);
 +      for (i = 0; i < log->list.nr; i++) {
 +              struct path_list *onelines = log->list.items[i].util;
  
 -              if (summary) {
 -                      printf("%6d\t%s\n", onelines->nr, list.items[i].path);
 +              if (log->summary) {
 +                      printf("%6d\t%s\n", onelines->nr, log->list.items[i].path);
                } else {
 -                      printf("%s (%d):\n", list.items[i].path, onelines->nr);
 +                      printf("%s (%d):\n", log->list.items[i].path, onelines->nr);
                        for (j = onelines->nr - 1; j >= 0; j--) {
                                const char *msg = onelines->items[j].path;
  
 -                              if (wrap_lines) {
 -                                      int col = print_wrapped_text(msg, in1, in2, wrap);
 -                                      if (col != wrap)
 +                              if (log->wrap_lines) {
 +                                      int col = print_wrapped_text(msg, log->in1, log->in2, log->wrap);
 +                                      if (col != log->wrap)
                                                putchar('\n');
                                }
                                else
                onelines->strdup_paths = 1;
                path_list_clear(onelines, 1);
                free(onelines);
 -              list.items[i].util = NULL;
 +              log->list.items[i].util = NULL;
        }
  
 -      list.strdup_paths = 1;
 -      path_list_clear(&list, 1);
 -      mailmap.strdup_paths = 1;
 -      path_list_clear(&mailmap, 1);
 -
 -      return 0;
 +      log->list.strdup_paths = 1;
 +      path_list_clear(&log->list, 1);
 +      log->mailmap.strdup_paths = 1;
 +      path_list_clear(&log->mailmap, 1);
  }
diff --combined git-bisect.sh
index 6644b10e362103faafc232a88ca96c80aabd88d8,c99ffee122f9d4bd714fb3e6278cafd3e219891b..5177a2a11482af276ae5243c4d550b68bb0e2a28
@@@ -155,9 -155,9 +155,9 @@@ bisect_state() 
                shift
                for rev in "$@"
                do
-                       rev=$(git rev-parse --verify "$rev^{commit}") ||
+                       sha=$(git rev-parse --verify "$rev^{commit}") ||
                                die "Bad rev input: $rev"
-                       bisect_write "$state" "$rev"
+                       bisect_write "$state" "$sha"
                done ;;
        *,bad)
                die "'git bisect bad' can take only one argument." ;;
@@@ -289,14 -289,14 +289,14 @@@ bisect_next() 
        bisect_next_check good
  
        skip=$(git for-each-ref --format='%(objectname)' \
 -              "refs/bisect/skip-*" | tr '[\012]' ' ') || exit
 +              "refs/bisect/skip-*" | tr '\012' ' ') || exit
  
        BISECT_OPT=''
        test -n "$skip" && BISECT_OPT='--bisect-all'
  
        bad=$(git rev-parse --verify refs/bisect/bad) &&
        good=$(git for-each-ref --format='^%(objectname)' \
 -              "refs/bisect/good-*" | tr '[\012]' ' ') &&
 +              "refs/bisect/good-*" | tr '\012' ' ') &&
        eval="git rev-list --bisect-vars $BISECT_OPT $good $bad --" &&
        eval="$eval $(cat "$GIT_DIR/BISECT_NAMES")" &&
        eval=$(filter_skipped "$eval" "$skip") &&
@@@ -329,9 -329,9 +329,9 @@@ bisect_visualize() 
  
        if test $# = 0
        then
 -              case "${DISPLAY+set}" in
 +              case "${DISPLAY+set}${MSYSTEM+set}${SECURITYSESSIONID+set}" in
                '')     set git log ;;
 -              set   set gitk ;;
 +              set*)   set gitk ;;
                esac
        else
                case "$1" in