]> git.ipfire.org Git - thirdparty/git.git/commitdiff
Merge branch 'maint'
authorJunio C Hamano <junkio@cox.net>
Sat, 24 Feb 2007 09:42:06 +0000 (01:42 -0800)
committerJunio C Hamano <junkio@cox.net>
Sat, 24 Feb 2007 09:42:06 +0000 (01:42 -0800)
* maint:
  diff-patch: Avoid emitting double-slashes in textual patch.
  Reword git-am 3-way fallback failure message.
  Limit filename for format-patch
  core.legacyheaders: Use the description used in RelNotes-1.5.0
  git-show-ref --verify: Fail if called without a reference

Conflicts:

builtin-show-ref.c
diff.c

1  2 
Documentation/config.txt
builtin-log.c
builtin-show-ref.c
diff.c

diff --combined Documentation/config.txt
index 9d045d88327e8f949f61f2f8e776e4ad44789ca0,9fec76935e299c5506ec3aab1aab942cefea972f..70f548464a5f0b841da4cef5acc8c3c65bce1de7
@@@ -192,10 -192,17 +192,17 @@@ core.compression:
        slowest.
  
  core.legacyheaders::
-       A boolean which enables the legacy object header format in case
-       you want to interoperate with old clients accessing the object
-       database directly (where the "http://" and "rsync://" protocols
-       count as direct access).
+       A boolean which
+       changes the format of loose objects so that they are more
+       efficient to pack and to send out of the repository over git
+       native protocol, since v1.4.2.  However, loose objects
+       written in the new format cannot be read by git older than
+       that version; people fetching from your repository using
+       older versions of git over dumb transports (e.g. http)
+       will also be affected.
+ +
+ To let git use the new loose object format, you have to
+ set core.legacyheaders to false.
  
  core.packedGitWindowSize::
        Number of bytes of a pack file to map into memory in a
@@@ -463,10 -470,6 +470,10 @@@ remote.<name>.push:
        The default set of "refspec" for gitlink:git-push[1]. See
        gitlink:git-push[1].
  
 +remote.<name>.skipDefaultUpdate::
 +      If true, this remote will be skipped by default when updating
 +      using the remote subcommand of gitlink:git-remote[1].
 +
  remote.<name>.receivepack::
        The default program to execute on the remote side when pushing.  See
        option \--exec of gitlink:git-push[1].
@@@ -475,10 -478,6 +482,10 @@@ remote.<name>.uploadpack:
        The default program to execute on the remote side when fetching.  See
        option \--exec of gitlink:git-fetch-pack[1].
  
 +remotes.<group>::
 +      The list of remotes which are fetched by "git remote update
 +      <group>".  See gitlink:git-remote[1].
 +
  repack.usedeltabaseoffset::
        Allow gitlink:git-repack[1] to create packs that uses
        delta-base offset.  Defaults to false.
