Merge branch 'jh/partial-clone'
authorJunio C Hamano <gitster@pobox.com>
Thu, 29 Mar 2018 22:39:59 +0000 (15:39 -0700)
committerJunio C Hamano <gitster@pobox.com>
Thu, 29 Mar 2018 22:39:59 +0000 (15:39 -0700)
Hotfix.

* jh/partial-clone:
upload-pack: disable object filtering when disabled by config
unpack-trees: release oid_array after use in check_updates()

1  2 
Documentation/config.txt
unpack-trees.c
upload-pack.c
diff --combined Documentation/config.txt
index ce9102cea83766be0ae8d2ed2867fd4c587d7a95,7b67afc674b773152def4f97948406a84184dcd6..4e0cff87f62f5d5c320e3dcea03f646416604bca
@@@ -41,13 -41,11 +41,13 @@@ in the section header, like in the exam
  --------
  
  Subsection names are case sensitive and can contain any characters except
 -newline (doublequote `"` and backslash can be included by escaping them
 -as `\"` and `\\`, respectively).  Section headers cannot span multiple
 -lines.  Variables may belong directly to a section or to a given subsection.
 -You can have `[section]` if you have `[section "subsection"]`, but you
 -don't need to.
 +newline and the null byte. Doublequote `"` and backslash can be included
 +by escaping them as `\"` and `\\`, respectively. Backslashes preceding
 +other characters are dropped when reading; for example, `\t` is read as
 +`t` and `\0` is read as `0` Section headers cannot span multiple lines.
 +Variables may belong directly to a section or to a given subsection. You
 +can have `[section]` if you have `[section "subsection"]`, but you don't
 +need to.
  
  There is also a deprecated `[section.subsection]` syntax. With this
  syntax, the subsection name is converted to lower-case and is also
@@@ -353,12 -351,6 +353,12 @@@ advice.*:
        addEmbeddedRepo::
                Advice on what to do when you've accidentally added one
                git repo inside of another.
 +      ignoredHook::
 +              Advice shown if an hook is ignored because the hook is not
 +              set as executable.
 +      waitingForEditor::
 +              Print a message to the terminal whenever Git is waiting for
 +              editor input from the user.
  --
  
  core.fileMode::
@@@ -421,13 -413,6 +421,13 @@@ core.protectNTFS:
        8.3 "short" names.
        Defaults to `true` on Windows, and `false` elsewhere.
  
 +core.fsmonitor::
 +      If set, the value of this variable is used as a command which
 +      will identify all files that may have changed since the
 +      requested date/time. This information is used to speed up git by
 +      avoiding unnecessary processing of files that have not changed.
 +      See the "fsmonitor-watchman" section of linkgit:githooks[5].
 +
  core.trustctime::
        If false, the ctime differences between the index and the
        working tree are ignored; useful when the inode change time
@@@ -964,23 -949,6 +964,23 @@@ apply.whitespace:
        Tells 'git apply' how to handle whitespaces, in the same way
        as the `--whitespace` option. See linkgit:git-apply[1].
  
 +blame.showRoot::
 +      Do not treat root commits as boundaries in linkgit:git-blame[1].
 +      This option defaults to false.
 +
 +blame.blankBoundary::
 +      Show blank commit object name for boundary commits in
 +      linkgit:git-blame[1]. This option defaults to false.
 +
 +blame.showEmail::
 +      Show the author email instead of author name in linkgit:git-blame[1].
 +      This option defaults to false.
 +
 +blame.date::
 +      Specifies the format used to output dates in linkgit:git-blame[1].
 +      If unset the iso format is used. For supported values,
 +      see the discussion of the `--date` option at linkgit:git-log[1].
 +
  branch.autoSetupMerge::
        Tells 'git branch' and 'git checkout' to set up new branches
        so that linkgit:git-pull[1] will appropriately merge from the
