Skip to content

Commit

Permalink
Add doctor check for multiple config files
Browse files Browse the repository at this point in the history
  • Loading branch information
twpayne committed Sep 19, 2021
1 parent 387e908 commit d439e7f
Show file tree
Hide file tree
Showing 11 changed files with 127 additions and 69 deletions.
4 changes: 2 additions & 2 deletions internal/chezmoi/chezmoi.go
Expand Up @@ -64,7 +64,7 @@ var (
)

// knownPrefixedFiles is a set of known filenames with the .chezmoi prefix.
var knownPrefixedFiles = newStringSet(
var knownPrefixedFiles = NewStringSet(
Prefix+".json"+TemplateSuffix,
Prefix+".toml"+TemplateSuffix,
Prefix+".yaml"+TemplateSuffix,
Expand Down Expand Up @@ -137,7 +137,7 @@ func SHA256Sum(data []byte) []byte {
func SuspiciousSourceDirEntry(base string, info fs.FileInfo) bool {
switch info.Mode().Type() {
case 0:
return strings.HasPrefix(base, Prefix) && !knownPrefixedFiles.contains(base)
return strings.HasPrefix(base, Prefix) && !knownPrefixedFiles.Contains(base)
case fs.ModeDir:
return strings.HasPrefix(base, Prefix) && base != templatesDirName
case fs.ModeSymlink:
Expand Down
6 changes: 3 additions & 3 deletions internal/chezmoi/data.go
Expand Up @@ -53,12 +53,12 @@ func Kernel(fileSystem vfs.FS) (map[string]interface{}, error) {

// OSRelease returns the operating system identification data as defined by the
// os-release specification.
func OSRelease(fileSystem vfs.FS) (map[string]interface{}, error) {
for _, filename := range []string{
func OSRelease(system System) (map[string]interface{}, error) {
for _, filename := range []AbsPath{
"/usr/lib/os-release",
"/etc/os-release",
} {
data, err := fileSystem.ReadFile(filename)
data, err := system.ReadFile(filename)
if errors.Is(err, fs.ErrNotExist) {
continue
} else if err != nil {
Expand Down
3 changes: 2 additions & 1 deletion internal/chezmoi/data_test.go
Expand Up @@ -130,7 +130,8 @@ func TestOSRelease(t *testing.T) {
} {
t.Run(tc.name, func(t *testing.T) {
chezmoitest.WithTestFS(t, tc.root, func(fileSystem vfs.FS) {
actual, err := OSRelease(fileSystem)
system := NewRealSystem(fileSystem)
actual, err := OSRelease(system)
assert.NoError(t, err)
assert.Equal(t, tc.expected, actual)
})
Expand Down
51 changes: 30 additions & 21 deletions internal/chezmoi/patternset.go
Expand Up @@ -9,20 +9,20 @@ import (
vfs "github.com/twpayne/go-vfs/v4"
)

// A stringSet is a set of strings.
type stringSet map[string]struct{}
// A StringSet is a set of strings.
type StringSet map[string]struct{}

// An patternSet is a set of patterns.
type patternSet struct {
includePatterns stringSet
excludePatterns stringSet
includePatterns StringSet
excludePatterns StringSet
}

// newPatternSet returns a new patternSet.
func newPatternSet() *patternSet {
return &patternSet{
includePatterns: newStringSet(),
excludePatterns: newStringSet(),
includePatterns: NewStringSet(),
excludePatterns: NewStringSet(),
}
}

Expand All @@ -32,23 +32,23 @@ func (ps *patternSet) add(pattern string, include bool) error {
return fmt.Errorf("%s: invalid pattern", pattern)
}
if include {
ps.includePatterns.add(pattern)
ps.includePatterns.Add(pattern)
} else {
ps.excludePatterns.add(pattern)
ps.excludePatterns.Add(pattern)
}
return nil
}

// glob returns all matches in fileSystem.
func (ps *patternSet) glob(fileSystem vfs.FS, prefix string) ([]string, error) {
// FIXME use AbsPath and RelPath
allMatches := newStringSet()
allMatches := NewStringSet()
for includePattern := range ps.includePatterns {
matches, err := doublestar.Glob(fileSystem, prefix+includePattern)
if err != nil {
return nil, err
}
allMatches.add(matches...)
allMatches.Add(matches...)
}
for match := range allMatches {
for excludePattern := range ps.excludePatterns {
Expand All @@ -61,7 +61,7 @@ func (ps *patternSet) glob(fileSystem vfs.FS, prefix string) ([]string, error) {
}
}
}
matchesSlice := allMatches.elements()
matchesSlice := allMatches.Elements()
for i, match := range matchesSlice {
matchesSlice[i] = mustTrimPrefix(filepath.ToSlash(match), prefix)
}
Expand All @@ -84,28 +84,37 @@ func (ps *patternSet) match(name string) bool {
return false
}

// newStringSet returns a new StringSet containing elements.
func newStringSet(elements ...string) stringSet {
s := make(stringSet)
s.add(elements...)
// NewStringSet returns a new StringSet containing elements.
func NewStringSet(elements ...string) StringSet {
s := make(StringSet)
s.Add(elements...)
return s
}

// add adds elements to s.
func (s stringSet) add(elements ...string) {
// Add adds elements to s.
func (s StringSet) Add(elements ...string) {
for _, element := range elements {
s[element] = struct{}{}
}
}

// contains returns true if s contains element.
func (s stringSet) contains(element string) bool {
// Contains returns true if s Contains element.
func (s StringSet) Contains(element string) bool {
_, ok := s[element]
return ok
}

// elements returns all the elements of s.
func (s stringSet) elements() []string {
// Element returns an arbitrary element from s or the empty string if s is
// empty.
func (s StringSet) Element() string {
for element := range s {
return element
}
return ""
}

// Elements returns all the Elements of s.
func (s StringSet) Elements() []string {
elements := make([]string, 0, len(s))
for element := range s {
elements = append(elements, element)
Expand Down
2 changes: 1 addition & 1 deletion internal/cmd/config.go
Expand Up @@ -720,7 +720,7 @@ func (c *Config) defaultTemplateData() map[string]interface{} {
}

var osRelease map[string]interface{}
if rawOSRelease, err := chezmoi.OSRelease(c.fileSystem); err == nil {
if rawOSRelease, err := chezmoi.OSRelease(c.baseSystem); err == nil {
osRelease = upperSnakeCaseToCamelCaseMap(rawOSRelease)
} else {
log.Debug().
Expand Down

0 comments on commit d439e7f

Please sign in to comment.