Merge branch 'jk/options-cleanup'
authorJunio C Hamano <gitster@pobox.com>
Wed, 10 Feb 2016 22:20:08 +0000 (14:20 -0800)
committerJunio C Hamano <gitster@pobox.com>
Wed, 10 Feb 2016 22:20:08 +0000 (14:20 -0800)
Various clean-ups to the command line option parsing.

* jk/options-cleanup:
apply, ls-files: simplify "-z" parsing
checkout-index: disallow "--no-stage" option
checkout-index: handle "--no-index" option
checkout-index: handle "--no-prefix" option
checkout-index: simplify "-z" option parsing
give "nbuf" strbuf a more meaningful name

1  2 
builtin/hash-object.c
builtin/ls-files.c
builtin/update-index.c
diff --combined builtin/hash-object.c
index ff20395c69780cb5869300af83084d6cac1bbd4d,d3cb4e53453281c60c0ff97a976a2aa621b087a8..f7d3567dd0ce2d75778d6cf011961c0f203432b4
@@@ -58,20 -58,21 +58,21 @@@ static void hash_object(const char *pat
  static void hash_stdin_paths(const char *type, int no_filters, unsigned flags,
                             int literally)
  {
-       struct strbuf buf = STRBUF_INIT, nbuf = STRBUF_INIT;
+       struct strbuf buf = STRBUF_INIT;
+       struct strbuf unquoted = STRBUF_INIT;
  
 -      while (strbuf_getline_lf(&buf, stdin) != EOF) {
 +      while (strbuf_getline(&buf, stdin) != EOF) {
                if (buf.buf[0] == '"') {
-                       strbuf_reset(&nbuf);
-                       if (unquote_c_style(&nbuf, buf.buf, NULL))
+                       strbuf_reset(&unquoted);
+                       if (unquote_c_style(&unquoted, buf.buf, NULL))
                                die("line is badly quoted");
-                       strbuf_swap(&buf, &nbuf);
+                       strbuf_swap(&buf, &unquoted);
                }
                hash_object(buf.buf, type, no_filters ? NULL : buf.buf, flags,
                            literally);
        }
        strbuf_release(&buf);
-       strbuf_release(&nbuf);
+       strbuf_release(&unquoted);
  }
  
  int cmd_hash_object(int argc, const char **argv, const char *prefix)
diff --combined builtin/ls-files.c
index dedf02dc702d1cc94399f45869e5d01d2f0eecb9,467699bcf5edad871784384cb6a5db178d0dc6d6..f02e3d23bb71a39dfd9f6eddf40aa84da896b650
@@@ -27,7 -27,6 +27,7 @@@ static int show_killed
  static int show_valid_bit;
  static int line_terminator = '\n';
  static int debug_mode;
 +static int show_eol;
  
  static const char *prefix;
  static int max_prefix_len;
@@@ -48,23 -47,6 +48,23 @@@ static const char *tag_modified = ""
  static const char *tag_skip_worktree = "";
  static const char *tag_resolve_undo = "";
  
 +static void write_eolinfo(const struct cache_entry *ce, const char *path)
 +{
 +      if (!show_eol)
 +              return;
 +      else {
 +              struct stat st;
 +              const char *i_txt = "";
 +              const char *w_txt = "";
 +              const char *a_txt = get_convert_attr_ascii(path);
 +              if (ce && S_ISREG(ce->ce_mode))
 +                      i_txt = get_cached_convert_stats_ascii(ce->name);
 +              if (!lstat(path, &st) && S_ISREG(st.st_mode))
 +                      w_txt = get_wt_convert_stats_ascii(path);
 +              printf("i/%-5s w/%-5s attr/%-17s\t", i_txt, w_txt, a_txt);
 +      }
 +}
 +
  static void write_name(const char *name)
  {
        /*
@@@ -86,7 -68,6 +86,7 @@@ static void show_dir_entry(const char *
                return;
  
        fputs(tag, stdout);
 +      write_eolinfo(NULL, ent->name);
        write_name(ent->name);
  }
  
@@@ -189,7 -170,6 +189,7 @@@ static void show_ce_entry(const char *t
                       find_unique_abbrev(ce->sha1,abbrev),
                       ce_stage(ce));
        }
 +      write_eolinfo(ce, ce->name);
        write_name(ce->name);
        if (debug_mode) {
                const struct stat_data *sd = &ce->ce_stat_data;
@@@ -379,14 -359,6 +379,6 @@@ static const char * const ls_files_usag
        NULL
  };
  
- static int option_parse_z(const struct option *opt,
-                         const char *arg, int unset)
- {
-       line_terminator = unset ? '\n' : '\0';
-       return 0;
- }
  static int option_parse_exclude(const struct option *opt,
                                const char *arg, int unset)
  {
@@@ -428,9 -400,9 +420,9 @@@ int cmd_ls_files(int argc, const char *
        struct exclude_list *el;
        struct string_list exclude_list = STRING_LIST_INIT_NODUP;
        struct option builtin_ls_files_options[] = {
-               { OPTION_CALLBACK, 'z', NULL, NULL, NULL,
-                       N_("paths are separated with NUL character"),
-                       PARSE_OPT_NOARG, option_parse_z },
+               /* Think twice before adding "--nul" synonym to this */
+               OPT_SET_INT('z', NULL, &line_terminator,
+                       N_("paths are separated with NUL character"), '\0'),
                OPT_BOOL('t', NULL, &show_tag,
                        N_("identify the file status with tags")),
                OPT_BOOL('v', NULL, &show_valid_bit,
                OPT_BIT(0, "directory", &dir.flags,
                        N_("show 'other' directories' names only"),
                        DIR_SHOW_OTHER_DIRECTORIES),
 +              OPT_BOOL(0, "eol", &show_eol, N_("show line endings of files")),
                OPT_NEGBIT(0, "empty-directory", &dir.flags,
                        N_("don't show empty directories"),
                        DIR_HIDE_EMPTY_DIRECTORIES),
diff --combined builtin/update-index.c
index dbc23a46b13bee7ff532232c0e1d821c565fd2fb,f052fafb540e14c2c2448ac207c6bde8e0d8b0f3..1c94ca59bfcd756c94d86ef46592528e8fbfdcb1
@@@ -35,15 -35,6 +35,15 @@@ static int mark_skip_worktree_only
  #define UNMARK_FLAG 2
  static struct strbuf mtime_dir = STRBUF_INIT;
  
 +/* Untracked cache mode */
 +enum uc_mode {
 +      UC_UNSPECIFIED = -1,
 +      UC_DISABLE = 0,
 +      UC_ENABLE,
 +      UC_TEST,
 +      UC_FORCE
 +};
 +
  __attribute__((format (printf, 1, 2)))
  static void report(const char *fmt, ...)
  {
@@@ -130,7 -121,7 +130,7 @@@ static int test_if_untracked_cache_is_s
        if (!mkdtemp(mtime_dir.buf))
                die_errno("Could not make temporary directory");
  
 -      fprintf(stderr, _("Testing "));
 +      fprintf(stderr, _("Testing mtime in '%s' "), xgetcwd());
        atexit(remove_test_directory);
        xstat_mtime_dir(&st);
        fill_stat_data(&base, &st);
@@@ -913,7 -904,7 +913,7 @@@ static int reupdate_callback(struct par
  int cmd_update_index(int argc, const char **argv, const char *prefix)
  {
        int newfd, entries, has_errors = 0, nul_term_line = 0;
 -      int untracked_cache = -1;
 +      enum uc_mode untracked_cache = UC_UNSPECIFIED;
        int read_from_stdin = 0;
        int prefix_length = prefix ? strlen(prefix) : 0;
        int preferred_index_format = 0;
                        N_("enable or disable split index")),
                OPT_BOOL(0, "untracked-cache", &untracked_cache,
                        N_("enable/disable untracked cache")),
 +              OPT_SET_INT(0, "test-untracked-cache", &untracked_cache,
 +                          N_("test if the filesystem supports untracked cache"), UC_TEST),
                OPT_SET_INT(0, "force-untracked-cache", &untracked_cache,
 -                          N_("enable untracked cache without testing the filesystem"), 2),
 +                          N_("enable untracked cache without testing the filesystem"), UC_FORCE),
                OPT_END()
        };
  
        }
  
        if (read_from_stdin) {
-               struct strbuf buf = STRBUF_INIT, nbuf = STRBUF_INIT;
+               struct strbuf buf = STRBUF_INIT;
+               struct strbuf unquoted = STRBUF_INIT;
  
                setup_work_tree();
                while (getline_fn(&buf, stdin) != EOF) {
                        char *p;
                        if (!nul_term_line && buf.buf[0] == '"') {
-                               strbuf_reset(&nbuf);
-                               if (unquote_c_style(&nbuf, buf.buf, NULL))
+                               strbuf_reset(&unquoted);
+                               if (unquote_c_style(&unquoted, buf.buf, NULL))
                                        die("line is badly quoted");
-                               strbuf_swap(&buf, &nbuf);
+                               strbuf_swap(&buf, &unquoted);
                        }
                        p = prefix_path(prefix, prefix_length, buf.buf);
                        update_one(p);
                                chmod_path(set_executable_bit, p);
                        free(p);
                }
-               strbuf_release(&nbuf);
+               strbuf_release(&unquoted);
                strbuf_release(&buf);
        }
  
                the_index.split_index = NULL;
                the_index.cache_changed |= SOMETHING_CHANGED;
        }
 -      if (untracked_cache > 0) {
 -              struct untracked_cache *uc;
  
 -              if (untracked_cache < 2) {
 -                      setup_work_tree();
 -                      if (!test_if_untracked_cache_is_supported())
 -                              return 1;
 -              }
 -              if (!the_index.untracked) {
 -                      uc = xcalloc(1, sizeof(*uc));
 -                      strbuf_init(&uc->ident, 100);
 -                      uc->exclude_per_dir = ".gitignore";
 -                      /* should be the same flags used by git-status */
 -                      uc->dir_flags = DIR_SHOW_OTHER_DIRECTORIES | DIR_HIDE_EMPTY_DIRECTORIES;
 -                      the_index.untracked = uc;
 -              }
 -              add_untracked_ident(the_index.untracked);
 -              the_index.cache_changed |= UNTRACKED_CHANGED;
 -      } else if (!untracked_cache && the_index.untracked) {
 -              the_index.untracked = NULL;
 -              the_index.cache_changed |= UNTRACKED_CHANGED;
 +      switch (untracked_cache) {
 +      case UC_UNSPECIFIED:
 +              break;
 +      case UC_DISABLE:
 +              if (git_config_get_untracked_cache() == 1)
 +                      warning("core.untrackedCache is set to true; "
 +                              "remove or change it, if you really want to "
 +                              "disable the untracked cache");
 +              remove_untracked_cache(&the_index);
 +              report(_("Untracked cache disabled"));
 +              break;
 +      case UC_TEST:
 +              setup_work_tree();
 +              return !test_if_untracked_cache_is_supported();
 +      case UC_ENABLE:
 +      case UC_FORCE:
 +              if (git_config_get_untracked_cache() == 0)
 +                      warning("core.untrackedCache is set to false; "
 +                              "remove or change it, if you really want to "
 +                              "enable the untracked cache");
 +              add_untracked_cache(&the_index);
 +              report(_("Untracked cache enabled for '%s'"), get_git_work_tree());
 +              break;
 +      default:
 +              die("Bug: bad untracked_cache value: %d", untracked_cache);
        }
  
        if (active_cache_changed) {