Skip to content
  • Jeff King's avatar
    fetch-pack: match refs exactly · 1e7ba0f9
    Jeff King authored and Junio C Hamano's avatar Junio C Hamano committed
    When we are determining the list of refs to fetch via
    fetch-pack, we have two sets of refs to compare: those on
    the remote side, and a "match" list of things we want to
    fetch. We iterate through the remote refs alphabetically,
    seeing if each one is wanted by the "match" list.
    
    Since def88e9a
    
     (Commit first cut at "git-fetch-pack",
    2005-07-04), we have used the "path_match" function to do a
    suffix match, where a remote ref is considered wanted if
    any of the "match" elements is a suffix of the remote
    refname.
    
    This enables callers of fetch-pack to specify unqualified
    refs and have them matched up with remote refs (e.g., ask
    for "A" and get remote's "refs/heads/A"). However, if you
    provide a fully qualified ref, then there are corner cases
    where we provide the wrong answer. For example, given a
    remote with two refs:
    
       refs/foo/refs/heads/master
       refs/heads/master
    
    asking for "refs/heads/master" will first match
    "refs/foo/refs/heads/master" by the suffix rule, and we will
    erroneously fetch it instead of refs/heads/master.
    
    As it turns out, all callers of fetch_pack do provide
    fully-qualified refs for the match list. There are two ways
    fetch_pack can get match lists:
    
      1. Through the transport code (i.e., via git-fetch)
    
      2. On the command-line of git-fetch-pack
    
    In the first case, we will always be providing the names of
    fully-qualified refs from "struct ref" objects. We will have
    pre-matched those ref objects already (since we have to
    handle more advanced matching, like wildcard refspecs), and
    are just providing a list of the refs whose objects we need.
    
    In the second case, users could in theory be providing
    non-qualified refs on the command-line. However, the
    fetch-pack documentation claims that refs should be fully
    qualified (and has always done so since it was written in
    2005).
    
    Let's change this path_match call to simply check for string
    equality, matching what the callers of fetch_pack are
    expecting.
    
    Signed-off-by: default avatarJeff King <peff@peff.net>
    Signed-off-by: default avatarJunio C Hamano <gitster@pobox.com>
    1e7ba0f9