# HG changeset patch # User Pavel.Sher # Date 1273521911 -14400 # Node ID 8587a9c22d5537689d3a6c2dc4f1a68f054fcaec # Parent 8cc11b0cbbd40a330b4a99ebe3b85f2acee4bcd0 switch to new API diff -r 8cc11b0cbbd4 -r 8587a9c22d55 mercurial-agent/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialAgentSideVcsSupport.java --- a/mercurial-agent/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialAgentSideVcsSupport.java Wed Apr 14 19:18:53 2010 +0400 +++ b/mercurial-agent/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialAgentSideVcsSupport.java Tue May 11 00:05:11 2010 +0400 @@ -16,9 +16,13 @@ package jetbrains.buildServer.buildTriggers.vcs.mercurial; import jetbrains.buildServer.agent.BuildProgressLogger; -import jetbrains.buildServer.agent.vcs.CheckoutOnAgentVcsSupport; +import jetbrains.buildServer.agent.vcs.AgentVcsSupport; +import jetbrains.buildServer.agent.vcs.IncludeRuleUpdater; +import jetbrains.buildServer.agent.vcs.UpdateByIncludeRules; +import jetbrains.buildServer.agent.vcs.UpdatePolicy; import jetbrains.buildServer.buildTriggers.vcs.mercurial.command.*; import jetbrains.buildServer.util.FileUtil; +import jetbrains.buildServer.vcs.CheckoutRules; import jetbrains.buildServer.vcs.IncludeRule; import jetbrains.buildServer.vcs.VcsException; import jetbrains.buildServer.vcs.VcsRoot; @@ -27,46 +31,7 @@ import java.io.File; import java.io.IOException; -public class MercurialAgentSideVcsSupport implements CheckoutOnAgentVcsSupport { - public void updateSources(@NotNull final BuildProgressLogger logger, @NotNull final File workingDir, @NotNull final VcsRoot vcsRoot, @NotNull final String version, final IncludeRule includeRule) throws VcsException { - if (includeRule.getTo() != null && includeRule.getTo().length() > 0) { - if (!".".equals(includeRule.getFrom()) && includeRule.getFrom().length() != 0) { - throw new VcsException("Invalid include rule: " + includeRule.toString() + ", Mercurial plugin supports mapping of the form: +:.=>dir only."); - } - } - - Settings settings = new Settings(workingDir, vcsRoot); - settings.setWorkingDir(workingDir); - if (settings.hasCopyOfRepository()) { - // execute pull command - logger.message("Repository in working directory found, start pulling changes"); - PullCommand pc = new PullCommand(settings); - pc.execute(); - logger.message("Changes successfully pulled"); - } else { - // execute clone command - logger.message("No repository in working directory found, start cloning repository to temporary folder"); - File parentDir = cloneRepository(settings); - logger.message("Repository successfully cloned to: " + parentDir.getAbsolutePath()); - logger.message("Moving repository to working directory: " + workingDir.getAbsolutePath()); - if (!moveDir(parentDir, workingDir)) { - File hgDir = new File(workingDir, ".hg"); - if (hgDir.isDirectory()) { - FileUtil.delete(hgDir); - } - throw new VcsException("Failed to move directory content: " + parentDir.getAbsolutePath() + " to: " + workingDir.getAbsolutePath()); - } - - logger.message("Repository successfully moved to working directory: " + workingDir.getAbsolutePath()); - } - updateWorkingDir(settings, version, logger); - } - - private File getWorkingDir(final File workingDir, final IncludeRule includeRule) { - if (includeRule.getTo().length() == 0) return workingDir; - return new File(workingDir, includeRule.getTo()).getAbsoluteFile(); - } - +public class MercurialAgentSideVcsSupport extends AgentVcsSupport implements UpdateByIncludeRules { private void updateWorkingDir(final Settings settings, final String version, final BuildProgressLogger logger) throws VcsException { logger.message("Updating working directory from the local repository copy"); UpdateCommand uc = new UpdateCommand(settings); @@ -94,11 +59,6 @@ return tempDir; } - @NotNull - public String getName() { - return Constants.VCS_NAME; - } - /** * Moves files from one directory to another with all subdirectories. * Removes old directory if it became empty. @@ -127,4 +87,57 @@ return moveSuccessful; } + + @NotNull + @Override + public UpdatePolicy getUpdatePolicy() { + return this; + } + + @NotNull + @Override + public String getName() { + return Constants.VCS_NAME; + } + + public IncludeRuleUpdater getUpdater(@NotNull final VcsRoot vcsRoot, @NotNull final CheckoutRules checkoutRules, @NotNull final String toVersion, @NotNull final File checkoutDirectory, @NotNull final BuildProgressLogger logger) throws VcsException { + return new IncludeRuleUpdater() { + public void process(@NotNull final IncludeRule includeRule, @NotNull final File workingDir) throws VcsException { + if (includeRule.getTo() != null && includeRule.getTo().length() > 0) { + if (!".".equals(includeRule.getFrom()) && includeRule.getFrom().length() != 0) { + throw new VcsException("Invalid include rule: " + includeRule.toString() + ", Mercurial plugin supports mapping of the form: +:.=>dir only."); + } + } + + Settings settings = new Settings(workingDir, vcsRoot); + settings.setWorkingDir(workingDir); + if (settings.hasCopyOfRepository()) { + // execute pull command + logger.message("Repository in working directory found, start pulling changes"); + PullCommand pc = new PullCommand(settings); + pc.execute(); + logger.message("Changes successfully pulled"); + } else { + // execute clone command + logger.message("No repository in working directory found, start cloning repository to temporary folder"); + File parentDir = cloneRepository(settings); + logger.message("Repository successfully cloned to: " + parentDir.getAbsolutePath()); + logger.message("Moving repository to working directory: " + workingDir.getAbsolutePath()); + if (!moveDir(parentDir, workingDir)) { + File hgDir = new File(workingDir, ".hg"); + if (hgDir.isDirectory()) { + FileUtil.delete(hgDir); + } + throw new VcsException("Failed to move directory content: " + parentDir.getAbsolutePath() + " to: " + workingDir.getAbsolutePath()); + } + + logger.message("Repository successfully moved to working directory: " + workingDir.getAbsolutePath()); + } + updateWorkingDir(settings, toVersion, logger); + } + + public void dispose() throws VcsException { + } + }; + } } diff -r 8cc11b0cbbd4 -r 8587a9c22d55 mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialVcsSupport.java --- a/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialVcsSupport.java Wed Apr 14 19:18:53 2010 +0400 +++ b/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialVcsSupport.java Tue May 11 00:05:11 2010 +0400 @@ -15,9 +15,7 @@ */ package jetbrains.buildServer.buildTriggers.vcs.mercurial; -import jetbrains.buildServer.AgentSideCheckoutAbility; import jetbrains.buildServer.BuildAgent; -import jetbrains.buildServer.CollectChangesByIncludeRule; import jetbrains.buildServer.Used; import jetbrains.buildServer.buildTriggers.vcs.AbstractVcsPropertiesProcessor; import jetbrains.buildServer.buildTriggers.vcs.mercurial.command.*; @@ -55,7 +53,7 @@ *

