17db96d56Sopenharmony_ci#! /usr/bin/env python3
27db96d56Sopenharmony_ci# Format du output in a tree shape
37db96d56Sopenharmony_ci
47db96d56Sopenharmony_ciimport os, sys, errno
57db96d56Sopenharmony_ci
67db96d56Sopenharmony_cidef main():
77db96d56Sopenharmony_ci    total, d = None, {}
87db96d56Sopenharmony_ci    with os.popen('du ' + ' '.join(sys.argv[1:])) as p:
97db96d56Sopenharmony_ci        for line in p:
107db96d56Sopenharmony_ci            i = 0
117db96d56Sopenharmony_ci            while line[i] in '0123456789': i = i+1
127db96d56Sopenharmony_ci            size = eval(line[:i])
137db96d56Sopenharmony_ci            while line[i] in ' \t': i = i+1
147db96d56Sopenharmony_ci            filename = line[i:-1]
157db96d56Sopenharmony_ci            comps = filename.split('/')
167db96d56Sopenharmony_ci            if comps[0] == '': comps[0] = '/'
177db96d56Sopenharmony_ci            if comps[len(comps)-1] == '': del comps[len(comps)-1]
187db96d56Sopenharmony_ci            total, d = store(size, comps, total, d)
197db96d56Sopenharmony_ci    try:
207db96d56Sopenharmony_ci        display(total, d)
217db96d56Sopenharmony_ci    except IOError as e:
227db96d56Sopenharmony_ci        if e.errno != errno.EPIPE:
237db96d56Sopenharmony_ci            raise
247db96d56Sopenharmony_ci
257db96d56Sopenharmony_cidef store(size, comps, total, d):
267db96d56Sopenharmony_ci    if comps == []:
277db96d56Sopenharmony_ci        return size, d
287db96d56Sopenharmony_ci    if comps[0] not in d:
297db96d56Sopenharmony_ci        d[comps[0]] = None, {}
307db96d56Sopenharmony_ci    t1, d1 = d[comps[0]]
317db96d56Sopenharmony_ci    d[comps[0]] = store(size, comps[1:], t1, d1)
327db96d56Sopenharmony_ci    return total, d
337db96d56Sopenharmony_ci
347db96d56Sopenharmony_cidef display(total, d):
357db96d56Sopenharmony_ci    show(total, d, '')
367db96d56Sopenharmony_ci
377db96d56Sopenharmony_cidef show(total, d, prefix):
387db96d56Sopenharmony_ci    if not d: return
397db96d56Sopenharmony_ci    list = []
407db96d56Sopenharmony_ci    sum = 0
417db96d56Sopenharmony_ci    for key in d.keys():
427db96d56Sopenharmony_ci        tsub, dsub = d[key]
437db96d56Sopenharmony_ci        list.append((tsub, key))
447db96d56Sopenharmony_ci        if tsub is not None: sum = sum + tsub
457db96d56Sopenharmony_ci##  if sum < total:
467db96d56Sopenharmony_ci##      list.append((total - sum, os.curdir))
477db96d56Sopenharmony_ci    list.sort()
487db96d56Sopenharmony_ci    list.reverse()
497db96d56Sopenharmony_ci    width = len(repr(list[0][0]))
507db96d56Sopenharmony_ci    for tsub, key in list:
517db96d56Sopenharmony_ci        if tsub is None:
527db96d56Sopenharmony_ci            psub = prefix
537db96d56Sopenharmony_ci        else:
547db96d56Sopenharmony_ci            print(prefix + repr(tsub).rjust(width) + ' ' + key)
557db96d56Sopenharmony_ci            psub = prefix + ' '*(width-1) + '|' + ' '*(len(key)+1)
567db96d56Sopenharmony_ci        if key in d:
577db96d56Sopenharmony_ci            show(tsub, d[key][1], psub)
587db96d56Sopenharmony_ci
597db96d56Sopenharmony_ciif __name__ == '__main__':
607db96d56Sopenharmony_ci    main()
61