Merge branch 'va/i18n-more'
authorJunio C Hamano <gitster@pobox.com>
Mon, 26 Sep 2016 23:09:17 +0000 (16:09 -0700)
committerJunio C Hamano <gitster@pobox.com>
Mon, 26 Sep 2016 23:09:18 +0000 (16:09 -0700)
Even more i18n.

* va/i18n-more:
i18n: stash: mark messages for translation
i18n: notes-merge: mark die messages for translation
i18n: ident: mark hint for translation
i18n: i18n: diff: mark die messages for translation
i18n: connect: mark die messages for translation
i18n: commit: mark message for translation

1  2 
connect.c
diff.c
notes-merge.c
t/t5512-ls-remote.sh
diff --combined connect.c
index 7224b5ecc79beebe3182b301bdf0e661f6a246fd,06bff0b48acbc962c7d1ca52c6b4a5e6096a21f2..d99d6435fd01754e3b0f23537d7e1b385a26f262
+++ b/connect.c
@@@ -43,14 -43,14 +43,14 @@@ int check_ref_type(const struct ref *re
        return check_ref(ref->name, flags);
  }
  
 -static void die_initial_contact(int got_at_least_one_head)
 +static void die_initial_contact(int unexpected)
  {
 -      if (got_at_least_one_head)
 +      if (unexpected)
-               die("The remote end hung up upon initial contact");
+               die(_("The remote end hung up upon initial contact"));
        else
-               die("Could not read from remote repository.\n\n"
-                   "Please make sure you have the correct access rights\n"
-                   "and the repository exists.");
+               die(_("Could not read from remote repository.\n\n"
+                     "Please make sure you have the correct access rights\n"
+                     "and the repository exists."));
  }
  
  static void parse_one_symref_info(struct string_list *symref, const char *val, int len)
@@@ -115,18 -115,10 +115,18 @@@ struct ref **get_remote_heads(int in, c
                              struct sha1_array *shallow_points)
  {
        struct ref **orig_list = list;
 -      int got_at_least_one_head = 0;
 +
 +      /*
 +       * A hang-up after seeing some response from the other end
 +       * means that it is unexpected, as we know the other end is
 +       * willing to talk to us.  A hang-up before seeing any
 +       * response does not necessarily mean an ACL problem, though.
 +       */
 +      int saw_response;
 +      int got_dummy_ref_with_capabilities_declaration = 0;
  
        *list = NULL;
 -      for (;;) {
 +      for (saw_response = 0; ; saw_response = 1) {
                struct ref *ref;
                struct object_id old_oid;
                char *name;
                                  PACKET_READ_GENTLE_ON_EOF |
                                  PACKET_READ_CHOMP_NEWLINE);
                if (len < 0)
 -                      die_initial_contact(got_at_least_one_head);
 +                      die_initial_contact(saw_response);
  
                if (!len)
                        break;
                        continue;
                }
  
 +              if (!strcmp(name, "capabilities^{}")) {
 +                      if (saw_response)
 +                              die("protocol error: unexpected capabilities^{}");
 +                      if (got_dummy_ref_with_capabilities_declaration)
 +                              die("protocol error: multiple capabilities^{}");
 +                      got_dummy_ref_with_capabilities_declaration = 1;
 +                      continue;
 +              }
 +
                if (!check_ref(name, flags))
                        continue;
 +
 +              if (got_dummy_ref_with_capabilities_declaration)
 +                      die("protocol error: unexpected ref after capabilities^{}");
 +
                ref = alloc_ref(buffer + GIT_SHA1_HEXSZ + 1);
                oidcpy(&ref->old_oid, &old_oid);
                *list = ref;
                list = &ref->next;
 -              got_at_least_one_head = 1;
        }
  
        annotate_refs_with_symref_info(*orig_list);
diff --combined diff.c
index dc5ab8b4fbb87ce0410d0353592b44025537071d,927022873bf54e58cb486249b0f89afff893da8b..2cc3a2e29b804c1ae58aa7d0c6d162b084ddeed8
--- 1/diff.c
--- 2/diff.c
+++ b/diff.c
@@@ -18,7 -18,6 +18,7 @@@
  #include "ll-merge.h"
  #include "string-list.h"
  #include "argv-array.h"
 +#include "graph.h"
  
  #ifdef NO_FAST_WORKING_DIRECTORY
  #define FAST_WORKING_DIRECTORY 0
@@@ -27,7 -26,6 +27,7 @@@
  #endif
  
  static int diff_detect_rename_default;
 +static int diff_indent_heuristic; /* experimental */
  static int diff_compaction_heuristic; /* experimental */
  static int diff_rename_limit_default = 400;
  static int diff_suppress_blank_empty;
