Mercurial > hg > config
annotate python/tree.py @ 376:3f84a96cccf6
minor improvements; need a thought or two for the real answer
author | Jeff Hammel <jhammel@mozilla.com> |
---|---|
date | Wed, 24 Jul 2013 06:59:09 -0700 |
parents | 9314c1008189 |
children | b1c43c980b05 |
rev | line source |
---|---|
374 | 1 #!/usr/bin/env python |
2 # -*- coding: utf-8 -*- | |
3 | |
4 """ | |
5 tree in python | |
6 """ | |
7 | |
8 import optparse | |
9 import os | |
10 import sys | |
11 | |
12 here = os.path.dirname(os.path.realpath(__file__)) | |
13 | |
14 def depth(directory): | |
15 directory = os.path.abspath(directory) | |
16 level = 0 | |
17 while True: | |
18 directory, remainder = os.path.split(directory) | |
19 level += 1 | |
20 if not remainder: | |
21 break | |
22 return level | |
23 | |
24 def tree(directory): | |
25 retval = [] | |
26 level = depth(directory) | |
27 directories = {} | |
376
3f84a96cccf6
minor improvements; need a thought or two for the real answer
Jeff Hammel <jhammel@mozilla.com>
parents:
375
diff
changeset
|
28 lvlndctr = [] |
3f84a96cccf6
minor improvements; need a thought or two for the real answer
Jeff Hammel <jhammel@mozilla.com>
parents:
375
diff
changeset
|
29 last = {} |
3f84a96cccf6
minor improvements; need a thought or two for the real answer
Jeff Hammel <jhammel@mozilla.com>
parents:
375
diff
changeset
|
30 columns = [] |
3f84a96cccf6
minor improvements; need a thought or two for the real answer
Jeff Hammel <jhammel@mozilla.com>
parents:
375
diff
changeset
|
31 lastdepth = depth |
374 | 32 for dirpath, dirnames, filenames in os.walk(directory, topdown=True): |
376
3f84a96cccf6
minor improvements; need a thought or two for the real answer
Jeff Hammel <jhammel@mozilla.com>
parents:
375
diff
changeset
|
33 basename = os.path.basename(dirpath) |
3f84a96cccf6
minor improvements; need a thought or two for the real answer
Jeff Hammel <jhammel@mozilla.com>
parents:
375
diff
changeset
|
34 parent = os.path.abspath(os.path.dirname(dirpath)) |
374 | 35 indent = depth(dirpath) - level |
36 dirnames[:] = sorted(dirnames, key=lambda x: x.lower()) | |
376
3f84a96cccf6
minor improvements; need a thought or two for the real answer
Jeff Hammel <jhammel@mozilla.com>
parents:
375
diff
changeset
|
37 last[os.path.abspath(dirpath)] = dirnames and dirnames[-1] or None |
374 | 38 directories[dirpath] = dirnames |
39 retval.append('%s%s%s' % ('│' * (indent-1), | |
376
3f84a96cccf6
minor improvements; need a thought or two for the real answer
Jeff Hammel <jhammel@mozilla.com>
parents:
375
diff
changeset
|
40 ('├' if basename == basename else '└') if indent else '', |
3f84a96cccf6
minor improvements; need a thought or two for the real answer
Jeff Hammel <jhammel@mozilla.com>
parents:
375
diff
changeset
|
41 basename)) |
375
9314c1008189
aslightly better; still trouble at da end
Jeff Hammel <jhammel@mozilla.com>
parents:
374
diff
changeset
|
42 filenames = sorted(filenames, key=lambda x: x.lower()) |
374 | 43 retval.extend(['%s%s%s' % ('│' * (indent), |
375
9314c1008189
aslightly better; still trouble at da end
Jeff Hammel <jhammel@mozilla.com>
parents:
374
diff
changeset
|
44 '├' if (((index < len(filenames) -1)) or dirnames) else '└', |
374 | 45 name) |
46 for index, name in | |
375
9314c1008189
aslightly better; still trouble at da end
Jeff Hammel <jhammel@mozilla.com>
parents:
374
diff
changeset
|
47 enumerate(filenames) |
374 | 48 ]) |
49 return '\n'.join(retval) | |
50 | |
51 def main(args=sys.argv[1:]): | |
52 | |
53 usage = '%prog [options]' | |
54 parser = optparse.OptionParser(usage=usage, description=__doc__) | |
55 options, args = parser.parse_args(args) | |
56 if not args: | |
57 args = ['.'] | |
58 | |
59 not_directory = [arg for arg in args | |
60 if not os.path.isdir(arg)] | |
61 if not_directory: | |
62 parser.error("Not a directory: %s" % (', '.join(not_directory))) | |
63 | |
64 for arg in args: | |
65 print (tree(arg)) | |
66 | |
67 if __name__ == '__main__': | |
68 main() |