summaryrefslogtreecommitdiffstats
path: root/debian/tests/sourcesfilter
diff options
context:
space:
mode:
Diffstat (limited to 'debian/tests/sourcesfilter')
-rwxr-xr-xdebian/tests/sourcesfilter98
1 files changed, 98 insertions, 0 deletions
diff --git a/debian/tests/sourcesfilter b/debian/tests/sourcesfilter
new file mode 100755
index 0000000..f2d6b7d
--- /dev/null
+++ b/debian/tests/sourcesfilter
@@ -0,0 +1,98 @@
+#!/usr/bin/env python3
+
+from aptsources.sourceslist import SourcesList, Deb822SourceEntry
+import apt_pkg
+import glob
+import os.path
+import sys
+import os
+
+
+def main(rootfs):
+ sources = SourcesList(False, deb822=True)
+
+ dbglvl = os.environ.get("MMDEBSTRAP_VERBOSITY", "-1")
+ try:
+ dbglvl = int(dbglvl)
+ except ValueError:
+ dbglvl = -1
+ if dbglvl >= 2:
+ print("before:", file=sys.stderr)
+ for s in sources.list:
+ print(s.str(), end="", file=sys.stderr)
+
+ os.makedirs(rootfs + "/etc/apt/sources.list.d", exist_ok=True)
+
+ # remove all the things we do not want and change components and uri
+ for s in list(sources):
+ # since we put everything into a single output file, only one-line
+ # format is supported for now
+ assert not isinstance(s, Deb822SourceEntry), s
+ s.file = rootfs + s.file
+ # if it's a local file:// repo, don't mangle it
+ if s.uri.startswith("file://"):
+ continue
+ # remove debug packages
+ if s.uri.endswith("/debian-debug"):
+ sources.remove(s)
+ continue
+ # only allow main
+ s.comps = [c for c in s.comps if c in ["main"]]
+ # remove sources with empty components list
+ if not s.comps:
+ sources.remove(s)
+ continue
+ # remove deb-src entries
+ if s.type == "deb-src":
+ sources.remove(s)
+ continue
+ # translate uri to our proxy on 127.0.0.1
+ s.uri = "http://127.0.0.1/debian"
+
+ # remove duplicates
+ # we cannot use set() because order must be preserved
+ seen = set()
+ for s in list(sources):
+ if s.str() in seen:
+ sources.remove(s)
+ continue
+ seen.add(s.str())
+
+ if dbglvl >= 2:
+ print("after:", file=sys.stderr)
+ for s in sources.list:
+ print(s.str(), end="", file=sys.stderr)
+
+ # we want to append to existing files, so backup the files which would
+ # otherwise be overwritten by sources.save()
+ files_to_backup = {}
+ for s in sources.list:
+ if os.path.isfile(s.file):
+ files_to_backup[s.file] = b""
+
+ for fname in files_to_backup:
+ with open(fname, "rb") as f:
+ files_to_backup[fname] = f.read()
+
+ sources.save()
+
+ # now prepend the original content
+ for fname in files_to_backup:
+ with open(fname, "rb") as f:
+ updated_content = f.read()
+ with open(fname, "wb") as f:
+ f.write(files_to_backup[fname] + b"\n" + updated_content)
+
+ # append apt preferences verbatim
+ for pref in glob.glob("/etc/apt/preferences.d/*"):
+ if not os.path.isfile(pref):
+ continue
+ os.makedirs(os.path.dirname(rootfs + pref), exist_ok=True)
+ with open(pref) as fin, open(rootfs + pref, "a") as fout:
+ fout.write("\n")
+ for line in fin:
+ fout.write(line)
+
+
+if __name__ == "__main__":
+ main(sys.argv[1])