1. 26 10月, 2016 3 次提交
    • L
      read-cache: make sure file handles are not inherited by child processes · a0a6cb96
      Lars Schneider 提交于
      This fixes "convert: add filter.<driver>.process option" (edcc8581) on
      Windows.
      
      Consider the case of a file that requires filtering and is present in
      branch A but not in branch B. If A is the current HEAD and we checkout B
      then the following happens:
      
      1. ce_compare_data() opens the file
      2.   index_fd() detects that the file requires to run a clean filter and
           calls index_stream_convert_blob()
      4.     index_stream_convert_blob() calls convert_to_git_filter_fd()
      5.       convert_to_git_filter_fd() calls apply_filter() which creates a
               new long running filter process (in case it is the first file
               of this kind to be filtered)
      6.       The new filter process inherits all file handles. This is the
               default on Linux/OSX and is explicitly defined in the
               `CreateProcessW` call in `mingw.c` on Windows.
      7. ce_compare_data() closes the file
      8. Git unlinks the file as it is not present in B
      
      The unlink operation does not work on Windows because the filter process
      has still an open handle to the file. On Linux/OSX the unlink operation
      succeeds but the file descriptors still leak into the child process.
      
      Fix this problem by opening files in read-cache with the O_CLOEXEC flag
      to ensure that the file descriptor does not remain open in a newly
      spawned process similar to 05d1ed61 ("mingw: ensure temporary file
      handles are not inherited by child processes", 2016-08-22).
      Signed-off-by: NLars Schneider <larsxschneider@gmail.com>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      a0a6cb96
    • L
      sha1_file: open window into packfiles with O_CLOEXEC · cd66ada0
      Lars Schneider 提交于
      All processes that the Git main process spawns inherit the open file
      descriptors of the main process. These leaked file descriptors can
      cause problems.
      
      Use the O_CLOEXEC flag similar to 05d1ed61 to fix the leaked file
      descriptors.
      Signed-off-by: NLars Schneider <larsxschneider@gmail.com>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      cd66ada0
    • L
      sha1_file: rename git_open_noatime() to git_open() · a5436b57
      Lars Schneider 提交于
      This function is meant to be used when reading from files in the
      object store, and the original objective was to avoid smudging atime
      of loose object files too often, hence its name.  Because we'll be
      extending its role in the next commit to also arrange the file
      descriptors they return auto-closed in the child processes, rename
      it to lose "noatime" part that is too specific.
      Signed-off-by: NLars Schneider <larsxschneider@gmail.com>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      a5436b57
  2. 18 10月, 2016 4 次提交
    • J
      Merge branch 'jk/alt-odb-cleanup' · dec04019
      Junio C Hamano 提交于
      Codepaths involved in interacting alternate object store have
      been cleaned up.
      
      * jk/alt-odb-cleanup:
        alternates: use fspathcmp to detect duplicates
        sha1_file: always allow relative paths to alternates
        count-objects: report alternates via verbose mode
        fill_sha1_file: write into a strbuf
        alternates: store scratch buffer as strbuf
        fill_sha1_file: write "boring" characters
        alternates: use a separate scratch space
        alternates: encapsulate alt->base munging
        alternates: provide helper for allocating alternate
        alternates: provide helper for adding to alternates list
        link_alt_odb_entry: refactor string handling
        link_alt_odb_entry: handle normalize_path errors
        t5613: clarify "too deep" recursion tests
        t5613: do not chdir in main process
        t5613: whitespace/style cleanups
        t5613: use test_must_fail
        t5613: drop test_valid_repo function
        t5613: drop reachable_via function
      dec04019
    • J
      Merge branch 'nd/commit-p-doc' · af9a70c8
      Junio C Hamano 提交于
      Documentation for "git commit" was updated to clarify that "commit
      -p <paths>" adds to the current contents of the index to come up
      with what to commit.
      
      * nd/commit-p-doc:
        git-commit.txt: clarify --patch mode with pathspec
      af9a70c8
    • J
      Merge branch 'jk/clone-copy-alternates-fix' · 630e05c4
      Junio C Hamano 提交于
      "git clone" of a local repository can be done at the filesystem
      level, but the codepath did not check errors while copying and
      adjusting the file that lists alternate object stores.
      
      * jk/clone-copy-alternates-fix:
        clone: detect errors in normalize_path_copy
      630e05c4
    • J
      Merge branch 'dt/http-empty-auth' · c6400bf8
      Junio C Hamano 提交于
      http.emptyauth configuration is a way to allow an empty username to
      pass when attempting to authenticate using mechanisms like
      Kerberos.  We took an unspecified (NULL) username and sent ":"
      (i.e. no username, no password) to CURLOPT_USERPWD, but did not do
      the same when the username is explicitly set to an empty string.
      
      * dt/http-empty-auth:
        http: http.emptyauth should allow empty (not just NULL) usernames
      c6400bf8
  3. 12 10月, 2016 13 次提交
    • J
      Sync with maint · 3cdd5d19
      Junio C Hamano 提交于
      * maint:
        Start preparing for 2.10.2
      3cdd5d19
    • J
      Start preparing for 2.10.2 · 74eeaf7b
      Junio C Hamano 提交于
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      74eeaf7b
    • J
      Merge branch 'jk/verify-packfile-gently' into maint · 6823506f
      Junio C Hamano 提交于
      A low-level function verify_packfile() was meant to show errors
      that were detected without dying itself, but under some conditions
      it didn't and died instead, which has been fixed.
      
      * jk/verify-packfile-gently:
        verify_packfile: check pack validity before accessing data
      6823506f
    • J
      Merge branch 'jc/worktree-config' into maint · fdb70b16
      Junio C Hamano 提交于
      "git worktree", even though it used the default_abbrev setting that
      ought to be affected by core.abbrev configuration variable, ignored
      the variable setting.  The command has been taught to read the
      default set of configuration variables to correct this.
      
      * jc/worktree-config:
        worktree: honor configuration variables
      fdb70b16
    • J
      Merge branch 'jc/verify-loose-object-header' into maint · f7f0a87e
      Junio C Hamano 提交于
      Codepaths that read from an on-disk loose object were too loose in
      validating what they are reading is a proper object file and
      sometimes read past the data they read from the disk, which has
      been corrected.  H/t to Gustavo Grieco for reporting.
      
      * jc/verify-loose-object-header:
        unpack_sha1_header(): detect malformed object header
        streaming: make sure to notice corrupt object
      f7f0a87e
    • J
      Merge branch 'rs/git-gui-use-modern-git-merge-syntax' into maint · 0bc409da
      Junio C Hamano 提交于
      The original command line syntax for "git merge", which was "git
      merge <msg> HEAD <parent>...", has been deprecated for quite some
      time, and "git gui" was the last in-tree user of the syntax.  This
      is finally fixed, so that we can move forward with the deprecation.
      
      * rs/git-gui-use-modern-git-merge-syntax:
        git-gui: stop using deprecated merge syntax
      0bc409da
    • J
      Merge branch 'kd/mailinfo-quoted-string' into maint · e1eb84cc
      Junio C Hamano 提交于
      An author name, that spelled a backslash-quoted double quote in the
      human readable part "My \"double quoted\" name", was not unquoted
      correctly while applying a patch from a piece of e-mail.
      
      * kd/mailinfo-quoted-string:
        mailinfo: unescape quoted-pair in header fields
        t5100-mailinfo: replace common path prefix with variable
      e1eb84cc
    • J
      Merge branch 'pb/rev-list-reverse-with-count' into maint · 54a9f147
      Junio C Hamano 提交于
      Doc update to clarify what "log -3 --reverse" does.
      
      * pb/rev-list-reverse-with-count:
        rev-list-options: clarify the usage of --reverse
      54a9f147
    • J
      Merge branch 'jc/blame-abbrev' into maint · 9534df98
      Junio C Hamano 提交于
      Almost everybody uses DEFAULT_ABBREV to refer to the default
      setting for the abbreviation, but "git blame" peeked into
      underlying variable bypassing the macro for no good reason.
      
      * jc/blame-abbrev:
        blame: use DEFAULT_ABBREV macro
      9534df98
    • J
      Merge branch 'jk/graph-padding-fix' into maint · 18fd96f1
      Junio C Hamano 提交于
      The "graph" API used in "git log --graph" miscounted the number of
      output columns consumed so far when drawing a padding line, which
      has been fixed; this did not affect any existing code as nobody
      tried to write anything after the padding on such a line, though.
      
      * jk/graph-padding-fix:
        graph: fix extra spaces in graph_padding_line
      18fd96f1
    • J
      Merge branch 'sg/ref-filter-parse-optim' into maint · 1f253d88
      Junio C Hamano 提交于
      The code that parses the format parameter of for-each-ref command
      has seen a micro-optimization.
      
      * sg/ref-filter-parse-optim:
        ref-filter: strip format option after a field name only once while parsing
      1f253d88
    • J
      Merge branch 'rs/copy-array' into maint · a813b191
      Junio C Hamano 提交于
      Code cleanup.
      
      * rs/copy-array:
        use COPY_ARRAY
        add COPY_ARRAY
      a813b191
    • J
      Merge branch 'dt/mailinfo' into maint · f7e2e592
      Junio C Hamano 提交于
      * dt/mailinfo:
        add David Turner's Two Sigma address
      f7e2e592
  4. 11 10月, 2016 20 次提交
    • J
      Ninth batch for 2.11 · 8a36cd87
      Junio C Hamano 提交于
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      8a36cd87
    • J
      Merge branch 'jc/blame-reverse' · 1172e16a
      Junio C Hamano 提交于
      It is a common mistake to say "git blame --reverse OLD path",
      expecting that the command line is dwimmed as if asking how lines
      in path in an old revision OLD have survived up to the current
      commit.
      
      * jc/blame-reverse:
        blame: dwim "blame --reverse OLD" as "blame --reverse OLD.."
        blame: improve diagnosis for "--reverse NEW"
      1172e16a
    • J
      Merge branch 'nd/shallow-deepen' · a460ea4a
      Junio C Hamano 提交于
      The existing "git fetch --depth=<n>" option was hard to use
      correctly when making the history of an existing shallow clone
      deeper.  A new option, "--deepen=<n>", has been added to make this
      easier to use.  "git clone" also learned "--shallow-since=<date>"
      and "--shallow-exclude=<tag>" options to make it easier to specify
      "I am interested only in the recent N months worth of history" and
      "Give me only the history since that version".
      
      * nd/shallow-deepen: (27 commits)
        fetch, upload-pack: --deepen=N extends shallow boundary by N commits
        upload-pack: add get_reachable_list()
        upload-pack: split check_unreachable() in two, prep for get_reachable_list()
        t5500, t5539: tests for shallow depth excluding a ref
        clone: define shallow clone boundary with --shallow-exclude
        fetch: define shallow boundary with --shallow-exclude
        upload-pack: support define shallow boundary by excluding revisions
        refs: add expand_ref()
        t5500, t5539: tests for shallow depth since a specific date
        clone: define shallow clone boundary based on time with --shallow-since
        fetch: define shallow boundary with --shallow-since
        upload-pack: add deepen-since to cut shallow repos based on time
        shallow.c: implement a generic shallow boundary finder based on rev-list
        fetch-pack: use a separate flag for fetch in deepening mode
        fetch-pack.c: mark strings for translating
        fetch-pack: use a common function for verbose printing
        fetch-pack: use skip_prefix() instead of starts_with()
        upload-pack: move rev-list code out of check_non_tip()
        upload-pack: make check_non_tip() clean things up on error
        upload-pack: tighten number parsing at "deepen" lines
        ...
      a460ea4a
    • J
      Merge branch 'cp/completion-negative-refs' · a229a30f
      Junio C Hamano 提交于
      The command-line completion script (in contrib/) learned to
      complete "git cmd ^mas<HT>" to complete the negative end of
      reference to "git cmd ^master".
      
      * cp/completion-negative-refs:
        completion: support excluding refs
      a229a30f
    • J
      Merge branch 'dp/autoconf-curl-ssl' · 667c6d59
      Junio C Hamano 提交于
      The ./configure script generated from configure.ac was taught how
      to detect support of SSL by libcurl better.
      
      * dp/autoconf-curl-ssl:
        ./configure.ac: detect SSL in libcurl using curl-config
      667c6d59
    • J
      Merge branch 'ak/curl-imap-send-explicit-scheme' · 6d6321af
      Junio C Hamano 提交于
      When we started cURL to talk to imap server when a new enough
      version of cURL library is available, we forgot to explicitly add
      imap(s):// before the destination.  To some folks, that didn't work
      and the library tried to make HTTP(s) requests instead.
      
      * ak/curl-imap-send-explicit-scheme:
        imap-send: Tell cURL to use imap:// or imaps://
      6d6321af
    • J
      Merge branch 'jk/pack-objects-optim-mru' · e6e24c94
      Junio C Hamano 提交于
      "git pack-objects" in a repository with many packfiles used to
      spend a lot of time looking for/at objects in them; the accesses to
      the packfiles are now optimized by checking the most-recently-used
      packfile first.
      
      * jk/pack-objects-optim-mru:
        pack-objects: use mru list when iterating over packs
        pack-objects: break delta cycles before delta-search phase
        sha1_file: make packed_object_info public
        provide an initializer for "struct object_info"
      e6e24c94
    • J
      Merge branch 'rs/qsort' · b8688adb
      Junio C Hamano 提交于
      We call "qsort(array, nelem, sizeof(array[0]), fn)", and most of
      the time third parameter is redundant.  A new QSORT() macro lets us
      omit it.
      
      * rs/qsort:
        show-branch: use QSORT
        use QSORT, part 2
        coccicheck: use --all-includes by default
        remove unnecessary check before QSORT
        use QSORT
        add QSORT
      b8688adb
    • J
      alternates: use fspathcmp to detect duplicates · ea0fc3b4
      Jeff King 提交于
      On a case-insensitive filesystem, we should realize that
      "a/objects" and "A/objects" are the same path. We already
      use fspathcmp() to check against the main object directory,
      but until recently we couldn't use it for comparing against
      other alternates (because their paths were not
      NUL-terminated strings). But now we can, so let's do so.
      
      Note that we also need to adjust count-objects to load the
      config, so that it can see the setting of core.ignorecase
      (this is required by the test, but is also a general bugfix
      for users of count-objects).
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      ea0fc3b4
    • J
      sha1_file: always allow relative paths to alternates · 087b6d58
      Jeff King 提交于
      We recursively expand alternates repositories, so that if A
      borrows from B which borrows from C, A can see all objects.
      
      For the root object database, we allow relative paths, so A
      can point to B as "../B/objects". However, we currently do
      not allow relative paths when recursing, so B must use an
      absolute path to reach C.
      
      That is an ancient protection from c2f493a4 (Transitively
      read alternatives, 2006-05-07) that tries to avoid adding
      the same alternate through two different paths. Since
      5bdf0a84 (sha1_file: normalize alt_odb path before comparing
      and storing, 2011-09-07), we use a normalized absolute path
      for each alt_odb entry.
      
      This means that in most cases the protection is no longer
      necessary; we will detect the duplicate no matter how we got
      there (but see below).  And it's a good idea to get rid of
      it, as it creates an unnecessary complication when setting
      up recursive alternates (B has to know that A is going to
      borrow from it and make sure to use an absolute path).
      
      Note that our normalization doesn't actually look at the
      filesystem, so it can still be fooled by crossing symbolic
      links. But that's also true of absolute paths, so it's not a
      good reason to disallow only relative paths (it's
      potentially a reason to switch to real_path(), but that's a
      separate and non-trivial change).
      
      We adjust the test script here to demonstrate that this now
      works, and add new tests to show that the normalization does
      indeed suppress duplicates.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      087b6d58
    • J
      count-objects: report alternates via verbose mode · 5fe849d6
      Jeff King 提交于
      There's no way to get the list of alternates that git
      computes internally; our tests only infer it based on which
      objects are available. In addition to testing, knowing this
      list may be helpful for somebody debugging their alternates
      setup.
      
      Let's add it to the "count-objects -v" output. We could give
      it a separate flag, but there's not really any need.
      "count-objects -v" is already a debugging catch-all for the
      object database, its output is easily extensible to new data
      items, and printing the alternates is not expensive (we
      already had to find them to count the objects).
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      5fe849d6
    • J
      fill_sha1_file: write into a strbuf · f7b7774f
      Jeff King 提交于
      It's currently the responsibility of the caller to give
      fill_sha1_file() enough bytes to write into, leading them to
      manually compute the required lengths. Instead, let's just
      write into a strbuf so that it's impossible to get this
      wrong.
      
      The alt_odb caller already has a strbuf, so this makes
      things strictly simpler. The other caller, sha1_file_name(),
      uses a static PATH_MAX buffer and dies when it would
      overflow. We can convert this to a static strbuf, which
      means our allocation cost is amortized (and as a bonus, we
      no longer have to worry about PATH_MAX being too short for
      normal use).
      
      This does introduce some small overhead in fill_sha1_file(),
      as each strbuf_addchar() will check whether it needs to
      grow. However, between the optimization in fec501da
      (strbuf_addch: avoid calling strbuf_grow, 2015-04-16) and
      the fact that this is not generally called in a tight loop
      (after all, the next step is typically to access the file!)
      this probably doesn't matter. And even if it did, the right
      place to micro-optimize is inside fill_sha1_file(), by
      calling a single strbuf_grow() there.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      f7b7774f
    • J
      alternates: store scratch buffer as strbuf · 38dbe5f0
      Jeff King 提交于
      We pre-size the scratch buffer to hold a loose object
      filename of the form "xx/yyyy...", which leads to allocation
      code that is hard to verify. We have to use some magic
      numbers during the initial allocation, and then writers must
      blindly assume that the buffer is big enough. Using a strbuf
      makes it more clear that we cannot overflow.
      
      Unfortunately, we do still need some magic numbers to grow
      our strbuf before calling fill_sha1_path(), but the strbuf
      growth is much closer to the point of use. This makes it
      easier to see that it's correct, and opens the possibility
      of pushing it even further down if fill_sha1_path() learns
      to work on strbufs.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      38dbe5f0
    • J
      fill_sha1_file: write "boring" characters · afbba2f0
      Jeff King 提交于
      This function forms a sha1 as "xx/yyyy...", but skips over
      the slot for the slash rather than writing it, leaving it to
      the caller to do so. It also does not bother to put in a
      trailing NUL, even though every caller would want it (we're
      forming a path which by definition is not a directory, so
      the only thing to do with it is feed it to a system call).
      
      Let's make the lives of our callers easier by just writing
      out the internal "/" and the NUL.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      afbba2f0
    • J
      alternates: use a separate scratch space · 597f9134
      Jeff King 提交于
      The alternate_object_database struct uses a single buffer
      both for storing the path to the alternate, and as a scratch
      buffer for forming object names. This is efficient (since
      otherwise we'd end up storing the path twice), but it makes
      life hard for callers who just want to know the path to the
      alternate. They have to remember to stop reading after
      "alt->name - alt->base" bytes, and to subtract one for the
      trailing '/'.
      
      It would be much simpler if they could simply access a
      NUL-terminated path string. We could encapsulate this in a
      function which puts a NUL in the scratch buffer and returns
      the string, but that opens up questions about the lifetime
      of the result. The first time another caller uses the
      alternate, the scratch buffer may get other data tacked onto
      it.
      
      Let's instead just store the root path separately from the
      scratch buffer. There aren't enough alternates being stored
      for the duplicated data to matter for performance, and this
      keeps things simple and safe for the callers.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      597f9134
    • J
      alternates: encapsulate alt->base munging · 29ec6af2
      Jeff King 提交于
      The alternate_object_database struct holds a path to the
      alternate objects, but we also use that buffer as scratch
      space for forming loose object filenames. Let's pull that
      logic into a helper function so that we can more easily
      modify it.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      29ec6af2
    • J
      alternates: provide helper for allocating alternate · 7f0fa2c0
      Jeff King 提交于
      Allocating a struct alternate_object_database is tricky, as
      we must over-allocate the buffer to provide scratch space,
      and then put in particular '/' and NUL markers.
      
      Let's encapsulate this in a function so that the complexity
      doesn't leak into callers (and so that we can modify it
      later).
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      7f0fa2c0
    • J
      alternates: provide helper for adding to alternates list · a5b34d21
      Jeff King 提交于
      The submodule code wants to temporarily add an alternate
      object store to our in-memory alt_odb list, but does it
      manually. Let's provide a helper so it can reuse the code in
      link_alt_odb_entry().
      
      While we're adding our new add_to_alternates_memory(), let's
      document add_to_alternates_file(), as the two are related.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      a5b34d21
    • J
      link_alt_odb_entry: refactor string handling · 4ea82473
      Jeff King 提交于
      The string handling in link_alt_odb_entry() is mostly an
      artifact of the original version, which took the path as a
      ptr/len combo, and did not have a NUL-terminated string
      until we created one in the alternate_object_database
      struct.  But since 5bdf0a84 (sha1_file: normalize alt_odb
      path before comparing and storing, 2011-09-07), the first
      thing we do is put the path into a strbuf, which gives us
      some easy opportunities for cleanup.
      
      In particular:
      
        - we call strlen(pathbuf.buf), which is silly; we can look
          at pathbuf.len.
      
        - even though we have a strbuf, we don't maintain its
          "len" field when chomping extra slashes from the
          end, and instead keep a separate "pfxlen" variable. We
          can fix this and then drop "pfxlen" entirely.
      
        - we don't check whether the path is usable until after we
          allocate the new struct, making extra cleanup work for
          ourselves. Since we have a NUL-terminated string, we can
          bump the "is it usable" checks higher in the function.
          While we're at it, we can move that logic to its own
          helper, which makes the flow of link_alt_odb_entry()
          easier to follow.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      4ea82473
    • J
      link_alt_odb_entry: handle normalize_path errors · 670c359d
      Jeff King 提交于
      When we add a new alternate to the list, we try to normalize
      out any redundant "..", etc. However, we do not look at the
      return value of normalize_path_copy(), and will happily
      continue with a path that could not be normalized. Worse,
      the normalizing process is done in-place, so we are left
      with whatever half-finished working state the normalizing
      function was in.
      
      Fortunately, this cannot cause us to read past the end of
      our buffer, as that working state will always leave the
      NUL from the original path in place. And we do tend to
      notice problems when we check is_directory() on the path.
      But you can see the nonsense that we feed to is_directory
      with an entry like:
      
        this/../../is/../../way/../../too/../../deep/../../to/../../resolve
      
      in your objects/info/alternates, which yields:
      
        error: object directory
        /to/e/deep/too/way//ects/this/../../is/../../way/../../too/../../deep/../../to/../../resolve
        does not exist; check .git/objects/info/alternates.
      
      We can easily fix this just by checking the return value.
      But that makes it hard to generate a good error message,
      since we're normalizing in-place and our input value has
      been overwritten by cruft.
      
      Instead, let's provide a strbuf helper that does an in-place
      normalize, but restores the original contents on error. This
      uses a second buffer under the hood, which is slightly less
      efficient, but this is not a performance-critical code path.
      
      The strbuf helper can also properly set the "len" parameter
      of the strbuf before returning. Just doing:
      
        normalize_path_copy(buf.buf, buf.buf);
      
      will shorten the string, but leave buf.len at the original
      length. That may be confusing to later code which uses the
      strbuf.
      Signed-off-by: NJeff King <peff@peff.net>
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      670c359d