aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Assistant/Upgrade.hs2
-rw-r--r--Build/DistributionUpdate.hs3
-rw-r--r--Command/Info.hs4
-rw-r--r--Logs/Transfer.hs15
-rw-r--r--Types/Distribution.hs42
-rw-r--r--Types/Transfer.hs14
6 files changed, 59 insertions, 21 deletions
diff --git a/Assistant/Upgrade.hs b/Assistant/Upgrade.hs
index f91fde06c..a2f6f9e0a 100644
--- a/Assistant/Upgrade.hs
+++ b/Assistant/Upgrade.hs
@@ -324,7 +324,7 @@ downloadDistributionInfo = do
ifM (Url.downloadQuiet distributionInfoUrl infof uo
<&&> Url.downloadQuiet distributionInfoSigUrl sigf uo
<&&> verifyDistributionSig gpgcmd sigf)
- ( readish <$> readFileStrict infof
+ ( parseInfoFile <$> readFileStrict infof
, return Nothing
)
diff --git a/Build/DistributionUpdate.hs b/Build/DistributionUpdate.hs
index dd18a7883..e026d655b 100644
--- a/Build/DistributionUpdate.hs
+++ b/Build/DistributionUpdate.hs
@@ -119,13 +119,14 @@ makeinfos updated version = do
Just k -> whenM (inAnnex k) $ do
liftIO $ putStrLn f
let infofile = f ++ ".info"
- liftIO $ writeFile infofile $ show $ GitAnnexDistribution
+ let d = GitAnnexDistribution
{ distributionUrl = mkUrl f
, distributionKey = k
, distributionVersion = bv
, distributionReleasedate = now
, distributionUrgentUpgrade = Nothing
}
+ liftIO $ writeFile infofile $ formatInfoFile d
void $ inRepo $ runBool [Param "add", File infofile]
signFile infofile
signFile f
diff --git a/Command/Info.hs b/Command/Info.hs
index 835a8498d..aaee08fe1 100644
--- a/Command/Info.hs
+++ b/Command/Info.hs
@@ -419,14 +419,14 @@ transfer_list = stat desc $ nojson $ lift $ do
where
desc = "transfers in progress"
line uuidmap t i = unwords
- [ showLcDirection (transferDirection t) ++ "ing"
+ [ formatDirection (transferDirection t) ++ "ing"
, fromMaybe (key2file $ transferKey t) (associatedFile i)
, if transferDirection t == Upload then "to" else "from"
, maybe (fromUUID $ transferUUID t) Remote.name $
M.lookup (transferUUID t) uuidmap
]
jsonify t i = object $ map (\(k, v) -> (T.pack k, v)) $
- [ ("transfer", toJSON (showLcDirection (transferDirection t)))
+ [ ("transfer", toJSON (formatDirection (transferDirection t)))
, ("key", toJSON (key2file (transferKey t)))
, ("file", toJSON (associatedFile i))
, ("remote", toJSON (fromUUID (transferUUID t)))
diff --git a/Logs/Transfer.hs b/Logs/Transfer.hs
index 903db96fe..ce2a7d299 100644
--- a/Logs/Transfer.hs
+++ b/Logs/Transfer.hs
@@ -23,15 +23,6 @@ import Data.Time.Clock
import Data.Time.Clock.POSIX
import Control.Concurrent
-showLcDirection :: Direction -> String
-showLcDirection Upload = "upload"
-showLcDirection Download = "download"
-
-readLcDirection :: String -> Maybe Direction
-readLcDirection "upload" = Just Upload
-readLcDirection "download" = Just Download
-readLcDirection _ = Nothing
-
describeTransfer :: Transfer -> TransferInfo -> String
describeTransfer t info = unwords
[ show $ transferDirection t
@@ -212,7 +203,7 @@ parseTransferFile file
| "lck." `isPrefixOf` takeFileName file = Nothing
| otherwise = case drop (length bits - 3) bits of
[direction, u, key] -> Transfer
- <$> readLcDirection direction
+ <$> parseDirection direction
<*> pure (toUUID u)
<*> fileKey key
_ -> Nothing
@@ -279,14 +270,14 @@ readTransferInfo mpid s = TransferInfo
{- The directory holding transfer information files for a given Direction. -}
transferDir :: Direction -> Git.Repo -> FilePath
-transferDir direction r = gitAnnexTransferDir r </> showLcDirection direction
+transferDir direction r = gitAnnexTransferDir r </> formatDirection direction
{- The directory holding failed transfer information files for a given
- Direction and UUID -}
failedTransferDir :: UUID -> Direction -> Git.Repo -> FilePath
failedTransferDir u direction r = gitAnnexTransferDir r
</> "failed"
- </> showLcDirection direction
+ </> formatDirection direction
</> filter (/= '/') (fromUUID u)
prop_read_write_transferinfo :: TransferInfo -> Bool
diff --git a/Types/Distribution.hs b/Types/Distribution.hs
index d4de7a79b..a7e2f4c95 100644
--- a/Types/Distribution.hs
+++ b/Types/Distribution.hs
@@ -1,16 +1,22 @@
{- Data type for a distribution of git-annex
-
- - Copyright 2013 Joey Hess <id@joeyh.name>
+ - Copyright 2013, 2017 Joey Hess <id@joeyh.name>
-
- Licensed under the GNU GPL version 3 or higher.
-}
module Types.Distribution where
+import Utility.PartialPrelude
import Types.Key
+import Key
import Data.Time.Clock
import Git.Config (isTrue, boolConfig)
+import Data.String.Utils
+
+type GitAnnexVersion = String
+
data GitAnnexDistribution = GitAnnexDistribution
{ distributionUrl :: String
, distributionKey :: Key
@@ -20,7 +26,39 @@ data GitAnnexDistribution = GitAnnexDistribution
}
deriving (Read, Show, Eq)
-type GitAnnexVersion = String
+{- The first line of the info file is in the format old versions of
+ - git-annex expect to read a GitAnnexDistribution.
+ - The remainder of the file is in the new format.
+ - This works because old versions of git-annex used readish to parse
+ - the file, and that ignores the second line.
+ -}
+formatInfoFile :: GitAnnexDistribution -> String
+formatInfoFile d = replace "keyVariant = " "keyBackendName = " (show d) ++
+ "\n" ++ formatGitAnnexDistribution d
+
+parseInfoFile :: String -> Maybe GitAnnexDistribution
+parseInfoFile s = case lines s of
+ (_oldformat:rest) -> parseGitAnnexDistribution (unlines rest)
+ _ -> Nothing
+
+formatGitAnnexDistribution :: GitAnnexDistribution -> String
+formatGitAnnexDistribution d = unlines
+ [ distributionUrl d
+ , key2file (distributionKey d)
+ , distributionVersion d
+ , show (distributionReleasedate d)
+ , maybe "" show (distributionUrgentUpgrade d)
+ ]
+
+parseGitAnnexDistribution :: String -> Maybe GitAnnexDistribution
+parseGitAnnexDistribution s = case lines s of
+ (u:k:v:d:uu:_) -> GitAnnexDistribution
+ <$> pure u
+ <*> file2key k
+ <*> pure v
+ <*> readish d
+ <*> pure (readish uu)
+ _ -> Nothing
data AutoUpgrade = AskUpgrade | AutoUpgrade | NoAutoUpgrade
deriving (Eq)
diff --git a/Types/Transfer.hs b/Types/Transfer.hs
index 1920bc73b..349eccf4b 100644
--- a/Types/Transfer.hs
+++ b/Types/Transfer.hs
@@ -16,8 +16,7 @@ import Control.Concurrent
import Control.Applicative
import Prelude
-{- Enough information to uniquely identify a transfer, used as the filename
- - of the transfer information file. -}
+{- Enough information to uniquely identify a transfer. -}
data Transfer = Transfer
{ transferDirection :: Direction
, transferUUID :: UUID
@@ -46,7 +45,16 @@ stubTransferInfo :: TransferInfo
stubTransferInfo = TransferInfo Nothing Nothing Nothing Nothing Nothing Nothing False
data Direction = Upload | Download
- deriving (Eq, Ord, Read, Show)
+ deriving (Eq, Ord, Show, Read)
+
+formatDirection :: Direction -> String
+formatDirection Upload = "upload"
+formatDirection Download = "download"
+
+parseDirection :: String -> Maybe Direction
+parseDirection "upload" = Just Upload
+parseDirection "download" = Just Download
+parseDirection _ = Nothing
instance Arbitrary TransferInfo where
arbitrary = TransferInfo