Unverified 提交 05b3b817 作者: Steven Allen 提交者: GitHub

Merge pull request #5555 from overbool/feat/add-force-flag-for-files-rm

feat(command): add force flag for files rm
...@@ -1002,6 +1002,7 @@ Remove files or directories. ...@@ -1002,6 +1002,7 @@ Remove files or directories.
}, },
Options: []cmdkit.Option{ Options: []cmdkit.Option{
cmdkit.BoolOption("recursive", "r", "Recursively remove directories."), 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) { Run: func(req oldcmds.Request, res oldcmds.Response) {
defer res.SetOutput(nil) defer res.SetOutput(nil)
...@@ -1041,8 +1042,6 @@ Remove files or directories. ...@@ -1041,8 +1042,6 @@ Remove files or directories.
return return
} }
dashr, _, _ := req.Option("r").Bool()
var success bool var success bool
defer func() { defer func() {
if success { if success {
...@@ -1054,8 +1053,10 @@ Remove files or directories. ...@@ -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 '--force' specified, it will remove anything else,
if dashr { // including file, directory, corrupted node, etc
force, _, _ := req.Option("force").Bool()
if force {
err := pdir.Unlink(name) err := pdir.Unlink(name)
if err != nil { if err != nil {
res.SetError(err, cmdkit.ErrNormal) res.SetError(err, cmdkit.ErrNormal)
...@@ -1066,25 +1067,31 @@ Remove files or directories. ...@@ -1066,25 +1067,31 @@ Remove files or directories.
return 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 { if err != nil {
res.SetError(err, cmdkit.ErrNormal) res.SetError(err, cmdkit.ErrNormal)
return return
} }
switch childi.(type) { dashr, _, _ := req.Option("r").Bool()
switch child.(type) {
case *mfs.Directory: case *mfs.Directory:
res.SetError(fmt.Errorf("%s is a directory, use -r to remove directories", path), cmdkit.ErrNormal) if !dashr {
return res.SetError(fmt.Errorf("%s is a directory, use -r to remove directories", path), cmdkit.ErrNormal)
default:
err := pdir.Unlink(name)
if err != nil {
res.SetError(err, cmdkit.ErrNormal)
return return
} }
}
success = true err = pdir.Unlink(name)
if err != nil {
res.SetError(err, cmdkit.ErrNormal)
return
} }
success = true
}, },
} }
......
...@@ -629,6 +629,20 @@ test_files_api() { ...@@ -629,6 +629,20 @@ test_files_api() {
test_expect_success "repo gc $EXTRA" ' test_expect_success "repo gc $EXTRA" '
ipfs repo gc ipfs repo gc
' '
# test rm
test_expect_success "remove file forcibly" '
echo "hello world" | ipfs files write --create /forcibly &&
ipfs files rm --force /forcibly &&
verify_dir_contents /
'
test_expect_success "remove directory forcibly" '
ipfs files mkdir /forcibly-dir &&
ipfs files rm --force /forcibly-dir &&
verify_dir_contents /
'
} }
# test offline and online # test offline and online
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论