summaryrefslogtreecommitdiff
path: root/Git/Version.hs
diff options
context:
space:
mode:
Diffstat (limited to 'Git/Version.hs')
-rw-r--r--Git/Version.hs41
1 files changed, 15 insertions, 26 deletions
diff --git a/Git/Version.hs b/Git/Version.hs
index 5c61f85..19ff945 100644
--- a/Git/Version.hs
+++ b/Git/Version.hs
@@ -1,22 +1,23 @@
{- git versions
-
- - Copyright 2011, 2013 Joey Hess <joey@kitenet.net>
+ - Copyright 2011, 2013 Joey Hess <id@joeyh.name>
-
- Licensed under the GNU GPL version 3 or higher.
-}
-module Git.Version where
+{-# OPTIONS_GHC -fno-warn-tabs #-}
-import Common
-
-data GitVersion = GitVersion String Integer
- deriving (Eq)
+module Git.Version (
+ installed,
+ older,
+ normalize,
+ GitVersion,
+) where
-instance Ord GitVersion where
- compare (GitVersion _ x) (GitVersion _ y) = compare x y
+import Common
+import Utility.DottedVersion
-instance Show GitVersion where
- show (GitVersion s _) = s
+type GitVersion = DottedVersion
installed :: IO GitVersion
installed = normalize . extract <$> readProcess "git" ["--version"]
@@ -25,19 +26,7 @@ installed = normalize . extract <$> readProcess "git" ["--version"]
[] -> ""
(l:_) -> unwords $ drop 2 $ words l
-{- To compare dotted versions like 1.7.7 and 1.8, they are normalized to
- - a somewhat arbitrary integer representation. -}
-normalize :: String -> GitVersion
-normalize v = GitVersion v $
- sum $ mult 1 $ reverse $ extend precision $ take precision $
- map readi $ split "." v
- where
- extend n l = l ++ replicate (n - length l) 0
- mult _ [] = []
- mult n (x:xs) = (n*x) : mult (n*10^width) xs
- readi :: String -> Integer
- readi s = case reads s of
- ((x,_):_) -> x
- _ -> 0
- precision = 10 -- number of segments of the version to compare
- width = length "yyyymmddhhmmss" -- maximum width of a segment
+older :: String -> IO Bool
+older n = do
+ v <- installed
+ return $ v < normalize n