Merge branch 'tb/crlf-conv-flags'
authorJunio C Hamano <gitster@pobox.com>
Tue, 13 Feb 2018 21:39:08 +0000 (13:39 -0800)
committerJunio C Hamano <gitster@pobox.com>
Tue, 13 Feb 2018 21:39:08 +0000 (13:39 -0800)
Code clean-up.

* tb/crlf-conv-flags:
convert_to_git(): safe_crlf/checksafe becomes int conv_flags

1  2 
combine-diff.c
config.c
diff.c
environment.c
sha1_file.c
diff --combined combine-diff.c
index bc08c4c5b1f68e731efce9adf2a4032eb5246f99,19f30c33539f69c773c7b104be8355d4e7e4fcdd..18c74dad51daf4cd7fb0694ad9ace62098fefac4
@@@ -1053,7 -1053,7 +1053,7 @@@ static void show_patch_diff(struct comb
                        if (is_file) {
                                struct strbuf buf = STRBUF_INIT;
  
-                               if (convert_to_git(&the_index, elem->path, result, len, &buf, safe_crlf)) {
+                               if (convert_to_git(&the_index, elem->path, result, len, &buf, global_conv_flags_eol)) {
                                        free(result);
                                        result = strbuf_detach(&buf, &len);
                                        result_size = len;
@@@ -1438,7 -1438,7 +1438,7 @@@ void diff_tree_combined(const struct ob
                        opt->flags.follow_renames       ||
                        opt->break_opt != -1    ||
                        opt->detect_rename      ||
 -                      opt->pickaxe            ||
 +                      (opt->pickaxe_opts & DIFF_PICKAXE_KINDS_MASK)   ||
                        opt->filter;
  
  
diff --combined config.c
index 70ce6e7041d77d2a274783cb57ddfa196ad0cd71,1f003fbb90bed98e1d8fb25543f76f8d0cfaf78c..b0c20e6cb8ab1f5dc3cd3b4573b7e9d6dbf8cd2b
+++ b/config.c
@@@ -1149,11 -1149,14 +1149,14 @@@ static int git_default_core_config(cons
        }
  
        if (!strcmp(var, "core.safecrlf")) {
+               int eol_rndtrp_die;
                if (value && !strcasecmp(value, "warn")) {
-                       safe_crlf = SAFE_CRLF_WARN;
+                       global_conv_flags_eol = CONV_EOL_RNDTRP_WARN;
                        return 0;
                }
-               safe_crlf = git_config_bool(var, value);
+               eol_rndtrp_die = git_config_bool(var, value);
+               global_conv_flags_eol = eol_rndtrp_die ?
+                       CONV_EOL_RNDTRP_DIE : CONV_EOL_RNDTRP_WARN;
                return 0;
        }
  
                return 0;
        }
  
 +      if (!strcmp(var, "core.partialclonefilter")) {
 +              return git_config_string(&core_partial_clone_filter_default,
 +                                       var, value);
 +      }
 +
        /* Add other config variables here and to Documentation/config.txt. */
        return 0;
  }
diff --combined diff.c
index 0a9a0cdf18f1ddd18f0939c49d29a311450d0be3,35cca04f259804476d758f871cba60bae7fe940a..e5c5cc4605af689ab5c949c0613c755457f06131
--- 1/diff.c
--- 2/diff.c
+++ b/diff.c
@@@ -246,7 -246,7 +246,7 @@@ static int parse_ws_error_highlight(con
   */
  void init_diff_ui_defaults(void)
  {
 -      diff_detect_rename_default = 1;
 +      diff_detect_rename_default = DIFF_DETECT_RENAME;
  }
  
  int git_diff_heuristic_config(const char *var, const char *value, void *cb)
@@@ -3520,13 -3520,13 +3520,13 @@@ int diff_populate_filespec(struct diff_
  {
        int size_only = flags & CHECK_SIZE_ONLY;
        int err = 0;
+       int conv_flags = global_conv_flags_eol;
        /*
         * demote FAIL to WARN to allow inspecting the situation
         * instead of refusing.
         */
-       enum safe_crlf crlf_warn = (safe_crlf == SAFE_CRLF_FAIL
-                                   ? SAFE_CRLF_WARN
-                                   : safe_crlf);
+       if (conv_flags & CONV_EOL_RNDTRP_DIE)
+               conv_flags = CONV_EOL_RNDTRP_WARN;
  
        if (!DIFF_FILE_VALID(s))
                die("internal error: asking to populate invalid file.");
                /*
                 * Convert from working tree format to canonical git format
                 */
-               if (convert_to_git(&the_index, s->path, s->data, s->size, &buf, crlf_warn)) {
+               if (convert_to_git(&the_index, s->path, s->data, s->size, &buf, conv_flags)) {
                        size_t size = 0;
                        munmap(s->data, s->size);
                        s->should_munmap = 0;
@@@ -4086,7 -4086,6 +4086,7 @@@ void diff_setup(struct diff_options *op
        options->interhunkcontext = diff_interhunk_context_default;
        options->ws_error_highlight = ws_error_highlight_default;
        options->flags.rename_empty = 1;
 +      options->objfind = NULL;
  
        /* pathchange left =NULL by default */
        options->change = diff_change;
  
  void diff_setup_done(struct diff_options *options)
  {
 -      int count = 0;
 +      unsigned check_mask = DIFF_FORMAT_NAME |
 +                            DIFF_FORMAT_NAME_STATUS |
 +                            DIFF_FORMAT_CHECKDIFF |
 +                            DIFF_FORMAT_NO_OUTPUT;
  
        if (options->set_default)
                options->set_default(options);
  
 -      if (options->output_format & DIFF_FORMAT_NAME)
 -              count++;
 -      if (options->output_format & DIFF_FORMAT_NAME_STATUS)
 -              count++;
 -      if (options->output_format & DIFF_FORMAT_CHECKDIFF)
 -              count++;
 -      if (options->output_format & DIFF_FORMAT_NO_OUTPUT)
 -              count++;
 -      if (count > 1)
 +      if (HAS_MULTI_BITS(options->output_format & check_mask))
                die(_("--name-only, --name-status, --check and -s are mutually exclusive"));
  
 +      if (HAS_MULTI_BITS(options->pickaxe_opts & DIFF_PICKAXE_KINDS_MASK))
 +              die(_("-G, -S and --find-object are mutually exclusive"));
 +
        /*
         * Most of the time we can say "there are changes"
         * only by checking if there are changed paths, but
        /*
         * Also pickaxe would not work very well if you do not say recursive
         */
 -      if (options->pickaxe)
 +      if (options->pickaxe_opts & DIFF_PICKAXE_KINDS_MASK)
                options->flags.recursive = 1;
        /*
         * When patches are generated, submodules diffed against the work tree
@@@ -4488,23 -4489,6 +4488,23 @@@ static int parse_ws_error_highlight_opt
        return 1;
  }
  
 +static int parse_objfind_opt(struct diff_options *opt, const char *arg)
 +{
 +      struct object_id oid;
 +
 +      if (get_oid(arg, &oid))
 +              return error("unable to resolve '%s'", arg);
 +
 +      if (!opt->objfind)
 +              opt->objfind = xcalloc(1, sizeof(*opt->objfind));
 +
 +      opt->pickaxe_opts |= DIFF_PICKAXE_KIND_OBJFIND;
 +      opt->flags.recursive = 1;
 +      opt->flags.tree_in_recursive = 1;
 +      oidset_insert(opt->objfind, &oid);
 +      return 1;
 +}
 +
  int diff_opt_parse(struct diff_options *options,
                   const char **av, int ac, const char *prefix)
  {
        else if ((argcount = short_opt('O', av, &optarg))) {
                options->orderfile = prefix_filename(prefix, optarg);
                return argcount;
 -      }
 +      } else if (skip_prefix(arg, "--find-object=", &arg))
 +              return parse_objfind_opt(options, arg);
        else if ((argcount = parse_long_opt("diff-filter", av, &optarg))) {
                int offending = parse_diff_filter_opt(optarg, options);
                if (offending)
@@@ -5800,7 -5783,7 +5800,7 @@@ void diffcore_std(struct diff_options *
                if (options->break_opt != -1)
                        diffcore_merge_broken();
        }
 -      if (options->pickaxe)
 +      if (options->pickaxe_opts & DIFF_PICKAXE_KINDS_MASK)
                diffcore_pickaxe(options);
        if (options->orderfile)
                diffcore_order(options->orderfile);
diff --combined environment.c
index 0adc71ebe54eb9914a9c1292e2cd22f42bbc47c4,10a32c20accd5943f4fcd410846647d9630366a2..de8431e01e7f4a2168e35df2dfa5695d3c810210
@@@ -27,8 -27,6 +27,8 @@@ int warn_ambiguous_refs = 1
  int warn_on_object_refname_ambiguity = 1;
  int ref_paranoia = -1;
  int repository_format_precious_objects;
 +char *repository_format_partial_clone;
 +const char *core_partial_clone_filter_default;
  const char *git_commit_encoding;
  const char *git_log_output_encoding;
  const char *apply_default_whitespace;
@@@ -51,7 -49,7 +51,7 @@@ enum auto_crlf auto_crlf = AUTO_CRLF_FA
  int check_replace_refs = 1;
  char *git_replace_ref_base;
  enum eol core_eol = EOL_UNSET;
enum safe_crlf safe_crlf = SAFE_CRLF_WARN;
int global_conv_flags_eol = CONV_EOL_RNDTRP_WARN;
  unsigned whitespace_rule_cfg = WS_DEFAULT_RULE;
  enum branch_track git_branch_track = BRANCH_TRACK_REMOTE;
  enum rebase_setup_type autorebase = AUTOREBASE_NEVER;
diff --combined sha1_file.c
index 90998bb596e79dc3dccef9046f87c40bac347af5,6bc7c6ada9ec56564a6007bcca54e76d430ebea3..4d3f282c80374f769de548787e346642b599db7d
  #include "bulk-checkin.h"
  #include "streaming.h"
  #include "dir.h"
 -#include "mru.h"
  #include "list.h"
  #include "mergesort.h"
  #include "quote.h"
  #include "packfile.h"
 +#include "fetch-object.h"
  
  const unsigned char null_sha1[GIT_MAX_RAWSZ];
  const struct object_id null_oid;
@@@ -133,14 -133,14 +133,14 @@@ static struct cached_object *find_cache
  }
  
  
- static enum safe_crlf get_safe_crlf(unsigned flags)
+ static int get_conv_flags(unsigned flags)
  {
        if (flags & HASH_RENORMALIZE)
-               return SAFE_CRLF_RENORMALIZE;
+               return CONV_EOL_RENORMALIZE;
        else if (flags & HASH_WRITE_OBJECT)
-               return safe_crlf;
+         return global_conv_flags_eol;
        else
-               return SAFE_CRLF_FALSE;
+               return 0;
  }
  
  
@@@ -1213,8 -1213,6 +1213,8 @@@ static int sha1_loose_object_info(cons
        return (status < 0) ? status : 0;
  }
  
 +int fetch_if_missing = 1;
 +
  int sha1_object_info_extended(const unsigned char *sha1, struct object_info *oi, unsigned flags)
  {
        static struct object_info blank_oi = OBJECT_INFO_INIT;
        const unsigned char *real = (flags & OBJECT_INFO_LOOKUP_REPLACE) ?
                                    lookup_replace_object(sha1) :
                                    sha1;
 +      int already_retried = 0;
  
        if (is_null_sha1(real))
                return -1;
                }
        }
  
 -      if (!find_pack_entry(real, &e)) {
 +      while (1) {
 +              if (find_pack_entry(real, &e))
 +                      break;
 +
                /* Most likely it's a loose object. */
                if (!sha1_loose_object_info(real, oi, flags))
                        return 0;
  
                /* Not a loose object; someone else may have just packed it. */
 -              if (flags & OBJECT_INFO_QUICK) {
 -                      return -1;
 -              } else {
 -                      reprepare_packed_git();
 -                      if (!find_pack_entry(real, &e))
 -                              return -1;
 +              reprepare_packed_git();
 +              if (find_pack_entry(real, &e))
 +                      break;
 +
 +              /* Check if it is a missing object */
 +              if (fetch_if_missing && repository_format_partial_clone &&
 +                  !already_retried) {
 +                      /*
 +                       * TODO Investigate haveing fetch_object() return
 +                       * TODO error/success and stopping the music here.
 +                       */
 +                      fetch_object(repository_format_partial_clone, real);
 +                      already_retried = 1;
 +                      continue;
                }
 +
 +              return -1;
        }
  
        if (oi == &blank_oi)
                 * information below, so return early.
                 */
                return 0;
 -
        rtype = packed_object_info(e.p, e.offset, oi);
        if (rtype < 0) {
                mark_bad_packed_object(e.p, real);
@@@ -1767,7 -1752,7 +1767,7 @@@ static int index_mem(struct object_id *
        if ((type == OBJ_BLOB) && path) {
                struct strbuf nbuf = STRBUF_INIT;
                if (convert_to_git(&the_index, path, buf, size, &nbuf,
-                                  get_safe_crlf(flags))) {
+                                  get_conv_flags(flags))) {
                        buf = strbuf_detach(&nbuf, &size);
                        re_allocated = 1;
                }
@@@ -1801,7 -1786,7 +1801,7 @@@ static int index_stream_convert_blob(st
        assert(would_convert_to_git_filter_fd(path));
  
        convert_to_git_filter_fd(&the_index, path, fd, &sbuf,
-                                get_safe_crlf(flags));
+                                get_conv_flags(flags));
  
        if (write_object)
                ret = write_sha1_file(sbuf.buf, sbuf.len, typename(OBJ_BLOB),