Mercurial > hg > config
annotate python/unroll_deps.py @ 929:7c4be71a560b default tip
remove old aliases
| author | Jeff Hammel <k0scist@gmail.com> | 
|---|---|
| date | Mon, 20 Oct 2025 15:22:19 -0700 | 
| parents | 3fe1024377ca | 
| children | 
| rev | line source | 
|---|---|
| 679 
da62e6411ab7
STUB: python/unroll_deps.py
 Jeff Hammel <k0scist@gmail.com> parents: 
155diff
changeset | 1 #!/usr/bin/env python | 
| 149 
05e461e4b409
add an unroll-deps example prog
 Jeff Hammel <jhammel@mozilla.com> parents: diff
changeset | 2 | 
| 682 
3fe1024377ca
STUB: python/unroll_deps.py
 Jeff Hammel <k0scist@gmail.com> parents: 
681diff
changeset | 3 """ | 
| 
3fe1024377ca
STUB: python/unroll_deps.py
 Jeff Hammel <k0scist@gmail.com> parents: 
681diff
changeset | 4 unroll a set of dependencies | 
| 
3fe1024377ca
STUB: python/unroll_deps.py
 Jeff Hammel <k0scist@gmail.com> parents: 
681diff
changeset | 5 """ | 
| 
3fe1024377ca
STUB: python/unroll_deps.py
 Jeff Hammel <k0scist@gmail.com> parents: 
681diff
changeset | 6 | 
| 
3fe1024377ca
STUB: python/unroll_deps.py
 Jeff Hammel <k0scist@gmail.com> parents: 
681diff
changeset | 7 import sys | 
| 
3fe1024377ca
STUB: python/unroll_deps.py
 Jeff Hammel <k0scist@gmail.com> parents: 
681diff
changeset | 8 | 
| 153 
17310d15ad26
alternate method + more tests
 Jeff Hammel <jhammel@mozilla.com> parents: 
152diff
changeset | 9 def cycle_check(order, dependencies): | 
| 
17310d15ad26
alternate method + more tests
 Jeff Hammel <jhammel@mozilla.com> parents: 
152diff
changeset | 10 """ensure no cyclic dependencies""" | 
| 
17310d15ad26
alternate method + more tests
 Jeff Hammel <jhammel@mozilla.com> parents: 
152diff
changeset | 11 order_dict = dict([(j, i) for i, j in enumerate(order)]) | 
| 
17310d15ad26
alternate method + more tests
 Jeff Hammel <jhammel@mozilla.com> parents: 
152diff
changeset | 12 for package, deps in dependencies.items(): | 
| 
17310d15ad26
alternate method + more tests
 Jeff Hammel <jhammel@mozilla.com> parents: 
152diff
changeset | 13 index = order_dict[package] | 
| 
17310d15ad26
alternate method + more tests
 Jeff Hammel <jhammel@mozilla.com> parents: 
152diff
changeset | 14 for d in deps: | 
| 
17310d15ad26
alternate method + more tests
 Jeff Hammel <jhammel@mozilla.com> parents: 
152diff
changeset | 15 assert index > order_dict[d], "Cyclic dependencies detected" | 
| 
17310d15ad26
alternate method + more tests
 Jeff Hammel <jhammel@mozilla.com> parents: 
152diff
changeset | 16 | 
| 
17310d15ad26
alternate method + more tests
 Jeff Hammel <jhammel@mozilla.com> parents: 
152diff
changeset | 17 | 
| 149 
05e461e4b409
add an unroll-deps example prog
 Jeff Hammel <jhammel@mozilla.com> parents: diff
changeset | 18 def unroll_dependencies(dependencies): | 
| 
05e461e4b409
add an unroll-deps example prog
 Jeff Hammel <jhammel@mozilla.com> parents: diff
changeset | 19 """unroll dependencies""" | 
| 
05e461e4b409
add an unroll-deps example prog
 Jeff Hammel <jhammel@mozilla.com> parents: diff
