You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by da...@apache.org on 2010/11/24 07:27:49 UTC
svn commit: r1038494 - /subversion/trunk/tools/dist/collect_sigs.py
Author: danielsh
Date: Wed Nov 24 06:27:49 2010
New Revision: 1038494
URL: http://svn.apache.org/viewvc?rev=1038494&view=rev
Log:
Store the signatures in a database.
* tools/dist/collect_sigs.py
(sqlite3): Import.
(make_db, make_asc, generate_asc_files): New functions and subcommands.
(save_valid_sig): Take a DB parameter and use it as primary storage.
(verify_sig_for_file, main): Relocate the 'trim keyid' logic.
(process_sigs): Open a DB connection and pass it to save_valid_sig().
Modified:
subversion/trunk/tools/dist/collect_sigs.py
Modified: subversion/trunk/tools/dist/collect_sigs.py
URL: http://svn.apache.org/viewvc/subversion/trunk/tools/dist/collect_sigs.py?rev=1038494&r1=1038493&r2=1038494&view=diff
==============================================================================
--- subversion/trunk/tools/dist/collect_sigs.py (original)
+++ subversion/trunk/tools/dist/collect_sigs.py Wed Nov 24 06:27:49 2010
@@ -23,9 +23,7 @@
# release. This is a pretty rough, and patches are welcome to improve it.
#
# Some thoughts about future improvement:
-# * Store all sigs, etc, in a database
-# - This helps with idempotence
-# - Also allows display of per-file and per-release statistics
+# * Display of per-file and per-release statistics
# * A download link on the page itself
# * Make use of the python-gpg package (http://code.google.com/p/python-gnupg/)
# * Post to IRC when a new signature is collected
@@ -34,6 +32,7 @@
#
import sys, os
+import sqlite3
def make_config():
'Output a blank config file'
@@ -50,8 +49,42 @@ def make_config():
print "'config.py' generated"
+def make_db():
+ 'Initialize a blank database'
-actions = { 'make_config' : make_config }
+ db = sqlite3.connect('sigs.db')
+ db.execute('''
+ CREATE TABLE signatures (
+ keyid TEXT, filename TEXT, signature BLOB,
+ UNIQUE(keyid,filename)
+ );
+''');
+
+# This function is web-facing
+def generate_asc_files(target_dir='.'):
+ fds = {}
+ def _open(filename):
+ if not fds.has_key(filename):
+ fd = open(os.path.join(target_dir, filename + '.asc'), 'w')
+ fds[filename] = fd
+ return fds[filename]
+
+ db = sqlite3.connect(os.path.join(target_dir, 'sigs.db'))
+ curs = db.cursor()
+ curs.execute('SELECT filename, signature FROM signatures;')
+ for filename, signature in curs:
+ fd = _open(filename)
+ fd.write(signature + "\n")
+
+ for fd in fds.values():
+ fd.flush()
+ fd.close()
+
+actions = {
+ 'make_config' : make_config,
+ 'make_db' : make_db,
+ 'make_asc' : generate_asc_files,
+}
if __name__ == '__main__':
@@ -132,11 +165,12 @@ def split(sigs):
yield "\n".join(lines) + "\n"
lines = []
-def save_valid_sig(filename, signature):
- # Add \n to flush. (For some reason, .flush() didn't do the trick.)
- f = open(os.path.join(config.sigdir, filename + '.asc'), 'a')
- f.write(signature + "\n")
+def save_valid_sig(db, filename, keyid, signature):
+ db.execute('INSERT OR REPLACE INTO signatures VALUES (?,?,?);',
+ (keyid, filename, buffer(signature)))
+ db.commit()
+ generate_asc_files(config.sigdir)
def verify_sig_for_file(signature, filename):
args = ['gpg', '--logger-fd', '1', '--no-tty',
@@ -162,7 +196,7 @@ def verify_sig_for_file(signature, filen
for line in lines:
match = r.search(line)
if match:
- keyid = match.group(1)[-8:]
+ keyid = match.group(1)
user = match.group(2)
return (True, (filename, keyid, user))
@@ -207,6 +241,7 @@ def process_sigs(signatures):
retval = ''
# Verify
+ db = sqlite3.connect(os.path.join(config.sigdir, 'sigs.db'))
for signature in split(signatures):
N_sigs += 1
(verified, result) = verify_sig(signature)
@@ -215,7 +250,7 @@ def process_sigs(signatures):
if verified:
# TODO: record (filename, keyid) in a database
(filename, keyid, user) = result
- save_valid_sig(filename, signature)
+ save_valid_sig(db, filename, keyid, signature)
N_verified += 1
# Report
@@ -231,7 +266,7 @@ def process_sigs(signatures):
retval += "<h1>Results for the %s signature</h1>" % ordinal(N)
if verified:
(filename, keyid, user) = result
- retval += c_verified % (filename, keyid, user)
+ retval += c_verified % (filename, keyid[-8:], user)
else:
retval += c_unverified % (signature, result)