forked from toolshed/abra
		
	
							
								
								
									
										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
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user