Merge branch 'va/i18n-misc-updates'
authorJunio C Hamano <gitster@pobox.com>
Tue, 17 May 2016 21:38:22 +0000 (14:38 -0700)
committerJunio C Hamano <gitster@pobox.com>
Tue, 17 May 2016 21:38:23 +0000 (14:38 -0700)
Mark several messages for translation.

* va/i18n-misc-updates:
i18n: unpack-trees: avoid substituting only a verb in sentences
i18n: builtin/pull.c: split strings marked for translation
i18n: builtin/pull.c: mark placeholders for translation
i18n: git-parse-remote.sh: mark strings for translation
i18n: branch: move comment for translators
i18n: branch: unmark string for translation
i18n: builtin/rm.c: remove a comma ',' from string
i18n: unpack-trees: mark strings for translation
i18n: builtin/branch.c: mark option for translation
i18n: index-pack: use plural string instead of normal one

1  2 
Makefile
builtin/branch.c
builtin/index-pack.c
builtin/pull.c
unpack-trees.c
diff --combined Makefile
index 3f03366bcdbec1979709a05fa6aef2b2565514e7,2249baba1d96636d9f14459b0fd25b32bea6ef01..bc3d41ebf34ec0deec8576757491d663afe22ca6
+++ b/Makefile
@@@ -355,6 -355,9 +355,6 @@@ all:
  #
  # Define HAVE_CLOCK_MONOTONIC if your platform has CLOCK_MONOTONIC in librt.
  #
 -# Define NO_HMAC_CTX_CLEANUP if your OpenSSL is version 0.9.6b or earlier to
 -# cleanup the HMAC context with the older HMAC_cleanup function.
 -#
  # Define USE_PARENS_AROUND_GETTEXT_N to "yes" if your compiler happily
  # compiles the following initialization:
  #
@@@ -440,6 -443,7 +440,6 @@@ DIFF = dif
  TAR = tar
  FIND = find
  INSTALL = install
 -RPMBUILD = rpmbuild
  TCL_PATH = tclsh
  TCLTK_PATH = wish
  XGETTEXT = xgettext
@@@ -620,7 -624,7 +620,7 @@@ TEST_PROGRAMS_NEED_X += test-svn-f
  TEST_PROGRAMS_NEED_X += test-urlmatch-normalization
  TEST_PROGRAMS_NEED_X += test-wildmatch
  
 -TEST_PROGRAMS = $(patsubst %,%$X,$(TEST_PROGRAMS_NEED_X))
 +TEST_PROGRAMS = $(patsubst %,t/helper/%$X,$(TEST_PROGRAMS_NEED_X))
  
  # List built-in command $C whose implementation cmd_$C() is not in
  # builtin/$C.o but is linked in as part of some other command.
@@@ -1134,6 -1138,9 +1134,6 @@@ ifndef NO_OPENSS
        ifdef NEEDS_CRYPTO_WITH_SSL
                OPENSSL_LIBSSL += -lcrypto
        endif
 -      ifdef NO_HMAC_CTX_CLEANUP
 -              BASIC_CFLAGS += -DNO_HMAC_CTX_CLEANUP
 -      endif
  else
        BASIC_CFLAGS += -DNO_OPENSSL
        BLK_SHA1 = 1
@@@ -1897,7 -1904,7 +1897,7 @@@ VCSSVN_OBJS += vcs-svn/fast_export.
  VCSSVN_OBJS += vcs-svn/svndiff.o
  VCSSVN_OBJS += vcs-svn/svndump.o
  
 -TEST_OBJS := $(patsubst test-%$X,test-%.o,$(TEST_PROGRAMS))
 +TEST_OBJS := $(patsubst %$X,%.o,$(TEST_PROGRAMS))
  OBJECTS := $(LIB_OBJS) $(BUILTIN_OBJS) $(PROGRAM_OBJS) $(TEST_OBJS) \
        $(XDIFF_OBJS) \
        $(VCSSVN_OBJS) \
@@@ -2062,7 -2069,7 +2062,7 @@@ XGETTEXT_FLAGS_SH = $(XGETTEXT_FLAGS) -
        --keyword=gettextln --keyword=eval_gettextln
  XGETTEXT_FLAGS_PERL = $(XGETTEXT_FLAGS) --keyword=__ --language=Perl
  LOCALIZED_C = $(C_OBJ:o=c) $(LIB_H) $(GENERATED_H)
