Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Simplify and fix os.MkdirAll() usage #422

Merged
merged 1 commit into from
Aug 4, 2015
Merged

Commits on Jul 30, 2015

  1. Simplify and fix os.MkdirAll() usage

    TL;DR: check for IsExist(err) after a failed MkdirAll() is both
    redundant and wrong -- so two reasons to remove it.
    
    Quoting MkdirAll documentation:
    
    > MkdirAll creates a directory named path, along with any necessary
    > parents, and returns nil, or else returns an error. If path
    > is already a directory, MkdirAll does nothing and returns nil.
    
    This means two things:
    
    1. If a directory to be created already exists, no error is
    returned.
    
    2. If the error returned is IsExist (EEXIST), it means there exists
    a non-directory with the same name as MkdirAll need to use for
    directory. Example: we want to MkdirAll("a/b"), but file "a"
    (or "a/b") already exists, so MkdirAll fails.
    
    The above is a theory, based on quoted documentation and my UNIX
    knowledge.
    3. In practice, though, current MkdirAll implementation [1] returns
    ENOTDIR in most of cases described in moby#2, with the exception when
    there is a race between MkdirAll and someone else creating the
    last component of MkdirAll argument as a file. In this very case
    MkdirAll() will indeed return EEXIST.
    
    Because of moby#1, IsExist check after MkdirAll is not needed.
    
    Because of moby#2 and moby#3, ignoring IsExist error is just plain wrong,
    as directory we require is not created. It's cleaner to report
    the error now.
    
    [1] https://github.com/golang/go/blob/f9ed2f75/src/os/path.go
    
    Signed-off-by: Kir Kolyshkin <[email protected]>
    kolyshkin committed Jul 30, 2015
    Configuration menu
    Copy the full SHA
    7bfcba8 View commit details
    Browse the repository at this point in the history