From 8fbdda3c60ba9cabc367846c7e78851ba75b9d64 Mon Sep 17 00:00:00 2001 From: joe Date: Tue, 3 Dec 2013 20:16:45 -0500 Subject: Added code to preserve packet ordering. --- kiki.hs | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/kiki.hs b/kiki.hs index 3ecb8b8..96e57e2 100644 --- a/kiki.hs +++ b/kiki.hs @@ -997,17 +997,20 @@ flattenKeys isPublic db = Message $ concatMap (map packet . flattenTop "" isPubl isSecret _ = False +concatSort fname getp f = concat . sortByHint fname getp . map f + flattenTop :: FilePath -> Bool -> KeyData -> [MappedPacket] flattenTop fname ispub (KeyData key sigs uids subkeys) = - unk ispub key : ( concatMap (flattenUid fname ispub (snd uids)) (Map.assocs (fst uids)) - ++ concatMap (flattenSub fname ispub) (Map.elems subkeys)) + unk ispub key : + ( concatSort fname head (flattenUid fname ispub (snd uids)) (Map.assocs (fst uids)) + ++ concatSort fname head (flattenSub fname ispub) (Map.elems subkeys)) flattenUid :: FilePath -> Bool -> OriginMap -> (String,[SigAndTrust]) -> [MappedPacket] flattenUid fname ispub om (str,sigs) = - MappedPacket (UserIDPacket str) om : concatMap (unsig fname ispub) sigs + MappedPacket (UserIDPacket str) om : concatSort fname head (unsig fname ispub) sigs flattenSub :: FilePath -> Bool -> SubKey -> [MappedPacket] -flattenSub fname ispub (SubKey key sigs) = unk ispub key: concatMap (unsig fname ispub) sigs +flattenSub fname ispub (SubKey key sigs) = unk ispub key: concatSort fname head (unsig fname ispub) sigs unk :: Bool -> MappedPacket -> MappedPacket unk isPublic = if isPublic then toPacket secretToPublic else id @@ -1032,6 +1035,13 @@ showPacket p | isKey p = (if is_subkey p | otherwise = showPacket0 p showPacket0 p = concat . take 1 $ words (show p) +sortByHint fname f = sortBy (comparing gethint) + where + gethint = maybe defnum originalNum . Map.lookup fname . locations . f + defnum = -1 + +keyPacket (KeyData k _ _ _) = k + writeOutKeyrings db = do let ks = Map.elems db fs = Map.keys (foldr unionfiles Map.empty ks) @@ -1041,7 +1051,7 @@ writeOutKeyrings db = do let s = do f <- fs let x = do - d@(KeyData p _ _ _) <- filter (fromfile f) ks + d@(KeyData p _ _ _) <- filter (fromfile f) (sortByHint f keyPacket ks) n <- maybeToList $ Map.lookup f (locations p) flattenTop f (originallyPublic n) d changes = filter notnew x -- cgit v1.2.3