Merge branch 'jc/apply' into next
authorJunio C Hamano <junkio@cox.net>
Mon, 15 May 2006 07:52:20 +0000 (00:52 -0700)
committerJunio C Hamano <junkio@cox.net>
Mon, 15 May 2006 07:52:20 +0000 (00:52 -0700)
* jc/apply:
  apply --numstat: show new name, not old name.
  Ensure author & committer before asking for commit message.
  Install git-send-email by default
  send-email: address expansion for common mailers
  diffstat rename squashing fix.

1  2 
Makefile
apply.c
diff.c

diff --combined Makefile
+++ b/Makefile
@@@ -131,7 -131,8 +131,8 @@@ SCRIPT_PERL = 
        git-archimport.perl git-cvsimport.perl git-relink.perl \
        git-shortlog.perl git-fmt-merge-msg.perl git-rerere.perl \
        git-annotate.perl git-cvsserver.perl \
-       git-svnimport.perl git-mv.perl git-cvsexportcommit.perl
+       git-svnimport.perl git-mv.perl git-cvsexportcommit.perl \
+       git-send-email.perl
  
  SCRIPT_PYTHON = \
        git-merge-recursive.py
@@@ -205,7 -206,7 +206,7 @@@ DIFF_OBJS = 
        diffcore-delta.o log-tree.o
  
  LIB_OBJS = \
 -      blob.o commit.o connect.o csum-file.o base85.o \
 +      blob.o commit.o connect.o csum-file.o cache-tree.o base85.o \
        date.o diff-delta.o entry.o exec_cmd.o ident.o index.o \
        object.o pack-check.o patch-delta.o path.o pkt-line.o \
        quote.o read-cache.o refs.o run-command.o \
        $(DIFF_OBJS)
  
  BUILTIN_OBJS = \
 -      builtin-log.o builtin-help.o builtin-count.o builtin-diff.o builtin-push.o
 +      builtin-log.o builtin-help.o builtin-count.o builtin-diff.o builtin-push.o \
 +      builtin-grep.o
  
  GITLIBS = $(LIB_FILE) $(XDIFF_LIB)
  LIBS = $(GITLIBS) -lz
@@@ -320,10 -320,6 +321,6 @@@ els
        endif
  endif
  
- ifdef WITH_SEND_EMAIL
-       SCRIPT_PERL += git-send-email.perl
- endif
  ifndef NO_CURL
        ifdef CURLDIR
                # This is still problematic -- gcc does not always want -R.