@@@ -1398,16 -1366,7 +1398,16 @@@ fetch.unpackLimit:
  
  fetch.prune::
        If true, fetch will automatically behave as if the `--prune`
 -      option was given on the command line.  See also `remote.<name>.prune`.
 +      option was given on the command line.  See also `remote.<name>.prune`
 +      and the PRUNING section of linkgit:git-fetch[1].
 +
 +fetch.pruneTags::
 +      If true, fetch will automatically behave as if the
 +      `refs/tags/*:refs/tags/*` refspec was provided when pruning,
 +      if not set already. This allows for setting both this option
 +      and `fetch.prune` to maintain a 1=1 mapping to upstream
 +      refs. See also `remote.<name>.pruneTags` and the PRUNING
 +      section of linkgit:git-fetch[1].
  
  fetch.output::
        Control how ref update status is printed. Valid values are
@@@ -1979,8 -1938,8 +1979,8 @@@ empty string
  
  http.sslVerify::
        Whether to verify the SSL certificate when fetching or pushing
 -      over HTTPS. Can be overridden by the `GIT_SSL_NO_VERIFY` environment
 -      variable.
 +      over HTTPS. Defaults to true. Can be overridden by the
 +      `GIT_SSL_NO_VERIFY` environment variable.
  
  http.sslCert::
        File containing the SSL certificate when fetching or pushing
@@@ -2122,40 -2081,15 +2122,40 @@@ matched against are those given directl
  visited as a result of a redirection do not participate in matching.
  
  ssh.variant::
 -      Depending on the value of the environment variables `GIT_SSH` or
 -      `GIT_SSH_COMMAND`, or the config setting `core.sshCommand`, Git
 -      auto-detects whether to adjust its command-line parameters for use
 -      with plink or tortoiseplink, as opposed to the default (OpenSSH).
 +      By default, Git determines the command line arguments to use
 +      based on the basename of the configured SSH command (configured
 +      using the environment variable `GIT_SSH` or `GIT_SSH_COMMAND` or
 +      the config setting `core.sshCommand`). If the basename is
 +      unrecognized, Git will attempt to detect support of OpenSSH
 +      options by first invoking the configured SSH command with the
 +      `-G` (print configuration) option and will subsequently use
 +      OpenSSH options (if that is successful) or no options besides
 +      the host and remote command (if it fails).
 ++
 +The config variable `ssh.variant` can be set to override this detection.
 +Valid values are `ssh` (to use OpenSSH options), `plink`, `putty`,
 +`tortoiseplink`, `simple` (no options except the host and remote command).
 +The default auto-detection can be explicitly requested using the value
 +`auto`.  Any other value is treated as `ssh`.  This setting can also be
 +overridden via the environment variable `GIT_SSH_VARIANT`.
 ++
 +The current command-line parameters used for each variant are as
 +follows:
  +
 -The config variable `ssh.variant` can be set to override this auto-detection;
 -valid values are `ssh`, `plink`, `putty` or `tortoiseplink`. Any other value
 -will be treated as normal ssh. This setting can be overridden via the
 -environment variable `GIT_SSH_VARIANT`.
 +--
 +
 +* `ssh` - [-p port] [-4] [-6] [-o option] [username@]host command
 +
 +* `simple` - [username@]host command
 +
 +* `plink` or `putty` - [-P port] [-4] [-6] [username@]host command
 +
 +* `tortoiseplink` - [-P port] [-4] [-6] -batch [username@]host command
 +
 +--
 ++
 +Except for the `simple` variant, command-line parameters are likely to
 +change as git gains new features.
  
  i18n.commitEncoding::
        Character encoding the commit messages are stored in; Git itself
@@@ -2583,23 -2517,6 +2583,23 @@@ The protocol names currently used by gi
      `hg` to allow the `git-remote-hg` helper)
  --
  
 +protocol.version::
 +      Experimental. If set, clients will attempt to communicate with a
 +      server using the specified protocol version.  If unset, no
 +      attempt will be made by the client to communicate using a
 +      particular protocol version, this results in protocol version 0
 +      being used.
 +      Supported versions:
 ++
 +--
 +
 +* `0` - the original wire protocol.
 +
 +* `1` - the original wire protocol with the addition of a version string
 +  in the initial response from the server.
 +
 +--
 +
  pull.ff::
        By default, Git does not create an extra merge commit when merging
        a commit that is a descendant of the current commit. Instead, the
