Merge branch 'sb/push-options'
authorJunio C Hamano <gitster@pobox.com>
Wed, 3 Aug 2016 22:10:24 +0000 (15:10 -0700)
committerJunio C Hamano <gitster@pobox.com>
Wed, 3 Aug 2016 22:10:24 +0000 (15:10 -0700)
"git push" learned to accept and pass extra options to the
receiving end so that hooks can read and react to them.

* sb/push-options:
add a test for push options
push: accept push options
receive-pack: implement advertising and receiving push options
push options: {pre,post}-receive hook learns about push options

1  2 
Documentation/config.txt
Documentation/git-push.txt
transport.c
diff --combined Documentation/config.txt
index 8b1aee4b3bbb57e95fd660b57d589742dcd211b3,25b5db1c23a44844589f1da2694cc26e8e02865e..4ae564b48764795e1bfe22d6a75d37c5347d76ca
@@@ -140,7 -140,7 +140,7 @@@ boolean:
         false;; Boolean false can be spelled as `no`, `off`,
                `false`, or `0`.
  +
 -When converting value to the canonical form using '--bool' type
 +When converting value to the canonical form using `--bool` type
  specifier; 'git config' will ensure that the output is "true" or
  "false" (spelled in lowercase).
  
@@@ -150,34 -150,27 +150,34 @@@ integer:
         1024", "by 1024x1024", etc.
  
  color::
 -       The value for a variables that takes a color is a list of
 -       colors (at most two) and attributes (at most one), separated
 -       by spaces.  The colors accepted are `normal`, `black`,
 -       `red`, `green`, `yellow`, `blue`, `magenta`, `cyan` and
 -       `white`; the attributes are `bold`, `dim`, `ul`, `blink` and
 -       `reverse`.  The first color given is the foreground; the
 -       second is the background.  The position of the attribute, if
 -       any, doesn't matter. Attributes may be turned off specifically
 -       by prefixing them with `no` (e.g., `noreverse`, `noul`, etc).
 -+
 -Colors (foreground and background) may also be given as numbers between
 -0 and 255; these use ANSI 256-color mode (but note that not all
 -terminals may support this).  If your terminal supports it, you may also
 -specify 24-bit RGB values as hex, like `#ff0ab3`.
 -+
 -The attributes are meant to be reset at the beginning of each item
 -in the colored output, so setting color.decorate.branch to `black`
 -will paint that branch name in a plain `black`, even if the previous
 -thing on the same output line (e.g. opening parenthesis before the
 -list of branch names in `log --decorate` output) is set to be
 -painted with `bold` or some other attribute.
 +       The value for a variable that takes a color is a list of
 +       colors (at most two, one for foreground and one for background)
 +       and attributes (as many as you want), separated by spaces.
 ++
 +The basic colors accepted are `normal`, `black`, `red`, `green`, `yellow`,
 +`blue`, `magenta`, `cyan` and `white`.  The first color given is the
 +foreground; the second is the background.
 ++
 +Colors may also be given as numbers between 0 and 255; these use ANSI
 +256-color mode (but note that not all terminals may support this).  If
 +your terminal supports it, you may also specify 24-bit RGB values as
 +hex, like `#ff0ab3`.
 ++
 +The accepted attributes are `bold`, `dim`, `ul`, `blink`, `reverse`,
 +`italic`, and `strike` (for crossed-out or "strikethrough" letters).
 +The position of any attributes with respect to the colors
 +(before, after, or in between), doesn't matter. Specific attributes may
 +be turned off by prefixing them with `no` or `no-` (e.g., `noreverse`,
 +`no-ul`, etc).
 ++
 +For git's pre-defined color slots, the attributes are meant to be reset
 +at the beginning of each item in the colored output. So setting
 +`color.decorate.branch` to `black` will paint that branch name in a
 +plain `black`, even if the previous thing on the same output line (e.g.
 +opening parenthesis before the list of branch names in `log --decorate`
 +output) is set to be painted with `bold` or some other attribute.
 +However, custom log formats may do more complicated and layered
 +coloring, and the negated forms may be useful there.
  
  pathname::
        A variable that takes a pathname value can be given a
