Merge branch 'maint'
authorJunio C Hamano <gitster@pobox.com>
Wed, 6 Aug 2008 04:21:08 +0000 (21:21 -0700)
committerJunio C Hamano <gitster@pobox.com>
Wed, 6 Aug 2008 04:21:08 +0000 (21:21 -0700)
* maint:
RelNotes 1.5.6.5 updates
diff.renamelimit is a basic diff configuration
git-cvsimport.perl: Print "UNKNOWN LINE..." on stderr, not stdout.
Documentation: typos / spelling fixes in older RelNotes

1  2 
diff.c
git-cvsimport.perl
diff --combined diff.c
index bd04fdfd283ce2e242b6f5c479452b36df8f5f86,342733ba7324b59f8cf1ec29f92a1dae43198913..8746c60b9cb634bf78911c34cad1ba5a1f93d5ec
--- 1/diff.c
--- 2/diff.c
+++ b/diff.c
@@@ -131,10 -131,6 +131,6 @@@ static int parse_funcname_pattern(cons
   */
  int git_diff_ui_config(const char *var, const char *value, void *cb)
  {
-       if (!strcmp(var, "diff.renamelimit")) {
-               diff_rename_limit_default = git_config_int(var, value);
-               return 0;
-       }
        if (!strcmp(var, "diff.color") || !strcmp(var, "color.diff")) {
                diff_use_color_default = git_config_colorbool(var, value, -1);
                return 0;
  
  int git_diff_basic_config(const char *var, const char *value, void *cb)
  {
+       if (!strcmp(var, "diff.renamelimit")) {
+               diff_rename_limit_default = git_config_int(var, value);
+               return 0;
+       }
        if (!prefixcmp(var, "diff.color.") || !prefixcmp(var, "color.diff.")) {
                int slot = parse_diff_color_slot(var, 11);
                if (!value)
@@@ -531,9 -532,9 +532,9 @@@ static void emit_add_line(const char *r
        else {
                /* Emit just the prefix, then the rest. */
                emit_line(ecbdata->file, set, reset, line, ecbdata->nparents);
 -              (void)check_and_emit_line(line + ecbdata->nparents,
 -                  len - ecbdata->nparents, ecbdata->ws_rule,
 -                  ecbdata->file, set, reset, ws);
 +              ws_check_emit(line + ecbdata->nparents,
 +                            len - ecbdata->nparents, ecbdata->ws_rule,
 +                            ecbdata->file, set, reset, ws);
        }
  }
  
@@@ -826,12 -827,12 +827,12 @@@ static void show_stats(struct diffstat_
        /* Sanity: give at least 5 columns to the graph,
         * but leave at least 10 columns for the name.
         */
 -      if (width < name_width + 15) {
 -              if (name_width <= 25)
 -                      width = name_width + 15;
 -              else
 -                      name_width = width - 15;
 -      }
 +      if (width < 25)
 +              width = 25;
 +      if (name_width < 10)
 +              name_width = 10;
 +      else if (width < name_width + 15)
 +              name_width = width - 15;
  
        /* Find the longest filename and max number of changes */
        reset = diff_get_color_opt(options, DIFF_RESET);
                        total = add + del;
                }
                show_name(options->file, prefix, name, len, reset, set);
 -              fprintf(options->file, "%5d ", added + deleted);
 +              fprintf(options->file, "%5d%s", added + deleted,
 +                              added + deleted ? " " : "");
                show_graph(options->file, '+', add, add_c, reset);
                show_graph(options->file, '-', del, del_c, reset);
                fprintf(options->file, "\n");
@@@ -1132,85 -1132,42 +1133,85 @@@ static void free_diffstat_info(struct d
  struct checkdiff_t {
        struct xdiff_emit_state xm;
        const char *filename;
 -      int lineno, color_diff;
 +      int lineno;
 +      struct diff_options *o;
        unsigned ws_rule;
        unsigned status;
 -      FILE *file;
 +      int trailing_blanks_start;
  };
  
 +static int is_conflict_marker(const char *line, unsigned long len)
 +{
 +      char firstchar;
 +      int cnt;
 +
 +      if (len < 8)
 +              return 0;
 +      firstchar = line[0];
 +      switch (firstchar) {
 +      case '=': case '>': case '<':
 +              break;
 +      default:
 +              return 0;
 +      }
 +      for (cnt = 1; cnt < 7; cnt++)
 +              if (line[cnt] != firstchar)
 +                      return 0;
 +      /* line[0] thru line[6] are same as firstchar */
 +      if (firstchar == '=') {
 +              /* divider between ours and theirs? */
 +              if (len != 8 || line[7] != '\n')
 +                      return 0;
 +      } else if (len < 8 || !isspace(line[7])) {
 +              /* not divider before ours nor after theirs */
 +              return 0;
 +      }
 +      return 1;
 +}
 +
  static void checkdiff_consume(void *priv, char *line, unsigned long len)
  {
        struct checkdiff_t *data = priv;
 -      const char *ws = diff_get_color(data->color_diff, DIFF_WHITESPACE);
 -      const char *reset = diff_get_color(data->color_diff, DIFF_RESET);
 -      const char *set = diff_get_color(data->color_diff, DIFF_FILE_NEW);
 +      int color_diff = DIFF_OPT_TST(data->o, COLOR_DIFF);
 +      const char *ws = diff_get_color(color_diff, DIFF_WHITESPACE);
 +      const char *reset = diff_get_color(color_diff, DIFF_RESET);
 +      const char *set = diff_get_color(color_diff, DIFF_FILE_NEW);
        char *err;
  
        if (line[0] == '+') {
                unsigned bad;
                data->lineno++;
 -              bad = check_and_emit_line(line + 1, len - 1,
 -                  data->ws_rule, NULL, NULL, NULL, NULL);
 +              if (!ws_blank_line(line + 1, len - 1, data->ws_rule))
 +                      data->trailing_blanks_start = 0;
 +              else if (!data->trailing_blanks_start)
 +                      data->trailing_blanks_start = data->lineno;
 +              if (is_conflict_marker(line + 1, len - 1)) {
 +                      data->status |= 1;
 +                      fprintf(data->o->file,
 +                              "%s:%d: leftover conflict marker\n",
 +                              data->filename, data->lineno);
 +              }
 +              bad = ws_check(line + 1, len - 1, data->ws_rule);
                if (!bad)
                        return;
                data->status |= bad;
                err = whitespace_error_string(bad);
 -              fprintf(data->file, "%s:%d: %s.\n", data->filename, data->lineno, err);
 +              fprintf(data->o->file, "%s:%d: %s.\n",
 +                      data->filename, data->lineno, err);
                free(err);
 -              emit_line(data->file, set, reset, line, 1);
 -              (void)check_and_emit_line(line + 1, len - 1, data->ws_rule,
 -                  data->file, set, reset, ws);
 -      } else if (line[0] == ' ')
 +              emit_line(data->o->file, set, reset, line, 1);
 +              ws_check_emit(line + 1, len - 1, data->ws_rule,
 +                            data->o->file, set, reset, ws);
 +      } else if (line[0] == ' ') {
                data->lineno++;
 -      else if (line[0] == '@') {
 +              data->trailing_blanks_start = 0;
 +      } else if (line[0] == '@') {
                char *plus = strchr(line, '+');
                if (plus)
                        data->lineno = strtol(plus, NULL, 10) - 1;
                else
                        die("invalid diff");
 +              data->trailing_blanks_start = 0;
        }
  }
  
@@@ -1380,14 -1337,7 +1381,14 @@@ static struct builtin_funcname_pattern 
                        "^[     ]*\\(\\([       ]*"
                        "[A-Za-z_][A-Za-z_0-9]*\\)\\{2,\\}"
                        "[      ]*([^;]*\\)$" },
 -      { "tex", "^\\(\\\\\\(sub\\)*section{.*\\)$" },
 +      { "pascal", "^\\(\\(procedure\\|function\\|constructor\\|"
 +                      "destructor\\|interface\\|implementation\\|"
 +                      "initialization\\|finalization\\)[ \t]*.*\\)$"
 +                      "\\|"
 +                      "^\\(.*=[ \t]*\\(class\\|record\\).*\\)$"
 +                      },
 +      { "tex", "^\\(\\\\\\(\\(sub\\)*section\\|chapter\\|part\\)\\*\\{0,1\\}{.*\\)$" },
 +      { "ruby", "^\\s*\\(\\(class\\|module\\|def\\)\\s.*\\)$" },
  };
  
  static const char *diff_funcname_pattern(struct diff_filespec *one)
@@@ -1590,9 -1540,8 +1591,9 @@@ static void builtin_diffstat(const cha
  
  static void builtin_checkdiff(const char *name_a, const char *name_b,
                              const char *attr_path,
 -                           struct diff_filespec *one,
 -                           struct diff_filespec *two, struct diff_options *o)
 +                            struct diff_filespec *one,
 +                            struct diff_filespec *two,
 +                            struct diff_options *o)
  {
        mmfile_t mf1, mf2;
        struct checkdiff_t data;
        data.xm.consume = checkdiff_consume;
        data.filename = name_b ? name_b : name_a;
        data.lineno = 0;
 -      data.color_diff = DIFF_OPT_TST(o, COLOR_DIFF);
 +      data.o = o;
        data.ws_rule = whitespace_rule(attr_path);
 -      data.file = o->file;
  
        if (fill_mmfile(&mf1, one) < 0 || fill_mmfile(&mf2, two) < 0)
                die("unable to read files to diff");
  
 +      /*
 +       * All the other codepaths check both sides, but not checking
 +       * the "old" side here is deliberate.  We are checking the newly
 +       * introduced changes, and as long as the "new" side is text, we
 +       * can and should check what it introduces.
 +       */
        if (diff_filespec_is_binary(two))
                goto free_and_return;
        else {
                ecb.outf = xdiff_outf;
                ecb.priv = &data;
                xdi_diff(&mf1, &mf2, &xpp, &xecfg, &ecb);
 +
 +              if (data.trailing_blanks_start) {
 +                      fprintf(o->file, "%s:%d: ends with blank lines.\n",
 +                              data.filename, data.trailing_blanks_start);
 +                      data.status = 1; /* report errors */
 +              }
        }
   free_and_return:
        diff_free_filespec_data(one);
@@@ -3230,10 -3168,11 +3231,10 @@@ void diff_flush(struct diff_options *op
  
        if (output_format & DIFF_FORMAT_PATCH) {
                if (separator) {
 +                      putc(options->line_termination, options->file);
                        if (options->stat_sep) {
                                /* attach patch instead of inline */
                                fputs(options->stat_sep, options->file);
 -                      } else {
 -                              putc(options->line_termination, options->file);
                        }
                }
  
diff --combined git-cvsimport.perl
index e2664ef01308fd0fb65d47b25e0ae73a65aa6262,7e95fb3740cb631d65c1a0bf07a78e2f75324210..e43920296182f320dac31b5832a30844ffaef38f
@@@ -36,7 -36,7 +36,7 @@@ sub usage(;$) 
        my $msg = shift;
        print(STDERR "Error: $msg\n") if $msg;
        print STDERR <<END;
 -Usage: ${\basename $0}     # fetch/update GIT from CVS
 +Usage: git cvsimport     # fetch/update GIT from CVS
         [-o branch-for-HEAD] [-h] [-v] [-d CVSROOT] [-A author-conv-file]
         [-p opts-for-cvsps] [-P file] [-C GIT_repository] [-z fuzz] [-i] [-k]
         [-u] [-s subst] [-a] [-m] [-M regex] [-S regex] [-L commitlimit]
@@@ -952,7 -952,7 +952,7 @@@ while (<CVS>) 
        } elsif (/^-+$/) { # end of unknown-line processing
                $state = 1;
        } elsif ($state != 11) { # ignore stuff when skipping
-               print "* UNKNOWN LINE * $_\n";
+               print STDERR "* UNKNOWN LINE * $_\n";
        }
  }
  commit() if $branch and $state != 11;