Merge branch 'nd/i18n-parseopt-help'
authorJunio C Hamano <gitster@pobox.com>
Fri, 7 Sep 2012 18:09:09 +0000 (11:09 -0700)
committerJunio C Hamano <gitster@pobox.com>
Fri, 7 Sep 2012 18:09:09 +0000 (11:09 -0700)
A lot of i18n mark-up for the help text from "git <cmd> -h".

* nd/i18n-parseopt-help: (66 commits)
Use imperative form in help usage to describe an action
Reduce translations by using same terminologies
i18n: write-tree: mark parseopt strings for translation
i18n: verify-tag: mark parseopt strings for translation
i18n: verify-pack: mark parseopt strings for translation
i18n: update-server-info: mark parseopt strings for translation
i18n: update-ref: mark parseopt strings for translation
i18n: update-index: mark parseopt strings for translation
i18n: tag: mark parseopt strings for translation
i18n: symbolic-ref: mark parseopt strings for translation
i18n: show-ref: mark parseopt strings for translation
i18n: show-branch: mark parseopt strings for translation
i18n: shortlog: mark parseopt strings for translation
i18n: rm: mark parseopt strings for translation
i18n: revert, cherry-pick: mark parseopt strings for translation
i18n: rev-parse: mark parseopt strings for translation
i18n: reset: mark parseopt strings for translation
i18n: rerere: mark parseopt strings for translation
i18n: status: mark parseopt strings for translation
i18n: replace: mark parseopt strings for translation
...

12 files changed:
1  2 
builtin/apply.c
builtin/blame.c
builtin/cat-file.c
builtin/checkout.c
builtin/config.c
builtin/for-each-ref.c
builtin/grep.c
builtin/log.c
builtin/merge.c
builtin/prune.c
builtin/push.c
builtin/revert.c
diff --combined builtin/apply.c
index 3bf71dc4522564463945673aaba0501a51141bb2,0ab81e34350749a1426c4b338bfcb48313ba8a27..537d33b06103e76fa3611c0ccf329c22897807d9
@@@ -188,6 -188,7 +188,6 @@@ struct patch 
        int is_new, is_delete;  /* -1 = unknown, 0 = false, 1 = true */
        int rejected;
        unsigned ws_rule;
 -      unsigned long deflate_origlen;
        int lines_added, lines_deleted;
        int score;
        unsigned int is_toplevel_relative:1;