@@@ -412,11 -405,13 +412,11 @@@ file with mixed line endings would be r
  mechanism.
  
  core.autocrlf::
 -      Setting this variable to "true" is almost the same as setting
 -      the `text` attribute to "auto" on all files except that text
 -      files are not guaranteed to be normalized: files that contain
 -      `CRLF` in the repository will not be touched.  Use this
 -      setting if you want to have `CRLF` line endings in your
 -      working directory even though the repository does not have
 -      normalized line endings.  This variable can be set to 'input',
 +      Setting this variable to "true" is the same as setting
 +      the `text` attribute to "auto" on all files and core.eol to "crlf".
 +      Set to true if you want to have `CRLF` line endings in your
 +      working directory and the repository has LF line endings.
 +      This variable can be set to 'input',
        in which case no output conversion is performed.
  
  core.symlinks::
@@@ -448,13 -443,6 +448,13 @@@ specify that no proxy be used for a giv
  This is useful for excluding servers inside a firewall from
  proxy use, while defaulting to a common proxy for external domains.
  
 +core.sshCommand::
 +      If this variable is set, `git fetch` and `git push` will
 +      use the specified command instead of `ssh` when they need to
 +      connect to a remote system. The command is in the same form as
 +      the `GIT_SSH_COMMAND` environment variable and is overridden
 +      when the environment variable is set.
 +
  core.ignoreStat::
        If true, Git will avoid using lstat() calls to detect if files have
        changed by setting the "assume-unchanged" bit for those tracked files
@@@ -493,7 -481,7 +493,7 @@@ core.worktree:
        If `GIT_COMMON_DIR` environment variable is set, core.worktree
        is ignored and not used for determining the root of working tree.
        This can be overridden by the `GIT_WORK_TREE` environment
 -      variable and the '--work-tree' command-line option.
 +      variable and the `--work-tree` command-line option.
        The value can be an absolute path or relative to the path to
        the .git directory, which is either specified by --git-dir
        or GIT_DIR, or automatically discovered.
@@@ -791,7 -779,7 +791,7 @@@ core.abbrev:
  add.ignoreErrors::
  add.ignore-errors (deprecated)::
        Tells 'git add' to continue adding files when some files cannot be
 -      added due to indexing errors. Equivalent to the '--ignore-errors'
 +      added due to indexing errors. Equivalent to the `--ignore-errors`
        option of linkgit:git-add[1].  `add.ignore-errors` is deprecated,
        as it does not follow the usual naming convention for configuration
        variables.
@@@ -817,9 -805,9 +817,9 @@@ from the original current directory. Se
  
  am.keepcr::
        If true, git-am will call git-mailsplit for patches in mbox format
 -      with parameter '--keep-cr'. In this case git-mailsplit will
 +      with parameter `--keep-cr`. In this case git-mailsplit will
        not remove `\r` from lines ending with `\r\n`. Can be overridden
 -      by giving '--no-keep-cr' from the command line.
 +      by giving `--no-keep-cr` from the command line.
        See linkgit:git-am[1], linkgit:git-mailsplit[1].
  
  am.threeWay::
  
  apply.ignoreWhitespace::
        When set to 'change', tells 'git apply' to ignore changes in
 -      whitespace, in the same way as the '--ignore-space-change'
 +      whitespace, in the same way as the `--ignore-space-change`
        option.
        When set to one of: no, none, never, false tells 'git apply' to
        respect all whitespace differences.
  
  apply.whitespace::
        Tells 'git apply' how to handle whitespaces, in the same way
 -      as the '--whitespace' option. See linkgit:git-apply[1].
 +      as the `--whitespace` option. See linkgit:git-apply[1].
  
  branch.autoSetupMerge::
        Tells 'git branch' and 'git checkout' to set up new branches
@@@ -942,7 -930,7 +942,7 @@@ browser.<tool>.cmd:
  
  browser.<tool>.path::
        Override the path for the given tool that may be used to
 -      browse HTML help (see '-w' option in linkgit:git-help[1]) or a
 +      browse HTML help (see `-w` option in linkgit:git-help[1]) or a
        working repository in gitweb (see linkgit:git-instaweb[1]).
  
  clean.requireForce::
@@@ -1241,11 -1229,6 +1241,11 @@@ fetch.prune:
        If true, fetch will automatically behave as if the `--prune`
        option was given on the command line.  See also `remote.<name>.prune`.
  
 +fetch.output::
 +      Control how ref update status is printed. Valid values are
 +      `full` and `compact`. Default value is `full`. See section
 +      OUTPUT in linkgit:git-fetch[1] for detail.
 +
  format.attach::
        Enable multipart/mixed attachments as the default for
        'format-patch'.  The value can also be a double quoted string
