summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichał Masłowski <mtjm@mtjm.eu>2012-10-16 15:42:10 +0200
committerMichał Masłowski <mtjm@mtjm.eu>2012-10-16 15:42:10 +0200
commitc6542576f04e6dc159e731b50a19f1a10d9d5ff3 (patch)
treed4c52f7377519476bb9abd0481d7e92e8d4fb9e4
parentf4c42f9e68131ad4fbfb1be07fb44678eb90d6f7 (diff)
db-list-unsigned-packages: rewrite using a helper Python script.
The previous implementation parsed each tarball multiple times having quadratic time complexity in the number of packages. It was too slow for a complete run.
-rwxr-xr-xdb-list-unsigned-packages13
-rwxr-xr-xdb-list-unsigned-packages.py59
2 files changed, 61 insertions, 11 deletions
diff --git a/db-list-unsigned-packages b/db-list-unsigned-packages
index 35a5421..26e22eb 100755
--- a/db-list-unsigned-packages
+++ b/db-list-unsigned-packages
@@ -29,19 +29,10 @@ if [ $# -lt 1 ]; then
fi
arch=$1
-pkgarch=$2
+shift
for repo in ${PKGREPOS[@]}
do
db="${FTP_BASE}/${repo}/os/${arch}/${repo}.db"
- for f in $(tar tf $db | egrep /desc$)
- do
- if ! tar xOf $db $f | fgrep %PGPSIG% > /dev/null
- then
- if [ -z $2 ] || tar xOf $db $f | fgrep -A1 %ARCH% | fgrep $pkgarch > /dev/null
- then
- echo $repo/${f%/desc}
- fi
- fi
- done
+ "$(dirname $0)/db-list-unsigned-packages.py" "$@" < "$db"
done
diff --git a/db-list-unsigned-packages.py b/db-list-unsigned-packages.py
new file mode 100755
index 0000000..ccbec3a
--- /dev/null
+++ b/db-list-unsigned-packages.py
@@ -0,0 +1,59 @@
+#!/usr/bin/env python3
+# Copyright (C) 2012 Michał Masłowski <mtjm@mtjm.eu>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+"""
+Output a list of repo/package-name-and-version pairs representing
+unsigned packages in the database at standard input of repo named in
+the first argument and specified for architectures listed in the
+following arguments (usually the one of the database or any, default
+is to list all).
+"""
+
+
+import sys
+import tarfile
+
+
+def main():
+ """Do the job."""
+ repo = sys.argv[1]
+ pkgarches = frozenset(name.encode("utf-8") for name in sys.argv[2:])
+ with tarfile.open(fileobj=sys.stdin.buffer) as archive:
+ for entry in archive:
+ if entry.name.endswith("/desc"):
+ content = archive.extractfile(entry)
+ skip = False
+ is_arch = False
+ for line in content:
+ if is_arch:
+ is_arch = False
+ if pkgarches and line.strip() not in pkgarches:
+ skip = True # different architecture
+ break
+ if line == b"%PGPSIG%\n":
+ skip = True # signed
+ break
+ if line == b"%ARCH%\n":
+ is_arch = True
+ if skip:
+ print("skip " + repo + "/" + entry.name[:-5])
+ continue
+ print(repo + "/" + entry.name[:-5])
+
+
+if __name__ == "__main__":
+ main()