[Lsb-messages] /var/www/bzr/lsb/devel/repogen r211: Minor tweaks, fix bug in version comparison.
Jeff Licquia
licquia at linuxfoundation.org
Wed Jul 10 17:30:22 UTC 2013
------------------------------------------------------------
revno: 211
committer: Jeff Licquia <licquia at linuxfoundation.org>
branch nick: repogen
timestamp: Wed 2013-07-10 13:30:22 -0400
message:
Minor tweaks, fix bug in version comparison.
modified:
Package.hs
-------------- next part --------------
=== modified file 'Package.hs'
--- a/Package.hs 2013-06-17 20:06:08 +0000
+++ b/Package.hs 2013-07-10 17:30:22 +0000
@@ -158,16 +158,19 @@
derivedDeb :: Package -> Maybe Package
derivedDeb p
| pkgtype p == Deb = Just p
- | isJust cvtArch = Just Package {
- path="",
- pkgtype=Deb,
- name=convertRpmName $ name p,
- epoch=epoch p,
- version=version p,
- release=release p,
- arch=arch p }
- | otherwise = Nothing
- where cvtArch = archDebName $ arch p
+ | otherwise = do
+ -- We don't need the converted name, but we care if the
+ -- conversion succeeds or not.
+ archDebName $ arch p
+ -- If it didn't succeed, we won't get this far.
+ return Package {
+ path="",
+ pkgtype=Deb,
+ name=convertRpmName $ name p,
+ epoch=epoch p,
+ version=version p,
+ release=release p,
+ arch=arch p }
-- Given a Debian package, do the reverse of derivedDeb: figure out
-- which RPM it came from.
@@ -200,9 +203,11 @@
fileNameFromPackage :: Package -> FilePath
fileNameFromPackage p
| pkgtype p == Deb
- = name p ++ "_" ++ version p ++ "-" ++ release p ++ "_" ++ (fromJust $ archDebName $ arch p) ++ ".deb"
+ = concat [name p, "_", version p, "-", release p, "_",
+ fromJust $ archDebName $ arch p, ".deb"]
| otherwise
- = name p ++ "-" ++ version p ++ "-" ++ release p ++ "." ++ (archRpmName $ arch p) ++ ".rpm"
+ = concat [name p, "-", version p, "-", release p, ".",
+ archRpmName $ arch p, ".rpm"]
packageRecalcPath :: Package -> Package
packageRecalcPath p = Package {
@@ -233,30 +238,29 @@
-- to mirror the rules as specified by RPM and in the Debian Policy
-- Manual; any deviation from those rules is a bug.
-fragmentCollect :: [Char] -> (String, String) -> (String, String)
-fragmentCollect charset (xs, "") = (xs, "")
-fragmentCollect charset (xs, y:ys)
- | y `elem` charset
- = fragmentCollect charset (xs ++ [y], ys)
- | otherwise
- = (xs, y:ys)
-
+-- Sets of characters that constitute parts of a version in a version
+-- string. Each contiguous group of characters in each set is one
+-- component, while characters not in any sets are dropped and not
+-- considered part of any version component.
getSet :: Char -> Maybe [Char]
-getSet c = let sets = filter (elem c) [ ['0'..'9'], (['A'..'Z'] ++ ['a'..'z']),
- ['~'] ]
- in if null sets then Nothing
- else Just $ head sets
+getSet c = listToMaybe $ filter (elem c) [ ['0'..'9'],
+ (['A'..'Z'] ++ ['a'..'z']), ['~'] ]
+-- Split a version into chunks, based on their membership (or
+-- lack thereof) in one of the above sets.
splitVersion :: String -> [String]
splitVersion "" = []
splitVersion (x:xs)
| isJust charset
- = let (chunk, rest) = fragmentCollect (fromJust charset) ([x], xs)
+ = let (chunk, rest) = span (`elem` (fromJust charset)) (x:xs)
in [chunk] ++ splitVersion rest
| otherwise
= splitVersion xs
where charset = getSet x
+-- Comparison rules for each chunk. ~ always sorts last (even after
+-- the empty string), convert numbers for comparison, otherwise
+-- do string comparisons.
compareVersionChunks :: String -> String -> Ordering
compareVersionChunks "" "" = EQ
compareVersionChunks "" (y:ys)
@@ -276,6 +280,8 @@
= (x:xs) `compare` (y:ys)
where numbers = ['0'..'9']
+-- Compare two versions as split into chunks. The main wrinkle:
+-- we need to ensure ~ sorts as less than an empty list.
compareVersionChunkLists :: [String] -> [String] -> Ordering
compareVersionChunkLists [] [] = EQ
compareVersionChunkLists [] (y:ys)
@@ -292,8 +298,9 @@
comparePackageVersions :: Package -> Package -> Ordering
comparePackageVersions x y
- = compareVersionChunkLists [epoch x, version x, release x]
- [epoch y, version y, release y]
+ = compareVersionChunkLists (reduceVersions [epoch x, version x, release x])
+ (reduceVersions [epoch y, version y, release y])
+ where reduceVersions x = concat $ map splitVersion x
compareVersionStrings :: String -> String -> Ordering
compareVersionStrings x y
More information about the lsb-messages
mailing list