Compare commits

..

4 Commits

1 changed files with 35 additions and 11 deletions

46
kitsune
View File

@ -54,12 +54,18 @@ def watch(args):
if st.st_mtime_ns > last_ts:
last_ts = st.st_mtime_ns
for de in os.scandir(d):
if de.is_file():
if args.match_filename is None or fnmatch.fnmatch(de.name, args.match_filename):
if de.path not in watched_files:
watched_files[de.path] = WatchedFile(de.path, seek_to_end)
if len(de.path) > filename_length:
filename_length = len(de.path)
try:
if de.is_file():
if args.match_filename is None or fnmatch.fnmatch(de.name, args.match_filename):
if de.path not in watched_files:
watched_files[de.path] = WatchedFile(de.path, seek_to_end)
if len(de.path) > filename_length:
filename_length = len(de.path)
except (PermissionError, OSError):
# ignore,
# or maybe remove from watched_files?
# or just mark as unavailable?
pass
# has any of the files changed
for f in watched_files.values():
@ -71,7 +77,7 @@ def watch(args):
if stf.st_ino != st.st_ino:
f.reopen()
st = os.stat(f.fileno)
except FileNotFoundError:
except (FileNotFoundError, PermissionError):
# ignore,
# or maybe remove from watched_files?
# or just mark as deleted?
@ -88,11 +94,23 @@ def watch(args):
if lines[-1] == "":
lines.pop()
for ln in lines:
print(f"{f.path:{filename_length}}", format_ts(f.last_ts), dead, ln)
s = ""
if args.print_filename:
s += f"{f.path:{filename_length}} "
if args.print_timestamp:
s += format_ts(f.last_ts) + " "
s += dead + " " + ln
print(s)
else:
stf = os.stat(f.path)
if stf.st_ctime_ns != f.st_ctime_ns:
f.reopen()
try:
stf = os.stat(f.path)
if stf.st_ctime_ns != f.st_ctime_ns:
f.reopen()
except (FileNotFoundError, PermissionError):
# ignore,
# or maybe remove from watched_files?
# or just mark as deleted?
pass
time.sleep(0.1)
seek_to_end = False
@ -103,6 +121,12 @@ if __name__ == "__main__":
ap.add_argument("--match-filename",
help="follow only matching files in directories",
metavar="GLOB-PATTERN")
ap.add_argument("--no-filename", "--no-print-filename", action="store_false",
dest="print_filename",
help="don't print filename in each line")
ap.add_argument("--no-timestamp", "--no-print-timestamp", action="store_false",
dest="print_timestamp",
help="don't print timestamp in each line")
ap.add_argument("files", nargs="*", default=["."],
metavar="file")
args = ap.parse_args()