From ca5e6c7fdcf6e8530a98c3ae374e0d2af2c2dcc1 Mon Sep 17 00:00:00 2001 From: Avril Date: Sat, 25 Apr 2020 13:29:26 +0100 Subject: [PATCH] thread number spec --- .gitignore | 2 ++ lazy-rebuild.go | 81 ++++++++++++++++++++++++++++++++++++++++--------- 2 files changed, 68 insertions(+), 15 deletions(-) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..db111e8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +test/ +lazy-rebuild diff --git a/lazy-rebuild.go b/lazy-rebuild.go index 385c594..1ebab51 100644 --- a/lazy-rebuild.go +++ b/lazy-rebuild.go @@ -10,6 +10,8 @@ import ( "strings" //"log" "os" + "sync" + "strconv" ) var keepLongExt bool = false @@ -64,47 +66,93 @@ func dofile(i int, y string) { fmt.Printf("(%d) %s -> %s\n", i, y, newname) } } +var maxThreads int = 0 func main() { ar := os.Args[1:]; + var wg sync.WaitGroup + if (len(ar) < 1) { - fmt.Printf("Usage: %s [--long] [--fake] [--recurse] [-quiet] \n\t--long\tKeep long file extensions\n\t--fake\tDo not rename files.\n\t--recurse\tWalk path recursively.\n\t--quiet\tDo not show (some) errors.\n", os.Args[0]) + fmt.Printf("Usage: %s [--long] [--fake] [--recurse] [-quiet] [--threads ] \n\t--long\tKeep long file extensions\n\t--fake\tDo not rename files.\n\t--recurse\tWalk path recursively.\n\t--quiet\tDo not show (some) errors.\n", os.Args[0]) return; } + var ignore = false for i, x := range ar { + if ignore { + ignore=false + continue + } if( strings.HasPrefix(x, "--")) { switch x[2:] { - case "long": - keepLongExt = !keepLongExt - case "fake": - fake = !fake - case "recurse": - recurse = !recurse - case "quiet": - noErr = !noErr - default: - fmt.Printf("Unknown flag \"%s\"\n", x) + case "long": + keepLongExt = !keepLongExt + case "fake": + fake = !fake + case "recurse": + recurse = !recurse + case "quiet": + noErr = !noErr + case "threads": + if i0 { + sem = make(chan bool, maxThreads) + }else { + sem = make(chan bool) + } + + var _dofile = func(i int, s string) { + if maxThreads == 1 { + dofile(i,s) + return + } + wg.Add(1) + if(maxThreads>0) { + sem <- true + } + + go func() { + defer wg.Done() + dofile(i,s) + if(maxThreads>0) { + <-sem + } + }() + } + if(fi.Mode().IsDir()) { if(recurse) { filepath.Walk(x, func(path string, f os.FileInfo, err error) error { if(!f.Mode().IsDir()) { - dofile(i,path) + _dofile(i,path) } return nil }) } else { files, err := ioutil.ReadDir(x) if err != nil { - fmt.Printf("E: Error enumerating files: %s\n", err) + fmt.Printf("E: Error enumerating files in %s: %s\n", x, err) } else { for _, f := range files { if(!f.Mode().IsDir()) { fl := fmt.Sprintf("%s/%s", x, f.Name()) - dofile(i,fl) + _dofile(i,fl) } else { fmt.Printf("!: Ignoring %s (is directory)\n", f.Name()) } @@ -113,11 +161,14 @@ func main() { } } else { - dofile(i, x) + _dofile(i, x) } + close(sem) + } } } + wg.Wait() return; }