@@@ -4296,7 -4297,7 +4296,7 @@@ int cmd_apply(int argc, const char **ar
                OPT_NOOP_NOARG(0, "allow-binary-replacement"),
                OPT_NOOP_NOARG(0, "binary"),
                OPT_BOOLEAN(0, "numstat", &numstat,
-                       N_("shows number of added and deleted lines in decimal notation")),
+                       N_("show number of added and deleted lines in decimal notation")),
                OPT_BOOLEAN(0, "summary", &summary,
                        N_("instead of applying the patch, output a summary for the input")),
                OPT_BOOLEAN(0, "check", &check,
diff --combined builtin/blame.c
index ed5d01b36a309a53619c2615aed2382b2aebf056,c0c99c3b41a40522535e41cf1de0f6e00da0e4f2..0e102bf2c2aa26bd0dcbcb1788341eaa7ac2c037
  #include "utf8.h"
  #include "userdiff.h"
  
- static char blame_usage[] = "git blame [options] [rev-opts] [rev] [--] file";
+ static char blame_usage[] = N_("git blame [options] [rev-opts] [rev] [--] file");
  
  static const char *blame_opt_usage[] = {
        blame_usage,
        "",
-       "[rev-opts] are documented in git-rev-list(1)",
+       N_("[rev-opts] are documented in git-rev-list(1)"),
        NULL
  };
  
@@@ -110,7 -110,6 +110,7 @@@ static int diff_hunks(mmfile_t *file_a
  int textconv_object(const char *path,
                    unsigned mode,
                    const unsigned char *sha1,
 +                  int sha1_valid,
                    char **buf,
                    unsigned long *buf_size)
  {
        struct userdiff_driver *textconv;
  
        df = alloc_filespec(path);
 -      fill_filespec(df, sha1, mode);
 +      fill_filespec(df, sha1, sha1_valid, mode);
        textconv = get_textconv(df);
        if (!textconv) {
                free_filespec(df);
@@@ -143,7 -142,7 +143,7 @@@ static void fill_origin_blob(struct dif
  
                num_read_blob++;
                if (DIFF_OPT_TST(opt, ALLOW_TEXTCONV) &&
 -                  textconv_object(o->path, o->mode, o->blob_sha1, &file->ptr, &file_size))
 +                  textconv_object(o->path, o->mode, o->blob_sha1, 1, &file->ptr, &file_size))
                        ;
                else
                        file->ptr = read_sha1_file(o->blob_sha1, &type, &file_size);
@@@ -407,7 -406,8 +407,7 @@@ static struct origin *find_origin(struc
        paths[1] = NULL;
  
        diff_tree_setup_paths(paths, &diff_opts);
 -      if (diff_setup_done(&diff_opts) < 0)
 -              die("diff-setup");
 +      diff_setup_done(&diff_opts);
  
        if (is_null_sha1(origin->commit->object.sha1))
                do_diff_cache(parent->tree->object.sha1, &diff_opts);
@@@ -493,7 -493,8 +493,7 @@@ static struct origin *find_rename(struc
        diff_opts.single_follow = origin->path;
        paths[0] = NULL;
        diff_tree_setup_paths(paths, &diff_opts);
 -      if (diff_setup_done(&diff_opts) < 0)
 -              die("diff-setup");
 +      diff_setup_done(&diff_opts);
  
        if (is_null_sha1(origin->commit->object.sha1))
                do_diff_cache(parent->tree->object.sha1, &diff_opts);
@@@ -1073,7 -1074,8 +1073,7 @@@ static int find_copy_in_parent(struct s
  
        paths[0] = NULL;
        diff_tree_setup_paths(paths, &diff_opts);
 -      if (diff_setup_done(&diff_opts) < 0)
 -              die("diff-setup");
 +      diff_setup_done(&diff_opts);
  
        /* Try "find copies harder" on new path if requested;
         * we do not want to use diffcore_rename() actually to
@@@ -2121,7 -2123,7 +2121,7 @@@ static struct commit *fake_working_tree
                switch (st.st_mode & S_IFMT) {
                case S_IFREG:
                        if (DIFF_OPT_TST(opt, ALLOW_TEXTCONV) &&
 -                          textconv_object(read_from, mode, null_sha1, &buf_ptr, &buf_len))
 +                          textconv_object(read_from, mode, null_sha1, 0, &buf_ptr, &buf_len))
                                strbuf_attach(&buf, buf_ptr, buf_len, buf_len + 1);
                        else if (strbuf_read_file(&buf, read_from, st.st_size) != st.st_size)
                                die_errno("cannot open or read '%s'", read_from);
@@@ -2313,27 -2315,27 +2313,27 @@@ int cmd_blame(int argc, const char **ar
        static const char *revs_file = NULL;
        static const char *contents_from = NULL;
        static const struct option options[] = {
-               OPT_BOOLEAN(0, "incremental", &incremental, "Show blame entries as we find them, incrementally"),
-               OPT_BOOLEAN('b', NULL, &blank_boundary, "Show blank SHA-1 for boundary commits (Default: off)"),
-               OPT_BOOLEAN(0, "root", &show_root, "Do not treat root commits as boundaries (Default: off)"),
-               OPT_BOOLEAN(0, "show-stats", &show_stats, "Show work cost statistics"),
-               OPT_BIT(0, "score-debug", &output_option, "Show output score for blame entries", OUTPUT_SHOW_SCORE),
-               OPT_BIT('f', "show-name", &output_option, "Show original filename (Default: auto)", OUTPUT_SHOW_NAME),
-               OPT_BIT('n', "show-number", &output_option, "Show original linenumber (Default: off)", OUTPUT_SHOW_NUMBER),
-               OPT_BIT('p', "porcelain", &output_option, "Show in a format designed for machine consumption", OUTPUT_PORCELAIN),
-               OPT_BIT(0, "line-porcelain", &output_option, "Show porcelain format with per-line commit information", OUTPUT_PORCELAIN|OUTPUT_LINE_PORCELAIN),
-               OPT_BIT('c', NULL, &output_option, "Use the same output mode as git-annotate (Default: off)", OUTPUT_ANNOTATE_COMPAT),
-               OPT_BIT('t', NULL, &output_option, "Show raw timestamp (Default: off)", OUTPUT_RAW_TIMESTAMP),
-               OPT_BIT('l', NULL, &output_option, "Show long commit SHA1 (Default: off)", OUTPUT_LONG_OBJECT_NAME),
-               OPT_BIT('s', NULL, &output_option, "Suppress author name and timestamp (Default: off)", OUTPUT_NO_AUTHOR),
-               OPT_BIT('e', "show-email", &output_option, "Show author email instead of name (Default: off)", OUTPUT_SHOW_EMAIL),
-               OPT_BIT('w', NULL, &xdl_opts, "Ignore whitespace differences", XDF_IGNORE_WHITESPACE),
-               OPT_BIT(0, "minimal", &xdl_opts, "Spend extra cycles to find better match", XDF_NEED_MINIMAL),
-               OPT_STRING('S', NULL, &revs_file, "file", "Use revisions from <file> instead of calling git-rev-list"),
-               OPT_STRING(0, "contents", &contents_from, "file", "Use <file>'s contents as the final image"),
-               { OPTION_CALLBACK, 'C', NULL, &opt, "score", "Find line copies within and across files", PARSE_OPT_OPTARG, blame_copy_callback },
-               { OPTION_CALLBACK, 'M', NULL, &opt, "score", "Find line movements within and across files", PARSE_OPT_OPTARG, blame_move_callback },
-               OPT_CALLBACK('L', NULL, &bottomtop, "n,m", "Process only line range n,m, counting from 1", blame_bottomtop_callback),
+               OPT_BOOLEAN(0, "incremental", &incremental, N_("Show blame entries as we find them, incrementally")),
+               OPT_BOOLEAN('b', NULL, &blank_boundary, N_("Show blank SHA-1 for boundary commits (Default: off)")),
+               OPT_BOOLEAN(0, "root", &show_root, N_("Do not treat root commits as boundaries (Default: off)")),
+               OPT_BOOLEAN(0, "show-stats", &show_stats, N_("Show work cost statistics")),
+               OPT_BIT(0, "score-debug", &output_option, N_("Show output score for blame entries"), OUTPUT_SHOW_SCORE),
+               OPT_BIT('f', "show-name", &output_option, N_("Show original filename (Default: auto)"), OUTPUT_SHOW_NAME),
+               OPT_BIT('n', "show-number", &output_option, N_("Show original linenumber (Default: off)"), OUTPUT_SHOW_NUMBER),
+               OPT_BIT('p', "porcelain", &output_option, N_("Show in a format designed for machine consumption"), OUTPUT_PORCELAIN),
+               OPT_BIT(0, "line-porcelain", &output_option, N_("Show porcelain format with per-line commit information"), OUTPUT_PORCELAIN|OUTPUT_LINE_PORCELAIN),
+               OPT_BIT('c', NULL, &output_option, N_("Use the same output mode as git-annotate (Default: off)"), OUTPUT_ANNOTATE_COMPAT),
+               OPT_BIT('t', NULL, &output_option, N_("Show raw timestamp (Default: off)"), OUTPUT_RAW_TIMESTAMP),
+               OPT_BIT('l', NULL, &output_option, N_("Show long commit SHA1 (Default: off)"), OUTPUT_LONG_OBJECT_NAME),
+               OPT_BIT('s', NULL, &output_option, N_("Suppress author name and timestamp (Default: off)"), OUTPUT_NO_AUTHOR),
+               OPT_BIT('e', "show-email", &output_option, N_("Show author email instead of name (Default: off)"), OUTPUT_SHOW_EMAIL),
+               OPT_BIT('w', NULL, &xdl_opts, N_("Ignore whitespace differences"), XDF_IGNORE_WHITESPACE),
+               OPT_BIT(0, "minimal", &xdl_opts, N_("Spend extra cycles to find better match"), XDF_NEED_MINIMAL),
+               OPT_STRING('S', NULL, &revs_file, N_("file"), N_("Use revisions from <file> instead of calling git-rev-list")),
+               OPT_STRING(0, "contents", &contents_from, N_("file"), N_("Use <file>'s contents as the final image")),
+               { OPTION_CALLBACK, 'C', NULL, &opt, N_("score"), N_("Find line copies within and across files"), PARSE_OPT_OPTARG, blame_copy_callback },
+               { OPTION_CALLBACK, 'M', NULL, &opt, N_("score"), N_("Find line movements within and across files"), PARSE_OPT_OPTARG, blame_move_callback },
+               OPT_CALLBACK('L', NULL, &bottomtop, N_("n,m"), N_("Process only line range n,m, counting from 1"), blame_bottomtop_callback),
                OPT__ABBREV(&abbrev),
                OPT_END()
        };
@@@ -2514,7 -2516,7 +2514,7 @@@ parse_done
                        die("no such path %s in %s", path, final_commit_name);
  
                if (DIFF_OPT_TST(&sb.revs->diffopt, ALLOW_TEXTCONV) &&
 -                  textconv_object(path, o->mode, o->blob_sha1, (char **) &sb.final_buf,
 +                  textconv_object(path, o->mode, o->blob_sha1, 1, (char **) &sb.final_buf,
                                    &sb.final_buf_size))
                        ;
                else
diff --combined builtin/cat-file.c
index 0eca2d7bd0e6d620edc70b4f643a8911efbbc8ae,512072a008560430fed86de9beb06c47f2587378..00528ddc389212f045a7718ba55a26d723927f06
@@@ -146,7 -146,7 +146,7 @@@ static int cat_one_file(int opt, const 
                        die("git cat-file --textconv %s: <object> must be <sha1:path>",
                            obj_name);
  
 -              if (!textconv_object(obj_context.path, obj_context.mode, sha1, &buf, &size))
 +              if (!textconv_object(obj_context.path, obj_context.mode, sha1, 1, &buf, &size))
                        die("git cat-file --textconv: unable to run textconv on %s",
                            obj_name);
                break;
@@@ -244,8 -244,8 +244,8 @@@ static int batch_objects(int print_cont
  }
  
  static const char * const cat_file_usage[] = {
-       "git cat-file (-t|-s|-e|-p|<type>|--textconv) <object>",
-       "git cat-file (--batch|--batch-check) < <list_of_objects>",
+       N_("git cat-file (-t|-s|-e|-p|<type>|--textconv) <object>"),
+       N_("git cat-file (--batch|--batch-check) < <list_of_objects>"),
        NULL
  };
  
@@@ -263,19 -263,19 +263,19 @@@ int cmd_cat_file(int argc, const char *
        const char *exp_type = NULL, *obj_name = NULL;
  
        const struct option options[] = {
-               OPT_GROUP("<type> can be one of: blob, tree, commit, tag"),
-               OPT_SET_INT('t', NULL, &opt, "show object type", 't'),
-               OPT_SET_INT('s', NULL, &opt, "show object size", 's'),
+               OPT_GROUP(N_("<type> can be one of: blob, tree, commit, tag")),
+               OPT_SET_INT('t', NULL, &opt, N_("show object type"), 't'),
+               OPT_SET_INT('s', NULL, &opt, N_("show object size"), 's'),
                OPT_SET_INT('e', NULL, &opt,
-                           "exit with zero when there's no error", 'e'),
-               OPT_SET_INT('p', NULL, &opt, "pretty-print object's content", 'p'),
+                           N_("exit with zero when there's no error"), 'e'),
+               OPT_SET_INT('p', NULL, &opt, N_("pretty-print object's content"), 'p'),
                OPT_SET_INT(0, "textconv", &opt,
-                           "for blob objects, run textconv on object's content", 'c'),
+                           N_("for blob objects, run textconv on object's content"), 'c'),
                OPT_SET_INT(0, "batch", &batch,
-                           "show info and content of objects fed from the standard input",
+                           N_("show info and content of objects fed from the standard input"),
                            BATCH),
                OPT_SET_INT(0, "batch-check", &batch,
-                           "show info about objects fed from the standard input",
+                           N_("show info about objects fed from the standard input"),
                            BATCH_CHECK),
                OPT_END()
        };
diff --combined builtin/checkout.c
index 7d922c612a9ef0784fa381c89899ba7a959338f2,9f6dbe61986638af2118d147380be886687cbf92..d287ee6e4838603ae6f3f389431a4455099e1008
@@@ -22,8 -22,8 +22,8 @@@
  #include "argv-array.h"
  
  static const char * const checkout_usage[] = {
-       "git checkout [options] <branch>",
-       "git checkout [options] [<branch>] -- <file>...",
+       N_("git checkout [options] <branch>"),
+       N_("git checkout [options] [<branch>] -- <file>..."),
        NULL,
  };
  
@@@ -316,7 -316,8 +316,7 @@@ static void show_local_changes(struct o
        init_revisions(&rev, NULL);
        rev.diffopt.flags = opts->flags;
        rev.diffopt.output_format |= DIFF_FORMAT_NAME_STATUS;
 -      if (diff_setup_done(&rev.diffopt) < 0)
 -              die(_("diff_setup_done failed"));
 +      diff_setup_done(&rev.diffopt);
        add_pending_object(&rev, head, NULL);
        run_diff_index(&rev, 0);
  }
@@@ -933,28 -934,28 +933,28 @@@ int cmd_checkout(int argc, const char *
        int patch_mode = 0;
        int dwim_new_local_branch = 1;
        struct option options[] = {
-               OPT__QUIET(&opts.quiet, "suppress progress reporting"),
-               OPT_STRING('b', NULL, &opts.new_branch, "branch",
-                          "create and checkout a new branch"),
-               OPT_STRING('B', NULL, &opts.new_branch_force, "branch",
-                          "create/reset and checkout a branch"),
-               OPT_BOOLEAN('l', NULL, &opts.new_branch_log, "create reflog for new branch"),
-               OPT_BOOLEAN(0, "detach", &opts.force_detach, "detach the HEAD at named commit"),
-               OPT_SET_INT('t', "track",  &opts.track, "set upstream info for new branch",
+               OPT__QUIET(&opts.quiet, N_("suppress progress reporting")),
+               OPT_STRING('b', NULL, &opts.new_branch, N_("branch"),
+                          N_("create and checkout a new branch")),
+               OPT_STRING('B', NULL, &opts.new_branch_force, N_("branch"),
+                          N_("create/reset and checkout a branch")),
+               OPT_BOOLEAN('l', NULL, &opts.new_branch_log, N_("create reflog for new branch")),
+               OPT_BOOLEAN(0, "detach", &opts.force_detach, N_("detach the HEAD at named commit")),
+               OPT_SET_INT('t', "track",  &opts.track, N_("set upstream info for new branch"),
                        BRANCH_TRACK_EXPLICIT),
-               OPT_STRING(0, "orphan", &opts.new_orphan_branch, "new branch", "new unparented branch"),
-               OPT_SET_INT('2', "ours", &opts.writeout_stage, "checkout our version for unmerged files",
+               OPT_STRING(0, "orphan", &opts.new_orphan_branch, N_("new branch"), N_("new unparented branch")),
+               OPT_SET_INT('2', "ours", &opts.writeout_stage, N_("checkout our version for unmerged files"),
                            2),
-               OPT_SET_INT('3', "theirs", &opts.writeout_stage, "checkout their version for unmerged files",
+               OPT_SET_INT('3', "theirs", &opts.writeout_stage, N_("checkout their version for unmerged files"),
                            3),
-               OPT__FORCE(&opts.force, "force checkout (throw away local modifications)"),
-               OPT_BOOLEAN('m', "merge", &opts.merge, "perform a 3-way merge with the new branch"),
-               OPT_BOOLEAN(0, "overwrite-ignore", &opts.overwrite_ignore, "update ignored files (default)"),
-               OPT_STRING(0, "conflict", &conflict_style, "style",
-                          "conflict style (merge or diff3)"),
-               OPT_BOOLEAN('p', "patch", &patch_mode, "select hunks interactively"),
+               OPT__FORCE(&opts.force, N_("force checkout (throw away local modifications)")),
+               OPT_BOOLEAN('m', "merge", &opts.merge, N_("perform a 3-way merge with the new branch")),
+               OPT_BOOLEAN(0, "overwrite-ignore", &opts.overwrite_ignore, N_("update ignored files (default)")),
+               OPT_STRING(0, "conflict", &conflict_style, N_("style"),
+                          N_("conflict style (merge or diff3)")),
+               OPT_BOOLEAN('p', "patch", &patch_mode, N_("select hunks interactively")),
                { OPTION_BOOLEAN, 0, "guess", &dwim_new_local_branch, NULL,
-                 "second guess 'git checkout no-such-branch'",
+                 N_("second guess 'git checkout no-such-branch'"),
                  PARSE_OPT_NOARG | PARSE_OPT_HIDDEN },
                OPT_END(),
        };
diff --combined builtin/config.c
index 442ccc2497c4e2e889d9de55359e36a1db07c1a4,31e13549370dd2390d1208e27ef88d6a307f4a3d..e1c33e0691796601ac869278c155194d33ee8332
@@@ -4,7 -4,7 +4,7 @@@
  #include "parse-options.h"
  
  static const char *const builtin_config_usage[] = {
-       "git config [options]",
+       N_("git config [options]"),
        NULL
  };
  
@@@ -49,33 -49,33 +49,33 @@@ static int respect_includes = -1
  #define TYPE_PATH (1<<3)
  
  static struct option builtin_config_options[] = {
-       OPT_GROUP("Config file location"),
-       OPT_BOOLEAN(0, "global", &use_global_config, "use global config file"),
-       OPT_BOOLEAN(0, "system", &use_system_config, "use system config file"),
-       OPT_BOOLEAN(0, "local", &use_local_config, "use repository config file"),
-       OPT_STRING('f', "file", &given_config_file, "file", "use given config file"),
-       OPT_GROUP("Action"),
-       OPT_BIT(0, "get", &actions, "get value: name [value-regex]", ACTION_GET),
-       OPT_BIT(0, "get-all", &actions, "get all values: key [value-regex]", ACTION_GET_ALL),
-       OPT_BIT(0, "get-regexp", &actions, "get values for regexp: name-regex [value-regex]", ACTION_GET_REGEXP),
-       OPT_BIT(0, "replace-all", &actions, "replace all matching variables: name value [value_regex]", ACTION_REPLACE_ALL),
-       OPT_BIT(0, "add", &actions, "adds a new variable: name value", ACTION_ADD),
-       OPT_BIT(0, "unset", &actions, "removes a variable: name [value-regex]", ACTION_UNSET),
-       OPT_BIT(0, "unset-all", &actions, "removes all matches: name [value-regex]", ACTION_UNSET_ALL),
-       OPT_BIT(0, "rename-section", &actions, "rename section: old-name new-name", ACTION_RENAME_SECTION),
-       OPT_BIT(0, "remove-section", &actions, "remove a section: name", ACTION_REMOVE_SECTION),
-       OPT_BIT('l', "list", &actions, "list all", ACTION_LIST),
-       OPT_BIT('e', "edit", &actions, "opens an editor", ACTION_EDIT),
-       OPT_STRING(0, "get-color", &get_color_slot, "slot", "find the color configured: [default]"),
-       OPT_STRING(0, "get-colorbool", &get_colorbool_slot, "slot", "find the color setting: [stdout-is-tty]"),
-       OPT_GROUP("Type"),
-       OPT_BIT(0, "bool", &types, "value is \"true\" or \"false\"", TYPE_BOOL),
-       OPT_BIT(0, "int", &types, "value is decimal number", TYPE_INT),
-       OPT_BIT(0, "bool-or-int", &types, "value is --bool or --int", TYPE_BOOL_OR_INT),
-       OPT_BIT(0, "path", &types, "value is a path (file or directory name)", TYPE_PATH),
-       OPT_GROUP("Other"),
-       OPT_BOOLEAN('z', "null", &end_null, "terminate values with NUL byte"),
-       OPT_BOOL(0, "includes", &respect_includes, "respect include directives on lookup"),
+       OPT_GROUP(N_("Config file location")),
+       OPT_BOOLEAN(0, "global", &use_global_config, N_("use global config file")),
+       OPT_BOOLEAN(0, "system", &use_system_config, N_("use system config file")),
+       OPT_BOOLEAN(0, "local", &use_local_config, N_("use repository config file")),
+       OPT_STRING('f', "file", &given_config_file, N_("file"), N_("use given config file")),
+       OPT_GROUP(N_("Action")),
+       OPT_BIT(0, "get", &actions, N_("get value: name [value-regex]"), ACTION_GET),
+       OPT_BIT(0, "get-all", &actions, N_("get all values: key [value-regex]"), ACTION_GET_ALL),
+       OPT_BIT(0, "get-regexp", &actions, N_("get values for regexp: name-regex [value-regex]"), ACTION_GET_REGEXP),
+       OPT_BIT(0, "replace-all", &actions, N_("replace all matching variables: name value [value_regex]"), ACTION_REPLACE_ALL),
+       OPT_BIT(0, "add", &actions, N_("add a new variable: name value"), ACTION_ADD),
+       OPT_BIT(0, "unset", &actions, N_("remove a variable: name [value-regex]"), ACTION_UNSET),
+       OPT_BIT(0, "unset-all", &actions, N_("remove all matches: name [value-regex]"), ACTION_UNSET_ALL),
+       OPT_BIT(0, "rename-section", &actions, N_("rename section: old-name new-name"), ACTION_RENAME_SECTION),
+       OPT_BIT(0, "remove-section", &actions, N_("remove a section: name"), ACTION_REMOVE_SECTION),
+       OPT_BIT('l', "list", &actions, N_("list all"), ACTION_LIST),
+       OPT_BIT('e', "edit", &actions, N_("open an editor"), ACTION_EDIT),
+       OPT_STRING(0, "get-color", &get_color_slot, N_("slot"), N_("find the color configured: [default]")),
+       OPT_STRING(0, "get-colorbool", &get_colorbool_slot, N_("slot"), N_("find the color setting: [stdout-is-tty]")),
+       OPT_GROUP(N_("Type")),
+       OPT_BIT(0, "bool", &types, N_("value is \"true\" or \"false\""), TYPE_BOOL),
+       OPT_BIT(0, "int", &types, N_("value is decimal number"), TYPE_INT),
+       OPT_BIT(0, "bool-or-int", &types, N_("value is --bool or --int"), TYPE_BOOL_OR_INT),
+       OPT_BIT(0, "path", &types, N_("value is a path (file or directory name)"), TYPE_PATH),
+       OPT_GROUP(N_("Other")),
+       OPT_BOOLEAN('z', "null", &end_null, N_("terminate values with NUL byte")),
+       OPT_BOOL(0, "includes", &respect_includes, N_("respect include directives on lookup")),
        OPT_END(),
  };
  
@@@ -160,7 -160,7 +160,7 @@@ static int show_config(const char *key_
  
  static int get_value(const char *key_, const char *regex_)
  {
 -      int ret = -1;
 +      int ret = CONFIG_GENERIC_ERROR;
        char *global = NULL, *xdg = NULL, *repo_config = NULL;
        const char *system_wide = NULL, *local;
        struct config_include_data inc = CONFIG_INCLUDE_INIT;
                if (regcomp(key_regexp, key, REG_EXTENDED)) {
                        fprintf(stderr, "Invalid key pattern: %s\n", key_);
                        free(key);
 +                      ret = CONFIG_INVALID_PATTERN;
                        goto free_strings;
                }
        } else {
 -              if (git_config_parse_key(key_, &key, NULL))
 +              if (git_config_parse_key(key_, &key, NULL)) {
 +                      ret = CONFIG_INVALID_KEY;
                        goto free_strings;
 +              }
        }
  
        if (regex_) {
                regexp = (regex_t*)xmalloc(sizeof(regex_t));
                if (regcomp(regexp, regex_, REG_EXTENDED)) {
                        fprintf(stderr, "Invalid pattern: %s\n", regex_);
 +                      ret = CONFIG_INVALID_PATTERN;
                        goto free_strings;
                }
        }
@@@ -400,8 -396,8 +400,8 @@@ int cmd_config(int argc, const char **a
                         */
                        die("$HOME not set");
  
 -              if (access(user_config, R_OK) &&
 -                  xdg_config && !access(xdg_config, R_OK))
 +              if (access_or_warn(user_config, R_OK) &&
 +                  xdg_config && !access_or_warn(xdg_config, R_OK))
                        given_config_file = xdg_config;
                else
                        given_config_file = user_config;
diff --combined builtin/for-each-ref.c
index 0c5294e5e8fb92ca4757929a4bdf4bc49ca659bb,afe83b984354913d348bf58de04c4b2bd5d307af..7f059c31dfbd11f77c891134ccc34cdc1f65bcb8
@@@ -962,9 -962,7 +962,9 @@@ static int opt_parse_sort(const struct 
        if (!arg) /* should --no-sort void the list ? */
                return -1;
  
 -      *sort_tail = s = xcalloc(1, sizeof(*s));
 +      s = xcalloc(1, sizeof(*s));
 +      s->next = *sort_tail;
 +      *sort_tail = s;
  
        if (*arg == '-') {
                s->reverse = 1;
  }
  
  static char const * const for_each_ref_usage[] = {
-       "git for-each-ref [options] [<pattern>]",
+       N_("git for-each-ref [options] [<pattern>]"),
        NULL
  };
  
@@@ -991,19 -989,19 +991,19 @@@ int cmd_for_each_ref(int argc, const ch
  
        struct option opts[] = {
                OPT_BIT('s', "shell", &quote_style,
-                       "quote placeholders suitably for shells", QUOTE_SHELL),
+                       N_("quote placeholders suitably for shells"), QUOTE_SHELL),
                OPT_BIT('p', "perl",  &quote_style,
-                       "quote placeholders suitably for perl", QUOTE_PERL),
+                       N_("quote placeholders suitably for perl"), QUOTE_PERL),
                OPT_BIT(0 , "python", &quote_style,
-                       "quote placeholders suitably for python", QUOTE_PYTHON),
+                       N_("quote placeholders suitably for python"), QUOTE_PYTHON),
                OPT_BIT(0 , "tcl",  &quote_style,
-                       "quote placeholders suitably for tcl", QUOTE_TCL),
+                       N_("quote placeholders suitably for tcl"), QUOTE_TCL),
  
                OPT_GROUP(""),
-               OPT_INTEGER( 0 , "count", &maxcount, "show only <n> matched refs"),
-               OPT_STRING(  0 , "format", &format, "format", "format to use for the output"),
-               OPT_CALLBACK(0 , "sort", sort_tail, "key",
-                           "field name to sort on", &opt_parse_sort),
+               OPT_INTEGER( 0 , "count", &maxcount, N_("show only <n> matched refs")),
+               OPT_STRING(  0 , "format", &format, N_("format"), N_("format to use for the output")),
+               OPT_CALLBACK(0 , "sort", sort_tail, N_("key"),
+                           N_("field name to sort on"), &opt_parse_sort),
                OPT_END(),
        };
  
diff --combined builtin/grep.c
index 02b9555918bffe62a65779eaf0249c1e18822aa6,c9a65b372ace3139c9986aa656a1fedd28a0cb1b..09ca4c980e633895dd104307e76770da3f208a06
@@@ -19,7 -19,7 +19,7 @@@
  #include "dir.h"
  
  static char const * const grep_usage[] = {
-       "git grep [options] [-e] <pattern> [<rev>...] [[--] <path>...]",
+       N_("git grep [options] [-e] <pattern> [<rev>...] [[--] <path>...]"),
        NULL
  };
  
@@@ -260,53 -260,6 +260,53 @@@ static int wait_all(void
  }
  #endif
  
 +static int parse_pattern_type_arg(const char *opt, const char *arg)
 +{
 +      if (!strcmp(arg, "default"))
 +              return GREP_PATTERN_TYPE_UNSPECIFIED;
 +      else if (!strcmp(arg, "basic"))
 +              return GREP_PATTERN_TYPE_BRE;
 +      else if (!strcmp(arg, "extended"))
 +              return GREP_PATTERN_TYPE_ERE;
 +      else if (!strcmp(arg, "fixed"))
 +              return GREP_PATTERN_TYPE_FIXED;
 +      else if (!strcmp(arg, "perl"))
 +              return GREP_PATTERN_TYPE_PCRE;
 +      die("bad %s argument: %s", opt, arg);
 +}
 +
 +static void grep_pattern_type_options(const int pattern_type, struct grep_opt *opt)
 +{
 +      switch (pattern_type) {
 +      case GREP_PATTERN_TYPE_UNSPECIFIED:
 +              /* fall through */
 +
 +      case GREP_PATTERN_TYPE_BRE:
 +              opt->fixed = 0;
 +              opt->pcre = 0;
 +              opt->regflags &= ~REG_EXTENDED;
 +              break;
 +
 +      case GREP_PATTERN_TYPE_ERE:
 +              opt->fixed = 0;
 +              opt->pcre = 0;
 +              opt->regflags |= REG_EXTENDED;
 +              break;
 +
 +      case GREP_PATTERN_TYPE_FIXED:
 +              opt->fixed = 1;
 +              opt->pcre = 0;
 +              opt->regflags &= ~REG_EXTENDED;
 +              break;
 +
 +      case GREP_PATTERN_TYPE_PCRE:
 +              opt->fixed = 0;
 +              opt->pcre = 1;
 +              opt->regflags &= ~REG_EXTENDED;
 +              break;
 +      }
 +}
 +
  static int grep_config(const char *var, const char *value, void *cb)
  {
        struct grep_opt *opt = cb;
  
        if (!strcmp(var, "grep.extendedregexp")) {
                if (git_config_bool(var, value))
 -                      opt->regflags |= REG_EXTENDED;
 +                      opt->extended_regexp_option = 1;
                else
 -                      opt->regflags &= ~REG_EXTENDED;
 +                      opt->extended_regexp_option = 0;
                return 0;
        }
  
 +      if (!strcmp(var, "grep.patterntype")) {
 +              opt->pattern_type_option = parse_pattern_type_arg(var, value);
 +              return 0;
 +  }
 +
        if (!strcmp(var, "grep.linenumber")) {
                opt->linenum = git_config_bool(var, value);
                return 0;
@@@ -721,88 -669,95 +721,88 @@@ int cmd_grep(int argc, const char **arg
        int i;
        int dummy;
        int use_index = 1;
 -      enum {
 -              pattern_type_unspecified = 0,
 -              pattern_type_bre,
 -              pattern_type_ere,
 -              pattern_type_fixed,
 -              pattern_type_pcre,
 -      };
 -      int pattern_type = pattern_type_unspecified;
 +      int pattern_type_arg = GREP_PATTERN_TYPE_UNSPECIFIED;
  
        struct option options[] = {
                OPT_BOOLEAN(0, "cached", &cached,
-                       "search in index instead of in the work tree"),
+                       N_("search in index instead of in the work tree")),
                OPT_NEGBIT(0, "no-index", &use_index,
-                        "finds in contents not managed by git", 1),
+                        N_("find in contents not managed by git"), 1),
                OPT_BOOLEAN(0, "untracked", &untracked,
-                       "search in both tracked and untracked files"),
+                       N_("search in both tracked and untracked files")),
                OPT_SET_INT(0, "exclude-standard", &opt_exclude,
-                           "search also in ignored files", 1),
+                           N_("search also in ignored files"), 1),
                OPT_GROUP(""),
                OPT_BOOLEAN('v', "invert-match", &opt.invert,
-                       "show non-matching lines"),
+                       N_("show non-matching lines")),
                OPT_BOOLEAN('i', "ignore-case", &opt.ignore_case,
-                       "case insensitive matching"),
+                       N_("case insensitive matching")),
                OPT_BOOLEAN('w', "word-regexp", &opt.word_regexp,
-                       "match patterns only at word boundaries"),
+                       N_("match patterns only at word boundaries")),
                OPT_SET_INT('a', "text", &opt.binary,
-                       "process binary files as text", GREP_BINARY_TEXT),
+                       N_("process binary files as text"), GREP_BINARY_TEXT),
                OPT_SET_INT('I', NULL, &opt.binary,
-                       "don't match patterns in binary files",
+                       N_("don't match patterns in binary files"),
                        GREP_BINARY_NOMATCH),
-               { OPTION_INTEGER, 0, "max-depth", &opt.max_depth, "depth",
-                       "descend at most <depth> levels", PARSE_OPT_NONEG,
+               { OPTION_INTEGER, 0, "max-depth", &opt.max_depth, N_("depth"),
+                       N_("descend at most <depth> levels"), PARSE_OPT_NONEG,
                        NULL, 1 },
                OPT_GROUP(""),
 -              OPT_SET_INT('E', "extended-regexp", &pattern_type,
 +              OPT_SET_INT('E', "extended-regexp", &pattern_type_arg,
-                           "use extended POSIX regular expressions",
+                           N_("use extended POSIX regular expressions"),
 -                          pattern_type_ere),
 -              OPT_SET_INT('G', "basic-regexp", &pattern_type,
 +                          GREP_PATTERN_TYPE_ERE),
 +              OPT_SET_INT('G', "basic-regexp", &pattern_type_arg,
-                           "use basic POSIX regular expressions (default)",
+                           N_("use basic POSIX regular expressions (default)"),
 -                          pattern_type_bre),
 -              OPT_SET_INT('F', "fixed-strings", &pattern_type,
 +                          GREP_PATTERN_TYPE_BRE),
 +              OPT_SET_INT('F', "fixed-strings", &pattern_type_arg,
-                           "interpret patterns as fixed strings",
+                           N_("interpret patterns as fixed strings"),
 -                          pattern_type_fixed),
 -              OPT_SET_INT('P', "perl-regexp", &pattern_type,
 +                          GREP_PATTERN_TYPE_FIXED),
 +              OPT_SET_INT('P', "perl-regexp", &pattern_type_arg,
-                           "use Perl-compatible regular expressions",
+                           N_("use Perl-compatible regular expressions"),
 -                          pattern_type_pcre),
 +                          GREP_PATTERN_TYPE_PCRE),
                OPT_GROUP(""),
-               OPT_BOOLEAN('n', "line-number", &opt.linenum, "show line numbers"),
-               OPT_NEGBIT('h', NULL, &opt.pathname, "don't show filenames", 1),
-               OPT_BIT('H', NULL, &opt.pathname, "show filenames", 1),
+               OPT_BOOLEAN('n', "line-number", &opt.linenum, N_("show line numbers")),
+               OPT_NEGBIT('h', NULL, &opt.pathname, N_("don't show filenames"), 1),
+               OPT_BIT('H', NULL, &opt.pathname, N_("show filenames"), 1),
                OPT_NEGBIT(0, "full-name", &opt.relative,
-                       "show filenames relative to top directory", 1),
+                       N_("show filenames relative to top directory"), 1),
                OPT_BOOLEAN('l', "files-with-matches", &opt.name_only,
-                       "show only filenames instead of matching lines"),
+                       N_("show only filenames instead of matching lines")),
                OPT_BOOLEAN(0, "name-only", &opt.name_only,
-                       "synonym for --files-with-matches"),
+                       N_("synonym for --files-with-matches")),
                OPT_BOOLEAN('L', "files-without-match",
                        &opt.unmatch_name_only,
-                       "show only the names of files without match"),
+                       N_("show only the names of files without match")),
                OPT_BOOLEAN('z', "null", &opt.null_following_name,
-                       "print NUL after filenames"),
+                       N_("print NUL after filenames")),
                OPT_BOOLEAN('c', "count", &opt.count,
-                       "show the number of matches instead of matching lines"),
-               OPT__COLOR(&opt.color, "highlight matches"),
+                       N_("show the number of matches instead of matching lines")),
+               OPT__COLOR(&opt.color, N_("highlight matches")),
                OPT_BOOLEAN(0, "break", &opt.file_break,
-                       "print empty line between matches from different files"),
+                       N_("print empty line between matches from different files")),
                OPT_BOOLEAN(0, "heading", &opt.heading,
-                       "show filename only once above matches from same file"),
+                       N_("show filename only once above matches from same file")),
                OPT_GROUP(""),