@@@ -2704,35 -2621,6 +2704,35 @@@ push.gpgSign:
        override a value from a lower-priority config file. An explicit
        command-line flag always overrides this config option.
  
 +push.pushOption::
 +      When no `--push-option=<option>` argument is given from the
 +      command line, `git push` behaves as if each <value> of
 +      this variable is given as `--push-option=<value>`.
 ++
 +This is a multi-valued variable, and an empty value can be used in a
 +higher priority configuration file (e.g. `.git/config` in a
 +repository) to clear the values inherited from a lower priority
 +configuration files (e.g. `$HOME/.gitconfig`).
 ++
 +--
 +
 +Example:
 +
 +/etc/gitconfig
 +  push.pushoption = a
 +  push.pushoption = b
 +
 +~/.gitconfig
 +  push.pushoption = c
 +
 +repo/.git/config
 +  push.pushoption =
 +  push.pushoption = b
 +
 +This will result in only b (a and c are cleared).
 +
 +--
 +
  push.recurseSubmodules::
        Make sure all submodule commits used by the revisions to be pushed
        are available on a remote-tracking branch. If the value is 'check'
        is retained. You may override this configuration at time of push by
        specifying '--recurse-submodules=check|on-demand|no'.
  
 -rebase.stat::
 -      Whether to show a diffstat of what changed upstream since the last
 -      rebase. False by default.
 -
 -rebase.autoSquash::
 -      If set to true enable `--autosquash` option by default.
 -
 -rebase.autoStash::
 -      When set to true, automatically create a temporary stash entry
 -      before the operation begins, and apply it after the operation
 -      ends.  This means that you can run rebase on a dirty worktree.
 -      However, use with care: the final stash application after a
 -      successful rebase might result in non-trivial conflicts.
 -      Defaults to false.
 -
 -rebase.missingCommitsCheck::
 -      If set to "warn", git rebase -i will print a warning if some
 -      commits are removed (e.g. a line was deleted), however the
 -      rebase will still proceed. If set to "error", it will print
 -      the previous warning and stop the rebase, 'git rebase
 -      --edit-todo' can then be used to correct the error. If set to
 -      "ignore", no checking is done.
 -      To drop a commit without warning or error, use the `drop`
 -      command in the todo-list.
 -      Defaults to "ignore".
 -
 -rebase.instructionFormat::
 -      A format string, as specified in linkgit:git-log[1], to be used for
 -      the instruction list during an interactive rebase.  The format will automatically
 -      have the long commit hash prepended to the format.
 +include::rebase-config.txt[]
  
  receive.advertiseAtomic::
        By default, git-receive-pack will advertise the atomic push
@@@ -2954,15 -2871,6 +2954,15 @@@ remote.<name>.prune:
        remote (as if the `--prune` option was given on the command line).
        Overrides `fetch.prune` settings, if any.
  
 +remote.<name>.pruneTags::
 +      When set to true, fetching from this remote by default will also
 +      remove any local tags that no longer exist on the remote if pruning
 +      is activated in general via `remote.<name>.prune`, `fetch.prune` or
 +      `--prune`. Overrides `fetch.pruneTags` settings, if any.
 ++
 +See also `remote.<name>.prune` and the PRUNING section of
 +linkgit:git-fetch[1].
 +
  remotes.<group>::
        The list of remotes which are fetched by "git remote update
        <group>".  See linkgit:git-remote[1].
@@@ -3043,7 -2951,6 +3043,7 @@@ sendemail.smtpPass:
  sendemail.suppresscc::
  sendemail.suppressFrom::
  sendemail.to::
 +sendemail.tocmd::
  sendemail.smtpDomain::
  sendemail.smtpServer::
  sendemail.smtpServerPort::
@@@ -3228,8 -3135,7 +3228,8 @@@ submodule.active:
  
  submodule.recurse::
        Specifies if commands recurse into submodules by default. This
 -      applies to all commands that have a `--recurse-submodules` option.
 +      applies to all commands that have a `--recurse-submodules` option,
 +      except `clone`.
        Defaults to false.
  
  submodule.fetchJobs::
@@@ -3364,7 -3270,7 +3364,7 @@@ uploadpack.packObjectsHook:
        stdout.
  
  uploadpack.allowFilter::