Working copy of repository is created in the $TEAMCITY_DATA_PATH/system/caches/hg_<hash code> folder. *

Personal builds (remote runs) are not yet supported, they require corresponding functionality from the IDE. */ -public class MercurialVcsSupport extends VcsSupport implements CollectChangesByIncludeRule, LabelingSupport, AgentSideCheckoutAbility { +public class MercurialVcsSupport extends ServerVcsSupport implements LabelingSupport, VcsFileContentProvider { private ConcurrentMap myWorkDirLocks= new ConcurrentHashMap(); private static final int OLD_WORK_DIRS_CLEANUP_PERIOD = 600; private VcsManager myVcsManager; @@ -65,7 +63,6 @@ @NotNull ServerPaths paths, @NotNull final SBuildServer server, @NotNull EventDispatcher dispatcher) { - vcsManager.registerVcsSupport(this); myVcsManager = vcsManager; server.getExecutor().scheduleAtFixedRate(new Runnable() { public void run() { @@ -95,67 +92,6 @@ }); } - public List collectBuildChanges(final VcsRoot root, - @NotNull final String fromVersion, - @NotNull final String currentVersion, - final CheckoutRules checkoutRules) throws VcsException { - syncClonedRepository(root); - return VcsSupportUtil.collectBuildChanges(root, fromVersion, currentVersion, checkoutRules, this); - } - - public List collectBuildChanges(final VcsRoot root, - final String fromVersion, - final String currentVersion, - final IncludeRule includeRule) throws VcsException { - // first obtain changes between specified versions - List result = new ArrayList(); - Settings settings = createSettings(root); - LogCommand lc = new LogCommand(settings); - String fromId = new ChangeSetRevision(fromVersion).getId(); - lc.setFromRevId(fromId); - lc.setToRevId(new ChangeSetRevision(currentVersion).getId()); - List changeSets = lc.execute(); - if (changeSets.isEmpty()) { - return result; - } - - // invoke status command for each changeset and determine what files were modified in these changesets - StatusCommand st = new StatusCommand(settings); - ChangeSet prev = new ChangeSet(fromVersion); - for (ChangeSet cur : changeSets) { - if (cur.getId().equals(fromId)) continue; // skip already reported changeset - - String prevId = prev.getId(); - List curParents = cur.getParents(); - boolean merge = curParents != null && curParents.size() > 1; - if (curParents != null && !merge) { - prevId = curParents.get(0).getId(); - } - - List modifiedFiles = new ArrayList(); - if (merge) { - modifiedFiles.addAll(computeModifiedFilesForMergeCommit(settings, cur)); - } else { - st.setFromRevId(prevId); - st.setToRevId(cur.getId()); - modifiedFiles = st.execute(); - } - - // changeset full version will be set into VcsChange structure and - // stored in database (note that getContent method will be invoked with this version) - List files = toVcsChanges(modifiedFiles, prev.getFullVersion(), cur.getFullVersion(), includeRule); - if (files.isEmpty() && !merge) continue; - ModificationData md = new ModificationData(cur.getTimestamp(), files, cur.getDescription(), cur.getUser(), root, cur.getFullVersion(), cur.getId()); - if (merge) { - md.setCanBeIgnored(false); - } - result.add(md); - prev = cur; - } - - return result; - } - private Collection computeModifiedFilesForMergeCommit(final Settings settings, final ChangeSet cur) throws VcsException { if (!cur.containsFiles()) return Collections.emptyList(); @@ -169,13 +105,14 @@ for (ModifiedFile mf: modifiedFiles) { String normalizedPath = PathUtil.normalizeSeparator(mf.getPath()); if (!normalizedPath.startsWith(includeRule.getFrom())) continue; // skip files which do not match include rule + String relPath = StringUtil.removeLeadingSlash(normalizedPath.substring(includeRule.getFrom().length())); VcsChangeInfo.Type changeType = getChangeType(mf.getStatus()); if (changeType == null) { Loggers.VCS.warn("Unable to convert status: " + mf.getStatus() + " to VCS change type"); changeType = VcsChangeInfo.Type.NOT_CHANGED; } - files.add(new VcsChange(changeType, mf.getStatus().getName(), normalizedPath, normalizedPath, prevVer, curVer)); + files.add(new VcsChange(changeType, mf.getStatus().getName(), normalizedPath, relPath, prevVer, curVer)); } return files; } @@ -272,26 +209,30 @@ return result.get(settings.getBranchName()).getFullVersion(); } + public boolean sourcesUpdatePossibleIfChangesNotFound(@NotNull final VcsRoot root) { + return false; + } + @NotNull public String describeVcsRoot(final VcsRoot vcsRoot) { return "mercurial: " + vcsRoot.getProperty(Constants.REPOSITORY_PROP); } - public boolean isTestConnectionSupported() { - return true; - } - - @Nullable - public String testConnection(@NotNull final VcsRoot vcsRoot) throws VcsException { - Settings settings = createSettings(vcsRoot); - IdentifyCommand id = new IdentifyCommand(settings); - StringBuilder res = new StringBuilder(); - res.append(quoteIfNeeded(settings.getHgCommandPath())); - res.append(" identify "); - final String obfuscatedUrl = CommandUtil.removePrivateData(settings.getRepositoryUrl(), Collections.singleton(settings.getPassword())); - res.append(quoteIfNeeded(obfuscatedUrl)); - res.append('\n').append(id.execute()); - return res.toString(); + @Override + public TestConnectionSupport getTestConnectionSupport() { + return new TestConnectionSupport() { + public String testConnection(@NotNull final VcsRoot vcsRoot) throws VcsException { + Settings settings = createSettings(vcsRoot); + IdentifyCommand id = new IdentifyCommand(settings); + StringBuilder res = new StringBuilder(); + res.append(quoteIfNeeded(settings.getHgCommandPath())); + res.append(" identify "); + final String obfuscatedUrl = CommandUtil.removePrivateData(settings.getRepositoryUrl(), Collections.singleton(settings.getPassword())); + res.append(quoteIfNeeded(obfuscatedUrl)); + res.append('\n').append(id.execute()); + return res.toString(); + } + }; } private String quoteIfNeeded(@NotNull String str) { @@ -330,20 +271,6 @@ }; } - public void buildPatch(@NotNull final VcsRoot root, - @Nullable final String fromVersion, - @NotNull final String toVersion, - @NotNull final PatchBuilder builder, - @NotNull final CheckoutRules checkoutRules) throws IOException, VcsException { - syncClonedRepository(root); - Settings settings = createSettings(root); - if (fromVersion == null) { - buildFullPatch(settings, new ChangeSet(toVersion), builder, checkoutRules); - } else { - buildIncrementalPatch(settings, new ChangeSet(fromVersion), new ChangeSet(toVersion), builder, checkoutRules); - } - } - // builds patch from version to version private void buildIncrementalPatch(final Settings settings, @NotNull final ChangeSet fromVer, @NotNull final ChangeSet toVer, final PatchBuilder builder, final CheckoutRules checkoutRules) throws VcsException, IOException { @@ -474,6 +401,98 @@ return this; } + @NotNull + public VcsFileContentProvider getContentProvider() { + return this; + } + + @NotNull + public CollectChangesPolicy getCollectChangesPolicy() { + return new CollectChangesByIncludeRules() { + @NotNull + public IncludeRuleChangeCollector getChangeCollector(@NotNull final VcsRoot root, @NotNull final String fromVersion, @Nullable final String currentVersion) throws VcsException { + return new IncludeRuleChangeCollector() { + @NotNull + public List collectChanges(@NotNull final IncludeRule includeRule) throws VcsException { + syncClonedRepository(root); + + // first obtain changes between specified versions + List result = new ArrayList(); + if (currentVersion == null) return result; + + Settings settings = createSettings(root); + LogCommand lc = new LogCommand(settings); + String fromId = new ChangeSetRevision(fromVersion).getId(); + lc.setFromRevId(fromId); + lc.setToRevId(new ChangeSetRevision(currentVersion).getId()); + List changeSets = lc.execute(); + if (changeSets.isEmpty()) { + return result; + } + + // invoke status command for each changeset and determine what files were modified in these changesets + StatusCommand st = new StatusCommand(settings); + ChangeSet prev = new ChangeSet(fromVersion); + for (ChangeSet cur : changeSets) { + if (cur.getId().equals(fromId)) continue; // skip already reported changeset + + String prevId = prev.getId(); + List curParents = cur.getParents(); + boolean merge = curParents != null && curParents.size() > 1; + if (curParents != null && !merge) { + prevId = curParents.get(0).getId(); + } + + List modifiedFiles = new ArrayList(); + if (merge) { + modifiedFiles.addAll(computeModifiedFilesForMergeCommit(settings, cur)); + } else { + st.setFromRevId(prevId); + st.setToRevId(cur.getId()); + modifiedFiles = st.execute(); + } + + // changeset full version will be set into VcsChange structure and + // stored in database (note that getContent method will be invoked with this version) + List files = toVcsChanges(modifiedFiles, prev.getFullVersion(), cur.getFullVersion(), includeRule); + if (files.isEmpty() && !merge) continue; + ModificationData md = new ModificationData(cur.getTimestamp(), files, cur.getDescription(), cur.getUser(), root, cur.getFullVersion(), cur.getId()); + if (merge) { + md.setCanBeIgnored(false); + } + result.add(md); + prev = cur; + } + + return result; + } + + public void dispose() throws VcsException { + } + }; + } + }; + } + + @NotNull + public BuildPatchPolicy getBuildPatchPolicy() { + return new BuildPatchByCheckoutRules() { + public void buildPatch(@NotNull final VcsRoot root, + @Nullable final String fromVersion, + @NotNull final String toVersion, + @NotNull final PatchBuilder builder, + @NotNull final CheckoutRules checkoutRules) throws IOException, VcsException { + syncClonedRepository(root); + Settings settings = createSettings(root); + if (fromVersion == null) { + buildFullPatch(settings, new ChangeSet(toVersion), builder, checkoutRules); + } else { + buildIncrementalPatch(settings, new ChangeSet(fromVersion), new ChangeSet(toVersion), builder, checkoutRules); + } + } + }; + } + private void lockWorkDir(@NotNull File workDir) { getWorkDirLock(workDir).lock(); } @@ -483,10 +502,10 @@ } @Override - public boolean ignoreServerCachesFor(@NotNull final VcsRoot root) { + public boolean allowSourceCaching() { // since a copy of repository for each VCS root is already stored on disk - // we do not need separate cache for our patches - return true; + // we do not need separate cache for our patches + return false; } private Lock getWorkDirLock(final File workDir) { diff -r 8cc11b0cbbd4 -r 8587a9c22d55 mercurial-tests/mercurial-tests.iml --- a/mercurial-tests/mercurial-tests.iml Wed Apr 14 19:18:53 2010 +0400 +++ b/mercurial-tests/mercurial-tests.iml Tue May 11 00:05:11 2010 +0400 @@ -17,6 +17,7 @@ + diff -r 8cc11b0cbbd4 -r 8587a9c22d55 mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/AgentSideCheckoutTest.java --- a/mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/AgentSideCheckoutTest.java Wed Apr 14 19:18:53 2010 +0400 +++ b/mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/AgentSideCheckoutTest.java Tue May 11 00:05:11 2010 +0400 @@ -17,6 +17,7 @@ import jetbrains.buildServer.agent.BuildProgressLogger; import jetbrains.buildServer.util.FileUtil; +import jetbrains.buildServer.vcs.CheckoutRules; import jetbrains.buildServer.vcs.IncludeRule; import jetbrains.buildServer.vcs.VcsException; import jetbrains.buildServer.vcs.VcsRoot; @@ -69,7 +70,7 @@ private File doUpdate(final VcsRoot vcsRoot, final String version, final IncludeRule includeRule) throws VcsException { File actualWorkDir = new File(myWorkDir, includeRule.getTo()); - myVcsSupport.updateSources((BuildProgressLogger) myProgressLoggerMock.proxy(), actualWorkDir, vcsRoot, version, includeRule); + myVcsSupport.getUpdater(vcsRoot, new CheckoutRules(""), version, myWorkDir, (BuildProgressLogger) myProgressLoggerMock.proxy()).process(includeRule, actualWorkDir); File hgDir = new File(actualWorkDir, ".hg"); assertTrue(hgDir.isDirectory()); diff -r 8cc11b0cbbd4 -r 8587a9c22d55 mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialVcsSupportTest.java --- a/mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialVcsSupportTest.java Wed Apr 14 19:18:53 2010 +0400 +++ b/mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialVcsSupportTest.java Tue May 11 00:05:11 2010 +0400 @@ -27,6 +27,7 @@ import jetbrains.buildServer.vcs.impl.VcsRootImpl; import jetbrains.buildServer.vcs.patches.PatchBuilderImpl; import junit.framework.Assert; +import org.jetbrains.annotations.NotNull; import org.jmock.Mock; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; @@ -79,10 +80,14 @@ assertEquals(myVcs.getCurrentVersion(createVcsRoot(simpleRepo(), "name with space")), "9:9babcf2d5705"); } + private List collectChanges(@NotNull VcsRoot vcsRoot, @NotNull String from, @NotNull String to, @NotNull IncludeRule rule) throws VcsException { + return ((CollectChangesByIncludeRules)myVcs.getCollectChangesPolicy()).getChangeCollector(vcsRoot, from, to).collectChanges(rule); + } + public void test_collect_changes() throws Exception { VcsRootImpl vcsRoot = createVcsRoot(simpleRepo()); - List changes = myVcs.collectBuildChanges(vcsRoot, "0:9875b412a788", "3:9522278aa38d", new CheckoutRules("")); + List changes = collectChanges(vcsRoot, "0:9875b412a788", "3:9522278aa38d", new CheckoutRules("").getIncludeRuleFor("")); assertEquals(3, changes.size()); ModificationData md1 = changes.get(0); @@ -110,29 +115,36 @@ assertEquals(normalizePath(files3.get(0).getRelativeFileName()), "dir1/file4.txt"); } - public void test_collect_changes_with_checkout_rules() throws Exception { + public void test_collect_changes_with_not_empty_include_rule() throws Exception { VcsRootImpl vcsRoot = createVcsRoot(simpleRepo()); - List changes = myVcs.collectBuildChanges(vcsRoot, "0:9875b412a788", "3:9522278aa38d", new CheckoutRules("-:.\n+:dir1/subdir")); - assertEquals(changes.size(), 0); + List changes = collectChanges(vcsRoot, "0:9875b412a788", "5:1d2cc6f3bc29", new IncludeRule("dir1/subdir", "dir1/subdir", null)); + assertEquals(changes.size(), 1, changes.toString()); - changes = myVcs.collectBuildChanges(vcsRoot, "0:9875b412a788", "5:1d2cc6f3bc29", new CheckoutRules("-:.\n+:dir1/subdir")); - assertEquals(changes.size(), 1); ModificationData md = changes.get(0); assertEquals(md.getDescription(), "modified in subdir"); + + List files = changes.get(0).getChanges(); + assertEquals(files.size(), 1, files.toString()); + assertEquals("dir1/subdir/file2.txt", files.get(0).getFileName()); + assertEquals("file2.txt", files.get(0).getRelativeFileName()); } + private ByteArrayOutputStream buildPatch(VcsRoot vcsRoot, String from, String to, CheckoutRules rules) throws IOException, VcsException { + final ByteArrayOutputStream output = new ByteArrayOutputStream(); + final PatchBuilderImpl builder = new PatchBuilderImpl(output); + + ((BuildPatchByCheckoutRules)myVcs.getBuildPatchPolicy()).buildPatch(vcsRoot, from, to, builder, rules); + builder.close(); + return output; + } + @Test public void test_build_patch() throws IOException, VcsException { setName("cleanPatch1"); VcsRootImpl vcsRoot = createVcsRoot(simpleRepo()); - final ByteArrayOutputStream output = new ByteArrayOutputStream(); - final PatchBuilderImpl builder = new PatchBuilderImpl(output); - - myVcs.buildPatch(vcsRoot, null, "4:b06a290a363b", builder, new CheckoutRules("")); - builder.close(); - + ByteArrayOutputStream output = buildPatch(vcsRoot, null, "4:b06a290a363b", new CheckoutRules("")); checkPatchResult(output.toByteArray()); File clonedReposParentDir = new File(myServerPaths.getCachesDir(), "mercurial"); @@ -148,11 +160,7 @@ setName("patch1"); VcsRootImpl vcsRoot = createVcsRoot(simpleRepo()); - final ByteArrayOutputStream output = new ByteArrayOutputStream(); - final PatchBuilderImpl builder = new PatchBuilderImpl(output); - - myVcs.buildPatch(vcsRoot, "3:9522278aa38d", "4:b06a290a363b", builder, new CheckoutRules("")); - builder.close(); + ByteArrayOutputStream output = buildPatch(vcsRoot, "3:9522278aa38d", "4:b06a290a363b", new CheckoutRules("")); checkPatchResult(output.toByteArray()); } @@ -161,11 +169,7 @@ setName("patch1_checkout_rules"); VcsRootImpl vcsRoot = createVcsRoot(simpleRepo()); - final ByteArrayOutputStream output = new ByteArrayOutputStream(); - final PatchBuilderImpl builder = new PatchBuilderImpl(output); - - myVcs.buildPatch(vcsRoot, "3:9522278aa38d", "4:b06a290a363b", builder, new CheckoutRules("+:dir1=>path")); - builder.close(); + ByteArrayOutputStream output = buildPatch(vcsRoot, "3:9522278aa38d", "4:b06a290a363b", new CheckoutRules("+:dir1=>path")); checkPatchResult(output.toByteArray()); } @@ -174,11 +178,7 @@ setName("cleanPatch1_checkout_rules"); VcsRootImpl vcsRoot = createVcsRoot(simpleRepo()); - final ByteArrayOutputStream output = new ByteArrayOutputStream(); - final PatchBuilderImpl builder = new PatchBuilderImpl(output); - - myVcs.buildPatch(vcsRoot, null, "4:b06a290a363b", builder, new CheckoutRules("+:dir1/subdir=>.")); - builder.close(); + ByteArrayOutputStream output = buildPatch(vcsRoot, null, "4:b06a290a363b", new CheckoutRules("+:dir1/subdir=>.")); checkPatchResult(output.toByteArray()); } @@ -187,11 +187,7 @@ setName("patch2"); VcsRootImpl vcsRoot = createVcsRoot(simpleRepo()); - final ByteArrayOutputStream output = new ByteArrayOutputStream(); - final PatchBuilderImpl builder = new PatchBuilderImpl(output); - - myVcs.buildPatch(vcsRoot, "3:9522278aa38d", "6:b9deb9a1c6f4", builder, new CheckoutRules("")); - builder.close(); + ByteArrayOutputStream output = buildPatch(vcsRoot, "3:9522278aa38d", "6:b9deb9a1c6f4", new CheckoutRules("")); checkPatchResult(output.toByteArray()); } @@ -215,11 +211,11 @@ public void test_test_connection() throws IOException, VcsException { VcsRootImpl vcsRoot = createVcsRoot(simpleRepo()); - System.out.println(myVcs.testConnection(vcsRoot)); + System.out.println(myVcs.getTestConnectionSupport().testConnection(vcsRoot)); vcsRoot.addProperty(Constants.REPOSITORY_PROP, "/some/non/existent/path"); try { - myVcs.testConnection(vcsRoot); + myVcs.getTestConnectionSupport().testConnection(vcsRoot); fail("Exception expected"); } catch (VcsException e) { } @@ -263,7 +259,7 @@ VcsRootImpl vcsRoot = createVcsRoot(simpleRepo(), "test_branch"); // fromVersion(6:b9deb9a1c6f4) is not in the branch (it is in the default branch) - List changes = myVcs.collectBuildChanges(vcsRoot, "6:b9deb9a1c6f4", "7:376dcf05cd2a", new CheckoutRules("")); + List changes = collectChanges(vcsRoot, "6:b9deb9a1c6f4", "7:376dcf05cd2a", IncludeRule.createDefaultInstance()); assertEquals(1, changes.size()); ModificationData md1 = changes.get(0); @@ -274,7 +270,7 @@ assertEquals(VcsChangeInfo.Type.ADDED, files1.get(0).getType()); assertEquals(normalizePath(files1.get(0).getRelativeFileName()), "file_in_branch.txt"); - changes = myVcs.collectBuildChanges(vcsRoot, "7:376dcf05cd2a", "8:04c3ae4c6312", new CheckoutRules("")); + changes = collectChanges(vcsRoot, "7:376dcf05cd2a", "8:04c3ae4c6312", IncludeRule.createDefaultInstance()); assertEquals(1, changes.size()); md1 = changes.get(0); @@ -285,7 +281,7 @@ public void test_collect_changes_after_merge() throws IOException, VcsException { VcsRootImpl vcsRoot = createVcsRoot(simpleRepo()); - List changes = myVcs.collectBuildChanges(vcsRoot, "6:b9deb9a1c6f4", "12:1870e1100fab", new CheckoutRules("")); + List changes = collectChanges(vcsRoot, "6:b9deb9a1c6f4", "12:1870e1100fab", IncludeRule.createDefaultInstance()); for (ModificationData md: changes) { System.out.println(md); } @@ -295,11 +291,7 @@ setName("patch3"); VcsRootImpl vcsRoot = createVcsRoot(simpleRepo(), "test_branch"); - final ByteArrayOutputStream output = new ByteArrayOutputStream(); - final PatchBuilderImpl builder = new PatchBuilderImpl(output); - - myVcs.buildPatch(vcsRoot, null, "7:376dcf05cd2a", builder, new CheckoutRules("")); - builder.close(); + ByteArrayOutputStream output = buildPatch(vcsRoot, null, "7:376dcf05cd2a", new CheckoutRules("")); checkPatchResult(output.toByteArray()); } @@ -308,11 +300,7 @@ setName("patch3_checkout_rules1"); VcsRootImpl vcsRoot = createVcsRoot(simpleRepo(), "test_branch"); - final ByteArrayOutputStream output = new ByteArrayOutputStream(); - final PatchBuilderImpl builder = new PatchBuilderImpl(output); - - myVcs.buildPatch(vcsRoot, null, "7:376dcf05cd2a", builder, new CheckoutRules("+:.=>path")); - builder.close(); + ByteArrayOutputStream output = buildPatch(vcsRoot, null, "7:376dcf05cd2a", new CheckoutRules("+:.=>path")); checkPatchResult(output.toByteArray()); } @@ -321,11 +309,7 @@ setName("patch3_checkout_rules2"); VcsRootImpl vcsRoot = createVcsRoot(simpleRepo(), "test_branch"); - final ByteArrayOutputStream output = new ByteArrayOutputStream(); - final PatchBuilderImpl builder = new PatchBuilderImpl(output); - - myVcs.buildPatch(vcsRoot, null, "7:376dcf05cd2a", builder, new CheckoutRules("+:dir1=>path/dir1\n+:dir with space")); - builder.close(); + ByteArrayOutputStream output = buildPatch(vcsRoot, null, "7:376dcf05cd2a", new CheckoutRules("+:dir1=>path/dir1\n+:dir with space")); checkPatchResult(output.toByteArray()); } @@ -334,11 +318,7 @@ setName("patch4"); VcsRootImpl vcsRoot = createVcsRoot(simpleRepo(), "test_branch"); - final ByteArrayOutputStream output = new ByteArrayOutputStream(); - final PatchBuilderImpl builder = new PatchBuilderImpl(output); - - myVcs.buildPatch(vcsRoot, "7:376dcf05cd2a", "8:04c3ae4c6312", builder, new CheckoutRules("")); - builder.close(); + ByteArrayOutputStream output = buildPatch(vcsRoot, "7:376dcf05cd2a", "8:04c3ae4c6312", new CheckoutRules("")); checkPatchResult(output.toByteArray()); } @@ -366,11 +346,7 @@ File cloneDir = myTempFiles.createTempDir(); vcsRoot.addProperty(Constants.SERVER_CLONE_PATH_PROP, cloneDir.getAbsolutePath()); - final ByteArrayOutputStream output = new ByteArrayOutputStream(); - final PatchBuilderImpl builder = new PatchBuilderImpl(output); - - myVcs.buildPatch(vcsRoot, null, "4:b06a290a363b", builder, new CheckoutRules("")); - builder.close(); + ByteArrayOutputStream output = buildPatch(vcsRoot, null, "4:b06a290a363b", new CheckoutRules("")); checkPatchResult(output.toByteArray()); @@ -384,7 +360,7 @@ public void test_collect_changes_merge() throws Exception { VcsRootImpl vcsRoot = createVcsRoot(mergeCommittsRepo()); - List changes = myVcs.collectBuildChanges(vcsRoot, "1:a3d15477d297", "4:6eeb8974fe67", new CheckoutRules("")); + List changes = collectChanges(vcsRoot, "1:a3d15477d297", "4:6eeb8974fe67", IncludeRule.createDefaultInstance()); assertEquals(changes.size(), 3); assertEquals("2:db8a04d262f3", changes.get(0).getVersion()); @@ -399,7 +375,7 @@ public void test_collect_changes_merge_conflict() throws Exception { VcsRootImpl vcsRoot = createVcsRoot(mergeCommittsRepo()); - List changes = myVcs.collectBuildChanges(vcsRoot, "6:6066b677d026", "8:b6e2d176fe8e", new CheckoutRules("")); + List changes = collectChanges(vcsRoot, "6:6066b677d026", "8:b6e2d176fe8e", IncludeRule.createDefaultInstance()); assertEquals(changes.size(), 2); assertFiles(Arrays.asList("A dir4/file41.txt"), changes.get(0)); @@ -409,7 +385,7 @@ public void test_collect_changes_merge_conflict_named_branch() throws Exception { VcsRootImpl vcsRoot = createVcsRoot(mergeCommittsRepo()); - List changes = myVcs.collectBuildChanges(vcsRoot, "8:b6e2d176fe8e", "12:1e620196c4b6", new CheckoutRules("")); + List changes = collectChanges(vcsRoot, "8:b6e2d176fe8e", "12:1e620196c4b6", IncludeRule.createDefaultInstance()); assertEquals(changes.size(), 2); assertFiles(Arrays.asList("A dir6/file6.txt"), changes.get(0)); diff -r 8cc11b0cbbd4 -r 8587a9c22d55 mercurial.properties --- a/mercurial.properties Wed Apr 14 19:18:53 2010 +0400 +++ b/mercurial.properties Tue May 11 00:05:11 2010 +0400 @@ -1,3 +1,5 @@ path.variable.ant_home=C\:/Tools/apache-ant-1.7.1 path.variable.maven_repository=C\:/Documents and Settings/pavel.sher/.m2/repository -path.variable.teamcitydistribution=C\:/TeamCity \ No newline at end of file +path.variable.teamcitydistribution=C\:/TeamCity51 +path.variable.user_home_grails=C\:/Documents and Settings/pavel.sher/.grails +path.variable.user_home_griffon=C\:/Documents and Settings/pavel.sher/.griffon \ No newline at end of file diff -r 8cc11b0cbbd4 -r 8587a9c22d55 mercurial.xml --- a/mercurial.xml Wed Apr 14 19:18:53 2010 +0400 +++ b/mercurial.xml Tue May 11 00:05:11 2010 +0400 @@ -28,6 +28,7 @@ + @@ -399,6 +400,7 @@ + @@ -427,7 +429,7 @@ - + @@ -436,17 +438,22 @@ - - - + + + + + - - + + + + + - + @@ -454,8 +461,6 @@ - - @@ -467,5 +472,7 @@ - + + + \ No newline at end of file