Repository is cloned if not found on a local disk

This commit is contained in:
Filip Gralinski 2020-09-05 14:22:12 +02:00
parent 7311a2a012
commit dce08f5ce6
5 changed files with 53 additions and 14 deletions

View File

@ -105,7 +105,7 @@ doCreateChallenge creationData chan = do
case maybePublicRepoId of case maybePublicRepoId of
Just publicRepoId -> do Just publicRepoId -> do
publicRepo <- runDB $ get404 publicRepoId publicRepo <- runDB $ get404 publicRepoId
publicRepoDir <- getRepoDir publicRepoId publicRepoDir <- getRepoDirOrClone publicRepoId chan
maybePrivateRepoId <- cloneRepo (RepoCloningSpec { maybePrivateRepoId <- cloneRepo (RepoCloningSpec {
cloningSpecRepo = RepoSpec { cloningSpecRepo = RepoSpec {
repoSpecUrl = privateUrl, repoSpecUrl = privateUrl,
@ -226,7 +226,7 @@ doChallengeUpdate challengeId challengeData chan = do
when isValidated $ when isValidated $
do do
privateRepo <- runDB $ get404 $ privateRepoId privateRepo <- runDB $ get404 $ privateRepoId
repoDir <- getRepoDir privateRepoId repoDir <- getRepoDirOrClone privateRepoId chan
(Just versionDescription) <- liftIO $ getLastCommitMessage repoDir (Just versionDescription) <- liftIO $ getLastCommitMessage repoDir
theNow <- liftIO getCurrentTime theNow <- liftIO getCurrentTime
let commit = (repoCurrentCommit privateRepo) let commit = (repoCurrentCommit privateRepo)
@ -286,7 +286,7 @@ defaultInitialDescription = "initial version"
extractChallengeMetadata :: Key Repo -> Channel -> Handler (Text, Text, Maybe ByteString) extractChallengeMetadata :: Key Repo -> Channel -> Handler (Text, Text, Maybe ByteString)
extractChallengeMetadata publicRepoId chan = do extractChallengeMetadata publicRepoId chan = do
publicRepoDir <- getRepoDir publicRepoId publicRepoDir <- getRepoDirOrClone publicRepoId chan
let readmeFilePath = publicRepoDir </> readmeFile let readmeFilePath = publicRepoDir </> readmeFile
doesReadmeExist <- liftIO $ doesFileExist readmeFilePath doesReadmeExist <- liftIO $ doesFileExist readmeFilePath
(title, description) <- if doesReadmeExist (title, description) <- if doesReadmeExist
@ -349,7 +349,7 @@ updateTests :: (Key Challenge) -> Channel -> Handler ()
updateTests challengeId chan = do updateTests challengeId chan = do
challenge <- runDB $ get404 challengeId challenge <- runDB $ get404 challengeId
let repoId = challengePrivateRepo challenge let repoId = challengePrivateRepo challenge
repoDir <- getRepoDir repoId repoDir <- getRepoDirOrClone repoId chan
repo <- runDB $ get404 repoId repo <- runDB $ get404 repoId
let commit = repoCurrentCommit repo let commit = repoCurrentCommit repo
testDirs <- liftIO $ findTestDirs repoDir testDirs <- liftIO $ findTestDirs repoDir
@ -372,7 +372,7 @@ checkTestDir chan challengeId challenge commit testDir = do
then do then do
msg chan $ concat ["Test dir ", (T.pack testDir), " found."] msg chan $ concat ["Test dir ", (T.pack testDir), " found."]
checksum <- liftIO $ gatherSHA1 testDir checksum <- liftIO $ gatherSHA1 testDir
challengeRepoDir <- getRepoDir $ challengePrivateRepo challenge challengeRepoDir <- getRepoDirOrClone (challengePrivateRepo challenge) chan
optionsParsingResult <- liftIO $ getOptions [ optionsParsingResult <- liftIO $ getOptions [
"--expected-directory", challengeRepoDir, "--expected-directory", challengeRepoDir,
"--test-name", takeFileName testDir] "--test-name", takeFileName testDir]
@ -461,7 +461,7 @@ validateChallenge False _ chan = do
validateChallenge True repoId chan = do validateChallenge True repoId chan = do
msg chan "Validating the challenge..." msg chan "Validating the challenge..."
repoDir <- getRepoDir repoId repoDir <- getRepoDirOrClone repoId chan
optionsParsingResult <- liftIO $ getOptions [ optionsParsingResult <- liftIO $ getOptions [
"--expected-directory", repoDir] "--expected-directory", repoDir]

View File

@ -116,7 +116,7 @@ getOuts chan submissionId generalParams = do
submission <- runDB $ get404 submissionId submission <- runDB $ get404 submissionId
let challengeId = submissionChallenge submission let challengeId = submissionChallenge submission
let version = submissionVersion submission let version = submissionVersion submission
repoDir <- getRepoDir $ submissionRepo submission repoDir <- getRepoDirOrClone (submissionRepo submission) chan
activeTests <- runDB $ selectList [TestChallenge ==. challengeId, activeTests <- runDB $ selectList [TestChallenge ==. challengeId,
TestActive ==. True, TestActive ==. True,
TestCommit ==. submissionVersion submission] [] TestCommit ==. submissionVersion submission] []
@ -218,7 +218,7 @@ checkOrInsertEvaluation repoDir chan version out = do
msg chan $ concat ["Already evaluated with score ", (fromMaybe "???" $ formatNonScientifically <$> evaluationScore evaluation)] msg chan $ concat ["Already evaluated with score ", (fromMaybe "???" $ formatNonScientifically <$> evaluationScore evaluation)]
Nothing -> do Nothing -> do
msg chan $ "Start evaluation..." msg chan $ "Start evaluation..."
challengeDir <- getRepoDir $ challengePrivateRepo challenge challengeDir <- getRepoDirOrClone (challengePrivateRepo challenge) chan
variant <- runDB $ get404 $ outVariant out variant <- runDB $ get404 $ outVariant out
resultOrException <- liftIO $ rawEval challengeDir (testMetric test) repoDir (testName test) ((T.unpack $ variantName variant) <.> "tsv") resultOrException <- liftIO $ rawEval challengeDir (testMetric test) repoDir (testName test) ((T.unpack $ variantName variant) <.> "tsv")
case resultOrException of case resultOrException of

View File

@ -28,7 +28,7 @@ doMakePublic userId submissionId chan = do
challenge <- runDB $ get404 $ submissionChallenge submission challenge <- runDB $ get404 $ submissionChallenge submission
repo <- runDB $ get404 $ challengePublicRepo challenge repo <- runDB $ get404 $ challengePublicRepo challenge
let submissionRepoId = submissionRepo submission let submissionRepoId = submissionRepo submission
submissionRepoDir <- getRepoDir submissionRepoId submissionRepoDir <- getRepoDirOrClone submissionRepoId chan
app <- getYesod app <- getYesod
let scheme = appRepoScheme $ appSettings app let scheme = appRepoScheme $ appSettings app

View File

@ -24,7 +24,7 @@ import qualified Data.List as DL
import System.Random import System.Random
import System.Directory (doesFileExist, renameDirectory) import System.Directory (doesFileExist, renameDirectory, doesDirectoryExist)
import PersistSHA1 import PersistSHA1
@ -145,7 +145,7 @@ cloneRepo repoCloningSpec chan = do
updateRepo :: Key Repo -> Channel -> Handler Bool updateRepo :: Key Repo -> Channel -> Handler Bool
updateRepo repoId chan = do updateRepo repoId chan = do
repo <- runDB $ get404 repoId repo <- runDB $ get404 repoId
repoDir <- getRepoDir repoId repoDir <- getRepoDirOrClone repoId chan
let branch = repoBranch repo let branch = repoBranch repo
exitCode <- runWithChannel chan $ do exitCode <- runWithChannel chan $ do
runProg (Just repoDir) gitPath ["fetch", runProg (Just repoDir) gitPath ["fetch",
@ -172,7 +172,7 @@ updateRepo repoId chan = do
getSubmissionRepoDir :: SubmissionId -> Channel -> Handler (Maybe FilePath) getSubmissionRepoDir :: SubmissionId -> Channel -> Handler (Maybe FilePath)
getSubmissionRepoDir submissionId chan = do getSubmissionRepoDir submissionId chan = do
submission <- runDB $ get404 submissionId submission <- runDB $ get404 submissionId
repoDir <- getRepoDir $ submissionRepo submission repoDir <- getRepoDirOrClone (submissionRepo submission) chan
let sha1Code = submissionCommit submission let sha1Code = submissionCommit submission
-- this is not right... it should be fixed in the future -- this is not right... it should be fixed in the future
-- 1. All kinds of mayhem may ensue in case of concurrency -- 1. All kinds of mayhem may ensue in case of concurrency
@ -230,7 +230,7 @@ getPossiblyExistingRepo checkRepo userId challengeId repoSpec chan = do
challenge <- runDB $ get404 challengeId challenge <- runDB $ get404 challengeId
let repoId = challengePublicRepo challenge let repoId = challengePublicRepo challenge
repo <- runDB $ get404 repoId repo <- runDB $ get404 repoId
repoDir <- getRepoDir repoId repoDir <- getRepoDirOrClone repoId chan
let repoCloningSpec = RepoCloningSpec { let repoCloningSpec = RepoCloningSpec {
cloningSpecRepo = repoSpec, cloningSpecRepo = repoSpec,
cloningSpecReferenceRepo = RepoSpec { cloningSpecReferenceRepo = RepoSpec {
@ -330,6 +330,45 @@ getStuffUsingGitAnnex tmpRepoDir (Just gitAnnexRemote) = do
runGitAnnex :: FilePath -> [String] -> Runner () runGitAnnex :: FilePath -> [String] -> Runner ()
runGitAnnex tmpRepoDir args = runProg (Just tmpRepoDir) gitPath ("annex":args) runGitAnnex tmpRepoDir args = runProg (Just tmpRepoDir) gitPath ("annex":args)
-- Gets a directory for an already cloned repo (e.g. arena/r1234). If,
-- for some reason, the directory does not exist (e.g. the database
-- was recovered on a new computer), it will re-clone the repository.
getRepoDirOrClone :: RepoId -> Channel -> Handler FilePath
getRepoDirOrClone repoId chan = do
repoDir <- getRepoDir repoId
repoDirExists <- liftIO $ doesDirectoryExist repoDir
if repoDirExists
then
return ()
else
do
repo <- runDB $ get404 repoId
let repoSpec = RepoSpec {
repoSpecUrl = repoUrl repo,
repoSpecBranch = repoBranch repo,
repoSpecGitAnnexRemote = repoGitAnnexRemote repo }
let repoCloningSpec = RepoCloningSpec {
cloningSpecRepo = repoSpec,
cloningSpecReferenceRepo = repoSpec }
(exitCode, tmpRepoDir) <- cloneRepoToTempDir repoCloningSpec chan
case exitCode of
ExitSuccess -> do
let commitHash = fromSHA1ToText $ repoCurrentCommit repo
(exitCode', _) <- runProgram (Just tmpRepoDir) gitPath ["reset",
"--hard",
T.unpack commitHash] chan
case exitCode' of
ExitSuccess -> do
liftIO $ renameDirectory tmpRepoDir repoDir
return ()
ExitFailure _ -> do
err chan $ "cannot reset to commit" ++ commitHash
return ()
ExitFailure _ -> do
err chan "git failed"
return ()
return repoDir
getRepoDir :: Key Repo -> Handler FilePath getRepoDir :: Key Repo -> Handler FilePath
getRepoDir repoId = do getRepoDir repoId = do
arenaDir <- arena arenaDir <- arena

View File

@ -424,7 +424,7 @@ doCreateSubmission' _ userId challengeId challengeSubmissionData chan = do
repo <- runDB $ get404 repoId repo <- runDB $ get404 repoId
repoDir <- getRepoDir repoId repoDir <- getRepoDirOrClone repoId chan
gonitoMetadata <- liftIO gonitoMetadata <- liftIO
$ extractMetadataFromRepoDir repoDir (ExtractionOptions { $ extractMetadataFromRepoDir repoDir (ExtractionOptions {