@@@ -56,6 -54,11 +56,11 @@@ static char diff_colors[][COLOR_MAXLEN
        GIT_COLOR_NORMAL,       /* FUNCINFO */
  };
  
+ static NORETURN void die_want_option(const char *option_name)
+ {
+       die(_("option '%s' requires a value"), option_name);
+ }
  static int parse_diff_color_slot(const char *var)
  {
        if (!strcasecmp(var, "context") || !strcasecmp(var, "plain"))
@@@ -133,11 -136,9 +138,11 @@@ static int parse_dirstat_params(struct 
  static int parse_submodule_params(struct diff_options *options, const char *value)
  {
        if (!strcmp(value, "log"))
 -              DIFF_OPT_SET(options, SUBMODULE_LOG);
 +              options->submodule_format = DIFF_SUBMODULE_LOG;
        else if (!strcmp(value, "short"))
 -              DIFF_OPT_CLR(options, SUBMODULE_LOG);
 +              options->submodule_format = DIFF_SUBMODULE_SHORT;
 +      else if (!strcmp(value, "diff"))
 +              options->submodule_format = DIFF_SUBMODULE_INLINE_DIFF;
        else
                return -1;
        return 0;
@@@ -178,21 -179,6 +183,21 @@@ void init_diff_ui_defaults(void
        diff_detect_rename_default = 1;
  }
  
 +int git_diff_heuristic_config(const char *var, const char *value, void *cb)
 +{
 +      if (!strcmp(var, "diff.indentheuristic")) {
 +              diff_indent_heuristic = git_config_bool(var, value);
 +              if (diff_indent_heuristic)
 +                      diff_compaction_heuristic = 0;
 +      }
 +      if (!strcmp(var, "diff.compactionheuristic")) {
 +              diff_compaction_heuristic = git_config_bool(var, value);
 +              if (diff_compaction_heuristic)
 +                      diff_indent_heuristic = 0;
 +      }
 +      return 0;
 +}
 +
  int git_diff_ui_config(const char *var, const char *value, void *cb)
  {
        if (!strcmp(var, "diff.color") || !strcmp(var, "color.diff")) {
                diff_detect_rename_default = git_config_rename(var, value);
                return 0;
        }
 -      if (!strcmp(var, "diff.compactionheuristic")) {
 -              diff_compaction_heuristic = git_config_bool(var, value);
 -              return 0;
 -      }
        if (!strcmp(var, "diff.autorefreshindex")) {
                diff_auto_refresh_index = git_config_bool(var, value);
                return 0;
                return 0;
        }
  
 +      if (git_diff_heuristic_config(var, value, cb) < 0)
 +              return -1;
        if (git_color_config(var, value, cb) < 0)
                return -1;
  
@@@ -371,6 -359,7 +376,6 @@@ struct emit_callback 
        const char **label_path;
        struct diff_words_data *diff_words;
        struct diff_options *opt;
 -      int *found_changesp;
        struct strbuf *header;
  };
  
@@@ -738,6 -727,7 +743,6 @@@ static void emit_rewrite_diff(const cha
  
        memset(&ecbdata, 0, sizeof(ecbdata));
        ecbdata.color_diff = want_color(o->use_color);
 -      ecbdata.found_changesp = &o->found_changes;
        ecbdata.ws_rule = whitespace_rule(name_b);
        ecbdata.opt = o;
        if (ecbdata.ws_rule & WS_BLANK_AT_EOF) {
@@@ -1231,13 -1221,12 +1236,13 @@@ static void fn_out_consume(void *priv, 
        struct diff_options *o = ecbdata->opt;
        const char *line_prefix = diff_line_prefix(o);
  
 +      o->found_changes = 1;
 +
        if (ecbdata->header) {
 -              fprintf(ecbdata->opt->file, "%s", ecbdata->header->buf);
 +              fprintf(o->file, "%s", ecbdata->header->buf);
                strbuf_reset(ecbdata->header);
                ecbdata->header = NULL;
        }
 -      *(ecbdata->found_changesp) = 1;
  
        if (ecbdata->label_path[0]) {
                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" : "";
  
 -              fprintf(ecbdata->opt->file, "%s%s--- %s%s%s\n",
 +              fprintf(o->file, "%s%s--- %s%s%s\n",
                        line_prefix, meta, ecbdata->label_path[0], reset, name_a_tab);
 -              fprintf(ecbdata->opt->file, "%s%s+++ %s%s%s\n",
 +              fprintf(o->file, "%s%s+++ %s%s%s\n",
                        line_prefix, meta, ecbdata->label_path[1], reset, name_b_tab);
                ecbdata->label_path[0] = ecbdata->label_path[1] = NULL;
        }
                find_lno(line, ecbdata);
                emit_hunk_header(ecbdata, line, len);
                if (line[len-1] != '\n')
 -                      putc('\n', ecbdata->opt->file);
 -              return;
 -      }
 -
 -      if (len < 1) {
 -              emit_line(ecbdata->opt, reset, reset, line, len);
 -              if (ecbdata->diff_words
 -                  && ecbdata->diff_words->type == DIFF_WORDS_PORCELAIN)
 -                      fputs("~\n", ecbdata->opt->file);
 +                      putc('\n', o->file);
                return;
        }
  
                }
                diff_words_flush(ecbdata);
                if (ecbdata->diff_words->type == DIFF_WORDS_PORCELAIN) {
 -                      emit_line(ecbdata->opt, context, reset, line, len);
 -                      fputs("~\n", ecbdata->opt->file);
 +                      emit_line(o, context, reset, line, len);
 +                      fputs("~\n", o->file);
                } else {
                        /*
                         * Skip the prefix character, if any.  With
                              line++;
                              len--;
                        }
 -                      emit_line(ecbdata->opt, context, reset, line, len);
 +                      emit_line(o, context, reset, line, len);
                }
                return;
        }
        default:
                /* incomplete line at the end */
                ecbdata->lno_in_preimage++;
 -              emit_line(ecbdata->opt,
 -                        diff_get_color(ecbdata->color_diff, DIFF_CONTEXT),
 +              emit_line(o, diff_get_color(ecbdata->color_diff, DIFF_CONTEXT),
                          reset, line, len);
                break;
        }
@@@ -1632,7 -1630,7 +1637,7 @@@ static void show_stats(struct diffstat_
         */
  
        if (options->stat_width == -1)
 -              width = term_columns() - options->output_prefix_length;
 +              width = term_columns() - strlen(line_prefix);
        else
                width = options->stat_width ? options->stat_width : 80;
        number_width = decimal_width(max_change) > number_width ?
@@@ -2306,37 -2304,17 +2311,37 @@@ static void builtin_diff(const char *na
        struct strbuf header = STRBUF_INIT;
        const char *line_prefix = diff_line_prefix(o);
  
 -      if (DIFF_OPT_TST(o, SUBMODULE_LOG) &&
 -                      (!one->mode || S_ISGITLINK(one->mode)) &&
 -                      (!two->mode || S_ISGITLINK(two->mode))) {
 +      diff_set_mnemonic_prefix(o, "a/", "b/");
 +      if (DIFF_OPT_TST(o, REVERSE_DIFF)) {
 +              a_prefix = o->b_prefix;
 +              b_prefix = o->a_prefix;
 +      } else {
 +              a_prefix = o->a_prefix;
 +              b_prefix = o->b_prefix;
 +      }
 +
 +      if (o->submodule_format == DIFF_SUBMODULE_LOG &&
 +          (!one->mode || S_ISGITLINK(one->mode)) &&
 +          (!two->mode || S_ISGITLINK(two->mode))) {
                const char *del = diff_get_color_opt(o, DIFF_FILE_OLD);
                const char *add = diff_get_color_opt(o, DIFF_FILE_NEW);
                show_submodule_summary(o->file, one->path ? one->path : two->path,
                                line_prefix,
 -                              one->oid.hash, two->oid.hash,
 +                              &one->oid, &two->oid,
                                two->dirty_submodule,
                                meta, del, add, reset);
                return;
 +      } else if (o->submodule_format == DIFF_SUBMODULE_INLINE_DIFF &&
 +                 (!one->mode || S_ISGITLINK(one->mode)) &&
 +                 (!two->mode || S_ISGITLINK(two->mode))) {
 +              const char *del = diff_get_color_opt(o, DIFF_FILE_OLD);
 +              const char *add = diff_get_color_opt(o, DIFF_FILE_NEW);
 +              show_submodule_inline_diff(o->file, one->path ? one->path : two->path,
 +                              line_prefix,
 +                              &one->oid, &two->oid,
 +                              two->dirty_submodule,
 +                              meta, del, add, reset, o);
 +              return;
        }
  
        if (DIFF_OPT_TST(o, ALLOW_TEXTCONV)) {
                textconv_two = get_textconv(two);
        }
  
 -      diff_set_mnemonic_prefix(o, "a/", "b/");
 -      if (DIFF_OPT_TST(o, REVERSE_DIFF)) {
 -              a_prefix = o->b_prefix;
 -              b_prefix = o->a_prefix;
 -      } else {
 -              a_prefix = o->a_prefix;
 -              b_prefix = o->b_prefix;
 -      }
 -
        /* Never use a non-valid filename anywhere if at all possible */
        name_a = DIFF_FILE_VALID(one) ? name_a : name_b;
        name_b = DIFF_FILE_VALID(two) ? name_b : name_a;
                memset(&ecbdata, 0, sizeof(ecbdata));
                ecbdata.label_path = lbl;
                ecbdata.color_diff = want_color(o->use_color);
 -              ecbdata.found_changesp = &o->found_changes;
                ecbdata.ws_rule = whitespace_rule(name_b);
                if (ecbdata.ws_rule & WS_BLANK_AT_EOF)
                        check_blank_at_eof(&mf1, &mf2, &ecbdata);
@@@ -2717,7 -2705,7 +2722,7 @@@ static int reuse_worktree_file(const ch
         * This is not the sha1 we are looking for, or
         * unreusable because it is not a regular file.
         */
 -      if (hashcmp(sha1, ce->sha1) || !S_ISREG(ce->ce_mode))
 +      if (hashcmp(sha1, ce->oid.hash) || !S_ISREG(ce->ce_mode))
                return 0;
  
        /*
@@@ -3310,9 -3298,7 +3315,9 @@@ void diff_setup(struct diff_options *op
        options->use_color = diff_use_color_default;
        options->detect_rename = diff_detect_rename_default;
        options->xdl_opts |= diff_algorithm;
 -      if (diff_compaction_heuristic)
 +      if (diff_indent_heuristic)
 +              DIFF_XDL_SET(options, INDENT_HEURISTIC);
 +      else if (diff_compaction_heuristic)
                DIFF_XDL_SET(options, COMPACTION_HEURISTIC);
  
        options->orderfile = diff_order_file_cfg;
@@@ -3341,7 -3327,7 +3346,7 @@@ void diff_setup_done(struct diff_option
        if (options->output_format & DIFF_FORMAT_NO_OUTPUT)
                count++;
        if (count > 1)
-               die("--name-only, --name-status, --check and -s are mutually exclusive");
+               die(_("--name-only, --name-status, --check and -s are mutually exclusive"));
  
        /*
         * Most of the time we can say "there are changes"
@@@ -3537,7 -3523,7 +3542,7 @@@ static int stat_opt(struct diff_option
                        if (*arg == '=')
                                width = strtoul(arg + 1, &end, 10);
                        else if (!*arg && !av[1])
-                               die("Option '--stat-width' requires a value");
+                               die_want_option("--stat-width");
                        else if (!*arg) {
                                width = strtoul(av[1], &end, 10);
                                argcount = 2;
                        if (*arg == '=')
                                name_width = strtoul(arg + 1, &end, 10);
                        else if (!*arg && !av[1])
-                               die("Option '--stat-name-width' requires a value");
+                               die_want_option("--stat-name-width");
                        else if (!*arg) {
                                name_width = strtoul(av[1], &end, 10);
                                argcount = 2;
                        if (*arg == '=')
                                graph_width = strtoul(arg + 1, &end, 10);
                        else if (!*arg && !av[1])
-                               die("Option '--stat-graph-width' requires a value");
+                               die_want_option("--stat-graph-width");
                        else if (!*arg) {
                                graph_width = strtoul(av[1], &end, 10);
                                argcount = 2;
                        if (*arg == '=')
                                count = strtoul(arg + 1, &end, 10);
                        else if (!*arg && !av[1])
-                               die("Option '--stat-count' requires a value");
+                               die_want_option("--stat-count");
                        else if (!*arg) {
                                count = strtoul(av[1], &end, 10);
                                argcount = 2;
@@@ -3834,15 -3820,9 +3839,15 @@@ int diff_opt_parse(struct diff_options 
                DIFF_XDL_SET(options, IGNORE_WHITESPACE_AT_EOL);
        else if (!strcmp(arg, "--ignore-blank-lines"))
                DIFF_XDL_SET(options, IGNORE_BLANK_LINES);
 -      else if (!strcmp(arg, "--compaction-heuristic"))
 +      else if (!strcmp(arg, "--indent-heuristic")) {
 +              DIFF_XDL_SET(options, INDENT_HEURISTIC);
 +              DIFF_XDL_CLR(options, COMPACTION_HEURISTIC);
 +      } else if (!strcmp(arg, "--no-indent-heuristic"))
 +              DIFF_XDL_CLR(options, INDENT_HEURISTIC);
 +      else if (!strcmp(arg, "--compaction-heuristic")) {
                DIFF_XDL_SET(options, COMPACTION_HEURISTIC);
 -      else if (!strcmp(arg, "--no-compaction-heuristic"))
 +              DIFF_XDL_CLR(options, INDENT_HEURISTIC);
 +      } else if (!strcmp(arg, "--no-compaction-heuristic"))
                DIFF_XDL_CLR(options, COMPACTION_HEURISTIC);
        else if (!strcmp(arg, "--patience"))
                options->xdl_opts = DIFF_WITH_ALG(options, PATIENCE_DIFF);
                DIFF_OPT_SET(options, OVERRIDE_SUBMODULE_CONFIG);
                handle_ignore_submodules_arg(options, arg);
        } else if (!strcmp(arg, "--submodule"))
 -              DIFF_OPT_SET(options, SUBMODULE_LOG);
 +              options->submodule_format = DIFF_SUBMODULE_LOG;
        else if (skip_prefix(arg, "--submodule=", &arg))
                return parse_submodule_opt(options, arg);
        else if (skip_prefix(arg, "--ws-error-highlight=", &arg))
                options->a_prefix = optarg;
                return argcount;
        }
 +      else if ((argcount = parse_long_opt("line-prefix", av, &optarg))) {
 +              options->line_prefix = optarg;
 +              options->line_prefix_length = strlen(options->line_prefix);
 +              graph_setup_line_prefix(options);
 +              return argcount;
 +      }
        else if ((argcount = parse_long_opt("dst-prefix", av, &optarg))) {
                options->b_prefix = optarg;
                return argcount;
diff --combined notes-merge.c
index b3536284c4954be3f24f9c68e4d52c42ec29eed1,3bbeb863f8f658dae8fbac37d60366d9588420df..5998605acc64471193dc9d945610db8491f34bd8
@@@ -12,7 -12,7 +12,7 @@@
  #include "notes-utils.h"
  
  struct notes_merge_pair {
 -      unsigned char obj[20], base[20], local[20], remote[20];
 +      struct object_id obj, base, local, remote;
  };
  
  void init_notes_merge_options(struct notes_merge_options *o)
@@@ -75,7 -75,7 +75,7 @@@ static struct notes_merge_pair *find_no
        int i = last_index < len ? last_index : len - 1;
        int prev_cmp = 0, cmp = -1;
        while (i >= 0 && i < len) {
 -              cmp = hashcmp(obj, list[i].obj);
 +              cmp = hashcmp(obj, list[i].obj.hash);
                if (!cmp) /* obj belongs @ i */
                        break;
                else if (cmp < 0 && prev_cmp <= 0) /* obj belongs < i */
        return list + i;
  }
  
 -static unsigned char uninitialized[20] =
 +static struct object_id uninitialized = {
        "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" \
 -      "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff";
 +      "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"
 +};
  
  static struct notes_merge_pair *diff_tree_remote(struct notes_merge_options *o,
                                                 const unsigned char *base,
                mp = find_notes_merge_pair_pos(changes, len, obj, 1, &occupied);
                if (occupied) {
                        /* We've found an addition/deletion pair */
 -                      assert(!hashcmp(mp->obj, obj));
 +                      assert(!hashcmp(mp->obj.hash, obj));
                        if (is_null_oid(&p->one->oid)) { /* addition */
 -                              assert(is_null_sha1(mp->remote));
 -                              hashcpy(mp->remote, p->two->oid.hash);
 +                              assert(is_null_oid(&mp->remote));
 +                              oidcpy(&mp->remote, &p->two->oid);
                        } else if (is_null_oid(&p->two->oid)) { /* deletion */
 -                              assert(is_null_sha1(mp->base));
 -                              hashcpy(mp->base, p->one->oid.hash);
 +                              assert(is_null_oid(&mp->base));
 +                              oidcpy(&mp->base, &p->one->oid);
                        } else
                                assert(!"Invalid existing change recorded");
                } else {
 -                      hashcpy(mp->obj, obj);
 -                      hashcpy(mp->base, p->one->oid.hash);
 -                      hashcpy(mp->local, uninitialized);
 -                      hashcpy(mp->remote, p->two->oid.hash);
 +                      hashcpy(mp->obj.hash, obj);
 +                      oidcpy(&mp->base, &p->one->oid);
 +                      oidcpy(&mp->local, &uninitialized);
 +                      oidcpy(&mp->remote, &p->two->oid);
                        len++;
                }
                trace_printf("\t\tStored remote change for %s: %.7s -> %.7s\n",
 -                     sha1_to_hex(mp->obj), sha1_to_hex(mp->base),
 -                     sha1_to_hex(mp->remote));
 +                     oid_to_hex(&mp->obj), oid_to_hex(&mp->base),
 +                     oid_to_hex(&mp->remote));
        }
        diff_flush(&opt);
        clear_pathspec(&opt.pathspec);
@@@ -217,7 -216,7 +217,7 @@@ static void diff_tree_local(struct note
                        continue;
                }
  
 -              assert(!hashcmp(mp->obj, obj));
 +              assert(!hashcmp(mp->obj.hash, obj));
                if (is_null_oid(&p->two->oid)) { /* deletion */
                        /*
                         * Either this is a true deletion (1), or it is part
                         * (3) mp->local is uninitialized; set it to null_sha1
                         *     (will be overwritten by following addition)
                         */
 -                      if (!hashcmp(mp->local, uninitialized))
 -                              hashclr(mp->local);
 +                      if (!oidcmp(&mp->local, &uninitialized))
 +                              oidclr(&mp->local);
                } else if (is_null_oid(&p->one->oid)) { /* addition */
                        /*
                         * Either this is a true addition (1), or it is part
                         * (2) mp->local is uninitialized; set to p->two->sha1
                         * (3) mp->local is null_sha1;     set to p->two->sha1
                         */
 -                      assert(is_null_sha1(mp->local) ||
 -                             !hashcmp(mp->local, uninitialized));
 -                      hashcpy(mp->local, p->two->oid.hash);
 +                      assert(is_null_oid(&mp->local) ||
 +                             !oidcmp(&mp->local, &uninitialized));
 +                      oidcpy(&mp->local, &p->two->oid);
                } else { /* modification */
                        /*
                         * This is a true modification. p->one->sha1 shall
                         * match mp->base, and mp->local shall be uninitialized.
                         * Set mp->local to p->two->sha1.
                         */
 -                      assert(!hashcmp(p->one->oid.hash, mp->base));
 -                      assert(!hashcmp(mp->local, uninitialized));
 -                      hashcpy(mp->local, p->two->oid.hash);
 +                      assert(!oidcmp(&p->one->oid, &mp->base));
 +                      assert(!oidcmp(&mp->local, &uninitialized));
 +                      oidcpy(&mp->local, &p->two->oid);
                }
                trace_printf("\t\tStored local change for %s: %.7s -> %.7s\n",
 -                     sha1_to_hex(mp->obj), sha1_to_hex(mp->base),
 -                     sha1_to_hex(mp->local));
 +                     oid_to_hex(&mp->obj), oid_to_hex(&mp->base),
 +                     oid_to_hex(&mp->local));
        }
        diff_flush(&opt);
        clear_pathspec(&opt.pathspec);
@@@ -270,15 -269,15 +270,15 @@@ static void check_notes_merge_worktree(
                if (file_exists(git_path(NOTES_MERGE_WORKTREE)) &&
                    !is_empty_dir(git_path(NOTES_MERGE_WORKTREE))) {
                        if (advice_resolve_conflict)
-                               die("You have not concluded your previous "
+                               die(_("You have not concluded your previous "
                                    "notes merge (%s exists).\nPlease, use "
                                    "'git notes merge --commit' or 'git notes "
                                    "merge --abort' to commit/abort the "
                                    "previous merge before you start a new "
-                                   "notes merge.", git_path("NOTES_MERGE_*"));
+                                   "notes merge."), git_path("NOTES_MERGE_*"));
                        else
-                               die("You have not concluded your notes merge "
-                                   "(%s exists).", git_path("NOTES_MERGE_*"));
+                               die(_("You have not concluded your notes merge "
+                                   "(%s exists)."), git_path("NOTES_MERGE_*"));
                }
  
                if (safe_create_leading_directories_const(git_path(
@@@ -344,11 -343,11 +344,11 @@@ static int ll_merge_in_worktree(struct 
        mmfile_t base, local, remote;
        int status;
  
 -      read_mmblob(&base, p->base);
 -      read_mmblob(&local, p->local);
 -      read_mmblob(&remote, p->remote);
 +      read_mmblob(&base, &p->base);
 +      read_mmblob(&local, &p->local);
 +      read_mmblob(&remote, &p->remote);
  
 -      status = ll_merge(&result_buf, sha1_to_hex(p->obj), &base, NULL,
 +      status = ll_merge(&result_buf, oid_to_hex(&p->obj), &base, NULL,
                          &local, o->local_ref, &remote, o->remote_ref, NULL);
  
        free(base.ptr);
        if ((status < 0) || !result_buf.ptr)
                die("Failed to execute internal merge");
  
 -      write_buf_to_worktree(p->obj, result_buf.ptr, result_buf.size);
 +      write_buf_to_worktree(p->obj.hash, result_buf.ptr, result_buf.size);
        free(result_buf.ptr);
  
        return status;
@@@ -373,52 -372,51 +373,52 @@@ static int merge_one_change_manual(stru
  
        trace_printf("\t\t\tmerge_one_change_manual(obj = %.7s, base = %.7s, "
               "local = %.7s, remote = %.7s)\n",
 -             sha1_to_hex(p->obj), sha1_to_hex(p->base),
 -             sha1_to_hex(p->local), sha1_to_hex(p->remote));
 +             oid_to_hex(&p->obj), oid_to_hex(&p->base),
 +             oid_to_hex(&p->local), oid_to_hex(&p->remote));
  
        /* add "Conflicts:" section to commit message first time through */
        if (!o->has_worktree)
                strbuf_addstr(&(o->commit_msg), "\n\nConflicts:\n");
  
 -      strbuf_addf(&(o->commit_msg), "\t%s\n", sha1_to_hex(p->obj));
 +      strbuf_addf(&(o->commit_msg), "\t%s\n", oid_to_hex(&p->obj));
  
        if (o->verbosity >= 2)
 -              printf("Auto-merging notes for %s\n", sha1_to_hex(p->obj));
 +              printf("Auto-merging notes for %s\n", oid_to_hex(&p->obj));
        check_notes_merge_worktree(o);
 -      if (is_null_sha1(p->local)) {
 +      if (is_null_oid(&p->local)) {
                /* D/F conflict, checkout p->remote */
 -              assert(!is_null_sha1(p->remote));
 +              assert(!is_null_oid(&p->remote));
                if (o->verbosity >= 1)
                        printf("CONFLICT (delete/modify): Notes for object %s "
                                "deleted in %s and modified in %s. Version from %s "
                                "left in tree.\n",
 -                              sha1_to_hex(p->obj), lref, rref, rref);
 -              write_note_to_worktree(p->obj, p->remote);
 -      } else if (is_null_sha1(p->remote)) {
 +                              oid_to_hex(&p->obj), lref, rref, rref);
 +              write_note_to_worktree(p->obj.hash, p->remote.hash);
 +      } else if (is_null_oid(&p->remote)) {
                /* D/F conflict, checkout p->local */
 -              assert(!is_null_sha1(p->local));
 +              assert(!is_null_oid(&p->local));
                if (o->verbosity >= 1)
                        printf("CONFLICT (delete/modify): Notes for object %s "
                                "deleted in %s and modified in %s. Version from %s "
                                "left in tree.\n",
 -                              sha1_to_hex(p->obj), rref, lref, lref);
 -              write_note_to_worktree(p->obj, p->local);
 +                              oid_to_hex(&p->obj), rref, lref, lref);
 +              write_note_to_worktree(p->obj.hash, p->local.hash);
        } else {
                /* "regular" conflict, checkout result of ll_merge() */
                const char *reason = "content";
 -              if (is_null_sha1(p->base))
 +              if (is_null_oid(&p->base))
                        reason = "add/add";
 -              assert(!is_null_sha1(p->local));
 -              assert(!is_null_sha1(p->remote));
 +              assert(!is_null_oid(&p->local));
 +              assert(!is_null_oid(&p->remote));
                if (o->verbosity >= 1)
                        printf("CONFLICT (%s): Merge conflict in notes for "
 -                              "object %s\n", reason, sha1_to_hex(p->obj));
 +                              "object %s\n", reason,
 +                              oid_to_hex(&p->obj));
                ll_merge_in_worktree(o, p);
        }
  
        trace_printf("\t\t\tremoving from partial merge result\n");
 -      remove_note(t, p->obj);
 +      remove_note(t, p->obj.hash);
  
        return 1;
  }
@@@ -437,29 -435,29 +437,29 @@@ static int merge_one_change(struct note
        case NOTES_MERGE_RESOLVE_OURS:
                if (o->verbosity >= 2)
                        printf("Using local notes for %s\n",
 -                                              sha1_to_hex(p->obj));
 +                                              oid_to_hex(&p->obj));
                /* nothing to do */
                return 0;
        case NOTES_MERGE_RESOLVE_THEIRS:
                if (o->verbosity >= 2)
                        printf("Using remote notes for %s\n",
 -                                              sha1_to_hex(p->obj));
 -              if (add_note(t, p->obj, p->remote, combine_notes_overwrite))
 +                                              oid_to_hex(&p->obj));
 +              if (add_note(t, p->obj.hash, p->remote.hash, combine_notes_overwrite))
                        die("BUG: combine_notes_overwrite failed");
                return 0;
        case NOTES_MERGE_RESOLVE_UNION:
                if (o->verbosity >= 2)
                        printf("Concatenating local and remote notes for %s\n",
 -                                                      sha1_to_hex(p->obj));
 -              if (add_note(t, p->obj, p->remote, combine_notes_concatenate))
 +                                                      oid_to_hex(&p->obj));
 +              if (add_note(t, p->obj.hash, p->remote.hash, combine_notes_concatenate))
                        die("failed to concatenate notes "
                            "(combine_notes_concatenate)");
                return 0;
        case NOTES_MERGE_RESOLVE_CAT_SORT_UNIQ:
                if (o->verbosity >= 2)
                        printf("Concatenating unique lines in local and remote "
 -                              "notes for %s\n", sha1_to_hex(p->obj));
 -              if (add_note(t, p->obj, p->remote, combine_notes_cat_sort_uniq))
 +                              "notes for %s\n", oid_to_hex(&p->obj));
 +              if (add_note(t, p->obj.hash, p->remote.hash, combine_notes_cat_sort_uniq))
                        die("failed to concatenate notes "
                            "(combine_notes_cat_sort_uniq)");
                return 0;
@@@ -477,21 -475,20 +477,21 @@@ static int merge_changes(struct notes_m
        for (i = 0; i < *num_changes; i++) {
                struct notes_merge_pair *p = changes + i;
                trace_printf("\t\t%.7s: %.7s -> %.7s/%.7s\n",
 -                     sha1_to_hex(p->obj), sha1_to_hex(p->base),
 -                     sha1_to_hex(p->local), sha1_to_hex(p->remote));
 +                     oid_to_hex(&p->obj), oid_to_hex(&p->base),
 +                     oid_to_hex(&p->local),
 +                     oid_to_hex(&p->remote));
  
 -              if (!hashcmp(p->base, p->remote)) {
 +              if (!oidcmp(&p->base, &p->remote)) {
                        /* no remote change; nothing to do */
                        trace_printf("\t\t\tskipping (no remote change)\n");
 -              } else if (!hashcmp(p->local, p->remote)) {
 +              } else if (!oidcmp(&p->local, &p->remote)) {
                        /* same change in local and remote; nothing to do */
                        trace_printf("\t\t\tskipping (local == remote)\n");
 -              } else if (!hashcmp(p->local, uninitialized) ||
 -                         !hashcmp(p->local, p->base)) {
 +              } else if (!oidcmp(&p->local, &uninitialized) ||
 +                         !oidcmp(&p->local, &p->base)) {
                        /* no local change; adopt remote change */
                        trace_printf("\t\t\tno local change, adopted remote\n");
 -                      if (add_note(t, p->obj, p->remote,
 +                      if (add_note(t, p->obj.hash, p->remote.hash,
                                     combine_notes_overwrite))
                                die("BUG: combine_notes_overwrite failed");
                } else {
diff --combined t/t5512-ls-remote.sh
index befdfeefc603e42ad1ce69599fd1b1142917a8d7,c23434ba297ed7b05d329186590bb840887eb1c1..55fc83fc0624fa9bf1a024c4bc4aede25999fae0
@@@ -99,7 -99,7 +99,7 @@@ test_expect_success 'confuses pattern a
        # We could just as easily have used "master"; the "*" emphasizes its
        # role as a pattern.
        test_must_fail git ls-remote refs*master >actual 2>&1 &&
-       test_cmp exp actual
+       test_i18ncmp exp actual
  '
  
  test_expect_success 'die with non-2 for wrong repository even with --exit-code' '
@@@ -207,45 -207,5 +207,45 @@@ test_expect_success 'ls-remote --symre
        test_cmp expect actual
  '
  
 +test_lazy_prereq GIT_DAEMON '
 +      test_tristate GIT_TEST_GIT_DAEMON &&
 +      test "$GIT_TEST_GIT_DAEMON" != false
 +'
 +
 +# This test spawns a daemon, so run it only if the user would be OK with
 +# testing with git-daemon.
 +test_expect_success PIPE,JGIT,GIT_DAEMON 'indicate no refs in standards-compliant empty remote' '
 +      JGIT_DAEMON_PORT=${JGIT_DAEMON_PORT-${this_test#t}} &&
 +      JGIT_DAEMON_PID= &&
 +      git init --bare empty.git &&
 +      >empty.git/git-daemon-export-ok &&
 +      mkfifo jgit_daemon_output &&
 +      {
 +              jgit daemon --port="$JGIT_DAEMON_PORT" . >jgit_daemon_output &
 +              JGIT_DAEMON_PID=$!
 +      } &&
 +      test_when_finished kill "$JGIT_DAEMON_PID" &&
 +      {
 +              read line &&
 +              case $line in
 +              Exporting*)
 +                      ;;
 +              *)
 +                      echo "Expected: Exporting" &&
 +                      false;;
 +              esac &&
 +              read line &&
 +              case $line in
 +              "Listening on"*)
 +                      ;;
 +              *)
 +                      echo "Expected: Listening on" &&
 +                      false;;
 +              esac
 +      } <jgit_daemon_output &&
 +      # --exit-code asks the command to exit with 2 when no
 +      # matching refs are found.
 +      test_expect_code 2 git ls-remote --exit-code git://localhost:$JGIT_DAEMON_PORT/empty.git
 +'
  
  test_done