1. 11 May, 2018 2 commits
    • Ævar Arnfjörð Bjarmason's avatar
      get_short_oid: sort ambiguous objects by type, then SHA-1 · 5cc044e0
      Ævar Arnfjörð Bjarmason authored
      Change the output emitted when an ambiguous object is encountered so
      that we show tags first, then commits, followed by trees, and finally
      blobs. Within each type we show objects in hashcmp() order. Before
      this change the objects were only ordered by hashcmp().
      
      The reason for doing this is that the output looks better as a result,
      e.g. the v2.17.0 tag before this change on "git show e8f2" would
      display:
      
          hint: The candidates are:
          hint:   e8f2093055 tree
          hint:   e8f21caf commit 2013-06-24 - bash prompt: print unique detached HEAD abbreviated object name
          hint:   e8f21d02f7 blob
          hint:   e8f21d577c blob
          hint:   e8f25a3a50 tree
          hint:   e8f26250fa commit 2017-02-03 - Merge pull request #996 from jeffhostetler/jeffhostetler/register_rename_src
          hint:   e8f2650052 tag v2.17.0
          hint:   e8f2867228 blob
          hint:   e8f28d537c tree
          hint:   e8f2a35526 blob
          hint:   e8f2bc0c06 commit 2015-05-10 - Documentation: note behavior for multiple remote.url entries
          hint:   e8f2cf6ec0 tree
      
      Now we'll instead show:
      
          hint:   e8f2650052 tag v2.17.0
          hint:   e8f21caf commit 2013-06-24 - bash prompt: print unique detached HEAD abbreviated object name
          hint:   e8f26250fa commit 2017-02-03 - Merge pull request #996 from jeffhostetler/jeffhostetler/register_rename_src
          hint:   e8f2bc0c06 commit 2015-05-10 - Documentation: note behavior for multiple remote.url entries
          hint:   e8f2093055 tree
          hint:   e8f25a3a50 tree
          hint:   e8f28d537c tree
          hint:   e8f2cf6ec0 tree
          hint:   e8f21d02f7 blob
          hint:   e8f21d577c blob
          hint:   e8f2867228 blob
          hint:   e8f2a35526 blob
      
      Since we show the commit data in the output that's nicely aligned once
      we sort by object type. The decision to show tags before commits is
      pretty arbitrary. I don't want to order by object_type since there
      tags come last after blobs, which doesn't make sense if we want to
      show the most important things first.
      
      I could display them after commits, but it's much less likely that
      we'll display a tag, so if there is one it makes sense to show it
      prominently at the top.
      
      A note on the implementation: Derrick rightly pointed out[1] that
      we're bending over backwards here in get_short_oid() to first
      de-duplicate the list, and then emit it, but could simply do it in one
      step.
      
      The reason for that is that oid_array_for_each_unique() doesn't
      actually require that the array be sorted by oid_array_sort(), it just
      needs to be sorted in some order that guarantees that all objects with
      the same ID are adjacent to one another, which (barring a hash
      collision, which'll be someone else's problem) the sort_ambiguous()
      function does.
      
      I agree that would be simpler for this code, and had forgotten why I
      initially wrote it like this[2]. But on further reflection I think
      it's better to do more work here just so we're not underhandedly using
      the oid-array API where we lie about the list being sorted. That would
      break any subsequent use of oid_array_lookup() in subtle ways.
      
      I could get around that by hacking the API itself to support this
      use-case and documenting it, which I did as a WIP patch in [3], but I
      think it's too much code smell just for this one call site. It's
      simpler for the API to just introduce a oid_array_for_each() function
      to eagerly spew out the list without sorting or de-duplication, and
      then do the de-duplication and sorting in two passes.
      
      1. https://public-inbox.org/git/20180501130318.58251-1-dstolee@microsoft.com/
      2. https://public-inbox.org/git/876047ze9v.fsf@evledraar.gmail.com/
      3. https://public-inbox.org/git/874ljrzctc.fsf@evledraar.gmail.com/Helped-by: Derrick Stolee's avatarDerrick Stolee <dstolee@microsoft.com>
      Signed-off-by: Ævar Arnfjörð Bjarmason's avatarÆvar Arnfjörð Bjarmason <avarab@gmail.com>
      Signed-off-by: default avatarJunio C Hamano <gitster@pobox.com>
      5cc044e0
    • Ævar Arnfjörð Bjarmason's avatar
      sha1-array.h: align function arguments · 72486729
      Ævar Arnfjörð Bjarmason authored
      The arguments weren't lined up with the opening parenthesis, after
      910650d2 ("Rename sha1_array to oid_array", 2017-03-31) renamed the
      function.
      Signed-off-by: Ævar Arnfjörð Bjarmason's avatarÆvar Arnfjörð Bjarmason <avarab@gmail.com>
      Signed-off-by: default avatarJunio C Hamano <gitster@pobox.com>
      72486729
  2. 31 Mar, 2017 4 commits
  3. 28 Mar, 2017 1 commit
  4. 26 Sep, 2016 1 commit
    • Jeff King's avatar
      sha1_array: let callbacks interrupt iteration · 16ddcd40
      Jeff King authored
      The callbacks for iterating a sha1_array must have a void
      return.  This is unlike our usual for_each semantics, where
      a callback may interrupt iteration and have its value
      propagated. Let's switch it to the usual form, which will
      enable its use in more places (e.g., where we are replacing
      an existing iteration with a different data structure).
      Signed-off-by: default avatarJeff King <peff@peff.net>
      Signed-off-by: default avatarJunio C Hamano <gitster@pobox.com>
      16ddcd40
  5. 16 Sep, 2012 1 commit
  6. 20 May, 2011 2 commits
    • Jeff King's avatar
      receive-pack: eliminate duplicate .have refs · cff38a5e
      Jeff King authored
      When receiving a push, we advertise ref tips from any
      alternate repositories, in case that helps the client send a
      smaller pack. Since these refs don't actually exist in the
      destination repository, we don't transmit the real ref
      names, but instead use the pseudo-ref ".have".
      
      If your alternate has a large number of duplicate refs (for
      example, because it is aggregating objects from many related
      repositories, some of which will have the same tags and
      branch tips), then we will send each ".have $sha1" line
      multiple times. This is a pointless waste of bandwidth, as
      we are simply repeating the same fact to the client over and
      over.
      
      This patch eliminates duplicate .have refs early on. It does
      so efficiently by sorting the complete list and skipping
      duplicates. This has the side effect of re-ordering the
      .have lines by ascending sha1; this isn't a problem, though,
      as the original order was meaningless.
      
      There is a similar .have system in fetch-pack, but it
      does not suffer from the same problem. For each alternate
      ref we consider in fetch-pack, we actually open the object
      and mark it with the SEEN flag, so duplicates are
      automatically culled.
      Signed-off-by: default avatarJeff King <peff@peff.net>
      Signed-off-by: default avatarJunio C Hamano <gitster@pobox.com>
      cff38a5e
    • Jeff King's avatar
      bisect: refactor sha1_array into a generic sha1 list · 902bb364
      Jeff King authored
      This is a generally useful abstraction, so let's let others
      make use of it.  The refactoring is more or less a straight
      copy; however, functions and struct members have had their
      names changed to match string_list, which is the most
      similar data structure.
      Signed-off-by: default avatarJeff King <peff@peff.net>
      Signed-off-by: default avatarJunio C Hamano <gitster@pobox.com>
      902bb364