diff --git a/entc/gen/internal/vcs.go b/entc/gen/internal/vcs.go new file mode 100644 index 000000000..fe0829ba8 --- /dev/null +++ b/entc/gen/internal/vcs.go @@ -0,0 +1,46 @@ +// Copyright 2019-present Facebook Inc. All rights reserved. +// This source code is licensed under the Apache 2.0 license found +// in the LICENSE file in the root directory of this source tree. + +package internal + +import ( + "bufio" + "fmt" + "os" + "path/filepath" + "strings" +) + +// CheckDir checks the given dir and reports if there are any VCS conflicts. +func CheckDir(dir string) error { + return filepath.Walk(dir, func(path string, info os.FileInfo, err error) error { + if info.IsDir() && dir != path { + return filepath.SkipDir + } + return checkFile(path) + }) +} + +// conflictMarker holds the default marker string for +// both Git and Mercurial (default length is 7). +const conflictMarker = "<<<<<<<" + +// checkFile checks the given file line by line +// and reports if it contains any VCS conflicts. +func checkFile(path string) error { + fi, err := os.Open(path) + if err != nil { + return err + } + defer fi.Close() + + scan := bufio.NewScanner(fi) + scan.Split(bufio.ScanLines) + for i := 0; scan.Scan(); i++ { + if l := scan.Text(); strings.HasPrefix(l, conflictMarker) { + return fmt.Errorf("vcs conflict %s:%d", path, i+1) + } + } + return nil +} diff --git a/entc/gen/internal/vcs_test.go b/entc/gen/internal/vcs_test.go new file mode 100644 index 000000000..cb6d50b76 --- /dev/null +++ b/entc/gen/internal/vcs_test.go @@ -0,0 +1,38 @@ +// Copyright 2019-present Facebook Inc. All rights reserved. +// This source code is licensed under the Apache 2.0 license found +// in the LICENSE file in the root directory of this source tree. + +package internal + +import ( + "fmt" + "io/ioutil" + "os" + "path/filepath" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestCheckDir(t *testing.T) { + target := filepath.Join(os.TempDir(), "entvcs") + require.NoError(t, os.MkdirAll(target, os.ModePerm), "creating tmpdir") + defer os.RemoveAll(target) + err := ioutil.WriteFile(filepath.Join(target, "a.go"), []byte(`package schema`), 0644) + require.NoError(t, err) + err = ioutil.WriteFile(filepath.Join(target, "b.go"), []byte(`package schema + +type User struct { +<<<<<<< local + ent.Schema +======= + schema +>>>>>>> other +} +`), 0644) + require.NoError(t, err) + err = CheckDir(target) + require.Error(t, err) + expected := fmt.Sprintf("vcs conflict %s/b.go:4", target) + require.EqualError(t, err, expected) +}