mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-31 03:25:11 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			74 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			74 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| # go-billy [](https://pkg.go.dev/github.com/go-git/go-billy) [](https://github.com/go-git/go-billy/actions?query=workflow%3ATest)
 | |
| 
 | |
| 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 [go-git/go-git](https://github.com/go-git/go-git) project.
 | |
| 
 | |
| ## Installation
 | |
| 
 | |
| ```go
 | |
| import "github.com/go-git/go-billy/v5" // with go modules enabled (GO111MODULE=on or outside GOPATH)
 | |
| import "github.com/go-git/go-billy" // with go modules disabled
 | |
| ```
 | |
| 
 | |
| ## Usage
 | |
| 
 | |
| Billy exposes filesystems using the
 | |
| [`Filesystem` interface](https://pkg.go.dev/github.com/go-git/go-billy/v5?tab=doc#Filesystem).
 | |
| 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.
 | |
| 
 | |
| ```go
 | |
| 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](LICENSE)
 |