[01/19] ambari git commit: AMBARI-21693. Can't register multiple PATCH versions (ncole)

2017-08-15 Thread ababiichuk
Repository: ambari
Updated Branches:
  refs/heads/branch-feature-logsearch-ui f50c17b98 -> 01bcae93a


AMBARI-21693. Can't register multiple PATCH versions (ncole)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/7a3ffea9
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/7a3ffea9
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/7a3ffea9

Branch: refs/heads/branch-feature-logsearch-ui
Commit: 7a3ffea9e4236c2ad58b05ff7af8a31691c96ce6
Parents: 1433ecf
Author: Nate Cole 
Authored: Thu Aug 10 07:42:00 2017 -0400
Committer: Nate Cole 
Committed: Thu Aug 10 07:42:00 2017 -0400

--
 .../VersionDefinitionResourceProvider.java  |  51 --
 .../server/orm/dao/RepositoryVersionDAO.java|  15 +-
 .../orm/entities/RepositoryVersionEntity.java   |  25 ++-
 .../VersionDefinitionResourceProviderTest.java  | 170 ++-
 4 files changed, 238 insertions(+), 23 deletions(-)
--


http://git-wip-us.apache.org/repos/asf/ambari/blob/7a3ffea9/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/VersionDefinitionResourceProvider.java
--
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/VersionDefinitionResourceProvider.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/VersionDefinitionResourceProvider.java
index 5d65f35..4696c70 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/VersionDefinitionResourceProvider.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/VersionDefinitionResourceProvider.java
@@ -21,6 +21,7 @@ import java.io.InputStream;
 import java.io.UnsupportedEncodingException;
 import java.net.URI;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.EnumSet;
 import java.util.HashSet;
@@ -71,6 +72,8 @@ import org.codehaus.jackson.node.ArrayNode;
 import org.codehaus.jackson.node.JsonNodeFactory;
 import org.codehaus.jackson.node.ObjectNode;
 
+import com.google.common.base.Function;
+import com.google.common.collect.Collections2;
 import com.google.common.collect.ListMultimap;
 import com.google.common.collect.Sets;
 import com.google.inject.Inject;
@@ -442,39 +445,67 @@ public class VersionDefinitionResourceProvider extends 
AbstractAuthorizedResourc
 
 boolean emptyCompatible = 
StringUtils.isBlank(holder.xml.release.compatibleWith);
 