changeset | 20 order = [] | 
| 151 | 21 | 
| 22 # unroll the dependencies | |
| 149 
05e461e4b409
add an unroll-deps example prog
 Jeff Hammel <jhammel@mozilla.com> parents: diff
changeset | 23 for package, deps in dependencies.items(): | 
| 
05e461e4b409
add an unroll-deps example prog
 Jeff Hammel <jhammel@mozilla.com> parents: diff
changeset | 24 try: | 
| 
05e461e4b409
add an unroll-deps example prog
 Jeff Hammel <jhammel@mozilla.com> parents: diff
changeset | 25 index = order.index(package) | 
| 
05e461e4b409
add an unroll-deps example prog
 Jeff Hammel <jhammel@mozilla.com> parents: diff
changeset | 26 except ValueError: | 
| 
05e461e4b409
add an unroll-deps example prog
 Jeff Hammel <jhammel@mozilla.com> parents: diff
changeset | 27 order.append(package) | 
| 
05e461e4b409
add an unroll-deps example prog
 Jeff Hammel <jhammel@mozilla.com> parents: diff
changeset | 28 index = len(order) - 1 | 
| 
05e461e4b409
add an unroll-deps example prog
 Jeff Hammel <jhammel@mozilla.com> parents: diff
changeset | 29 for dep in deps: | 
| 
05e461e4b409
add an unroll-deps example prog
 Jeff Hammel <jhammel@mozilla.com> parents: diff
changeset | 30 try: | 
| 
05e461e4b409
add an unroll-deps example prog
 Jeff Hammel <jhammel@mozilla.com> parents: diff
changeset | 31 dep_index = order.index(dep) | 
| 151 | 32 if dep_index > index: | 
| 33 order.insert(dep_index+1, package) | |
| 34 order.pop(index) | |
| 35 index = dep_index | |
| 149 
05e461e4b409
add an unroll-deps example prog
 Jeff Hammel <jhammel@mozilla.com> parents: diff
changeset | 36 except ValueError: | 
| 
05e461e4b409
add an unroll-deps example prog
 Jeff Hammel <jhammel@mozilla.com> parents: diff
changeset | 37 order.insert(index, dep) | 
| 151 | 38 | 
| 153 
17310d15ad26
alternate method + more tests
 Jeff Hammel <jhammel@mozilla.com> parents: 
152diff
changeset | 39 cycle_check(order, dependencies) | 
| 
17310d15ad26
alternate method + more tests
 Jeff Hammel <jhammel@mozilla.com> parents: 
152diff
changeset | 40 return order | 
| 
17310d15ad26
alternate method + more tests
 Jeff Hammel <jhammel@mozilla.com> parents: 
152diff
changeset | 41 | 
| 
17310d15ad26
alternate method + more tests
 Jeff Hammel <jhammel@mozilla.com> parents: 
152diff
changeset | 42 def unroll_dependencies2(dependencies): | 
| 
17310d15ad26
alternate method + more tests
 Jeff Hammel <jhammel@mozilla.com> parents: 
152diff
changeset | 43 """a variation""" | 
| 
17310d15ad26
alternate method + more tests
 Jeff Hammel <jhammel@mozilla.com> parents: 
152diff
changeset | 44 order = [] | 
| 
17310d15ad26
alternate method + more tests
 Jeff Hammel <jhammel@mozilla.com> parents: 
152diff
changeset | 45 | 
| 
17310d15ad26
alternate method + more tests
 Jeff Hammel <jhammel@mozilla.com> parents: 
152diff
changeset | 46 # flatten all | 
| 
17310d15ad26
alternate method + more tests
 Jeff Hammel <jhammel@mozilla.com> parents: 
152diff
changeset | 47 packages = set(dependencies.keys()) | 
| 
17310d15ad26
alternate method + more tests
 Jeff Hammel <jhammel@mozilla.com> parents: 
152diff
changeset | 48 for deps in dependencies.values(): | 
| 
17310d15ad26
alternate method + more tests
 Jeff Hammel <jhammel@mozilla.com> parents: 
