From bd23e7d2ed4db6e2058d285fe3a51511b2af1b37 Mon Sep 17 00:00:00 2001 From: Overbool Date: Wed, 3 Oct 2018 21:47:41 +0800 Subject: [PATCH] feat(command): add force flag for files rm License: MIT Signed-off-by: Overbool --- core/commands/files.go | 35 +++++++++++++++++++++-------------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/core/commands/files.go b/core/commands/files.go index bf6b06b5e..facf13c62 100644 --- a/core/commands/files.go +++ b/core/commands/files.go @@ -1002,6 +1002,7 @@ Remove files or directories. }, Options: []cmdkit.Option{ cmdkit.BoolOption("recursive", "r", "Recursively remove directories."), + cmdkit.BoolOption("force", "Forcibly remove target at path; implies -r for directories"), }, Run: func(req oldcmds.Request, res oldcmds.Response) { defer res.SetOutput(nil) @@ -1041,8 +1042,6 @@ Remove files or directories. return } - dashr, _, _ := req.Option("r").Bool() - var success bool defer func() { if success { @@ -1054,8 +1053,10 @@ Remove files or directories. } }() - // if '-r' specified, don't check file type (in bad scenarios, the block may not exist) - if dashr { + // if '--force' specified, it will remove anything else, + // including file, directory, corrupted node, etc + force, _, _ := req.Option("force").Bool() + if force { err := pdir.Unlink(name) if err != nil { res.SetError(err, cmdkit.ErrNormal) @@ -1066,25 +1067,31 @@ Remove files or directories. return } - childi, err := pdir.Child(name) + // get child node by name, when the node is corrupted and nonexistent, + // it will return specific error. + child, err := pdir.Child(name) if err != nil { res.SetError(err, cmdkit.ErrNormal) return } - switch childi.(type) { + dashr, _, _ := req.Option("r").Bool() + + switch child.(type) { case *mfs.Directory: - res.SetError(fmt.Errorf("%s is a directory, use -r to remove directories", path), cmdkit.ErrNormal) - return - default: - err := pdir.Unlink(name) - if err != nil { - res.SetError(err, cmdkit.ErrNormal) + if !dashr { + res.SetError(fmt.Errorf("%s is a directory, use -r to remove directories", path), cmdkit.ErrNormal) return } - - success = true } + + err = pdir.Unlink(name) + if err != nil { + res.SetError(err, cmdkit.ErrNormal) + return + } + + success = true }, }