make DistributionUpdate download build-version files and use them in the info files
Also automated downloading the builds, finally. I had done it by hand until now. Note that the Windows autobuilder has an expired cert, so it will refuse to download from it currently. I have emailed its admin to get that fixed, hopefully. This commit was sponsored by Peter Hogg.
This commit is contained in:
parent
08f1f7a697
commit
5b478722da
4 changed files with 82 additions and 17 deletions
|
@ -1,6 +1,9 @@
|
||||||
{- Builds distributon info files for each git-annex release in a directory
|
{- Downloads git-annex autobuilds and installs them into the git-annex
|
||||||
- tree, which must itself be part of a git-annex repository. Only files
|
- repository in ~/lib/downloads that is used to distribute git-annex
|
||||||
- that are present have their info file created.
|
- releases.
|
||||||
|
-
|
||||||
|
- Generates info files, containing the version (of the corresponding file
|
||||||
|
- from the autobuild).
|
||||||
-
|
-
|
||||||
- Also gpg signs the files.
|
- Also gpg signs the files.
|
||||||
-}
|
-}
|
||||||
|
@ -9,25 +12,82 @@ import Common.Annex
|
||||||
import Types.Distribution
|
import Types.Distribution
|
||||||
import Build.Version
|
import Build.Version
|
||||||
import Utility.UserInfo
|
import Utility.UserInfo
|
||||||
import Utility.Path
|
import Utility.Url
|
||||||
import qualified Git.Construct
|
import qualified Git.Construct
|
||||||
import qualified Annex
|
import qualified Annex
|
||||||
import Annex.Content
|
import Annex.Content
|
||||||
import Backend
|
import Backend
|
||||||
import Git.Command
|
import Git.Command
|
||||||
|
|
||||||
|
import Data.Default
|
||||||
import Data.Time.Clock
|
import Data.Time.Clock
|
||||||
|
|
||||||
-- git-annex distribution signing key (for Joey Hess)
|
-- git-annex distribution signing key (for Joey Hess)
|
||||||
signingKey :: String
|
signingKey :: String
|
||||||
signingKey = "89C809CB"
|
signingKey = "89C809CB"
|
||||||
|
|
||||||
main = do
|
-- URL to an autobuilt git-annex file, and the place to install
|
||||||
state <- Annex.new =<< Git.Construct.fromPath =<< getRepoDir
|
-- it in the repository.
|
||||||
Annex.eval state makeinfos
|
autobuilds :: [(URLString, FilePath)]
|
||||||
|
autobuilds =
|
||||||
|
(map linuxarch ["i386", "amd64", "armel"]) ++
|
||||||
|
(map androidversion ["4.0", "4.3"]) ++
|
||||||
|
[ ("https://downloads.kitenet.net/git-annex/autobuild/x86_64-apple-mavericks/git-annex.dmg", "OSX/current/10.9_Mavericks")
|
||||||
|
, ("https://qa.nest-initiative.org/view/msysGit/job/msysgit-git-annex-assistant-test/lastSuccessfulBuild/artifact/git-annex/git-annex-installer.exe", "windows/current/git-annex-installer.exe")
|
||||||
|
]
|
||||||
|
where
|
||||||
|
linuxarch a =
|
||||||
|
( "https://downloads.kitenet.net/git-annex/autobuild/i386/git-annex-standalone-" ++ a ++ ".tar.gz"
|
||||||
|
, "git-annex/linux/current/git-annex-standalone-" ++ a ++ ".tar.gz"
|
||||||
|
)
|
||||||
|
androidversion v =
|
||||||
|
( "http://downloads.kitenet.net/git-annex/autobuild/android/" ++ v ++ "/git-annex.apk"
|
||||||
|
, "android/current/" ++ v ++ "/git-annex.apk"
|
||||||
|
)
|
||||||
|
|
||||||
makeinfos :: Annex ()
|
main :: IO ()
|
||||||
makeinfos = do
|
main = do
|
||||||
|
repodir <- getRepoDir
|
||||||
|
updated <- catMaybes <$> mapM (getbuild repodir) autobuilds
|
||||||
|
state <- Annex.new =<< Git.Construct.fromPath repodir
|
||||||
|
Annex.eval state (makeinfos updated)
|
||||||
|
|
||||||
|
-- Download a build from the autobuilder, and return its version.
|
||||||
|
-- It's very important that the version matches the build, otherwise
|
||||||
|
-- auto-upgrades can loop reatedly. So, check build-version before
|
||||||
|
-- and after downloading the file.
|
||||||
|
getbuild :: FilePath -> (URLString, FilePath) -> IO (Maybe (FilePath, Version))
|
||||||
|
getbuild repodir (url, f) = do
|
||||||
|
bv1 <- getbv
|
||||||
|
createDirectoryIfMissing True repodir
|
||||||
|
let dest = repodir </> f
|
||||||
|
let tmp = dest ++ ".tmp"
|
||||||
|
nukeFile tmp
|
||||||
|
ifM (download url tmp def)
|
||||||
|
( do
|
||||||
|
bv2 <- getbv
|
||||||
|
case bv2 of
|
||||||
|
Nothing -> return Nothing
|
||||||
|
(Just v)
|
||||||
|
| bv2 == bv1 -> do
|
||||||
|
nukeFile dest
|
||||||
|
renameFile tmp dest
|
||||||
|
-- remove git rev part of version
|
||||||
|
let v' = takeWhile (/= '-') v
|
||||||
|
return $ Just (f, v')
|
||||||
|
| otherwise -> do
|
||||||
|
nukeFile tmp
|
||||||
|
error $ "build version changed while downloading " ++ url ++ " " ++ show (bv1, bv2)
|
||||||
|
, return Nothing
|
||||||
|
)
|
||||||
|
where
|
||||||
|
getbv = do
|
||||||
|
bv <- catchDefaultIO "" $
|
||||||
|
readProcess "curl" [takeDirectory url ++ "build-version"]
|
||||||
|
return $ if null bv then Nothing else Just bv
|
||||||
|
|
||||||
|
makeinfos :: [(FilePath, Version)] -> Annex ()
|
||||||
|
makeinfos updated = do
|
||||||
version <- liftIO getChangelogVersion
|
version <- liftIO getChangelogVersion
|
||||||
void $ inRepo $ runBool
|
void $ inRepo $ runBool
|
||||||
[ Param "commit"
|
[ Param "commit"
|
||||||
|
@ -37,9 +97,8 @@ makeinfos = do
|
||||||
]
|
]
|
||||||
basedir <- liftIO getRepoDir
|
basedir <- liftIO getRepoDir
|
||||||
now <- liftIO getCurrentTime
|
now <- liftIO getCurrentTime
|
||||||
liftIO $ putStrLn $ "building info files for version " ++ version ++ " in " ++ basedir
|
liftIO $ putStrLn $ "building info files in " ++ basedir
|
||||||
fs <- liftIO $ dirContentsRecursiveSkipping (const False) True (basedir </> "git-annex")
|
forM_ updated $ \(f, bv) -> do
|
||||||
forM_ fs $ \f -> do
|
|
||||||
v <- lookupFile f
|
v <- lookupFile f
|
||||||
case v of
|
case v of
|
||||||
Nothing -> noop
|
Nothing -> noop
|
||||||
|
@ -49,7 +108,7 @@ makeinfos = do
|
||||||
liftIO $ writeFile infofile $ show $ GitAnnexDistribution
|
liftIO $ writeFile infofile $ show $ GitAnnexDistribution
|
||||||
{ distributionUrl = mkUrl basedir f
|
{ distributionUrl = mkUrl basedir f
|
||||||
, distributionKey = k
|
, distributionKey = k
|
||||||
, distributionVersion = version
|
, distributionVersion = bv
|
||||||
, distributionReleasedate = now
|
, distributionReleasedate = now
|
||||||
, distributionUrgentUpgrade = Nothing
|
, distributionUrgentUpgrade = Nothing
|
||||||
}
|
}
|
||||||
|
@ -70,7 +129,7 @@ makeinfos = do
|
||||||
, Params "sync"
|
, Params "sync"
|
||||||
]
|
]
|
||||||
|
|
||||||
{- Check for out of date info files. -}
|
-- Check for out of date info files.
|
||||||
infos <- liftIO $ filter (".info" `isSuffixOf`)
|
infos <- liftIO $ filter (".info" `isSuffixOf`)
|
||||||
<$> dirContentsRecursive (basedir </> "git-annex")
|
<$> dirContentsRecursive (basedir </> "git-annex")
|
||||||
ds <- liftIO $ forM infos (readish <$$> readFile)
|
ds <- liftIO $ forM infos (readish <$$> readFile)
|
||||||
|
|
|
@ -14,6 +14,8 @@ import Build.TestConfig
|
||||||
import Utility.Monad
|
import Utility.Monad
|
||||||
import Utility.Exception
|
import Utility.Exception
|
||||||
|
|
||||||
|
type Version = String
|
||||||
|
|
||||||
{- Set when making an official release. (Distribution vendors should set
|
{- Set when making an official release. (Distribution vendors should set
|
||||||
- this too.) -}
|
- this too.) -}
|
||||||
isReleaseBuild :: IO Bool
|
isReleaseBuild :: IO Bool
|
||||||
|
@ -25,7 +27,7 @@ isReleaseBuild = isJust <$> catchMaybeIO (getEnv "RELEASE_BUILD")
|
||||||
-
|
-
|
||||||
- If git or a git repo is not available, or something goes wrong,
|
- If git or a git repo is not available, or something goes wrong,
|
||||||
- or this is a release build, just use the version from the changelog. -}
|
- or this is a release build, just use the version from the changelog. -}
|
||||||
getVersion :: IO String
|
getVersion :: IO Version
|
||||||
getVersion = do
|
getVersion = do
|
||||||
changelogversion <- getChangelogVersion
|
changelogversion <- getChangelogVersion
|
||||||
ifM (isReleaseBuild)
|
ifM (isReleaseBuild)
|
||||||
|
@ -41,7 +43,7 @@ getVersion = do
|
||||||
else return $ concat [ major, ".", autoversion ]
|
else return $ concat [ major, ".", autoversion ]
|
||||||
)
|
)
|
||||||
|
|
||||||
getChangelogVersion :: IO String
|
getChangelogVersion :: IO Version
|
||||||
getChangelogVersion = do
|
getChangelogVersion = do
|
||||||
changelog <- readFile "debian/changelog"
|
changelog <- readFile "debian/changelog"
|
||||||
let verline = takeWhile (/= '\n') changelog
|
let verline = takeWhile (/= '\n') changelog
|
||||||
|
|
2
Makefile
2
Makefile
|
@ -256,7 +256,7 @@ hdevtools:
|
||||||
distributionupdate:
|
distributionupdate:
|
||||||
git pull
|
git pull
|
||||||
cabal configure
|
cabal configure
|
||||||
ghc --make Build/DistributionUpdate -XPackageImports -optP-include -optPdist/build/autogen/cabal_macros.h
|
ghc -Wall --make Build/DistributionUpdate -XPackageImports -optP-include -optPdist/build/autogen/cabal_macros.h
|
||||||
./Build/DistributionUpdate
|
./Build/DistributionUpdate
|
||||||
|
|
||||||
.PHONY: git-annex git-union-merge git-recover-repository tags build-stamp
|
.PHONY: git-annex git-union-merge git-recover-repository tags build-stamp
|
||||||
|
|
|
@ -28,3 +28,7 @@ Current.
|
||||||
[[!meta title="upgrade loop when info file contains newer version than distributed version of git-annex"]]
|
[[!meta title="upgrade loop when info file contains newer version than distributed version of git-annex"]]
|
||||||
|
|
||||||
[[!tag confirmed]]
|
[[!tag confirmed]]
|
||||||
|
|
||||||
|
> [[fixed|done]]; the release process now uses versions from build-version
|
||||||
|
> files that are created by the autobuilders, so should always be accurate.
|
||||||
|
> --[[Joey]]
|
||||||
|
|
Loading…
Reference in a new issue