mirror of
https://github.com/ent/ent.git
synced 2026-05-22 09:31:45 +03:00
entc/gen/internal: initial work for solving vcs conflicts (#851)
This commit is contained in:
46
entc/gen/internal/vcs.go
Normal file
46
entc/gen/internal/vcs.go
Normal file
@@ -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
|
||||
}
|
||||
38
entc/gen/internal/vcs_test.go
Normal file
38
entc/gen/internal/vcs_test.go
Normal file
@@ -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)
|
||||
}
|
||||
Reference in New Issue
Block a user