dotcloud/docker

View on GitHub
internal/directory/directory_windows.go

Summary

Maintainability
A
45 mins
Test Coverage
package directory

import (
    "context"
    "os"
    "path/filepath"
)

// calcSize walks a directory tree and returns its total size in bytes.
func calcSize(ctx context.Context, dir string) (int64, error) {
    var size int64
    err := filepath.Walk(dir, func(d string, fileInfo os.FileInfo, err error) error {
        if err != nil {
            // if dir/x disappeared while walking, Size() ignores dir/x.
            // if dir does not exist, Size() returns the error.
            if d != dir && os.IsNotExist(err) {
                return nil
            }
            return err
        }

        select {
        case <-ctx.Done():
            return ctx.Err()
        default:
        }

        // Ignore directory sizes
        if fileInfo == nil {
            return nil
        }

        s := fileInfo.Size()
        if fileInfo.IsDir() || s == 0 {
            return nil
        }

        size += s

        return nil
    })
    return size, err
}