changeset 593:ad112e314be5

Report subrepo revision in each commit
author Dmitry Neverov <dmitry.neverov@jetbrains.com>
date Thu, 25 Apr 2013 20:54:42 +0400
parents e97a636cc9b7
children 9cbf9205208e
files mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialCollectChangesPolicy.java mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/ModificationDataMatcher.java mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/SubrepoChangesTest.java
diffstat 3 files changed, 90 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialCollectChangesPolicy.java	Wed Apr 24 15:54:12 2013 +0400
+++ b/mercurial-server/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/MercurialCollectChangesPolicy.java	Thu Apr 25 20:54:42 2013 +0400
@@ -362,6 +362,17 @@
           fillSubrepoConfigChanges(ctx, builder, root, c);
         }
         attributes.putAll(builder.buildAttributes());
+
+        SubrepoRevisionAttributesBuilder attrBuilder = new SubrepoRevisionAttributesBuilder();
+        for (HgSubrepoConfigChange c : repo.getSubrepoConfigChanges(cset)) {
+          if (!c.subrepoRemoved()) {
+            attrBuilder.addSubrepo(new SubrepoConfig(root)
+                    .setSubrepoPath(root.expandSubrepoPath(c.getPath()))
+                    .setSubrepoRootParamDiff(Constants.REPOSITORY_PROP, ctx.getStringFromPool(c.getCurrent().resolveUrl(root.getRepository())))
+                    .setSubrepoRevision(c.getCurrent().revision()));
+          }
+        }
+        attributes.putAll(attrBuilder.buildAttributes());
       } catch (Exception e) {
         Loggers.VCS.warn("Error while reporting subrepo config changes", e);
         if (e instanceof VcsExtension)
--- a/mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/ModificationDataMatcher.java	Wed Apr 24 15:54:12 2013 +0400
+++ b/mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/ModificationDataMatcher.java	Thu Apr 25 20:54:42 2013 +0400
@@ -8,12 +8,11 @@
 import java.util.HashMap;
 import java.util.Map;
 
-import static jetbrains.buildServer.util.Util.map;
-
 public class ModificationDataMatcher extends TypeSafeMatcher<ModificationData> {
 
   private String myVersion;
   private Map<String, String> myVcsRootProperties = new HashMap<String, String>();
+  private Map<String, String> myAttributes = new HashMap<String, String>();
 
   @Override
   public boolean matchesSafely(ModificationData m) {
@@ -21,6 +20,8 @@
       return false;
     if (!myVcsRootProperties.isEmpty() && !myVcsRootProperties.equals(m.getVcsRootObject().getProperties()))
       return false;
+    if (!myAttributes.isEmpty() && !containsAllAttributes(m.getAttributes()))
+      return false;
     return true;
   }
 
@@ -30,6 +31,8 @@
       description.appendText(" with version ").appendValue(myVersion);
     if (!myVcsRootProperties.isEmpty())
       description.appendText(" with vcs root properties ").appendValue(myVcsRootProperties);
+    if (!myAttributes.isEmpty())
+      description.appendText(" with attributes ").appendValue(myAttributes);
   }
 
   public static ModificationDataMatcher modificationData() {
@@ -41,8 +44,24 @@
     return this;
   }
 
-  public ModificationDataMatcher withVcsRootProperties(Map<String, String> properties) {
+  public ModificationDataMatcher withVcsRootProperties(@NotNull Map<String, String> properties) {
     myVcsRootProperties.putAll(properties);
     return this;
   }
+
+  public ModificationDataMatcher withAttributes(@NotNull Map<String, String> attributes) {
+    myAttributes.putAll(attributes);
+    return this;
+  }
+
+  private boolean containsAllAttributes(@NotNull Map<String, String> attributes) {
+    for (Map.Entry<String, String> e : myAttributes.entrySet()) {
+      String expectedValue = e.getValue();
+      String actualValue = attributes.get(e.getKey());
+      if (expectedValue == null && actualValue != null ||
+          expectedValue != null && !e.getValue().equals(actualValue))
+        return false;
+    }
+    return true;
+  }
 }
--- a/mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/SubrepoChangesTest.java	Wed Apr 24 15:54:12 2013 +0400
+++ b/mercurial-tests/src/jetbrains/buildServer/buildTriggers/vcs/mercurial/SubrepoChangesTest.java	Thu Apr 25 20:54:42 2013 +0400
@@ -165,4 +165,61 @@
     assertThat(changes, hasItem(modificationData().withVersion("514c3e09cddf").withVcsRootProperties(subrepoRootProperties)));
     assertThat(changes, hasItem(modificationData().withVersion("1f9eb39a3921").withVcsRootProperties(subrepoRootProperties)));
   }
