diff --git a/database.go b/database.go index 9590a8a..ee578c4 100644 --- a/database.go +++ b/database.go @@ -28,8 +28,9 @@ import ( ) type database struct { - base string - vers []*version + base string + vers []*version + inodeCnt uint64 } func newDatabase(dir string) (*database, error) { @@ -75,7 +76,7 @@ func (this *database) versions(dirs []string) ([]*version, error) { var parent *version for _, dir := range dirs { - ver, err := newVersion(dir, parent) + ver, err := newVersion(dir, this, parent) if err != nil { return nil, err } @@ -111,3 +112,8 @@ func (this *database) scan(dir string) ([]string, error) { return dirs, nil } + +func (this *database) AllocInode() uint64 { + this.inodeCnt++ + return this.inodeCnt +} diff --git a/version.go b/version.go index 738ca64..8593171 100644 --- a/version.go +++ b/version.go @@ -40,10 +40,14 @@ type version struct { timestamp time.Time meta *versionMetadata root *versionedDir - inodeCnt uint64 + inodeAloc InodeAllocator } -func newVersion(base string, parent *version) (*version, error) { +type InodeAllocator interface { + AllocInode() uint64 +} + +func newVersion(base string, allocator InodeAllocator, parent *version) (*version, error) { re, err := regexp.Compile(`/vfs_([0-9a-f])$`) if err != nil { return nil, err @@ -62,7 +66,8 @@ func newVersion(base string, parent *version) (*version, error) { ver := &version{ base: base, parent: parent, - timestamp: time.Unix(timeval, 0)} + timestamp: time.Unix(timeval, 0), + inodeAloc: allocator} ver.meta, err = newVersionMetadata(ver.metadataPath()) if err != nil { @@ -124,14 +129,14 @@ func (this *version) buildVerDir(dir *versionedDir) error { for name, node := range nodes { if node.info.IsDir() { - subDir := newVersionedDir(node, this.allocInode()) + subDir := newVersionedDir(node, this.inodeAloc.AllocInode()) if err := this.buildVerDir(subDir); err != nil { return err } dir.dirs[name] = subDir } else { - dir.files[name] = newVersionedFile(node, this.allocInode()) + dir.files[name] = newVersionedFile(node, this.inodeAloc.AllocInode()) } } @@ -146,7 +151,7 @@ func (this *version) resolve() error { this.root = newVersionedDir( this.newVersionedNode("/", node), - this.allocInode()) + this.inodeAloc.AllocInode()) return this.buildVerDir(this.root) } @@ -160,11 +165,6 @@ func (this *version) rebasePath(paths ...string) string { return filepath.Join(combined...) } -func (this *version) allocInode() uint64 { - this.inodeCnt++ - return this.inodeCnt -} - func (this *version) Root() (fs.Node, error) { return this.root, nil }