-               OPT_CALLBACK('C', "context", &opt, "n",
-                       "show <n> context lines before and after matches",
+               OPT_CALLBACK('C', "context", &opt, N_("n"),
+                       N_("show <n> context lines before and after matches"),
                        context_callback),
                OPT_INTEGER('B', "before-context", &opt.pre_context,
-                       "show <n> context lines before matches"),
+                       N_("show <n> context lines before matches")),
                OPT_INTEGER('A', "after-context", &opt.post_context,
-                       "show <n> context lines after matches"),
-               OPT_NUMBER_CALLBACK(&opt, "shortcut for -C NUM",
+                       N_("show <n> context lines after matches")),
+               OPT_NUMBER_CALLBACK(&opt, N_("shortcut for -C NUM"),
                        context_callback),
                OPT_BOOLEAN('p', "show-function", &opt.funcname,
-                       "show a line with the function name before matches"),
+                       N_("show a line with the function name before matches")),
                OPT_BOOLEAN('W', "function-context", &opt.funcbody,
-                       "show the surrounding function"),
+                       N_("show the surrounding function")),
                OPT_GROUP(""),
-               OPT_CALLBACK('f', NULL, &opt, "file",
-                       "read patterns from file", file_callback),
-               { OPTION_CALLBACK, 'e', NULL, &opt, "pattern",
-                       "match <pattern>", PARSE_OPT_NONEG, pattern_callback },
+               OPT_CALLBACK('f', NULL, &opt, N_("file"),
+                       N_("read patterns from file"), file_callback),
+               { OPTION_CALLBACK, 'e', NULL, &opt, N_("pattern"),
+                       N_("match <pattern>"), PARSE_OPT_NONEG, pattern_callback },
                { OPTION_CALLBACK, 0, "and", &opt, NULL,
-                 "combine patterns specified with -e",
+                 N_("combine patterns specified with -e"),
                  PARSE_OPT_NOARG | PARSE_OPT_NONEG, and_callback },
                OPT_BOOLEAN(0, "or", &dummy, ""),
                { OPTION_CALLBACK, 0, "not", &opt, NULL, "",
                  PARSE_OPT_NOARG | PARSE_OPT_NONEG | PARSE_OPT_NODASH,
                  close_callback },
                OPT__QUIET(&opt.status_only,
-                          "indicate hit with exit status without output"),
+                          N_("indicate hit with exit status without output")),
                OPT_BOOLEAN(0, "all-match", &opt.all_match,
-                       "show only matches from files that match all patterns"),
+                       N_("show only matches from files that match all patterns")),
                OPT_GROUP(""),
                { OPTION_STRING, 'O', "open-files-in-pager", &show_in_pager,
-                       "pager", "show matching files in the pager",
+                       N_("pager"), N_("show matching files in the pager"),
                        PARSE_OPT_OPTARG, NULL, (intptr_t)default_pager },
                OPT_BOOLEAN(0, "ext-grep", &external_grep_allowed__ignored,
-                           "allow calling of grep(1) (ignored by this build)"),
-               { OPTION_CALLBACK, 0, "help-all", &options, NULL, "show usage",
+                           N_("allow calling of grep(1) (ignored by this build)")),
+               { OPTION_CALLBACK, 0, "help-all", &options, NULL, N_("show usage"),
                  PARSE_OPT_HIDDEN | PARSE_OPT_NOARG, help_callback },
                OPT_END()
        };
        opt.header_tail = &opt.header_list;
        opt.regflags = REG_NEWLINE;
        opt.max_depth = -1;
 +      opt.pattern_type_option = GREP_PATTERN_TYPE_UNSPECIFIED;
 +      opt.extended_regexp_option = 0;
  
        strcpy(opt.color_context, "");
        strcpy(opt.color_filename, "");
                             PARSE_OPT_KEEP_DASHDASH |
                             PARSE_OPT_STOP_AT_NON_OPTION |
                             PARSE_OPT_NO_INTERNAL_HELP);
 -      switch (pattern_type) {
 -      case pattern_type_fixed:
 -              opt.fixed = 1;
 -              opt.pcre = 0;
 -              break;
 -      case pattern_type_bre:
 -              opt.fixed = 0;
 -              opt.pcre = 0;
 -              opt.regflags &= ~REG_EXTENDED;
 -              break;
 -      case pattern_type_ere:
 -              opt.fixed = 0;
 -              opt.pcre = 0;
 -              opt.regflags |= REG_EXTENDED;
 -              break;
 -      case pattern_type_pcre:
 -              opt.fixed = 0;
 -              opt.pcre = 1;
 -              break;
 -      default:
 -              break; /* nothing */
 -      }
 +
 +      if (pattern_type_arg != GREP_PATTERN_TYPE_UNSPECIFIED)
 +              grep_pattern_type_options(pattern_type_arg, &opt);
 +      else if (opt.pattern_type_option != GREP_PATTERN_TYPE_UNSPECIFIED)
 +              grep_pattern_type_options(opt.pattern_type_option, &opt);
 +      else if (opt.extended_regexp_option)
 +              grep_pattern_type_options(GREP_PATTERN_TYPE_ERE, &opt);
  
        if (use_index && !startup_info->have_repository)
                /* die the same way as if we did it at the beginning */
