blob: 4709463ba57d3673ec6b0dbdec1b703a601c0554 [file] [log] [blame]
Philipp Schrader0e19c602018-03-07 21:07:22 -08001#!/usr/bin/env python3
2
3import sys
4import os
5import re
6import subprocess
7import tempfile
8import argparse
9import hashlib
10
11def get_deps(package):
12 out = subprocess.check_output(["apt-rdepends", package])
13 deps = out.splitlines()
14 return set([dep for dep in deps if not dep.startswith(b" ")])
15
16def get_all_deps(packages):
17 deps = set()
18 for package in packages:
19 deps.update(get_deps(package))
20 return deps
21
22def download_deps(packages, excludes):
23 deps = get_all_deps(packages)
24 exclude_deps = get_all_deps(excludes)
25 deps -= exclude_deps
26 subprocess.check_call([b"apt-get", b"download"] + list(deps))
27
28def fixup_files():
29 # Gotta remove those pesky epoch numbers in the file names. Bazel doesn't
30 # like them.
31 regex = re.compile(".%3a")
32 contents = os.listdir(os.getcwd())
33 for deb in contents:
34 new_name = regex.sub("", deb)
35 if new_name != deb:
36 os.rename(deb, new_name)
37
38def sha256_checksum(filename, block_size=65536):
39 sha256 = hashlib.sha256()
40 with open(filename, 'rb') as f:
41 for block in iter(lambda: f.read(block_size), b''):
42 sha256.update(block)
43 return sha256.hexdigest()
44
45def print_file_list():
46 contents = os.listdir(os.getcwd())
47 contents.sort()
48 print("_files = {")
49 for deb in contents:
50 print(' "%s": "%s",' % (deb, sha256_checksum(deb)))
51 print("}")
52
53def main(argv):
54 parser = argparse.ArgumentParser()
55 parser.add_argument("--exclude", "-e", type=str, action="append", help="A package to exclude from the list")
56 parser.add_argument("package", nargs="+", help="The packages to download.")
57 args = parser.parse_args(argv[1:])
58 folder = tempfile.mkdtemp()
59 os.chdir(folder)
60 excludes = args.exclude or []
61 # Exclude common packages that don't make sense to include in everything all
62 # the time.
63 excludes += ["libc-dev", "debconf", "install-info", "debconf-2.0", "libc6", "libc6-dev", "dpkg"]
64 download_deps(args.package, excludes)
65 fixup_files()
66 print_file_list()
67 print("Your packages are all in %s" % folder)
68
69if __name__ == "__main__":
70 sys.exit(main(sys.argv))