Be smart about the READONLY flag; consolidate delete
This commit is contained in:
parent
3c80d598be
commit
06eda8167f
1 changed files with 30 additions and 4 deletions
|
@ -24,6 +24,7 @@ import re
|
||||||
from shutil import copy2 as copyfile
|
from shutil import copy2 as copyfile
|
||||||
import sys
|
import sys
|
||||||
import typing as t
|
import typing as t
|
||||||
|
import stat
|
||||||
|
|
||||||
from .util import *
|
from .util import *
|
||||||
|
|
||||||
|
@ -152,6 +153,11 @@ def date_from_name(fname: str):
|
||||||
# 2017-11-05 15:15:55
|
# 2017-11-05 15:15:55
|
||||||
lambda d: safe_strptime(d, "%Y-%m-%d %H:%M:%S"),
|
lambda d: safe_strptime(d, "%Y-%m-%d %H:%M:%S"),
|
||||||
lambda d: safe_strptime(d, "%Y%m%d %h%m%s%f"),
|
lambda d: safe_strptime(d, "%Y%m%d %h%m%s%f"),
|
||||||
|
# From the dashcam(s)
|
||||||
|
# 20220427_211616_00023F
|
||||||
|
# 20220510_213347_04187R
|
||||||
|
lambda d: safe_strptime(d, "%Y%m%d %h%m%s %fF"),
|
||||||
|
lambda d: safe_strptime(d, "%Y%m%d %h%m%s %fR"),
|
||||||
# HACK:
|
# HACK:
|
||||||
# Python doesn't support %s as milliseconds; these don't quite work.
|
# Python doesn't support %s as milliseconds; these don't quite work.
|
||||||
# So use a custom matcher.
|
# So use a custom matcher.
|
||||||
|
@ -342,9 +348,25 @@ def img_info(p: Path) -> ImgInfo:
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def is_readonly(src: Path) -> bool:
|
||||||
|
statinfo = os.stat(src, dir_fd=None, follow_symlinks=True)
|
||||||
|
if statinfo.st_flags & stat.UF_IMMUTABLE:
|
||||||
|
return True
|
||||||
|
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
opts, args = parser.parse_known_args()
|
opts, args = parser.parse_known_args()
|
||||||
|
|
||||||
|
def _delete(src):
|
||||||
|
if opts.destructive:
|
||||||
|
if is_readonly(src):
|
||||||
|
print(f" warning: {src} is read-only, unable to remove")
|
||||||
|
else:
|
||||||
|
src.unlink()
|
||||||
|
print(" unlink: ok")
|
||||||
|
|
||||||
def _copy(src, target):
|
def _copy(src, target):
|
||||||
print(f" rename: {target}")
|
print(f" rename: {target}")
|
||||||
try:
|
try:
|
||||||
|
@ -357,9 +379,7 @@ def main():
|
||||||
with yaspin(SPINNER):
|
with yaspin(SPINNER):
|
||||||
copyfile(src, target)
|
copyfile(src, target)
|
||||||
|
|
||||||
if opts.destructive:
|
_delete(src)
|
||||||
src.unlink()
|
|
||||||
print(" unlink: ok")
|
|
||||||
|
|
||||||
print("---")
|
print("---")
|
||||||
|
|
||||||
|
@ -374,6 +394,9 @@ def main():
|
||||||
if src.is_dir():
|
if src.is_dir():
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
elif src.name.lower().startswith("."):
|
||||||
|
continue
|
||||||
|
|
||||||
elif ext in ["thm", "lrv", "ico", "sav"] or src.name.startswith("._"):
|
elif ext in ["thm", "lrv", "ico", "sav"] or src.name.startswith("._"):
|
||||||
if opts.destructive:
|
if opts.destructive:
|
||||||
src.unlink()
|
src.unlink()
|
||||||
|
@ -415,7 +438,10 @@ def main():
|
||||||
print(f" ok: {target}")
|
print(f" ok: {target}")
|
||||||
# src != target && id(src) == id(target); delete src
|
# src != target && id(src) == id(target); delete src
|
||||||
if opts.destructive:
|
if opts.destructive:
|
||||||
src.unlink()
|
if is_readonly(src):
|
||||||
|
print(f" warning: {src} is read-only, unable to remove")
|
||||||
|
else:
|
||||||
|
src.unlink()
|
||||||
|
|
||||||
else:
|
else:
|
||||||
# src != target && id(src) != id(target); replace target with src?
|
# src != target && id(src) != id(target); replace target with src?
|
||||||
|
|
Loading…
Reference in a new issue