diff --combined builtin/log.c
index 3423d11649460b2008bc4713282c1d02dbf6c7f7,1ff2d8d162d721e3cb6415d056246f71dec0d83b..d76f359440f9c7a5725bbe0baae0fb7835204c9d
@@@ -34,8 -34,8 +34,8 @@@ static const char *fmt_patch_subject_pr
  static const char *fmt_pretty;
  
  static const char * const builtin_log_usage[] = {
-       "git log [<options>] [<since>..<until>] [[--] <path>...]\n"
-       "   or: git show [options] <object>...",
+       N_("git log [<options>] [<since>..<until>] [[--] <path>...]\n")
+       N_("   or: git show [options] <object>..."),
        NULL
  };
  
@@@ -97,9 -97,9 +97,9 @@@ static void cmd_log_init_finish(int arg
        int quiet = 0, source = 0;
  
        const struct option builtin_log_options[] = {
-               OPT_BOOLEAN(0, "quiet", &quiet, "suppress diff output"),
-               OPT_BOOLEAN(0, "source", &source, "show source"),
-               { OPTION_CALLBACK, 0, "decorate", NULL, NULL, "decorate options",
+               OPT_BOOLEAN(0, "quiet", &quiet, N_("suppress diff output")),
+               OPT_BOOLEAN(0, "source", &source, N_("show source")),
+               { OPTION_CALLBACK, 0, "decorate", NULL, NULL, N_("decorate options"),
                  PARSE_OPT_OPTARG, decorate_callback},
                OPT_END()
        };
@@@ -696,7 -696,7 +696,7 @@@ static int reopen_stdout(struct commit 
        return 0;
  }
  
 -static void get_patch_ids(struct rev_info *rev, struct patch_ids *ids, const char *prefix)
 +static void get_patch_ids(struct rev_info *rev, struct patch_ids *ids)
  {
        struct rev_info check_rev;
        struct commit *commit;
        init_patch_ids(ids);
  
        /* given a range a..b get all patch ids for b..a */
 -      init_revisions(&check_rev, prefix);
 +      init_revisions(&check_rev, rev->prefix);
 +      check_rev.max_parents = 1;
        o1->flags ^= UNINTERESTING;
        o2->flags ^= UNINTERESTING;
        add_pending_object(&check_rev, o1, "o1");
                die(_("revision walk setup failed"));
  
        while ((commit = get_revision(&check_rev)) != NULL) {
 -              /* ignore merges */
 -              if (commit->parents && commit->parents->next)
 -                      continue;
 -
                add_commit_patch_id(commit, ids);
        }
  
@@@ -887,7 -890,7 +887,7 @@@ static const char *set_outdir(const cha
  }
  
  static const char * const builtin_format_patch_usage[] = {
-       "git format-patch [options] [<since> | <revision range>]",
+       N_("git format-patch [options] [<since> | <revision range>]"),
        NULL
  };
  
@@@ -1060,61 -1063,61 +1060,61 @@@ int cmd_format_patch(int argc, const ch
        char *branch_name = NULL;
        const struct option builtin_format_patch_options[] = {
                { OPTION_CALLBACK, 'n', "numbered", &numbered, NULL,
-                           "use [PATCH n/m] even with a single patch",
+                           N_("use [PATCH n/m] even with a single patch"),
                            PARSE_OPT_NOARG, numbered_callback },
                { OPTION_CALLBACK, 'N', "no-numbered", &numbered, NULL,
-                           "use [PATCH] even with multiple patches",
+                           N_("use [PATCH] even with multiple patches"),
                            PARSE_OPT_NOARG, no_numbered_callback },
-               OPT_BOOLEAN('s', "signoff", &do_signoff, "add Signed-off-by:"),
+               OPT_BOOLEAN('s', "signoff", &do_signoff, N_("add Signed-off-by:")),
                OPT_BOOLEAN(0, "stdout", &use_stdout,
-                           "print patches to standard out"),
+                           N_("print patches to standard out")),
                OPT_BOOLEAN(0, "cover-letter", &cover_letter,
-                           "generate a cover letter"),
+                           N_("generate a cover letter")),
                OPT_BOOLEAN(0, "numbered-files", &numbered_files,
-                           "use simple number sequence for output file names"),
-               OPT_STRING(0, "suffix", &fmt_patch_suffix, "sfx",
-                           "use <sfx> instead of '.patch'"),
+                           N_("use simple number sequence for output file names")),
+               OPT_STRING(0, "suffix", &fmt_patch_suffix, N_("sfx"),
+                           N_("use <sfx> instead of '.patch'")),
                OPT_INTEGER(0, "start-number", &start_number,
-                           "start numbering patches at <n> instead of 1"),
-               { OPTION_CALLBACK, 0, "subject-prefix", &rev, "prefix",
-                           "Use [<prefix>] instead of [PATCH]",
+                           N_("start numbering patches at <n> instead of 1")),
+               { OPTION_CALLBACK, 0, "subject-prefix", &rev, N_("prefix"),
+                           N_("Use [<prefix>] instead of [PATCH]"),
                            PARSE_OPT_NONEG, subject_prefix_callback },
                { OPTION_CALLBACK, 'o', "output-directory", &output_directory,
-                           "dir", "store resulting files in <dir>",
+                           N_("dir"), N_("store resulting files in <dir>"),
                            PARSE_OPT_NONEG, output_directory_callback },
                { OPTION_CALLBACK, 'k', "keep-subject", &rev, NULL,
-                           "don't strip/add [PATCH]",
+                           N_("don't strip/add [PATCH]"),
                            PARSE_OPT_NOARG | PARSE_OPT_NONEG, keep_callback },
                OPT_BOOLEAN(0, "no-binary", &no_binary_diff,
-                           "don't output binary diffs"),
+                           N_("don't output binary diffs")),
                OPT_BOOLEAN(0, "ignore-if-in-upstream", &ignore_if_in_upstream,
-                           "don't include a patch matching a commit upstream"),
+                           N_("don't include a patch matching a commit upstream")),
                { OPTION_BOOLEAN, 'p', "no-stat", &use_patch_format, NULL,
-                 "show patch format instead of default (patch + stat)",
+                 N_("show patch format instead of default (patch + stat)"),
                  PARSE_OPT_NONEG | PARSE_OPT_NOARG },
