Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 27 additions & 5 deletions bin/u2c.py
Original file line number Diff line number Diff line change
Expand Up @@ -640,10 +640,26 @@ def walkdir(err, top, excl, seen):
yield ap, inf
else:
err.append((ap, "irregular filetype 0%o" % (inf.st_mode,)))

def walkdir_no_recurse(err, top, excl, seen):
"""non-recursive statdir"""
atop = os.path.abspath(os.path.realpath(top))
if atop in seen:
err.append((top, "recursive-symlink"))
return

seen = seen[:] + [atop]
for ap, inf in sorted(statdir(err, top)):
if excl.match(ap):
continue
if stat.S_ISREG(inf.st_mode):
yield ap, inf
elif not stat.S_ISDIR(inf.st_mode):
err.append((ap, "irregular filetype 0%o" % (inf.st_mode,)))

def walkdirs(err, tops, excl):
"""recursive statdir for a list of tops, yields [top, relpath, stat]"""

def walkdirs(err, tops, excl, nr):
"""statdir for a list of tops, yields [top, relpath, stat]. nr determines if its (n)ot (r)ecursive"""
sep = "{0}".format(os.sep).encode("ascii")
if not VT100:
excl = excl.replace("/", r"\\")
Expand Down Expand Up @@ -675,8 +691,13 @@ def walkdirs(err, tops, excl):
if isdir:
yield stop, dn, os.stat(stop)

if nr:
dir_traverse = walkdir_no_recurse
else:
dir_traverse = walkdir

if isdir:
for ap, inf in walkdir(err, top, ptn, []):
for ap, inf in dir_traverse(err, top, ptn, []):
yield stop, ap[len(stop) :].lstrip(sep), inf
else:
d, n = top.rsplit(sep, 1)
Expand Down Expand Up @@ -941,7 +962,7 @@ def _scan(self):
nfiles = 0
nbytes = 0
err = []
for _, _, inf in walkdirs(err, ar.files, ar.x):
for _, _, inf in walkdirs(err, ar.files, ar.x, ar.nr):
if stat.S_ISDIR(inf.st_mode):
continue

Expand Down Expand Up @@ -978,7 +999,7 @@ def __init__(self, ar, stats=None):
return

self.nfiles, self.nbytes = self.stats
self.filegen = walkdirs([], ar.files, ar.x)
self.filegen = walkdirs([], ar.files, ar.x, ar.nr)
self.recheck = [] # type: list[File]
self.last_file = None

Expand Down Expand Up @@ -1552,6 +1573,7 @@ def main():
ap.add_argument("--ow", action="store_true", help="overwrite existing files instead of autorenaming")
ap.add_argument("--owo", action="store_true", help="overwrite existing files if server-file is older")
ap.add_argument("--spd", action="store_true", help="print speeds for each file")
ap.add_argument("--nr", action="store_true", help="don't scan folders within a folder")
ap.add_argument("--version", action="store_true", help="show version and exit")

ap = app.add_argument_group("print links")
Expand Down