# # # patch "dumb.py" # from [e2f12d5e15754254c4652a0716f1829734d6171d] # to [b584630eeb0f6d116ba8eb7385f2946d0518f9cb] # # patch "monotone.py" # from [399e9ac377f3d05c6cae73349ea3097d0af619d5] # to [eadb1ef9340fb5a3c88a2eb5f48a6183f39fa2f9] # ============================================================ --- dumb.py e2f12d5e15754254c4652a0716f1829734d6171d +++ dumb.py b584630eeb0f6d116ba8eb7385f2946d0518f9cb @@ -14,7 +14,7 @@ from fs import readable_fs_for_url, writ from cStringIO import StringIO from merkle_dir import MerkleDir, MemoryMerkleDir, LockError from fs import readable_fs_for_url, writeable_fs_for_url -from monotone import Monotone, find_stanza_entry +from monotone import Monotone, find_stanza_entry, decode_cert_packet_info class partial: def __init__(self, fn, *args): @@ -104,17 +104,19 @@ class Dumbtone: md.begin() curr_ids = Set(md.all_ids()) keys = self.monotone.keys() + exported_keys = Set() + key_packets = {} for stanza in keys: keyid = find_stanza_entry(stanza, "name")[0] publicHash = find_stanza_entry(stanza, "public_hash")[0] - publicLocations = find_stanza_entry(stanza, "public_location") - kp = partial(self.monotone.get_pubkey_packet,keyid) + publicLocations = find_stanza_entry(stanza, "public_location") if "database" in publicLocations: + kp = partial(self.monotone.get_pubkey_packet,keyid) ids = "\n".join((keyid,publicHash)) id = sha.new(ids).hexdigest() - if id not in curr_ids: - md.add(id, kp) - if callback: callback(id, "", None) + key_packets[keyid] = (id, kp) # keys are queued for export + # and are exported only if used + # to sign some exported cert for rid in self.monotone.toposort(self.monotone.revisions_list()): if rid not in curr_ids: md.add(rid, partial(self.__make_revision_packet,rid)) @@ -123,6 +125,17 @@ class Dumbtone: if self.verbosity > 0: print "rev ", rid, " certs:",certs for cert in certs: + cert_parts = decode_cert_packet_info(cert) + key_name = cert_parts[2] + if key_name not in exported_keys: + if self.verbosity > 0: + print "key: %s" % key_name + # add key only if needed by any cert + id, kp = key_packets[key_name] + if id not in curr_ids: + md.add(id, kp) + if callback: callback(id, "", None) + exported_keys.add(key_name) id = sha.new(cert).hexdigest() if id not in curr_ids: md.add(id, returnthis(cert) ) ============================================================ --- monotone.py 399e9ac377f3d05c6cae73349ea3097d0af619d5 +++ monotone.py eadb1ef9340fb5a3c88a2eb5f48a6183f39fa2f9 @@ -271,3 +271,12 @@ def find_stanza_entry(stanza, name): if entry[0] == name: return entry[1] raise Exception("entry '%s' not found in stanza" % name) + + +cert_packet_info_re = re.compile(r'^\[rcert ([0-9a-f]+)\r?\n\s+(\S+)\s*\r?\n\s+(.*)\r?\n') + +def decode_cert_packet_info(cert_packet): + m = cert_packet_info_re.match(cert_packet) + if not m: + raise Exception("bad cert packet: %s..." % repr(cert_packet)) + return (m.group(1), m.group(2), m.group(3))