2 goredo -- djb's redo implementation on pure Go
3 Copyright (C) 2020-2021 Sergey Matveev <stargrave@stargrave.org>
5 This program is free software: you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation, version 3 of the License.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program. If not, see <http://www.gnu.org/licenses/>.
38 DryRun = flag.Bool("dry-run", false, "do no delete files during cleanup, just show them")
41 func redoDirClean(root, what string) error {
42 root, err := filepath.Abs(root)
46 dir, err := os.Open(root)
51 fis, err := dir.Readdir(1 << 10)
59 for _, fi := range fis {
60 pth = cwdMustRel(root, fi.Name())
63 if strings.HasSuffix(fi.Name(), LogSuffix) {
66 if err = os.Remove(pth); err != nil {
72 if strings.HasPrefix(fi.Name(), TmpPrefix) {
75 if err = os.Remove(pth); err != nil {
81 log.Fatalln("unknown cleanup target")
88 func cleanupWalker(root, what string) error {
89 root, err := filepath.Abs(root)
93 dir, err := os.Open(root)
99 fis, err := dir.Readdir(1 << 10)
106 for _, fi := range fis {
107 pth := path.Join(root, fi.Name())
108 pthRel := cwdMustRel(root, fi.Name())
110 if fi.Name() == RedoDir {
111 if what == CleanupFull {
114 err = os.RemoveAll(pth)
117 err = redoDirClean(pth, what)
120 err = cleanupWalker(pth, what)
127 if (what == CleanupTmp || what == CleanupFull) &&
128 strings.HasPrefix(fi.Name(), TmpPrefix) {
131 if err = os.Remove(pth); err != nil {