-               OPT_GROUP("Messaging"),
-               { OPTION_CALLBACK, 0, "add-header", NULL, "header",
-                           "add email header", 0, header_callback },
-               { OPTION_CALLBACK, 0, "to", NULL, "email", "add To: header",
+               OPT_GROUP(N_("Messaging")),
+               { OPTION_CALLBACK, 0, "add-header", NULL, N_("header"),
+                           N_("add email header"), 0, header_callback },
+               { OPTION_CALLBACK, 0, "to", NULL, N_("email"), N_("add To: header"),
                            0, to_callback },
-               { OPTION_CALLBACK, 0, "cc", NULL, "email", "add Cc: header",
+               { OPTION_CALLBACK, 0, "cc", NULL, N_("email"), N_("add Cc: header"),
                            0, cc_callback },
-               OPT_STRING(0, "in-reply-to", &in_reply_to, "message-id",
-                           "make first mail a reply to <message-id>"),
-               { OPTION_CALLBACK, 0, "attach", &rev, "boundary",
-                           "attach the patch", PARSE_OPT_OPTARG,
+               OPT_STRING(0, "in-reply-to", &in_reply_to, N_("message-id"),
+                           N_("make first mail a reply to <message-id>")),
+               { OPTION_CALLBACK, 0, "attach", &rev, N_("boundary"),
+                           N_("attach the patch"), PARSE_OPT_OPTARG,
                            attach_callback },
-               { OPTION_CALLBACK, 0, "inline", &rev, "boundary",
-                           "inline the patch",
+               { OPTION_CALLBACK, 0, "inline", &rev, N_("boundary"),
+                           N_("inline the patch"),
                            PARSE_OPT_OPTARG | PARSE_OPT_NONEG,
                            inline_callback },
-               { OPTION_CALLBACK, 0, "thread", &thread, "style",
-                           "enable message threading, styles: shallow, deep",
+               { OPTION_CALLBACK, 0, "thread", &thread, N_("style"),
+                           N_("enable message threading, styles: shallow, deep"),
                            PARSE_OPT_OPTARG, thread_callback },
-               OPT_STRING(0, "signature", &signature, "signature",
-                           "add a signature"),
+               OPT_STRING(0, "signature", &signature, N_("signature"),
+                           N_("add a signature")),
                OPT_BOOLEAN(0, "quiet", &quiet,
-                           "don't print the patch filenames"),
+                           N_("don't print the patch filenames")),
                OPT_END()
        };
  
                        if (hashcmp(o[0].item->sha1, o[1].item->sha1) == 0)
                                return 0;
                }
 -              get_patch_ids(&rev, &ids, prefix);
 +              get_patch_ids(&rev, &ids);
        }
  
        if (!use_stdout)
@@@ -1440,7 -1443,7 +1440,7 @@@ static int add_pending_commit(const cha
  }
  
  static const char * const cherry_usage[] = {
-       "git cherry [-v] [<upstream> [<head> [<limit>]]]",
+       N_("git cherry [-v] [<upstream> [<head> [<limit>]]]"),
        NULL
  };
  
@@@ -1474,7 -1477,7 +1474,7 @@@ int cmd_cherry(int argc, const char **a
  
        struct option options[] = {
                OPT__ABBREV(&abbrev),
-               OPT__VERBOSE(&verbose, "be verbose"),
+               OPT__VERBOSE(&verbose, N_("be verbose")),
                OPT_END()
        };
  
        }
  
        init_revisions(&revs, prefix);
 -      revs.diff = 1;
 -      revs.combine_merges = 0;
 -      revs.ignore_merges = 1;
 -      DIFF_OPT_SET(&revs.diffopt, RECURSIVE);
 +      revs.max_parents = 1;
  
        if (add_pending_commit(head, &revs, 0))
                die(_("Unknown commit %s"), head);
                        return 0;
        }
  
 -      get_patch_ids(&revs, &ids, prefix);
 +      get_patch_ids(&revs, &ids);
  
        if (limit && add_pending_commit(limit, &revs, UNINTERESTING))
                die(_("Unknown commit %s"), limit);
        if (prepare_revision_walk(&revs))
                die(_("revision walk setup failed"));
        while ((commit = get_revision(&revs)) != NULL) {
 -              /* ignore merges */
 -              if (commit->parents && commit->parents->next)
 -                      continue;
 -
                commit_list_insert(commit, &list);
        }
  