- LOCALIZED_SH = $(SCRIPT_SH)
+ LOCALIZED_SH = $(SCRIPT_SH) git-parse-remote.sh
  LOCALIZED_PERL = $(SCRIPT_PERL)
  
  ifdef XGETTEXT_INCLUDE_TESTS
@@@ -2204,7 -2211,7 +2204,7 @@@ bin-wrappers/%: wrap-for-bin.s
        @mkdir -p bin-wrappers
        $(QUIET_GEN)sed -e '1s|#!.*/sh|#!$(SHELL_PATH_SQ)|' \
             -e 's|@@BUILD_DIR@@|$(shell pwd)|' \
 -           -e 's|@@PROG@@|$(@F)|' < $< > $@ && \
 +           -e 's|@@PROG@@|$(patsubst test-%,t/helper/test-%,$(@F))|' < $< > $@ && \
        chmod +x $@
  
  # GNU make supports exporting all variables by "export" without parameters.
@@@ -2224,25 -2231,25 +2224,25 @@@ perf: al
  
  .PHONY: test perf
  
 -test-ctype$X: ctype.o
 +t/helper/test-ctype$X: ctype.o
  
 -test-date$X: date.o ctype.o
 +t/helper/test-date$X: date.o ctype.o
  
 -test-delta$X: diff-delta.o patch-delta.o
 +t/helper/test-delta$X: diff-delta.o patch-delta.o
  
 -test-line-buffer$X: vcs-svn/lib.a
 +t/helper/test-line-buffer$X: vcs-svn/lib.a
  
 -test-parse-options$X: parse-options.o parse-options-cb.o
 +t/helper/test-parse-options$X: parse-options.o parse-options-cb.o
  
 -test-svn-fe$X: vcs-svn/lib.a
 +t/helper/test-svn-fe$X: vcs-svn/lib.a
  
  .PRECIOUS: $(TEST_OBJS)
  
 -test-%$X: test-%.o GIT-LDFLAGS $(GITLIBS)
 +t/helper/test-%$X: t/helper/test-%.o GIT-LDFLAGS $(GITLIBS)
        $(QUIET_LINK)$(CC) $(ALL_CFLAGS) -o $@ $(ALL_LDFLAGS) $(filter %.o,$^) $(filter %.a,$^) $(LIBS)
  
 -check-sha1:: test-sha1$X
 -      ./test-sha1.sh
 +check-sha1:: t/helper/test-sha1$X
 +      t/helper/test-sha1.sh
  
  SP_OBJ = $(patsubst %.o,%.sp,$(C_OBJ))
  