152diff
changeset | 49 packages.update(deps) | 
| 151 | 50 | 
| 153 
17310d15ad26
alternate method + more tests
 Jeff Hammel <jhammel@mozilla.com> parents: 
152diff
changeset | 51 while len(order) != len(packages): | 
| 
17310d15ad26
alternate method + more tests
 Jeff Hammel <jhammel@mozilla.com> parents: 
152diff
changeset | 52 | 
| 
17310d15ad26
alternate method + more tests
 Jeff Hammel <jhammel@mozilla.com> parents: 
152diff
changeset | 53 for package in packages.difference(order): | 
| 
17310d15ad26
alternate method + more tests
 Jeff Hammel <jhammel@mozilla.com> parents: 
152diff
changeset | 54 if dependencies.get(package, set()).issubset(order): | 
| 
17310d15ad26
alternate method + more tests
 Jeff Hammel <jhammel@mozilla.com> parents: 
152diff
changeset | 55 order.append(package) | 
| 
17310d15ad26
alternate method + more tests
 Jeff Hammel <jhammel@mozilla.com> parents: 
152diff
changeset | 56 break | 
| 
17310d15ad26
alternate method + more tests
 Jeff Hammel <jhammel@mozilla.com> parents: 
152diff
changeset | 57 else: | 
| 
17310d15ad26
alternate method + more tests
 Jeff Hammel <jhammel@mozilla.com> parents: 
152diff
changeset | 58 raise AssertionError("Cyclic dependencies detected") | 
| 
17310d15ad26
alternate method + more tests
 Jeff Hammel <jhammel@mozilla.com> parents: 
152diff
changeset | 59 | 
| 679 
da62e6411ab7
STUB: python/unroll_deps.py
 Jeff Hammel <k0scist@gmail.com> parents: 
155diff
changeset | 60 cycle_check(order, dependencies) # sanity | 
| 
da62e6411ab7
STUB: python/unroll_deps.py
 Jeff Hammel <k0scist@gmail.com> parents: 
155diff
changeset | 61 | 
| 149 
05e461e4b409
add an unroll-deps example prog
 Jeff Hammel <jhammel@mozilla.com> parents: diff
changeset | 62 return order | 
| 
05e461e4b409
add an unroll-deps example prog
 Jeff Hammel <jhammel@mozilla.com> parents: diff
changeset | 63 | 
| 682 
3fe1024377ca
STUB: python/unroll_deps.py
 Jeff Hammel <k0scist@gmail.com> parents: 
681diff
changeset | 64 | 
| 
3fe1024377ca
STUB: python/unroll_deps.py
 Jeff Hammel <k0scist@gmail.com> parents: 
681diff
changeset | 65 ### testing and CLI | 
| 
3fe1024377ca
STUB: python/unroll_deps.py
 Jeff Hammel <k0scist@gmail.com> parents: 
681diff
changeset | 66 | 
| 
3fe1024377ca
STUB: python/unroll_deps.py
 Jeff Hammel <k0scist@gmail.com> parents: 
681diff
changeset | 67 def main(args=sys.argv[:1]): | 
| 681 
bc1f4762027b
STUB: python/unroll_deps.py
 Jeff Hammel <k0scist@gmail.com> parents: 
679diff
changeset | 68 | 
| 
bc1f4762027b
STUB: python/unroll_deps.py
 Jeff Hammel <k0scist@gmail.com> parents: 
679diff
changeset | 69 # testing set of dependencies | 
| 151 | 70 deps = {'packageA': set(['packageB', 'packageC', 'packageF']), | 
| 71 'packageB': set(['packageC', 'packageD', 'packageE', 'packageG']), | |
| 72 'packageC': set(['packageE']), | |
| 73 'packageE': set(['packageF', 'packageG']), | |
| 74 'packageF': set(['packageG']), | |
| 152 | 75 'packageX': set(['packageA', 'packageG'])} | 
| 149 
05e461e4b409
add an unroll-deps example prog
 Jeff Hammel <jhammel@mozilla.com> parents: diff