diff --combined builtin/merge.c
index e81fde6d79e8896235c4a3901bc303f6094a9e55,e9871ab96bffceaf85714906776395881f2af0f7..0ec8f0d449e505a52166b560f43f30d8c30cfbaf
@@@ -40,9 -40,9 +40,9 @@@ struct strategy 
  };
  
  static const char * const builtin_merge_usage[] = {
-       "git merge [options] [<commit>...]",
-       "git merge [options] <msg> HEAD <commit>",
-       "git merge --abort",
+       N_("git merge [options] [<commit>...]"),
+       N_("git merge [options] <msg> HEAD <commit>"),
+       N_("git merge --abort"),
        NULL
  };
  
@@@ -180,39 -180,39 +180,39 @@@ static int option_parse_n(const struct 
  
  static struct option builtin_merge_options[] = {
        { OPTION_CALLBACK, 'n', NULL, NULL, NULL,
-               "do not show a diffstat at the end of the merge",
+               N_("do not show a diffstat at the end of the merge"),
                PARSE_OPT_NOARG, option_parse_n },
        OPT_BOOLEAN(0, "stat", &show_diffstat,
-               "show a diffstat at the end of the merge"),
-       OPT_BOOLEAN(0, "summary", &show_diffstat, "(synonym to --stat)"),
-       { OPTION_INTEGER, 0, "log", &shortlog_len, "n",
-         "add (at most <n>) entries from shortlog to merge commit message",
+               N_("show a diffstat at the end of the merge")),
+       OPT_BOOLEAN(0, "summary", &show_diffstat, N_("(synonym to --stat)")),
+       { OPTION_INTEGER, 0, "log", &shortlog_len, N_("n"),
+         N_("add (at most <n>) entries from shortlog to merge commit message"),
          PARSE_OPT_OPTARG, NULL, DEFAULT_MERGE_LOG_LEN },
        OPT_BOOLEAN(0, "squash", &squash,
-               "create a single commit instead of doing a merge"),
+               N_("create a single commit instead of doing a merge")),
        OPT_BOOLEAN(0, "commit", &option_commit,
-               "perform a commit if the merge succeeds (default)"),
+               N_("perform a commit if the merge succeeds (default)")),
        OPT_BOOL('e', "edit", &option_edit,
-               "edit message before committing"),
+               N_("edit message before committing")),
        OPT_BOOLEAN(0, "ff", &allow_fast_forward,
-               "allow fast-forward (default)"),
+               N_("allow fast-forward (default)")),
        OPT_BOOLEAN(0, "ff-only", &fast_forward_only,
-               "abort if fast-forward is not possible"),
+               N_("abort if fast-forward is not possible")),
        OPT_RERERE_AUTOUPDATE(&allow_rerere_auto),
