snapshot/snapshots.go (83 lines of code) (raw):
package snapshot
import (
"fmt"
"os/exec"
"time"
log "github.com/sirupsen/logrus"
)
// NewDBAdapter returns a *dbAdapter that implements the snapshot.Filer and snapshot.DB interfaces
func NewDBAdapter(db DB) *dbAdapter {
return &dbAdapter{db: db}
}
type dbAdapter struct {
db DB
}
func (dba *dbAdapter) Checkout(id string) (Checkout, error) {
if dir, err := dba.db.Checkout(ID(id)); err != nil {
return nil, err
} else {
return &dbCheckout{db: dba.db, dir: dir, id: id}, nil
}
}
func (dba *dbAdapter) CheckoutAt(id string, dir string) (Checkout, error) {
if co, err := dba.Checkout(id); err != nil {
return nil, err
} else if err := exec.Command("cp", "-r", co.Path()+"/.", dir).Run(); err != nil {
return nil, err
} else {
return &dbCheckout{db: dba.db, dir: dir, id: id}, nil
}
}
func (dba *dbAdapter) CancelCheckout() error {
return nil
}
func (dba *dbAdapter) Ingest(path string) (id string, err error) {
if ident, err := dba.db.IngestDir(path); err != nil {
return "", err
} else {
return string(ident), nil
}
}
func (dba *dbAdapter) IngestMap(srcToDest map[string]string) (string, error) {
errMsg := "Not implemented"
log.Error(errMsg)
return "", fmt.Errorf(errMsg)
}
func (dba *dbAdapter) CancelIngest() error {
return nil
}
func (dba *dbAdapter) Update() error {
return dba.db.Update()
}
func (dba *dbAdapter) UpdateInterval() time.Duration {
return dba.db.UpdateInterval()
}
type dbCheckout struct {
db DB
dir string
id string
}
func (dbc *dbCheckout) Path() string {
return dbc.dir
}
func (dbc *dbCheckout) ID() string {
return dbc.id
}
func (dbc *dbCheckout) Release() error {
return dbc.db.ReleaseCheckout(dbc.dir)
}
// NewNopCheckout returns a *nopCheckout that implements snapshot.Checkout with no-ops.
func NewNopCheckout(id, dir string) *nopCheckout {
return &nopCheckout{id: id, dir: dir}
}
type nopCheckout struct {
dir string
id string
}
func (nc *nopCheckout) Path() string {
return nc.dir
}
func (nc *nopCheckout) ID() string {
return nc.id
}
func (nc *nopCheckout) Release() error {
return nil
}