fix up Read instance incompatability caused by recent commit
9c4650358c
changed the Read instance for Key. I've checked all uses of that instance (by removing it and seeing what breaks), and they're all limited to the webapp, except one. That is GitAnnexDistribution's Read instance. So,9c4650358c
would have broken upgrades of git-annex from downloads.kitenet.net. Once the .info files there got updated for a new release, old releases would have failed to parse them and never upgraded. To fix this, I found a way to make the .info files that contain GitAnnexDistribution values be readable by the old version of git-annex. This commit was sponsored by Ewen McNeill.
This commit is contained in:
parent
634a485b50
commit
27eca014be
6 changed files with 59 additions and 21 deletions
|
@ -324,7 +324,7 @@ downloadDistributionInfo = do
|
||||||
ifM (Url.downloadQuiet distributionInfoUrl infof uo
|
ifM (Url.downloadQuiet distributionInfoUrl infof uo
|
||||||
<&&> Url.downloadQuiet distributionInfoSigUrl sigf uo
|
<&&> Url.downloadQuiet distributionInfoSigUrl sigf uo
|
||||||
<&&> verifyDistributionSig gpgcmd sigf)
|
<&&> verifyDistributionSig gpgcmd sigf)
|
||||||
( readish <$> readFileStrict infof
|
( parseInfoFile <$> readFileStrict infof
|
||||||
, return Nothing
|
, return Nothing
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -119,13 +119,14 @@ makeinfos updated version = do
|
||||||
Just k -> whenM (inAnnex k) $ do
|
Just k -> whenM (inAnnex k) $ do
|
||||||
liftIO $ putStrLn f
|
liftIO $ putStrLn f
|
||||||
let infofile = f ++ ".info"
|
let infofile = f ++ ".info"
|
||||||
liftIO $ writeFile infofile $ show $ GitAnnexDistribution
|
let d = GitAnnexDistribution
|
||||||
{ distributionUrl = mkUrl f
|
{ distributionUrl = mkUrl f
|
||||||
, distributionKey = k
|
, distributionKey = k
|
||||||
, distributionVersion = bv
|
, distributionVersion = bv
|
||||||
, distributionReleasedate = now
|
, distributionReleasedate = now
|
||||||
, distributionUrgentUpgrade = Nothing
|
, distributionUrgentUpgrade = Nothing
|
||||||
}
|
}
|
||||||
|
liftIO $ writeFile infofile $ formatInfoFile d
|
||||||
void $ inRepo $ runBool [Param "add", File infofile]
|
void $ inRepo $ runBool [Param "add", File infofile]
|
||||||
signFile infofile
|
signFile infofile
|
||||||
signFile f
|
signFile f
|
||||||
|
|
|
@ -419,14 +419,14 @@ transfer_list = stat desc $ nojson $ lift $ do
|
||||||
where
|
where
|
||||||
desc = "transfers in progress"
|
desc = "transfers in progress"
|
||||||
line uuidmap t i = unwords
|
line uuidmap t i = unwords
|
||||||
[ showLcDirection (transferDirection t) ++ "ing"
|
[ formatDirection (transferDirection t) ++ "ing"
|
||||||
, fromMaybe (key2file $ transferKey t) (associatedFile i)
|
, fromMaybe (key2file $ transferKey t) (associatedFile i)
|
||||||
, if transferDirection t == Upload then "to" else "from"
|
, if transferDirection t == Upload then "to" else "from"
|
||||||
, maybe (fromUUID $ transferUUID t) Remote.name $
|
, maybe (fromUUID $ transferUUID t) Remote.name $
|
||||||
M.lookup (transferUUID t) uuidmap
|
M.lookup (transferUUID t) uuidmap
|
||||||
]
|
]
|
||||||
jsonify t i = object $ map (\(k, v) -> (T.pack k, v)) $
|
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)))
|
, ("key", toJSON (key2file (transferKey t)))
|
||||||
, ("file", toJSON (associatedFile i))
|
, ("file", toJSON (associatedFile i))
|
||||||
, ("remote", toJSON (fromUUID (transferUUID t)))
|
, ("remote", toJSON (fromUUID (transferUUID t)))
|
||||||
|
|
|
@ -23,15 +23,6 @@ import Data.Time.Clock
|
||||||
import Data.Time.Clock.POSIX
|
import Data.Time.Clock.POSIX
|
||||||
import Control.Concurrent
|
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 :: Transfer -> TransferInfo -> String
|
||||||
describeTransfer t info = unwords
|
describeTransfer t info = unwords
|
||||||
[ show $ transferDirection t
|
[ show $ transferDirection t
|
||||||
|
@ -212,7 +203,7 @@ parseTransferFile file
|
||||||
| "lck." `isPrefixOf` takeFileName file = Nothing
|
| "lck." `isPrefixOf` takeFileName file = Nothing
|
||||||
| otherwise = case drop (length bits - 3) bits of
|
| otherwise = case drop (length bits - 3) bits of
|
||||||
[direction, u, key] -> Transfer
|
[direction, u, key] -> Transfer
|
||||||
<$> readLcDirection direction
|
<$> parseDirection direction
|
||||||
<*> pure (toUUID u)
|
<*> pure (toUUID u)
|
||||||
<*> fileKey key
|
<*> fileKey key
|
||||||
_ -> Nothing
|
_ -> Nothing
|
||||||
|
@ -279,14 +270,14 @@ readTransferInfo mpid s = TransferInfo
|
||||||
|
|
||||||
{- The directory holding transfer information files for a given Direction. -}
|
{- The directory holding transfer information files for a given Direction. -}
|
||||||
transferDir :: Direction -> Git.Repo -> FilePath
|
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
|
{- The directory holding failed transfer information files for a given
|
||||||
- Direction and UUID -}
|
- Direction and UUID -}
|
||||||
failedTransferDir :: UUID -> Direction -> Git.Repo -> FilePath
|
failedTransferDir :: UUID -> Direction -> Git.Repo -> FilePath
|
||||||
failedTransferDir u direction r = gitAnnexTransferDir r
|
failedTransferDir u direction r = gitAnnexTransferDir r
|
||||||
</> "failed"
|
</> "failed"
|
||||||
</> showLcDirection direction
|
</> formatDirection direction
|
||||||
</> filter (/= '/') (fromUUID u)
|
</> filter (/= '/') (fromUUID u)
|
||||||
|
|
||||||
prop_read_write_transferinfo :: TransferInfo -> Bool
|
prop_read_write_transferinfo :: TransferInfo -> Bool
|
||||||
|
|
|
@ -1,16 +1,22 @@
|
||||||
{- Data type for a distribution of git-annex
|
{- 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.
|
- Licensed under the GNU GPL version 3 or higher.
|
||||||
-}
|
-}
|
||||||
|
|
||||||
module Types.Distribution where
|
module Types.Distribution where
|
||||||
|
|
||||||
|
import Utility.PartialPrelude
|
||||||
import Types.Key
|
import Types.Key
|
||||||
|
import Key
|
||||||
import Data.Time.Clock
|
import Data.Time.Clock
|
||||||
import Git.Config (isTrue, boolConfig)
|
import Git.Config (isTrue, boolConfig)
|
||||||
|
|
||||||
|
import Data.String.Utils
|
||||||
|
|
||||||
|
type GitAnnexVersion = String
|
||||||
|
|
||||||
data GitAnnexDistribution = GitAnnexDistribution
|
data GitAnnexDistribution = GitAnnexDistribution
|
||||||
{ distributionUrl :: String
|
{ distributionUrl :: String
|
||||||
, distributionKey :: Key
|
, distributionKey :: Key
|
||||||
|
@ -20,7 +26,39 @@ data GitAnnexDistribution = GitAnnexDistribution
|
||||||
}
|
}
|
||||||
deriving (Read, Show, Eq)
|
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
|
data AutoUpgrade = AskUpgrade | AutoUpgrade | NoAutoUpgrade
|
||||||
deriving (Eq)
|
deriving (Eq)
|
||||||
|
|
|
@ -16,8 +16,7 @@ import Control.Concurrent
|
||||||
import Control.Applicative
|
import Control.Applicative
|
||||||
import Prelude
|
import Prelude
|
||||||
|
|
||||||
{- Enough information to uniquely identify a transfer, used as the filename
|
{- Enough information to uniquely identify a transfer. -}
|
||||||
- of the transfer information file. -}
|
|
||||||
data Transfer = Transfer
|
data Transfer = Transfer
|
||||||
{ transferDirection :: Direction
|
{ transferDirection :: Direction
|
||||||
, transferUUID :: UUID
|
, transferUUID :: UUID
|
||||||
|
@ -46,7 +45,16 @@ stubTransferInfo :: TransferInfo
|
||||||
stubTransferInfo = TransferInfo Nothing Nothing Nothing Nothing Nothing Nothing False
|
stubTransferInfo = TransferInfo Nothing Nothing Nothing Nothing Nothing Nothing False
|
||||||
|
|
||||||
data Direction = Upload | Download
|
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
|
instance Arbitrary TransferInfo where
|
||||||
arbitrary = TransferInfo
|
arbitrary = TransferInfo
|
||||||
|
|
Loading…
Reference in a new issue