Guest User

Untitled

a guest
Nov 21st, 2017
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.19 KB | None | 0 0
  1. import subprocess
  2. import json
  3. import functools
  4.  
  5. nix_tarball_drv = "/nix/store/h0m0794x8d02hyrwkby3asajnz2s2g6n-nix-1.11.15.tar.xz.drv"
  6.  
  7. @functools.lru_cache()
  8. def load_derivation(drv):
  9. data = subprocess.check_output(['nix', 'show-derivation', drv]).decode()
  10. return json.loads(data)[drv]
  11.  
  12. def get_drv_deps(drv):
  13. data = load_derivation(drv)
  14. return data['inputDrvs'].keys()
  15.  
  16. def is_fixed_output(drv):
  17. data = load_derivation(drv)
  18. try:
  19. data['outputs']['out']['hash']
  20. return True
  21. except KeyError:
  22. return False
  23.  
  24. def is_substitutable_or_built(drv):
  25. return subprocess.call(["nix-store", "-Q", "-j0", "--realise", drv]) == 0
  26.  
  27. def needed_fixed_output_drvs(drv, already_seen=None):
  28. "Outputs the unbuilt fixed-output-derivations needed to build this derivation, in topologically sorted order."
  29. print(drv)
  30. if already_seen is None:
  31. already_seen = set()
  32. if drv in already_seen:
  33. return []
  34. already_seen.add(drv)
  35. if is_substitutable_or_built(drv):
  36. return []
  37. ret = []
  38. for dep in get_drv_deps(drv):
  39. ret += needed_fixed_output_drvs(dep, already_seen)
  40. if is_fixed_output(drv):
  41. ret.append(drv)
  42. return ret
Add Comment
Please, Sign In to add comment