• S
    add refname_match() · 79803322
    Steffen Prohaska 提交于
    We use at least two rulesets for matching abbreviated refnames with
    full refnames (starting with 'refs/').  git-rev-parse and git-fetch
    use slightly different rules.
    
    This commit introduces a new function refname_match
    (const char *abbrev_name, const char *full_name, const char **rules).
    
    abbrev_name is expanded using the rules and matched against full_name.
    If a match is found the function returns true.  rules is a NULL-terminate
    list of format patterns with "%.*s", for example:
    
        const char *ref_rev_parse_rules[] = {
                   "%.*s",
                   "refs/%.*s",
                   "refs/tags/%.*s",
                   "refs/heads/%.*s",
                   "refs/remotes/%.*s",
                   "refs/remotes/%.*s/HEAD",
                   NULL
        };
    
    Asterisks are included in the format strings because this is the form
    required in sha1_name.c.  Sharing the list with the functions there is
    a good idea to avoid duplicating the rules.  Hopefully this
    facilitates unified matching rules in the future.
    
    This commit makes the rules used by rev-parse for resolving refs to
    sha1s available for string comparison.  Before this change, the rules
    were buried in get_sha1*() and dwim_ref().
    
    A follow-up commit will refactor the rules used by fetch.
    
    refname_match() will be used for matching refspecs in git-send-pack.
    
    Thanks to Daniel Barkalow <barkalow@iabervon.org> for pointing
    out that ref_matches_abbrev in remote.c solves a similar problem
    and care should be taken to avoid confusion.
    Signed-off-by: NSteffen Prohaska <prohaska@zib.de>
    Signed-off-by: NJunio C Hamano <gitster@pobox.com>
    79803322
refs.c 34.5 KB