-for (RepositoryVersionEntity candidate : entities) {
-  String baseVersion = candidate.getVersion();
+for (RepositoryVersionEntity version : entities) {
+  String baseVersion = version.getVersion();
   if (baseVersion.lastIndexOf('-') > -1) {
 baseVersion = baseVersion.substring(0,  baseVersion.lastIndexOf('-'));
   }
 
   if (emptyCompatible) {
 if (baseVersion.equals(holder.xml.release.version)) {
-  matching.add(candidate);
+  matching.add(version);
 }
   } else {
 if (baseVersion.matches(holder.xml.release.compatibleWith)) {
-  matching.add(candidate);
+  matching.add(version);
 }
   }
 }
 
+RepositoryVersionEntity parent = null;
+
 if (matching.isEmpty()) {
   String format = "No versions matched pattern %s";
 
   throw new IllegalArgumentException(String.format(format,
   emptyCompatible ? holder.xml.release.version : 
holder.xml.release.compatibleWith));
 } else if (matching.size() > 1) {
-  Set versions= new HashSet<>();
-  for (RepositoryVersionEntity match : matching) {
-versions.add(match.getVersion());
-  }
 
-  throw new IllegalArgumentException(String.format("More than one 
repository matches patch %s: %s",
+  Function function = new 
Function() {
+@Override
+public String apply(RepositoryVersionEntity input) {
+  return input.getVersion();
+}
+  };
+
+  Collection versions = Collections2.transform(matching, function);
+
+  List used = 
s_repoVersionDAO.findByServiceDesiredVersion(matching);
+
+  if (used.isEmpty()) {
+throw new IllegalArgumentException(String.format("Could not determine 
which version " +
+  "to associate patch %s. Remove one of %s and try again.",
   entity.getVersion(), StringUtils.join(versions, ", ")));
+  } else if (used.size() > 1) {
+Collection usedVersions = Collections2.transform(used, 
function);
+
+throw new IllegalArgumentException(String.format("Patch %s was found 
to match more " +
+"than one repository in use: %s. Move all services to a common 
version and try again.",
+entity.getVersion(), StringUtils.join(usedVersions, ", ")));
+ 

[13/32] ambari git commit: AMBARI-21693. Can't register multiple PATCH versions (ncole)

2017-08-14 Thread lpuskas
AMBARI-21693. Can't register multiple PATCH versions (ncole)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/7a3ffea9
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/7a3ffea9
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/7a3ffea9

Branch: refs/heads/feature-branch-AMBARI-21307
Commit: 7a3ffea9e4236c2ad58b05ff7af8a31691c96ce6
Parents: 1433ecf
Author: Nate Cole 
Authored: Thu Aug 10 07:42:00 2017 -0400
Committer: Nate Cole 
Committed: Thu Aug 10 07:42:00 2017 -0400

--
 .../VersionDefinitionResourceProvider.java  |  51 --
 .../server/orm/dao/RepositoryVersionDAO.java|  15 +-
 .../orm/entities/RepositoryVersionEntity.java   |  25 ++-
 .../VersionDefinitionResourceProviderTest.java  | 170 ++-
 4 files changed, 238 insertions(+), 23 deletions(-)
--


http://git-wip-us.apache.org/repos/asf/ambari/blob/7a3ffea9/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/VersionDefinitionResourceProvider.java
--
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/VersionDefinitionResourceProvider.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/VersionDefinitionResourceProvider.java
index 5d65f35..4696c70 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/VersionDefinitionResourceProvider.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/VersionDefinitionResourceProvider.java
@@ -21,6 +21,7 @@ import java.io.InputStream;
 import java.io.UnsupportedEncodingException;
 import java.net.URI;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.EnumSet;
 import java.util.HashSet;
@@ -71,6 +72,8 @@ import org.codehaus.jackson.node.ArrayNode;
 import org.codehaus.jackson.node.JsonNodeFactory;
 import org.codehaus.jackson.node.ObjectNode;
 
+import com.google.common.base.Function;
+import com.google.common.collect.Collections2;
 import com.google.common.collect.ListMultimap;
 import com.google.common.collect.Sets;
 import com.google.inject.Inject;
@@ -442,39 +445,67 @@ public class VersionDefinitionResourceProvider extends 
AbstractAuthorizedResourc
 
 boolean emptyCompatible = 
StringUtils.isBlank(holder.xml.release.compatibleWith);
 
-for (RepositoryVersionEntity candidate : entities) {
-  String baseVersion = candidate.getVersion();
+for (RepositoryVersionEntity version : entities) {
+  String baseVersion = version.getVersion();
   if (baseVersion.lastIndexOf('-') > -1) {
 baseVersion = baseVersion.substring(0,  baseVersion.lastIndexOf('-'));
   }
 
   if (emptyCompatible) {
 if (baseVersion.equals(holder.xml.release.version)) {
-  matching.add(candidate);
+  matching.add(version);
 }
   } else {
 if (baseVersion.matches(holder.xml.release.compatibleWith)) {
-  matching.add(candidate);
+  matching.add(version);
 }
   }
 }
 
+RepositoryVersionEntity parent = null;
+
 if (matching.isEmpty()) {
   String format = "No versions matched pattern %s";
 
   throw new IllegalArgumentException(String.format(format,
   emptyCompatible ? holder.xml.release.version : 
holder.xml.release.compatibleWith));
 } else if (matching.size() > 1) {
-  Set versions= new HashSet<>();
-  for (RepositoryVersionEntity match : matching) {
-versions.add(match.getVersion());
-  }
 
-  throw new IllegalArgumentException(String.format("More than one 
repository matches patch %s: %s",
+  Function function = new 
Function() {
+@Override
+public String apply(RepositoryVersionEntity input) {
+  return input.getVersion();
+}
+  };
+
+  Collection versions = Collections2.transform(matching, function);
+
+  List used = 
s_repoVersionDAO.findByServiceDesiredVersion(matching);
+
+  if (used.isEmpty()) {
+throw new IllegalArgumentException(String.format("Could not determine 
which version " +
+  "to associate patch %s. Remove one of %s and try again.",
   entity.getVersion(), StringUtils.join(versions, ", ")));
+  } else if (used.size() > 1) {
+Collection usedVersions = Collections2.transform(used, 
function);
+
+throw new IllegalArgumentException(String.format("Patch %s was found 
to match more " +
+"than one repository in use: %s. Move all services to a common 
version and try again.",
+entity.getVersion(), StringUtils.join(usedVersions, ", ")));
+  } else {
+parent = used.get(0);
+LOG.warn("Patch {} was found to match more than one r

[47/50] [abbrv] ambari git commit: AMBARI-21693. Can't register multiple PATCH versions (ncole)

2017-08-10 Thread jonathanhurley
AMBARI-21693. Can't register multiple PATCH versions (ncole)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/aaf2110d
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/aaf2110d
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/aaf2110d

Branch: refs/heads/branch-2.6
Commit: aaf2110d246632ae734ab54c0ecad9bdfd7b
Parents: 7c5a7be
Author: Nate Cole 
Authored: Wed Aug 9 16:02:20 2017 -0400
Committer: Nate Cole 
Committed: Thu Aug 10 09:00:44 2017 -0400

--
 .../VersionDefinitionResourceProvider.java  |  51 +-
 .../server/orm/dao/RepositoryVersionDAO.java|  15 ++
 .../orm/entities/RepositoryVersionEntity.java   |   5 +-
 .../VersionDefinitionResourceProviderTest.java  | 182 +--
 4 files changed, 231 insertions(+), 22 deletions(-)
--


http://git-wip-us.apache.org/repos/asf/ambari/blob/aaf2110d/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/VersionDefinitionResourceProvider.java
--
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/VersionDefinitionResourceProvider.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/VersionDefinitionResourceProvider.java
index 77c09d4..ea592e5 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/VersionDefinitionResourceProvider.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/VersionDefinitionResourceProvider.java
@@ -21,6 +21,7 @@ import java.io.InputStream;
 import java.io.UnsupportedEncodingException;
 import java.net.URI;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.EnumSet;
 import java.util.HashSet;
@@ -71,6 +72,8 @@ import org.codehaus.jackson.node.ArrayNode;
 import org.codehaus.jackson.node.JsonNodeFactory;
 import org.codehaus.jackson.node.ObjectNode;
 
+import com.google.common.base.Function;
+import com.google.common.collect.Collections2;
 import com.google.common.collect.ListMultimap;
 import com.google.common.collect.Sets;
 import com.google.inject.Inject;
@@ -440,39 +443,67 @@ public class VersionDefinitionResourceProvider extends 
AbstractAuthorizedResourc
 
 boolean emptyCompatible = 
StringUtils.isBlank(holder.xml.release.compatibleWith);
 
-for (RepositoryVersionEntity candidate : entities) {
-  String baseVersion = candidate.getVersion();
+for (RepositoryVersionEntity version : entities) {
+  String baseVersion = version.getVersion();
   if (baseVersion.lastIndexOf('-') > -1) {
 baseVersion = baseVersion.substring(0,  baseVersion.lastIndexOf('-'));
   }
 
   if (emptyCompatible) {
 if (baseVersion.equals(holder.xml.release.version)) {
-  matching.add(candidate);
+  matching.add(version);
 }
   } else {
 if (baseVersion.matches(holder.xml.release.compatibleWith)) {
-  matching.add(candidate);
+  matching.add(version);
 }
   }
 }
 
+RepositoryVersionEntity parent = null;
+
 if (matching.isEmpty()) {
   String format = "No versions matched pattern %s";
 
   throw new IllegalArgumentException(String.format(format,
   emptyCompatible ? holder.xml.release.version : 
holder.xml.release.compatibleWith));
 } else if (matching.size() > 1) {
-  Set versions= new HashSet<>();
-  for (RepositoryVersionEntity match : matching) {
-versions.add(match.getVersion());
-  }
 
-  throw new IllegalArgumentException(String.format("More than one 
repository matches patch %s: %s",
+  Function function = new 
Function() {
+@Override
+public String apply(RepositoryVersionEntity input) {
+  return input.getVersion();
+}
+  };
+
+  Collection versions = Collections2.transform(matching, function);
+
+  List used = 
s_repoVersionDAO.findByServiceDesiredVersion(matching);
+
+  if (used.isEmpty()) {
+throw new IllegalArgumentException(String.format("Could not determine 
which version " +
+  "to associate patch %s. Remove one of %s and try again.",
   entity.getVersion(), StringUtils.join(versions, ", ")));
+  } else if (used.size() > 1) {
+Collection usedVersions = Collections2.transform(used, 
function);
+
+throw new IllegalArgumentException(String.format("Patch %s was found 
to match more " +
+"than one repository in use: %s. Move all services to a common 
version and try again.",
+entity.getVersion(), StringUtils.join(usedVersions, ", ")));
+  } else {
+parent = used.get(0);
+LOG.warn("Patch {} was found to match more than one repository in {}. 
"

ambari git commit: AMBARI-21693. Can't register multiple PATCH versions (ncole)

2017-08-10 Thread ncole
Repository: ambari
Updated Branches:
  refs/heads/branch-feature-AMBARI-21450 7c5a7bec9 -> aaf2110d2


AMBARI-21693. Can't register multiple PATCH versions (ncole)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/aaf2110d
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/aaf2110d
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/aaf2110d

Branch: refs/heads/branch-feature-AMBARI-21450
Commit: aaf2110d246632ae734ab54c0ecad9bdfd7b
Parents: 7c5a7be
Author: Nate Cole 
Authored: Wed Aug 9 16:02:20 2017 -0400
Committer: Nate Cole 
Committed: Thu Aug 10 09:00:44 2017 -0400

--
 .../VersionDefinitionResourceProvider.java  |  51 +-
 .../server/orm/dao/RepositoryVersionDAO.java|  15 ++
 .../orm/entities/RepositoryVersionEntity.java   |   5 +-
 .../VersionDefinitionResourceProviderTest.java  | 182 +--
 4 files changed, 231 insertions(+), 22 deletions(-)
--


http://git-wip-us.apache.org/repos/asf/ambari/blob/aaf2110d/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/VersionDefinitionResourceProvider.java
--
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/VersionDefinitionResourceProvider.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/VersionDefinitionResourceProvider.java
index 77c09d4..ea592e5 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/VersionDefinitionResourceProvider.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/VersionDefinitionResourceProvider.java
@@ -21,6 +21,7 @@ import java.io.InputStream;
 import java.io.UnsupportedEncodingException;
 import java.net.URI;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.EnumSet;
 import java.util.HashSet;
@@ -71,6 +72,8 @@ import org.codehaus.jackson.node.ArrayNode;
 import org.codehaus.jackson.node.JsonNodeFactory;
 import org.codehaus.jackson.node.ObjectNode;
 
+import com.google.common.base.Function;
+import com.google.common.collect.Collections2;
 import com.google.common.collect.ListMultimap;
 import com.google.common.collect.Sets;
 import com.google.inject.Inject;
@@ -440,39 +443,67 @@ public class VersionDefinitionResourceProvider extends 
AbstractAuthorizedResourc
 
 boolean emptyCompatible = 
StringUtils.isBlank(holder.xml.release.compatibleWith);
 
-for (RepositoryVersionEntity candidate : entities) {
-  String baseVersion = candidate.getVersion();
+for (RepositoryVersionEntity version : entities) {
+  String baseVersion = version.getVersion();
   if (baseVersion.lastIndexOf('-') > -1) {
 baseVersion = baseVersion.substring(0,  baseVersion.lastIndexOf('-'));
   }
 
   if (emptyCompatible) {
 if (baseVersion.equals(holder.xml.release.version)) {
-  matching.add(candidate);
+  matching.add(version);
 }
   } else {
 if (baseVersion.matches(holder.xml.release.compatibleWith)) {
-  matching.add(candidate);
+  matching.add(version);
 }
   }
 }
 
+RepositoryVersionEntity parent = null;
+
 if (matching.isEmpty()) {
   String format = "No versions matched pattern %s";
 
   throw new IllegalArgumentException(String.format(format,
   emptyCompatible ? holder.xml.release.version : 
holder.xml.release.compatibleWith));
 } else if (matching.size() > 1) {
-  Set versions= new HashSet<>();
-  for (RepositoryVersionEntity match : matching) {
-versions.add(match.getVersion());
-  }
 
-  throw new IllegalArgumentException(String.format("More than one 
repository matches patch %s: %s",
+  Function function = new 
Function() {
+@Override
+public String apply(RepositoryVersionEntity input) {
+  return input.getVersion();
+}
+  };
+
+  Collection versions = Collections2.transform(matching, function);
+
+  List used = 
s_repoVersionDAO.findByServiceDesiredVersion(matching);
+
+  if (used.isEmpty()) {
+throw new IllegalArgumentException(String.format("Could not determine 
which version " +
+  "to associate patch %s. Remove one of %s and try again.",
   entity.getVersion(), StringUtils.join(versions, ", ")));
+  } else if (used.size() > 1) {
+Collection usedVersions = Collections2.transform(used, 
function);
+
+throw new IllegalArgumentException(String.format("Patch %s was found 
to match more " +
+"than one repository in use: %s. Move all services to a common 
version and try again.",
+entity.getVersion(), StringUtils.join(usedVersions, ", ")));
+  }

ambari git commit: AMBARI-21693. Can't register multiple PATCH versions (ncole)

2017-08-10 Thread ncole
Repository: ambari
Updated Branches:
  refs/heads/trunk 1433ecff1 -> 7a3ffea9e


AMBARI-21693. Can't register multiple PATCH versions (ncole)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/7a3ffea9
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/7a3ffea9
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/7a3ffea9

Branch: refs/heads/trunk
Commit: 7a3ffea9e4236c2ad58b05ff7af8a31691c96ce6
Parents: 1433ecf
Author: Nate Cole 
Authored: Thu Aug 10 07:42:00 2017 -0400
Committer: Nate Cole 
Committed: Thu Aug 10 07:42:00 2017 -0400

--
 .../VersionDefinitionResourceProvider.java  |  51 --
 .../server/orm/dao/RepositoryVersionDAO.java|  15 +-
 .../orm/entities/RepositoryVersionEntity.java   |  25 ++-
 .../VersionDefinitionResourceProviderTest.java  | 170 ++-
 4 files changed, 238 insertions(+), 23 deletions(-)
--


http://git-wip-us.apache.org/repos/asf/ambari/blob/7a3ffea9/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/VersionDefinitionResourceProvider.java
--
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/VersionDefinitionResourceProvider.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/VersionDefinitionResourceProvider.java
index 5d65f35..4696c70 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/VersionDefinitionResourceProvider.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/VersionDefinitionResourceProvider.java
@@ -21,6 +21,7 @@ import java.io.InputStream;
 import java.io.UnsupportedEncodingException;
 import java.net.URI;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.EnumSet;
 import java.util.HashSet;
@@ -71,6 +72,8 @@ import org.codehaus.jackson.node.ArrayNode;
 import org.codehaus.jackson.node.JsonNodeFactory;
 import org.codehaus.jackson.node.ObjectNode;
 
+import com.google.common.base.Function;
+import com.google.common.collect.Collections2;
 import com.google.common.collect.ListMultimap;
 import com.google.common.collect.Sets;
 import com.google.inject.Inject;
@@ -442,39 +445,67 @@ public class VersionDefinitionResourceProvider extends 
AbstractAuthorizedResourc
 
 boolean emptyCompatible = 
StringUtils.isBlank(holder.xml.release.compatibleWith);
 
-for (RepositoryVersionEntity candidate : entities) {
-  String baseVersion = candidate.getVersion();
+for (RepositoryVersionEntity version : entities) {
+  String baseVersion = version.getVersion();
   if (baseVersion.lastIndexOf('-') > -1) {
 baseVersion = baseVersion.substring(0,  baseVersion.lastIndexOf('-'));
   }
 
   if (emptyCompatible) {
 if (baseVersion.equals(holder.xml.release.version)) {
-  matching.add(candidate);
+  matching.add(version);
 }
   } else {
 if (baseVersion.matches(holder.xml.release.compatibleWith)) {
-  matching.add(candidate);
+  matching.add(version);
 }
   }
 }
 
+RepositoryVersionEntity parent = null;
+
 if (matching.isEmpty()) {
   String format = "No versions matched pattern %s";
 
   throw new IllegalArgumentException(String.format(format,
   emptyCompatible ? holder.xml.release.version : 
holder.xml.release.compatibleWith));
 } else if (matching.size() > 1) {
-  Set versions= new HashSet<>();
-  for (RepositoryVersionEntity match : matching) {
-versions.add(match.getVersion());
-  }
 
-  throw new IllegalArgumentException(String.format("More than one 
repository matches patch %s: %s",
+  Function function = new 
Function() {
+@Override
+public String apply(RepositoryVersionEntity input) {
+  return input.getVersion();
+}
+  };
+
+  Collection versions = Collections2.transform(matching, function);
+
+  List used = 
s_repoVersionDAO.findByServiceDesiredVersion(matching);
+
+  if (used.isEmpty()) {
+throw new IllegalArgumentException(String.format("Could not determine 
which version " +
+  "to associate patch %s. Remove one of %s and try again.",
   entity.getVersion(), StringUtils.join(versions, ", ")));
+  } else if (used.size() > 1) {
+Collection usedVersions = Collections2.transform(used, 
function);
+
+throw new IllegalArgumentException(String.format("Patch %s was found 
to match more " +
+"than one repository in use: %s. Move all services to a common 
version and try again.",
+entity.getVersion(), StringUtils.join(usedVersions, ", ")));
+  } else {
+parent = used.get(0);
+