Improving command line support

This commit is contained in:
Alex Yatskov 2015-06-23 17:43:22 +09:00
parent 76a517d1a3
commit 2a4f274fbc
2 changed files with 54 additions and 29 deletions

View File

@ -23,6 +23,7 @@
package main package main
import ( import (
"fmt"
"io/ioutil" "io/ioutil"
"path" "path"
"path/filepath" "path/filepath"
@ -40,16 +41,16 @@ type database struct {
vers verList vers verList
} }
func newDatabase(dir string) (*database, error) { func newDatabase(dir string, index int, writable bool) (*database, error) {
db := &database{base: dir} db := &database{base: dir}
if err := db.load(dir); err != nil { if err := db.load(dir, index, writable); err != nil {
return nil, err return nil, err
} }
return db, nil return db, nil
} }
func (db *database) load(dir string) error { func (db *database) load(dir string, index int, writable bool) error {
var err error var err error
db.base, err = filepath.Abs(dir) db.base, err = filepath.Abs(dir)
@ -57,15 +58,21 @@ func (db *database) load(dir string) error {
return err return err
} }
if writable {
if err := buildNewVersion(db.base); err != nil { if err := buildNewVersion(db.base); err != nil {
return err return err
} }
}
db.vers, err = db.buildVersions(db.base) db.vers, err = db.buildVersions(db.base)
if err != nil { if err != nil {
return err return err
} }
if index >= 0 {
db.vers = db.vers[index:]
}
if lastVer := db.lastVersion(); lastVer != nil { if lastVer := db.lastVersion(); lastVer != nil {
return lastVer.resolve() return lastVer.resolve()
} }
@ -112,10 +119,10 @@ func (db *database) buildVersions(base string) (verList, error) {
sort.Sort(vers) sort.Sort(vers)
var parVer *version var pv *version
for _, ver := range vers { for _, ver := range vers {
ver.parent = parVer ver.parent = pv
parVer = ver pv = ver
} }
return vers, nil return vers, nil
@ -130,6 +137,12 @@ func (db *database) lastVersion() *version {
return db.vers[count-1] return db.vers[count-1]
} }
func (db *database) dump() {
for index, ver := range db.vers {
fmt.Printf("version: %d\ttime: %s\n", index, ver.timestamp.String())
}
}
// FS // FS
func (db *database) Root() (fs.Node, error) { func (db *database) Root() (fs.Node, error) {
return db.lastVersion().root, nil return db.lastVersion().root, nil

26
vfs.go
View File

@ -30,33 +30,40 @@ import (
"bazil.org/fuse" "bazil.org/fuse"
"bazil.org/fuse/fs" "bazil.org/fuse/fs"
_ "bazil.org/fuse/fs/fstestutil" // _ "bazil.org/fuse/fs/fstestutil"
) )
func usage() { func usage() {
fmt.Fprintf(os.Stderr, "Usage: %s [options] database mountpoint\n\n", os.Args[0]) fmt.Fprintf(os.Stderr, "Usage: %s [options] database [mountpoint]\n\n", os.Args[0])
fmt.Fprintf(os.Stderr, "Parameters:\n") fmt.Fprintf(os.Stderr, "Parameters:\n")
flag.PrintDefaults() flag.PrintDefaults()
} }
func main() { func main() {
version := flag.Int("version", -1, "version index (specify -1 for latest)")
flag.Usage = usage flag.Usage = usage
flag.Parse() flag.Parse()
if flag.NArg() != 2 { if flag.NArg() < 1 {
usage() usage()
os.Exit(2) os.Exit(2)
} }
database := flag.Arg(0) mount := flag.NArg() > 1
mountpoint := flag.Arg(1) writable := mount && *version < 0
db, err := newDatabase(database) db, err := newDatabase(flag.Arg(0), *version, writable)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
} }
conn, err := fuse.Mount(mountpoint) if mount {
var options []fuse.MountOption
if !writable {
options = append(options, fuse.ReadOnly())
}
conn, err := fuse.Mount(flag.Arg(1), options...)
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
} }
@ -72,7 +79,12 @@ func main() {
log.Fatal(err) log.Fatal(err)
} }
if writable {
if err := db.save(); err != nil { if err := db.save(); err != nil {
log.Fatal(err) log.Fatal(err)
} }
} }
} else {
db.dump()
}
}