tools/mpremote: Add recursive remove functionality to filesystem cmds.
mpremote now supports `mpremote rm -r`. Addresses #9802 and #16845. Signed-off-by: Jos Verlinde <Jos_Verlinde@hotmail.com>
This commit is contained in:
committed by
Damien George
parent
037f2dad72
commit
1aa9b3d94b
@@ -1,4 +1,5 @@
|
|||||||
import binascii
|
import binascii
|
||||||
|
import errno
|
||||||
import hashlib
|
import hashlib
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
@@ -300,6 +301,28 @@ def do_filesystem_recursive_cp(state, src, dest, multiple, check_hash):
|
|||||||
do_filesystem_cp(state, src_path_joined, dest_path_joined, False, check_hash)
|
do_filesystem_cp(state, src_path_joined, dest_path_joined, False, check_hash)
|
||||||
|
|
||||||
|
|
||||||
|
def do_filesystem_recursive_rm(state, path, args):
|
||||||
|
if state.transport.fs_isdir(path):
|
||||||
|
for entry in state.transport.fs_listdir(path):
|
||||||
|
do_filesystem_recursive_rm(state, _remote_path_join(path, entry.name), args)
|
||||||
|
if path:
|
||||||
|
try:
|
||||||
|
state.transport.fs_rmdir(path)
|
||||||
|
if args.verbose:
|
||||||
|
print(f"removed directory: '{path}'")
|
||||||
|
except OSError as e:
|
||||||
|
if e.errno != errno.EINVAL: # not vfs mountpoint
|
||||||
|
raise CommandError(
|
||||||
|
f"rm -r: cannot remove :{path} {os.strerror(e.errno) if e.errno else ''}"
|
||||||
|
) from e
|
||||||
|
if args.verbose:
|
||||||
|
print(f"skipped: '{path}' (vfs mountpoint)")
|
||||||
|
else:
|
||||||
|
state.transport.fs_rmfile(path)
|
||||||
|
if args.verbose:
|
||||||
|
print(f"removed: '{path}'")
|
||||||
|
|
||||||
|
|
||||||
def do_filesystem(state, args):
|
def do_filesystem(state, args):
|
||||||
state.ensure_raw_repl()
|
state.ensure_raw_repl()
|
||||||
state.did_action()
|
state.did_action()
|
||||||
@@ -352,7 +375,10 @@ def do_filesystem(state, args):
|
|||||||
elif command == "mkdir":
|
elif command == "mkdir":
|
||||||
state.transport.fs_mkdir(path)
|
state.transport.fs_mkdir(path)
|
||||||
elif command == "rm":
|
elif command == "rm":
|
||||||
state.transport.fs_rmfile(path)
|
if args.recursive:
|
||||||
|
do_filesystem_recursive_rm(state, path, args)
|
||||||
|
else:
|
||||||
|
state.transport.fs_rmfile(path)
|
||||||
elif command == "rmdir":
|
elif command == "rmdir":
|
||||||
state.transport.fs_rmdir(path)
|
state.transport.fs_rmdir(path)
|
||||||
elif command == "touch":
|
elif command == "touch":
|
||||||
|
|||||||
@@ -182,7 +182,7 @@ def argparse_rtc():
|
|||||||
|
|
||||||
def argparse_filesystem():
|
def argparse_filesystem():
|
||||||
cmd_parser = argparse.ArgumentParser(description="execute filesystem commands on the device")
|
cmd_parser = argparse.ArgumentParser(description="execute filesystem commands on the device")
|
||||||
_bool_flag(cmd_parser, "recursive", "r", False, "recursive copy (for cp command only)")
|
_bool_flag(cmd_parser, "recursive", "r", False, "recursive (for cp and rm commands)")
|
||||||
_bool_flag(
|
_bool_flag(
|
||||||
cmd_parser,
|
cmd_parser,
|
||||||
"force",
|
"force",
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
# THE SOFTWARE.
|
# THE SOFTWARE.
|
||||||
|
|
||||||
import ast, hashlib, os, sys
|
import ast, errno, hashlib, os, sys
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
|
|
||||||
|
|
||||||
@@ -63,6 +63,10 @@ def _convert_filesystem_error(e, info):
|
|||||||
return FileExistsError(info)
|
return FileExistsError(info)
|
||||||
if "OSError" in e.error_output and "ENODEV" in e.error_output:
|
if "OSError" in e.error_output and "ENODEV" in e.error_output:
|
||||||
return FileNotFoundError(info)
|
return FileNotFoundError(info)
|
||||||
|
if "OSError" in e.error_output and "EINVAL" in e.error_output:
|
||||||
|
return OSError(errno.EINVAL, info)
|
||||||
|
if "OSError" in e.error_output and "EPERM" in e.error_output:
|
||||||
|
return OSError(errno.EPERM, info)
|
||||||
return e
|
return e
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user