-       If this option is set, `upload-pack` will advertise partial
+       If this option is set, `upload-pack` will support partial
        clone and partial fetch object filtering.
  +
  Note that this configuration variable is ignored if it is seen in the
@@@ -3467,13 -3373,3 +3467,13 @@@ web.browser:
        Specify a web browser that may be used by some commands.
        Currently only linkgit:git-instaweb[1] and linkgit:git-help[1]
        may use it.
 +
 +worktree.guessRemote::
 +      With `add`, if no branch argument, and neither of `-b` nor
 +      `-B` nor `--detach` are given, the command defaults to
 +      creating a new branch from HEAD.  If `worktree.guessRemote` is
 +      set to true, `worktree add` tries to find a remote-tracking
 +      branch whose name uniquely matches the new branch name.  If
 +      such a branch exists, it is checked out and set as "upstream"
 +      for the new branch.  If no such match can be found, it falls
 +      back to creating a new branch from the current HEAD.
diff --combined unpack-trees.c
index d5685891a560d2f1a06c937043ceda2c8b9fd9db,2253c910427c7dcb9f1cf7ed282d37a7dd8d8ae9..e73745051e505934b44be216b1d80a6c053c96de
@@@ -14,7 -14,6 +14,7 @@@
  #include "dir.h"
  #include "submodule.h"
  #include "submodule-config.h"
 +#include "fsmonitor.h"
  #include "fetch-object.h"
  
  /*
@@@ -195,10 -194,10 +195,10 @@@ static int do_add_entry(struct unpack_t
  static struct cache_entry *dup_entry(const struct cache_entry *ce)
  {
        unsigned int size = ce_size(ce);
 -      struct cache_entry *new = xmalloc(size);
 +      struct cache_entry *new_entry = xmalloc(size);
  
 -      memcpy(new, ce, size);
 -      return new;
 +      memcpy(new_entry, ce, size);
 +      return new_entry;
  }
  
  static void add_entry(struct unpack_trees_options *o,
@@@ -391,6 -390,7 +391,7 @@@ static int check_updates(struct unpack_
                        fetch_objects(repository_format_partial_clone,
                                      &to_fetch);
                fetch_if_missing = fetch_if_missing_store;
+               oid_array_clear(&to_fetch);
        }
        for (i = 0; i < index->cache_nr; i++) {
                struct cache_entry *ce = index->cache[i];
@@@ -431,7 -431,6 +432,7 @@@ static int apply_sparse_checkout(struc
                ce->ce_flags &= ~CE_SKIP_WORKTREE;
        if (was_skip_worktree != ce_skip_worktree(ce)) {
                ce->ce_flags |= CE_UPDATE_IN_BASE;
 +              mark_fsmonitor_invalid(istate, ce);
                istate->cache_changed |= CE_ENTRY_CHANGED;
        }
  
@@@ -1528,7 -1527,7 +1529,7 @@@ static void invalidate_ce_path(const st
        if (!ce)
                return;
        cache_tree_invalidate_path(o->src_index, ce->name);
 -      untracked_cache_invalidate_path(o->src_index, ce->name);
 +      untracked_cache_invalidate_path(o->src_index, ce->name, 1);
  }
  
  /*
@@@ -1565,15 -1564,15 +1566,15 @@@ static int verify_clean_subdirectory(co
        int cnt = 0;
  
        if (S_ISGITLINK(ce->ce_mode)) {
 -              unsigned char sha1[20];
 -              int sub_head = resolve_gitlink_ref(ce->name, "HEAD", sha1);
 +              struct object_id oid;
 +              int sub_head = resolve_gitlink_ref(ce->name, "HEAD", &oid);
                /*
                 * If we are not going to update the submodule, then
                 * we don't care.
                 */
 -              if (!sub_head && !hashcmp(sha1, ce->oid.hash))
 +              if (!sub_head && !oidcmp(&oid, &ce->oid))
                        return 0;
 -              return verify_clean_submodule(sub_head ? NULL : sha1_to_hex(sha1),
 +              return verify_clean_submodule(sub_head ? NULL : oid_to_hex(&oid),
                                              ce, error_type, o);
        }
  
