X-Git-Url: http://www.git.cypherpunks.ru/?a=blobdiff_plain;f=cleanup.go;h=efc2e97e9f5956b4fe16b0c3465141a7349479b3;hb=HEAD;hp=30f14964266805d8405f10b8e9780c2eb21bfee2;hpb=448a8aebeac3a5c411a500f65941bb3c3f90758a;p=goredo.git diff --git a/cleanup.go b/cleanup.go index 30f1496..efc2e97 100644 --- a/cleanup.go +++ b/cleanup.go @@ -1,29 +1,27 @@ -/* -goredo -- redo implementation on pure Go -Copyright (C) 2020 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 -the Free Software Foundation, version 3 of the License. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program. If not, see . -*/ +// goredo -- djb's redo implementation on pure Go +// Copyright (C) 2020-2024 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 +// the Free Software Foundation, version 3 of the License. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . package main import ( + "flag" "fmt" "io" "log" "os" "path" - "path/filepath" "strings" ) @@ -31,80 +29,107 @@ const ( CleanupFull = "full" CleanupLog = "log" CleanupTmp = "tmp" + CleanupLock = "lock" ) -func redoDirClean(root, what string) error { - root, err := filepath.Abs(root) - if err != nil { - panic(err) +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 = mustAbs(root) dir, err := os.Open(root) if err != nil { - return err + return ErrLine(err) } + defer dir.Close() for { - fis, err := dir.Readdir(1 << 10) + entries, err := dir.ReadDir(1 << 10) if err != nil { if err == io.EOF { break } - return err + return ErrLine(err) } var pth string - for _, fi := range fis { - pth = cwdMustRel(root, fi.Name()) + for _, entry := range entries { + pth = cwdMustRel(root, entry.Name()) switch what { case CleanupLog: - if strings.HasSuffix(fi.Name(), LogSuffix) { + if strings.HasSuffix(entry.Name(), LogSuffix) || + strings.HasSuffix(entry.Name(), LogRecSuffix) { fmt.Println(pth) - if err = os.Remove(pth); err != nil { - return err + if !*DryRun { + if err = os.Remove(pth); err != nil { + return ErrLine(err) + } + } + } + case CleanupLock: + if strings.HasSuffix(entry.Name(), LockSuffix) { + fmt.Println(pth) + if !*DryRun { + if err = os.Remove(pth); err != nil { + return ErrLine(err) + } } } case CleanupTmp: - if strings.HasPrefix(fi.Name(), TmpPrefix) { + if strings.HasPrefix(entry.Name(), TmpPrefix) { fmt.Println(pth) - if err = os.Remove(pth); err != nil { - return err + if !*DryRun { + if err = os.Remove(pth); err != nil { + return ErrLine(err) + } } } default: - log.Fatalln("unknown cleanup target") + log.Fatal("unknown cleanup target") } } } - return dir.Close() + return nil } func cleanupWalker(root, what string) error { - root, err := filepath.Abs(root) - if err != nil { - panic(err) - } + root = mustAbs(root) dir, err := os.Open(root) if err != nil { - return err + return ErrLine(err) } defer dir.Close() for { - fis, err := dir.Readdir(1 << 10) + entries, err := dir.ReadDir(1 << 10) if err != nil { if err == io.EOF { break } - return err + return ErrLine(err) } - for _, fi := range fis { - pth := path.Join(root, fi.Name()) - pthRel := cwdMustRel(root, fi.Name()) - if fi.IsDir() { - if fi.Name() == RedoDir { + for _, entry := range entries { + pth := path.Join(root, entry.Name()) + pthRel := cwdMustRel(root, entry.Name()) + if entry.IsDir() { + if entry.Name() == RedoDir { if what == CleanupFull { fmt.Println(pthRel) - err = os.RemoveAll(pth) + if !*DryRun { + err = ErrLine(os.RemoveAll(pth)) + } } else { err = redoDirClean(pth, what) } + } else if (what == CleanupTmp || what == CleanupFull) && + strings.HasPrefix(entry.Name(), TmpPrefix) { + fmt.Println(pthRel) + if !*DryRun { + err = ErrLine(os.RemoveAll(pth)) + } } else { err = cleanupWalker(pth, what) } @@ -114,13 +139,15 @@ func cleanupWalker(root, what string) error { continue } if (what == CleanupTmp || what == CleanupFull) && - strings.HasPrefix(fi.Name(), TmpPrefix) { + strings.HasPrefix(entry.Name(), TmpPrefix) { fmt.Println(pthRel) - if err = os.Remove(pth); err != nil { - return err + if !*DryRun { + if err = os.Remove(pth); err != nil { + return ErrLine(err) + } } } } } - return dir.Close() + return nil }