@@@ -610,9 -606,6 +607,9 @@@ test-date$X: test-date.c date.o ctype.
  test-delta$X: test-delta.c diff-delta.o patch-delta.o
        $(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $^
  
 +test-dump-cache-tree$X: dump-cache-tree.o $(GITLIBS)
 +      $(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) $(LIBS)
 +
  check:
        for i in *.c; do sparse $(ALL_CFLAGS) $(SPARSE_FLAGS) $$i || exit; done
  
diff --combined apply.c
+++ b/apply.c
@@@ -8,7 -8,6 +8,7 @@@
   */
  #include <fnmatch.h>
  #include "cache.h"
 +#include "cache-tree.h"
  #include "quote.h"
  #include "blob.h"
  #include "delta.h"
@@@ -1779,7 -1778,7 +1779,7 @@@ static void numstat_patch_list(struct p
  {
        for ( ; patch; patch = patch->next) {
                const char *name;
-               name = patch->old_name ? patch->old_name : patch->new_name;
+               name = patch->new_name ? patch->new_name : patch->old_name;
                printf("%d\t%d\t", patch->lines_added, patch->lines_deleted);
                if (line_termination && quote_c_style(name, NULL, NULL, 0))
                        quote_c_style(name, NULL, stdout, 0);
@@@ -1894,7 -1893,6 +1894,7 @@@ static void remove_file(struct patch *p
        if (write_index) {
                if (remove_file_from_cache(patch->old_name) < 0)
                        die("unable to remove %s from index", patch->old_name);
 +              cache_tree_invalidate_path(active_cache_tree, patch->old_name);
        }
        unlink(patch->old_name);
  }
@@@ -1991,9 -1989,8 +1991,9 @@@ static void create_file(struct patch *p
  
        if (!mode)
                mode = S_IFREG | 0644;
 -      create_one_file(path, mode, buf, size); 
 +      create_one_file(path, mode, buf, size);
        add_index_file(path, mode, buf, size);
 +      cache_tree_invalidate_path(active_cache_tree, path);
  }
  
  static void write_out_one_result(struct patch *patch)
diff --combined diff.c
--- 1/diff.c
--- 2/diff.c
+++ b/diff.c
@@@ -232,11 -232,16 +232,16 @@@ static char *pprint_rename(const char *
         * name-a => name-b
         */
        if (pfx_length + sfx_length) {
+               int a_midlen = len_a - pfx_length - sfx_length;
+               int b_midlen = len_b - pfx_length - sfx_length;
+               if (a_midlen < 0) a_midlen = 0;
+               if (b_midlen < 0) b_midlen = 0;
                name = xmalloc(len_a + len_b - pfx_length - sfx_length + 7);
                sprintf(name, "%.*s{%.*s => %.*s}%s",
                        pfx_length, a,
-                       len_a - pfx_length - sfx_length, a + pfx_length,
-                       len_b - pfx_length - sfx_length, b + pfx_length,
+                       a_midlen, a + pfx_length,
+                       b_midlen, b + pfx_length,
                        a + len_a - sfx_length);
        }
        else {
@@@ -558,7 -563,7 +563,7 @@@ static void builtin_diff(const char *na
  
                ecbdata.label_path = lbl;
                xpp.flags = XDF_NEED_MINIMAL;
 -              xecfg.ctxlen = 3;
 +              xecfg.ctxlen = o->context;
                xecfg.flags = XDL_EMIT_FUNCNAMES;
                if (!diffopts)
                        ;
@@@ -1182,7 -1187,6 +1187,7 @@@ void diff_setup(struct diff_options *op
        options->line_termination = '\n';
        options->break_opt = -1;
        options->rename_limit = -1;
 +      options->context = 3;
  
        options->change = diff_change;
        options->add_remove = diff_addremove;
@@@ -1223,68 -1227,17 +1228,68 @@@ int diff_setup_done(struct diff_option
        return 0;
  }
  
 +int opt_arg(const char *arg, int arg_short, const char *arg_long, int *val)
 +{
 +      char c, *eq;
 +      int len;
 +
 +      if (*arg != '-')
 +              return 0;
 +      c = *++arg;
 +      if (!c)
 +              return 0;
 +      if (c == arg_short) {
 +              c = *++arg;
 +              if (!c)
 +                      return 1;
 +              if (val && isdigit(c)) {
 +                      char *end;
 +                      int n = strtoul(arg, &end, 10);
 +                      if (*end)
 +                              return 0;
 +                      *val = n;
 +                      return 1;
 +              }
 +              return 0;
 +      }
 +      if (c != '-')
 +              return 0;
 +      arg++;
 +      eq = strchr(arg, '=');
 +      if (eq)
 +              len = eq - arg;
 +      else
 +              len = strlen(arg);
 +      if (!len || strncmp(arg, arg_long, len))
 +              return 0;
 +      if (eq) {
 +              int n;
 +              char *end;
 +              if (!isdigit(*++eq))
 +                      return 0;
 +              n = strtoul(eq, &end, 10);
 +              if (*end)
 +                      return 0;
 +              *val = n;
 +      }
 +      return 1;
 +}
 +
  int diff_opt_parse(struct diff_options *options, const char **av, int ac)
  {
        const char *arg = av[0];
        if (!strcmp(arg, "-p") || !strcmp(arg, "-u"))
                options->output_format = DIFF_FORMAT_PATCH;
 +      else if (opt_arg(arg, 'U', "unified", &options->context))
 +              options->output_format = DIFF_FORMAT_PATCH;
        else if (!strcmp(arg, "--patch-with-raw")) {
                options->output_format = DIFF_FORMAT_PATCH;
                options->with_raw = 1;
        }
        else if (!strcmp(arg, "--stat"))
                options->output_format = DIFF_FORMAT_DIFFSTAT;
 +      else if (!strcmp(arg, "--summary"))
 +              options->summary = 1;
        else if (!strcmp(arg, "--patch-with-stat")) {
                options->output_format = DIFF_FORMAT_PATCH;
                options->with_stat = 1;
@@@ -1755,85 -1708,6 +1760,85 @@@ static void flush_one_pair(struct diff_
        }
  }
  
 +static void show_file_mode_name(const char *newdelete, struct diff_filespec *fs)
 +{
 +      if (fs->mode)
 +              printf(" %s mode %06o %s\n", newdelete, fs->mode, fs->path);
 +      else
 +              printf(" %s %s\n", newdelete, fs->path);
 +}
 +
 +
 +static void show_mode_change(struct diff_filepair *p, int show_name)
 +{
 +      if (p->one->mode && p->two->mode && p->one->mode != p->two->mode) {
 +              if (show_name)
 +                      printf(" mode change %06o => %06o %s\n",
 +                             p->one->mode, p->two->mode, p->two->path);
 +              else
 +                      printf(" mode change %06o => %06o\n",
 +                             p->one->mode, p->two->mode);
 +      }
 +}
 +
 +static void show_rename_copy(const char *renamecopy, struct diff_filepair *p)
 +{
 +      const char *old, *new;
 +
 +      /* Find common prefix */
 +      old = p->one->path;
 +      new = p->two->path;
 +      while (1) {
 +              const char *slash_old, *slash_new;
 +              slash_old = strchr(old, '/');
 +              slash_new = strchr(new, '/');
 +              if (!slash_old ||
 +                  !slash_new ||
 +                  slash_old - old != slash_new - new ||
 +                  memcmp(old, new, slash_new - new))
 +                      break;
 +              old = slash_old + 1;
 +              new = slash_new + 1;
 +      }
 +      /* p->one->path thru old is the common prefix, and old and new
 +       * through the end of names are renames
 +       */
 +      if (old != p->one->path)
 +              printf(" %s %.*s{%s => %s} (%d%%)\n", renamecopy,
 +                     (int)(old - p->one->path), p->one->path,
 +                     old, new, (int)(0.5 + p->score * 100.0/MAX_SCORE));
 +      else
 +              printf(" %s %s => %s (%d%%)\n", renamecopy,
 +                     p->one->path, p->two->path,
 +                     (int)(0.5 + p->score * 100.0/MAX_SCORE));
 +      show_mode_change(p, 0);
 +}
 +
 +static void diff_summary(struct diff_filepair *p)
 +{
 +      switch(p->status) {
 +      case DIFF_STATUS_DELETED:
 +              show_file_mode_name("delete", p->one);
 +              break;
 +      case DIFF_STATUS_ADDED:
 +              show_file_mode_name("create", p->two);
 +              break;
 +      case DIFF_STATUS_COPIED:
 +              show_rename_copy("copy", p);
 +              break;
 +      case DIFF_STATUS_RENAMED:
 +              show_rename_copy("rename", p);
 +              break;
 +      default:
 +              if (p->score) {
 +                      printf(" rewrite %s (%d%%)\n", p->two->path,
 +                              (int)(0.5 + p->score * 100.0/MAX_SCORE));
 +                      show_mode_change(p, 0);
 +              } else  show_mode_change(p, 1);
 +              break;
 +      }
 +}
 +
  void diff_flush(struct diff_options *options)
  {
        struct diff_queue_struct *q = &diff_queued_diff;
        for (i = 0; i < q->nr; i++) {
                struct diff_filepair *p = q->queue[i];
                flush_one_pair(p, diff_output_format, options, diffstat);
 -              diff_free_filepair(p);
        }
  
        if (diffstat) {
                free(diffstat);
        }
  
 +      for (i = 0; i < q->nr; i++) {
 +              if (options->summary)
 +                      diff_summary(q->queue[i]);
 +              diff_free_filepair(q->queue[i]);
 +      }
 +
        free(q->queue);
        q->queue = NULL;
        q->nr = q->alloc = 0;