Add support for checking out specific paths
This commit is contained in:
parent
e5e4dd9b4d
commit
85823eb4f8
@ -19,15 +19,15 @@ var (
|
|||||||
|
|
||||||
func checkoutCommand(cmd *cobra.Command, args []string) {
|
func checkoutCommand(cmd *cobra.Command, args []string) {
|
||||||
|
|
||||||
// No params
|
// Parameters are filters
|
||||||
checkoutAll()
|
checkoutWithIncludeExclude(args, nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
RootCmd.AddCommand(checkoutCmd)
|
RootCmd.AddCommand(checkoutCmd)
|
||||||
}
|
}
|
||||||
|
|
||||||
func checkoutAll() {
|
func checkoutWithIncludeExclude(include []string, exclude []string) {
|
||||||
ref, err := git.CurrentRef()
|
ref, err := git.CurrentRef()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
Panic(err, "Could not checkout")
|
Panic(err, "Could not checkout")
|
||||||
@ -45,13 +45,20 @@ func checkoutAll() {
|
|||||||
|
|
||||||
checkoutWithChan(c, &wait)
|
checkoutWithChan(c, &wait)
|
||||||
for _, pointer := range pointers {
|
for _, pointer := range pointers {
|
||||||
|
if lfs.FilenamePassesIncludeExcludeFilter(pointer.Name, include, exclude) {
|
||||||
c <- pointer
|
c <- pointer
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
close(c)
|
close(c)
|
||||||
wait.Wait()
|
wait.Wait()
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func checkoutAll() {
|
||||||
|
checkoutWithIncludeExclude(nil, nil)
|
||||||
|
}
|
||||||
|
|
||||||
// Populate the working copy with the real content of objects where the file is
|
// Populate the working copy with the real content of objects where the file is
|
||||||
// either missing, or contains a matching pointer placeholder, from a list of pointers.
|
// either missing, or contains a matching pointer placeholder, from a list of pointers.
|
||||||
// If the file exists but has other content it is left alone
|
// If the file exists but has other content it is left alone
|
||||||
|
63
lfs/util.go
63
lfs/util.go
@ -5,6 +5,8 @@ import (
|
|||||||
"io"
|
"io"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
"runtime"
|
||||||
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
type CallbackReader struct {
|
type CallbackReader struct {
|
||||||
@ -86,3 +88,64 @@ func wrapProgressError(err error, event, filename string) error {
|
|||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Return whether a given filename passes the include / exclude path filters
|
||||||
|
// Only paths that are in includePaths and outside excludePaths are passed
|
||||||
|
// If includePaths is empty that filter always passes and the same with excludePaths
|
||||||
|
// Both path lists support wildcard matches
|
||||||
|
func FilenamePassesIncludeExcludeFilter(filename string, includePaths, excludePaths []string) bool {
|
||||||
|
if len(includePaths) == 0 && len(excludePaths) == 0 {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// For Win32, becuase git reports files with / separators
|
||||||
|
cleanfilename := filepath.Clean(filename)
|
||||||
|
if len(includePaths) > 0 {
|
||||||
|
matched := false
|
||||||
|
for _, inc := range includePaths {
|
||||||
|
matched, _ = filepath.Match(inc, filename)
|
||||||
|
if !matched && IsWindows() {
|
||||||
|
// Also Win32 match
|
||||||
|
matched, _ = filepath.Match(inc, cleanfilename)
|
||||||
|
}
|
||||||
|
if !matched {
|
||||||
|
// Also support matching a parent directory without a wildcard
|
||||||
|
if strings.HasPrefix(cleanfilename, inc+string(filepath.Separator)) {
|
||||||
|
matched = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if matched {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
if !matched {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(excludePaths) > 0 {
|
||||||
|
for _, ex := range excludePaths {
|
||||||
|
matched, _ := filepath.Match(ex, filename)
|
||||||
|
if !matched && IsWindows() {
|
||||||
|
// Also Win32 match
|
||||||
|
matched, _ = filepath.Match(ex, cleanfilename)
|
||||||
|
}
|
||||||
|
if matched {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
// Also support matching a parent directory without a wildcard
|
||||||
|
if strings.HasPrefix(cleanfilename, ex+string(filepath.Separator)) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// Are we running on Windows? Need to handle some extra path shenanigans
|
||||||
|
func IsWindows() bool {
|
||||||
|
return runtime.GOOS == "windows"
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user