diff --combined builtin-log.c
index ad1e8c054d518b4858fb06d53be422086ea8c2b2,a5e4b625f8cdb29f3f4cf09d90038df5f7201a6d..f43790cbce39fdc465d92ec83785191772dcf1cb
@@@ -32,7 -32,7 +32,7 @@@ static void cmd_log_init(int argc, cons
                rev->always_show_header = 0;
        for (i = 1; i < argc; i++) {
                const char *arg = argv[i];
 -              if (!strncmp(arg, "--encoding=", 11)) {
 +              if (!prefixcmp(arg, "--encoding=")) {
                        arg += 11;
                        if (strcmp(arg, "none"))
                                git_log_output_encoding = strdup(arg);
@@@ -224,6 -224,9 +224,9 @@@ int cmd_log(int argc, const char **argv
        return cmd_log_walk(&rev);
  }
  
+ /* format-patch */
+ #define FORMAT_PATCH_NAME_MAX 64
  static int istitlechar(char c)
  {
        return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') ||
@@@ -264,15 -267,18 +267,18 @@@ static int git_format_config(const cha
  static FILE *realstdout = NULL;
  static const char *output_directory = NULL;
  
- static void reopen_stdout(struct commit *commit, int nr, int keep_subject)
+ static int reopen_stdout(struct commit *commit, int nr, int keep_subject)
  {
-       char filename[1024];
+       char filename[PATH_MAX];
        char *sol;
        int len = 0;
-       int suffix_len = strlen(fmt_patch_suffix) + 10; /* ., NUL and slop */
+       int suffix_len = strlen(fmt_patch_suffix) + 1;
  
        if (output_directory) {
-               strlcpy(filename, output_directory, 1000);
+               if (strlen(output_directory) >=
+                   sizeof(filename) - FORMAT_PATCH_NAME_MAX - suffix_len)
+                       return error("name of output directory is too long");
+               strlcpy(filename, output_directory, sizeof(filename) - suffix_len);
                len = strlen(filename);
                if (filename[len - 1] != '/')
                        filename[len++] = '/';
  
                sol += 2;
                /* strip [PATCH] or [PATCH blabla] */
 -              if (!keep_subject && !strncmp(sol, "[PATCH", 6)) {
 +              if (!keep_subject && !prefixcmp(sol, "[PATCH")) {
                        char *eos = strchr(sol + 6, ']');
                        if (eos) {
                                while (isspace(*eos))
                }
  
                for (j = 0;
-                    len < sizeof(filename) - suffix_len &&
+                    j < FORMAT_PATCH_NAME_MAX - suffix_len - 5 &&
+                            len < sizeof(filename) - suffix_len &&
                             sol[j] && sol[j] != '\n';
                     j++) {
                        if (istitlechar(sol[j])) {
                }
                while (filename[len - 1] == '.' || filename[len - 1] == '-')
                        len--;
+               filename[len] = 0;
        }
+       if (len + suffix_len >= sizeof(filename))
+               return error("Patch pathname too long");
        strcpy(filename + len, fmt_patch_suffix);
        fprintf(realstdout, "%s\n", filename);
-       freopen(filename, "w", stdout);
+       if (freopen(filename, "w", stdout) == NULL)
+               return error("Cannot open patch file %s",filename);
+       return 0;
  }
  
  static int get_patch_id(struct commit *commit, struct diff_options *options,
@@@ -435,7 -448,7 +448,7 @@@ int cmd_format_patch(int argc, const ch
                else if (!strcmp(argv[i], "-n") ||
                                !strcmp(argv[i], "--numbered"))
                        numbered = 1;
 -              else if (!strncmp(argv[i], "--start-number=", 15))
 +              else if (!prefixcmp(argv[i], "--start-number="))
                        start_number = strtol(argv[i] + 15, NULL, 10);
                else if (!strcmp(argv[i], "--start-number")) {
                        i++;
                }
                else if (!strcmp(argv[i], "--attach"))
                        rev.mime_boundary = git_version_string;
 -              else if (!strncmp(argv[i], "--attach=", 9))
 +              else if (!prefixcmp(argv[i], "--attach="))
                        rev.mime_boundary = argv[i] + 9;
                else if (!strcmp(argv[i], "--ignore-if-in-upstream"))
                        ignore_if_in_upstream = 1;
                else if (!strcmp(argv[i], "--thread"))
                        thread = 1;
 -              else if (!strncmp(argv[i], "--in-reply-to=", 14))
 +              else if (!prefixcmp(argv[i], "--in-reply-to="))
                        in_reply_to = argv[i] + 14;
                else if (!strcmp(argv[i], "--in-reply-to")) {
                        i++;
                                die("Need a Message-Id for --in-reply-to");
                        in_reply_to = argv[i];
                }
 -              else if (!strncmp(argv[i], "--suffix=", 9))
 +              else if (!prefixcmp(argv[i], "--suffix="))
                        fmt_patch_suffix = argv[i] + 9;
                else
                        argv[j++] = argv[i];
                        rev.message_id = message_id;
                }
                if (!use_stdout)
-                       reopen_stdout(commit, rev.nr, keep_subject);
+                       if (reopen_stdout(commit, rev.nr, keep_subject))
+                               die("Failed to create output files");
                shown = log_tree_commit(&rev, commit);
                free(commit->buffer);
                commit->buffer = NULL;
diff --combined builtin-show-ref.c
index ae0edddac1ad63b849dc341c8dd6519181c1e18e,75211e64f9a850be95de3b85edaafdf0d9a5886a..9463ff0e69b15fc0e544259e64960bc942a98368
@@@ -28,8 -28,8 +28,8 @@@ static int show_ref(const char *refname
        if (tags_only || heads_only) {
                int match;
  
 -              match = heads_only && !strncmp(refname, "refs/heads/", 11);
 -              match |= tags_only && !strncmp(refname, "refs/tags/", 10);
 +              match = heads_only && !prefixcmp(refname, "refs/heads/");
 +              match |= tags_only && !prefixcmp(refname, "refs/tags/");
                if (!match)
                        return 0;
        }
@@@ -178,8 -178,8 +178,8 @@@ int cmd_show_ref(int argc, const char *
                        hash_only = 1;
                        continue;
                }
 -              if (!strncmp(arg, "--hash=", 7) ||
 -                  (!strncmp(arg, "--abbrev", 8) &&
 +              if (!prefixcmp(arg, "--hash=") ||
 +                  (!prefixcmp(arg, "--abbrev") &&
                     (arg[8] == '=' || arg[8] == '\0'))) {
                        if (arg[2] != 'h' && !arg[8])
                                /* --abbrev only */
                }
                if (!strcmp(arg, "--exclude-existing"))
                        return exclude_existing(NULL);
 -              if (!strncmp(arg, "--exclude-existing=", 19))
 +              if (!prefixcmp(arg, "--exclude-existing="))
                        return exclude_existing(arg + 19);
                usage(show_ref_usage);
        }
  
        if (verify) {
-               unsigned char sha1[20];
+               if (!pattern)
+                       die("--verify requires a reference");
                while (*pattern) {
 -                      if (!strncmp(*pattern, "refs/", 5) &&
+                       unsigned char sha1[20];
 +                      if (!prefixcmp(*pattern, "refs/") &&
                            resolve_ref(*pattern, sha1, 1, NULL)) {
                                if (!quiet)
                                        show_one(*pattern, sha1);
diff --combined diff.c
index 5ecb12225560e19142ad5b2936b311a9fce2a16a,b8a90e91a9af75e1e5f5d69ce45c2a59e64071d1..d1eae7214d863d5a87735059d509afcdf60507d7
--- 1/diff.c
--- 2/diff.c
+++ b/diff.c
@@@ -77,7 -77,7 +77,7 @@@ int git_diff_ui_config(const char *var
                        diff_detect_rename_default = DIFF_DETECT_RENAME;
                return 0;
        }
 -      if (!strncmp(var, "diff.color.", 11) || !strncmp(var, "color.diff.", 11)) {
 +      if (!prefixcmp(var, "diff.color.") || !prefixcmp(var, "color.diff.")) {
                int slot = parse_diff_color_slot(var, 11);
                color_parse(value, var, diff_colors[slot]);
                return 0;
@@@ -184,59 -184,44 +184,61 @@@ static void print_line_count(int count
        }
  }
  
 -static void copy_file(int prefix, const char *data, int size)
 +static void copy_file(int prefix, const char *data, int size,
 +              const char *set, const char *reset)
  {
        int ch, nl_just_seen = 1;
        while (0 < size--) {
                ch = *data++;
 -              if (nl_just_seen)
 +              if (nl_just_seen) {
 +                      fputs(set, stdout);
                        putchar(prefix);
 -              putchar(ch);
 -              if (ch == '\n')
 +              }
 +              if (ch == '\n') {
                        nl_just_seen = 1;
 -              else
 +                      fputs(reset, stdout);
 +              } else
                        nl_just_seen = 0;
 +              putchar(ch);
        }
        if (!nl_just_seen)
 -              printf("\n\\ No newline at end of file\n");
 +              printf("%s\n\\ No newline at end of file\n", reset);
  }
  
  static void emit_rewrite_diff(const char *name_a,
                              const char *name_b,
                              struct diff_filespec *one,
 -                            struct diff_filespec *two)
 +                            struct diff_filespec *two,
 +                            int color_diff)
  {
        int lc_a, lc_b;
 +      const char *name_a_tab, *name_b_tab;
 +      const char *metainfo = diff_get_color(color_diff, DIFF_METAINFO);
 +      const char *fraginfo = diff_get_color(color_diff, DIFF_FRAGINFO);
 +      const char *old = diff_get_color(color_diff, DIFF_FILE_OLD);
 +      const char *new = diff_get_color(color_diff, DIFF_FILE_NEW);
 +      const char *reset = diff_get_color(color_diff, DIFF_RESET);
 +
++      name_a += (*name_a == '/');
++      name_b += (*name_b == '/');
 +      name_a_tab = strchr(name_a, ' ') ? "\t" : "";
 +      name_b_tab = strchr(name_b, ' ') ? "\t" : "";
 +
        diff_populate_filespec(one, 0);
        diff_populate_filespec(two, 0);
        lc_a = count_lines(one->data, one->size);
        lc_b = count_lines(two->data, two->size);
 -      name_a += (*name_a == '/');
 -      name_b += (*name_b == '/');
 -      printf("--- a/%s\n+++ b/%s\n@@ -", name_a, name_b);
 +      printf("%s--- a/%s%s%s\n%s+++ b/%s%s%s\n%s@@ -",
 +             metainfo, name_a, name_a_tab, reset,
 +             metainfo, name_b, name_b_tab, reset, fraginfo);
        print_line_count(lc_a);
        printf(" +");
        print_line_count(lc_b);
 -      printf(" @@\n");
 +      printf(" @@%s\n", reset);
        if (lc_a)
 -              copy_file('-', one->data, one->size);
 +              copy_file('-', one->data, one->size, old, reset);
        if (lc_b)
 -              copy_file('+', two->data, two->size);
 +              copy_file('+', two->data, two->size, new, reset);
  }
  
  static int fill_mmfile(mmfile_t *mf, struct diff_filespec *one)
@@@ -415,16 -400,22 +417,16 @@@ static void emit_line(const char *set, 
        puts(reset);
  }
  
 -static void emit_add_line(const char *reset, struct emit_callback *ecbdata, const char *line, int len)
 +static void emit_line_with_ws(int nparents,
 +              const char *set, const char *reset, const char *ws,
 +              const char *line, int len)
  {
 -      int col0 = ecbdata->nparents;
 +      int col0 = nparents;
        int last_tab_in_indent = -1;
        int last_space_in_indent = -1;
        int i;
        int tail = len;
        int need_highlight_leading_space = 0;
 -      const char *ws = diff_get_color(ecbdata->color_diff, DIFF_WHITESPACE);
 -      const char *set = diff_get_color(ecbdata->color_diff, DIFF_FILE_NEW);
 -
 -      if (!*ws) {
 -              emit_line(set, reset, line, len);
 -              return;
 -      }
 -
        /* The line is a newly added line.  Does it have funny leading
         * whitespaces?  In indent, SP should never precede a TAB.
         */
                emit_line(set, reset, line + i, len - i);
  }
  
 +static void emit_add_line(const char *reset, struct emit_callback *ecbdata, const char *line, int len)
 +{
 +      const char *ws = diff_get_color(ecbdata->color_diff, DIFF_WHITESPACE);
 +      const char *set = diff_get_color(ecbdata->color_diff, DIFF_FILE_NEW);
 +
 +      if (!*ws)
 +              emit_line(set, reset, line, len);
 +      else
 +              emit_line_with_ws(ecbdata->nparents, set, reset, ws,
 +                              line, len);
 +}
 +
  static void fn_out_consume(void *priv, char *line, unsigned long len)
  {
        int i;
        const char *reset = diff_get_color(ecbdata->color_diff, DIFF_RESET);
  
        if (ecbdata->label_path[0]) {
 -              printf("%s--- %s%s\n", set, ecbdata->label_path[0], reset);
 -              printf("%s+++ %s%s\n", set, ecbdata->label_path[1], reset);
 +              const char *name_a_tab, *name_b_tab;
 +
 +              name_a_tab = strchr(ecbdata->label_path[0], ' ') ? "\t" : "";
 +              name_b_tab = strchr(ecbdata->label_path[1], ' ') ? "\t" : "";
 +
 +              printf("%s--- %s%s%s\n",
 +                     set, ecbdata->label_path[0], reset, name_a_tab);
 +              printf("%s+++ %s%s%s\n",
 +                     set, ecbdata->label_path[1], reset, name_b_tab);
                ecbdata->label_path[0] = ecbdata->label_path[1] = NULL;
        }
  
@@@ -900,44 -872,30 +902,44 @@@ static void show_numstat(struct diffsta
  struct checkdiff_t {
        struct xdiff_emit_state xm;
        const char *filename;
 -      int lineno;
 +      int lineno, color_diff;
  };
  
  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);
  
        if (line[0] == '+') {
 -              int i, spaces = 0;
 +              int i, spaces = 0, space_before_tab = 0, white_space_at_end = 0;
  
                /* check space before tab */
                for (i = 1; i < len && (line[i] == ' ' || line[i] == '\t'); i++)
                        if (line[i] == ' ')
                                spaces++;
                if (line[i - 1] == '\t' && spaces)
 -                      printf("%s:%d: space before tab:%.*s\n",
 -                              data->filename, data->lineno, (int)len, line);
 +                      space_before_tab = 1;
  
                /* check white space at line end */
                if (line[len - 1] == '\n')
                        len--;
                if (isspace(line[len - 1]))
 -                      printf("%s:%d: white space at end: %.*s\n",
 -                              data->filename, data->lineno, (int)len, line);
 +                      white_space_at_end = 1;
 +
 +              if (space_before_tab || white_space_at_end) {
 +                      printf("%s:%d: %s", data->filename, data->lineno, ws);
 +                      if (space_before_tab) {
 +                              printf("space before tab");
 +                              if (white_space_at_end)
 +                                      putchar(',');
 +                      }
 +                      if (white_space_at_end)
 +                              printf("white space at end");
 +                      printf(":%s ", reset);
 +                      emit_line_with_ws(1, set, reset, ws, line, len);
 +              }
  
                data->lineno++;
        } else if (line[0] == ' ')
@@@ -1064,8 -1022,8 +1066,8 @@@ static void builtin_diff(const char *na
        const char *set = diff_get_color(o->color_diff, DIFF_METAINFO);
        const char *reset = diff_get_color(o->color_diff, DIFF_RESET);
  
-       a_one = quote_two("a/", name_a);
-       b_two = quote_two("b/", name_b);
+       a_one = quote_two("a/", name_a + (*name_a == '/'));
+       b_two = quote_two("b/", name_b + (*name_b == '/'));
        lbl[0] = DIFF_FILE_VALID(one) ? a_one : "/dev/null";
        lbl[1] = DIFF_FILE_VALID(two) ? b_two : "/dev/null";
        printf("%sdiff --git %s %s%s\n", set, a_one, b_two, reset);
                if ((one->mode ^ two->mode) & S_IFMT)
                        goto free_ab_and_return;
                if (complete_rewrite) {
 -                      emit_rewrite_diff(name_a, name_b, one, two);
 +                      emit_rewrite_diff(name_a, name_b, one, two,
 +                                      o->color_diff);
                        goto free_ab_and_return;
                }
        }
                xecfg.flags = XDL_EMIT_FUNCNAMES;
                if (!diffopts)
                        ;
 -              else if (!strncmp(diffopts, "--unified=", 10))
 +              else if (!prefixcmp(diffopts, "--unified="))
                        xecfg.ctxlen = strtoul(diffopts + 10, NULL, 10);
 -              else if (!strncmp(diffopts, "-u", 2))
 +              else if (!prefixcmp(diffopts, "-u"))
                        xecfg.ctxlen = strtoul(diffopts + 2, NULL, 10);
                ecb.outf = xdiff_outf;
                ecb.priv = &ecbdata;
@@@ -1196,7 -1153,7 +1198,7 @@@ static void builtin_diffstat(const cha
  
  static void builtin_checkdiff(const char *name_a, const char *name_b,
                             struct diff_filespec *one,
 -                           struct diff_filespec *two)
 +                           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 = o->color_diff;
  
        if (fill_mmfile(&mf1, one) < 0 || fill_mmfile(&mf2, two) < 0)
                die("unable to read files to diff");
@@@ -1378,9 -1334,6 +1380,9 @@@ int diff_populate_filespec(struct diff_
            reuse_worktree_file(s->path, s->sha1, 0)) {
                struct stat st;
                int fd;
 +              char *buf;
 +              unsigned long size;
 +
                if (lstat(s->path, &st) < 0) {
                        if (errno == ENOENT) {
                        err_empty:
                s->data = xmmap(NULL, s->size, PROT_READ, MAP_PRIVATE, fd, 0);
                close(fd);
                s->should_munmap = 1;
 -              /* FIXME! CRLF -> LF conversion goes here, based on "s->path" */
 +
 +              /*
 +               * Convert from working tree format to canonical git format
 +               */
 +              buf = s->data;
 +              size = s->size;
 +              if (convert_to_git(s->path, &buf, &size)) {
 +                      munmap(s->data, s->size);
 +                      s->should_munmap = 0;
 +                      s->data = buf;
 +                      s->size = size;
 +                      s->should_free = 1;
 +              }
        }
        else {
                char type[20];
@@@ -1834,7 -1775,7 +1836,7 @@@ static void run_checkdiff(struct diff_f
        diff_fill_sha1_info(p->one);
        diff_fill_sha1_info(p->two);
  
 -      builtin_checkdiff(name, other, p->one, p->two);
 +      builtin_checkdiff(name, other, p->one, p->two, o);
  }
  
  void diff_setup(struct diff_options *options)
@@@ -1983,7 -1924,7 +1985,7 @@@ int diff_opt_parse(struct diff_options 
        else if (!strcmp(arg, "--shortstat")) {
                options->output_format |= DIFF_FORMAT_SHORTSTAT;
        }
 -      else if (!strncmp(arg, "--stat", 6)) {
 +      else if (!prefixcmp(arg, "--stat")) {
                char *end;
                int width = options->stat_width;
                int name_width = options->stat_name_width;
  
                switch (*arg) {
                case '-':
 -                      if (!strncmp(arg, "-width=", 7))
 +                      if (!prefixcmp(arg, "-width="))
                                width = strtoul(arg + 7, &end, 10);
 -                      else if (!strncmp(arg, "-name-width=", 12))
 +                      else if (!prefixcmp(arg, "-name-width="))
                                name_width = strtoul(arg + 12, &end, 10);
                        break;
                case '=':
        }
        else if (!strcmp(arg, "-z"))
                options->line_termination = 0;
 -      else if (!strncmp(arg, "-l", 2))
 +      else if (!prefixcmp(arg, "-l"))
                options->rename_limit = strtoul(arg+2, NULL, 10);
        else if (!strcmp(arg, "--full-index"))
                options->full_index = 1;
                options->output_format |= DIFF_FORMAT_NAME_STATUS;
        else if (!strcmp(arg, "-R"))
                options->reverse_diff = 1;
 -      else if (!strncmp(arg, "-S", 2))
 +      else if (!prefixcmp(arg, "-S"))
                options->pickaxe = arg + 2;
        else if (!strcmp(arg, "-s")) {
                options->output_format |= DIFF_FORMAT_NO_OUTPUT;
        }
 -      else if (!strncmp(arg, "-O", 2))
 +      else if (!prefixcmp(arg, "-O"))
                options->orderfile = arg + 2;
 -      else if (!strncmp(arg, "--diff-filter=", 14))
 +      else if (!prefixcmp(arg, "--diff-filter="))
                options->filter = arg + 14;
        else if (!strcmp(arg, "--pickaxe-all"))
                options->pickaxe_opts = DIFF_PICKAXE_ALL;
        else if (!strcmp(arg, "--pickaxe-regex"))
                options->pickaxe_opts = DIFF_PICKAXE_REGEX;
 -      else if (!strncmp(arg, "-B", 2)) {
 +      else if (!prefixcmp(arg, "-B")) {
                if ((options->break_opt =
                     diff_scoreopt_parse(arg)) == -1)
                        return -1;
        }
 -      else if (!strncmp(arg, "-M", 2)) {
 +      else if (!prefixcmp(arg, "-M")) {
                if ((options->rename_score =
                     diff_scoreopt_parse(arg)) == -1)
                        return -1;
                options->detect_rename = DIFF_DETECT_RENAME;
        }
 -      else if (!strncmp(arg, "-C", 2)) {
 +      else if (!prefixcmp(arg, "-C")) {
                if ((options->rename_score =
                     diff_scoreopt_parse(arg)) == -1)
                        return -1;
                options->find_copies_harder = 1;
        else if (!strcmp(arg, "--abbrev"))
                options->abbrev = DEFAULT_ABBREV;
 -      else if (!strncmp(arg, "--abbrev=", 9)) {
 +      else if (!prefixcmp(arg, "--abbrev=")) {
                options->abbrev = strtoul(arg + 9, NULL, 10);
                if (options->abbrev < MINIMUM_ABBREV)
                        options->abbrev = MINIMUM_ABBREV;
                options->xdl_opts |= XDF_IGNORE_WHITESPACE;
        else if (!strcmp(arg, "-b") || !strcmp(arg, "--ignore-space-change"))
                options->xdl_opts |= XDF_IGNORE_WHITESPACE_CHANGE;
 +      else if (!strcmp(arg, "--ignore-space-at-eol"))
 +              options->xdl_opts |= XDF_IGNORE_WHITESPACE_AT_EOL;
        else if (!strcmp(arg, "--color-words"))
                options->color_diff = options->color_diff_words = 1;
        else if (!strcmp(arg, "--no-renames"))
@@@ -2579,7 -2518,7 +2581,7 @@@ static void patch_id_consume(void *priv
        int new_len;
  
        /* Ignore line numbers when computing the SHA1 of the patch */
 -      if (!strncmp(line, "@@ -", 4))
 +      if (!prefixcmp(line, "@@ -"))
                return;
  
        new_len = remove_space(line, len);