Mercurial > hg > mercurial
changeset 792:75aed0d7a1f9 Gaya-8.1.x
TW-33522 limit the number of repository clone attempts
author | Dmitry Neverov <dmitry.neverov@gmail.com> |
---|---|
date | Mon, 19 May 2014 17:05:32 +0200 |
parents | 914a0b473c45 |
children | 0a1ac46bfa8c |
files | mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialVcsSupport.java |
diffstat | 1 files changed, 22 insertions(+), 10 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialVcsSupport.java Thu May 01 19:51:00 2014 +0200 +++ b/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialVcsSupport.java Mon May 19 17:05:32 2014 +0200 @@ -499,24 +499,36 @@ public <T> T syncRepository(@NotNull HgVcsRoot root, @NotNull VcsCallable<T> cmd) throws VcsException { File workingDir = getWorkingDir(root); + int attemptsLeft = 3; + VcsException lastError = null; + while (attemptsLeft-- > 0) { + try { + return syncRepositoryOnce(root, cmd, workingDir); + } catch (UnrelatedRepositoryException e) { + Loggers.VCS.warn("Repository at " + workingDir.getAbsolutePath() + " is unrelated to " + root.getRepository() + + ". Clone it again, attempts left " + attemptsLeft); + myMirrorManager.forgetDir(workingDir); + lastError = e; + } catch (AbandonedTransactionFound e) { + Loggers.VCS.warn("Abandoned transaction found in repository " + root.getRepository() + " at " + + workingDir.getAbsolutePath() + ". Clone it again, attempts left " + attemptsLeft); + myMirrorManager.forgetDir(workingDir); + lastError = e; + } + } + throw lastError; + } + + + private <T> T syncRepositoryOnce(@NotNull HgVcsRoot root, @NotNull VcsCallable<T> cmd, @NotNull File workingDir) throws VcsException { lockWorkDir(workingDir); HgRepo repo = createRepo(root); try { if (repo.isValidRepository()) { - try { resetBookmarks(repo); repo.pull().fromRepository(root.getRepository()) .withTimeout(myConfig.getPullTimeout()) .call(); - } catch (UnrelatedRepositoryException e) { - Loggers.VCS.warn("Repository at " + root.getRepository() + " is unrelated, clone it again"); - myMirrorManager.forgetDir(workingDir); - syncRepository(root); - } catch (AbandonedTransactionFound e) { - Loggers.VCS.warn("Abandoned transaction found in repository " + root.getRepository() + ", clone it again"); - myMirrorManager.forgetDir(workingDir); - syncRepository(root); - } } else { repo.doClone().fromRepository(root.getRepository()) .setUpdateWorkingDir(false)