@@@ -2256,10 -2263,10 +2256,10 @@@ sparse: $(SP_OBJ
  check: common-cmds.h
        @if sparse; \
        then \
 -              echo 2>&1 "Use 'make sparse' instead"; \
 +              echo >&2 "Use 'make sparse' instead"; \
                $(MAKE) --no-print-directory sparse; \
        else \
 -              echo 2>&1 "Did you mean 'make test'?"; \
 +              echo >&2 "Did you mean 'make test'?"; \
                exit 1; \
        fi
  
@@@ -2389,25 -2396,31 +2389,25 @@@ quick-install-html
  
  ### Maintainer's dist rules
  
 -git.spec: git.spec.in GIT-VERSION-FILE
 -      sed -e 's/@@VERSION@@/$(GIT_VERSION)/g' < $< > $@+
 -      mv $@+ $@
 -
  GIT_TARNAME = git-$(GIT_VERSION)
 -dist: git.spec git-archive$(X) configure
 +dist: git-archive$(X) configure
        ./git-archive --format=tar \
                --prefix=$(GIT_TARNAME)/ HEAD^{tree} > $(GIT_TARNAME).tar
        @mkdir -p $(GIT_TARNAME)
 -      @cp git.spec configure $(GIT_TARNAME)
 +      @cp configure $(GIT_TARNAME)
        @echo $(GIT_VERSION) > $(GIT_TARNAME)/version
        @$(MAKE) -C git-gui TARDIR=../$(GIT_TARNAME)/git-gui dist-version
        $(TAR) rf $(GIT_TARNAME).tar \
 -              $(GIT_TARNAME)/git.spec \
                $(GIT_TARNAME)/configure \
                $(GIT_TARNAME)/version \
                $(GIT_TARNAME)/git-gui/version
        @$(RM) -r $(GIT_TARNAME)
        gzip -f -9 $(GIT_TARNAME).tar
  
 -rpm: dist
 -      $(RPMBUILD) \
 -              --define "_source_filedigest_algorithm md5" \
 -              --define "_binary_filedigest_algorithm md5" \
 -              -ta $(GIT_TARNAME).tar.gz
 +rpm::
 +      @echo >&2 "Use distro packaged sources to run rpmbuild"
 +      @false
 +.PHONY: rpm
  
  htmldocs = git-htmldocs-$(GIT_VERSION)
  manpages = git-manpages-$(GIT_VERSION)
@@@ -2443,8 -2456,8 +2443,8 @@@ profile-clean
        $(RM) $(addsuffix *.gcno,$(addprefix $(PROFILE_DIR)/, $(object_dirs)))
  
  clean: profile-clean coverage-clean
 -      $(RM) *.o *.res refs/*.o block-sha1/*.o ppc/*.o compat/*.o compat/*/*.o
 -      $(RM) xdiff/*.o vcs-svn/*.o ewah/*.o builtin/*.o
 +      $(RM) *.res
 +      $(RM) $(OBJECTS)
        $(RM) $(LIB_FILE) $(XDIFF_LIB) $(VCSSVN_LIB)
        $(RM) $(ALL_PROGRAMS) $(SCRIPT_LIB) $(BUILT_INS) git$X
        $(RM) $(TEST_PROGRAMS) $(NO_INSTALL)
diff --combined builtin/branch.c
index 0adba629d2ae35a4db74fb9d1450b54bb11e51e3,32be954cee1720f4f6264bbc5696cd17b8789f66..37af77161e4f899f9897db0838f0b736b8450bec
@@@ -20,7 -20,6 +20,7 @@@
  #include "utf8.h"
  #include "wt-status.h"
  #include "ref-filter.h"
 +#include "worktree.h"
  
  static const char * const builtin_branch_usage[] = {
        N_("git branch [<options>] [-r | -a] [--merged | --no-merged]"),
@@@ -216,21 -215,16 +216,21 @@@ static int delete_branches(int argc, co
                int flags = 0;
  
                strbuf_branchname(&bname, argv[i]);
 -              if (kinds == FILTER_REFS_BRANCHES && !strcmp(head, bname.buf)) {
 -                      error(_("Cannot delete the branch '%s' "
 -                            "which you are currently on."), bname.buf);
 -                      ret = 1;
 -                      continue;
 -              }
 -
                free(name);
 -
                name = mkpathdup(fmt, bname.buf);
 +
 +              if (kinds == FILTER_REFS_BRANCHES) {
 +                      char *worktree = find_shared_symref("HEAD", name);
 +                      if (worktree) {
 +                              error(_("Cannot delete branch '%s' "
 +                                      "checked out at '%s'"),
 +                                    bname.buf, worktree);
 +                              free(worktree);
 +                              ret = 1;
 +                              continue;
 +                      }
 +              }
 +
                target = resolve_ref_unsafe(name,
                                            RESOLVE_REF_READING
                                            | RESOLVE_REF_NO_RECURSE
@@@ -375,12 -369,14 +375,14 @@@ static char *get_head_description(void
                strbuf_addf(&desc, _("(no branch, bisect started on %s)"),
                            state.branch);
        else if (state.detached_from) {
-               /* TRANSLATORS: make sure these match _("HEAD detached at ")
-                  and _("HEAD detached from ") in wt-status.c */
                if (state.detached_at)
+                       /* TRANSLATORS: make sure this matches
+                          "HEAD detached at " in wt-status.c */
                        strbuf_addf(&desc, _("(HEAD detached at %s)"),
                                state.detached_from);
                else
+                       /* TRANSLATORS: make sure this matches
+                          "HEAD detached from " in wt-status.c */
                        strbuf_addf(&desc, _("(HEAD detached from %s)"),
                                state.detached_from);
        }
