• J
    create_symref: use existing ref-lock code · 370e5ad6
    Jeff King 提交于
    The create_symref() function predates the existence of
    "struct lock_file", let alone the more recent "struct
    ref_lock". Instead, it just does its own manual dot-locking.
    Besides being more code, this has a few downsides:
    
     - if git is interrupted while holding the lock, we don't
       clean up the lockfile
    
     - we don't do the usual directory/filename conflict check.
       So you can sometimes create a symref "refs/heads/foo/bar",
       even if "refs/heads/foo" exists (namely, if the refs are
       packed and we do not hit the d/f conflict in the
       filesystem).
    
    This patch refactors create_symref() to use the "struct
    ref_lock" interface, which handles both of these things.
    There are a few bonus cleanups that come along with it:
    
     - we leaked ref_path in some error cases
    
     - the symref contents were stored in a fixed-size buffer,
       putting an artificial (albeit large) limitation on the
       length of the refname. We now write through fprintf, and
       handle refnames of any size.
    
     - we called adjust_shared_perm only after the file was
       renamed into place, creating a potential race with
       readers in a shared repository. The lockfile code now
       handles this when creating the lockfile, making it
       atomic.
    
     - the legacy prefer_symlink_refs path did not do any
       locking at all. Admittedly, it is not atomic from a
       reader's perspective (as it unlinks and re-creates the
       symlink to overwrite), but at least it cannot conflict
       with other writers now.
    
     - the result of this patch is hopefully more readable. It
       eliminates three goto labels. Two were for error checking
       that is now simplified, and the third was to reach shared
       code that has been pulled into its own function.
    Signed-off-by: NJeff King <peff@peff.net>
    Reviewed-by: NMichael Haggerty <mhagger@alum.mit.edu>
    Signed-off-by: NJunio C Hamano <gitster@pobox.com>
    370e5ad6
t1401-symbolic-ref.sh 3.4 KB