Merge branch 'js/fmt-patch' into next
authorJunio C Hamano <junkio@cox.net>
Fri, 5 May 2006 21:54:43 +0000 (14:54 -0700)
committerJunio C Hamano <junkio@cox.net>
Fri, 5 May 2006 21:54:43 +0000 (14:54 -0700)
* js/fmt-patch:
Teach fmt-patch about --keep-subject
Teach fmt-patch about --numbered
fmt-patch: implement -o <dir>
fmt-patch: output file names to stdout
Teach fmt-patch to write individual files.

1  2 
log-tree.c
show-branch.c
diff --combined log-tree.c
index d92abaf64bc3cecce06f09d1e523c8f203a93b06,4a3cd6791b43c9dd98c0237e9b0577deca9d1b37..526d578e98eef5a099be43bf39a300b33ac1991c
@@@ -3,15 -3,6 +3,15 @@@
  #include "commit.h"
  #include "log-tree.h"
  
 +static void show_parents(struct commit *commit, int abbrev)
 +{
 +      struct commit_list *p;
 +      for (p = commit->parents; p ; p = p->next) {
 +              struct commit *parent = p->item;
 +              printf(" %s", diff_unique_abbrev(parent->object.sha1, abbrev));
 +      }
 +}
 +
  void show_log(struct rev_info *opt, struct log_info *log, const char *sep)
  {
        static char this_header[16384];
        int abbrev_commit = opt->abbrev_commit ? opt->abbrev : 40;
        const char *extra;
        int len;
+       char* subject = NULL;
  
        opt->loginfo = NULL;
        if (!opt->verbose_header) {
 -              puts(sha1_to_hex(commit->object.sha1));
 +              fputs(diff_unique_abbrev(commit->object.sha1, abbrev_commit), stdout);
 +              if (opt->parents)
 +                      show_parents(commit, abbrev_commit);
 +              putchar('\n');
                return;
        }
  
         * Print header line of header..
         */
  
-       if (opt->commit_format == CMIT_FMT_EMAIL)
+       if (opt->commit_format == CMIT_FMT_EMAIL) {
+               if (opt->total > 0) {
+                       static char buffer[64];
+                       snprintf(buffer, sizeof(buffer),
+                                       "Subject: [PATCH %d/%d] ",
+                                       opt->nr, opt->total);
+                       subject = buffer;
+               } else if (opt->total == 0)
+                       subject = "Subject: [PATCH] ";
+               else
+                       subject = "Subject: ";
                printf("From %s  Thu Apr 7 15:13:13 2005\n",
                       sha1_to_hex(commit->object.sha1));
-       else {
+       else {
                printf("%s%s",
                       opt->commit_format == CMIT_FMT_ONELINE ? "" : "commit ",
                       diff_unique_abbrev(commit->object.sha1, abbrev_commit));
 +              if (opt->parents)
 +                      show_parents(commit, abbrev_commit);
                if (parent) 
                        printf(" (from %s)",
                               diff_unique_abbrev(parent->object.sha1,
@@@ -69,7 -67,7 +81,7 @@@
        /*
         * And then the pretty-printed message itself
         */
-       len = pretty_print_commit(opt->commit_format, commit, ~0u, this_header, sizeof(this_header), abbrev);
+       len = pretty_print_commit(opt->commit_format, commit, ~0u, this_header, sizeof(this_header), abbrev, subject);
        printf("%s%s%s", this_header, extra, sep);
  }
  
diff --combined show-branch.c
index 268c57b180627f7d8ba3a3a754210a37d420fb0d,5da3a1a90b23646eee18046ba33efe8953f8ba67..bbe26c2e7af7515d07af990a4db67c62ee14eb36
@@@ -5,7 -5,7 +5,7 @@@
  #include "refs.h"
  
  static const char show_branch_usage[] =
 -"git-show-branch [--current] [--all] [--heads] [--tags] [--topo-order] [--more=count | --list | --independent | --merge-base ] [--topics] [<refs>...]";
 +"git-show-branch [--dense] [--current] [--all] [--heads] [--tags] [--topo-order] [--more=count | --list | --independent | --merge-base ] [--topics] [<refs>...]";
  
  static int default_num = 0;
  static int default_alloc = 0;
@@@ -259,7 -259,7 +259,7 @@@ static void show_one_commit(struct comm
        struct commit_name *name = commit->object.util;
        if (commit->object.parsed)
                pretty_print_commit(CMIT_FMT_ONELINE, commit, ~0,
-                                   pretty, sizeof(pretty), 0);
+                                   pretty, sizeof(pretty), 0, NULL);
        else
                strcpy(pretty, "(unavailable)");
        if (!strncmp(pretty, "[PATCH] ", 8))
@@@ -527,27 -527,6 +527,27 @@@ static int git_show_branch_config(cons
        return git_default_config(var, value);
  }
  
 +static int omit_in_dense(struct commit *commit, struct commit **rev, int n)
 +{
 +      /* If the commit is tip of the named branches, do not
 +       * omit it.
 +       * Otherwise, if it is a merge that is reachable from only one
 +       * tip, it is not that interesting.
 +       */
 +      int i, flag, count;
 +      for (i = 0; i < n; i++)
 +              if (rev[i] == commit)
 +                      return 0;
 +      flag = commit->object.flags;
 +      for (i = count = 0; i < n; i++) {
 +              if (flag & (1u << (i + REV_SHIFT)))
 +                      count++;
 +      }
 +      if (count == 1)
 +              return 1;
 +      return 0;
 +}
 +
  int main(int ac, char **av)
  {
        struct commit *rev[MAX_REVS], *commit;
        int with_current_branch = 0;
        int head_at = -1;
        int topics = 0;
 +      int dense = 1;
  
        setup_git_directory();
        git_config(git_show_branch_config);
                        lifo = 1;
                else if (!strcmp(arg, "--topics"))
                        topics = 1;
 +              else if (!strcmp(arg, "--sparse"))
 +                      dense = 0;
                else if (!strcmp(arg, "--date-order"))
                        lifo = 0;
                else
                shown_merge_point |= is_merge_point;
  
                if (1 < num_rev) {
 -                      int is_merge = !!(commit->parents && commit->parents->next);
 +                      int is_merge = !!(commit->parents &&
 +                                        commit->parents->next);
                        if (topics &&
                            !is_merge_point &&
                            (this_flag & (1u << REV_SHIFT)))
                                continue;
 -
 +                      if (dense && is_merge &&
 +                          omit_in_dense(commit, rev, num_rev))
 +                              continue;
                        for (i = 0; i < num_rev; i++) {
                                int mark;
                                if (!(this_flag & (1u << (i + REV_SHIFT))))