parent
b02475eca5
commit
aea5cc69c3
104
pkg/git/read.go
104
pkg/git/read.go
@ -1,11 +1,17 @@
|
||||
package git
|
||||
|
||||
import (
|
||||
"io/ioutil"
|
||||
"os/user"
|
||||
"path"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
|
||||
"coopcloud.tech/abra/pkg/config"
|
||||
"github.com/go-git/go-git/v5"
|
||||
gitConfigPkg "github.com/go-git/go-git/v5/config"
|
||||
"github.com/go-git/go-git/v5/plumbing"
|
||||
"github.com/go-git/go-git/v5/plumbing/format/gitignore"
|
||||
"github.com/sirupsen/logrus"
|
||||
)
|
||||
|
||||
@ -40,6 +46,12 @@ func IsClean(recipeName string) (bool, error) {
|
||||
return false, err
|
||||
}
|
||||
|
||||
patterns, err := GetExcludesFiles()
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
worktree.Excludes = append(patterns, worktree.Excludes...)
|
||||
|
||||
status, err := worktree.Status()
|
||||
if err != nil {
|
||||
return false, err
|
||||
@ -53,3 +65,95 @@ func IsClean(recipeName string) (bool, error) {
|
||||
|
||||
return status.IsClean(), nil
|
||||
}
|
||||
|
||||
// GetExcludesFiles reads the exlude files from a global git ignore
|
||||
func GetExcludesFiles() ([]gitignore.Pattern, error) {
|
||||
var err error
|
||||
var patterns []gitignore.Pattern
|
||||
|
||||
cfg, err := parseGitConfig()
|
||||
if err != nil {
|
||||
return patterns, err
|
||||
}
|
||||
|
||||
excludesfile := getExcludesFile(cfg)
|
||||
patterns, err = parseExcludesFile(excludesfile)
|
||||
if err != nil {
|
||||
return patterns, err
|
||||
}
|
||||
|
||||
return patterns, nil
|
||||
}
|
||||
|
||||
func parseGitConfig() (*gitConfigPkg.Config, error) {
|
||||
cfg := gitConfigPkg.NewConfig()
|
||||
|
||||
usr, err := user.Current()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
b, err := ioutil.ReadFile(usr.HomeDir + "/.gitconfig")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if err := cfg.Unmarshal(b); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return cfg, err
|
||||
}
|
||||
|
||||
func getExcludesFile(cfg *gitConfigPkg.Config) string {
|
||||
for _, sec := range cfg.Raw.Sections {
|
||||
if sec.Name == "core" {
|
||||
for _, opt := range sec.Options {
|
||||
if opt.Key == "excludesfile" {
|
||||
return opt.Value
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func parseExcludesFile(excludesfile string) ([]gitignore.Pattern, error) {
|
||||
excludesfile, err := expandTilde(excludesfile)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
data, err := ioutil.ReadFile(excludesfile)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
var ps []gitignore.Pattern
|
||||
for _, s := range strings.Split(string(data), "\n") {
|
||||
if !strings.HasPrefix(s, "#") && len(strings.TrimSpace(s)) > 0 {
|
||||
ps = append(ps, gitignore.ParsePattern(s, nil))
|
||||
}
|
||||
}
|
||||
|
||||
return ps, nil
|
||||
}
|
||||
|
||||
func expandTilde(path string) (string, error) {
|
||||
if !strings.HasPrefix(path, "~") {
|
||||
return path, nil
|
||||
}
|
||||
var paths []string
|
||||
u, err := user.Current()
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
for _, p := range strings.Split(path, string(filepath.Separator)) {
|
||||
if p == "~" {
|
||||
paths = append(paths, u.HomeDir)
|
||||
} else {
|
||||
paths = append(paths, p)
|
||||
}
|
||||
}
|
||||
return "/" + filepath.Join(paths...), nil
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user