-       OPT_CALLBACK('s', "strategy", &use_strategies, "strategy",
-               "merge strategy to use", option_parse_strategy),
-       OPT_CALLBACK('X', "strategy-option", &xopts, "option=value",
-               "option for selected merge strategy", option_parse_x),
-       OPT_CALLBACK('m', "message", &merge_msg, "message",
-               "merge commit message (for a non-fast-forward merge)",
+       OPT_CALLBACK('s', "strategy", &use_strategies, N_("strategy"),
+               N_("merge strategy to use"), option_parse_strategy),
+       OPT_CALLBACK('X', "strategy-option", &xopts, N_("option=value"),
+               N_("option for selected merge strategy"), option_parse_x),
+       OPT_CALLBACK('m', "message", &merge_msg, N_("message"),
+               N_("merge commit message (for a non-fast-forward merge)"),
                option_parse_message),
        OPT__VERBOSITY(&verbosity),
        OPT_BOOLEAN(0, "abort", &abort_current_merge,
-               "abort the current in-progress merge"),
-       OPT_SET_INT(0, "progress", &show_progress, "force progress reporting", 1),
-       { OPTION_STRING, 'S', "gpg-sign", &sign_commit, "key id",
-         "GPG sign commit", PARSE_OPT_OPTARG, NULL, (intptr_t) "" },
-       OPT_BOOLEAN(0, "overwrite-ignore", &overwrite_ignore, "update ignored files (default)"),
+               N_("abort the current in-progress merge")),
+       OPT_SET_INT(0, "progress", &show_progress, N_("force progress reporting"), 1),
+       { OPTION_STRING, 'S', "gpg-sign", &sign_commit, N_("key id"),
+         N_("GPG sign commit"), PARSE_OPT_OPTARG, NULL, (intptr_t) "" },
+       OPT_BOOLEAN(0, "overwrite-ignore", &overwrite_ignore, N_("update ignored files (default)")),
        OPT_END()
  };
  