@@@ -1446,9 -1429,9 +1446,9 @@@ gitcvs.logFile:
  
  gitcvs.usecrlfattr::
        If true, the server will look up the end-of-line conversion
 -      attributes for files to determine the '-k' modes to use. If
 +      attributes for files to determine the `-k` modes to use. If
        the attributes force Git to treat a file as text,
 -      the '-k' mode will be left blank so CVS clients will
 +      the `-k` mode will be left blank so CVS clients will
        treat it as text. If they suppress text conversion, the file
        will be set with '-kb' mode, which suppresses any newline munging
        the client might otherwise do. If the attributes do not allow
@@@ -1518,16 -1501,16 +1518,16 @@@ gitweb.snapshot:
        See linkgit:gitweb.conf[5] for description.
  
  grep.lineNumber::
 -      If set to true, enable '-n' option by default.
 +      If set to true, enable `-n` option by default.
  
  grep.patternType::
        Set the default matching behavior. Using a value of 'basic', 'extended',
 -      'fixed', or 'perl' will enable the '--basic-regexp', '--extended-regexp',
 -      '--fixed-strings', or '--perl-regexp' option accordingly, while the
 +      'fixed', or 'perl' will enable the `--basic-regexp`, `--extended-regexp`,
 +      `--fixed-strings`, or `--perl-regexp` option accordingly, while the
        value 'default' will return to the default matching behavior.
  
  grep.extendedRegexp::
 -      If set to true, enable '--extended-regexp' option by default. This
 +      If set to true, enable `--extended-regexp` option by default. This
        option is ignored when the `grep.patternType` option is set to a value
        other than 'default'.
  
@@@ -1984,7 -1967,7 +1984,7 @@@ log.decorate:
        specified, the full ref name (including prefix) will be printed.
        If 'auto' is specified, then if the output is going to a terminal,
        the ref names are shown as if 'short' were given, otherwise no ref
 -      names are shown. This is the same as the '--decorate' option
 +      names are shown. This is the same as the `--decorate` option
        of the `git log`.
  
  log.follow::
@@@ -2367,16 -2350,16 +2367,16 @@@ new default)
  --
  
  push.followTags::
 -      If set to true enable '--follow-tags' option by default.  You
 +      If set to true enable `--follow-tags` option by default.  You
        may override this configuration at time of push by specifying
 -      '--no-follow-tags'.
 +      `--no-follow-tags`.
  
  push.gpgSign::
        May be set to a boolean value, or the string 'if-asked'. A true
 -      value causes all pushes to be GPG signed, as if '--signed' is
 +      value causes all pushes to be GPG signed, as if `--signed` is
        passed to linkgit:git-push[1]. The string 'if-asked' causes
        pushes to be signed if the server supports it, as if
 -      '--signed=if-asked' is passed to 'git push'. A false value may
 +      `--signed=if-asked` is passed to 'git push'. A false value may
        override a value from a lower-priority config file. An explicit
        command-line flag always overrides this config option.
  
@@@ -2399,7 -2382,7 +2399,7 @@@ rebase.stat:
        rebase. False by default.
  
  rebase.autoSquash::
 -      If set to true enable '--autosquash' option by default.
 +      If set to true enable `--autosquash` option by default.
  
  rebase.autoStash::
        When set to true, automatically create a temporary stash
@@@ -2427,8 -2410,13 +2427,13 @@@ rebase.instructionForma
  
  receive.advertiseAtomic::
        By default, git-receive-pack will advertise the atomic push
-       capability to its clients. If you don't want to this capability
-       to be advertised, set this variable to false.
+       capability to its clients. If you don't want to advertise this
+       capability, set this variable to false.
+ receive.advertisePushOptions::
+       By default, git-receive-pack will advertise the push options
+       capability to its clients. If you don't want to advertise this
+       capability, set this variable to false.
  
  receive.autogc::
        By default, git-receive-pack will run "git-gc --auto" after
index 93c3527f0cf6f5bf43344f3cd4939497fd0fb5ef,e960258edf3b7112c107a6b5a4c112ac50711f7b..ec514f6cd5cc0f019b469d91fc6af365ce0a64a9
@@@ -11,7 -11,7 +11,7 @@@ SYNOPSI
  [verse]
  'git push' [--all | --mirror | --tags] [--follow-tags] [--atomic] [-n | --dry-run] [--receive-pack=<git-receive-pack>]
           [--repo=<repository>] [-f | --force] [-d | --delete] [--prune] [-v | --verbose]
