diff --git a/dot_test.go b/dot_test.go index 854f8bb..5a5edd0 100644 --- a/dot_test.go +++ b/dot_test.go @@ -30,7 +30,7 @@ func TestDoLink(t *testing.T) { To: "out/bashrc", } - m.doLink() + assert.Nil(t, m.doLink()) assert.True(t, isSymlink(m.To)) } @@ -59,9 +59,8 @@ func TestDoCopy(t *testing.T) { To: "out/bashrc", } - ok, err := m.doCopy() + err := m.doCopy() assert.Nil(t, err) - assert.True(t, ok) assert.False(t, isSymlink(m.To)) // same contents @@ -88,9 +87,9 @@ func TestUnmap(t *testing.T) { From: "examples/bashrc", To: "out/bashrc", } - m.doLink() + assert.Nil(t, m.doLink()) - assert.Nil(t, m.unmap()) + m.unmap() assert.False(t, pathExists(m.To)) } @@ -106,7 +105,7 @@ func TestDoMap(t *testing.T) { As: "link", } - assert.Nil(t, m.domap()) + m.domap() assert.True(t, isSymlink(m.To)) // creates path @@ -119,7 +118,7 @@ func TestDoMap(t *testing.T) { As: "copy", } - assert.Nil(t, m.domap()) + m.domap() assert.False(t, isSymlink(m.To)) // same contents @@ -161,9 +160,8 @@ func TestValidate(t *testing.T) { }, }, } - ok, errs := d.validate() + errs := d.validate() assert.Nil(t, errs) - assert.True(t, ok) // invalid dots: path does not exist d = Dots{ @@ -176,8 +174,7 @@ func TestValidate(t *testing.T) { }, }, } - ok, errs = d.validate() - assert.False(t, ok) + errs = d.validate() assert.Equal(t, len(errs), 1) assert.Contains(t, errs, fmt.Errorf("%s: path does not exist", d.FileMappings[0].From)) @@ -193,8 +190,7 @@ func TestValidate(t *testing.T) { }, }, } - ok, errs = d.validate() - assert.False(t, ok) + errs = d.validate() assert.Equal(t, len(errs), 1) assert.Contains(t, errs, fmt.Errorf("%s: cannot use copy type with directory", d.FileMappings[0].From)) } diff --git a/main.go b/main.go index 7d9966d..6764a77 100644 --- a/main.go +++ b/main.go @@ -50,44 +50,36 @@ type FileMapping struct { Os string } -// TODO return error - caller handles error -func (m FileMapping) doLink() { +func (m FileMapping) doLink() error { err := os.Symlink(m.From, m.To) if err != nil { - logger.Fatalf("failed linking %s -> %s: %v", m.From, m.To, err) - } - if flagVerbose { - logger.Printf("linking %s -> %s\n", m.From, m.To) + return err } + return nil } -// TODO return error - caller handles error -func (m FileMapping) doCopy() (bool, error) { +func (m FileMapping) doCopy() error { fin, err := os.Open(m.From) if err != nil { - log.Fatalf("failed opening file %s, %v", m.From, err) + return err } defer fin.Close() fout, err := os.Create(m.To) if err != nil { - log.Fatalf("failed creating file %s, %v", m.From, err) + return err } defer fout.Close() _, err = io.Copy(fout, fin) if err != nil { - log.Fatalf("failed copying file %s to %s, %v", m.From, m.To, err) - } - if flagVerbose { - logger.Printf("copying %s -> %s\n", m.From, m.To) + return err } - return true, nil + return nil } -// TODO return error - caller handles -func (m FileMapping) unmap() error { +func (m FileMapping) unmap() { if dstExists := pathExists(m.To); !dstExists && flagVerbose { logger.Printf("rm %s: skipping, file not there\n", m.To) } else { @@ -99,11 +91,18 @@ func (m FileMapping) unmap() error { logger.Printf("rm %s: success\n", m.To) } } - return nil } -// TODO return error - caller handles -func (m FileMapping) domap() error { +func (m FileMapping) domap() { + handleDoMapRes := func(m FileMapping, err error) { + if err != nil { + logger.Fatalf("failed %s %s -> %s: %v", m.As+"ing", m.From, m.To, err) + } + if flagVerbose { + logger.Printf("%s %s -> %s\n", m.As+"ing", m.From, m.To) + } + } + // ensure destination path exists if err := createPath(m.To); err != nil { logger.Fatalf("failed creating path %s, %v", m.To, err) @@ -111,11 +110,12 @@ func (m FileMapping) domap() error { switch typ := m.As; typ { case "link": - m.doLink() + err := m.doLink() + handleDoMapRes(m, err) case "copy": - m.doCopy() + err := m.doCopy() + handleDoMapRes(m, err) } - return nil } func (m FileMapping) isMatchingOs() bool { @@ -155,7 +155,7 @@ func (d *Dots) UnmarshalYAML(unmarshal func(interface{}) error) error { return nil } -func (dots Dots) validate() (bool, []error) { +func (dots Dots) validate() []error { var errs []error for _, mapping := range dots.FileMappings { if !pathExists(mapping.From) { @@ -164,7 +164,7 @@ func (dots Dots) validate() (bool, []error) { errs = append(errs, fmt.Errorf("%s: cannot use copy type with directory", mapping.From)) } } - return len(errs) == 0, errs + return errs } func inferDestination(file string) string { @@ -289,8 +289,8 @@ func readDotFile(file string) Dots { } newDots := dots.transform() - valid, errs := newDots.validate() - if !valid { + errs := newDots.validate() + if len(errs) > 0 { for _, err := range errs { logger.Printf("failed validating dots file: %v", err) }