@@@ -399,25 -395,22 +401,25 @@@ static void format_and_print_ref_item(s
        int current = 0;
        int color;
        struct strbuf out = STRBUF_INIT, name = STRBUF_INIT;
 -      const char *prefix = "";
 +      const char *prefix_to_show = "";
 +      const char *prefix_to_skip = NULL;
        const char *desc = item->refname;
        char *to_free = NULL;
  
        switch (item->kind) {
        case FILTER_REFS_BRANCHES:
 -              skip_prefix(desc, "refs/heads/", &desc);
 +              prefix_to_skip = "refs/heads/";
 +              skip_prefix(desc, prefix_to_skip, &desc);
                if (!filter->detached && !strcmp(desc, head))
                        current = 1;
                else
                        color = BRANCH_COLOR_LOCAL;
                break;
        case FILTER_REFS_REMOTES:
 -              skip_prefix(desc, "refs/remotes/", &desc);
 +              prefix_to_skip = "refs/remotes/";
 +              skip_prefix(desc, prefix_to_skip, &desc);
                color = BRANCH_COLOR_REMOTE;
 -              prefix = remote_prefix;
 +              prefix_to_show = remote_prefix;
                break;
        case FILTER_REFS_DETACHED_HEAD:
                desc = to_free = get_head_description();
                color = BRANCH_COLOR_CURRENT;
        }
  
 -      strbuf_addf(&name, "%s%s", prefix, desc);
 +      strbuf_addf(&name, "%s%s", prefix_to_show, desc);
        if (filter->verbose) {
                int utf8_compensation = strlen(name.buf) - utf8_strwidth(name.buf);
                strbuf_addf(&out, "%c %s%-*s%s", c, branch_get_color(color),
                            name.buf, branch_get_color(BRANCH_COLOR_RESET));
  
        if (item->symref) {
 -              skip_prefix(item->symref, "refs/remotes/", &desc);
 -              strbuf_addf(&out, " -> %s", desc);
 +              const char *symref = item->symref;
 +              if (prefix_to_skip)
 +                      skip_prefix(symref, prefix_to_skip, &symref);
 +              strbuf_addf(&out, " -> %s", symref);
        }
        else if (filter->verbose)
                /* " f7c0c00 [ahead 58, behind 197] vcs-svn: drop obj_pool.h" */
@@@ -563,7 -554,8 +565,7 @@@ static void rename_branch(const char *o
        if (recovery)
                warning(_("Renamed a misnamed branch '%s' away"), oldref.buf + 11);
  
 -      /* no need to pass logmsg here as HEAD didn't really move */
 -      if (!strcmp(oldname, head) && create_symref("HEAD", newref.buf, NULL))
 +      if (replace_each_worktree_head_symref(oldref.buf, newref.buf))
                die(_("Branch renamed to %s, but HEAD is not updated!"), newname);
  
        strbuf_addf(&oldsection, "branch.%s", oldref.buf + 11);
@@@ -630,7 -622,7 +632,7 @@@ int cmd_branch(int argc, const char **a
                        BRANCH_TRACK_EXPLICIT),
                OPT_SET_INT( 0, "set-upstream",  &track, N_("change upstream info"),
                        BRANCH_TRACK_OVERRIDE),
-               OPT_STRING('u', "set-upstream-to", &new_upstream, "upstream", "change the upstream info"),
+               OPT_STRING('u', "set-upstream-to", &new_upstream, N_("upstream"), N_("change the upstream info")),
                OPT_BOOL(0, "unset-upstream", &unset_upstream, "Unset the upstream info"),
                OPT__COLOR(&branch_use_color, N_("use colored output")),
                OPT_SET_INT('r', "remotes",     &filter.kind, N_("act on remote-tracking branches"),
                if (argc == 1 && track == BRANCH_TRACK_OVERRIDE &&
                    !branch_existed && remote_tracking) {
                        fprintf(stderr, _("\nIf you wanted to make '%s' track '%s', do this:\n\n"), head, branch->name);
-                       fprintf(stderr, _("    git branch -d %s\n"), branch->name);
-                       fprintf(stderr, _("    git branch --set-upstream-to %s\n"), branch->name);
+                       fprintf(stderr, "    git branch -d %s\n", branch->name);
+                       fprintf(stderr, "    git branch --set-upstream-to %s\n", branch->name);
                }
  
        } else
diff --combined builtin/index-pack.c
index 2d1eb8bb8a433e6bda50e93e3001ae6d43db093f,ec6a530159ba916696cf95acbbfcb089ce90bd7f..e8c71fc1d2e44ef9bd93c37ff714eeefc53664cf
@@@ -1250,7 -1250,9 +1250,9 @@@ static void conclude_pack(int fix_thin_
                       nr_unresolved * sizeof(*objects));
                f = sha1fd(output_fd, curr_pack);
                fix_unresolved_deltas(f);
-               strbuf_addf(&msg, _("completed with %d local objects"),
+               strbuf_addf(&msg, Q_("completed with %d local object",
+                                    "completed with %d local objects",
+                                    nr_objects - nr_objects_initial),
                            nr_objects - nr_objects_initial);
                stop_progress_msg(&progress, msg.buf);
                strbuf_release(&msg);
@@@ -1599,18 -1601,6 +1601,18 @@@ static void show_pack_info(int stat_onl
        }
  }
  
 +static const char *derive_filename(const char *pack_name, const char *suffix,
 +                                 struct strbuf *buf)
 +{
 +      size_t len;
 +      if (!strip_suffix(pack_name, ".pack", &len))
 +              die(_("packfile name '%s' does not end with '.pack'"),
 +                  pack_name);
 +      strbuf_add(buf, pack_name, len);
 +      strbuf_addstr(buf, suffix);
 +      return buf->buf;
 +}
 +
  int cmd_index_pack(int argc, const char **argv, const char *prefix)
  {
        int i, fix_thin_pack = 0, verify = 0, stat_only = 0;
                usage(index_pack_usage);
        if (fix_thin_pack && !from_stdin)
                die(_("--fix-thin cannot be used without --stdin"));
 -      if (!index_name && pack_name) {
 -              size_t len;
 -              if (!strip_suffix(pack_name, ".pack", &len))
 -                      die(_("packfile name '%s' does not end with '.pack'"),
 -                          pack_name);
 -              strbuf_add(&index_name_buf, pack_name, len);
 -              strbuf_addstr(&index_name_buf, ".idx");
 -              index_name = index_name_buf.buf;
 -      }
 -      if (keep_msg && !keep_name && pack_name) {
 -              size_t len;
 -              if (!strip_suffix(pack_name, ".pack", &len))
 -                      die(_("packfile name '%s' does not end with '.pack'"),
 -                          pack_name);
 -              strbuf_add(&keep_name_buf, pack_name, len);
 -              strbuf_addstr(&keep_name_buf, ".idx");
 -              keep_name = keep_name_buf.buf;
 -      }
 +      if (!index_name && pack_name)
 +              index_name = derive_filename(pack_name, ".idx", &index_name_buf);
 +      if (keep_msg && !keep_name && pack_name)
 +              keep_name = derive_filename(pack_name, ".keep", &keep_name_buf);
 +
        if (verify) {
                if (!index_name)
                        die(_("--verify with no packfile name given"));
diff --combined builtin/pull.c
index 596b92fc5699b92bf2e2b9e3f53a6e9925874a66,6214af9b10c213046e13b81fb30cea64abc0e619..1d7333c8a11f7aedf244c99f5ac67bea7fccaab4
@@@ -86,12 -86,9 +86,12 @@@ static char *opt_commit
  static char *opt_edit;
  static char *opt_ff;
  static char *opt_verify_signatures;
 +static int opt_autostash = -1;
 +static int config_autostash;
  static struct argv_array opt_strategies = ARGV_ARRAY_INIT;
  static struct argv_array opt_strategy_opts = ARGV_ARRAY_INIT;
  static char *opt_gpg_sign;
 +static int opt_allow_unrelated_histories;
  
  /* Options passed to git-fetch */
  static char *opt_all;
@@@ -152,8 -149,6 +152,8 @@@ static struct option pull_options[] = 
        OPT_PASSTHRU(0, "verify-signatures", &opt_verify_signatures, NULL,
                N_("verify that the named commit has a valid GPG signature"),
                PARSE_OPT_NOARG),
 +      OPT_BOOL(0, "autostash", &opt_autostash,
 +              N_("automatically stash/stash pop before and after rebase")),
        OPT_PASSTHRU_ARGV('s', "strategy", &opt_strategies, N_("strategy"),
                N_("merge strategy to use"),
                0),
        OPT_PASSTHRU('S', "gpg-sign", &opt_gpg_sign, N_("key-id"),
                N_("GPG sign commit"),
                PARSE_OPT_OPTARG),
 +      OPT_SET_INT(0, "allow-unrelated-histories",
 +                  &opt_allow_unrelated_histories,
 +                  N_("allow merging unrelated histories"), 1),
  
        /* Options passed to git-fetch */
        OPT_GROUP(N_("Options related to fetching")),
@@@ -313,18 -305,6 +313,18 @@@ static enum rebase_type config_get_reba
        return REBASE_FALSE;
  }
  
 +/**
 + * Read config variables.
 + */
 +static int git_pull_config(const char *var, const char *value, void *cb)
 +{
 +      if (!strcmp(var, "rebase.autostash")) {
 +              config_autostash = git_config_bool(var, value);
 +              return 0;
 +      }
 +      return git_default_config(var, value, cb);
 +}
 +
  /**
   * Returns 1 if there are unstaged changes, 0 otherwise.
   */
@@@ -478,13 -458,13 +478,13 @@@ static void NORETURN die_no_merge_candi
                        fprintf_ln(stderr, _("Please specify which branch you want to merge with."));
                fprintf_ln(stderr, _("See git-pull(1) for details."));
                fprintf(stderr, "\n");
-               fprintf_ln(stderr, "    git pull <remote> <branch>");
+               fprintf_ln(stderr, "    git pull %s %s", _("<remote>"), _("<branch>"));
                fprintf(stderr, "\n");
        } else if (!curr_branch->merge_nr) {
                const char *remote_name = NULL;
  
                if (for_each_remote(get_only_remote, &remote_name) || !remote_name)
-                       remote_name = "<remote>";
+                       remote_name = _("<remote>");
  
                fprintf_ln(stderr, _("There is no tracking information for the current branch."));
                if (opt_rebase)
                        fprintf_ln(stderr, _("Please specify which branch you want to merge with."));
                fprintf_ln(stderr, _("See git-pull(1) for details."));
                fprintf(stderr, "\n");
-               fprintf_ln(stderr, "    git pull <remote> <branch>");
+               fprintf_ln(stderr, "    git pull %s %s", _("<remote>"), _("<branch>"));
                fprintf(stderr, "\n");
-               fprintf_ln(stderr, _("If you wish to set tracking information for this branch you can do so with:\n"
-                               "\n"
-                               "    git branch --set-upstream-to=%s/<branch> %s\n"),
-                               remote_name, curr_branch->name);
+               fprintf_ln(stderr, _("If you wish to set tracking information for this branch you can do so with:"));
+               fprintf(stderr, "\n");
+               fprintf_ln(stderr, "    git branch --set-upstream-to=%s/%s %s\n",
+                               remote_name, _("<branch>"), curr_branch->name);
        } else
                fprintf_ln(stderr, _("Your configuration specifies to merge with the ref '%s'\n"
                        "from the remote, but no such ref was fetched."),
@@@ -632,8 -612,6 +632,8 @@@ static int run_merge(void
        argv_array_pushv(&args, opt_strategy_opts.argv);
        if (opt_gpg_sign)
                argv_array_push(&args, opt_gpg_sign);
 +      if (opt_allow_unrelated_histories > 0)
 +              argv_array_push(&args, "--allow-unrelated-histories");
  
        argv_array_push(&args, "FETCH_HEAD");
        ret = run_command_v_opt(args.argv, RUN_GIT_CMD);
@@@ -811,10 -789,6 +811,10 @@@ static int run_rebase(const unsigned ch
        argv_array_pushv(&args, opt_strategy_opts.argv);
        if (opt_gpg_sign)
                argv_array_push(&args, opt_gpg_sign);
 +      if (opt_autostash == 0)
 +              argv_array_push(&args, "--no-autostash");
 +      else if (opt_autostash == 1)
 +              argv_array_push(&args, "--autostash");
  
        argv_array_push(&args, "--onto");
        argv_array_push(&args, sha1_to_hex(merge_head));
@@@ -849,7 -823,7 +849,7 @@@ int cmd_pull(int argc, const char **arg
        if (opt_rebase < 0)
                opt_rebase = config_get_rebase();
  
 -      git_config(git_default_config, NULL);
 +      git_config(git_pull_config, NULL);
  
        if (read_cache_unmerged())
                die_resolve_conflict("Pull");
        if (get_sha1("HEAD", orig_head))
                hashclr(orig_head);
  
 +      if (!opt_rebase && opt_autostash != -1)
 +              die(_("--[no-]autostash option is only valid with --rebase."));
 +
        if (opt_rebase) {
 -              int autostash = 0;
 +              int autostash = config_autostash;
 +              if (opt_autostash != -1)
 +                      autostash = opt_autostash;
  
                if (is_null_sha1(orig_head) && !is_cache_unborn())
                        die(_("Updating an unborn branch with changes added to the index."));
  
 -              git_config_get_bool("rebase.autostash", &autostash);
                if (!autostash)
                        die_on_unclean_work_tree(prefix);
  
diff --combined unpack-trees.c
index 11308e9e5b72c05b2713fb5abec9fc5dae02815e,aea9aa749f2904739b72fef285f148b8b2aa83a8..e81024bb9e43d67ecd126359f511e642bf89c11b
@@@ -58,40 -58,74 +58,74 @@@ void setup_unpack_trees_porcelain(struc
        int i;
        const char **msgs = opts->msgs;
        const char *msg;
-       const char *cmd2 = strcmp(cmd, "checkout") ? cmd : "switch branches";
  
-       if (advice_commit_before_merge)
-               msg = "Your local changes to the following files would be overwritten by %s:\n%%s"
-                       "Please, commit your changes or stash them before you can %s.";
+       if (!strcmp(cmd, "checkout"))
+               msg = advice_commit_before_merge
+                     ? _("Your local changes to the following files would be overwritten by checkout:\n%%s"
+                         "Please commit your changes or stash them before you can switch branches.")
+                     : _("Your local changes to the following files would be overwritten by checkout:\n%%s");
+       else if (!strcmp(cmd, "merge"))
+               msg = advice_commit_before_merge
+                     ? _("Your local changes to the following files would be overwritten by merge:\n%%s"
+                         "Please commit your changes or stash them before you can merge.")
+                     : _("Your local changes to the following files would be overwritten by merge:\n%%s");
        else
-               msg = "Your local changes to the following files would be overwritten by %s:\n%%s";
+               msg = advice_commit_before_merge
+                     ? _("Your local changes to the following files would be overwritten by %s:\n%%s"
+                         "Please commit your changes or stash them before you can %s.")
+                     : _("Your local changes to the following files would be overwritten by %s:\n%%s");
        msgs[ERROR_WOULD_OVERWRITE] = msgs[ERROR_NOT_UPTODATE_FILE] =
-               xstrfmt(msg, cmd, cmd2);
+               xstrfmt(msg, cmd, cmd);
  
        msgs[ERROR_NOT_UPTODATE_DIR] =
-               "Updating the following directories would lose untracked files in it:\n%s";
-       if (advice_commit_before_merge)
-               msg = "The following untracked working tree files would be %s by %s:\n%%s"
-                       "Please move or remove them before you can %s.";
+               _("Updating the following directories would lose untracked files in it:\n%s");
+       if (!strcmp(cmd, "checkout"))
+               msg = advice_commit_before_merge
+                     ? _("The following untracked working tree files would be removed by checkout:\n%%s"
+                         "Please move or remove them before you can switch branches.")
+                     : _("The following untracked working tree files would be removed by checkout:\n%%s");
+       else if (!strcmp(cmd, "merge"))
+               msg = advice_commit_before_merge
+                     ? _("The following untracked working tree files would be removed by merge:\n%%s"
+                         "Please move or remove them before you can merge.")
+                     : _("The following untracked working tree files would be removed by merge:\n%%s");
        else
-               msg = "The following untracked working tree files would be %s by %s:\n%%s";
-       msgs[ERROR_WOULD_LOSE_UNTRACKED_REMOVED] = xstrfmt(msg, "removed", cmd, cmd2);
-       msgs[ERROR_WOULD_LOSE_UNTRACKED_OVERWRITTEN] = xstrfmt(msg, "overwritten", cmd, cmd2);
+               msg = advice_commit_before_merge
+                     ? _("The following untracked working tree files would be removed by %s:\n%%s"
+                         "Please move or remove them before you can %s.")
+                     : _("The following untracked working tree files would be removed by %s:\n%%s");
+       msgs[ERROR_WOULD_LOSE_UNTRACKED_REMOVED] = xstrfmt(msg, cmd, cmd);
+       if (!strcmp(cmd, "checkout"))
+               msg = advice_commit_before_merge
+                     ? _("The following untracked working tree files would be overwritten by checkout:\n%%s"
+                         "Please move or remove them before you can switch branches.")
+                     : _("The following untracked working tree files would be overwritten by checkout:\n%%s");
+       else if (!strcmp(cmd, "merge"))
+               msg = advice_commit_before_merge
+                     ? _("The following untracked working tree files would be overwritten by merge:\n%%s"
+                         "Please move or remove them before you can merge.")
+                     : _("The following untracked working tree files would be overwritten by merge:\n%%s");
+       else
+               msg = advice_commit_before_merge
+                     ? _("The following untracked working tree files would be overwritten by %s:\n%%s"
+                         "Please move or remove them before you can %s.")
+                     : _("The following untracked working tree files would be overwritten by %s:\n%%s");
+       msgs[ERROR_WOULD_LOSE_UNTRACKED_OVERWRITTEN] = xstrfmt(msg, cmd, cmd);
  
        /*
         * Special case: ERROR_BIND_OVERLAP refers to a pair of paths, we
         * cannot easily display it as a list.
         */
-       msgs[ERROR_BIND_OVERLAP] = "Entry '%s' overlaps with '%s'.  Cannot bind.";
+       msgs[ERROR_BIND_OVERLAP] = _("Entry '%s' overlaps with '%s'.  Cannot bind.");
  
        msgs[ERROR_SPARSE_NOT_UPTODATE_FILE] =
-               "Cannot update sparse checkout: the following entries are not up-to-date:\n%s";
+               _("Cannot update sparse checkout: the following entries are not up-to-date:\n%s");
        msgs[ERROR_WOULD_LOSE_ORPHANED_OVERWRITTEN] =
-               "The following Working tree files would be overwritten by sparse checkout update:\n%s";
+               _("The following Working tree files would be overwritten by sparse checkout update:\n%s");
        msgs[ERROR_WOULD_LOSE_ORPHANED_REMOVED] =
-               "The following Working tree files would be removed by sparse checkout update:\n%s";
+               _("The following Working tree files would be removed by sparse checkout update:\n%s");
  
        opts->show_all_errors = 1;
        /* rejected paths may not have a static buffer */
@@@ -168,7 -202,7 +202,7 @@@ static void display_error_msgs(struct u
                string_list_clear(rejects, 0);
        }
        if (something_displayed)
-               fprintf(stderr, "Aborting\n");
+               fprintf(stderr, _("Aborting\n"));
  }
  
  /*
@@@ -475,7 -509,7 +509,7 @@@ static int traverse_trees_recursive(in
        for (i = 0; i < n; i++, dirmask >>= 1) {
                const unsigned char *sha1 = NULL;
                if (dirmask & 1)
 -                      sha1 = names[i].sha1;
 +                      sha1 = names[i].oid->hash;
                buf[i] = fill_tree_descriptor(t+i, sha1);
        }
  
@@@ -591,7 -625,7 +625,7 @@@ static struct cache_entry *create_ce_en
        ce->ce_mode = create_ce_mode(n->mode);
        ce->ce_flags = create_ce_flags(stage);
        ce->ce_namelen = len;
 -      hashcpy(ce->sha1, n->sha1);
 +      hashcpy(ce->sha1, n->oid->hash);
        make_traverse_path(ce->name, info, n);
  
        return ce;