Merge branch 'maint'
authorJunio C Hamano <gitster@pobox.com>
Wed, 4 Feb 2009 08:12:19 +0000 (00:12 -0800)
committerJunio C Hamano <gitster@pobox.com>
Wed, 4 Feb 2009 08:12:19 +0000 (00:12 -0800)
* maint:
User-manual: "git stash <comment>" form is long gone
add test-dump-cache-tree in Makefile
fix typo in Documentation
apply: fix access to an uninitialized mode variable, found by valgrind

Conflicts:
Makefile

1  2 
Documentation/technical/api-strbuf.txt
Makefile
builtin-apply.c
index 9a4e3ea92c44b01694c4373f97b6c56c67952fbb,985800e43a9b91256c35df60f67c36994142b94c..ac56d1c477b2f33b7f9b07d197f70c8f9ed05163
@@@ -21,7 -21,7 +21,7 @@@ allocated memory or not), use `strbuf_d
  buffer from its strbuf shell in a safe way. That is the sole supported
  way. This will give you a malloced buffer that you can later `free()`.
  +
- However, it it totally safe to modify anything in the string pointed by
+ However, it is totally safe to modify anything in the string pointed by
  the `buf` member, between the indices `0` and `len-1` (inclusive).
  
  . The `buf` member is a byte array that has at least `len + 1` bytes
@@@ -133,10 -133,8 +133,10 @@@ Function
  
  * Adding data to the buffer
  
 -NOTE: All of these functions in this section will grow the buffer as
 -      necessary.
 +NOTE: All of the functions in this section will grow the buffer as necessary.
 +If they fail for some reason other than memory shortage and the buffer hadn't
 +been allocated before (i.e. the `struct strbuf` was set to `STRBUF_INIT`),
 +then they will free() it.
  
  `strbuf_addch`::
  
@@@ -237,11 -235,6 +237,11 @@@ same behaviour as well
        Read the contents of a file, specified by its path. The third argument
        can be used to give a hint about the file size, to avoid reallocs.
  
 +`strbuf_readlink`::
 +
 +      Read the target of a symbolic link, specified by its path.  The third
 +      argument can be used to give a hint about the size, to avoid reallocs.
 +
  `strbuf_getline`::
  
        Read a line from a FILE* pointer. The second argument specifies the line
diff --combined Makefile
index 9f3a8ab0977bf23eb276e9cf5a6db96b206893e3,01242889eb888d35e28249a78d54584ebca4bb24..a82f173cb462f246a3efa5d26f1b53e18bcd4fe1
+++ b/Makefile
@@@ -23,9 -23,6 +23,9 @@@ all:
  # Define NO_EXPAT if you do not have expat installed.  git-http-push is
  # not built, and you cannot push using http:// and https:// transports.
  #
 +# Define EXPATDIR=/foo/bar if your expat header and library files are in
 +# /foo/bar/include and /foo/bar/lib directories.
 +#
  # Define NO_D_INO_IN_DIRENT if you don't have d_ino in your struct dirent.
  #
  # Define NO_D_TYPE_IN_DIRENT if your platform defines DT_UNKNOWN but lacks
@@@ -182,32 -179,28 +182,32 @@@ STRIP ?= stri
  # Among the variables below, these:
  #   gitexecdir
  #   template_dir
 +#   mandir
 +#   infodir
  #   htmldir
  #   ETC_GITCONFIG (but not sysconfdir)
 -# can be specified as a relative path ../some/where/else (which must begin
 -# with ../); this is interpreted as relative to $(bindir) and "git" at
 +# can be specified as a relative path some/where/else;
 +# this is interpreted as relative to $(prefix) and "git" at
  # runtime figures out where they are based on the path to the executable.
  # This can help installing the suite in a relocatable way.
  
  prefix = $(HOME)
 -bindir = $(prefix)/bin
 -mandir = $(prefix)/share/man
 -infodir = $(prefix)/share/info
 -gitexecdir = $(prefix)/libexec/git-core
 +bindir_relative = bin
 +bindir = $(prefix)/$(bindir_relative)
 +mandir = share/man
 +infodir = share/info
 +gitexecdir = libexec/git-core
  sharedir = $(prefix)/share
 -template_dir = $(sharedir)/git-core/templates
 -htmldir=$(sharedir)/doc/git-doc
 +template_dir = share/git-core/templates
 +htmldir = share/doc/git-doc
  ifeq ($(prefix),/usr)
  sysconfdir = /etc
 +ETC_GITCONFIG = $(sysconfdir)/gitconfig
  else
  sysconfdir = $(prefix)/etc
 +ETC_GITCONFIG = etc/gitconfig
  endif
  lib = lib
 -ETC_GITCONFIG = $(sysconfdir)/gitconfig
  # DESTDIR=
  
  # default configuration for gitweb
@@@ -395,7 -388,6 +395,7 @@@ LIB_H += revision.
  LIB_H += run-command.h
  LIB_H += sha1-lookup.h
  LIB_H += sideband.h
 +LIB_H += sigchain.h
  LIB_H += strbuf.h
  LIB_H += tag.h
  LIB_H += transport.h
@@@ -489,7 -481,6 +489,7 @@@ LIB_OBJS += sha1-lookup.
  LIB_OBJS += sha1_name.o
  LIB_OBJS += shallow.o
  LIB_OBJS += sideband.o
 +LIB_OBJS += sigchain.o
  LIB_OBJS += strbuf.o
  LIB_OBJS += symlinks.o
  LIB_OBJS += tag.o
@@@ -794,7 -785,6 +794,7 @@@ ifneq (,$(findstring MINGW,$(uname_S))
        SNPRINTF_RETURNS_BOGUS = YesPlease
        NO_SVN_TESTS = YesPlease
        NO_PERL_MAKEMAKER = YesPlease
 +      RUNTIME_PREFIX = YesPlease
        NO_POSIX_ONLY_PROGRAMS = YesPlease
        NO_ST_BLOCKS_IN_STRUCT_STAT = YesPlease
        COMPAT_CFLAGS += -D__USE_MINGW_ACCESS -DNOGDI -Icompat -Icompat/regex -Icompat/fnmatch
        COMPAT_OBJS += compat/mingw.o compat/fnmatch/fnmatch.o compat/regex/regex.o compat/winansi.o
        EXTLIBS += -lws2_32
        X = .exe
 -      gitexecdir = ../libexec/git-core
 -      template_dir = ../share/git-core/templates/
 -      ETC_GITCONFIG = ../etc/gitconfig
  endif
  ifneq (,$(findstring arm,$(uname_M)))
        ARM_SHA1 = YesPlease
@@@ -824,7 -817,6 +824,7 @@@ ifeq ($(uname_S),Darwin
                        BASIC_LDFLAGS += -L/opt/local/lib
                endif
        endif
 +      PTHREAD_LIBS =
  endif
  
  ifndef CC_LD_DYNPATH
@@@ -857,12 -849,7 +857,12 @@@ els
                endif
        endif
        ifndef NO_EXPAT
 -              EXPAT_LIBEXPAT = -lexpat
 +              ifdef EXPATDIR
 +                      BASIC_CFLAGS += -I$(EXPATDIR)/include
 +                      EXPAT_LIBEXPAT = -L$(EXPATDIR)/$(lib) $(CC_LD_DYNPATH)$(EXPATDIR)/$(lib) -lexpat
 +              else
 +                      EXPAT_LIBEXPAT = -lexpat
 +              endif
        endif
  endif
  
@@@ -1040,9 -1027,6 +1040,9 @@@ ifdef INTERNAL_QSOR
        COMPAT_CFLAGS += -DINTERNAL_QSORT
        COMPAT_OBJS += compat/qsort.o
  endif
 +ifdef RUNTIME_PREFIX
 +      COMPAT_CFLAGS += -DRUNTIME_PREFIX
 +endif
  
  ifdef NO_PTHREADS
        THREADED_DELTA_SEARCH =
@@@ -1102,7 -1086,6 +1102,7 @@@ ETC_GITCONFIG_SQ = $(subst ','\'',$(ETC
  
  DESTDIR_SQ = $(subst ','\'',$(DESTDIR))
  bindir_SQ = $(subst ','\'',$(bindir))
 +bindir_relative_SQ = $(subst ','\'',$(bindir_relative))
  mandir_SQ = $(subst ','\'',$(mandir))
  infodir_SQ = $(subst ','\'',$(infodir))
  gitexecdir_SQ = $(subst ','\'',$(gitexecdir))
@@@ -1268,12 -1251,7 +1268,12 @@@ git.o git.spec 
        $(QUIET_CC)$(CC) -o $*.o -c $(ALL_CFLAGS) $<
  
  exec_cmd.o: exec_cmd.c GIT-CFLAGS
 -      $(QUIET_CC)$(CC) -o $*.o -c $(ALL_CFLAGS) '-DGIT_EXEC_PATH="$(gitexecdir_SQ)"' $<
 +      $(QUIET_CC)$(CC) -o $*.o -c $(ALL_CFLAGS) \
 +              '-DGIT_EXEC_PATH="$(gitexecdir_SQ)"' \
 +              '-DBINDIR="$(bindir_relative_SQ)"' \
 +              '-DPREFIX="$(prefix_SQ)"' \
 +              $<
 +
  builtin-init-db.o: builtin-init-db.c GIT-CFLAGS
        $(QUIET_CC)$(CC) -o $*.o -c $(ALL_CFLAGS) -DDEFAULT_GIT_TEMPLATE_DIR='"$(template_dir_SQ)"' $<
  
@@@ -1309,7 -1287,7 +1309,7 @@@ $(LIB_FILE): $(LIB_OBJS
        $(QUIET_AR)$(RM) $@ && $(AR) rcs $@ $(LIB_OBJS)
  
  XDIFF_OBJS=xdiff/xdiffi.o xdiff/xprepare.o xdiff/xutils.o xdiff/xemit.o \
 -      xdiff/xmerge.o
 +      xdiff/xmerge.o xdiff/xpatience.o
  $(XDIFF_OBJS): xdiff/xinclude.h xdiff/xmacros.h xdiff/xdiff.h xdiff/xtypes.h \
        xdiff/xutils.h xdiff/xprepare.h xdiff/xdiffi.h xdiff/xemit.h
  
@@@ -1329,9 -1307,6 +1329,9 @@@ html
  info:
        $(MAKE) -C Documentation info
  
 +pdf:
 +      $(MAKE) -C Documentation pdf
 +
  TAGS:
        $(RM) TAGS
        $(FIND) . -name '*.[hcS]' -print | xargs etags -a
@@@ -1378,16 -1353,7 +1378,17 @@@ endi
  
  ### Testing rules
  
 -TEST_PROGRAMS = test-chmtime$X test-dump-cache-tree$X test-genrandom$X test-date$X test-delta$X test-sha1$X test-match-trees$X test-parse-options$X test-path-utils$X
 +TEST_PROGRAMS += test-chmtime$X
 +TEST_PROGRAMS += test-ctype$X
 +TEST_PROGRAMS += test-date$X
 +TEST_PROGRAMS += test-delta$X
++TEST_PROGRAMS += test-dump-cache-tree$X
 +TEST_PROGRAMS += test-genrandom$X
 +TEST_PROGRAMS += test-match-trees$X
 +TEST_PROGRAMS += test-parse-options$X
 +TEST_PROGRAMS += test-path-utils$X
 +TEST_PROGRAMS += test-sha1$X
 +TEST_PROGRAMS += test-sigchain$X
  
  all:: $(TEST_PROGRAMS)
  
@@@ -1400,8 -1366,6 +1401,8 @@@ export NO_SVN_TEST
  test: all
        $(MAKE) -C t/ all
  
 +test-ctype$X: ctype.o
 +
  test-date$X: date.o ctype.o
  
  test-delta$X: diff-delta.o patch-delta.o
@@@ -1433,17 -1397,17 +1434,17 @@@ remove-dashes
  
  ### Installation rules
  
 -ifeq ($(firstword $(subst /, ,$(template_dir))),..)
 -template_instdir = $(bindir)/$(template_dir)
 -else
 +ifeq ($(abspath $(template_dir)),$(template_dir))
  template_instdir = $(template_dir)
 +else
 +template_instdir = $(prefix)/$(template_dir)
  endif
  export template_instdir
  
 -ifeq ($(firstword $(subst /, ,$(gitexecdir))),..)
 -gitexec_instdir = $(bindir)/$(gitexecdir)
 -else
 +ifeq ($(abspath $(gitexecdir)),$(gitexecdir))
  gitexec_instdir = $(gitexecdir)
 +else
 +gitexec_instdir = $(prefix)/$(gitexecdir)
  endif
  gitexec_instdir_SQ = $(subst ','\'',$(gitexec_instdir))
  export gitexec_instdir
@@@ -1467,12 -1431,10 +1468,12 @@@ endi
        { $(RM) "$$execdir/git-add$X" && \
                ln git-add$X "$$execdir/git-add$X" 2>/dev/null || \
                cp git-add$X "$$execdir/git-add$X"; } && \
 -      { $(foreach p,$(filter-out git-add$X,$(BUILT_INS)), $(RM) "$$execdir/$p" && \
 -              ln "$$execdir/git-add$X" "$$execdir/$p" 2>/dev/null || \
 -              ln -s "git-add$X" "$$execdir/$p" 2>/dev/null || \
 -              cp "$$execdir/git-add$X" "$$execdir/$p" || exit;) } && \
 +      { for p in $(filter-out git-add$X,$(BUILT_INS)); do \
 +              $(RM) "$$execdir/$$p" && \
 +              ln "$$execdir/git-add$X" "$$execdir/$$p" 2>/dev/null || \
 +              ln -s "git-add$X" "$$execdir/$$p" 2>/dev/null || \
 +              cp "$$execdir/git-add$X" "$$execdir/$$p" || exit; \
 +        done } && \
        ./check_bindir "z$$bindir" "z$$execdir" "$$bindir/git-add$X"
  
  install-doc:
@@@ -1487,9 -1449,6 +1488,9 @@@ install-html
  install-info:
        $(MAKE) -C Documentation install-info
  
 +install-pdf:
 +      $(MAKE) -C Documentation install-pdf
 +
  quick-install-doc:
        $(MAKE) -C Documentation quick-install
  
diff --combined builtin-apply.c
index 1e7f917d3908c0c2f70c7208cb8b0839782849e4,3b6cd6dfaea0c8c427ab1a80ed11cabe60a5b32d..f312798af38553e0badeda9732736a62460eae05
@@@ -14,7 -14,6 +14,7 @@@
  #include "builtin.h"
  #include "string-list.h"
  #include "dir.h"
 +#include "parse-options.h"
  
  /*
   *  --check turns on checking that the working tree matches the
@@@ -46,11 -45,9 +46,11 @@@ static int apply_verbosely
  static int no_add;
  static const char *fake_ancestor;
  static int line_termination = '\n';
 -static unsigned long p_context = ULONG_MAX;
 -static const char apply_usage[] =
 -"git apply [--stat] [--numstat] [--summary] [--check] [--index] [--cached] [--apply] [--no-add] [--index-info] [--allow-binary-replacement] [--reverse] [--reject] [--verbose] [-z] [-pNUM] [-CNUM] [--whitespace=<nowarn|warn|fix|error|error-all>] <patch>...";
 +static unsigned int p_context = UINT_MAX;
 +static const char * const apply_usage[] = {
 +      "git apply [options] [<patch>...]",
 +      NULL
 +};
  
  static enum ws_error_action {
        nowarn_ws_error,
@@@ -64,8 -61,6 +64,8 @@@ static int applied_after_fixing_ws
  static const char *patch_input_file;
  static const char *root;
  static int root_len;
 +static int read_stdin = 1;
 +static int options;
  
  static void parse_whitespace_option(const char *option)
  {
@@@ -1258,9 -1253,8 +1258,9 @@@ static char *inflate_it(const void *dat
        stream.avail_in = size;
        stream.next_out = out = xmalloc(inflated_size);
        stream.avail_out = inflated_size;
 -      inflateInit(&stream);
 -      st = inflate(&stream, Z_FINISH);
 +      git_inflate_init(&stream);
 +      st = git_inflate(&stream, Z_FINISH);
 +      git_inflate_end(&stream);
        if ((st != Z_STREAM_END) || stream.total_out != inflated_size) {
                free(out);
                return NULL;
@@@ -2441,7 -2435,7 +2441,7 @@@ static int check_preimage(struct patch 
                return error("%s: %s", old_name, strerror(errno));
        }
  
-       if (!cached)
+       if (!cached && !tpatch)
                st_mode = ce_mode_from_stat(*ce, st->st_mode);
  
        if (patch->is_new < 0)
        if (st_mode != patch->old_mode)
                fprintf(stderr, "warning: %s has type %o, expected %o\n",
                        old_name, st_mode, patch->old_mode);
 -      if (!patch->new_mode)
 +      if (!patch->new_mode && !patch->is_delete)
                patch->new_mode = st_mode;
        return 0;
  
@@@ -3143,160 -3137,151 +3143,160 @@@ static int git_apply_config(const char 
        return git_default_config(var, value, cb);
  }
  
 +static int option_parse_exclude(const struct option *opt,
 +                              const char *arg, int unset)
 +{
 +      add_name_limit(arg, 1);
 +      return 0;
 +}
 +
 +static int option_parse_include(const struct option *opt,
 +                              const char *arg, int unset)
 +{
 +      add_name_limit(arg, 0);
 +      has_include = 1;
 +      return 0;
 +}
 +
 +static int option_parse_p(const struct option *opt,
 +                        const char *arg, int unset)
 +{
 +      p_value = atoi(arg);
 +      p_value_known = 1;
 +      return 0;
 +}
 +
 +static int option_parse_z(const struct option *opt,
 +                        const char *arg, int unset)
 +{
 +      if (unset)
 +              line_termination = '\n';
 +      else
 +              line_termination = 0;
 +      return 0;
 +}
 +
 +static int option_parse_whitespace(const struct option *opt,
 +                                 const char *arg, int unset)
 +{
 +      const char **whitespace_option = opt->value;
 +
 +      *whitespace_option = arg;
 +      parse_whitespace_option(arg);
 +      return 0;
 +}
 +
 +static int option_parse_directory(const struct option *opt,
 +                                const char *arg, int unset)
 +{
 +      root_len = strlen(arg);
 +      if (root_len && arg[root_len - 1] != '/') {
 +              char *new_root;
 +              root = new_root = xmalloc(root_len + 2);
 +              strcpy(new_root, arg);
 +              strcpy(new_root + root_len++, "/");
 +      } else
 +              root = arg;
 +      return 0;
 +}
  
  int cmd_apply(int argc, const char **argv, const char *unused_prefix)
  {
        int i;
 -      int read_stdin = 1;
 -      int options = 0;
        int errs = 0;
        int is_not_gitdir;
 +      int binary;
 +      int force_apply = 0;
  
        const char *whitespace_option = NULL;
  
 +      struct option builtin_apply_options[] = {
 +              { OPTION_CALLBACK, 0, "exclude", NULL, "path",
 +                      "donĀ“t apply changes matching the given path",
 +                      0, option_parse_exclude },
 +              { OPTION_CALLBACK, 0, "include", NULL, "path",
 +                      "apply changes matching the given path",
 +                      0, option_parse_include },
 +              { OPTION_CALLBACK, 'p', NULL, NULL, "num",
 +                      "remove <num> leading slashes from traditional diff paths",
 +                      0, option_parse_p },
 +              OPT_BOOLEAN(0, "no-add", &no_add,
 +                      "ignore additions made by the patch"),
 +              OPT_BOOLEAN(0, "stat", &diffstat,
 +                      "instead of applying the patch, output diffstat for the input"),
 +              OPT_BOOLEAN(0, "allow-binary-replacement", &binary,
 +                      "now no-op"),
 +              OPT_BOOLEAN(0, "binary", &binary,
 +                      "now no-op"),
 +              OPT_BOOLEAN(0, "numstat", &numstat,
 +                      "shows number of added and deleted lines in decimal notation"),
 +              OPT_BOOLEAN(0, "summary", &summary,
 +                      "instead of applying the patch, output a summary for the input"),
 +              OPT_BOOLEAN(0, "check", &check,
 +                      "instead of applying the patch, see if the patch is applicable"),
 +              OPT_BOOLEAN(0, "index", &check_index,
 +                      "make sure the patch is applicable to the current index"),
 +              OPT_BOOLEAN(0, "cached", &cached,
 +                      "apply a patch without touching the working tree"),
 +              OPT_BOOLEAN(0, "apply", &force_apply,
 +                      "also apply the patch (use with --stat/--summary/--check)"),
 +              OPT_STRING(0, "build-fake-ancestor", &fake_ancestor, "file",
 +                      "build a temporary index based on embedded index information"),
 +              { OPTION_CALLBACK, 'z', NULL, NULL, NULL,
 +                      "paths are separated with NUL character",
 +                      PARSE_OPT_NOARG, option_parse_z },
 +              OPT_INTEGER('C', NULL, &p_context,
 +                              "ensure at least <n> lines of context match"),
 +              { OPTION_CALLBACK, 0, "whitespace", &whitespace_option, "action",
 +                      "detect new or modified lines that have whitespace errors",
 +                      0, option_parse_whitespace },
 +              OPT_BOOLEAN('R', "reverse", &apply_in_reverse,
 +                      "apply the patch in reverse"),
 +              OPT_BOOLEAN(0, "unidiff-zero", &unidiff_zero,
 +                      "don't expect at least one line of context"),
 +              OPT_BOOLEAN(0, "reject", &apply_with_reject,
 +                      "leave the rejected hunks in corresponding *.rej files"),
 +              OPT__VERBOSE(&apply_verbosely),
 +              OPT_BIT(0, "inaccurate-eof", &options,
 +                      "tolerate incorrectly detected missing new-line at the end of file",
 +                      INACCURATE_EOF),
 +              OPT_BIT(0, "recount", &options,
 +                      "do not trust the line counts in the hunk headers",
 +                      RECOUNT),
 +              { OPTION_CALLBACK, 0, "directory", NULL, "root",
 +                      "prepend <root> to all filenames",
 +                      0, option_parse_directory },
 +              OPT_END()
 +      };
 +
        prefix = setup_git_directory_gently(&is_not_gitdir);
        prefix_length = prefix ? strlen(prefix) : 0;
        git_config(git_apply_config, NULL);
        if (apply_default_whitespace)
                parse_whitespace_option(apply_default_whitespace);
  
 -      for (i = 1; i < argc; i++) {
 +      argc = parse_options(argc, argv, builtin_apply_options,
 +                      apply_usage, 0);
 +      if (apply_with_reject)
 +              apply = apply_verbosely = 1;
 +      if (!force_apply && (diffstat || numstat || summary || check || fake_ancestor))
 +              apply = 0;
 +      if (check_index && is_not_gitdir)
 +              die("--index outside a repository");
 +      if (cached) {
 +              if (is_not_gitdir)
 +                      die("--cached outside a repository");
 +              check_index = 1;
 +      }
 +      for (i = 0; i < argc; i++) {
                const char *arg = argv[i];
 -              char *end;
                int fd;
  
                if (!strcmp(arg, "-")) {
                        errs |= apply_patch(0, "<stdin>", options);
                        read_stdin = 0;
                        continue;
 -              }
 -              if (!prefixcmp(arg, "--exclude=")) {
 -                      add_name_limit(arg + 10, 1);
 -                      continue;
 -              }
 -              if (!prefixcmp(arg, "--include=")) {
 -                      add_name_limit(arg + 10, 0);
 -                      has_include = 1;
 -                      continue;
 -              }
 -              if (!prefixcmp(arg, "-p")) {
 -                      p_value = atoi(arg + 2);
 -                      p_value_known = 1;
 -                      continue;
 -              }
 -              if (!strcmp(arg, "--no-add")) {
 -                      no_add = 1;
 -                      continue;
 -              }
 -              if (!strcmp(arg, "--stat")) {
 -                      apply = 0;
 -                      diffstat = 1;
 -                      continue;
 -              }
 -              if (!strcmp(arg, "--allow-binary-replacement") ||
 -                  !strcmp(arg, "--binary")) {
 -                      continue; /* now no-op */
 -              }
 -              if (!strcmp(arg, "--numstat")) {
 -                      apply = 0;
 -                      numstat = 1;
 -                      continue;
 -              }
 -              if (!strcmp(arg, "--summary")) {
 -                      apply = 0;
 -                      summary = 1;
 -                      continue;
 -              }
 -              if (!strcmp(arg, "--check")) {
 -                      apply = 0;
 -                      check = 1;
 -                      continue;
 -              }
 -              if (!strcmp(arg, "--index")) {
 -                      if (is_not_gitdir)
 -                              die("--index outside a repository");
 -                      check_index = 1;
 -                      continue;
 -              }
 -              if (!strcmp(arg, "--cached")) {
 -                      if (is_not_gitdir)
 -                              die("--cached outside a repository");
 -                      check_index = 1;
 -                      cached = 1;
 -                      continue;
 -              }
 -              if (!strcmp(arg, "--apply")) {
 -                      apply = 1;
 -                      continue;
 -              }
 -              if (!strcmp(arg, "--build-fake-ancestor")) {
 -                      apply = 0;
 -                      if (++i >= argc)
 -                              die ("need a filename");
 -                      fake_ancestor = argv[i];
 -                      continue;
 -              }
 -              if (!strcmp(arg, "-z")) {
 -                      line_termination = 0;
 -                      continue;
 -              }
 -              if (!prefixcmp(arg, "-C")) {
 -                      p_context = strtoul(arg + 2, &end, 0);
 -                      if (*end != '\0')
 -                              die("unrecognized context count '%s'", arg + 2);
 -                      continue;
 -              }
 -              if (!prefixcmp(arg, "--whitespace=")) {
 -                      whitespace_option = arg + 13;
 -                      parse_whitespace_option(arg + 13);
 -                      continue;
 -              }
 -              if (!strcmp(arg, "-R") || !strcmp(arg, "--reverse")) {
 -                      apply_in_reverse = 1;
 -                      continue;
 -              }
 -              if (!strcmp(arg, "--unidiff-zero")) {
 -                      unidiff_zero = 1;
 -                      continue;
 -              }
 -              if (!strcmp(arg, "--reject")) {
 -                      apply = apply_with_reject = apply_verbosely = 1;
 -                      continue;
 -              }
 -              if (!strcmp(arg, "-v") || !strcmp(arg, "--verbose")) {
 -                      apply_verbosely = 1;
 -                      continue;
 -              }
 -              if (!strcmp(arg, "--inaccurate-eof")) {
 -                      options |= INACCURATE_EOF;
 -                      continue;
 -              }
 -              if (!strcmp(arg, "--recount")) {
 -                      options |= RECOUNT;
 -                      continue;
 -              }
 -              if (!prefixcmp(arg, "--directory=")) {
 -                      arg += strlen("--directory=");
 -                      root_len = strlen(arg);
 -                      if (root_len && arg[root_len - 1] != '/') {
 -                              char *new_root;
 -                              root = new_root = xmalloc(root_len + 2);
 -                              strcpy(new_root, arg);
 -                              strcpy(new_root + root_len++, "/");
 -                      } else
 -                              root = arg;
 -                      continue;
 -              }
 -              if (0 < prefix_length)
 +              } else if (0 < prefix_length)
                        arg = prefix_filename(prefix, prefix_length, arg);
  
                fd = open(arg, O_RDONLY);