1 package jetbrains.buildServer.nuget.server.trigger;
\r
3 import com.intellij.openapi.diagnostic.Logger;
\r
4 import jetbrains.buildServer.buildTriggers.BuildTriggerDescriptor;
\r
5 import jetbrains.buildServer.buildTriggers.BuildTriggerException;
\r
6 import jetbrains.buildServer.nuget.server.exec.ListPackagesCommand;
\r
7 import jetbrains.buildServer.nuget.server.exec.SourcePackageInfo;
\r
8 import jetbrains.buildServer.nuget.server.toolRegistry.NuGetToolManager;
\r
9 import jetbrains.buildServer.serverSide.CustomDataStorage;
\r
10 import jetbrains.buildServer.util.StringUtil;
\r
11 import org.jetbrains.annotations.NotNull;
\r
13 import java.io.File;
\r
17 * Created by Eugene Petrenko (eugene.petrenko@gmail.com)
\r
18 * Date: 14.07.11 15:41
\r
20 public class NamedPackagesUpdateChecker implements TriggerUpdateChecker {
\r
21 private static final Logger LOG = Logger.getInstance(NamedPackagesUpdateChecker.class.getName());
\r
23 public static final String KEY = "hash";
\r
24 private final ListPackagesCommand myCommand;
\r
25 private final NuGetToolManager myManager;
\r
27 public NamedPackagesUpdateChecker(@NotNull final ListPackagesCommand command,
\r
28 @NotNull final NuGetToolManager manager) {
\r
29 myCommand = command;
\r
30 myManager = manager;
\r
33 public BuildStartReason checkChanges(@NotNull BuildTriggerDescriptor descriptor,
\r
34 @NotNull CustomDataStorage storage) throws BuildTriggerException {
\r
35 final String path = myManager.getNuGetPath(descriptor.getProperties().get(TriggerConstants.NUGET_EXE));
\r
36 final String pkgId = descriptor.getProperties().get(TriggerConstants.PACKAGE);
\r
37 final String version = descriptor.getProperties().get(TriggerConstants.VERSION);
\r
38 final String source = descriptor.getProperties().get(TriggerConstants.SOURCE);
\r
40 if (StringUtil.isEmptyOrSpaces(path)) {
\r
41 throw new BuildTriggerException("Path to NuGet.exe must be specified");
\r
44 if (StringUtil.isEmptyOrSpaces(pkgId)) {
\r
45 throw new BuildTriggerException("Package Id must be specified");
\r
48 File nugetPath = new File(path);
\r
49 if (!nugetPath.isFile()) {
\r
50 throw new BuildTriggerException("Failed to find NuGet.exe at: " + nugetPath);
\r
53 Collection<SourcePackageInfo> result;
\r
55 result = myCommand.checkForChanges(nugetPath, source, pkgId, version);
\r
56 } catch (Throwable t) {
\r
57 throw new BuildTriggerException("Failed to check for package versions. " + t.getMessage(), t);
\r
59 final String hash = serializeHashcode(result);
\r
60 final String oldHash = storage.getValue(KEY);
\r
62 LOG.debug("Recieved packages hash: " + hash);
\r
63 LOG.debug(" old hash was: " + oldHash);
\r
64 if (!hash.equals(oldHash)) {
\r
65 storage.putValue(KEY, hash);
\r
68 if (oldHash != null) {
\r
69 return new BuildStartReason("NuGet Package " + pkgId + " updated");
\r
76 private String serializeHashcode(@NotNull final Collection<SourcePackageInfo> _packages) {
\r
77 List<SourcePackageInfo> sorted = new ArrayList<SourcePackageInfo>(_packages);
\r
78 Collections.sort(sorted, new Comparator<SourcePackageInfo>() {
\r
79 public int compare(SourcePackageInfo o1, SourcePackageInfo o2) {
\r
81 String s1 = o1.getSource();
\r
82 String s2 = o2.getSource();
\r
83 if (s1 == null && s2 == null) return 0;
\r
84 if (s1 == null ^ s2 == null) return 1;
\r
85 if (0 != (i = s1.compareTo(s2))) return i;
\r
86 if (0 != (i = o1.getPackageId().compareTo(o2.getPackageId()))) return i;
\r
87 if (0 != (i = o1.getVersion().compareTo(o2.getVersion()))) return i;
\r
92 StringBuilder sb = new StringBuilder();
\r
93 for (SourcePackageInfo info : sorted) {
\r
94 String source = info.getSource();
\r
95 if (source != null) {
\r
96 sb.append("|s:").append(source);
\r
98 sb.append("|p:").append(info.getPackageId());
\r
99 sb.append("|v:").append(info.getVersion());
\r
101 return sb.toString();
\r