-          [-u | --set-upstream]
+          [-u | --set-upstream] [--push-option=<string>]
           [--[no-]signed|--sign=(true|false|if-asked)]
           [--force-with-lease[=<refname>[:<expect>]]]
           [--no-verify] [<repository> [<refspec>...]]
@@@ -156,6 -156,12 +156,12 @@@ already exists on the remote side
        Either all refs are updated, or on error, no refs are updated.
        If the server does not support atomic pushes the push will fail.
  
+ -o::
+ --push-option::
+       Transmit the given string to the server, which passes them to
+       the pre-receive as well as the post-receive hook. The given string
+       must not contain a NUL or LF character.
  --receive-pack=<git-receive-pack>::
  --exec=<git-receive-pack>::
        Path to the 'git-receive-pack' program on the remote
@@@ -275,7 -281,7 +281,7 @@@ origin +master` to force a push to the 
        all submodules that changed in the revisions to be pushed will be
        pushed. If on-demand was not able to push all necessary revisions
        it will also be aborted and exit with non-zero status. A value of
 -      'no' or using '--no-recurse-submodules' can be used to override the
 +      'no' or using `--no-recurse-submodules` can be used to override the
        push.recurseSubmodules configuration variable when no submodule
        recursion is required.
  
diff --combined transport.c
index b233e3ee5e4a22e150f1ba274d825102e711ef9f,0298be17b58fdbe3cdb8abc1091f01ef3444f0a8..4ba48b05960203f9c5ed3360e99382bc945ae7e4
@@@ -59,7 -59,7 +59,7 @@@ static void set_upstreams(struct transp
                                localname + 11, transport->remote->name,
                                remotename);
                else
 -                      printf("Would set upstream of '%s' to '%s' of '%s'\n",
 +                      printf(_("Would set upstream of '%s' to '%s' of '%s'\n"),
                                localname + 11, remotename + 11,
                                transport->remote->name);
        }
@@@ -148,7 -148,7 +148,7 @@@ static int set_git_option(struct git_tr
                        char *end;
                        opts->depth = strtol(value, &end, 0);
                        if (*end)
 -                              die("transport: invalid depth option '%s'", value);
 +                              die(_("transport: invalid depth option '%s'"), value);
                }
                return 0;
        }
@@@ -359,11 -359,8 +359,11 @@@ static void print_ok_ref_status(struct 
  
  static int print_one_push_status(struct ref *ref, const char *dest, int count, int porcelain)
  {
 -      if (!count)
 -              fprintf(porcelain ? stdout : stderr, "To %s\n", dest);
 +      if (!count) {
 +              char *url = transport_anonymize_url(dest);
 +              fprintf(porcelain ? stdout : stderr, "To %s\n", url);
 +              free(url);
 +      }
  
        switch(ref->status) {
        case REF_STATUS_NONE:
@@@ -513,6 -510,7 +513,7 @@@ static int git_transport_push(struct tr
        args.dry_run = !!(flags & TRANSPORT_PUSH_DRY_RUN);
        args.porcelain = !!(flags & TRANSPORT_PUSH_PORCELAIN);
        args.atomic = !!(flags & TRANSPORT_PUSH_ATOMIC);
+       args.push_options = transport->push_options;
        args.url = transport->url;
  
        if (flags & TRANSPORT_PUSH_CERT_ALWAYS)
@@@ -770,19 -768,19 +771,19 @@@ static void die_with_unpushed_submodule
  {
        int i;
  
 -      fprintf(stderr, "The following submodule paths contain changes that can\n"
 -                      "not be found on any remote:\n");
 +      fprintf(stderr, _("The following submodule paths contain changes that can\n"
 +                      "not be found on any remote:\n"));
        for (i = 0; i < needs_pushing->nr; i++)
                printf("  %s\n", needs_pushing->items[i].string);
 -      fprintf(stderr, "\nPlease try\n\n"
 -                      "       git push --recurse-submodules=on-demand\n\n"
 -                      "or cd to the path and use\n\n"
 -                      "       git push\n\n"
 -                      "to push them to a remote.\n\n");
 +      fprintf(stderr, _("\nPlease try\n\n"
 +                        "     git push --recurse-submodules=on-demand\n\n"
 +                        "or cd to the path and use\n\n"
 +                        "     git push\n\n"
 +                        "to push them to a remote.\n\n"));
  
        string_list_clear(needs_pushing, 0);
  
 -      die("Aborting.");
 +      die(_("Aborting."));
  }
  
  static int run_pre_push_hook(struct transport *transport,