@@@ -2161,9 -2160,6 +2162,9 @@@ int oneway_merge(const struct cache_ent
                            ie_match_stat(o->src_index, old, &st, CE_MATCH_IGNORE_VALID|CE_MATCH_IGNORE_SKIP_WORKTREE))
                                update |= CE_UPDATE;
                }
 +              if (o->update && S_ISGITLINK(old->ce_mode) &&
 +                  should_update_submodules() && !verify_uptodate(old, o))
 +                      update |= CE_UPDATE;
                add_entry(o, old, update, 0);
                return 0;
        }
diff --combined upload-pack.c
index f51b6cfca9435d6b3b3f5b44b593a7c5cd2b1d3e,7217f3bd816fa0283691856c727a8d8a6b134cf7..4a82602be5d0ab111a805a2f2456f382ae7a7364
@@@ -20,7 -20,6 +20,7 @@@
  #include "parse-options.h"
  #include "argv-array.h"
  #include "prio-queue.h"
 +#include "protocol.h"
  #include "quote.h"
  
  static const char * const upload_pack_usage[] = {
@@@ -69,7 -68,7 +69,7 @@@ static int stateless_rpc
  static const char *pack_objects_hook;
  
  static int filter_capability_requested;
- static int filter_advertise;
+ static int allow_filter;
  static struct list_objects_filter_options filter_options;
  
  static void reset_timeout(void)
@@@ -806,7 -805,7 +806,7 @@@ static void receive_needs(void
                if (skip_prefix(line, "deepen-not ", &arg)) {
                        char *ref = NULL;
                        struct object_id oid;
 -                      if (expand_ref(arg, strlen(arg), oid.hash, &ref) != 1)
 +                      if (expand_ref(arg, strlen(arg), &oid, &ref) != 1)
                                die("git upload-pack: ambiguous deepen-not: %s", line);
                        string_list_append(&deepen_not, ref);
                        free(ref);
                        no_progress = 1;
                if (parse_feature_request(features, "include-tag"))
                        use_include_tag = 1;
-               if (parse_feature_request(features, "filter"))
+               if (allow_filter && parse_feature_request(features, "filter"))
                        filter_capability_requested = 1;
  
                o = parse_object(&oid_buf);
@@@ -976,14 -975,14 +976,14 @@@ static int send_ref(const char *refname
                                     " allow-reachable-sha1-in-want" : "",
                             stateless_rpc ? " no-done" : "",
                             symref_info.buf,
-                            filter_advertise ? " filter" : "",
+                            allow_filter ? " filter" : "",
                             git_user_agent_sanitized());
                strbuf_release(&symref_info);
        } else {
                packet_write_fmt(1, "%s %s\n", oid_to_hex(oid), refname_nons);
        }
        capabilities = NULL;
 -      if (!peel_ref(refname, peeled.hash))
 +      if (!peel_ref(refname, &peeled))
                packet_write_fmt(1, "%s %s^{}\n", oid_to_hex(&peeled), refname_nons);
        return 0;
  }
@@@ -1056,7 -1055,7 +1056,7 @@@ static int upload_pack_config(const cha
                if (!strcmp("uploadpack.packobjectshook", var))
                        return git_config_string(&pack_objects_hook, var, value);
        } else if (!strcmp("uploadpack.allowfilter", var)) {
-               filter_advertise = git_config_bool(var, value);
+               allow_filter = git_config_bool(var, value);
        }
        return parse_hide_refs_config(var, value, "uploadpack");
  }
@@@ -1096,23 -1095,6 +1096,23 @@@ int cmd_main(int argc, const char **arg
                die("'%s' does not appear to be a git repository", dir);
  
        git_config(upload_pack_config, NULL);
 -      upload_pack();
 +
 +      switch (determine_protocol_version_server()) {
 +      case protocol_v1:
 +              /*
 +               * v1 is just the original protocol with a version string,
 +               * so just fall through after writing the version string.
 +               */
 +              if (advertise_refs || !stateless_rpc)
 +                      packet_write_fmt(1, "version 1\n");
 +
 +              /* fallthrough */
 +      case protocol_v0:
 +              upload_pack();
 +              break;
 +      case protocol_unknown_version:
 +              BUG("unknown protocol version");
 +      }
 +
        return 0;
  }