Skip to content
The missing interface filesystem abstraction for Go
Go Other
  1. Go 99.2%
  2. Other 0.8%
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
.ci Fixed building for Solaris Jul 1, 2019
helper Add capability tests to chroot, mount and polyfill Jun 8, 2018
memfs memfs: return error when using negative offsets Feb 14, 2019
osfs Fixed building for Solaris Jul 1, 2019
test
util Add TempDir Sep 18, 2018
.gitignore *: go dep update Jul 29, 2019
.travis.yml Fixed building for Solaris Jul 1, 2019
DCO added DCO Nov 18, 2017
LICENSE LICENSE: changed to Apache 2.0 Nov 18, 2017
MAINTAINERS
Makefile travis: add codecov.io (#13) Feb 16, 2017
README.md Update README.md Jul 29, 2019
appveyor.yml bump v4 version Nov 18, 2017
fs.go Rename capability names to <name>Capability Jun 6, 2018
fs_test.go
go.mod *: go dep update Jul 29, 2019
go.sum *: go dep update Jul 29, 2019

README.md

go-billy GoDoc Build Status Build status codecov

The missing interface filesystem abstraction for Go. Billy implements an interface based on the os standard library, allowing to develop applications without dependency on the underlying storage. Makes it virtually free to implement mocks and testing over filesystem operations.

Billy was born as part of src-d/go-git project.

Installation

go get -u gopkg.in/src-d/go-billy.v4/...

Usage

Billy exposes filesystems using the Filesystem interface. Each filesystem implementation gives you a New method, whose arguments depend on the implementation itself, that returns a new Filesystem.

The following example caches in memory all readable files in a directory from any billy's filesystem implementation.

func LoadToMemory(origin billy.Filesystem, path string) (*memory.Memory, error) {
	memory := memory.New()

	files, err := origin.ReadDir("/")
	if err != nil {
		return nil, err
	}

	for _, file := range files {
		if file.IsDir() {
			continue
		}

		src, err := origin.Open(file.Name())
		if err != nil {
			return nil, err
		}

		dst, err := memory.Create(file.Name())
		if err != nil {
			return nil, err
		}

		if _, err = io.Copy(dst, src); err != nil {
			return nil, err
		}

		if err := dst.Close(); err != nil {
			return nil, err
		}

		if err := src.Close(); err != nil {
			return nil, err
		}
	}

	return memory, nil
}

Why billy?

The library billy deals with storage systems and Billy is the name of a well-known, IKEA bookcase. That's it.

License

Apache License Version 2.0, see LICENSE

You can’t perform that action at this time.