changeset | 76 unrolled = unroll_dependencies(deps) | 
| 681 
bc1f4762027b
STUB: python/unroll_deps.py
 Jeff Hammel <k0scist@gmail.com> parents: 
679diff
changeset | 77 print ('{}'.format(unrolled)) | 
| 153 
17310d15ad26
alternate method + more tests
 Jeff Hammel <jhammel@mozilla.com> parents: 
152diff
changeset | 78 | 
| 
17310d15ad26
alternate method + more tests
 Jeff Hammel <jhammel@mozilla.com> parents: 
152diff
changeset | 79 unrolled = unroll_dependencies2(deps) | 
| 
17310d15ad26
alternate method + more tests
 Jeff Hammel <jhammel@mozilla.com> parents: 
152diff
changeset | 80 print unrolled | 
| 
17310d15ad26
alternate method + more tests
 Jeff Hammel <jhammel@mozilla.com> parents: 
152diff
changeset | 81 | 
| 
17310d15ad26
alternate method + more tests
 Jeff Hammel <jhammel@mozilla.com> parents: 
152diff
changeset | 82 # ensure cycle check works | 
| 
17310d15ad26
alternate method + more tests
 Jeff Hammel <jhammel@mozilla.com> parents: 
152diff
changeset | 83 deps['packageD'] = set(['packageX']) | 
| 
17310d15ad26
alternate method + more tests
 Jeff Hammel <jhammel@mozilla.com> parents: 
152diff
changeset | 84 try: | 
| 
17310d15ad26
alternate method + more tests
 Jeff Hammel <jhammel@mozilla.com> parents: 
152diff
changeset | 85 unroll_dependencies(deps) | 
| 155 
f7cfd58eafe6
raise the correct exception
 Jeff Hammel <jhammel@mozilla.com> parents: 
154diff
changeset | 86 raise Exception("Missed a cyclic dependency!") | 
| 153 
17310d15ad26
alternate method + more tests
 Jeff Hammel <jhammel@mozilla.com> parents: 
152diff
changeset | 87 except AssertionError: | 
| 
17310d15ad26
alternate method + more tests
 Jeff Hammel <jhammel@mozilla.com> parents: 
152diff
changeset | 88 pass | 
| 682 
3fe1024377ca
STUB: python/unroll_deps.py
 Jeff Hammel <k0scist@gmail.com> parents: 
681diff
changeset | 89 | 
| 153 
17310d15ad26
alternate method + more tests
 Jeff Hammel <jhammel@mozilla.com> parents: 
152diff
changeset | 90 try: | 
| 
17310d15ad26
alternate method + more tests
 Jeff Hammel <jhammel@mozilla.com> parents: 
152diff
changeset | 91 unroll_dependencies2(deps) | 
| 155 
f7cfd58eafe6
raise the correct exception
 Jeff Hammel <jhammel@mozilla.com> parents: 
154diff
changeset | 92 raise Exception("Missed a cyclic dependency!") | 
| 153 
17310d15ad26
alternate method + more tests
 Jeff Hammel <jhammel@mozilla.com> parents: 
152diff
changeset | 93 except AssertionError: | 
| 
17310d15ad26
alternate method + more tests
 Jeff Hammel <jhammel@mozilla.com> parents: 
152diff
changeset | 94 pass | 
| 682 
3fe1024377ca
STUB: python/unroll_deps.py
 Jeff Hammel <k0scist@gmail.com> parents: 
681diff
changeset | 95 | 
| 
3fe1024377ca
STUB: python/unroll_deps.py
 Jeff Hammel <k0scist@gmail.com> parents: 
681diff
changeset | 96 if __name__ == '__main__': | 
| 
3fe1024377ca
STUB: python/unroll_deps.py
 Jeff Hammel <k0scist@gmail.com> parents: 
681diff
changeset | 97 main() | 