@@@ -404,7 -404,8 +404,7 @@@ static void finish(struct commit *head_
                opts.output_format |=
                        DIFF_FORMAT_SUMMARY | DIFF_FORMAT_DIFFSTAT;
                opts.detect_rename = DIFF_DETECT_RENAME;
 -              if (diff_setup_done(&opts) < 0)
 -                      die(_("diff_setup_done failed"));
 +              diff_setup_done(&opts);
                diff_tree_sha1(head, new_head, "", &opts);
                diffcore_std(&opts);
                diff_flush(&opts);
diff --combined builtin/prune.c
index 6cb99443c1a1773b6a8207dfbcc6d1e053e70ce4,a9e2241a0260fd93717c5c28fcc4056f9dc729ed..9a03d24dadaaba8bc1fc0c778dbfe33b1651607e
@@@ -9,7 -9,7 +9,7 @@@
  #include "dir.h"
  
  static const char * const prune_usage[] = {
-       "git prune [-n] [-v] [--expire <time>] [--] [<head>...]",
+       N_("git prune [-n] [-v] [--expire <time>] [--] [<head>...]"),
        NULL
  };
  static int show_only;
@@@ -25,8 -25,7 +25,8 @@@ static int prune_tmp_object(const char 
                return error("Could not stat '%s'", fullpath);
        if (st.st_mtime > expire)
                return 0;
 -      printf("Removing stale temporary file %s\n", fullpath);
 +      if (show_only || verbose)
 +              printf("Removing stale temporary file %s\n", fullpath);
        if (!show_only)
                unlink_or_warn(fullpath);
        return 0;
@@@ -129,11 -128,11 +129,11 @@@ int cmd_prune(int argc, const char **ar
        struct rev_info revs;
        struct progress *progress = NULL;
        const struct option options[] = {
-               OPT__DRY_RUN(&show_only, "do not remove, show only"),
-               OPT__VERBOSE(&verbose, "report pruned objects"),
-               OPT_BOOL(0, "progress", &show_progress, "show progress"),
+               OPT__DRY_RUN(&show_only, N_("do not remove, show only")),
+               OPT__VERBOSE(&verbose, N_("report pruned objects")),
+               OPT_BOOL(0, "progress", &show_progress, N_("show progress")),
                OPT_DATE(0, "expire", &expire,
-                        "expire objects older than <time>"),
+                        N_("expire objects older than <time>")),
                OPT_END()
        };
        char *s;
diff --combined builtin/push.c
index 9ed558485babb4194729a97320e62402af8481bd,8686a7a7776652feaf16444fb3e4651393714db0..db9ba30b08c221ac2290b1ffc939713fe378e666
@@@ -11,7 -11,7 +11,7 @@@
  #include "submodule.h"
  
  static const char * const push_usage[] = {
-       "git push [<options>] [<repository> [<refspec>...]]",
+       N_("git push [<options>] [<repository> [<refspec>...]]"),
        NULL,
  };
  
@@@ -147,37 -147,12 +147,37 @@@ static void setup_push_upstream(struct 
        add_refspec(refspec.buf);
  }
  
 +static char warn_unspecified_push_default_msg[] =
 +N_("push.default is unset; its implicit value is changing in\n"
 +   "Git 2.0 from 'matching' to 'simple'. To squelch this message\n"
 +   "and maintain the current behavior after the default changes, use:\n"
 +   "\n"
 +   "  git config --global push.default matching\n"
 +   "\n"
 +   "To squelch this message and adopt the new behavior now, use:\n"
 +   "\n"
 +   "  git config --global push.default simple\n"
 +   "\n"
 +   "See 'git help config' and search for 'push.default' for further information.\n"
 +   "(the 'simple' mode was introduced in Git 1.7.11. Use the similar mode\n"
 +   "'current' instead of 'simple' if you sometimes use older versions of Git)");
 +
 +static void warn_unspecified_push_default_configuration(void)
 +{
 +      static int warn_once;
 +
 +      if (warn_once++)
 +              return;
 +      warning("%s\n", _(warn_unspecified_push_default_msg));
 +}
 +
  static void setup_default_push_refspecs(struct remote *remote)
  {
        switch (push_default) {
        default:
        case PUSH_DEFAULT_UNSPECIFIED:
                default_matching_used = 1;
 +              warn_unspecified_push_default_configuration();
                /* fallthru */
        case PUSH_DEFAULT_MATCHING:
                add_refspec(":");
@@@ -211,8 -186,8 +211,8 @@@ static const char message_advice_pull_b
  static const char message_advice_use_upstream[] =
        N_("Updates were rejected because a pushed branch tip is behind its remote\n"
           "counterpart. If you did not intend to push that branch, you may want to\n"
 -         "specify branches to push or set the 'push.default' configuration\n"
 -         "variable to 'current' or 'upstream' to push only the current branch.");
 +         "specify branches to push or set the 'push.default' configuration variable\n"
 +         "to 'simple', 'current' or 'upstream' to push only the current branch.");
  
  static const char message_advice_checkout_pull_push[] =
        N_("Updates were rejected because a pushed branch tip is behind its remote\n"
@@@ -379,25 -354,25 +379,25 @@@ int cmd_push(int argc, const char **arg
        const char *repo = NULL;        /* default repository */
        struct option options[] = {
                OPT__VERBOSITY(&verbosity),
-               OPT_STRING( 0 , "repo", &repo, "repository", "repository"),
-               OPT_BIT( 0 , "all", &flags, "push all refs", TRANSPORT_PUSH_ALL),
-               OPT_BIT( 0 , "mirror", &flags, "mirror all refs",
+               OPT_STRING( 0 , "repo", &repo, N_("repository"), N_("repository")),
+               OPT_BIT( 0 , "all", &flags, N_("push all refs"), TRANSPORT_PUSH_ALL),
+               OPT_BIT( 0 , "mirror", &flags, N_("mirror all refs"),
                            (TRANSPORT_PUSH_MIRROR|TRANSPORT_PUSH_FORCE)),
-               OPT_BOOLEAN( 0, "delete", &deleterefs, "delete refs"),
-               OPT_BOOLEAN( 0 , "tags", &tags, "push tags (can't be used with --all or --mirror)"),
-               OPT_BIT('n' , "dry-run", &flags, "dry run", TRANSPORT_PUSH_DRY_RUN),
-               OPT_BIT( 0,  "porcelain", &flags, "machine-readable output", TRANSPORT_PUSH_PORCELAIN),
-               OPT_BIT('f', "force", &flags, "force updates", TRANSPORT_PUSH_FORCE),
-               { OPTION_CALLBACK, 0, "recurse-submodules", &flags, "check",
-                       "controls recursive pushing of submodules",
+               OPT_BOOLEAN( 0, "delete", &deleterefs, N_("delete refs")),
+               OPT_BOOLEAN( 0 , "tags", &tags, N_("push tags (can't be used with --all or --mirror)")),
+               OPT_BIT('n' , "dry-run", &flags, N_("dry run"), TRANSPORT_PUSH_DRY_RUN),
+               OPT_BIT( 0,  "porcelain", &flags, N_("machine-readable output"), TRANSPORT_PUSH_PORCELAIN),
+               OPT_BIT('f', "force", &flags, N_("force updates"), TRANSPORT_PUSH_FORCE),
+               { OPTION_CALLBACK, 0, "recurse-submodules", &flags, N_("check"),
+                       N_("control recursive pushing of submodules"),
                        PARSE_OPT_OPTARG, option_parse_recurse_submodules },
-               OPT_BOOLEAN( 0 , "thin", &thin, "use thin pack"),
-               OPT_STRING( 0 , "receive-pack", &receivepack, "receive-pack", "receive pack program"),
-               OPT_STRING( 0 , "exec", &receivepack, "receive-pack", "receive pack program"),
-               OPT_BIT('u', "set-upstream", &flags, "set upstream for git pull/status",
+               OPT_BOOLEAN( 0 , "thin", &thin, N_("use thin pack")),
+               OPT_STRING( 0 , "receive-pack", &receivepack, "receive-pack", N_("receive pack program")),
+               OPT_STRING( 0 , "exec", &receivepack, "receive-pack", N_("receive pack program")),
+               OPT_BIT('u', "set-upstream", &flags, N_("set upstream for git pull/status"),
                        TRANSPORT_PUSH_SET_UPSTREAM),
-               OPT_BOOL(0, "progress", &progress, "force progress reporting"),
-               OPT_BIT(0, "prune", &flags, "prune locally removed refs",
+               OPT_BOOL(0, "progress", &progress, N_("force progress reporting")),
+               OPT_BIT(0, "prune", &flags, N_("prune locally removed refs"),
                        TRANSPORT_PUSH_PRUNE),
                OPT_END()
        };
diff --combined builtin/revert.c
index 5652f238447088857150c683c23fed867e5c0117,02ca95f4feeb4fe2ae90de2c9dfca9e9ee9970c3..17dc8c8d1e837ceac780b0de8e3b3921e1329894
   */
  
  static const char * const revert_usage[] = {
-       "git revert [options] <commit-ish>",
-       "git revert <subcommand>",
+       N_("git revert [options] <commit-ish>"),
+       N_("git revert <subcommand>"),
        NULL
  };
  
  static const char * const cherry_pick_usage[] = {
-       "git cherry-pick [options] <commit-ish>",
-       "git cherry-pick <subcommand>",
+       N_("git cherry-pick [options] <commit-ish>"),
+       N_("git cherry-pick <subcommand>"),
        NULL
  };
  
@@@ -100,33 -100,31 +100,33 @@@ static void parse_args(int argc, const 
        int contin = 0;
        int rollback = 0;
        struct option options[] = {
-               OPT_BOOLEAN(0, "quit", &remove_state, "end revert or cherry-pick sequence"),
-               OPT_BOOLEAN(0, "continue", &contin, "resume revert or cherry-pick sequence"),
-               OPT_BOOLEAN(0, "abort", &rollback, "cancel revert or cherry-pick sequence"),
-               OPT_BOOLEAN('n', "no-commit", &opts->no_commit, "don't automatically commit"),
-               OPT_BOOLEAN('e', "edit", &opts->edit, "edit the commit message"),
+               OPT_BOOLEAN(0, "quit", &remove_state, N_("end revert or cherry-pick sequence")),
+               OPT_BOOLEAN(0, "continue", &contin, N_("resume revert or cherry-pick sequence")),
+               OPT_BOOLEAN(0, "abort", &rollback, N_("cancel revert or cherry-pick sequence")),
+               OPT_BOOLEAN('n', "no-commit", &opts->no_commit, N_("don't automatically commit")),
+               OPT_BOOLEAN('e', "edit", &opts->edit, N_("edit the commit message")),
                OPT_NOOP_NOARG('r', NULL),
-               OPT_BOOLEAN('s', "signoff", &opts->signoff, "add Signed-off-by:"),
-               OPT_INTEGER('m', "mainline", &opts->mainline, "parent number"),
+               OPT_BOOLEAN('s', "signoff", &opts->signoff, N_("add Signed-off-by:")),
+               OPT_INTEGER('m', "mainline", &opts->mainline, N_("parent number")),
                OPT_RERERE_AUTOUPDATE(&opts->allow_rerere_auto),
-               OPT_STRING(0, "strategy", &opts->strategy, "strategy", "merge strategy"),
-               OPT_CALLBACK('X', "strategy-option", &opts, "option",
-                       "option for merge strategy", option_parse_x),
+               OPT_STRING(0, "strategy", &opts->strategy, N_("strategy"), N_("merge strategy")),
+               OPT_CALLBACK('X', "strategy-option", &opts, N_("option"),
+                       N_("option for merge strategy"), option_parse_x),
                OPT_END(),
                OPT_END(),
                OPT_END(),
                OPT_END(),
                OPT_END(),
 +              OPT_END(),
        };
  
        if (opts->action == REPLAY_PICK) {
                struct option cp_extra[] = {
-                       OPT_BOOLEAN('x', NULL, &opts->record_origin, "append commit name"),
-                       OPT_BOOLEAN(0, "ff", &opts->allow_ff, "allow fast-forward"),
-                       OPT_BOOLEAN(0, "allow-empty", &opts->allow_empty, "preserve initially empty commits"),
-                       OPT_BOOLEAN(0, "allow-empty-message", &opts->allow_empty_message, "allow commits with empty messages"),
-                       OPT_BOOLEAN(0, "keep-redundant-commits", &opts->keep_redundant_commits, "keep redundant, empty commits"),
+                       OPT_BOOLEAN('x', NULL, &opts->record_origin, N_("append commit name")),
+                       OPT_BOOLEAN(0, "ff", &opts->allow_ff, N_("allow fast-forward")),
+                       OPT_BOOLEAN(0, "allow-empty", &opts->allow_empty, N_("preserve initially empty commits")),
++                      OPT_BOOLEAN(0, "allow-empty-message", &opts->allow_empty_message, N_("allow commits with empty messages")),
+                       OPT_BOOLEAN(0, "keep-redundant-commits", &opts->keep_redundant_commits, N_("keep redundant, empty commits")),
                        OPT_END(),
                };
                if (parse_options_concat(options, ARRAY_SIZE(options), cp_extra))