X-Git-Url: http://www.git.cypherpunks.ru/?a=blobdiff_plain;f=cleanup.go;h=09a72203ad2be8bcb29162128fcfe8fc9be78dc3;hb=19b13ea1334d377dd9c6a36ea70c9141b8fd447d;hp=a98510d1ec4d7763913310cd194484decce9ea68;hpb=f15fe27971bcf37a06bb9542ea1907f11444515a;p=goredo.git diff --git a/cleanup.go b/cleanup.go index a98510d..09a7220 100644 --- a/cleanup.go +++ b/cleanup.go @@ -1,6 +1,6 @@ /* -goredo -- redo implementation on pure Go -Copyright (C) 2020 Sergey Matveev +goredo -- djb's redo implementation on pure Go +Copyright (C) 2020-2022 Sergey Matveev This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -18,6 +18,7 @@ along with this program. If not, see . package main import ( + "flag" "fmt" "io" "log" @@ -31,8 +32,18 @@ const ( CleanupFull = "full" CleanupLog = "log" CleanupTmp = "tmp" + CleanupLock = "lock" ) +var DryRun *bool + +func init() { + if CmdName() != CmdNameRedoCleanup { + return + } + DryRun = flag.Bool("n", false, "do no delete files during cleanup, just show them") +} + func redoDirClean(root, what string) error { root, err := filepath.Abs(root) if err != nil { @@ -42,6 +53,7 @@ func redoDirClean(root, what string) error { if err != nil { return err } + defer dir.Close() for { fis, err := dir.Readdir(1 << 10) if err != nil { @@ -52,23 +64,34 @@ func redoDirClean(root, what string) error { } var pth string for _, fi := range fis { - pth, err = filepath.Rel(Cwd, path.Join(root, fi.Name())) - if err != nil { - panic(err) - } + pth = cwdMustRel(root, fi.Name()) switch what { case CleanupLog: - if strings.HasSuffix(fi.Name(), LogSuffix) { + if strings.HasSuffix(fi.Name(), LogSuffix) || + strings.HasSuffix(fi.Name(), LogRecSuffix) { fmt.Println(pth) - if err = os.Remove(pth); err != nil { - return err + if !*DryRun { + if err = os.Remove(pth); err != nil { + return err + } + } + } + case CleanupLock: + if strings.HasSuffix(fi.Name(), LockSuffix) { + fmt.Println(pth) + if !*DryRun { + if err = os.Remove(pth); err != nil { + return err + } } } case CleanupTmp: if strings.HasPrefix(fi.Name(), TmpPrefix) { fmt.Println(pth) - if err = os.Remove(pth); err != nil { - return err + if !*DryRun { + if err = os.Remove(pth); err != nil { + return err + } } } default: @@ -76,7 +99,7 @@ func redoDirClean(root, what string) error { } } } - return dir.Close() + return nil } func cleanupWalker(root, what string) error { @@ -97,20 +120,25 @@ func cleanupWalker(root, what string) error { } return err } - var pth string for _, fi := range fis { - pth, err = filepath.Rel(Cwd, path.Join(root, fi.Name())) - if err != nil { - panic(err) - } + pth := path.Join(root, fi.Name()) + pthRel := cwdMustRel(root, fi.Name()) if fi.IsDir() { if fi.Name() == RedoDir { if what == CleanupFull { - fmt.Println(pth) - err = os.RemoveAll(pth) + fmt.Println(pthRel) + if !*DryRun { + err = os.RemoveAll(pth) + } } else { err = redoDirClean(pth, what) } + } else if (what == CleanupTmp || what == CleanupFull) && + strings.HasPrefix(fi.Name(), TmpPrefix) { + fmt.Println(pthRel) + if !*DryRun { + err = os.RemoveAll(pth) + } } else { err = cleanupWalker(pth, what) } @@ -121,12 +149,14 @@ func cleanupWalker(root, what string) error { } if (what == CleanupTmp || what == CleanupFull) && strings.HasPrefix(fi.Name(), TmpPrefix) { - fmt.Println(pth) - if err = os.Remove(pth); err != nil { - return err + fmt.Println(pthRel) + if !*DryRun { + if err = os.Remove(pth); err != nil { + return err + } } } } } - return dir.Close() + return nil }