git-lfs/localstorage/localstorage.go

61 lines
1.3 KiB
Go

// Package localstorage handles LFS content stored locally
// NOTE: Subject to change, do not rely on this package from outside git-lfs source
package localstorage
import (
"fmt"
"os"
"path/filepath"
"regexp"
)
const (
chanBufSize = 100
)
var (
oidRE = regexp.MustCompile(`\A[[:alnum:]]{64}`)
dirPerms os.FileMode = 0755
)
// LocalStorage manages the locally stored LFS objects for a repository.
type LocalStorage struct {
RootDir string
TempDir string
}
// Object represents a locally stored LFS object.
type Object struct {
Oid string
Size int64
}
func NewStorage(storageDir, tempDir string) (*LocalStorage, error) {
if err := os.MkdirAll(storageDir, dirPerms); err != nil {
return nil, err
}
if err := os.MkdirAll(tempDir, dirPerms); err != nil {
return nil, err
}
return &LocalStorage{storageDir, tempDir}, nil
}
func (s *LocalStorage) ObjectPath(oid string) string {
return filepath.Join(localObjectDir(s, oid), oid)
}
func (s *LocalStorage) BuildObjectPath(oid string) (string, error) {
dir := localObjectDir(s, oid)
if err := os.MkdirAll(dir, dirPerms); err != nil {
return "", fmt.Errorf("Error trying to create local storage directory in %q: %s", dir, err)
}
return filepath.Join(dir, oid), nil
}
func localObjectDir(s *LocalStorage, oid string) string {
return filepath.Join(s.RootDir, oid[0:2], oid[2:4])
}