+
+
+  public void report_subrepo_revision_in_each_main_root_commit(@NotNull HgVersion _) throws Exception {
+    ServerPluginConfig pluginConfig = new ServerPluginConfigBuilder()
+            .cachesDir(myTempFiles.createTempDir())
+            .detectSubrepoChanges(true)
+            .dontUseRevsets()
+            .build();
+    myVcs = mercurialSupport().withConfig(pluginConfig).build();
+    VcsRoot root = vcsRoot().withUrl(myRemoteRepo1.getAbsolutePath()).withSubrepoChanges(true).build();
+    List<ModificationData> changes = myVcs.getCollectChangesPolicy().collectChanges(root, "e4eced2b7381", "d64d9799c143", CheckoutRules.DEFAULT);
+
+    assertThat(changes.size(), is(11));
+
+    SubrepoRevisionAttributesBuilder builder = new SubrepoRevisionAttributesBuilder();
+    builder.addSubrepo(new SubrepoConfig(root)
+            .setSubrepoRootParamDiff(Constants.REPOSITORY_PROP, myRemoteRepo2.getCanonicalPath())
+            .setSubrepoPath("r2")
+            .setSubrepoRevision("916933c1dd8e"));
+    assertThat(changes, hasItem(modificationData().withVersion("34017377d9c3").withAttributes(builder.buildAttributes())));
+
+    builder = new SubrepoRevisionAttributesBuilder();
+    builder.addSubrepo(new SubrepoConfig(root)
+            .setSubrepoRootParamDiff(Constants.REPOSITORY_PROP, myRemoteRepo3.getCanonicalPath())
+            .setSubrepoPath("r2")
+            .setSubrepoRevision("9e4a2fef1a1c"));
+    assertThat(changes, hasItem(modificationData().withVersion("d350e7209906").withAttributes(builder.buildAttributes())));
+
+    builder = new SubrepoRevisionAttributesBuilder();
+    builder.addSubrepo(new SubrepoConfig(root)
+            .setSubrepoRootParamDiff(Constants.REPOSITORY_PROP, myRemoteRepo3.getCanonicalPath())
+            .setSubrepoPath("r2")
+            .setSubrepoRevision("ebb884b1b691"));
+    assertThat(changes, hasItem(modificationData().withVersion("09c256b6163e").withAttributes(builder.buildAttributes())));
+
+    builder = new SubrepoRevisionAttributesBuilder();
+    builder.addSubrepo(new SubrepoConfig(root)
+            .setSubrepoRootParamDiff(Constants.REPOSITORY_PROP, myRemoteRepo3.getCanonicalPath())
+            .setSubrepoPath("r2")
+            .setSubrepoRevision("514c3e09cddf"));
+    assertThat(changes, hasItem(modificationData().withVersion("d64d9799c143").withAttributes(builder.buildAttributes())));
+
+
+    builder = new SubrepoRevisionAttributesBuilder();
+    builder.addSubrepo(new SubrepoConfig(root)
+            .setSubrepoRootParamDiff(Constants.REPOSITORY_PROP, myRemoteRepo2.getCanonicalPath())
+            .setSubrepoPath("r2/r2")
+            .setSubrepoRevision("916933c1dd8e"));
+    assertThat(changes, hasItem(modificationData().withVersion("1f9eb39a3921").withAttributes(builder.buildAttributes())));
+
+    builder = new SubrepoRevisionAttributesBuilder();
+    builder.addSubrepo(new SubrepoConfig(root)
+            .setSubrepoRootParamDiff(Constants.REPOSITORY_PROP, myRemoteRepo2.getCanonicalPath())
+            .setSubrepoPath("r2/r2")
+            .setSubrepoRevision("ac0003deae69"));
+    assertThat(changes, hasItem(modificationData().withVersion("514c3e09cddf").withAttributes(builder.buildAttributes())));
+  }
 }