Mercurial > hg > mercurial
changeset 218:ae0d53fe26f2 Eluru-6.0.x
TW-15861: do pull in getContent() only if local repository does not contain revision of interest
author | Dmitry Neverov <dmitry.neverov@jetbrains.com> |
---|---|
date | Wed, 06 Apr 2011 11:23:28 +0400 |
parents | e07386542f69 |
children | 5c1585e791c9 |
files | mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialVcsSupport.java |
diffstat | 1 files changed, 47 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialVcsSupport.java Wed Apr 06 11:01:28 2011 +0400 +++ b/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialVcsSupport.java Wed Apr 06 11:23:28 2011 +0400 @@ -138,10 +138,11 @@ @NotNull public byte[] getContent(@NotNull final String filePath, @NotNull final VcsRoot vcsRoot, @NotNull final String version) throws VcsException { - syncClonedRepository(vcsRoot); + ChangeSet cset = new ChangeSet(version); + syncClonedRepository(vcsRoot, cset); Settings settings = createSettings(vcsRoot); CatCommand cc = new CatCommand(settings); - cc.setRevId(new ChangeSet(version).getId()); + cc.setRevId(cset.getId()); File parentDir = cc.execute(Collections.singletonList(filePath)); try { File file = new File(parentDir, filePath); @@ -381,6 +382,50 @@ } } + /** + * clone the repo if it doesn't exist, pull the repo if it doesn't contain specified changeSet + */ + private void syncClonedRepository(final VcsRoot root, final ChangeSet cset) throws VcsException { + Settings settings = createSettings(root); + File workDir = settings.getLocalRepositoryDir(); + lockWorkDir(workDir); + try { + if (settings.hasCopyOfRepository()) { + if (!isChangeSetExist(settings, cset)) { + PullCommand pull = new PullCommand(settings); + pull.execute(); + } + } else { + CloneCommand cl = new CloneCommand(settings); + cl.setDestDir(workDir.getAbsolutePath()); + cl.setUpdateWorkingDir(false); + cl.execute(); + } + } finally { + unlockWorkDir(workDir); + } + } + + /** + * Check if changeSet is present in local repository. + * @param settings root settings + * @param cset change set of interest + * @return true if changeSet is present in local repository + */ + private boolean isChangeSetExist(Settings settings, final ChangeSet cset) { + try { + File workDir = settings.getLocalRepositoryDir(); + IdentifyCommand identify = new IdentifyCommand(settings); + identify.setWorkingDir(workDir); + identify.setInLocalRepository(true); + identify.setChangeSet(cset); + identify.execute(); + return true; + } catch (VcsException e) { + return false; + } + } + // updates current working copy of repository by pulling changes from the repository specified in VCS root private void syncClonedRepository(final VcsRoot root) throws VcsException { Settings settings = createSettings(root);