| package cmd |
| |
| import ( |
| "bytes" |
| "errors" |
| "flag" |
| "fmt" |
| "io/ioutil" |
| "os/exec" |
| ) |
| |
| var update = flag.Bool("update", false, "update .golden files") |
| |
| func init() { |
| // Mute commands. |
| addCmd.SetOutput(new(bytes.Buffer)) |
| initCmd.SetOutput(new(bytes.Buffer)) |
| } |
| |
| // compareFiles compares the content of files with pathA and pathB. |
| // If contents are equal, it returns nil. |
| // If not, it returns which files are not equal |
| // and diff (if system has diff command) between these files. |
| func compareFiles(pathA, pathB string) error { |
| contentA, err := ioutil.ReadFile(pathA) |
| if err != nil { |
| return err |
| } |
| contentB, err := ioutil.ReadFile(pathB) |
| if err != nil { |
| return err |
| } |
| if !bytes.Equal(contentA, contentB) { |
| output := new(bytes.Buffer) |
| output.WriteString(fmt.Sprintf("%q and %q are not equal!\n\n", pathA, pathB)) |
| |
| diffPath, err := exec.LookPath("diff") |
| if err != nil { |
| // Don't execute diff if it can't be found. |
| return nil |
| } |
| diffCmd := exec.Command(diffPath, "-u", pathA, pathB) |
| diffCmd.Stdout = output |
| diffCmd.Stderr = output |
| |
| output.WriteString("$ diff -u " + pathA + " " + pathB + "\n") |
| if err := diffCmd.Run(); err != nil { |
| output.WriteString("\n" + err.Error()) |
| } |
| return errors.New(output.String()) |
| } |
| return nil |
| } |
| |
| // checkLackFiles checks if all elements of expected are in got. |
| func checkLackFiles(expected, got []string) error { |
| lacks := make([]string, 0, len(expected)) |
| for _, ev := range expected { |
| if !stringInStringSlice(ev, got) { |
| lacks = append(lacks, ev) |
| } |
| } |
| if len(lacks) > 0 { |
| return fmt.Errorf("Lack %v file(s): %v", len(lacks), lacks) |
| } |
| return nil |
| } |
| |
| // stringInStringSlice checks if s is an element of slice. |
| func stringInStringSlice(s string, slice []string) bool { |
| for _, v := range slice { |
| if s == v { |
| return true |
| } |
| } |
| return false |
| } |