diff --git a/versions/versions.go b/versions/versions.go new file mode 100644 index 0000000..67edd33 --- /dev/null +++ b/versions/versions.go @@ -0,0 +1,67 @@ +package versions + +import ( + "local/notes-server/config" + "time" + + git "gopkg.in/src-d/go-git.v4" + "gopkg.in/src-d/go-git.v4/plumbing/object" +) + +type Versions struct { + repo *git.Repository +} + +func New() (*Versions, error) { + repo, err := git.PlainInit(config.Root, false) + if err != nil { + repo, err = git.PlainOpen(config.Root) + } + return &Versions{ + repo: repo, + }, err +} + +func (v *Versions) Gitmmit() error { + if err := v.AddAll(); err != nil { + return err + } + if err := v.Commit(); err != nil { + return err + } + return nil +} + +func (v *Versions) AddAll() error { + worktree, err := v.worktree() + if err != nil { + return err + } + + for _, path := range []string{".", "./*", "./**", "/", "/**", "/*"} { + if err := worktree.AddGlob(path); err != nil { + return err + } + } + + return nil +} + +func (v *Versions) Commit() error { + worktree, err := v.worktree() + if err != nil { + return err + } + + opts := &git.CommitOptions{Author: &object.Signature{}} + _, err = worktree.Commit(time.Now().String(), opts) + return err +} + +func (v *Versions) worktree() (*git.Worktree, error) { + worktree, err := v.repo.Worktree() + if err != nil { + return nil, err + } + return worktree, nil +} diff --git a/versions/versions_test.go b/versions/versions_test.go new file mode 100644 index 0000000..d3ac946 --- /dev/null +++ b/versions/versions_test.go @@ -0,0 +1,78 @@ +package versions + +import ( + "io/ioutil" + "local/notes-server/config" + "os" + "path" + "testing" +) + +func TestVersionsHappy(t *testing.T) { + d, err := ioutil.TempDir(os.TempDir(), "prefix") + if err != nil { + t.Fatal(err) + } + defer os.RemoveAll(d) + if err := ioutil.WriteFile(path.Join(d, "a.md"), []byte("# Hello"), os.ModePerm); err != nil { + t.Fatal(err) + } + if err := ioutil.WriteFile(path.Join(d, "b.md"), []byte("# World"), os.ModePerm); err != nil { + t.Fatal(err) + } + config.Root = d + v, err := New() + if err != nil { + t.Error(err) + } + + if _, err := v.repo.Head(); err == nil { + t.Error(err) + } + if err := v.AddAll(); err != nil { + t.Error(err) + } + if _, err := v.repo.Head(); err == nil { + t.Error(err) + } + if err := v.Commit(); err != nil { + t.Error(err) + } + if _, err := v.repo.Head(); err != nil { + t.Error(err) + } + if err := v.Gitmmit(); err != nil { + t.Error(err) + } + if _, err := v.repo.Head(); err != nil { + t.Error(err) + } +} + +func TestVersionsBad(t *testing.T) { + config.Root = "/not/a/real/path" + if _, err := New(); err == nil { + t.Error(err) + } +} + +func TestVersionsDirty(t *testing.T) { + if os.Getenv("DIRTY") == "" { + return + } + config.Root = "/tmp/foo" + v, err := New() + if err != nil { + t.Fatal(err) + } + ioutil.WriteFile(path.Join(config.Root, "file.md"), []byte(` +# Hello +## World +I'm a doc + `), os.ModePerm) + if err := v.Gitmmit(); err != nil { + t.Fatal(err) + } + t.Log(v) + t.Log(v.repo.Config()) +}