• J
    ignore stale directories when checking reflog existence · 9233887c
    Jeff King 提交于
    When we update a ref, we have two rules for whether or not
    we actually update the reflog:
    
      1. If the reflog already exists, we will always append to
         it.
    
      2. If log_all_ref_updates is set, we will create a new
         reflog file if necessary.
    
    We do the existence check by trying to open the reflog file,
    either with or without O_CREAT (depending on log_all_ref_updates).
    If it fails, then we check errno to see what happened.
    
    If we were not using O_CREAT and we got ENOENT, the file
    doesn't exist, and we return success (there isn't a reflog
    already, and we were not told to make a new one).
    
    If we get EISDIR, then there is likely a stale directory
    that needs to be removed (e.g., there used to be "foo/bar",
    it was deleted, and the directory "foo" was left. Now we
    want to create the ref "foo"). If O_CREAT is set, then we
    catch this case, try to remove the directory, and retry our
    open. So far so good.
    
    But if we get EISDIR and O_CREAT is not set, then we treat
    this as any other error, which is not right. Like ENOENT,
    EISDIR is an indication that we do not have a reflog, and we
    should silently return success (we were not told to create
    it). Instead, the current code reports this as an error, and
    we fail to update the ref at all.
    
    Note that this is relatively unlikely to happen, as you
    would have to have had reflogs turned on, and then later
    turned them off (it could also happen due to a bug in fetch,
    but that was fixed in the previous commit). However, it's
    quite easy to fix: we just need to treat EISDIR like ENOENT
    for the non-O_CREAT case, and silently return (note that
    this early return means we can also simplify the O_CREAT
    case).
    
    Our new tests cover both cases (O_CREAT and non-O_CREAT).
    The first one already worked, of course.
    Signed-off-by: NJeff King <peff@peff.net>
    Signed-off-by: NJunio C Hamano <gitster@pobox.com>
    9233887c
refs.c 93.5 KB