Skip to content
  • Ronnie Sahlberg's avatar
    refs.c: allow listing and deleting badly named refs · d0f810f0
    Ronnie Sahlberg authored and Junio C Hamano's avatar Junio C Hamano committed
    
    
    We currently do not handle badly named refs well:
    
      $ cp .git/refs/heads/master .git/refs/heads/master.....@\*@\\.
      $ git branch
        fatal: Reference has invalid format: 'refs/heads/master.....@*@\.'
      $ git branch -D master.....@\*@\\.
        error: branch 'master.....@*@\.' not found.
    
    Users cannot recover from a badly named ref without manually finding
    and deleting the loose ref file or appropriate line in packed-refs.
    Making that easier will make it easier to tweak the ref naming rules
    in the future, for example to forbid shell metacharacters like '`'
    and '"', without putting people in a state that is hard to get out of.
    
    So allow "branch --list" to show these refs and allow "branch -d/-D"
    and "update-ref -d" to delete them.  Other commands (for example to
    rename refs) will continue to not handle these refs but can be changed
    in later patches.
    
    Details:
    
    In resolving functions, refuse to resolve refs that don't pass the
    git-check-ref-format(1) check unless the new RESOLVE_REF_ALLOW_BAD_NAME
    flag is passed.  Even with RESOLVE_REF_ALLOW_BAD_NAME, refuse to
    resolve refs that escape the refs/ directory and do not match the
    pattern [A-Z_]* (think "HEAD" and "MERGE_HEAD").
    
    In locking functions, refuse to act on badly named refs unless they
    are being deleted and either are in the refs/ directory or match [A-Z_]*.
    
    Just like other invalid refs, flag resolved, badly named refs with the
    REF_ISBROKEN flag, treat them as resolving to null_sha1, and skip them
    in all iteration functions except for for_each_rawref.
    
    Flag badly named refs (but not symrefs pointing to badly named refs)
    with a REF_BAD_NAME flag to make it easier for future callers to
    notice and handle them specially.  For example, in a later patch
    for-each-ref will use this flag to detect refs whose names can confuse
    callers parsing for-each-ref output.
    
    In the transaction API, refuse to create or update badly named refs,
    but allow deleting them (unless they try to escape refs/ and don't match
    [A-Z_]*).
    
    Signed-off-by: default avatarRonnie Sahlberg <sahlberg@google.com>
    Signed-off-by: default avatarJonathan Nieder <jrnieder@gmail.com>
    Signed-off-by: default avatarJunio C Hamano <gitster@pobox.com>
    d0f810f0