fs: filter flags ability to read from stdin - fixes #4034

This commit is contained in:
fishbullet
2020-03-15 16:58:46 +03:00
committed by Nick Craig-Wood
parent a6a2eec392
commit eb0fc21533
5 changed files with 42 additions and 16 deletions

View File

@@ -465,12 +465,17 @@ func (f *Filter) IncludeObject(ctx context.Context, o fs.Object) bool {
//
// It ignores empty lines and lines starting with '#' or ';'
func forEachLine(path string, fn func(string) error) (err error) {
in, err := os.Open(path)
if err != nil {
return err
var scanner *bufio.Scanner
if path == "-" {
scanner = bufio.NewScanner(os.Stdin)
} else {
in, err := os.Open(path)
if err != nil {
return err
}
scanner = bufio.NewScanner(in)
defer fs.CheckClose(in, &err)
}
defer fs.CheckClose(in, &err)
scanner := bufio.NewScanner(in)
for scanner.Scan() {
line := scanner.Text()
line = strings.TrimSpace(line)

View File

@@ -517,7 +517,7 @@ func TestFilterAddDirRuleOrFileRule(t *testing.T) {
}
}
func TestFilterForEachLine(t *testing.T) {
func testFilterForEachLine(t *testing.T, useStdin bool) {
file := testFile(t, `; comment
one
# another comment
@@ -534,7 +534,19 @@ five
require.NoError(t, err)
}()
lines := []string{}
err := forEachLine(file, func(s string) error {
fileName := file
if useStdin {
in, err := os.Open(file)
require.NoError(t, err)
oldStdin := os.Stdin
os.Stdin = in
defer func() {
os.Stdin = oldStdin
_ = in.Close()
}()
fileName = "-"
}
err := forEachLine(fileName, func(s string) error {
lines = append(lines, s)
return nil
})
@@ -542,6 +554,14 @@ five
assert.Equal(t, "one,two,three,four,five,six", strings.Join(lines, ","))
}
func TestFilterForEachLine(t *testing.T) {
testFilterForEachLine(t, false)
}
func TestFilterForEachLineStdin(t *testing.T) {
testFilterForEachLine(t, true)
}
func TestFilterMatchesFromDocs(t *testing.T) {
for _, test := range []struct {
glob string

View File

@@ -24,13 +24,13 @@ func AddFlags(flagSet *pflag.FlagSet) {
rc.AddOptionReload("filter", &Opt, Reload)
flags.BoolVarP(flagSet, &Opt.DeleteExcluded, "delete-excluded", "", false, "Delete files on dest excluded from sync")
flags.StringArrayVarP(flagSet, &Opt.FilterRule, "filter", "f", nil, "Add a file-filtering rule")
flags.StringArrayVarP(flagSet, &Opt.FilterFrom, "filter-from", "", nil, "Read filtering patterns from a file")
flags.StringArrayVarP(flagSet, &Opt.FilterFrom, "filter-from", "", nil, "Read filtering patterns from a file (use - to read from stdin)")
flags.StringArrayVarP(flagSet, &Opt.ExcludeRule, "exclude", "", nil, "Exclude files matching pattern")
flags.StringArrayVarP(flagSet, &Opt.ExcludeFrom, "exclude-from", "", nil, "Read exclude patterns from file")
flags.StringArrayVarP(flagSet, &Opt.ExcludeFrom, "exclude-from", "", nil, "Read exclude patterns from file (use - to read from stdin)")
flags.StringVarP(flagSet, &Opt.ExcludeFile, "exclude-if-present", "", "", "Exclude directories if filename is present")
flags.StringArrayVarP(flagSet, &Opt.IncludeRule, "include", "", nil, "Include files matching pattern")
flags.StringArrayVarP(flagSet, &Opt.IncludeFrom, "include-from", "", nil, "Read include patterns from file")
flags.StringArrayVarP(flagSet, &Opt.FilesFrom, "files-from", "", nil, "Read list of source-file names from file")
flags.StringArrayVarP(flagSet, &Opt.IncludeFrom, "include-from", "", nil, "Read include patterns from file (use - to read from stdin)")
flags.StringArrayVarP(flagSet, &Opt.FilesFrom, "files-from", "", nil, "Read list of source-file names from file (use - to read from stdin)")
flags.FVarP(flagSet, &Opt.MinAge, "min-age", "", "Only transfer files older than this in s or suffix ms|s|m|h|d|w|M|y")
flags.FVarP(flagSet, &Opt.MaxAge, "max-age", "", "Only transfer files younger than this in s or suffix ms|s|m|h|d|w|M|y")
flags.FVarP(flagSet, &Opt.MinSize, "min-size", "", "Only transfer files bigger than this in k or suffix b|k|M|G")