From 6d2e3ae5cbc57133ba2b46f19031957872ea74b0 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Thu, 21 Aug 2014 18:18:25 -0400 Subject: [PATCH 001/701] Initial sketch of replacement of Run.id by number. Does not yet deal with migrating historical records. --- .../main/java/hudson/model/AbstractBuild.java | 1 + core/src/main/java/hudson/model/Build.java | 1 + core/src/main/java/hudson/model/Run.java | 77 +--- core/src/main/java/hudson/model/RunMap.java | 44 -- .../jenkins/diagnostics/ooom/BuildPtr.java | 93 ----- .../ooom/OutOfOrderBuildDetector.java | 58 --- .../ooom/OutOfOrderBuildMonitor.java | 70 ---- .../jenkins/diagnostics/ooom/Problem.java | 302 -------------- .../model/lazy/AbstractLazyLoadRunMap.java | 376 ++++-------------- .../jenkins/model/lazy/LazyBuildMixIn.java | 15 - .../diagnostics/ooom/Messages.properties | 1 - .../OutOfOrderBuildMonitor/message.groovy | 70 ---- .../OutOfOrderBuildMonitor/message.properties | 5 - core/src/test/java/hudson/model/RunTest.java | 31 -- .../lazy/AbstractLazyLoadRunMapTest.java | 169 ++------ .../test/java/jenkins/model/lazy/FakeMap.java | 34 +- .../jenkins/model/lazy/FakeMapBuilder.java | 48 +-- .../ooom/OutOfOrderBuildDetectorTest.groovy | 144 ------- .../buildNumberClash.zip | Bin 4810 -> 0 bytes .../oneProblem.zip | Bin 15427 -> 0 bytes 20 files changed, 139 insertions(+), 1400 deletions(-) delete mode 100644 core/src/main/java/jenkins/diagnostics/ooom/BuildPtr.java delete mode 100644 core/src/main/java/jenkins/diagnostics/ooom/OutOfOrderBuildDetector.java delete mode 100644 core/src/main/java/jenkins/diagnostics/ooom/OutOfOrderBuildMonitor.java delete mode 100644 core/src/main/java/jenkins/diagnostics/ooom/Problem.java delete mode 100644 core/src/main/resources/jenkins/diagnostics/ooom/Messages.properties delete mode 100644 core/src/main/resources/jenkins/diagnostics/ooom/OutOfOrderBuildMonitor/message.groovy delete mode 100644 core/src/main/resources/jenkins/diagnostics/ooom/OutOfOrderBuildMonitor/message.properties delete mode 100644 test/src/test/groovy/jenkins/diagnostics/ooom/OutOfOrderBuildDetectorTest.groovy delete mode 100644 test/src/test/resources/jenkins/diagnostics/ooom/OutOfOrderBuildDetectorTest/buildNumberClash.zip delete mode 100644 test/src/test/resources/jenkins/diagnostics/ooom/OutOfOrderBuildDetectorTest/oneProblem.zip diff --git a/core/src/main/java/hudson/model/AbstractBuild.java b/core/src/main/java/hudson/model/AbstractBuild.java index d1e291d52e..520e721893 100644 --- a/core/src/main/java/hudson/model/AbstractBuild.java +++ b/core/src/main/java/hudson/model/AbstractBuild.java @@ -167,6 +167,7 @@ public abstract class AbstractBuild

,R extends Abs super(job); } + @Deprecated protected AbstractBuild(P job, Calendar timestamp) { super(job, timestamp); } diff --git a/core/src/main/java/hudson/model/Build.java b/core/src/main/java/hudson/model/Build.java index 99073f1b73..30057fd3e7 100644 --- a/core/src/main/java/hudson/model/Build.java +++ b/core/src/main/java/hudson/model/Build.java @@ -92,6 +92,7 @@ public abstract class Build

,B extends Build> super(project); } + @Deprecated protected Build(P job, Calendar timestamp) { super(job, timestamp); } diff --git a/core/src/main/java/hudson/model/Run.java b/core/src/main/java/hudson/model/Run.java index bbeba83a78..902e473f78 100644 --- a/core/src/main/java/hudson/model/Run.java +++ b/core/src/main/java/hudson/model/Run.java @@ -146,7 +146,7 @@ public abstract class Run ,RunT extends Run,RunT extends Run,RunT extends Run ID_FORMATTER = new IDFormatterProvider(); - private static final class IDFormatterProvider extends ThreadLocal { - @Override - protected SimpleDateFormat initialValue() { - synchronized (CANONICAL_ID_FORMATTER) { - return (SimpleDateFormat) CANONICAL_ID_FORMATTER.clone(); - } - } - }; + private static final SimpleDateFormat LEGACY_ID_FORMATTER = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss"); + // TODO implement migration step; and write out a legacy ID -> number map for use from AbstractLazyLoadRunMap /** * Creates a new {@link Run}. * @param job Owner job */ protected Run(@Nonnull JobT job) throws IOException { - this(job, new GregorianCalendar()); + project = job; + timestamp = System.currentTimeMillis(); + state = State.NOT_STARTED; this.number = project.assignBuildNumber(); + getRootDir().mkdirs(); LOGGER.log(FINER, "new {0} @{1}", new Object[] {this, hashCode()}); } - /** - * Constructor for creating a {@link Run} object in - * an arbitrary state. - */ + @Deprecated protected Run(@Nonnull JobT job, @Nonnull Calendar timestamp) { this(job,timestamp.getTimeInMillis()); } + @Deprecated protected Run(@Nonnull JobT job, long timestamp) { this.project = job; this.timestamp = timestamp; @@ -306,8 +301,9 @@ public abstract class Run ,RunT extends Run,RunT extends Run,RunT extends Run,RunT extends Run,RunT extends Run,RunT extends Run> extends AbstractLazyLoadRunMap return r.getNumber(); } - @Override - protected final String getIdOf(R r) { - return r.getId(); - } - @Override public R put(R r) { return super._put(r); @@ -185,31 +177,6 @@ public final class RunMap> extends AbstractLazyLoadRunMap return r.createReference(); } - @Override - protected FilenameFilter createDirectoryFilter() { - final SimpleDateFormat formatter = Run.ID_FORMATTER.get(); - - return new FilenameFilter() { - @Override public boolean accept(File dir, String name) { - if (name.startsWith("0000")) { - // JENKINS-1461 sometimes create bogus data directories with impossible dates, such as year 0, April 31st, - // or August 0th. Date object doesn't roundtrip those, so we eventually fail to load this data. - // Don't even bother trying. - return false; - } - try { - if (formatter.format(formatter.parse(name)).equals(name)) { - return true; - } - } catch (ParseException e) { - // fall through - } - LOGGER.log(FINE, "Skipping {0} in {1}", new Object[] {name, dir}); - return false; - } - }; - } - @Override protected R retrieve(File d) throws IOException { if(new File(d,"build.xml").exists()) { @@ -221,17 +188,6 @@ public final class RunMap> extends AbstractLazyLoadRunMap LOGGER.log(FINEST, "Loaded " + b.getFullDisplayName() + " in " + Thread.currentThread().getName(), new ThisIsHowItsLoaded()); } return b; - } catch (Run.InvalidDirectoryNameException x) { - Level lvl; - try { - Integer.parseInt(d.getName()); - // JENKINS-15587: just an mangled symlink - lvl = Level.FINE; - } catch (NumberFormatException x2) { - // potentially a real build dir, maybe a bug - lvl = Level.WARNING; - } - LOGGER.log(lvl, "skipping non-build directory {0}", d); } catch (IOException e) { LOGGER.log(Level.WARNING, "could not load " + d, e); } catch (InstantiationError e) { diff --git a/core/src/main/java/jenkins/diagnostics/ooom/BuildPtr.java b/core/src/main/java/jenkins/diagnostics/ooom/BuildPtr.java deleted file mode 100644 index 8d269ea634..0000000000 --- a/core/src/main/java/jenkins/diagnostics/ooom/BuildPtr.java +++ /dev/null @@ -1,93 +0,0 @@ -package jenkins.diagnostics.ooom; - -import hudson.FilePath; -import hudson.model.Job; -import hudson.model.TaskListener; - -import java.io.File; -import java.io.IOException; - -/** - * ID and build number of one build. - */ -public final class BuildPtr implements Comparable { - final Job job; - - final File buildDir; - /** - * Timestamp build ID. - */ - public final String id; - /** - * Build number found from the disk. - */ - public final int n; - - /** - * Position of this build according to the ordering induced by {@link #n} - */ - int posByN; - - /** - * Position of this build according to the ordering induced by {@link #id} - */ - int posByID; - - - BuildPtr(Job job, File buildDir, int n) { - this.job = job; - this.n = n; - this.id = buildDir.getName(); - this.buildDir = buildDir; - } - - @Override - public String toString() { - return buildDir.toString()+":#"+n; - } - - - /** - * If this build and that build are inconsistent, in that - * their numbers and timestamps are ordering in the wrong direction. - */ - public boolean isInconsistentWith(BuildPtr that) { - return signOfCompare(this.posByN,that.posByN) * signOfCompare(this.posByID,that.posByID) < 0; - } - - /** - * sign of (a-b). - */ - private static int signOfCompare(int a, int b) { - if (a>b) return 1; - if (a "+dst); - if (!buildDir.renameTo(dst)) { - FilePath bd = new FilePath(buildDir); - bd.copyRecursiveTo(new FilePath(dst)); - bd.deleteRecursive(); - } - - // if there's a symlink delete it - new File(buildDir.getParentFile(),String.valueOf(n)).delete(); - } - - @Override - public int compareTo(BuildPtr that) { - return this.id.compareTo(that.id); - } -} diff --git a/core/src/main/java/jenkins/diagnostics/ooom/OutOfOrderBuildDetector.java b/core/src/main/java/jenkins/diagnostics/ooom/OutOfOrderBuildDetector.java deleted file mode 100644 index a42736146f..0000000000 --- a/core/src/main/java/jenkins/diagnostics/ooom/OutOfOrderBuildDetector.java +++ /dev/null @@ -1,58 +0,0 @@ -package jenkins.diagnostics.ooom; - -import hudson.Extension; -import hudson.model.AsyncPeriodicWork; -import hudson.model.Job; -import hudson.model.TaskListener; -import hudson.util.TimeUnit2; -import jenkins.model.Jenkins; - -import javax.inject.Inject; -import java.io.IOException; - -/** - * Discovers {@link Problem}s periodically in the background and - * pass them on to {@link OutOfOrderBuildMonitor}. - * - * @author Kohsuke Kawaguchi - */ -@Extension -public class OutOfOrderBuildDetector extends AsyncPeriodicWork { - @Inject - private OutOfOrderBuildMonitor monitor; - - - public OutOfOrderBuildDetector() { - super("Out of order build detection"); - } - - @Override - protected void execute(TaskListener listener) throws IOException, InterruptedException { - execute(listener, 10*1000); - } - - /** - * Performs the check synchronously. - * - * @param delay - * delay in the number of milli-seconds to reduce the load on I/O. - */ - public void execute(TaskListener listener, int delay) throws InterruptedException { - for (Job j : Jenkins.getInstance().getAllItems(Job.class)) { - listener.getLogger().println("Scanning " + j.getFullName()); - - Problem p = Problem.find(j); - if (p!=null) { - monitor.addProblem(p); - listener.getLogger().println(" found problems: "+p); - } - - Thread.sleep(delay); - } - } - - @Override - public long getRecurrencePeriod() { - return TimeUnit2.DAYS.toMillis(1); - } -} diff --git a/core/src/main/java/jenkins/diagnostics/ooom/OutOfOrderBuildMonitor.java b/core/src/main/java/jenkins/diagnostics/ooom/OutOfOrderBuildMonitor.java deleted file mode 100644 index abf500f190..0000000000 --- a/core/src/main/java/jenkins/diagnostics/ooom/OutOfOrderBuildMonitor.java +++ /dev/null @@ -1,70 +0,0 @@ -package jenkins.diagnostics.ooom; - -import hudson.Extension; -import hudson.model.TaskListener; -import hudson.util.HttpResponses; -import jenkins.management.AsynchronousAdministrativeMonitor; -import org.kohsuke.stapler.HttpResponse; -import org.kohsuke.stapler.interceptor.RequirePOST; - -import java.io.File; -import java.util.Collections; -import java.util.LinkedHashSet; -import java.util.Set; - -/** - * Reports any {@link Problem}s found and report them in the "Manage Jenkins" page. - * - * @author Kohsuke Kawaguchi - */ -@Extension -public class OutOfOrderBuildMonitor extends AsynchronousAdministrativeMonitor { - private final Set problems = Collections.synchronizedSet(new LinkedHashSet()); - - @Override - public boolean isActivated() { - return !problems.isEmpty() || getLogFile().exists(); - } - - void addProblem(Problem p) { - problems.add(p); - } - - public Set getProblems() { - return Collections.unmodifiableSet(new LinkedHashSet(problems)); - } - - @RequirePOST - public HttpResponse doFix() { - start(false); - return HttpResponses.forwardToPreviousPage(); - } - - /** - * Discards the current log file so that the "stuff is completed" message will be gone. - */ - @RequirePOST - public HttpResponse doDismiss() { - getLogFile().delete(); - return HttpResponses.forwardToPreviousPage(); - } - - @Override - public String getDisplayName() { - return "Fix Out-of-order Builds"; - } - - @Override - public File getLogFile() { - return super.getLogFile(); - } - - @Override - protected void fix(TaskListener listener) throws Exception { - Set problems = getProblems(); - for (Problem problem : problems) { - problem.fix(listener); - } - this.problems.removeAll(problems); - } -} diff --git a/core/src/main/java/jenkins/diagnostics/ooom/Problem.java b/core/src/main/java/jenkins/diagnostics/ooom/Problem.java deleted file mode 100644 index 662328dff5..0000000000 --- a/core/src/main/java/jenkins/diagnostics/ooom/Problem.java +++ /dev/null @@ -1,302 +0,0 @@ -package jenkins.diagnostics.ooom; - -import hudson.AbortException; -import hudson.Util; -import hudson.model.AbstractProject; -import hudson.model.Job; -import hudson.model.Run; -import hudson.model.TaskListener; -import jenkins.model.lazy.AbstractLazyLoadRunMap; -import org.xml.sax.InputSource; - -import javax.xml.xpath.XPathConstants; -import javax.xml.xpath.XPathExpression; -import javax.xml.xpath.XPathExpressionException; -import javax.xml.xpath.XPathFactory; -import java.io.File; -import java.io.IOException; -import java.text.ParseException; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.SortedMap; -import java.util.TreeMap; -import java.util.TreeSet; -import java.util.logging.Logger; - -import static java.util.logging.Level.*; - -/** - * Look at build numbers in build.xml and compare them with build IDs (timestamps). - * - * When they are inconsistent (newer build timestamp-wise has an older build number), - * it'll confuse the binary search in {@link AbstractLazyLoadRunMap}, so detect them and report them. - * - * @author Kohsuke Kawaguchi - */ -public final class Problem { - public final Job job; - - /** - * A smallest set of builds whose removals would correct the order - * inconsistency problem. - */ - private final Set offenders = new TreeSet(); - - /** - * Scans the inconsistencies and return the information about it. - * - * @return null if no problems were found. - */ - public static Problem find(Job j) { - Problem p = new Problem(j); - if (p.countInconsistencies()==0) return null; - return p; - } - - private Problem(Job j) { - this.job = j; - new Inspector().inspect(); - } - - public Set getOffenders() { - return Collections.unmodifiableSet(offenders); - } - - /** - * Number of inconsistencies, which is the number of builds whose IDs - * have to be messed around on disk to collect problems. - */ - public int countInconsistencies() { - return offenders.size(); - } - - /** - * Equality is based on the job. - */ - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - Problem problem = (Problem) o; - - return job.equals(problem.job); - } - - @Override - public int hashCode() { - return job.hashCode(); - } - - @Override - public String toString() { - return job.getFullName() + " " + Util.join(offenders); - } - - public void fix(TaskListener listener) throws IOException, InterruptedException { - listener.getLogger().println("Fixing problems in " + job.getFullName()); - for (BuildPtr o : offenders) { - o.fix(listener); - } - - if (job instanceof AbstractProject) { - // let all the current references go and build a new one - AbstractProject a = (AbstractProject) job; - a._getRuns().purgeCache(); - } - } - - /** - * Finds the problems and builds up the data model of {@link Problem}. - */ - class Inspector { - /** - * All the builds sorted by their {@link BuildPtr#n} - */ - private List byN; - /** - * All the builds sorted by their {@link BuildPtr#id} - */ - private List byId; - - private final XPathExpression xpath; - - Inspector() { - try { - xpath = XPathFactory.newInstance().newXPath().compile("/*/number/text()"); - } catch (XPathExpressionException e) { - throw new AssertionError(e); - } - } - - /** - * Simply report inconsistencies in the ordering. - */ - protected void inspect() { - Map builds = scan(); - - byN = new ArrayList(builds.values()); - // this is already sorted by BuildPtr.n - int i=0; - for (BuildPtr b : byN) { - b.posByN = i++; - } - - byId = new ArrayList(byN); - Collections.sort(byId); - i=0; - for (BuildPtr b : byId) { - b.posByID = i++; - } - - while (true) { - BuildPtr b = pick(); - if (b==null) - break; - offenders.add(b); - } - } - - /** - * Find the most inconsistent build, a build whose removal - * would reduce the # of inconsistencies by the most. - * - * This process takes {@link #offenders} into account. - * - * @return null if there's no more build to remove. - */ - private BuildPtr pick() { - BuildPtr worst=null; - int worstScore=0; - - for (BuildPtr b : byN) { - if (offenders.contains(b)) - continue; - - int score = score(b); - if (score>worstScore) { - worst = b; - worstScore = score; - } - } - - return worst; - } - - /** - * Count the number of other builds the given build is inconsistent with, - * excluding inconsistencies with {@link #offenders} (since those inconsistencies - * are already effectively resolved by fixing offenders.) - */ - private int score(BuildPtr b) { - int i=0; - for (BuildPtr a : byN) { - if (offenders.contains(a)) - continue; - if (a.isInconsistentWith(b)) - i++; - } - return i; - } - - /** - * Looks at the builds directory of the given job and builds up the full map of build number to its ID. - */ - protected SortedMap scan() { - LOGGER.fine("Inspecting "+job); - - SortedMap builds = new TreeMap(); - - File[] files = job.getBuildDir().listFiles(); - if (files==null) return builds; - - for (File build : files) { - try { - LOGGER.finer("Inspecting " + build); - - if (isInt(build.getName())) { - // if this is a number, then it must be a build number - String s = loadBuildNumberFromBuildXml(build); - if (!s.equals(build.getName())) { - LOGGER.warning(build+" contains build number "+s); - // this index is invalid. - if (build.delete()) { - // index should be a symlink, and if so we can just delete it without losing data. - LOGGER.info("Removed problematic index "+build); - } else { - // the deltion will fail if 'build' isn't just a symlink but an actual directory. - // That is good, as we don't want to delete any real data. - LOGGER.warning("Couldn't delete " + build); - } - } - continue; - } - - - if (isID(build.getName())) { - String bn = loadBuildNumberFromBuildXml(build); - if (bn==null) { - LOGGER.log(WARNING, "Failed to parse "+build); - continue; - } - - int n; - try { - n = Integer.parseInt(bn); - } catch (NumberFormatException e) { - LOGGER.log(WARNING, "Expected number in " + build + " but found " + bn, e); - continue; - } - - BuildPtr b = new BuildPtr(job,build,n); - - BuildPtr o = builds.put(n, b); - if (o != null) { - LOGGER.log(WARNING, "Multiple builds have the same number: {0} vs. {1}", new Object[] {o, b}); - offenders.add(b.compareTo(o) > 0 ? o : b); - } - } - } catch (XPathExpressionException e) { - LOGGER.log(WARNING, "Failed to inspect "+build, e); - } catch (AbortException e) { - LOGGER.log(WARNING, "Failed to inspect "+build+": "+e.getMessage()); - } catch (IOException e) { - LOGGER.log(WARNING, "Failed to inspect "+build, e); - } - } - - return builds; - } - - private boolean isInt(String s) { - try { - Integer.parseInt(s); - return true; - } catch (NumberFormatException e) { - return false; - } - } - - private boolean isID(String s) { - try { - Run.ID_FORMATTER.get().parse(s); - return true; - } catch (ParseException e) { - return false; - } - } - - private String loadBuildNumberFromBuildXml(File dir) throws XPathExpressionException, IOException { - File buildXml = new File(dir, "build.xml"); - if (!buildXml.exists()) - throw new AbortException(buildXml+" doesn't exist"); - String systemId = buildXml.toURI().toURL().toExternalForm(); - return (String)xpath.evaluate(new InputSource(systemId), XPathConstants.STRING); - } - } - - private static final Logger LOGGER = Logger.getLogger(Problem.class.getName()); -} diff --git a/core/src/main/java/jenkins/model/lazy/AbstractLazyLoadRunMap.java b/core/src/main/java/jenkins/model/lazy/AbstractLazyLoadRunMap.java index 33ba98c598..b1c12800fc 100644 --- a/core/src/main/java/jenkins/model/lazy/AbstractLazyLoadRunMap.java +++ b/core/src/main/java/jenkins/model/lazy/AbstractLazyLoadRunMap.java @@ -27,7 +27,6 @@ import hudson.model.Job; import hudson.model.Run; import hudson.model.RunMap; import java.io.File; -import java.io.FilenameFilter; import java.io.IOException; import java.util.AbstractMap; import java.util.ArrayList; @@ -44,8 +43,6 @@ import java.util.logging.Logger; import javax.annotation.CheckForNull; import static jenkins.model.lazy.AbstractLazyLoadRunMap.Direction.*; -import static jenkins.model.lazy.Boundary.*; -import org.apache.commons.collections.keyvalue.DefaultMapEntry; import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.restrictions.NoExternalUse; @@ -60,26 +57,16 @@ import org.kohsuke.accmod.restrictions.NoExternalUse; * requested, this class {@link #retrieve(File) retrieves them} on demand, one by one. * *

- * The lookup is primarily done by using the build number as the key (hence the key type is {@link Integer}), - * but this class also provides look up based on {@linkplain #getIdOf(Object) the build ID}. + * The lookup is done by using the build number as the key (hence the key type is {@link Integer}). * *

* This class makes the following assumption about the on-disk layout of the data: * *

* *

- * On certain platforms, there are symbolic links named after build numbers that link to the build ID. - * If these are available, they are used as a hint to speed up the lookup. Otherwise - * we rely on the assumption above and perform a binary search to locate the build. - * (notice that we'll have to do linear search if we don't have the consistent ordering assumption, - * which robs the whole point of doing lazy loading.) - * - *

* Some of the {@link SortedMap} operations are weakly implemented. For example, * {@link #size()} may be inaccurate because we only count the number of directories that look like * build records, without checking if they are loadable. But these weaknesses aren't distinguishable @@ -93,7 +80,7 @@ import org.kohsuke.accmod.restrictions.NoExternalUse; *

* Object lock of {@code this} is used to make sure mutation occurs sequentially. * That is, ensure that only one thread is actually calling {@link #retrieve(File)} and - * updating {@link jenkins.model.lazy.AbstractLazyLoadRunMap.Index#byNumber} and {@link jenkins.model.lazy.AbstractLazyLoadRunMap.Index#byId}. + * updating {@link jenkins.model.lazy.AbstractLazyLoadRunMap.Index#byNumber}. * * @author Kohsuke Kawaguchi * @since 1.485 @@ -112,8 +99,10 @@ public abstract class AbstractLazyLoadRunMap extends AbstractMap i private LazyLoadRunMapEntrySet entrySet = new LazyLoadRunMapEntrySet(this); /** - * Pair of two maps into a single class, so that the changes can be made visible atomically, - * and updates can happen concurrently to read. + * Historical holder for map. + * + * TODO all this mess including {@link #numberOnDisk} could probably be simplified to a single {@code TreeMap>} + * where a null value means not yet loaded and a broken entry just uses {@code NoHolder}. * * The idiom is that you put yourself in a synchronized block, {@linkplain #copy() make a copy of this}, * update the copy, then set it to {@link #index}. @@ -121,63 +110,24 @@ public abstract class AbstractLazyLoadRunMap extends AbstractMap i private class Index { /** * Stores the mapping from build number to build, for builds that are already loaded. - */ - private final TreeMap> byNumber; - - /** - * Stores the build ID to build number for builds that we already know. * * If we have known load failure of the given ID, we record that in the map * by using the null value (not to be confused with a non-null {@link BuildReference} * with null referent, which just means the record was GCed.) */ - private final TreeMap> byId; + private final TreeMap> byNumber; private Index() { - byId = new TreeMap>(); byNumber = new TreeMap>(COMPARATOR); } private Index(Index rhs) { - byId = new TreeMap>(rhs.byId); byNumber = new TreeMap>(rhs.byNumber); } - - /** - * Returns the build record #M (<=n) - */ - private Map.Entry> ceilingEntry(int n) { -// switch to this once we depend on JDK6 -// return byNumber.ceilingEntry(n); - - Set>> s = byNumber.tailMap(n).entrySet(); - if (s.isEmpty()) return null; - else return s.iterator().next(); - } - - /** - * Returns the build record #M (>=n) - */ - // >= and not <= because byNumber is in the descending order - private Map.Entry> floorEntry(int n) { -// switch to this once we depend on JDK6 -// return byNumber.floorEntry(n); - - SortedMap> sub = byNumber.headMap(n); - if (sub.isEmpty()) return null; - Integer k = sub.lastKey(); - return new DefaultMapEntry(k,sub.get(k)); - } } /** - * Build IDs found as directories, in the ascending order. - */ - // copy on write - private volatile SortedList idOnDisk = new SortedList(Collections.emptyList()); - - /** - * Build number shortcuts found on disk, in the ascending order. + * Build numbers found on disk, in the ascending order. */ // copy on write private volatile SortedIntList numberOnDisk = new SortedIntList(0); @@ -199,7 +149,7 @@ public abstract class AbstractLazyLoadRunMap extends AbstractMap i assert this.dir==null; this.dir = dir; if (dir!=null) - loadIdOnDisk(); + loadNumberOnDisk(); } /** @@ -230,31 +180,23 @@ public abstract class AbstractLazyLoadRunMap extends AbstractMap i public synchronized void purgeCache() { index = new Index(); fullyLoaded = false; - loadIdOnDisk(); + loadNumberOnDisk(); } - private void loadIdOnDisk() { + private void loadNumberOnDisk() { String[] kids = dir.list(); if (kids == null) { // the job may have just been created kids = EMPTY_STRING_ARRAY; } - List buildDirs = new ArrayList(); - FilenameFilter buildDirFilter = createDirectoryFilter(); SortedIntList list = new SortedIntList(kids.length / 2); for (String s : kids) { - if (buildDirFilter.accept(dir, s)) { - buildDirs.add(s); - } else { - try { - list.add(Integer.parseInt(s)); - } catch (NumberFormatException e) { - // this isn't a shortcut - } + try { + list.add(Integer.parseInt(s)); + } catch (NumberFormatException e) { + // this isn't a build dir } } - Collections.sort(buildDirs); - idOnDisk = new SortedList(buildDirs); list.sort(); numberOnDisk = list; } @@ -263,13 +205,9 @@ public abstract class AbstractLazyLoadRunMap extends AbstractMap i return COMPARATOR; } - /** - * If we have non-zero R in memory, we can return false right away. - * If we have zero R in memory, try loading one and see if we can find something. - */ @Override public boolean isEmpty() { - return index.byId.isEmpty() && search(Integer.MAX_VALUE, DESC)==null; + return search(Integer.MAX_VALUE, DESC)==null; } @Override @@ -349,7 +287,7 @@ public abstract class AbstractLazyLoadRunMap extends AbstractMap i } public R get(int n) { - return search(n, Direction.EXACT); + return getByNumber(n); } /** @@ -367,184 +305,55 @@ public abstract class AbstractLazyLoadRunMap extends AbstractMap i * If DESC, finds the closest #M that satisfies M<=N. */ public @CheckForNull R search(final int n, final Direction d) { - Entry> c = index.ceilingEntry(n); - if (c!=null && c.getKey()== n) { - R r = c.getValue().get(); - if (r!=null) - return r; // found the exact #n - } - - // at this point we know that we don't have #n loaded yet - - {// check numberOnDisk as a cache to see if we can find it there - int npos = numberOnDisk.find(n); - if (npos>=0) {// found exact match - R r = load(numberOnDisk.get(npos), null); - if (r!=null) - return r; - } - - switch (d) { - case ASC: - case DESC: - // didn't find the exact match, but what's the nearest ascending value in the cache? - int neighbor = (d==ASC?HIGHER:LOWER).apply(npos); - if (numberOnDisk.isInRange(neighbor)) { - R r = getByNumber(numberOnDisk.get(neighbor)); - if (r!=null) { - // make sure that the cache is accurate by looking at the previous ID - // and it actually satisfies the constraint - int prev = (d==ASC?LOWER:HIGHER).apply(idOnDisk.find(getIdOf(r))); - if (idOnDisk.isInRange(prev)) { - R pr = getById(idOnDisk.get(prev)); - // sign*sign is making sure that #pr and #r sandwiches #n. - if (pr!=null && signOfCompare(getNumberOf(pr),n)*signOfCompare(n,getNumberOf(r))>0) - return r; - else { - // cache is lying. there's something fishy. - // ignore the cache and do the slow search - } - } else { - // r is the build with youngest ID - return r; - } - } else { - // cache says we should have a build but we didn't. - // ignore the cache and do the slow search - } - } - break; - case EXACT: - // fall through - } - - // didn't find it in the cache, but don't give up yet - // maybe the cache just doesn't exist. - // so fall back to the slow search - } - - // capture the snapshot and work off with it since it can be overwritten by other threads - SortedList idOnDisk = this.idOnDisk; - boolean clonedIdOnDisk = false; // if we modify idOnDisk we need to write it back. this flag is set to true when we overwrit idOnDisk local var - - // slow path: we have to find the build from idOnDisk by guessing ID of the build. - // first, narrow down the candidate IDs to try by using two known number-to-ID mapping - if (idOnDisk.isEmpty()) return null; - - Entry> f = index.floorEntry(n); - - // if bound is null, use a sentinel value - String cid = c==null ? "\u0000" : c.getValue().id; - String fid = f==null ? "\uFFFF" : f.getValue().id; - // at this point, #n must be in (cid,fid) - - // We know that the build we are looking for exists in [lo,hi) --- it's "hi)" and not "hi]" because we do +1. - // we will narrow this down via binary search - final int initialSize = idOnDisk.size(); - int lo = idOnDisk.higher(cid); - int hi = idOnDisk.lower(fid)+1; - - final int initialLo = lo, initialHi = hi; - - if (!(0<=lo && lo<=hi && hi<=idOnDisk.size())) { - // assertion error, but we are so far unable to get to the bottom of this bug. - // but don't let this kill the loading the hard way - String msg = String.format( - "JENKINS-15652 Assertion error #1: failing to load %s #%d %s: lo=%d,hi=%d,size=%d,size2=%d", - dir, n, d, lo, hi, idOnDisk.size(), initialSize); - LOGGER.log(Level.WARNING, msg); - return null; - } - - while (lo(idOnDisk); - clonedIdOnDisk = true; - } - idOnDisk.remove(pivot); - continue; - } - - int found = getNumberOf(r); - if (found==n) - return r; // exact match - - if (found=idOnDisk.size()) { - // assertion error, but we are so far unable to get to the bottom of this bug. - // but don't let this kill the loading the hard way - LOGGER.log(Level.WARNING, String.format( - "JENKINS-15652 Assertion error #3: failing to load %s #%d %s: lo=%d,hi=%d,size=%d (initial:lo=%d,hi=%d,size=%d)", - dir, n,d,lo,hi,idOnDisk.size(), initialLo,initialHi,initialSize)); - return null; - } - return getById(idOnDisk.get(lo-1)); case EXACT: - if (hi<=0) return null; - R r = getById(idOnDisk.get(hi-1)); - if (r==null) return null; - - int found = getNumberOf(r); - if (found==n) - return r; // exact match + return getByNumber(n); + case ASC: + for (int m : numberOnDisk) { + if (m < n) { + // TODO could be made more efficient with numberOnDisk.find + continue; + } + R r = getByNumber(m); + if (r != null) { + return r; + } + } + return null; + case DESC: + // TODO again could be made more efficient + List reversed = new ArrayList(numberOnDisk); + Collections.reverse(reversed); + for (int m : reversed) { + if (m > n) { + continue; + } + R r = getByNumber(m); + if (r != null) { + return r; + } + } return null; default: throw new AssertionError(); } } - /** - * sign of (a-b). - */ - private static int signOfCompare(int a, int b) { - if (a>b) return 1; - if (a ref = snapshot.byId.get(id); + if (snapshot.byNumber.containsKey(n)) { + BuildReference ref = snapshot.byNumber.get(n); if (ref==null) return null; // known failure R v = unwrap(ref); if (v!=null) return v; // already in memory // otherwise fall through to load } - return load(id,null); - } - - public R getByNumber(int n) { - return search(n, Direction.EXACT); + return load(n, null); } public R put(R value) { @@ -557,27 +366,13 @@ public abstract class AbstractLazyLoadRunMap extends AbstractMap i @Override public synchronized R put(Integer key, R r) { - String id = getIdOf(r); int n = getNumberOf(r); Index copy = copy(); BuildReference ref = createReference(r); - BuildReference old = copy.byId.put(id,ref); - copy.byNumber.put(n,ref); + BuildReference old = copy.byNumber.put(n,ref); index = copy; - /* - search relies on the fact that every object added via - put() method be available in the xyzOnDisk index, so I'm adding them here - however, this is awfully inefficient. I wonder if there's any better way to do this? - */ - if (!idOnDisk.contains(id)) { - ArrayList a = new ArrayList(idOnDisk); - a.add(id); - Collections.sort(a); - idOnDisk = new SortedList(a); - } - if (!numberOnDisk.contains(n)) { SortedIntList a = new SortedIntList(numberOnDisk); a.add(n); @@ -596,9 +391,7 @@ public abstract class AbstractLazyLoadRunMap extends AbstractMap i public synchronized void putAll(Map rhs) { Index copy = copy(); for (R r : rhs.values()) { - String id = getIdOf(r); BuildReference ref = createReference(r); - copy.byId.put(id,ref); copy.byNumber.put(getNumberOf(r),ref); } index = copy; @@ -618,9 +411,9 @@ public abstract class AbstractLazyLoadRunMap extends AbstractMap i synchronized (this) { if (!fullyLoaded) { Index copy = copy(); - for (String id : idOnDisk) { - if (!copy.byId.containsKey(id)) - load(id,copy); + for (Integer number : numberOnDisk) { + if (!copy.byNumber.containsKey(number)) + load(number, copy); } index = copy; fullyLoaded = true; @@ -638,42 +431,18 @@ public abstract class AbstractLazyLoadRunMap extends AbstractMap i } /** - * Tries to load the record #N by using the shortcut. + * Tries to load the record #N. * * @return null if the data failed to load. */ protected R load(int n, Index editInPlace) { - R r = null; - File shortcut = new File(dir,String.valueOf(n)); - if (shortcut.isDirectory()) { - synchronized (this) { - r = load(shortcut,editInPlace); - - // make sure what we actually loaded is #n, - // because the shortcuts can lie. - if (r!=null && getNumberOf(r)!=n) - r = null; - - if (r==null) { - // if failed to locate, record that fact - SortedIntList update = new SortedIntList(numberOnDisk); - update.removeValue(n); - numberOnDisk = update; - } - } - } - return r; - } - - - protected R load(String id, Index editInPlace) { assert dir != null; - R v = load(new File(dir, id), editInPlace); + R v = load(new File(dir, String.valueOf(n)), editInPlace); if (v==null && editInPlace!=null) { // remember the failure. // if editInPlace==null, we can create a new copy for this, but not sure if it's worth doing, - // given that we also update idOnDisk anyway. - editInPlace.byId.put(id,null); + // TODO should we also update numberOnDisk? + editInPlace.byNumber.put(n, null); } return v; } @@ -690,9 +459,7 @@ public abstract class AbstractLazyLoadRunMap extends AbstractMap i Index copy = editInPlace!=null ? editInPlace : new Index(index); - String id = getIdOf(r); BuildReference ref = createReference(r); - copy.byId.put(id,ref); copy.byNumber.put(getNumberOf(r),ref); if (editInPlace==null) index = copy; @@ -708,10 +475,11 @@ public abstract class AbstractLazyLoadRunMap extends AbstractMap i * Subtype to provide {@link Run#getNumber()} so that this class doesn't have to depend on it. */ protected abstract int getNumberOf(R r); - /** - * Subtype to provide {@link Run#getId()} so that this class doesn't have to depend on it. - */ - protected abstract String getIdOf(R r); + + private String getIdOf(R r) { + // TODO see comment in getById + return String.valueOf(getNumberOf(r)); + } /** * Allow subtype to capture a reference. @@ -735,11 +503,10 @@ public abstract class AbstractLazyLoadRunMap extends AbstractMap i public synchronized boolean removeValue(R run) { Index copy = copy(); int n = getNumberOf(run); - copy.byNumber.remove(n); + BuildReference old = copy.byNumber.remove(n); SortedIntList a = new SortedIntList(numberOnDisk); a.removeValue(n); numberOnDisk = a; - BuildReference old = copy.byId.remove(getIdOf(run)); this.index = copy; return unwrap(old)!=null; @@ -751,9 +518,7 @@ public abstract class AbstractLazyLoadRunMap extends AbstractMap i public synchronized void reset(TreeMap builds) { Index index = new Index(); for (R r : builds.values()) { - String id = getIdOf(r); BuildReference ref = createReference(r); - index.byId.put(id,ref); index.byNumber.put(getNumberOf(r),ref); } @@ -770,14 +535,9 @@ public abstract class AbstractLazyLoadRunMap extends AbstractMap i return o==this; } - /** - * Lists the actual data directory - */ - protected abstract FilenameFilter createDirectoryFilter(); - - private static final Comparator COMPARATOR = new Comparator() { - public int compare(Comparable o1, Comparable o2) { - return -o1.compareTo(o2); + private static final Comparator COMPARATOR = new Comparator() { + @Override public int compare(Integer o1, Integer o2) { + return o2 - o1; } }; diff --git a/core/src/main/java/jenkins/model/lazy/LazyBuildMixIn.java b/core/src/main/java/jenkins/model/lazy/LazyBuildMixIn.java index 095a7358cb..333ae269d4 100644 --- a/core/src/main/java/jenkins/model/lazy/LazyBuildMixIn.java +++ b/core/src/main/java/jenkins/model/lazy/LazyBuildMixIn.java @@ -63,9 +63,6 @@ public abstract class LazyBuildMixIn & Queue.Task & @SuppressWarnings("deprecation") // [JENKINS-15156] builds accessed before onLoad or onCreatedFromScratch called private @Nonnull RunMap builds = new RunMap(); - // keep track of the previous time we started a build - private long lastBuildStartTime; - /** * Initializes this mixin. * Call this from a constructor and {@link AbstractItem#onLoad} to make sure it is always initialized. @@ -169,19 +166,7 @@ public abstract class LazyBuildMixIn & Queue.Task & * Calls the ({@link Job}) constructor of {@link #getBuildClass}. * Suitable for {@link SubTask#createExecutable}. */ - @SuppressWarnings("SleepWhileHoldingLock") - @edu.umd.cs.findbugs.annotations.SuppressWarnings("SWL_SLEEP_WITH_LOCK_HELD") public final synchronized RunT newBuild() throws IOException { - // make sure we don't start two builds in the same second - // so the build directories will be different too - long timeSinceLast = System.currentTimeMillis() - lastBuildStartTime; - if (timeSinceLast < 1000) { - try { - Thread.sleep(1000 - timeSinceLast); - } catch (InterruptedException e) { - } - } - lastBuildStartTime = System.currentTimeMillis(); try { RunT lastBuild = getBuildClass().getConstructor(asJob().getClass()).newInstance(asJob()); builds.put(lastBuild); diff --git a/core/src/main/resources/jenkins/diagnostics/ooom/Messages.properties b/core/src/main/resources/jenkins/diagnostics/ooom/Messages.properties deleted file mode 100644 index 94f27977b1..0000000000 --- a/core/src/main/resources/jenkins/diagnostics/ooom/Messages.properties +++ /dev/null @@ -1 +0,0 @@ -Problem.DisplayName={0} builds have inconsistent timestamps in {1} \ No newline at end of file diff --git a/core/src/main/resources/jenkins/diagnostics/ooom/OutOfOrderBuildMonitor/message.groovy b/core/src/main/resources/jenkins/diagnostics/ooom/OutOfOrderBuildMonitor/message.groovy deleted file mode 100644 index 27f62dde93..0000000000 --- a/core/src/main/resources/jenkins/diagnostics/ooom/OutOfOrderBuildMonitor/message.groovy +++ /dev/null @@ -1,70 +0,0 @@ -/* -The MIT License - -Copyright (c) 2013, CloudBees, Inc. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -*/ -package jenkins.diagnostics.ooom.OutOfOrderBuildMonitor - -import jenkins.diagnostics.ooom.BuildPtr -import jenkins.diagnostics.ooom.Problem; - -def f = namespace(lib.FormTagLib) - -if (my.isFixingActive()) { - div(class:"info") { - raw _("inProgress",my.url) - } -} else if (my.logFile.exists()) { - form(method:"POST",action:"${my.url}/dismiss",name:"dismissOutOfOrderBuilds") { - raw _("completed",my.url) - f.submit(name:"dismiss",value:_("Dismiss this message")) - } -} - -if (!my.problems.isEmpty()) { - form(method:"POST",action:"${my.url}/fix",name:"fixOutOfOrderBuilds") { - div(class:"warning") { - raw _("buildsAreOutOfOrder") - } - ul { - my.problems.each { Problem p -> - li { - - raw(_("problem", - p.countInconsistencies(), - p.job.fullDisplayName, - rootURL+'/'+p.job.url)) - - text(" : ") - p.offenders.each { BuildPtr o -> - a(href:rootURL+'/'+p.job.url+'/'+o.n, "#${o.n}") - - raw(" ") - } - } - } - } - - div(align:"right") { - f.submit(name:"fix",value:_("Correct those problems by moving offending records to a backup folder")) - } - } -} diff --git a/core/src/main/resources/jenkins/diagnostics/ooom/OutOfOrderBuildMonitor/message.properties b/core/src/main/resources/jenkins/diagnostics/ooom/OutOfOrderBuildMonitor/message.properties deleted file mode 100644 index e401c26551..0000000000 --- a/core/src/main/resources/jenkins/diagnostics/ooom/OutOfOrderBuildMonitor/message.properties +++ /dev/null @@ -1,5 +0,0 @@ -problem={0} builds in {1} -buildsAreOutOfOrder=Some projects have builds whose timestamps are inconsistent. \ - These will confuse Jenkins when it tries to look up build records. -inProgress=Out-of-order builds are being swept under the carpet. You can check the log. -completed=Out-of-order builds were swept under the carpet. You can check the log. \ No newline at end of file diff --git a/core/src/test/java/hudson/model/RunTest.java b/core/src/test/java/hudson/model/RunTest.java index 8ee207cbd3..95a436d16e 100644 --- a/core/src/test/java/hudson/model/RunTest.java +++ b/core/src/test/java/hudson/model/RunTest.java @@ -24,12 +24,7 @@ package hudson.model; -import hudson.Util; import hudson.model.Run.Artifact; -import hudson.util.StreamTaskListener; - -import java.io.File; -import java.util.Date; import java.util.List; import java.util.TimeZone; import java.util.concurrent.Callable; @@ -87,32 +82,6 @@ public class RunTest { } - @Bug(15587) - @Test - public void testParseTimestampFromBuildDir() throws Exception { - //Assume.assumeTrue(!Functions.isWindows() || (NTFS && JAVA7) || ...); - - String buildDateTime = "2012-12-21_04-02-28"; - int buildNumber = 155; - - StreamTaskListener l = StreamTaskListener.fromStdout(); - - File tempDir = Util.createTempDir(); - File buildDir = new File(tempDir, buildDateTime); - assertEquals(true, buildDir.mkdir()); - File buildDirSymLink = new File(tempDir, Integer.toString(buildNumber)); - - try { - buildDir.mkdir(); - - Util.createSymlink(tempDir, buildDir.getAbsolutePath(), buildDirSymLink.getName(), l); - long time = Run.parseTimestampFromBuildDir(buildDirSymLink); - assertEquals(buildDateTime, Run.ID_FORMATTER.get().format(new Date(time))); - } finally { - Util.deleteRecursive(tempDir); - } - } - private List.Artifact> createArtifactList(String... paths) throws Exception { Run r = new Run(new StubJob(), 0) {}; Run.ArtifactList list = r.new ArtifactList(); diff --git a/core/src/test/java/jenkins/model/lazy/AbstractLazyLoadRunMapTest.java b/core/src/test/java/jenkins/model/lazy/AbstractLazyLoadRunMapTest.java index 55bd0bdfde..bb336880ea 100644 --- a/core/src/test/java/jenkins/model/lazy/AbstractLazyLoadRunMapTest.java +++ b/core/src/test/java/jenkins/model/lazy/AbstractLazyLoadRunMapTest.java @@ -66,7 +66,7 @@ public class AbstractLazyLoadRunMapTest extends Assert { return new FakeMap(getDir()) { @Override protected BuildReference createReference(Build r) { - return new BuildReference(getIdOf(r), /* pretend referent expired */ null); + return new BuildReference(Integer.toString(r.n), /* pretend referent expired */ null); } }; } @@ -80,7 +80,7 @@ public class AbstractLazyLoadRunMapTest extends Assert { @Before public void setUp() throws Exception { - a = aBuilder.add(1, "A").add(3, "B").add(5, "C").make(); + a = aBuilder.add(1).add(3).add(5).make(); b = bBuilder.make(); } @@ -88,11 +88,11 @@ public class AbstractLazyLoadRunMapTest extends Assert { @Test public void lookup() { assertNull(a.get(0)); - a.get(1).asserts(1, "A"); + a.get(1).asserts(1); assertNull(a.get(2)); - a.get(3).asserts(3, "B"); + a.get(3).asserts(3); assertNull(a.get(4)); - a.get(5).asserts(5, "C"); + a.get(5).asserts(5); assertNull(a.get(6)); assertNull(b.get(1)); @@ -108,8 +108,8 @@ public class AbstractLazyLoadRunMapTest extends Assert { @Test public void idempotentLookup() { for (int i=0; i<5; i++) { - a.get(1).asserts(1,"A"); - a.get((Object)1).asserts(1, "A"); + a.get(1).asserts(1); + a.get((Object)1).asserts(1); } } @@ -153,24 +153,24 @@ public class AbstractLazyLoadRunMapTest extends Assert { @Bug(19418) @Test public void searchExactWhenIndexedButSoftReferenceExpired() throws IOException { - final FakeMap m = localExpiredBuilder.add(1, "A").add(2, "B").make(); + final FakeMap m = localExpiredBuilder.add(1).add(2).make(); // force index creation m.entrySet(); - m.search(1, Direction.EXACT).asserts(1, "A"); + m.search(1, Direction.EXACT).asserts(1); assertNull(m.search(3, Direction.EXACT)); assertNull(m.search(0, Direction.EXACT)); } @Bug(22681) @Test public void exactSearchShouldNotReload() throws Exception { - FakeMap m = localBuilder.add(1, "A").add(2, "B").make(); + FakeMap m = localBuilder.add(1).add(2).make(); assertNull(m.search(0, Direction.EXACT)); Build a = m.search(1, Direction.EXACT); - a.asserts(1, "A"); + a.asserts(1); Build b = m.search(2, Direction.EXACT); - b.asserts(2, "B"); + b.asserts(2); assertNull(m.search(0, Direction.EXACT)); assertSame(a, m.search(1, Direction.EXACT)); assertSame(b, m.search(2, Direction.EXACT)); @@ -186,82 +186,19 @@ public class AbstractLazyLoadRunMapTest extends Assert { */ @Test public void unloadableData() throws IOException { - FakeMap m = localBuilder.add(1, "A").addUnloadable("B").add(5, "C").make(); + FakeMap m = localBuilder.add(1).addUnloadable(3).add(5).make(); assertNull(m.search(3, Direction.EXACT)); - m.search(3,Direction.DESC).asserts(1, "A"); - m.search(3, Direction.ASC ).asserts(5, "C"); + m.search(3,Direction.DESC).asserts(1); + m.search(3, Direction.ASC ).asserts(5); } @Test public void eagerLoading() throws IOException { Map.Entry[] b = a.entrySet().toArray(new Map.Entry[3]); - ((Build)b[0].getValue()).asserts(5, "C"); - ((Build)b[1].getValue()).asserts(3, "B"); - ((Build)b[2].getValue()).asserts(1, "A"); - } - - @Test - public void fastLookup() throws IOException { - FakeMap a = localBuilder.addBoth(1, "A").addBoth(3, "B").addBoth(5, "C"). make(); - - a.get(1).asserts(1,"A"); - assertNull(a.get(2)); - a.get(3).asserts(3, "B"); - assertNull(a.get(4)); - a.get(5).asserts(5, "C"); - } - - @Test - public void fastSearch() throws IOException { - FakeMap a = localBuilder.addBoth(1, "A").addBoth(3, "B").addBoth(5, "C").addBoth(7, "D").make(); - - // we should be using the cache to find the entry efficiently - a.search(6, Direction.ASC).asserts(7, "D"); - a.search(2, Direction.DESC).asserts(1, "A"); - } - - @Test - public void bogusCache() throws IOException { - FakeMap a = localBuilder.addUnloadableCache(1).make(); - assertNull(a.get(1)); - } - - @Test - public void bogusCacheAndHiddenRealData() throws IOException { - FakeMap a = localBuilder.addUnloadableCache(1).add(1, "A").make(); - a.get(1).asserts(1, "A"); - } - - @Test - public void bogusCache2() throws IOException { - FakeMap a = localBuilder.addBogusCache(1, 3, "A").make(); - assertNull(a.get(1)); - a.get(3).asserts(3,"A"); - } - - @Test - public void incompleteCache() throws IOException { - FakeMapBuilder setup = localBuilder.addBoth(1, "A").add(3, "B").addBoth(5, "C"); - - // each test uses a fresh map since cache lookup causes additional loads - // to verify the results - - // if we just rely on cache, - // it'll pick up 5:C as the first ascending value, - // but we should be then verifying this by loading B, so in the end we should - // find the correct value - setup.make().search(2, Direction.ASC).asserts(3,"B"); - setup.make().search(4, Direction.DESC).asserts(3,"B"); - - // variation of the cache based search where we find the outer-most value via cache - setup.make().search(0, Direction.ASC).asserts(1,"A"); - setup.make().search(6, Direction.DESC).asserts(5,"C"); - - // variation of the cache search where the cache tells us that we are searching - // in the direction that doesn't have any records - assertNull(setup.make().search(0, Direction.DESC)); - assertNull(setup.make().search(6, Direction.ASC)); + ((Build)b[0].getValue()).asserts(5); + ((Build)b[1].getValue()).asserts(3); + ((Build)b[2].getValue()).asserts(1); } @Test @@ -271,8 +208,8 @@ public class AbstractLazyLoadRunMapTest extends Assert { Build[] b = m.values().toArray(new Build[2]); assertEquals(2, b.length); - b[0].asserts(5, "C"); - b[1].asserts(3, "B"); + b[0].asserts(5); + b[1].asserts(3); } @Test @@ -287,77 +224,55 @@ public class AbstractLazyLoadRunMapTest extends Assert { @Test public void indexOutOfBounds() throws Exception { FakeMapBuilder f = localBuilder; - f.add(100,"A") - .addUnloadable("B") - .addUnloadable("C") - .addUnloadable("D") - .addUnloadable("E") - .addUnloadable("F") - .addUnloadable("G") - .add(200,"H") - .add(201, "I"); + f.add(100) + .addUnloadable(150) + .addUnloadable(151) + .addUnloadable(152) + .addUnloadable(153) + .addUnloadable(154) + .addUnloadable(155) + .add(200) + .add(201); FakeMap map = f.make(); Build x = map.search(Integer.MAX_VALUE, Direction.DESC); assert x.n==201; } - @Bug(15652) - @Test public void outOfOrder() throws Exception { - FakeMap map = localBuilder - .add( 4, "2012-A") - .add( 5, "2012-B") - .add( 6, "2012-C") - .add( 7, "2012-D") - .add( 8, "2012-E") - .add( 9, "2012-F") - .add(10, "2012-G") - .add(11, "2012-H") - .add(12, "2012-I") - .add( 1, "2013-A") - .add( 7, "2013-B") - .add( 9, "2013-C") - .add(10, "2013-D") - .add(11, "2013-E") - .make(); - map.entrySet(); // forces Index to be populated - assertNull(map.search(3, Direction.DESC)); - } - @Bug(18065) @Test public void all() throws Exception { assertEquals("[]", a.getLoadedBuilds().keySet().toString()); Set> entries = a.entrySet(); assertEquals("[]", a.getLoadedBuilds().keySet().toString()); assertFalse(entries.isEmpty()); - assertEquals("5 since it is the latest, and 3 because, well, .search and pivot is weird", "[5, 3]", a.getLoadedBuilds().keySet().toString()); - assertEquals(5, a.getById("C").n); - assertEquals("[5, 3]", a.getLoadedBuilds().keySet().toString()); - assertEquals("A", a.getByNumber(1).id); - assertEquals("[5, 3, 1]", a.getLoadedBuilds().keySet().toString()); + assertEquals("5 since it is the latest", "[5]", a.getLoadedBuilds().keySet().toString()); + assertEquals(5, a.getById("5").n); + assertEquals("[5]", a.getLoadedBuilds().keySet().toString()); + assertEquals(1, a.getByNumber(1).n); + assertEquals("[5, 1]", a.getLoadedBuilds().keySet().toString()); a.purgeCache(); assertEquals("[]", a.getLoadedBuilds().keySet().toString()); Iterator> iterator = entries.iterator(); - assertEquals("iterator starts off checking for newest build, so for this crazy logic see above", "[5, 3]", a.getLoadedBuilds().keySet().toString()); + assertEquals("[5]", a.getLoadedBuilds().keySet().toString()); assertTrue(iterator.hasNext()); - assertEquals("[5, 3]", a.getLoadedBuilds().keySet().toString()); + assertEquals("[5]", a.getLoadedBuilds().keySet().toString()); Map.Entry entry = iterator.next(); assertEquals("[5, 3]", a.getLoadedBuilds().keySet().toString()); assertEquals(5, entry.getKey().intValue()); assertEquals("[5, 3]", a.getLoadedBuilds().keySet().toString()); - assertEquals("C", entry.getValue().id); + assertEquals(5, entry.getValue().n); assertEquals("[5, 3]", a.getLoadedBuilds().keySet().toString()); assertTrue(iterator.hasNext()); entry = iterator.next(); assertEquals(3, entry.getKey().intValue()); assertEquals(".next() precomputes the one after that too", "[5, 3, 1]", a.getLoadedBuilds().keySet().toString()); - assertEquals("B", entry.getValue().id); + assertEquals(3, entry.getValue().n); assertEquals("[5, 3, 1]", a.getLoadedBuilds().keySet().toString()); assertTrue(iterator.hasNext()); entry = iterator.next(); assertEquals(1, entry.getKey().intValue()); assertEquals("[5, 3, 1]", a.getLoadedBuilds().keySet().toString()); - assertEquals("A", entry.getValue().id); + assertEquals(1, entry.getValue().n); assertEquals("[5, 3, 1]", a.getLoadedBuilds().keySet().toString()); assertFalse(iterator.hasNext()); } @@ -375,7 +290,7 @@ public class AbstractLazyLoadRunMapTest extends Assert { assertTrue(itr.hasNext()); Entry e = itr.next(); assertEquals((Integer)5,e.getKey()); - e.getValue().asserts(5, "C"); + e.getValue().asserts(5); // now that the first entry is returned, we expect there to be two loaded assertTrue(a.getLoadedBuilds().size() < 3); @@ -384,7 +299,7 @@ public class AbstractLazyLoadRunMapTest extends Assert { assertTrue(itr.hasNext()); e = itr.next(); assertEquals((Integer)3, e.getKey()); - e.getValue().asserts(3,"B"); + e.getValue().asserts(3); // repeat the process for the third one assertTrue(a.getLoadedBuilds().size() <= 3); @@ -393,7 +308,7 @@ public class AbstractLazyLoadRunMapTest extends Assert { assertTrue(itr.hasNext()); e = itr.next(); assertEquals((Integer) 1, e.getKey()); - e.getValue().asserts(1,"A"); + e.getValue().asserts(1); assertFalse(itr.hasNext()); assertEquals(3, a.getLoadedBuilds().size()); diff --git a/core/src/test/java/jenkins/model/lazy/FakeMap.java b/core/src/test/java/jenkins/model/lazy/FakeMap.java index ecb0648c17..a74c24733f 100644 --- a/core/src/test/java/jenkins/model/lazy/FakeMap.java +++ b/core/src/test/java/jenkins/model/lazy/FakeMap.java @@ -26,7 +26,6 @@ package jenkins.model.lazy; import org.apache.commons.io.FileUtils; import java.io.File; -import java.io.FilenameFilter; import java.io.IOException; /** @@ -42,50 +41,27 @@ public class FakeMap extends AbstractLazyLoadRunMap { return build.n; } - @Override - protected String getIdOf(Build build) { - return build.id; - } - - @Override - protected FilenameFilter createDirectoryFilter() { - return new FilenameFilter() { - public boolean accept(File dir, String name) { - try { - Integer.parseInt(name); - return false; - } catch (NumberFormatException e) { - return true; - } - } - }; - } - @Override protected Build retrieve(File dir) throws IOException { String n = FileUtils.readFileToString(new File(dir, "n")).trim(); - String id = FileUtils.readFileToString(new File(dir, "id")).trim(); - //new Exception("loading " + id + " #" + n).printStackTrace(); - return new Build(Integer.parseInt(n),id); + //new Exception("loading #" + n).printStackTrace(); + return new Build(Integer.parseInt(n)); } } class Build { final int n; - final String id; - Build(int n, String id) { + Build(int n) { this.n = n; - this.id = id; } - public void asserts(int n, String id) { + public void asserts(int n) { assert this.n==n; - assert this.id.equals(id); } @Override public String toString() { - return "Build #" + n + " [" + id + "] @" + hashCode(); + return "Build #" + n + " @" + hashCode(); } } \ No newline at end of file diff --git a/core/src/test/java/jenkins/model/lazy/FakeMapBuilder.java b/core/src/test/java/jenkins/model/lazy/FakeMapBuilder.java index 870d0cf2d5..4013736cb8 100644 --- a/core/src/test/java/jenkins/model/lazy/FakeMapBuilder.java +++ b/core/src/test/java/jenkins/model/lazy/FakeMapBuilder.java @@ -46,59 +46,19 @@ public class FakeMapBuilder implements TestRule { public FakeMapBuilder() { } - public FakeMapBuilder add(int n, String id) throws IOException { - verifyId(id); - File build = new File(dir,id); - build.mkdir(); + public FakeMapBuilder add(int n) throws IOException { + File build = new File(dir, Integer.toString(n)); FileUtils.writeStringToFile(new File(build, "n"), Integer.toString(n)); - FileUtils.writeStringToFile(new File(build,"id"),id); - return this; - } - - /** - * Adds a symlink from n to build id. - * - * (in test we should ideally create a symlink, but we fake the test - * by actually making it a directory and staging the same data.) - */ - public FakeMapBuilder addCache(int n, String id) throws IOException { - return addBogusCache(n,n,id); - } - - public FakeMapBuilder addBogusCache(int label, int actual, String id) throws IOException { - verifyId(id); - File build = new File(dir,Integer.toString(label)); build.mkdir(); - FileUtils.writeStringToFile(new File(build, "n"), Integer.toString(actual)); - FileUtils.writeStringToFile(new File(build,"id"),id); return this; } - public FakeMapBuilder addBoth(int n, String id) throws IOException { - return add(n,id).addCache(n,id); - } - - private void verifyId(String id) { - try { - Integer.parseInt(id); - throw new IllegalMonitorStateException("ID cannot be a number"); - } catch (NumberFormatException e) { - // OK - } - } - /** * Adds a build record under the givn ID but make it unloadable, * which will cause a failure when a load is attempted on this build ID. */ - public FakeMapBuilder addUnloadable(String id) throws IOException { - File build = new File(dir,id); - build.mkdir(); - return this; - } - - public FakeMapBuilder addUnloadableCache(int n) throws IOException { - File build = new File(dir,String.valueOf(n)); + public FakeMapBuilder addUnloadable(int n) throws IOException { + File build = new File(dir, Integer.toString(n)); build.mkdir(); return this; } diff --git a/test/src/test/groovy/jenkins/diagnostics/ooom/OutOfOrderBuildDetectorTest.groovy b/test/src/test/groovy/jenkins/diagnostics/ooom/OutOfOrderBuildDetectorTest.groovy deleted file mode 100644 index 00b0bd97b9..0000000000 --- a/test/src/test/groovy/jenkins/diagnostics/ooom/OutOfOrderBuildDetectorTest.groovy +++ /dev/null @@ -1,144 +0,0 @@ -package jenkins.diagnostics.ooom - -import com.gargoylesoftware.htmlunit.html.HtmlPage -import hudson.model.FreeStyleProject -import hudson.model.Job -import hudson.model.TaskListener -import hudson.util.StreamTaskListener -import static org.junit.Assert.*; -import org.junit.Rule -import org.junit.Test -import org.jvnet.hudson.test.Bug -import org.jvnet.hudson.test.JenkinsRule -import org.jvnet.hudson.test.recipes.LocalData - -import javax.inject.Inject - -/** - * - * - * @author Kohsuke Kawaguchi - */ -class OutOfOrderBuildDetectorTest { - @Rule - public JenkinsRule j = new JenkinsRule(); - - @Inject - OutOfOrderBuildDetector oobd; - - @Inject - OutOfOrderBuildMonitor oobm; - - /** - * The test case looks like [#3,#1,#2,#4] and we should find #3 to be the problem. - */ - @Test @LocalData - public void oneProblem() { - j.jenkins.injector.injectMembers(this); - - Job dt = j.jenkins.getItem("deletion-test"); - - def p = Problem.find(dt); - assert p.offenders.size()==1; - def b = (p.offenders as List)[0]; - - assert b.id=="2013-07-29_17-09-09" - assert b.n==3 - - def l = StreamTaskListener.fromStdout() - - // find all the problems now - oobd.execute(l,0); - - // verify that the monitor is activated - assert oobm.isActivated(); - assert oobm.problems.size()==1; - - def wc = j.createWebClient() - - // at this point there should be a link to start a fix but not the button to dismiss - def manage = wc.goTo("manage") - assertNoForm(manage,"dismissOutOfOrderBuilds") - j.submit(manage.getFormByName("fixOutOfOrderBuilds")); - - // give it a break until the fix is complete - while (oobm.isFixingActive()) - Thread.sleep(100); - - // there should be a log file now - oobm.getLogFile().exists() - wc.goTo("administrativeMonitor/${oobm.class.name}/log") - - // at this point the UI should change to show a dismiss action - manage = wc.goTo("manage") - assertNoForm(manage,"fixOutOfOrderBuilds") - j.submit(manage.getFormByName("dismissOutOfOrderBuilds")); - - // that should stop the alarm and there should be no more forms - assert !oobm.isActivated(); - manage = wc.goTo("manage") - assertNoForm(manage,"fixOutOfOrderBuilds") - assertNoForm(manage,"dismissOutOfOrderBuilds") - - // verify that the problem is actually fixed - assert dt.getBuildByNumber(1)!=null; - assert dt.getBuildByNumber(2)!=null; - assert dt.getBuildByNumber(3)==null; - assert dt.getBuildByNumber(4)!=null; - assert Problem.find(dt)==null; - - // and there should be a backup - assert new File(dt.rootDir,"outOfOrderBuilds/2013-07-29_17-09-09/build.xml").exists() - } - - def assertNoForm(HtmlPage p, String name) { - def forms = p.documentElement.getElementsByAttribute("form", "name", name); - assert forms.size()==0; - } - - /** - * If there's no problem, it shouldn't find it. - */ - @Test - public void thereShouldBeNoFailure() { - def f = j.createFreeStyleProject() - j.assertBuildStatusSuccess(f.scheduleBuild2(0)); - j.assertBuildStatusSuccess(f.scheduleBuild2(0)); - j.assertBuildStatusSuccess(f.scheduleBuild2(0)); - assert Problem.find(f)==null; - } - - @Bug(22631) - @LocalData - @Test public void buildNumberClash() throws Exception { - j.jenkins.injector.injectMembers(this); - FreeStyleProject p = j.jenkins.getItemByFullName("problematic", FreeStyleProject.class); - assertNotNull(p); - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - TaskListener l = new StreamTaskListener(baos); - oobd.execute(l, 0); - String log = baos.toString(); - String idA = "2014-04-15_11-22-11"; - String idB = "2014-04-15_11-22-14"; - assertEquals(idB, p.getBuildByNumber(2).getId()); - assertEquals(3, p.getLastBuild().getNumber()); - File dir = p.getBuildDir(); - File buildDirA = new File(dir, idA); - File buildDirB = new File(dir, idB); - BuildPtr b2A = new BuildPtr(p, buildDirA, 2); - BuildPtr b2B = new BuildPtr(p, buildDirB, 2); - String expected = "[" + b2A + "]"; - assertTrue("Should see " + expected + " in:\n" + log, log.contains(expected)); - baos = new ByteArrayOutputStream(); - l = new StreamTaskListener(baos); - oobm.fix(l); - log = baos.toString(); - assertTrue(buildDirB.isDirectory()); - assertTrue("Should see " + buildDirA + " in:\n" + log, log.contains(buildDirA.toString())); - File dest = new File(new File(p.getRootDir(), "outOfOrderBuilds"), idA); - assertTrue("Should see " + dest + " in:\n" + log, log.contains(dest.toString())); - assertFalse(buildDirA.isDirectory()); - assertTrue(dest.isDirectory()); - } - -} diff --git a/test/src/test/resources/jenkins/diagnostics/ooom/OutOfOrderBuildDetectorTest/buildNumberClash.zip b/test/src/test/resources/jenkins/diagnostics/ooom/OutOfOrderBuildDetectorTest/buildNumberClash.zip deleted file mode 100644 index 64751bbe30b8205f7d74a760931f1c201d13fa34..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4810 zcmeHL&u<$=6rQvRiVRfZQla)@^-v$cUax;NiL}|4+9|36sTDUuqDW=EJF&Oj-C51d zw&{((fE-$JfitQo2#Et1#HB}$RsV=e+&F;*h&N-eXX_n1*tw;(wbss$_syG`Z@ziY zo$b@h1%y@+di>d88)ZK4pk;K2^q3J-(hG3taNjll{SBec*yQP_hwUx8_VD=UA7Ar40s2-+%6Q0 z)?JL_HjZ)RK~Enud*2Bdwv1f8=nRH2rX0E%(wMnn(G48NHZKekkCCVXHI$9~O8tHxjuCr8wf!tJEdfk(a8a2Vy2;!#L>$J{ye7JvmS6#IU>q z+Y+RZd!)$lE%4{;>cw-XfCSc|k`gP|`wN!Y`*QBd}eCiwTR&R#mg3}y9X!s`7Q zR<)|xC|4V0vw7Pz%e7kBtY(n@x^>w8{iogU&VcjcY0ilxU7LsI(m?XmaXFj_Cf;EW zM^p`ohl5JXNf`b>whx=3gDdJry{A~*F7Gi+uY1y5l0kMfvZj_XYb49acx6R$yKK`k zMsI>Mj60Oy^h0c$^^LXWTC-lSURqzX4AmgIQOuHn+uglZYpdI}j8R!Mc?ktsA(6cS z$m4=&aR&}%nA=hnEF&$7CUNvXBI5&=7Dba-Qhp<{EhBvswbNywHE^On2C$A8ji!>2 z1TpnFOSQu#VWm$i5T@ zs+pnc-$2!izkGFVF{+w!al8{w)!I>1H8<8b7NKhW6`<-ZAlTPmJ`3SaN8%~X&_cLh zc~|oPs<>VuWwJCcMz*MzvX8i1483CtaI=JPuWB*)U=S zkY4OYUA(D=a8~9SLPVd+d0qUeke|$ntaV-& zfv6$gg8wUWY#6Q2L_Cu9TNjWh(A^oJ`9&AuiCPg|fTEDUnG;#NBDyO|4e<{g=xHmG zb6#Fp%6Z+DrI0^-b3SCP^E%N|Lp*+a`VewEUzV`W_R1T=_zZlXE+g~@m?QKb9>YYY diff --git a/test/src/test/resources/jenkins/diagnostics/ooom/OutOfOrderBuildDetectorTest/oneProblem.zip b/test/src/test/resources/jenkins/diagnostics/ooom/OutOfOrderBuildDetectorTest/oneProblem.zip deleted file mode 100644 index 86e801dd38a0af3048e6eee0736e08506c03d0ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15427 zcmeHO2{@G78z07!NJX-QYO)@J-_$--uJxcogF$zy2S|awJv;IW8#;o zAM^-bgtNOfR&tji69Os2Hlhzcp8J^*G;|-42*kvX9b`YwKK*f9I~O~gle?QZ&JK&4 z<6u0b2ebBca)N0Z4#}Co9rv4Uo9=FnN~OZGW@JbW|3H6r&3A1P4Tg0ghPgE=xpAdj_j_KvQsF!H z2diGFhJSHGc*{CorudvU=-x4v#mqVU@lT@GjQa1pT(eeDVc4o8d)4!AqlG03lGn#@ z@lhk_u=cP(&%t+=7dYQZJ;}0+DwmVA*N#8(y9eor{ z#cZ$pX4NaEQ8KWSz>9i)6|E0+xe-~iwwN`Z14M=Li6I~R8c2<~@Z2cFdwfPjzx?Nua(*9@z2^ZyN@Ir78*Lc>}6Y*l|D3B+=r6^{Fy zYdIdQI8nK+ise~Wme6+Jjow(Shr38J<}KYlq@zM+>CiR9J-PaQ=VIErx+F_C8AXK) zSz8zLKWV}~N1chRQ`?$RV({_X_83NF?C|;{*{1h;1}-1s7jS&N#X#0WI&bKL?Vh#1 zR-bxwTeXyr=xjCq{ar&Y^ZgYT>zo6mnw)|PR|Pjbysst#Zr_Y&~G5WQ+4v z#5k#3^QhM1*I{kiUi$+55{qO%{}|`}=D^e5#4g_|Q9aiYu97#pSsonvn*)R74<^f} zY+JOQ=2Bu%e*RCP6}WVXQDa;=;&22Tc6W9Nn*Ib|pyCz!q@N9%@&|{ko?5fAn_8=L z9b$`S9_@(fVG>j>f5>obOMR$R+;_wb;e^T|0n3Aol(ek46k1$H(Lx$6E~O|gJy$J3 zQ;oBrF8?@nQKH%jewp4#Qw_bKK>wQxBtOe+Mg$0Ly7!I>ot?^Ns8t|&NvHy?Czsz; zxxJQJR@AZnm}wJ#N@Uw#PRz0DmMN}BH!`g$toOgN@j6PCMfLrcKAkSBjvYhyE?&I& zrhP-fn7HO(P=yyJW2I)4B%7fr`l7ROaPJ45ulx4>F8Sc8cXAS^wg#7XQcZ7gJFwKj?O*J zeXCR8rL~V4hjIJWYhSaAP+)?i-hKSiuvhV&w7s@BElsA!`j7eZI(z;0rSvy3~Fty6yYE;@Iv5eJj30>}C7uw#G;<6rF#afih z1jv0@+vRcF@PX}8^OM8zsVmE~5|YI~ux)-; zwCG0MMNQMH^xE4TKzhTVQm?VbyWyg8zS_vn1C?I1dtG@q%HMwFkeiuw1TVb-eE>hb zp;mz8C5Z(H^aBzZ31PwmLgObq)C!QihnT(q7amk4MuLnQ}3-IQ=bmgcXu{FZHS5S%vF zp=W1q&aS{L{UmX??1giodCM*izi_S8FDHhPoI13^Y#etSDv~c1n_2aRZ%+MP`TO%F zhwRHxey28zV!HS_1f`O=RGh0DkgZ$Z6>vBvRr_`;9lLa#)6gvKXayg4KRG^Rfh6v@K5zo%L ztD!sdA60g88JumlkYJaH&P%Hr*ts@BW&heb-zz*UC5MAppO^o>5VtpX&zupW;sg%GMmkHtNXchn^G{ai$Ov zh76kuSIntgku1*pwFe7!OJpskby$0aJJ(zR<67Tccnu{rC{o*;eb|zFQ^FR*(Rl9Q z(_g%f7i;lcW*z7^Ko7+*1=9)fTy{+LH9U9snDx+K+Z~pMtUKOelz3dXFQaeS>6PX? zJTo?xXxXp%P#)a8XVD!?Q&CSxzPPVvWP2D{RDbYG=mxt;Tcp&M_Zkeh?mK&MQ}mZe z#ciMWieRHVG-KMv>JP>r{F$d+xl2{AGCFqXheynxrRip7r_V1A?D9fHipwG>W0DcdYQesZgloEk9IuETlT=rOL*z0mf~~GIT!D4T@~ngT;dCNdRpg^ z8EpXx$JZA4+Kns;B>_pFg_3|k_(}p_yOI4{H^>aXpd0@Y-H@B5ZV;v^@Ks+q0^L|h zO8)yOp2@iaYmz1ylGVy`0@sfgG5TIWzK$FFg+LPlNalRFaEkI90HBb=YBOMlO z+}-S*W_lUIkt6y;#1+<1eKmvfH7i=aiRMehZ0q@OCdIoEn-qhzpn%I zV%(1tSCy26G4}r0Ti1i+6%8=UOLJe(AQEDz;8oi>Jn$j2apXeXrq8TpBdaPJnUAU* zr9bx~_2^f0CR3yRePJvM=1h$*P>fwc57WZyckoW%zMi??Cq$_Xp=9e zwX3>zc+hB~dQ>>G?)${h{3gcB?LM^1(Ru=XN1w$6eLMF&;f`m+!yi|j+qY^qr|t{s z`*tH%eR&*msKM~S;p#Dl&RjZIuH0m&(mg6lZoQGt7X~$3W-1C`zHY3jf&_Yh5a5F% zy=rcD`*9O0t?TJ(ZRau3rvawyB$iHo@yzJ+Y(0=toaMzIVId4YC=j(c065T~uuvNN zzb}o!#{^O?KpYduRI>=ryoALv_?SQndO9YM0bDo*Q+W!eq2))CYYXK9R1SPCL)=vd z-=~^H=_i{+i5f)755Ide53>-pw;0eJ3n@1^+PpHDYkn!Kbjt@3} z0SI6tDaoaoY4wA)kxniR5QY)Cej9ZePTQ5(PSY z;h+fiI2_!JWza%6K3oI^xQTrY2Qq0BAwd!lf_UiRY$B4AiGDrmDML?TPEzJiH6~sF zrED-EiAoUgKt^f}o;R)1kO|N(qILqmgy=XX>R`dH1j?VpfdHx}FikXB*xBr8K31yio@hUzOf=!G z4s=H!ry3Kwqrq$+hG-BR|7H@pqfafP)?i|y$xdLBXu^vJ=#HjaPVEGyi6#p>Ni<>E z3mRMF+2CNoYkq)MlHW@K(~e2Q2+uZx5UCoXfB+>C%r9X`1flRr6oo*w1M?v-6-1ZK zfMsOiW-KEgTXi|$;id^93o;vm>Q=&mfcL4C2_oEgP=Ypa!XrQlqTp?Wy9`PYKQ}zo zy!X^B?~bMOBLR{$b;%LmX8`k=S`(J z#Of}pz~@LTG^;(jnxee~b^E!H3ti)nRAbJIU}y~NSxc?K^ClS@107J*PJklOlR8dZ zdBxAMXaq>Y;@4pTjRotlFp&uqK4_T|9|A2%5`w5`3E)r=Blwe8Bx#%pC&5Y*CCd}# zO8}F?;h8YNLw$CfYD}olQV5TPAs_0q2oaJC3u7>`&yt-0=_CN^v%XYMVA^L%!qS6Z Scm%%j2*gbwZ{iRG|N0jdT1aL9 From c0d48fc116ee6357b35a4e3f408623b1533f364c Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Wed, 27 Aug 2014 10:22:10 -0400 Subject: [PATCH 002/701] Fixed compatibility with MatrixRun. The Run constructors taking a timestamp must not be deprecated. And the root directory must be created in RunMap.put, not the constructor, in case the number (and hence directory name) is changed after the constructor completes. --- core/src/main/java/hudson/model/Run.java | 15 +++++++++++---- core/src/main/java/hudson/model/RunMap.java | 1 + 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/core/src/main/java/hudson/model/Run.java b/core/src/main/java/hudson/model/Run.java index 0c9614fb33..824ae12a81 100644 --- a/core/src/main/java/hudson/model/Run.java +++ b/core/src/main/java/hudson/model/Run.java @@ -47,6 +47,7 @@ import hudson.model.Descriptor.FormException; import hudson.model.Run.RunExecution; import hudson.model.listeners.RunListener; import hudson.model.listeners.SaveableListener; +import hudson.model.queue.SubTask; import hudson.search.SearchIndexBuilder; import hudson.security.ACL; import hudson.security.AccessControlled; @@ -108,6 +109,7 @@ import jenkins.model.PeepholePermalink; import jenkins.model.RunAction2; import jenkins.model.StandardArtifactManager; import jenkins.model.lazy.BuildReference; +import jenkins.model.lazy.LazyBuildMixIn; import jenkins.util.VirtualFile; import jenkins.util.io.OnMaster; import net.sf.json.JSONObject; @@ -280,21 +282,26 @@ public abstract class Run ,RunT extends RunMay be used in a {@link SubTask#createExecutable} (instead of calling {@link LazyBuildMixIn#newBuild}). + * For example, {@code MatrixConfiguration.newBuild} does this + * so that the {@link #timestamp} as well as {@link #number} are shared with the parent build. + */ protected Run(@Nonnull JobT job, @Nonnull Calendar timestamp) { this(job,timestamp.getTimeInMillis()); } - @Deprecated + /** @see #Run(Job, Calendar) */ protected Run(@Nonnull JobT job, long timestamp) { this.project = job; this.timestamp = timestamp; this.state = State.NOT_STARTED; - getRootDir().mkdirs(); } /** diff --git a/core/src/main/java/hudson/model/RunMap.java b/core/src/main/java/hudson/model/RunMap.java index 3bebd0ece1..1c73f1b0e7 100644 --- a/core/src/main/java/hudson/model/RunMap.java +++ b/core/src/main/java/hudson/model/RunMap.java @@ -163,6 +163,7 @@ public final class RunMap> extends AbstractLazyLoadRunMap @Override public R put(R r) { + r.getRootDir().mkdirs(); return super._put(r); } From 2ca95503eba72dd0d3e0232d76509576aeea3d5f Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Wed, 27 Aug 2014 10:33:54 -0400 Subject: [PATCH 003/701] =?UTF-8?q?Implemented=20@daniel-beck=E2=80=99s=20?= =?UTF-8?q?suggestion=20for=20defense=20against=20build=20number=20duplica?= =?UTF-8?q?tion.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/src/main/java/hudson/model/RunMap.java | 11 ++++++++++- .../main/java/jenkins/model/lazy/LazyBuildMixIn.java | 3 ++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/hudson/model/RunMap.java b/core/src/main/java/hudson/model/RunMap.java index 1c73f1b0e7..262c6355e9 100644 --- a/core/src/main/java/hudson/model/RunMap.java +++ b/core/src/main/java/hudson/model/RunMap.java @@ -161,9 +161,18 @@ public final class RunMap> extends AbstractLazyLoadRunMap return r.getNumber(); } + /** + * Add a new build to the map. + * Do not use when loading existing builds (use {@link #put(Integer, Object)}). + */ @Override public R put(R r) { - r.getRootDir().mkdirs(); + // Defense against JENKINS-23152 and its ilk. + File rootDir = r.getRootDir(); + if (rootDir.isDirectory()) { + throw new IllegalStateException(rootDir + " already existed; will not overwite with " + r); + } + rootDir.mkdirs(); return super._put(r); } diff --git a/core/src/main/java/jenkins/model/lazy/LazyBuildMixIn.java b/core/src/main/java/jenkins/model/lazy/LazyBuildMixIn.java index 333ae269d4..e188f193a9 100644 --- a/core/src/main/java/jenkins/model/lazy/LazyBuildMixIn.java +++ b/core/src/main/java/jenkins/model/lazy/LazyBuildMixIn.java @@ -120,7 +120,8 @@ public abstract class LazyBuildMixIn & Queue.Task & // if we are reloading, keep all those that are still building intact for (RunT r : currentBuilds.getLoadedBuilds().values()) { if (r.isBuilding()) { - _builds.put(r); + // Do not use RunMap.put(Run): + _builds.put(r.getNumber(), r); } } } From 1ede3e983386830118bd4e891c76c64f119317f7 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Wed, 27 Aug 2014 11:00:39 -0400 Subject: [PATCH 004/701] Defend against out-of-order builds even if nextBuildNumber is wrong. --- core/src/main/java/hudson/model/RunMap.java | 1 + .../model/lazy/AbstractLazyLoadRunMap.java | 6 +++++ .../jenkins/model/lazy/SortedIntListTest.java | 22 ++++++++++++++++++- 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/hudson/model/RunMap.java b/core/src/main/java/hudson/model/RunMap.java index 262c6355e9..00cba471c1 100644 --- a/core/src/main/java/hudson/model/RunMap.java +++ b/core/src/main/java/hudson/model/RunMap.java @@ -172,6 +172,7 @@ public final class RunMap> extends AbstractLazyLoadRunMap if (rootDir.isDirectory()) { throw new IllegalStateException(rootDir + " already existed; will not overwite with " + r); } + proposeNewNumber(r.getNumber()); rootDir.mkdirs(); return super._put(r); } diff --git a/core/src/main/java/jenkins/model/lazy/AbstractLazyLoadRunMap.java b/core/src/main/java/jenkins/model/lazy/AbstractLazyLoadRunMap.java index b1c12800fc..27b87c6ae9 100644 --- a/core/src/main/java/jenkins/model/lazy/AbstractLazyLoadRunMap.java +++ b/core/src/main/java/jenkins/model/lazy/AbstractLazyLoadRunMap.java @@ -356,6 +356,12 @@ public abstract class AbstractLazyLoadRunMap extends AbstractMap i return load(n, null); } + protected final synchronized void proposeNewNumber(int number) throws IllegalStateException { + if (numberOnDisk.isInRange(numberOnDisk.ceil(number))) { + throw new IllegalStateException("cannot create a build with number " + number + " since that (or higher) is already in use among " + numberOnDisk); + } + } + public R put(R value) { return _put(value); } diff --git a/core/src/test/java/jenkins/model/lazy/SortedIntListTest.java b/core/src/test/java/jenkins/model/lazy/SortedIntListTest.java index 8fcd92354b..2146852a5f 100644 --- a/core/src/test/java/jenkins/model/lazy/SortedIntListTest.java +++ b/core/src/test/java/jenkins/model/lazy/SortedIntListTest.java @@ -1,5 +1,6 @@ package jenkins.model.lazy; +import static org.junit.Assert.*; import org.junit.Test; /** @@ -12,6 +13,25 @@ public class SortedIntListTest { l.add(0); l.add(5); l.add(10); - System.out.println(l.lower(Integer.MAX_VALUE)); + assertEquals(2, l.lower(Integer.MAX_VALUE)); } + + @Test public void ceil() { + SortedIntList l = new SortedIntList(5); + l.add(1); + l.add(3); + l.add(5); + assertEquals(0, l.ceil(0)); + assertEquals(0, l.ceil(1)); + assertEquals(1, l.ceil(2)); + assertEquals(1, l.ceil(3)); + assertEquals(2, l.ceil(4)); + assertEquals(2, l.ceil(5)); + assertEquals(3, l.ceil(6)); + assertTrue(l.isInRange(0)); + assertTrue(l.isInRange(1)); + assertTrue(l.isInRange(2)); + assertFalse(l.isInRange(3)); + } + } From 25075826b5d26bb8be11789a89b28fd9d11d1c2e Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Wed, 27 Aug 2014 11:16:52 -0400 Subject: [PATCH 005/701] Making various changes to ALLRM incompatible to subclasses, so be explicit that this is distinct from RunMap only for purposes of clarity and testing. --- .../src/main/java/jenkins/model/lazy/AbstractLazyLoadRunMap.java | 1 + 1 file changed, 1 insertion(+) diff --git a/core/src/main/java/jenkins/model/lazy/AbstractLazyLoadRunMap.java b/core/src/main/java/jenkins/model/lazy/AbstractLazyLoadRunMap.java index 27b87c6ae9..9211f8d046 100644 --- a/core/src/main/java/jenkins/model/lazy/AbstractLazyLoadRunMap.java +++ b/core/src/main/java/jenkins/model/lazy/AbstractLazyLoadRunMap.java @@ -140,6 +140,7 @@ public abstract class AbstractLazyLoadRunMap extends AbstractMap i */ private File dir; + @Restricted(NoExternalUse.class) // subclassing other than by RunMap does not guarantee compatibility protected AbstractLazyLoadRunMap(File dir) { initBaseDir(dir); } From 843d2387234080efc2fa86acdd52b3053cbd08dd Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Wed, 27 Aug 2014 15:04:45 -0400 Subject: [PATCH 006/701] Added RunIdMigrator. --- core/src/main/java/hudson/model/Job.java | 18 +- core/src/main/java/hudson/model/Run.java | 9 +- core/src/main/java/hudson/model/RunMap.java | 24 ++ .../java/jenkins/model/RunIdMigrator.java | 244 ++++++++++++++++++ .../model/lazy/AbstractLazyLoadRunMap.java | 13 +- .../jenkins/model/lazy/LazyBuildMixIn.java | 11 +- .../java/jenkins/model/RunIdMigratorTest.java | 129 +++++++++ 7 files changed, 432 insertions(+), 16 deletions(-) create mode 100644 core/src/main/java/jenkins/model/RunIdMigrator.java create mode 100644 core/src/test/java/jenkins/model/RunIdMigratorTest.java diff --git a/core/src/main/java/hudson/model/Job.java b/core/src/main/java/hudson/model/Job.java index 9f5bb63c72..9b83cd0e35 100644 --- a/core/src/main/java/hudson/model/Job.java +++ b/core/src/main/java/hudson/model/Job.java @@ -101,7 +101,10 @@ import javax.annotation.Nonnull; import static javax.servlet.http.HttpServletResponse.*; import jenkins.model.ModelObjectWithChildren; +import jenkins.model.RunIdMigrator; import jenkins.model.lazy.LazyBuildMixIn; +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.NoExternalUse; /** * A job is an runnable entity under the monitoring of Hudson. @@ -158,6 +161,9 @@ public abstract class Job, RunT extends Run> properties = new CopyOnWriteList>(); + @Restricted(NoExternalUse.class) + public transient RunIdMigrator runIdMigrator; + protected Job(ItemGroup parent, String name) { super(parent, name); } @@ -168,11 +174,21 @@ public abstract class Job, RunT extends Run parent, String name) throws IOException { super.onLoad(parent, name); + File buildDir = getBuildDir(); + runIdMigrator = new RunIdMigrator(); + runIdMigrator.migrate(buildDir); + TextFile f = getNextBuildNumberFile(); if (f.exists()) { // starting 1.28, we store nextBuildNumber in a separate file. @@ -184,7 +200,7 @@ public abstract class Job, RunT extends Run,RunT extends Run,RunT extends Run number map for use from AbstractLazyLoadRunMap - /** * Creates a new {@link Run}. * @param job Owner job diff --git a/core/src/main/java/hudson/model/RunMap.java b/core/src/main/java/hudson/model/RunMap.java index 00cba471c1..f5897bb5e8 100644 --- a/core/src/main/java/hudson/model/RunMap.java +++ b/core/src/main/java/hudson/model/RunMap.java @@ -35,10 +35,14 @@ import java.util.logging.Level; import static java.util.logging.Level.*; import java.util.logging.Logger; +import jenkins.model.RunIdMigrator; import jenkins.model.lazy.AbstractLazyLoadRunMap; import static jenkins.model.lazy.AbstractLazyLoadRunMap.Direction.*; import jenkins.model.lazy.BuildReference; +import jenkins.model.lazy.LazyBuildMixIn; import org.apache.commons.collections.comparators.ReverseComparator; +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.NoExternalUse; /** * {@link Map} from build number to {@link Run}. @@ -58,6 +62,10 @@ public final class RunMap> extends AbstractLazyLoadRunMap private Constructor cons; + /** Normally overwritten by {@link LazyBuildMixIn#onLoad} or {@link LazyBuildMixIn#onCreatedFromScratch}, in turn created during {@link Job#onLoad}. */ + @Restricted(NoExternalUse.class) + public RunIdMigrator runIdMigrator = new RunIdMigrator(); + // TODO: before first complete build // patch up next/previous build link @@ -115,6 +123,7 @@ public final class RunMap> extends AbstractLazyLoadRunMap @Override public boolean removeValue(R run) { run.dropLinks(); + runIdMigrator.delete(dir, run.getId()); return super.removeValue(run); } @@ -161,6 +170,11 @@ public final class RunMap> extends AbstractLazyLoadRunMap return r.getNumber(); } + @Override + protected final String getIdOf(R r) { + return r.getId(); + } + /** * Add a new build to the map. * Do not use when loading existing builds (use {@link #put(Integer, Object)}). @@ -177,6 +191,16 @@ public final class RunMap> extends AbstractLazyLoadRunMap return super._put(r); } + @Override public R getById(String id) { + int n; + try { + n = Integer.parseInt(id); + } catch (NumberFormatException x) { + n = runIdMigrator.findNumber(id); + } + return getByNumber(n); + } + /** * Reuses the same reference as much as we can. *

diff --git a/core/src/main/java/jenkins/model/RunIdMigrator.java b/core/src/main/java/jenkins/model/RunIdMigrator.java new file mode 100644 index 0000000000..9652a90669 --- /dev/null +++ b/core/src/main/java/jenkins/model/RunIdMigrator.java @@ -0,0 +1,244 @@ +/* + * The MIT License + * + * Copyright 2014 Jesse Glick. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package jenkins.model; + +import hudson.Util; +import hudson.model.Job; +import hudson.model.Run; +import java.io.File; +import java.io.IOException; +import java.io.PrintWriter; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.TreeMap; +import java.util.logging.Level; +import java.util.logging.Logger; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import javax.annotation.Nonnull; +import org.apache.commons.io.Charsets; +import org.apache.commons.io.FileUtils; +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.NoExternalUse; + +/** + * Converts legacy {@code builds} directories to the current format. + * There would be one instance associated with each {@link Job}. + * The {@link Job#getBuildDir} is passed to every method call (rather than being cached) in case it is moved. + */ +@Restricted(NoExternalUse.class) +public final class RunIdMigrator { + + static final Logger LOGGER = Logger.getLogger(RunIdMigrator.class.getName()); + private static final SimpleDateFormat LEGACY_ID_FORMATTER = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss"); + private static final String MAP_FILE = "legacyIds"; + /** avoids wasting a map for new jobs */ + private static final Map EMPTY = new TreeMap(); + + private @Nonnull Map idToNumber = EMPTY; + + public RunIdMigrator() {} + + /** + * @return whether there was a file to load + */ + private boolean load(File dir) { + File f = new File(dir, MAP_FILE); + if (!f.isFile()) { + return false; + } + if (f.length() == 0) { + return true; + } + idToNumber = new TreeMap(); + try { + for (String line : FileUtils.readLines(f)) { + int i = line.indexOf(' '); + idToNumber.put(line.substring(0, i), Integer.parseInt(line.substring(i + 1))); + } + } catch (Exception x) { // IOException, IndexOutOfBoundsException, NumberFormatException + LOGGER.log(Level.WARNING, "could not read from " + f, x); + } + return true; + } + + private void save(File dir) { + dir.mkdirs(); + File f = new File(dir, MAP_FILE); + try { + PrintWriter w = new PrintWriter(f); + try { + for (Map.Entry entry : idToNumber.entrySet()) { + w.println(entry.getKey() + ' ' + entry.getValue()); + } + } finally { + w.close(); + } + } catch (IOException x) { + LOGGER.log(Level.WARNING, "could not save changes to " + f, x); + } + } + + /** + * Called when a job is first created. + * Just saves an empty marker indicating that this job needs no migration. + * @param dir as in {@link Job#getBuildDir} + */ + public void created(File dir) { + save(dir); + } + + /** + * Perform one-time migration if this has not been done already. + * Where previously there would be a {@code 2014-01-02_03-04-05/build.xml} specifying {@code 99} plus a symlink {@code 99 → 2014-01-02_03-04-05}, + * after migration there will be just {@code 99/build.xml} specifying {@code 2014-01-02_03-04-05} and {@code …} according to local time zone at time of migration. + * Newly created builds are untouched. + * Does not throw {@link IOException} since we make a best effort to migrate but do not consider it fatal to job loading if we cannot. + * @param dir as in {@link Job#getBuildDir} + * @return true if migration was performed + */ + public synchronized boolean migrate(File dir) { + if (load(dir)) { + LOGGER.log(Level.FINER, "migration already performed for {0}", dir); + return false; + } + LOGGER.log(Level.INFO, "Migrating build records in {0}", dir); + doMigrate(dir); + save(dir); + return true; + } + + private static final Pattern NUMBER_ELT = Pattern.compile("(?m)^ (\\d+)(\r?\n)"); + private void doMigrate(File dir) { + idToNumber = new TreeMap(); + File[] kids = dir.listFiles(); + if (kids == null) { + LOGGER.warning("dir was unexpectedly missing"); + return; + } + // Need to process symlinks first so we can rename to them. + List kidsList = new ArrayList(Arrays.asList(kids)); + Iterator it = kidsList.iterator(); + while (it.hasNext()) { + File kid = it.next(); + String name = kid.getName(); + try { + String link = Util.resolveSymlink(kid); + if (link == null) { + continue; + } + try { + Integer.parseInt(name); + if (kid.delete()) { + LOGGER.log(Level.FINE, "deleted build number symlink {0} → {1}", new Object[] {name, link}); + } else { + LOGGER.log(Level.WARNING, "could not delete build number symlink {0} → {1}", new Object[] {name, link}); + } + } catch (NumberFormatException x) { + LOGGER.log(Level.FINE, "skipping other symlink {0} → {1}", new Object[] {name, link}); + } + it.remove(); + } catch (Exception x) { + LOGGER.log(Level.WARNING, "failed to process " + kid, x); + } + } + it = kidsList.iterator(); + while (it.hasNext()) { + File kid = it.next(); + try { + String name = kid.getName(); + try { + Integer.parseInt(name); + LOGGER.log(Level.FINE, "skipping new build dir {0}", name); + continue; + } catch (NumberFormatException x) { + // OK, next… + } + if (!kid.isDirectory()) { + LOGGER.log(Level.FINE, "skipping non-directory {0}", name); + continue; + } + long timestamp; + try { + timestamp = LEGACY_ID_FORMATTER.parse(name).getTime(); + } catch (ParseException x) { + LOGGER.log(Level.WARNING, "found unexpected dir {0}", name); + continue; + } + File buildXml = new File(kid, "build.xml"); + if (!buildXml.isFile()) { + LOGGER.log(Level.WARNING, "found no build.xml in {0}", name); + continue; + } + String xml = FileUtils.readFileToString(buildXml, Charsets.UTF_8); + Matcher m = NUMBER_ELT.matcher(xml); + if (!m.find()) { + LOGGER.log(Level.WARNING, "could not find in {0}/build.xml", name); + continue; + } + int number = Integer.parseInt(m.group(1)); + String nl = m.group(2); + xml = m.replaceFirst(" " + name + "" + nl + " " + timestamp + "" + nl); + File newKid = new File(dir, Integer.toString(number)); + if (!kid.renameTo(newKid)) { + LOGGER.log(Level.WARNING, "failed to rename {0} to {1}", new Object[] {name, number}); + continue; + } + FileUtils.writeStringToFile(new File(newKid, "build.xml"), xml, Charsets.UTF_8); + LOGGER.log(Level.FINE, "fully processed {0} → {1}", new Object[] {name, number}); + idToNumber.put(name, number); + } catch (Exception x) { + LOGGER.log(Level.WARNING, "failed to process " + kid, x); + } + } + } + + /** + * Look up a historical run by ID. + * @param id a nonnumeric ID which may be a valid {@link Run#getId} + * @return the corresponding {@link Run#number}, or 0 if unknown + */ + public synchronized int findNumber(@Nonnull String id) { + Integer number = idToNumber.get(id); + return number != null ? number : 0; + } + + /** + * Delete the record of a build. + * @param dir as in {@link Job#getBuildDir} + * @param id a {@link Run#getId} + */ + public synchronized void delete(File dir, String id) { + if (idToNumber.remove(id) != null) { + save(dir); + } + } + +} diff --git a/core/src/main/java/jenkins/model/lazy/AbstractLazyLoadRunMap.java b/core/src/main/java/jenkins/model/lazy/AbstractLazyLoadRunMap.java index 9211f8d046..fa6f53f143 100644 --- a/core/src/main/java/jenkins/model/lazy/AbstractLazyLoadRunMap.java +++ b/core/src/main/java/jenkins/model/lazy/AbstractLazyLoadRunMap.java @@ -138,7 +138,7 @@ public abstract class AbstractLazyLoadRunMap extends AbstractMap i * because the compatibility requires that we make it settable * in the first call after the constructor. */ - private File dir; + protected File dir; @Restricted(NoExternalUse.class) // subclassing other than by RunMap does not guarantee compatibility protected AbstractLazyLoadRunMap(File dir) { @@ -170,7 +170,7 @@ public abstract class AbstractLazyLoadRunMap extends AbstractMap i public final void updateBaseDir(File dir) { this.dir = dir; } - + /** * Let go of all the loaded references. * @@ -341,8 +341,7 @@ public abstract class AbstractLazyLoadRunMap extends AbstractMap i } public R getById(String id) { - int n = Integer.parseInt(id); // TODO also need an index of historical IDs → number - return getByNumber(n); + return getByNumber(Integer.parseInt(id)); } public R getByNumber(int n) { @@ -483,8 +482,10 @@ public abstract class AbstractLazyLoadRunMap extends AbstractMap i */ protected abstract int getNumberOf(R r); - private String getIdOf(R r) { - // TODO see comment in getById + /** + * Subtype to provide {@link Run#getId()} so that this class doesn't have to depend on it. + */ + protected String getIdOf(R r) { return String.valueOf(getNumberOf(r)); } diff --git a/core/src/main/java/jenkins/model/lazy/LazyBuildMixIn.java b/core/src/main/java/jenkins/model/lazy/LazyBuildMixIn.java index e188f193a9..99c48f820b 100644 --- a/core/src/main/java/jenkins/model/lazy/LazyBuildMixIn.java +++ b/core/src/main/java/jenkins/model/lazy/LazyBuildMixIn.java @@ -47,6 +47,7 @@ import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.restrictions.DoNotUse; import static java.util.logging.Level.FINER; +import jenkins.model.RunIdMigrator; /** * Makes it easier to use a lazy {@link RunMap} from a {@link Job} implementation. @@ -89,14 +90,14 @@ public abstract class LazyBuildMixIn & Queue.Task & } /** - * Something to be called from {@link AbstractItem#onCreatedFromScratch}. + * Something to be called from {@link Job#onCreatedFromScratch}. */ public final void onCreatedFromScratch() { builds = createBuildRunMap(); } /** - * Something to be called from {@link AbstractItem#onLoad}. + * Something to be called from {@link Job#onLoad}. */ @SuppressWarnings("unchecked") public void onLoad(ItemGroup parent, String name) throws IOException { @@ -129,11 +130,15 @@ public abstract class LazyBuildMixIn & Queue.Task & } private RunMap createBuildRunMap() { - return new RunMap(asJob().getBuildDir(), new RunMap.Constructor() { + RunMap r = new RunMap(asJob().getBuildDir(), new RunMap.Constructor() { @Override public RunT create(File dir) throws IOException { return loadBuild(dir); } }); + RunIdMigrator runIdMigrator = asJob().runIdMigrator; + assert runIdMigrator != null; + r.runIdMigrator = runIdMigrator; + return r; } /** diff --git a/core/src/test/java/jenkins/model/RunIdMigratorTest.java b/core/src/test/java/jenkins/model/RunIdMigratorTest.java new file mode 100644 index 0000000000..4a75a1377b --- /dev/null +++ b/core/src/test/java/jenkins/model/RunIdMigratorTest.java @@ -0,0 +1,129 @@ +/* + * The MIT License + * + * Copyright 2014 Jesse Glick. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package jenkins.model; + +import hudson.Util; +import hudson.util.StreamTaskListener; +import java.io.File; +import java.nio.charset.Charset; +import java.util.Map; +import java.util.TimeZone; +import java.util.TreeMap; +import java.util.logging.ConsoleHandler; +import java.util.logging.Handler; +import java.util.logging.Level; +import org.apache.commons.io.FileUtils; +import org.junit.Test; +import static org.junit.Assert.*; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Rule; +import org.junit.rules.TemporaryFolder; + +public class RunIdMigratorTest { + + @Rule public TemporaryFolder tmp = new TemporaryFolder(); + + /** Ensures that legacy timestamps are interpreted in a predictable time zone. */ + @BeforeClass public static void timezone() { + TimeZone.setDefault(TimeZone.getTimeZone("EST")); + } + + @BeforeClass public static void logging() { + RunIdMigrator.LOGGER.setLevel(Level.ALL); + Handler handler = new ConsoleHandler(); + handler.setLevel(Level.ALL); + RunIdMigrator.LOGGER.addHandler(handler); + } + + private RunIdMigrator migrator; + private File dir; + + @Before public void init() { + migrator = new RunIdMigrator(); + dir = tmp.getRoot(); + } + + @Test public void newJob() throws Exception { + migrator.created(dir); + assertEquals("{legacyIds=''}", summarize()); + assertEquals(0, migrator.findNumber("whatever")); + migrator.delete(dir, "1"); + migrator = new RunIdMigrator(); + assertFalse(migrator.migrate(dir)); + assertEquals("{legacyIds=''}", summarize()); + } + + @Test public void legacy() throws Exception { + write("2014-01-02_03-04-05/build.xml", "\n\n ok\n 99\n ok\n"); + link("99", "2014-01-02_03-04-05"); + link("lastFailedBuild", "-1"); + link("lastSuccessfulBuild", "99"); + assertTrue(migrator.migrate(dir)); + assertEquals("{99={build.xml='\n\n ok\n 2014-01-02_03-04-05\n 1388649845000\n ok\n'}, lastFailedBuild=→-1, lastSuccessfulBuild=→99, legacyIds='2014-01-02_03-04-05 99\n'}", summarize()); + assertEquals(99, migrator.findNumber("2014-01-02_03-04-05")); + migrator = new RunIdMigrator(); + assertFalse(migrator.migrate(dir)); + assertEquals(99, migrator.findNumber("2014-01-02_03-04-05")); + migrator.delete(dir, "2014-01-02_03-04-05"); + FileUtils.deleteDirectory(new File(dir, "99")); + new File(dir, "lastSuccessfulBuild").delete(); + assertEquals("{lastFailedBuild=→-1, legacyIds=''}", summarize()); + } + + // TODO test sane recovery from various error conditions + + private void write(String file, String text) throws Exception { + FileUtils.write(new File(dir, file), text); + } + + private void link(String symlink, String dest) throws Exception { + Util.createSymlink(dir, dest, symlink, new StreamTaskListener(System.out, Charset.defaultCharset())); + } + + private String summarize() throws Exception { + return summarize(dir); + } + private static String summarize(File dir) throws Exception { + File[] kids = dir.listFiles(); + Map m = new TreeMap(); + for (File kid : kids) { + String notation; + String symlink = Util.resolveSymlink(kid); + if (symlink != null) { + notation = "→" + symlink; + } else if (kid.isFile()) { + notation = "'" + FileUtils.readFileToString(kid) + "'"; + } else if (kid.isDirectory()) { + notation = summarize(kid); + } else { + notation = "?"; + } + m.put(kid.getName(), notation); + } + return m.toString(); + } + +} \ No newline at end of file From 268d20c34135dc05ab0685957238a21047817de3 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Wed, 27 Aug 2014 15:13:51 -0400 Subject: [PATCH 007/701] Be consistent and use Integer.toString rather than String.valueOf. --- core/src/main/java/hudson/model/Run.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/hudson/model/Run.java b/core/src/main/java/hudson/model/Run.java index 45ed064cac..395b7698e3 100644 --- a/core/src/main/java/hudson/model/Run.java +++ b/core/src/main/java/hudson/model/Run.java @@ -978,7 +978,7 @@ public abstract class Run ,RunT extends Run Date: Wed, 27 Aug 2014 15:15:02 -0400 Subject: [PATCH 008/701] Need to synchronize access to LEGACY_ID_FORMATTER. --- core/src/main/java/jenkins/model/RunIdMigrator.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/jenkins/model/RunIdMigrator.java b/core/src/main/java/jenkins/model/RunIdMigrator.java index 9652a90669..e794515e14 100644 --- a/core/src/main/java/jenkins/model/RunIdMigrator.java +++ b/core/src/main/java/jenkins/model/RunIdMigrator.java @@ -30,6 +30,7 @@ import hudson.model.Run; import java.io.File; import java.io.IOException; import java.io.PrintWriter; +import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; @@ -57,7 +58,7 @@ import org.kohsuke.accmod.restrictions.NoExternalUse; public final class RunIdMigrator { static final Logger LOGGER = Logger.getLogger(RunIdMigrator.class.getName()); - private static final SimpleDateFormat LEGACY_ID_FORMATTER = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss"); + private static final DateFormat LEGACY_ID_FORMATTER = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss"); private static final String MAP_FILE = "legacyIds"; /** avoids wasting a map for new jobs */ private static final Map EMPTY = new TreeMap(); @@ -187,7 +188,9 @@ public final class RunIdMigrator { } long timestamp; try { - timestamp = LEGACY_ID_FORMATTER.parse(name).getTime(); + synchronized (LEGACY_ID_FORMATTER) { + timestamp = LEGACY_ID_FORMATTER.parse(name).getTime(); + } } catch (ParseException x) { LOGGER.log(Level.WARNING, "found unexpected dir {0}", name); continue; From d5680873472669b764597a0316f59c2f9bcf505f Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Wed, 27 Aug 2014 15:15:21 -0400 Subject: [PATCH 009/701] Obsolete logic to delete build number symlinks. --- core/src/main/java/hudson/model/Run.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/core/src/main/java/hudson/model/Run.java b/core/src/main/java/hudson/model/Run.java index 395b7698e3..b2753ea4ff 100644 --- a/core/src/main/java/hudson/model/Run.java +++ b/core/src/main/java/hudson/model/Run.java @@ -1453,10 +1453,6 @@ public abstract class Run ,RunT extends Run Date: Wed, 27 Aug 2014 15:17:18 -0400 Subject: [PATCH 010/701] Minimizing diff to master. --- .../main/java/jenkins/model/lazy/AbstractLazyLoadRunMap.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/jenkins/model/lazy/AbstractLazyLoadRunMap.java b/core/src/main/java/jenkins/model/lazy/AbstractLazyLoadRunMap.java index fa6f53f143..147c79d5ae 100644 --- a/core/src/main/java/jenkins/model/lazy/AbstractLazyLoadRunMap.java +++ b/core/src/main/java/jenkins/model/lazy/AbstractLazyLoadRunMap.java @@ -170,7 +170,7 @@ public abstract class AbstractLazyLoadRunMap extends AbstractMap i public final void updateBaseDir(File dir) { this.dir = dir; } - + /** * Let go of all the loaded references. * From a73ba0ac91bce9d0eb6de0e41095847a80851cff Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Wed, 27 Aug 2014 15:18:00 -0400 Subject: [PATCH 011/701] Integer.toString here too. --- core/src/main/java/hudson/model/Run.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/hudson/model/Run.java b/core/src/main/java/hudson/model/Run.java index b2753ea4ff..2232930c65 100644 --- a/core/src/main/java/hudson/model/Run.java +++ b/core/src/main/java/hudson/model/Run.java @@ -963,7 +963,7 @@ public abstract class Run ,RunT extends Run Date: Wed, 27 Aug 2014 15:19:31 -0400 Subject: [PATCH 012/701] A couple of methods that should no longer be @Deprecated. --- core/src/main/java/hudson/model/AbstractBuild.java | 1 - core/src/main/java/hudson/model/Build.java | 1 - 2 files changed, 2 deletions(-) diff --git a/core/src/main/java/hudson/model/AbstractBuild.java b/core/src/main/java/hudson/model/AbstractBuild.java index 520e721893..d1e291d52e 100644 --- a/core/src/main/java/hudson/model/AbstractBuild.java +++ b/core/src/main/java/hudson/model/AbstractBuild.java @@ -167,7 +167,6 @@ public abstract class AbstractBuild

,R extends Abs super(job); } - @Deprecated protected AbstractBuild(P job, Calendar timestamp) { super(job, timestamp); } diff --git a/core/src/main/java/hudson/model/Build.java b/core/src/main/java/hudson/model/Build.java index 30057fd3e7..99073f1b73 100644 --- a/core/src/main/java/hudson/model/Build.java +++ b/core/src/main/java/hudson/model/Build.java @@ -92,7 +92,6 @@ public abstract class Build

,B extends Build> super(project); } - @Deprecated protected Build(P job, Calendar timestamp) { super(job, timestamp); } From a1cf988bfc273c2134d82b760367190276eeccc6 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Wed, 27 Aug 2014 15:22:26 -0400 Subject: [PATCH 013/701] Simplified constructor. --- core/src/main/java/hudson/model/Run.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/core/src/main/java/hudson/model/Run.java b/core/src/main/java/hudson/model/Run.java index 2232930c65..c9f8777200 100644 --- a/core/src/main/java/hudson/model/Run.java +++ b/core/src/main/java/hudson/model/Run.java @@ -275,9 +275,7 @@ public abstract class Run ,RunT extends Run Date: Sat, 11 Oct 2014 08:11:09 -0700 Subject: [PATCH 014/701] Change Jenkins to use a single consistent data-binding field. See also: https://github.com/stapler/stapler/pull/39 This commit includes several changes to accomodate the above change in Stapler (moving away from 'stapler-class'), as well as to make Jenkins consistently use this same JSON field (moving away from 'kind'). NOTE: Stapler will continue to accept 'stapler-class' for backwards compatibility, and similarly this plugin will continue to pass 'stapler-class' for plugins that have keyed off of it. --- core/src/main/java/hudson/model/Descriptor.java | 2 +- .../model/GlobalProjectNamingStrategyConfiguration.java | 2 +- .../hudson/slaves/DumbSlave/configure-entries.jelly | 6 ++++++ core/src/main/resources/lib/form/descriptorRadioList.jelly | 4 ++++ core/src/main/resources/lib/form/dropdownListBlock.jelly | 6 +++++- core/src/main/resources/lib/form/hetero-list.jelly | 3 ++- core/src/main/resources/lib/form/hetero-radio.jelly | 7 +++++-- 7 files changed, 24 insertions(+), 6 deletions(-) diff --git a/core/src/main/java/hudson/model/Descriptor.java b/core/src/main/java/hudson/model/Descriptor.java index bb6eeb2126..18db9bb9e0 100644 --- a/core/src/main/java/hudson/model/Descriptor.java +++ b/core/src/main/java/hudson/model/Descriptor.java @@ -909,7 +909,7 @@ public abstract class Descriptor> implements Saveable { if (formData!=null) { for (Object o : JSONArray.fromObject(formData)) { JSONObject jo = (JSONObject)o; - String kind = jo.getString("kind"); + String kind = jo.getString("$class"); Descriptor d = find(descriptors, kind); if (d != null) { items.add(d.newInstance(req, jo)); diff --git a/core/src/main/java/jenkins/model/GlobalProjectNamingStrategyConfiguration.java b/core/src/main/java/jenkins/model/GlobalProjectNamingStrategyConfiguration.java index 616d3bd2fc..9289a23f1b 100644 --- a/core/src/main/java/jenkins/model/GlobalProjectNamingStrategyConfiguration.java +++ b/core/src/main/java/jenkins/model/GlobalProjectNamingStrategyConfiguration.java @@ -44,7 +44,7 @@ public class GlobalProjectNamingStrategyConfiguration extends GlobalConfiguratio final JSONObject optJSONObject = json.optJSONObject("useProjectNamingStrategy"); if (optJSONObject != null) { final JSONObject strategyObject = optJSONObject.getJSONObject("namingStrategy"); - final String className = strategyObject.getString("stapler-class"); + final String className = strategyObject.getString("$class"); try { Class clazz = Class.forName(className, true, Jenkins.getInstance().getPluginManager().uberClassLoader); final ProjectNamingStrategy strategy = (ProjectNamingStrategy) req.bindJSON(clazz, strategyObject); diff --git a/core/src/main/resources/hudson/slaves/DumbSlave/configure-entries.jelly b/core/src/main/resources/hudson/slaves/DumbSlave/configure-entries.jelly index a2b3407af4..0ca78b7064 100644 --- a/core/src/main/resources/hudson/slaves/DumbSlave/configure-entries.jelly +++ b/core/src/main/resources/hudson/slaves/DumbSlave/configure-entries.jelly @@ -57,8 +57,12 @@ THE SOFTWARE. + + + + @@ -77,7 +81,9 @@ THE SOFTWARE. + + diff --git a/core/src/main/resources/lib/form/descriptorRadioList.jelly b/core/src/main/resources/lib/form/descriptorRadioList.jelly index 5193df8043..675f816c0b 100644 --- a/core/src/main/resources/lib/form/descriptorRadioList.jelly +++ b/core/src/main/resources/lib/form/descriptorRadioList.jelly @@ -54,7 +54,11 @@ THE SOFTWARE. + + + + diff --git a/core/src/main/resources/lib/form/dropdownListBlock.jelly b/core/src/main/resources/lib/form/dropdownListBlock.jelly index d06278a673..ba0d206675 100644 --- a/core/src/main/resources/lib/form/dropdownListBlock.jelly +++ b/core/src/main/resources/lib/form/dropdownListBlock.jelly @@ -52,7 +52,11 @@ THE SOFTWARE. - + + + + + diff --git a/core/src/main/resources/lib/form/hetero-list.jelly b/core/src/main/resources/lib/form/hetero-list.jelly index 985f687e3a..cc85d48448 100644 --- a/core/src/main/resources/lib/form/hetero-list.jelly +++ b/core/src/main/resources/lib/form/hetero-list.jelly @@ -93,12 +93,13 @@ THE SOFTWARE.

+ +
- diff --git a/core/src/main/resources/lib/form/hetero-radio.jelly b/core/src/main/resources/lib/form/hetero-radio.jelly index 027960f9f0..0bb8bca1ed 100644 --- a/core/src/main/resources/lib/form/hetero-radio.jelly +++ b/core/src/main/resources/lib/form/hetero-radio.jelly @@ -48,9 +48,12 @@ THE SOFTWARE. - + + - + + + From 16b46ce27d43c5a53e2f277dbda5760a290b62cc Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Tue, 28 Oct 2014 11:57:30 -0700 Subject: [PATCH 015/701] Typos. --- .../java/hudson/security/PermissionGroup.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/core/src/main/java/hudson/security/PermissionGroup.java b/core/src/main/java/hudson/security/PermissionGroup.java index dc7bdaad25..47cf38acaa 100644 --- a/core/src/main/java/hudson/security/PermissionGroup.java +++ b/core/src/main/java/hudson/security/PermissionGroup.java @@ -42,8 +42,8 @@ import org.jvnet.localizer.Localizable; * Sortable by the owner class name. */ public final class PermissionGroup implements Iterable, Comparable { - private final List permisisons = new CopyOnWriteArrayList(); - private final List permisisonsView = Collections.unmodifiableList(permisisons); + private final List permissions = new CopyOnWriteArrayList(); + private final List permissionsView = Collections.unmodifiableList(permissions); public final Class owner; /** @@ -67,22 +67,22 @@ public final class PermissionGroup implements Iterable, Comparable

iterator() { - return permisisons.iterator(); + return permissions.iterator(); } /*package*/ void add(Permission p) { - permisisons.add(p); + permissions.add(p); } /** * Lists up all the permissions in this group. */ public List getPermissions() { - return permisisonsView; + return permissionsView; } public boolean hasPermissionContainedBy(PermissionScope scope) { - for (Permission p : permisisons) + for (Permission p : permissions) if (p.isContainedBy(scope)) return true; return false; @@ -92,7 +92,7 @@ public final class PermissionGroup implements Iterable, Comparable

, Comparable

Date: Tue, 28 Oct 2014 15:42:17 -0400 Subject: [PATCH 016/701] JUnit 4. --- .../hudson/security/PermissionGroupTest.java | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/test/src/test/java/hudson/security/PermissionGroupTest.java b/test/src/test/java/hudson/security/PermissionGroupTest.java index b06d4e02a4..4d2cda7204 100644 --- a/test/src/test/java/hudson/security/PermissionGroupTest.java +++ b/test/src/test/java/hudson/security/PermissionGroupTest.java @@ -24,18 +24,24 @@ package hudson.security; import jenkins.model.Jenkins; -import org.jvnet.hudson.test.HudsonTestCase; +import static org.junit.Assert.*; +import org.junit.Rule; +import org.junit.Test; import org.jvnet.hudson.test.Email; +import org.jvnet.hudson.test.JenkinsRule; /** * @author Kohsuke Kawaguchi */ -public class PermissionGroupTest extends HudsonTestCase { +public class PermissionGroupTest { + + @Rule public JenkinsRule r = new JenkinsRule(); + /** - * "Overall" persmission group should be always the first. + * "Overall" permission group should be always the first. */ - @Email("http://www.nabble.com/Master-slave-refactor-td21361880.html") - public void testOrder() { + @Email("http://jenkins-ci.361315.n4.nabble.com/Master-slave-refactor-tp391495.html") + @Test public void order() { assertSame(PermissionGroup.getAll().get(0), Jenkins.PERMISSIONS); } } From 8878c7fa5b2bc129b6185ed44d8c160a4c4bd651 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Tue, 28 Oct 2014 16:18:20 -0400 Subject: [PATCH 017/701] Prevent duplicate Permission or PermissionGroup objects from being created. --- .../main/java/hudson/security/Permission.java | 8 ++ .../java/hudson/security/PermissionGroup.java | 82 +++++++++++-------- .../hudson/security/PermissionGroupTest.java | 16 +++- 3 files changed, 67 insertions(+), 39 deletions(-) diff --git a/core/src/main/java/hudson/security/Permission.java b/core/src/main/java/hudson/security/Permission.java index 20c43b0980..785b3070c9 100644 --- a/core/src/main/java/hudson/security/Permission.java +++ b/core/src/main/java/hudson/security/Permission.java @@ -221,6 +221,14 @@ public final class Permission { return owner.getName()+'.'+name; } + @Override public boolean equals(Object o) { + return o instanceof Permission && getId().equals(((Permission) o).getId()); + } + + @Override public int hashCode() { + return getId().hashCode(); + } + /** * Convert the ID representation into {@link Permission} object. * diff --git a/core/src/main/java/hudson/security/PermissionGroup.java b/core/src/main/java/hudson/security/PermissionGroup.java index 47cf38acaa..648c5786e4 100644 --- a/core/src/main/java/hudson/security/PermissionGroup.java +++ b/core/src/main/java/hudson/security/PermissionGroup.java @@ -23,17 +23,13 @@ */ package hudson.security; -import hudson.CopyOnWrite; import hudson.model.Hudson; - -import java.util.List; -import java.util.Collections; import java.util.ArrayList; import java.util.Iterator; -import java.util.Map; -import java.util.concurrent.CopyOnWriteArrayList; -import java.util.concurrent.ConcurrentHashMap; - +import java.util.List; +import java.util.SortedSet; +import java.util.TreeSet; +import javax.annotation.CheckForNull; import org.jvnet.localizer.Localizable; /** @@ -42,8 +38,7 @@ import org.jvnet.localizer.Localizable; * Sortable by the owner class name. */ public final class PermissionGroup implements Iterable, Comparable { - private final List permissions = new CopyOnWriteArrayList(); - private final List permissionsView = Collections.unmodifiableList(permissions); + private final SortedSet permissions = new TreeSet(Permission.ID_COMPARATOR); public final Class owner; /** @@ -55,33 +50,31 @@ public final class PermissionGroup implements Iterable, Comparable

allGroups = new ArrayList(ALL); - allGroups.add(this); - Collections.sort(allGroups); - ALL = Collections.unmodifiableList(allGroups); - } - - PERMISSIONS.put(owner,this); + private String id() { + return owner.getName(); } public Iterator iterator() { - return permissions.iterator(); + return getPermissions().iterator(); } - /*package*/ void add(Permission p) { - permissions.add(p); + /*package*/ synchronized void add(Permission p) { + if (!permissions.add(p)) { + throw new IllegalStateException("attempt to register a second Permission for " + p.getId()); + } } /** * Lists up all the permissions in this group. */ - public List getPermissions() { - return permissionsView; + public synchronized List getPermissions() { + return new ArrayList(permissions); } - public boolean hasPermissionContainedBy(PermissionScope scope) { + public synchronized boolean hasPermissionContainedBy(PermissionScope scope) { for (Permission p : permissions) if (p.isContainedBy(scope)) return true; @@ -91,7 +84,7 @@ public final class PermissionGroup implements Iterable, Comparable

, Comparable

, Comparable

ALL = Collections.emptyList(); + @Override public String toString() { + return "PermissionGroup[" + id() + "]"; + } + + private static synchronized void register(PermissionGroup g) { + if (!PERMISSIONS.add(g)) { + throw new IllegalStateException("attempt to register a second PermissionGroup for " + g.id()); + } + } /** * Returns all the {@link PermissionGroup}s available in the system. * @return * always non-null. Read-only. */ - public static List getAll() { - return ALL; + public static synchronized List getAll() { + return new ArrayList(PERMISSIONS); } /** @@ -139,12 +144,17 @@ public final class PermissionGroup implements Iterable, Comparable

PERMISSIONS = new ConcurrentHashMap(); + private static final SortedSet PERMISSIONS = new TreeSet(); } diff --git a/test/src/test/java/hudson/security/PermissionGroupTest.java b/test/src/test/java/hudson/security/PermissionGroupTest.java index 4d2cda7204..ebcae065ea 100644 --- a/test/src/test/java/hudson/security/PermissionGroupTest.java +++ b/test/src/test/java/hudson/security/PermissionGroupTest.java @@ -23,6 +23,8 @@ */ package hudson.security; +import hudson.model.Hudson; +import hudson.model.Messages; import jenkins.model.Jenkins; import static org.junit.Assert.*; import org.junit.Rule; @@ -30,9 +32,6 @@ import org.junit.Test; import org.jvnet.hudson.test.Email; import org.jvnet.hudson.test.JenkinsRule; -/** - * @author Kohsuke Kawaguchi - */ public class PermissionGroupTest { @Rule public JenkinsRule r = new JenkinsRule(); @@ -44,4 +43,15 @@ public class PermissionGroupTest { @Test public void order() { assertSame(PermissionGroup.getAll().get(0), Jenkins.PERMISSIONS); } + + @SuppressWarnings("ResultOfObjectAllocationIgnored") + @Test(expected=IllegalStateException.class) public void duplicatedGroups() { + new PermissionGroup(Hudson.class, Messages._Hudson_Permissions_Title()); + } + + @SuppressWarnings("ResultOfObjectAllocationIgnored") + @Test(expected=IllegalStateException.class) public void duplicatedPermissions() { + new Permission(Jenkins.PERMISSIONS, "Read", Messages._Hudson_ReadPermission_Description(), Permission.READ, PermissionScope.JENKINS); + } + } From cef6b49058d2258ce9b7b87405ee453d5f0b8ceb Mon Sep 17 00:00:00 2001 From: Matt Moore Date: Wed, 29 Oct 2014 12:28:28 -0700 Subject: [PATCH 018/701] Surface a new class-entry form tag for submitting the appropriate invisible $class form field --- .../slaves/DumbSlave/configure-entries.jelly | 14 +----- .../main/resources/lib/form/class-entry.jelly | 43 +++++++++++++++++++ .../lib/form/descriptorRadioList.jelly | 8 +--- .../lib/form/dropdownListBlock.jelly | 13 ++---- .../main/resources/lib/form/hetero-list.jelly | 4 +- .../resources/lib/form/hetero-radio.jelly | 9 +--- 6 files changed, 52 insertions(+), 39 deletions(-) create mode 100644 core/src/main/resources/lib/form/class-entry.jelly diff --git a/core/src/main/resources/hudson/slaves/DumbSlave/configure-entries.jelly b/core/src/main/resources/hudson/slaves/DumbSlave/configure-entries.jelly index 0ca78b7064..667e123f29 100644 --- a/core/src/main/resources/hudson/slaves/DumbSlave/configure-entries.jelly +++ b/core/src/main/resources/hudson/slaves/DumbSlave/configure-entries.jelly @@ -56,13 +56,7 @@ THE SOFTWARE. - - - - - - - + @@ -80,11 +74,7 @@ THE SOFTWARE. - - - - - + diff --git a/core/src/main/resources/lib/form/class-entry.jelly b/core/src/main/resources/lib/form/class-entry.jelly new file mode 100644 index 0000000000..ab0bf16070 --- /dev/null +++ b/core/src/main/resources/lib/form/class-entry.jelly @@ -0,0 +1,43 @@ + + + + + Invisible <f:entry> type for embedding a descriptor's $class field. + + The describable class that we are instantiating via structured form submission. + + + The descriptor of the describable that we are instantiating via + structured form submission. Mutually exclusive with clazz. + + + + + + + + + \ No newline at end of file diff --git a/core/src/main/resources/lib/form/descriptorRadioList.jelly b/core/src/main/resources/lib/form/descriptorRadioList.jelly index 675f816c0b..6e20b815e6 100644 --- a/core/src/main/resources/lib/form/descriptorRadioList.jelly +++ b/core/src/main/resources/lib/form/descriptorRadioList.jelly @@ -53,13 +53,7 @@ THE SOFTWARE. title="${d.displayName}" checked="${instance.descriptor==d}"> - - - - - - - + diff --git a/core/src/main/resources/lib/form/dropdownListBlock.jelly b/core/src/main/resources/lib/form/dropdownListBlock.jelly index ba0d206675..426c61fd41 100644 --- a/core/src/main/resources/lib/form/dropdownListBlock.jelly +++ b/core/src/main/resources/lib/form/dropdownListBlock.jelly @@ -50,15 +50,7 @@ THE SOFTWARE. - - - - - - - - - + @@ -69,6 +61,9 @@ THE SOFTWARE. + + + diff --git a/core/src/main/resources/lib/form/hetero-list.jelly b/core/src/main/resources/lib/form/hetero-list.jelly index cc85d48448..0f969e2aba 100644 --- a/core/src/main/resources/lib/form/hetero-list.jelly +++ b/core/src/main/resources/lib/form/hetero-list.jelly @@ -91,11 +91,9 @@ THE SOFTWARE. +

- - -
diff --git a/core/src/main/resources/lib/form/hetero-radio.jelly b/core/src/main/resources/lib/form/hetero-radio.jelly index 0bb8bca1ed..45eee1e302 100644 --- a/core/src/main/resources/lib/form/hetero-radio.jelly +++ b/core/src/main/resources/lib/form/hetero-radio.jelly @@ -47,14 +47,7 @@ THE SOFTWARE. - - - - - - - - + From 4de46465153dae1a9e804c0d526c44d528f00fb4 Mon Sep 17 00:00:00 2001 From: Matt Moore Date: Sat, 1 Nov 2014 10:07:21 -0700 Subject: [PATCH 019/701] add back kind for backwards compatibility, until plugins can be staged onto $class --- core/src/main/java/hudson/model/Descriptor.java | 6 +++++- core/src/main/resources/lib/form/class-entry.jelly | 4 ++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/hudson/model/Descriptor.java b/core/src/main/java/hudson/model/Descriptor.java index 18db9bb9e0..2b5bcef0cf 100644 --- a/core/src/main/java/hudson/model/Descriptor.java +++ b/core/src/main/java/hudson/model/Descriptor.java @@ -909,7 +909,11 @@ public abstract class Descriptor> implements Saveable { if (formData!=null) { for (Object o : JSONArray.fromObject(formData)) { JSONObject jo = (JSONObject)o; - String kind = jo.getString("$class"); + String kind = jo.optString("$class", null); + if (kind == null) { + // Legacy: Remove once plugins have been staged onto $class + kind = jo.getString("kind"); + } Descriptor d = find(descriptors, kind); if (d != null) { items.add(d.newInstance(req, jo)); diff --git a/core/src/main/resources/lib/form/class-entry.jelly b/core/src/main/resources/lib/form/class-entry.jelly index ab0bf16070..e03af3a754 100644 --- a/core/src/main/resources/lib/form/class-entry.jelly +++ b/core/src/main/resources/lib/form/class-entry.jelly @@ -38,6 +38,10 @@ THE SOFTWARE. + + + + \ No newline at end of file From 3732aba5fe0d4a55847ae79496a81e5207f2acfc Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Tue, 4 Nov 2014 21:35:43 -0500 Subject: [PATCH 020/701] Update Guice to 4.0-beta5. --- core/pom.xml | 1 - pom.xml | 3 +-- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/core/pom.xml b/core/pom.xml index 008b87bcb6..ef6cd33ea6 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -96,7 +96,6 @@ THE SOFTWARE. com.google.inject guice - no_aop diff --git a/pom.xml b/pom.xml index cfb3e491c7..fc152ad86a 100644 --- a/pom.xml +++ b/pom.xml @@ -185,8 +185,7 @@ THE SOFTWARE. com.google.inject guice - 4.0-beta - no_aop + 4.0-beta5 From 2e778e49383800e8cccd17b64b409364d76424e1 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Mon, 10 Nov 2014 15:44:20 -0500 Subject: [PATCH 021/701] Document that IllegalStateException will be thrown for a duplicate Permission or PermissionGroup. --- core/src/main/java/hudson/security/Permission.java | 3 ++- core/src/main/java/hudson/security/PermissionGroup.java | 8 +++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/hudson/security/Permission.java b/core/src/main/java/hudson/security/Permission.java index 785b3070c9..7c758072da 100644 --- a/core/src/main/java/hudson/security/Permission.java +++ b/core/src/main/java/hudson/security/Permission.java @@ -144,10 +144,11 @@ public final class Permission { * See {@link #description}. * @param impliedBy * See {@link #impliedBy}. + * @throws IllegalStateException if this permission was already defined */ public Permission(@Nonnull PermissionGroup group, @Nonnull String name, @CheckForNull Localizable description, @CheckForNull Permission impliedBy, boolean enable, - @Nonnull PermissionScope[] scopes) { + @Nonnull PermissionScope[] scopes) throws IllegalStateException { if(!JSONUtils.isJavaIdentifier(name)) throw new IllegalArgumentException(name+" is not a Java identifier"); this.owner = group.owner; diff --git a/core/src/main/java/hudson/security/PermissionGroup.java b/core/src/main/java/hudson/security/PermissionGroup.java index 648c5786e4..9ffb5bfcef 100644 --- a/core/src/main/java/hudson/security/PermissionGroup.java +++ b/core/src/main/java/hudson/security/PermissionGroup.java @@ -47,7 +47,13 @@ public final class PermissionGroup implements Iterable, Comparable

Date: Mon, 10 Nov 2014 15:45:24 -0500 Subject: [PATCH 022/701] Enforcing consistent synchronization of PermissionGroup.permissions. --- core/src/main/java/hudson/security/PermissionGroup.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/hudson/security/PermissionGroup.java b/core/src/main/java/hudson/security/PermissionGroup.java index 9ffb5bfcef..724e359462 100644 --- a/core/src/main/java/hudson/security/PermissionGroup.java +++ b/core/src/main/java/hudson/security/PermissionGroup.java @@ -122,7 +122,7 @@ public final class PermissionGroup implements Iterable, Comparable

Date: Fri, 21 Nov 2014 22:05:25 -0800 Subject: [PATCH 023/701] Fix typoo. --- war/src/main/webapp/WEB-INF/web.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/war/src/main/webapp/WEB-INF/web.xml b/war/src/main/webapp/WEB-INF/web.xml index 68f6082e60..bb63b161a9 100644 --- a/war/src/main/webapp/WEB-INF/web.xml +++ b/war/src/main/webapp/WEB-INF/web.xml @@ -148,7 +148,7 @@ THE SOFTWARE. From e382bbae1b0deefdce458eed72ce025eb91d1855 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20Gond=C5=BEa?= Date: Sun, 7 Dec 2014 18:32:51 +0100 Subject: [PATCH 024/701] [FIXED JENKINS-23797] Produce human readable output in DiskSpaceMonitorDescriptor.DiskSpace.toString() --- .../DiskSpaceMonitorDescriptor.java | 2 +- .../DiskSpace/cause.jelly | 2 +- .../DiskSpace/cause.properties | 22 ---------------- .../DiskSpace/cause_da.properties | 23 ----------------- .../DiskSpace/cause_de.properties | 23 ----------------- .../DiskSpace/cause_es.properties | 23 ----------------- .../DiskSpace/cause_fr.properties | 3 --- .../DiskSpace/cause_ja.properties | 23 ----------------- .../DiskSpace/cause_pt.properties | 24 ------------------ .../DiskSpace/cause_pt_BR.properties | 25 ------------------- .../DiskSpace/cause_sv_SE.properties | 23 ----------------- .../DiskSpace/cause_zh_TW.properties | 23 ----------------- .../hudson/node_monitors/Messages.properties | 1 + ...e_cs.properties => Messages_cs.properties} | 2 +- .../node_monitors/Messages_da.properties | 1 + .../node_monitors/Messages_de.properties | 5 +--- .../node_monitors/Messages_es.properties | 1 + .../node_monitors/Messages_fr.properties | 1 + .../node_monitors/Messages_ja.properties | 3 ++- .../node_monitors/Messages_nl.properties | 3 ++- .../node_monitors/Messages_pt.properties | 1 + .../node_monitors/Messages_pt_BR.properties | 2 ++ ...l.properties => Messages_sv_SE.properties} | 2 +- .../node_monitors/Messages_zh_TW.properties | 1 + 24 files changed, 17 insertions(+), 222 deletions(-) delete mode 100644 core/src/main/resources/hudson/node_monitors/DiskSpaceMonitorDescriptor/DiskSpace/cause.properties delete mode 100644 core/src/main/resources/hudson/node_monitors/DiskSpaceMonitorDescriptor/DiskSpace/cause_da.properties delete mode 100644 core/src/main/resources/hudson/node_monitors/DiskSpaceMonitorDescriptor/DiskSpace/cause_de.properties delete mode 100644 core/src/main/resources/hudson/node_monitors/DiskSpaceMonitorDescriptor/DiskSpace/cause_es.properties delete mode 100644 core/src/main/resources/hudson/node_monitors/DiskSpaceMonitorDescriptor/DiskSpace/cause_fr.properties delete mode 100644 core/src/main/resources/hudson/node_monitors/DiskSpaceMonitorDescriptor/DiskSpace/cause_ja.properties delete mode 100644 core/src/main/resources/hudson/node_monitors/DiskSpaceMonitorDescriptor/DiskSpace/cause_pt.properties delete mode 100644 core/src/main/resources/hudson/node_monitors/DiskSpaceMonitorDescriptor/DiskSpace/cause_pt_BR.properties delete mode 100644 core/src/main/resources/hudson/node_monitors/DiskSpaceMonitorDescriptor/DiskSpace/cause_sv_SE.properties delete mode 100644 core/src/main/resources/hudson/node_monitors/DiskSpaceMonitorDescriptor/DiskSpace/cause_zh_TW.properties rename core/src/main/resources/hudson/node_monitors/{DiskSpaceMonitorDescriptor/DiskSpace/cause_cs.properties => Messages_cs.properties} (90%) rename core/src/main/resources/hudson/node_monitors/{DiskSpaceMonitorDescriptor/DiskSpace/cause_nl.properties => Messages_sv_SE.properties} (92%) diff --git a/core/src/main/java/hudson/node_monitors/DiskSpaceMonitorDescriptor.java b/core/src/main/java/hudson/node_monitors/DiskSpaceMonitorDescriptor.java index 37e4b385f1..733be3d5c3 100644 --- a/core/src/main/java/hudson/node_monitors/DiskSpaceMonitorDescriptor.java +++ b/core/src/main/java/hudson/node_monitors/DiskSpaceMonitorDescriptor.java @@ -70,7 +70,7 @@ public abstract class DiskSpaceMonitorDescriptor extends AbstractAsyncNodeMonito @Override public String toString() { - return String.valueOf(size); + return Messages.DiskSpaceMonitorDescriptor_DiskSpace_FreeSpaceTooLow(getGbLeft(), path); } /** diff --git a/core/src/main/resources/hudson/node_monitors/DiskSpaceMonitorDescriptor/DiskSpace/cause.jelly b/core/src/main/resources/hudson/node_monitors/DiskSpaceMonitorDescriptor/DiskSpace/cause.jelly index c3139c8deb..60accc8277 100644 --- a/core/src/main/resources/hudson/node_monitors/DiskSpaceMonitorDescriptor/DiskSpace/cause.jelly +++ b/core/src/main/resources/hudson/node_monitors/DiskSpaceMonitorDescriptor/DiskSpace/cause.jelly @@ -24,5 +24,5 @@ THE SOFTWARE. -

${%blurb(it.gbLeft, it.path)}

+

${it}

diff --git a/core/src/main/resources/hudson/node_monitors/DiskSpaceMonitorDescriptor/DiskSpace/cause.properties b/core/src/main/resources/hudson/node_monitors/DiskSpaceMonitorDescriptor/DiskSpace/cause.properties deleted file mode 100644 index b819ae6efc..0000000000 --- a/core/src/main/resources/hudson/node_monitors/DiskSpaceMonitorDescriptor/DiskSpace/cause.properties +++ /dev/null @@ -1,22 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc. -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. -blurb=Disk space is too low. Only {0}GB left on {1}. \ No newline at end of file diff --git a/core/src/main/resources/hudson/node_monitors/DiskSpaceMonitorDescriptor/DiskSpace/cause_da.properties b/core/src/main/resources/hudson/node_monitors/DiskSpaceMonitorDescriptor/DiskSpace/cause_da.properties deleted file mode 100644 index cea15312ae..0000000000 --- a/core/src/main/resources/hudson/node_monitors/DiskSpaceMonitorDescriptor/DiskSpace/cause_da.properties +++ /dev/null @@ -1,23 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2010, Sun Microsystems, Inc. Kohsuke Kawaguchi. Knud Poulsen. -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -blurb=Disk plads for lav. Kun {0}GB tilbage. diff --git a/core/src/main/resources/hudson/node_monitors/DiskSpaceMonitorDescriptor/DiskSpace/cause_de.properties b/core/src/main/resources/hudson/node_monitors/DiskSpaceMonitorDescriptor/DiskSpace/cause_de.properties deleted file mode 100644 index b5e4ec1f5d..0000000000 --- a/core/src/main/resources/hudson/node_monitors/DiskSpaceMonitorDescriptor/DiskSpace/cause_de.properties +++ /dev/null @@ -1,23 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Simon Wiest -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -blurb=Zu wenig Festplattenplatz: Nur noch {0}GB frei. \ No newline at end of file diff --git a/core/src/main/resources/hudson/node_monitors/DiskSpaceMonitorDescriptor/DiskSpace/cause_es.properties b/core/src/main/resources/hudson/node_monitors/DiskSpaceMonitorDescriptor/DiskSpace/cause_es.properties deleted file mode 100644 index fc3c56ea60..0000000000 --- a/core/src/main/resources/hudson/node_monitors/DiskSpaceMonitorDescriptor/DiskSpace/cause_es.properties +++ /dev/null @@ -1,23 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc. -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. -blurb=El espacio en disco es muy bajo, sólo quedan {0}GB. - diff --git a/core/src/main/resources/hudson/node_monitors/DiskSpaceMonitorDescriptor/DiskSpace/cause_fr.properties b/core/src/main/resources/hudson/node_monitors/DiskSpaceMonitorDescriptor/DiskSpace/cause_fr.properties deleted file mode 100644 index 10f3c1c961..0000000000 --- a/core/src/main/resources/hudson/node_monitors/DiskSpaceMonitorDescriptor/DiskSpace/cause_fr.properties +++ /dev/null @@ -1,3 +0,0 @@ -# This file is under the MIT License by authors - -blurb=Espace disque insuffisant. Seulement {0} GB restant sur {1} diff --git a/core/src/main/resources/hudson/node_monitors/DiskSpaceMonitorDescriptor/DiskSpace/cause_ja.properties b/core/src/main/resources/hudson/node_monitors/DiskSpaceMonitorDescriptor/DiskSpace/cause_ja.properties deleted file mode 100644 index c8f2f16028..0000000000 --- a/core/src/main/resources/hudson/node_monitors/DiskSpaceMonitorDescriptor/DiskSpace/cause_ja.properties +++ /dev/null @@ -1,23 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Seiji Sogabe -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -blurb=\u30C7\u30A3\u30B9\u30AF\u5BB9\u91CF\u304C\u5C11\u306A\u3059\u304E\u307E\u3059\u3002\u6B8B\u308A{0}GB\u3067\u3059\u3002 \ No newline at end of file diff --git a/core/src/main/resources/hudson/node_monitors/DiskSpaceMonitorDescriptor/DiskSpace/cause_pt.properties b/core/src/main/resources/hudson/node_monitors/DiskSpaceMonitorDescriptor/DiskSpace/cause_pt.properties deleted file mode 100644 index a34a5d7f01..0000000000 --- a/core/src/main/resources/hudson/node_monitors/DiskSpaceMonitorDescriptor/DiskSpace/cause_pt.properties +++ /dev/null @@ -1,24 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributers -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -# Disk space is too low. Only {0}GB left on {1}. -blurb=Espa\u00e7o em disco est\u00e1 acabando, apenas {0}Gb livre em {1}. diff --git a/core/src/main/resources/hudson/node_monitors/DiskSpaceMonitorDescriptor/DiskSpace/cause_pt_BR.properties b/core/src/main/resources/hudson/node_monitors/DiskSpaceMonitorDescriptor/DiskSpace/cause_pt_BR.properties deleted file mode 100644 index dd77f65782..0000000000 --- a/core/src/main/resources/hudson/node_monitors/DiskSpaceMonitorDescriptor/DiskSpace/cause_pt_BR.properties +++ /dev/null @@ -1,25 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2010, Sun Microsystems, Inc., Cleiber Silva -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -# Disk space is too low. Only {0}GB left. -blurb=Pouco espa\u00e7o em disco. Somente {0}GB restante. - diff --git a/core/src/main/resources/hudson/node_monitors/DiskSpaceMonitorDescriptor/DiskSpace/cause_sv_SE.properties b/core/src/main/resources/hudson/node_monitors/DiskSpaceMonitorDescriptor/DiskSpace/cause_sv_SE.properties deleted file mode 100644 index 5537bb8e4b..0000000000 --- a/core/src/main/resources/hudson/node_monitors/DiskSpaceMonitorDescriptor/DiskSpace/cause_sv_SE.properties +++ /dev/null @@ -1,23 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2010, Sun Microsystems, Inc. -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -blurb=Diskutrymme l\u00E5gt. Enbart {0}GB kvar. diff --git a/core/src/main/resources/hudson/node_monitors/DiskSpaceMonitorDescriptor/DiskSpace/cause_zh_TW.properties b/core/src/main/resources/hudson/node_monitors/DiskSpaceMonitorDescriptor/DiskSpace/cause_zh_TW.properties deleted file mode 100644 index 3f970fc0e6..0000000000 --- a/core/src/main/resources/hudson/node_monitors/DiskSpaceMonitorDescriptor/DiskSpace/cause_zh_TW.properties +++ /dev/null @@ -1,23 +0,0 @@ -# The MIT License -# -# Copyright (c) 2013, Chunghwa Telecom Co., Ltd., Pei-Tang Huang -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -blurb=\u78c1\u789f\u7a7a\u9593\u592a\u5c11\u3002{1} \u4e0a\u53ea\u5269 {0}GB\u3002 diff --git a/core/src/main/resources/hudson/node_monitors/Messages.properties b/core/src/main/resources/hudson/node_monitors/Messages.properties index 001e643a6c..4b46e200b1 100644 --- a/core/src/main/resources/hudson/node_monitors/Messages.properties +++ b/core/src/main/resources/hudson/node_monitors/Messages.properties @@ -31,3 +31,4 @@ ResponseTimeMonitor.TimeOut=Time out for last {0} try SwapSpaceMonitor.DisplayName=Free Swap Space TemporarySpaceMonitor.DisplayName=Free Temp Space AbstractNodeMonitorDescriptor.NoDataYet=Not yet +DiskSpaceMonitorDescriptor.DiskSpace.FreeSpaceTooLow=Disk space is too low. Only {0}GB left on {1}. diff --git a/core/src/main/resources/hudson/node_monitors/DiskSpaceMonitorDescriptor/DiskSpace/cause_cs.properties b/core/src/main/resources/hudson/node_monitors/Messages_cs.properties similarity index 90% rename from core/src/main/resources/hudson/node_monitors/DiskSpaceMonitorDescriptor/DiskSpace/cause_cs.properties rename to core/src/main/resources/hudson/node_monitors/Messages_cs.properties index d74adadeb2..0db0a21c26 100644 --- a/core/src/main/resources/hudson/node_monitors/DiskSpaceMonitorDescriptor/DiskSpace/cause_cs.properties +++ b/core/src/main/resources/hudson/node_monitors/Messages_cs.properties @@ -20,4 +20,4 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -blurb=M\u00E1lo m\u00EDsta na disku. Zb\u00FDv\u00E1 pouze {0}GB. +DiskSpaceMonitorDescriptor.DiskSpace.FreeSpaceTooLow=M\u00E1lo m\u00EDsta na disku. Zb\u00FDv\u00E1 pouze {0}GB. diff --git a/core/src/main/resources/hudson/node_monitors/Messages_da.properties b/core/src/main/resources/hudson/node_monitors/Messages_da.properties index 446f325e83..f6a2269024 100644 --- a/core/src/main/resources/hudson/node_monitors/Messages_da.properties +++ b/core/src/main/resources/hudson/node_monitors/Messages_da.properties @@ -29,3 +29,4 @@ SwapSpaceMonitor.DisplayName=Ledig Swap Plads ArchitectureMonitor.DisplayName=Arkitektur ResponseTimeMonitor.MarkedOffline=Tager {0} offline midlertidigt da den ikke svarer ResponseTimeMonitor.DisplayName=Respons Tid +DiskSpaceMonitorDescriptor.DiskSpace.FreeSpaceTooLow=Disk plads for lav. Kun {0}GB tilbage. diff --git a/core/src/main/resources/hudson/node_monitors/Messages_de.properties b/core/src/main/resources/hudson/node_monitors/Messages_de.properties index 4bbeb7475a..704bc5835b 100644 --- a/core/src/main/resources/hudson/node_monitors/Messages_de.properties +++ b/core/src/main/resources/hudson/node_monitors/Messages_de.properties @@ -29,7 +29,4 @@ ResponseTimeMonitor.MarkedOffline=Nehme {0} tempor ResponseTimeMonitor.TimeOut= {0} mal keine Antwort SwapSpaceMonitor.DisplayName=Freier Swap Space TemporarySpaceMonitor.DisplayName=Freier TEMP-Platz - - - - \ No newline at end of file +DiskSpaceMonitorDescriptor.DiskSpace.FreeSpaceTooLow=Zu wenig Festplattenplatz: Nur noch {0}GB frei. diff --git a/core/src/main/resources/hudson/node_monitors/Messages_es.properties b/core/src/main/resources/hudson/node_monitors/Messages_es.properties index 67c6fd3a45..ac098af577 100644 --- a/core/src/main/resources/hudson/node_monitors/Messages_es.properties +++ b/core/src/main/resources/hudson/node_monitors/Messages_es.properties @@ -29,3 +29,4 @@ ResponseTimeMonitor.MarkedOffline=Poniendo temporalmente {0} fuera de l ResponseTimeMonitor.TimeOut=Se sobrepasó el tiempo de espera en el último intento de {0} SwapSpaceMonitor.DisplayName=Espacio de intercambio libre TemporarySpaceMonitor.DisplayName=Espacio temporal libre +DiskSpaceMonitorDescriptor.DiskSpace.FreeSpaceTooLow=El espacio en disco es muy bajo, sólo quedan {0}GB. diff --git a/core/src/main/resources/hudson/node_monitors/Messages_fr.properties b/core/src/main/resources/hudson/node_monitors/Messages_fr.properties index f423b21b80..845fd6deb2 100644 --- a/core/src/main/resources/hudson/node_monitors/Messages_fr.properties +++ b/core/src/main/resources/hudson/node_monitors/Messages_fr.properties @@ -28,3 +28,4 @@ ResponseTimeMonitor.DisplayName=Temps de r\u00e9ponse ResponseTimeMonitor.MarkedOffline={0} est marqu\u00e9 comme d\u00e9connect\u00e9 temporairement, parce qu''il ne r\u00e9pond pas ResponseTimeMonitor.TimeOut=Time out du dernier essai {0} SwapSpaceMonitor.DisplayName=Espace de swap disponible +DiskSpaceMonitorDescriptor.DiskSpace.FreeSpaceTooLow=Espace disque insuffisant. Seulement {0} GB restant sur {1} diff --git a/core/src/main/resources/hudson/node_monitors/Messages_ja.properties b/core/src/main/resources/hudson/node_monitors/Messages_ja.properties index 9596aaa52e..9f545b5d82 100644 --- a/core/src/main/resources/hudson/node_monitors/Messages_ja.properties +++ b/core/src/main/resources/hudson/node_monitors/Messages_ja.properties @@ -30,4 +30,5 @@ ResponseTimeMonitor.MarkedOffline=\u5fdc\u7b54\u3057\u306a\u3044\u305f\u3081\u30 ResponseTimeMonitor.TimeOut=\u30bf\u30a4\u30e0\u30a2\u30a6\u30c8(\u76f4\u8fd1 {0}\u56de) SwapSpaceMonitor.DisplayName=\u7a7a\u304d\u30b9\u30ef\u30c3\u30d7\u5bb9\u91cf TemporarySpaceMonitor.DisplayName=\u7a7a\u304d\u30c6\u30f3\u30dd\u30e9\u30ea\u5bb9\u91cf -AbstractNodeMonitorDescriptor.NoDataYet=\u30c7\u30fc\u30bf\u672a\u53d6\u5f97 \ No newline at end of file +AbstractNodeMonitorDescriptor.NoDataYet=\u30c7\u30fc\u30bf\u672a\u53d6\u5f97 +DiskSpaceMonitorDescriptor.DiskSpace.FreeSpaceTooLow=\u30C7\u30A3\u30B9\u30AF\u5BB9\u91CF\u304C\u5C11\u306A\u3059\u304E\u307E\u3059\u3002\u6B8B\u308A{0}GB\u3067\u3059\u3002 diff --git a/core/src/main/resources/hudson/node_monitors/Messages_nl.properties b/core/src/main/resources/hudson/node_monitors/Messages_nl.properties index 3745647077..4a0fecb3a3 100644 --- a/core/src/main/resources/hudson/node_monitors/Messages_nl.properties +++ b/core/src/main/resources/hudson/node_monitors/Messages_nl.properties @@ -22,4 +22,5 @@ ArchitectureMonitor.DisplayName=Architectuur ClockMonitor.DisplayName=Tijdsverschil -DiskSpaceMonitor.DisplayName=Beschikbare schijfruimte \ No newline at end of file +DiskSpaceMonitor.DisplayName=Beschikbare schijfruimte +DiskSpaceMonitorDescriptor.DiskSpace.FreeSpaceTooLow=Er is te weinig vrije schijfruimte, nog maar {0} GB over. diff --git a/core/src/main/resources/hudson/node_monitors/Messages_pt.properties b/core/src/main/resources/hudson/node_monitors/Messages_pt.properties index e9eb9c1b26..f19690280c 100644 --- a/core/src/main/resources/hudson/node_monitors/Messages_pt.properties +++ b/core/src/main/resources/hudson/node_monitors/Messages_pt.properties @@ -31,3 +31,4 @@ DiskSpaceMonitor.DisplayName=Espa\u00e7o em disco livre SwapSpaceMonitor.DisplayName=Espa\u00e7o de swap livre ArchitectureMonitor.DisplayName=Arquitetura ResponseTimeMonitor.MarkedOffline=Deixar {0} offline porque n\u00e3o est\u00e1 respondendo +DiskSpaceMonitorDescriptor.DiskSpace.FreeSpaceTooLow=Espa\u00e7o em disco est\u00e1 acabando, apenas {0}Gb livre em {1}. diff --git a/core/src/main/resources/hudson/node_monitors/Messages_pt_BR.properties b/core/src/main/resources/hudson/node_monitors/Messages_pt_BR.properties index 68e2b04960..a55804ed54 100644 --- a/core/src/main/resources/hudson/node_monitors/Messages_pt_BR.properties +++ b/core/src/main/resources/hudson/node_monitors/Messages_pt_BR.properties @@ -39,3 +39,5 @@ ResponseTimeMonitor.MarkedOffline= Indispon\u00edvel temporariamente por que n\u AbstractNodeMonitorDescriptor.NoDataYet=Nada ainda # Putting {0} back online as there is enough disk space again DiskSpaceMonitor.MarkedOnline=Retornando {0} para online pois h\u00e1 espa\u00e7o em disco suficiente novamente +# Disk space is too low. Only {0}GB left. +DiskSpaceMonitorDescriptor.DiskSpace.FreeSpaceTooLow=Pouco espa\u00e7o em disco. Somente {0}GB restante. diff --git a/core/src/main/resources/hudson/node_monitors/DiskSpaceMonitorDescriptor/DiskSpace/cause_nl.properties b/core/src/main/resources/hudson/node_monitors/Messages_sv_SE.properties similarity index 92% rename from core/src/main/resources/hudson/node_monitors/DiskSpaceMonitorDescriptor/DiskSpace/cause_nl.properties rename to core/src/main/resources/hudson/node_monitors/Messages_sv_SE.properties index 85e0a89671..1b0ae43692 100644 --- a/core/src/main/resources/hudson/node_monitors/DiskSpaceMonitorDescriptor/DiskSpace/cause_nl.properties +++ b/core/src/main/resources/hudson/node_monitors/Messages_sv_SE.properties @@ -20,4 +20,4 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -blurb=Er is te weinig vrije schijfruimte, nog maar {0} GB over. +DiskSpaceMonitorDescriptor.DiskSpace.FreeSpaceTooLow=Diskutrymme l\u00E5gt. Enbart {0}GB kvar. diff --git a/core/src/main/resources/hudson/node_monitors/Messages_zh_TW.properties b/core/src/main/resources/hudson/node_monitors/Messages_zh_TW.properties index edfaae5ae4..63ebb23af2 100644 --- a/core/src/main/resources/hudson/node_monitors/Messages_zh_TW.properties +++ b/core/src/main/resources/hudson/node_monitors/Messages_zh_TW.properties @@ -30,3 +30,4 @@ ResponseTimeMonitor.MarkedOffline={0} \u6c92\u6709\u56de\u61c9\uff0c\u5c07\u5176 ResponseTimeMonitor.TimeOut=\u6700\u8fd1 {0} \u6b21\u9023\u7dda\u90fd\u903e\u6642 SwapSpaceMonitor.DisplayName=\u53ef\u7528 Swap \u7a7a\u9593 TemporarySpaceMonitor.DisplayName=\u53ef\u7528\u66ab\u5b58\u7a7a\u9593 +DiskSpaceMonitorDescriptor.DiskSpace.FreeSpaceTooLow=\u78c1\u789f\u7a7a\u9593\u592a\u5c11\u3002{1} \u4e0a\u53ea\u5269 {0}GB\u3002 From e234c290782586a6645bc1b83f647da12aad1424 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20Gond=C5=BEa?= Date: Sun, 7 Dec 2014 13:53:00 +0100 Subject: [PATCH 025/701] Introduce MonitorOfflineCause --- .../DiskSpaceMonitorDescriptor.java | 3 +- .../node_monitors/MonitorOfflineCause.java | 40 +++++++++++++++++++ .../node_monitors/ResponseTimeMonitor.java | 7 +++- 3 files changed, 48 insertions(+), 2 deletions(-) create mode 100644 core/src/main/java/hudson/node_monitors/MonitorOfflineCause.java diff --git a/core/src/main/java/hudson/node_monitors/DiskSpaceMonitorDescriptor.java b/core/src/main/java/hudson/node_monitors/DiskSpaceMonitorDescriptor.java index 733be3d5c3..4bd1c939c6 100644 --- a/core/src/main/java/hudson/node_monitors/DiskSpaceMonitorDescriptor.java +++ b/core/src/main/java/hudson/node_monitors/DiskSpaceMonitorDescriptor.java @@ -51,7 +51,7 @@ public abstract class DiskSpaceMonitorDescriptor extends AbstractAsyncNodeMonito * Value object that represents the disk space. */ @ExportedBean - public static final class DiskSpace extends OfflineCause implements Serializable { + public static final class DiskSpace extends MonitorOfflineCause implements Serializable { private final String path; @Exported public final long size; @@ -119,6 +119,7 @@ public abstract class DiskSpaceMonitorDescriptor extends AbstractAsyncNodeMonito this.triggered = triggered; } + @Override public Class getTrigger() { return trigger; } diff --git a/core/src/main/java/hudson/node_monitors/MonitorOfflineCause.java b/core/src/main/java/hudson/node_monitors/MonitorOfflineCause.java new file mode 100644 index 0000000000..002bf5a503 --- /dev/null +++ b/core/src/main/java/hudson/node_monitors/MonitorOfflineCause.java @@ -0,0 +1,40 @@ +/* + * The MIT License + * + * Copyright (c) 2014 Red Hat, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package hudson.node_monitors; + +import hudson.slaves.OfflineCause; + +/** + * Offline cause to denote it was node monitor what put computer offline. + * + * @author ogondza + * @since TODO + */ +public abstract class MonitorOfflineCause extends OfflineCause { + + /** + * Identify monitor implementation that put computer offline. + */ + public abstract Class getTrigger(); +} diff --git a/core/src/main/java/hudson/node_monitors/ResponseTimeMonitor.java b/core/src/main/java/hudson/node_monitors/ResponseTimeMonitor.java index fa864bae3c..69da2e6bcd 100644 --- a/core/src/main/java/hudson/node_monitors/ResponseTimeMonitor.java +++ b/core/src/main/java/hudson/node_monitors/ResponseTimeMonitor.java @@ -142,7 +142,7 @@ public class ResponseTimeMonitor extends NodeMonitor { * Immutable representation of the monitoring data. */ @ExportedBean - public static final class Data extends OfflineCause implements Serializable { + public static final class Data extends MonitorOfflineCause implements Serializable { /** * Record of the past 5 times. -1 if time out. Otherwise in milliseconds. * Old ones first. @@ -204,6 +204,11 @@ public class ResponseTimeMonitor extends NodeMonitor { return getAverage()+"ms"; } + @Override + public Class getTrigger() { + return ResponseTimeMonitor.class; + } + private static final long serialVersionUID = 1L; } From 3edae667b3955a561296a23122f86b35ec928a98 Mon Sep 17 00:00:00 2001 From: Eugene Baranov Date: Sun, 30 Nov 2014 22:52:14 +0200 Subject: [PATCH 026/701] [JENKINS-25514] Fixed lock case in FutureImpl when some other process is waiting for build in queue. --- .../java/hudson/model/queue/FutureImpl.java | 8 +++++ .../src/test/java/hudson/model/QueueTest.java | 30 +++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/core/src/main/java/hudson/model/queue/FutureImpl.java b/core/src/main/java/hudson/model/queue/FutureImpl.java index da63f9c11d..2104dd4fcf 100644 --- a/core/src/main/java/hudson/model/queue/FutureImpl.java +++ b/core/src/main/java/hudson/model/queue/FutureImpl.java @@ -84,6 +84,14 @@ public final class FutureImpl extends AsyncFutureImpl implements Que } } + @Override + public synchronized void setAsCancelled() { + super.setAsCancelled(); + if (!start.isDone()) { + start.setAsCancelled(); + } + } + synchronized void addExecutor(@Nonnull Executor executor) { this.executors.add(executor); } diff --git a/test/src/test/java/hudson/model/QueueTest.java b/test/src/test/java/hudson/model/QueueTest.java index 93bcb5ba05..5c83d8b8f1 100644 --- a/test/src/test/java/hudson/model/QueueTest.java +++ b/test/src/test/java/hudson/model/QueueTest.java @@ -62,6 +62,7 @@ import java.util.List; import java.util.concurrent.CancellationException; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; +import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import java.util.concurrent.atomic.AtomicInteger; @@ -579,4 +580,33 @@ public class QueueTest extends HudsonTestCase { } catch (CancellationException e) { } } + + public void testWaitForStartAndCancelBeforeStart() throws Exception { + final OneShotEvent ev = new OneShotEvent(); + FreeStyleProject p = createFreeStyleProject(); + + QueueTaskFuture f = p.scheduleBuild2(10); + final Queue.Item item = Queue.getInstance().getItem(p); + assertNotNull(item); + + final ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(1); + executor.schedule(new Runnable() { + @Override + public void run() { + try { + Queue.getInstance().doCancelItem(item.id); + } catch (IOException e) { + e.printStackTrace(); + } catch (ServletException e) { + e.printStackTrace(); + } + } + }, 2, TimeUnit.SECONDS); + + try { + f.waitForStart(); + fail("Expected an CancellationException to be thrown"); + } catch (CancellationException e) {} + } + } From d69ab65a9ab962e1ef4faf5a2f328cdb6d253b8f Mon Sep 17 00:00:00 2001 From: Your Name Date: Tue, 9 Dec 2014 22:43:10 -0800 Subject: [PATCH 027/701] change BuildStability message into more appropriate one --- core/src/main/resources/hudson/model/Messages_ja.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/resources/hudson/model/Messages_ja.properties b/core/src/main/resources/hudson/model/Messages_ja.properties index e06a0ef8fb..f47d7cb685 100644 --- a/core/src/main/resources/hudson/model/Messages_ja.properties +++ b/core/src/main/resources/hudson/model/Messages_ja.properties @@ -152,7 +152,7 @@ Item.READ.description=\u30b8\u30e7\u30d6\u3092\u53c2\u7167\u3057\u307e\u3059\u30 (\u8a31\u53ef\u3057\u306a\u3044\u3053\u3068\u3082\u3067\u304d\u307e\u3059\u304c\u3001\u533f\u540d\u30e6\u30fc\u30b6\u30fc\u304c\u30ed\u30b0\u30a4\u30f3\u3057\u3066\u30b8\u30e7\u30d6\u3092\u53c2\u7167\u3067\u304d\u308b\u3088\u3046\u306b"Discover"\u3092\u8a31\u53ef\u3057\u3066\u304f\u3060\u3055\u3044\u3002) Job.AllRecentBuildFailed=\u6700\u8fd1\u306e\u5168\u3066\u306e\u30d3\u30eb\u30c9\u306f\u5931\u6557\u3057\u307e\u3057\u305f\u3002 -Job.BuildStability=\u5b89\u5b9a\u3057\u305f\u30d3\u30eb\u30c9: {0} +Job.BuildStability=\u30d3\u30eb\u30c9\u306e\u5b89\u5b9a\u6027: {0} Job.NOfMFailed=\u6700\u8fd1\u306e{1}\u500b\u4e2d\u3001{0}\u500b\u30d3\u30eb\u30c9\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3002 Job.NoRecentBuildFailed=\u6700\u8fd1\u306e\u30d3\u30eb\u30c9\u306f\u5931\u6557\u3057\u3066\u307e\u305b\u3093\u3002 Job.Pronoun=\u30d7\u30ed\u30b8\u30a7\u30af\u30c8 From c528feea64d67971c03590d871acc90d646aa83f Mon Sep 17 00:00:00 2001 From: Daniel Beck Date: Thu, 11 Dec 2014 17:04:00 +0100 Subject: [PATCH 028/701] Remove duplicate entry for 1.593 --- changelog.html | 9 --------- 1 file changed, 9 deletions(-) diff --git a/changelog.html b/changelog.html index 8167384b77..f4085e15ef 100644 --- a/changelog.html +++ b/changelog.html @@ -82,15 +82,6 @@ Upcoming changes issue 24687, issue 24589) -

What's new in 1.593 (2014/11/30)

-

What's new in 1.592 (2014/11/30)

  • From 97bc2dd44416ae45e604e634b4d5fcfa839ab2aa Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Thu, 11 Dec 2014 11:07:29 -0500 Subject: [PATCH 029/701] [JENKINS-25533] Noting merge of #1477. --- changelog.html | 3 +++ 1 file changed, 3 insertions(+) diff --git a/changelog.html b/changelog.html index 8167384b77..d892b7d8c4 100644 --- a/changelog.html +++ b/changelog.html @@ -71,6 +71,9 @@ Upcoming changes
  • After recent Java security updates, Jenkins would not gracefully recover from a deleted secrets/master.key. (issue 25937) +
  • + Restrict where this project can be run regressed in 1.589 when using the ClearCase plugin. + (issue 25533)

What's new in 1.593 (2014/12/07)

From c6deabb1b1812a1d332df12c1c10394afa87ce8e Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Thu, 11 Dec 2014 17:52:50 -0500 Subject: [PATCH 030/701] Forgotten @since. --- core/src/main/java/hudson/EnvVars.java | 1 + 1 file changed, 1 insertion(+) diff --git a/core/src/main/java/hudson/EnvVars.java b/core/src/main/java/hudson/EnvVars.java index b2d61ead56..c0047b5578 100644 --- a/core/src/main/java/hudson/EnvVars.java +++ b/core/src/main/java/hudson/EnvVars.java @@ -359,6 +359,7 @@ public class EnvVars extends TreeMap { /** * Add a key/value but only if the value is not-null. Otherwise no-op. + * @since 1.556 */ public void putIfNotNull(String key, String value) { if (value!=null) From 0cd13e96703d8a506d75b2b175032e01e82a2989 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Fri, 12 Dec 2014 14:59:03 -0500 Subject: [PATCH 031/701] Compilability fix. --- .../java/jenkins/model/lazy/AbstractLazyLoadRunMapTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/test/java/jenkins/model/lazy/AbstractLazyLoadRunMapTest.java b/core/src/test/java/jenkins/model/lazy/AbstractLazyLoadRunMapTest.java index 5a9ad3be1b..247653e501 100644 --- a/core/src/test/java/jenkins/model/lazy/AbstractLazyLoadRunMapTest.java +++ b/core/src/test/java/jenkins/model/lazy/AbstractLazyLoadRunMapTest.java @@ -332,7 +332,7 @@ public class AbstractLazyLoadRunMapTest extends Assert { @Issue("JENKINS-25655") @Test public void entrySetChanges() { assertEquals(3, a.entrySet().size()); - a.put(new Build(7, "D")); + a.put(new Build(7)); assertEquals(4, a.entrySet().size()); } From 507412e0dbe9533be0f89c87157590b9cc61b5bd Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Fri, 12 Dec 2014 15:43:38 -0500 Subject: [PATCH 032/701] Safer to use AtomicFileWriter. --- core/src/main/java/jenkins/model/RunIdMigrator.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/core/src/main/java/jenkins/model/RunIdMigrator.java b/core/src/main/java/jenkins/model/RunIdMigrator.java index e794515e14..70b2af51b1 100644 --- a/core/src/main/java/jenkins/model/RunIdMigrator.java +++ b/core/src/main/java/jenkins/model/RunIdMigrator.java @@ -27,9 +27,9 @@ package jenkins.model; import hudson.Util; import hudson.model.Job; import hudson.model.Run; +import hudson.util.AtomicFileWriter; import java.io.File; import java.io.IOException; -import java.io.PrintWriter; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; @@ -91,16 +91,16 @@ public final class RunIdMigrator { } private void save(File dir) { - dir.mkdirs(); File f = new File(dir, MAP_FILE); try { - PrintWriter w = new PrintWriter(f); + AtomicFileWriter w = new AtomicFileWriter(f); try { for (Map.Entry entry : idToNumber.entrySet()) { - w.println(entry.getKey() + ' ' + entry.getValue()); + w.write(entry.getKey() + ' ' + entry.getValue() + '\n'); } + w.commit(); } finally { - w.close(); + w.abort(); } } catch (IOException x) { LOGGER.log(Level.WARNING, "could not save changes to " + f, x); From 70613202f1177ce83e1d9d724a8b21ca9c222cd3 Mon Sep 17 00:00:00 2001 From: Piotr Wielgolaski Date: Tue, 9 Dec 2014 21:25:03 +0100 Subject: [PATCH 033/701] [JENKINS-25953]Tabs in job view are layouted in wrong way make equal height of tab regardless if selected or not --- war/src/main/webapp/css/style.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/war/src/main/webapp/css/style.css b/war/src/main/webapp/css/style.css index d9c112f5af..761c6659db 100644 --- a/war/src/main/webapp/css/style.css +++ b/war/src/main/webapp/css/style.css @@ -406,10 +406,10 @@ pre.console { } .tabBar [type=radio]:checked ~ a { border: solid 1px #f0f0f0; + border-bottom: none; background: #eee; color: #000; font-weight: bold; - border-bottom: 1px solid #eee; z-index: 2; } .tabBarBaseline { From f87c72f15858edf5dd499349569497c3c2bf4449 Mon Sep 17 00:00:00 2001 From: tfennelly Date: Sun, 14 Dec 2014 20:09:16 +0000 Subject: [PATCH 034/701] [FIXED JENKINS-25499] Updated icon-set dependency to version 1.0.5 Also fixes JENKINS-25498 --- changelog.html | 4 ++++ core/pom.xml | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/changelog.html b/changelog.html index 781278e977..515dbf660c 100644 --- a/changelog.html +++ b/changelog.html @@ -61,6 +61,10 @@ Upcoming changes
  • Master labels disappear when system configuration is updated. (issue 23966) +
  • + Updated icon-set dependency to version 1.0.5. + (issue 25499, + issue 25498) diff --git a/core/pom.xml b/core/pom.xml index 87c29d78a7..2139863e3a 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -51,7 +51,7 @@ THE SOFTWARE. org.jenkins-ci.plugins.icon-shim icon-set - 1.0.3 + 1.0.5 ${project.groupId} From 7cc93fa88fc1cf6bd6c6a0caab81074d239d256e Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sun, 14 Dec 2014 20:20:59 -0800 Subject: [PATCH 035/701] [maven-release-plugin] prepare release jenkins-1.594 --- cli/pom.xml | 2 +- core/pom.xml | 2 +- plugins/pom.xml | 10 +++++----- pom.xml | 4 ++-- test/pom.xml | 2 +- war/pom.xml | 2 +- 6 files changed, 11 insertions(+), 11 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index 41afe85d6b..c2ce80eae2 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ pom org.jenkins-ci.main - 1.594-SNAPSHOT + 1.594 cli diff --git a/core/pom.xml b/core/pom.xml index f417985049..bc893d66fa 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 1.594-SNAPSHOT + 1.594 ../pom.xml diff --git a/plugins/pom.xml b/plugins/pom.xml index 4420f7a17f..f8839bb451 100644 --- a/plugins/pom.xml +++ b/plugins/pom.xml @@ -11,7 +11,7 @@ org.jenkins-ci.plugins plugin Jenkins plugin POM - 1.594-SNAPSHOT + 1.594 pom +

    What's new in 1.594 (2014/12/14)

    • After recent Java security updates, Jenkins would not gracefully recover from a deleted secrets/master.key. (issue 25937)
    -

    What's new in 1.593 (2014/12/07)

    • From 1c4f3675942913611b02e8ab25df4d2f5564fda0 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sun, 14 Dec 2014 21:46:15 -0800 Subject: [PATCH 038/701] updated changelog as a part of the release --- debian/debian/changelog | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/debian/debian/changelog b/debian/debian/changelog index 69281d0bf9..e965b4cb33 100644 --- a/debian/debian/changelog +++ b/debian/debian/changelog @@ -1,3 +1,9 @@ +jenkins (1.594) unstable; urgency=low + + * See http://jenkins-ci.org/changelog for more details. + + -- Kohsuke Kawaguchi Sun, 14 Dec 2014 20:45:02 -0800 + jenkins (1.593) unstable; urgency=low * See http://jenkins-ci.org/changelog for more details. From c5d7f6e40a475350c6d1459ad3a17871c8053df2 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Mon, 15 Dec 2014 07:13:00 -0800 Subject: [PATCH 039/701] creating an RC branch --- changelog.html | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/changelog.html b/changelog.html index f209df8e4d..60b7e19c11 100644 --- a/changelog.html +++ b/changelog.html @@ -54,6 +54,14 @@ Upcoming changes + + + - - -

      What's new in 1.594 (2014/12/14)

        From 84585f0c3c0f792e3f30e29d32064cc79faa29d0 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Mon, 15 Dec 2014 07:13:08 -0800 Subject: [PATCH 040/701] the trunk is toward 1.596-SNAPSHOT --- cli/pom.xml | 2 +- core/pom.xml | 2 +- plugins/pom.xml | 8 ++++---- pom.xml | 2 +- test/pom.xml | 2 +- war/pom.xml | 2 +- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index 4b40627511..1070029ff1 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ pom org.jenkins-ci.main - 1.595-SNAPSHOT + 1.596-SNAPSHOT cli diff --git a/core/pom.xml b/core/pom.xml index 2139863e3a..0010c438c2 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 1.595-SNAPSHOT + 1.596-SNAPSHOT ../pom.xml diff --git a/plugins/pom.xml b/plugins/pom.xml index 2ef88c6eb5..baa0e77322 100644 --- a/plugins/pom.xml +++ b/plugins/pom.xml @@ -11,7 +11,7 @@ org.jenkins-ci.plugins plugin Jenkins plugin POM - 1.595-SNAPSHOT + 1.596-SNAPSHOT pom From 04c6f9b63badcd2c11f2623665bfd6cbd8d3268d Mon Sep 17 00:00:00 2001 From: Daniel Beck Date: Sat, 20 Dec 2014 01:25:44 +0100 Subject: [PATCH 053/701] Add pom.xml.versionsBackup and .DS_Store to .gitignore --- .gitignore | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.gitignore b/.gitignore index 74009c2ad5..edb353a62a 100644 --- a/.gitignore +++ b/.gitignore @@ -17,6 +17,12 @@ build # vim *~ +# OS X +.DS_Store + +# mvn versions:set +pom.xml.versionsBackup + war/images/16x16 war/images/24x24 war/images/32x32 From 44e6b5d76211bc40e1a608ae3aa93c083befaeba Mon Sep 17 00:00:00 2001 From: Daniel Beck Date: Sat, 20 Dec 2014 13:29:13 +0100 Subject: [PATCH 054/701] [FIXED JENKINS-22311] Show queue item parameters in tool tip --- .../hudson/widgets/BuildHistoryWidget/entries.jelly | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/core/src/main/resources/hudson/widgets/BuildHistoryWidget/entries.jelly b/core/src/main/resources/hudson/widgets/BuildHistoryWidget/entries.jelly index f84e541e08..639002d537 100644 --- a/core/src/main/resources/hudson/widgets/BuildHistoryWidget/entries.jelly +++ b/core/src/main/resources/hudson/widgets/BuildHistoryWidget/entries.jelly @@ -40,7 +40,7 @@ THE SOFTWARE. -
        +
        #${queuedItems.size()==1 ? it.owner.nextBuildNumber : it.owner.nextBuildNumber+queuedItems.size()-i-1}
        @@ -55,7 +55,11 @@ THE SOFTWARE. (${%pending}) - ${item.params} + +
        + +
        +
        From 801f37d5a11554fb97bf9c8edbd9f3e5bd21a47f Mon Sep 17 00:00:00 2001 From: Daniel Beck Date: Mon, 19 May 2014 11:19:56 +0200 Subject: [PATCH 055/701] [FIXED JENKINS-20148] Rephrase Workspace permission description --- core/src/main/resources/hudson/model/Messages.properties | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/core/src/main/resources/hudson/model/Messages.properties b/core/src/main/resources/hudson/model/Messages.properties index 7e33eaee12..b83f783d47 100644 --- a/core/src/main/resources/hudson/model/Messages.properties +++ b/core/src/main/resources/hudson/model/Messages.properties @@ -53,8 +53,9 @@ AbstractProject.BuildPermission.Description=\ This permission grants the ability to start a new build. AbstractProject.WorkspacePermission.Description=\ This permission grants the ability to retrieve the contents of a workspace \ - Jenkins checked out for performing builds. If you don\u2019t want an user to access \ - the source code, you can do so by revoking this permission. + Jenkins checked out for performing builds. If you don\u2019t want a user to access \ + files in the workspace (e.g. source code checked out from SCM or intermediate build \ + results) through the workspace browser, you can revoke this permission. AbstractProject.ExtendedReadPermission.Description=\ This permission grants read-only access to project configurations. Please be \ aware that sensitive information in your builds, such as passwords, will be \ From 277b17758e7b3790a2fdfd00bd576caa655da061 Mon Sep 17 00:00:00 2001 From: Daniel Beck Date: Tue, 2 Sep 2014 01:17:57 +0200 Subject: [PATCH 056/701] [FIXED JENKINS-11172] Don't throw exception on /signup when not possible --- core/src/main/java/jenkins/model/Jenkins.java | 6 +++- .../security/SecurityRealm/signup.jelly | 33 +++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 core/src/main/resources/hudson/security/SecurityRealm/signup.jelly diff --git a/core/src/main/java/jenkins/model/Jenkins.java b/core/src/main/java/jenkins/model/Jenkins.java index 419c4c528a..ed70dddadc 100644 --- a/core/src/main/java/jenkins/model/Jenkins.java +++ b/core/src/main/java/jenkins/model/Jenkins.java @@ -3560,7 +3560,11 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve * Sign up for the user account. */ public void doSignup( StaplerRequest req, StaplerResponse rsp ) throws IOException, ServletException { - req.getView(getSecurityRealm(), "signup.jelly").forward(req, rsp); + if (getSecurityRealm().allowsSignup()) { + req.getView(getSecurityRealm(), "signup.jelly").forward(req, rsp); + return; + } + req.getView(SecurityRealm.class, "signup.jelly").forward(req, rsp); } /** diff --git a/core/src/main/resources/hudson/security/SecurityRealm/signup.jelly b/core/src/main/resources/hudson/security/SecurityRealm/signup.jelly new file mode 100644 index 0000000000..5bb47be248 --- /dev/null +++ b/core/src/main/resources/hudson/security/SecurityRealm/signup.jelly @@ -0,0 +1,33 @@ + + + + + + +

        ${%Sign up}

        + ${%This is not supported in the current configuration.} +
        +
        +
        From 2820e59202975ce8ad302e4a0b0e17c07e4c40cf Mon Sep 17 00:00:00 2001 From: Daniel Beck Date: Sun, 21 Dec 2014 03:29:39 +0100 Subject: [PATCH 057/701] [FIXED JENKINS-25989] Allow breaking label and node lists --- core/src/main/resources/hudson/model/Computer/index.jelly | 1 + core/src/main/resources/hudson/model/Label/index.jelly | 1 + 2 files changed, 2 insertions(+) diff --git a/core/src/main/resources/hudson/model/Computer/index.jelly b/core/src/main/resources/hudson/model/Computer/index.jelly index 9adde755c6..ecd9dbf11e 100644 --- a/core/src/main/resources/hudson/model/Computer/index.jelly +++ b/core/src/main/resources/hudson/model/Computer/index.jelly @@ -94,6 +94,7 @@ THE SOFTWARE. ${entry.item.name} +
        diff --git a/core/src/main/resources/hudson/model/Label/index.jelly b/core/src/main/resources/hudson/model/Label/index.jelly index 22cd6d0ac3..931d7932df 100644 --- a/core/src/main/resources/hudson/model/Label/index.jelly +++ b/core/src/main/resources/hudson/model/Label/index.jelly @@ -50,6 +50,7 @@ THE SOFTWARE. ${c.displayName} +
        From 3ed7778bd42b99fc5fbef66d63d96604c279ec78 Mon Sep 17 00:00:00 2001 From: Daniel Beck Date: Sun, 21 Dec 2014 03:45:09 +0100 Subject: [PATCH 058/701] [FIXED JENKINS-25174] Show run display name on parameters page --- .../main/resources/hudson/model/RunParameterValue/value.jelly | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/resources/hudson/model/RunParameterValue/value.jelly b/core/src/main/resources/hudson/model/RunParameterValue/value.jelly index 5191c4d38b..019158b428 100644 --- a/core/src/main/resources/hudson/model/RunParameterValue/value.jelly +++ b/core/src/main/resources/hudson/model/RunParameterValue/value.jelly @@ -27,6 +27,6 @@ THE SOFTWARE. xmlns:l="/lib/layout" xmlns:t="/lib/hudson" xmlns:f="/lib/form" xmlns:i="jelly:fmt" xmlns:p="/lib/hudson/project"> - ${it.run} + ${it.run.fullDisplayName} From 2647af48c81e17ea17bfb144bf804abea22530fe Mon Sep 17 00:00:00 2001 From: Daniel Beck Date: Sun, 21 Dec 2014 03:52:46 +0100 Subject: [PATCH 059/701] [FIXED JENKINS-25338] Show job name rather than display name in CLI --- core/src/main/java/hudson/cli/ListJobsCommand.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/hudson/cli/ListJobsCommand.java b/core/src/main/java/hudson/cli/ListJobsCommand.java index bdb64208d5..97ea8d2967 100644 --- a/core/src/main/java/hudson/cli/ListJobsCommand.java +++ b/core/src/main/java/hudson/cli/ListJobsCommand.java @@ -82,7 +82,7 @@ public class ListJobsCommand extends CLICommand { // Print all jobs. for (TopLevelItem item : jobs) { - stdout.println(item.getDisplayName()); + stdout.println(item.getName()); } return 0; From 1186e7b4047a70162a1a3be399fc449ae3b0e1f5 Mon Sep 17 00:00:00 2001 From: Daniel Beck Date: Sun, 21 Dec 2014 04:20:45 +0100 Subject: [PATCH 060/701] [FIXED JENKINS-25601] Amend JAVA_HOME check to work with JDK 9 --- core/src/main/java/hudson/model/JDK.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/hudson/model/JDK.java b/core/src/main/java/hudson/model/JDK.java index a06bac9c64..fe2152b8a6 100644 --- a/core/src/main/java/hudson/model/JDK.java +++ b/core/src/main/java/hudson/model/JDK.java @@ -182,7 +182,11 @@ public final class JDK extends ToolInstallation implements NodeSpecific, En @Override protected FormValidation checkHomeDirectory(File value) { File toolsJar = new File(value,"lib/tools.jar"); File mac = new File(value,"lib/dt.jar"); - if(!toolsJar.exists() && !mac.exists()) + + // JENKINS-25601: JDK 9+ no longer has tools.jar. Keep the existing dt.jar/tools.jar checks to be safe. + File javac = new File(value, "bin/javac"); + File javacExe = new File(value, "bin/javac.exe"); + if(!toolsJar.exists() && !mac.exists() && !javac.exists() && !javacExe.exists()) return FormValidation.error(Messages.Hudson_NotJDKDir(value)); return FormValidation.ok(); From 7bfbc4b1d0a68bd6b333b2eb0a85501a21931462 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20Gond=C5=BEa?= Date: Sun, 21 Dec 2014 15:13:12 +0100 Subject: [PATCH 061/701] Noting #1495 --- changelog.html | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/changelog.html b/changelog.html index 90c8a2916b..053f995949 100644 --- a/changelog.html +++ b/changelog.html @@ -56,8 +56,11 @@ Upcoming changes From 3e9cdcbc8527d6ee2be143aad3365df8fcd02c74 Mon Sep 17 00:00:00 2001 From: tfennelly Date: Sun, 21 Dec 2014 13:34:02 +0000 Subject: [PATCH 062/701] Tweak of earlier fix for JENKINS-25971 Making side-panel and main-panel absolute positioned and full height --- war/src/main/webapp/css/style.css | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/war/src/main/webapp/css/style.css b/war/src/main/webapp/css/style.css index 1a99fc5d26..b1f4a057f0 100644 --- a/war/src/main/webapp/css/style.css +++ b/war/src/main/webapp/css/style.css @@ -75,19 +75,34 @@ body { } #side-panel, #main-panel { - margin: 0px 0px 40px 0px; padding: 0px; } -.fixedGridLayout #side-panel { - float:left; +#page-body.fixedGridLayout, .fixedGridLayout #side-panel, .fixedGridLayout #main-panel { + left: 0px; +} + +#page-body.fixedGridLayout { position: fixed; - width: 360px; - margin-left: 15px; + top: 66px; /* height of #header + #breadcrumbBar */ + bottom: 37px; /* height of #footer-container */ + right: 0px; + overflow: scroll; +} +.fixedGridLayout #side-panel, .fixedGridLayout #main-panel { + position: absolute; + top: 0px; + bottom: 0px; +} + +.fixedGridLayout #side-panel { + width: 375px; + padding-left: 15px; } .fixedGridLayout #main-panel { - margin-left: 370px; + right: 0px; + margin-left: 375px; margin-right: 15px; } @@ -112,7 +127,7 @@ body { } #footer-container { - position: absolute; + position: fixed; bottom: 0; width: 100%; padding: 10px 0px; From 75e87f1480739f4e38d2bc26c0e493acc4ab3f91 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sun, 21 Dec 2014 19:07:53 -0800 Subject: [PATCH 063/701] Working around MRELEASE-812 --- pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/pom.xml b/pom.xml index 9550e51419..1614fa3198 100644 --- a/pom.xml +++ b/pom.xml @@ -560,6 +560,7 @@ THE SOFTWARE. maven-release-plugin + 2.5.1 -P release,sign From 35f174d32ec821c37b7e60cc635c445cb48242b0 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sun, 21 Dec 2014 19:24:17 -0800 Subject: [PATCH 064/701] [maven-release-plugin] prepare release jenkins-1.595 --- cli/pom.xml | 2 +- core/pom.xml | 2 +- plugins/pom.xml | 10 +++++----- pom.xml | 4 ++-- test/pom.xml | 2 +- war/pom.xml | 2 +- 6 files changed, 11 insertions(+), 11 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index 4b40627511..4b3773c15d 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ pom org.jenkins-ci.main - 1.595-SNAPSHOT + 1.595 cli diff --git a/core/pom.xml b/core/pom.xml index 2139863e3a..98ed34eab7 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 1.595-SNAPSHOT + 1.595 ../pom.xml diff --git a/plugins/pom.xml b/plugins/pom.xml index 2ef88c6eb5..79aaab269c 100644 --- a/plugins/pom.xml +++ b/plugins/pom.xml @@ -11,7 +11,7 @@ org.jenkins-ci.plugins plugin Jenkins plugin POM - 1.595-SNAPSHOT + 1.595 pom +

        What's new in 1.595 (2014/12/21)

        • Spurious warnings in the log after deleting builds. @@ -74,7 +77,6 @@ Upcoming changes (issue 25499, issue 25498)
        -

        What's new in 1.594 (2014/12/14)

        • From 05dae5c024584eae5072c3cd203d57c489b61ea3 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sun, 21 Dec 2014 21:29:04 -0800 Subject: [PATCH 067/701] updated changelog as a part of the release --- debian/debian/changelog | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/debian/debian/changelog b/debian/debian/changelog index e965b4cb33..396919e31a 100644 --- a/debian/debian/changelog +++ b/debian/debian/changelog @@ -1,3 +1,15 @@ +jenkins (1.595) unstable; urgency=low + + * See http://jenkins-ci.org/changelog for more details. + + -- Kohsuke Kawaguchi Sun, 21 Dec 2014 21:10:37 -0800 + +jenkins (1.595) unstable; urgency=low + + * See http://jenkins-ci.org/changelog for more details. + + -- Kohsuke Kawaguchi Sun, 21 Dec 2014 20:46:53 -0800 + jenkins (1.594) unstable; urgency=low * See http://jenkins-ci.org/changelog for more details. From 0374b79d83306bbb9d2ddf69540cc6d482cfbcf2 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sun, 21 Dec 2014 21:29:43 -0800 Subject: [PATCH 068/701] creating an RC branch --- changelog.html | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/changelog.html b/changelog.html index 15d68de6aa..9624e55e5b 100644 --- a/changelog.html +++ b/changelog.html @@ -54,6 +54,14 @@ Upcoming changes + + + - - -

          What's new in 1.595 (2014/12/21)

            From 44d5c2853c908975429f5076dd60af5f26e1d763 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sun, 21 Dec 2014 21:29:45 -0800 Subject: [PATCH 069/701] the trunk is toward 1.597-SNAPSHOT --- cli/pom.xml | 2 +- core/pom.xml | 2 +- plugins/pom.xml | 8 ++++---- pom.xml | 2 +- test/pom.xml | 2 +- war/pom.xml | 2 +- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index 1070029ff1..35a9cdbad9 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ pom org.jenkins-ci.main - 1.596-SNAPSHOT + 1.597-SNAPSHOT cli diff --git a/core/pom.xml b/core/pom.xml index bcd406317f..1eb0ddeade 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 1.596-SNAPSHOT + 1.597-SNAPSHOT ../pom.xml diff --git a/plugins/pom.xml b/plugins/pom.xml index baa0e77322..6fee680ce5 100644 --- a/plugins/pom.xml +++ b/plugins/pom.xml @@ -11,7 +11,7 @@ org.jenkins-ci.plugins plugin Jenkins plugin POM - 1.596-SNAPSHOT + 1.597-SNAPSHOT pom From b47d450ddb44d4aeaff175014e638fd4b7c37f27 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Tue, 23 Dec 2014 11:29:36 -0800 Subject: [PATCH 083/701] Fixed RunIdMigratorTest failures in non-EST time zone RunIdMigrator.LEGACY_ID_FORMATTER was static, which gets instantiated before the time zone is overriden during the test. Changing this to an instance field so that it gets created later on. --- .../main/java/jenkins/model/RunIdMigrator.java | 16 ++++++++-------- .../java/jenkins/model/RunIdMigratorTest.java | 5 +++-- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/core/src/main/java/jenkins/model/RunIdMigrator.java b/core/src/main/java/jenkins/model/RunIdMigrator.java index 4097fdea0f..9bd7c7ba9f 100644 --- a/core/src/main/java/jenkins/model/RunIdMigrator.java +++ b/core/src/main/java/jenkins/model/RunIdMigrator.java @@ -60,7 +60,6 @@ import org.apache.commons.lang.time.FastDateFormat; import org.apache.tools.ant.BuildException; import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.restrictions.NoExternalUse; -import org.kohsuke.stapler.HttpResponse; import org.kohsuke.stapler.StaplerProxy; import org.kohsuke.stapler.framework.io.WriterOutputStream; @@ -76,8 +75,9 @@ import static java.util.logging.Level.*; @Restricted(NoExternalUse.class) public final class RunIdMigrator { + private final DateFormat legacyIdFormatter = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss"); + static final Logger LOGGER = Logger.getLogger(RunIdMigrator.class.getName()); - private static final DateFormat LEGACY_ID_FORMATTER = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss"); private static final String MAP_FILE = "legacyIds"; /** avoids wasting a map for new jobs */ private static final Map EMPTY = new TreeMap(); @@ -235,8 +235,8 @@ public final class RunIdMigrator { } long timestamp; try { - synchronized (LEGACY_ID_FORMATTER) { - timestamp = LEGACY_ID_FORMATTER.parse(name).getTime(); + synchronized (legacyIdFormatter) { + timestamp = legacyIdFormatter.parse(name).getTime(); } } catch (ParseException x) { LOGGER.log(WARNING, "found unexpected dir {0}", name); @@ -304,9 +304,9 @@ public final class RunIdMigrator { if (!jobs.isDirectory()) { throw new FileNotFoundException("no such $JENKINS_HOME " + root); } - unmigrateJobsDir(jobs); + new RunIdMigrator().unmigrateJobsDir(jobs); } - private static void unmigrateJobsDir(File jobs) throws Exception { + private void unmigrateJobsDir(File jobs) throws Exception { for (File job : jobs.listFiles()) { File[] kids = job.listFiles(); if (kids == null) { @@ -328,7 +328,7 @@ public final class RunIdMigrator { private static final Pattern ID_ELT = Pattern.compile("(?m)^ ([0-9_-]+)(\r?\n)"); private static final Pattern TIMESTAMP_ELT = Pattern.compile("(?m)^ (\\d+)(\r?\n)"); /** Inverse of {@link #doMigrate}. */ - private static void unmigrateBuildsDir(File builds) throws Exception { + private void unmigrateBuildsDir(File builds) throws Exception { File mapFile = new File(builds, MAP_FILE); if (!mapFile.isFile()) { System.err.println(builds + " does not look to have been migrated yet; skipping"); @@ -362,7 +362,7 @@ public final class RunIdMigrator { xml = m.replaceFirst(""); } else { // Post-migration build. We give it a new ID based on its timestamp. - id = LEGACY_ID_FORMATTER.format(new Date(timestamp)); + id = legacyIdFormatter.format(new Date(timestamp)); } FileUtils.write(buildXml, xml, Charsets.UTF_8); if (!build.renameTo(new File(builds, id))) { diff --git a/core/src/test/java/jenkins/model/RunIdMigratorTest.java b/core/src/test/java/jenkins/model/RunIdMigratorTest.java index 17241b151c..ff4824ac93 100644 --- a/core/src/test/java/jenkins/model/RunIdMigratorTest.java +++ b/core/src/test/java/jenkins/model/RunIdMigratorTest.java @@ -28,6 +28,7 @@ import hudson.Util; import hudson.util.StreamTaskListener; import java.io.File; import java.nio.charset.Charset; +import java.util.Date; import java.util.Map; import java.util.TimeZone; import java.util.TreeMap; @@ -65,7 +66,7 @@ public class RunIdMigratorTest { migrator = new RunIdMigrator(); dir = tmp.getRoot(); } - + @Test public void newJob() throws Exception { migrator.created(dir); assertEquals("{legacyIds=''}", summarize()); @@ -149,4 +150,4 @@ public class RunIdMigratorTest { return m.toString(); } -} \ No newline at end of file +} From 1e8bfc8ac7a9ff688d992a4392a9939b46f97474 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Tue, 23 Dec 2014 12:17:31 -0800 Subject: [PATCH 084/701] Eliminate the use of static field to keep filters. This helps with the situation where multiple Jenkins instances exist in memory (at the same time or at different times sequentially), such as during unit tests. --- .../java/hudson/util/PluginServletFilter.java | 102 +++++++++++------- 1 file changed, 64 insertions(+), 38 deletions(-) diff --git a/core/src/main/java/hudson/util/PluginServletFilter.java b/core/src/main/java/hudson/util/PluginServletFilter.java index 28d505a1b5..dfc8bdf03e 100644 --- a/core/src/main/java/hudson/util/PluginServletFilter.java +++ b/core/src/main/java/hudson/util/PluginServletFilter.java @@ -1,18 +1,18 @@ /* * The MIT License - * + * * Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Tom Huybrechts - * + * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: - * + * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. - * + * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE @@ -25,17 +25,22 @@ package hudson.util; import hudson.ExtensionPoint; import hudson.security.SecurityRealm; +import jenkins.model.Jenkins; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; +import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletRequest; import java.io.IOException; +import java.util.Iterator; import java.util.List; import java.util.Vector; +import java.util.concurrent.CopyOnWriteArrayList; +import java.util.logging.Level; +import java.util.logging.Logger; /** * Servlet {@link Filter} that chains multiple {@link Filter}s, provided by plugins @@ -51,61 +56,82 @@ import java.util.Vector; * @see SecurityRealm */ public class PluginServletFilter implements Filter, ExtensionPoint { + private final List list = new CopyOnWriteArrayList(); - private static final List LIST = new Vector(); - - private static FilterConfig filterConfig; - - public PluginServletFilter() { + private /*almost final*/ FilterConfig config; + + /** + * For backward compatibility with plugins that might register filters before Jenkins.getInstance() + * starts functioning, when we are not sure which Jenkins instance a filter belongs to, put it here, + * and let the first Jenkins instance take over. + */ + private static final List LEGACY = new Vector(); + + private static final String KEY = PluginServletFilter.class.getName(); + + /** + * Lookup the instance from servlet context. + */ + private static PluginServletFilter getInstance(ServletContext c) { + return (PluginServletFilter)c.getAttribute(KEY); } - @edu.umd.cs.findbugs.annotations.SuppressWarnings("ST_WRITE_TO_STATIC_FROM_INSTANCE_METHOD") - public void init(FilterConfig filterConfig) throws ServletException { - PluginServletFilter.filterConfig = filterConfig; - synchronized (LIST) { - for (Filter f : LIST) { - f.init(filterConfig); - } - } + public void init(FilterConfig config) throws ServletException { + this.config = config; + synchronized (LEGACY) { + list.addAll(LEGACY); + LEGACY.clear(); + } + for (Filter f : list) { + f.init(config); + } + config.getServletContext().setAttribute(KEY,this); } - + public static void addFilter(Filter filter) throws ServletException { - synchronized (LIST) { - if (filterConfig != null) { - filter.init(filterConfig); - } - LIST.add(filter); - } + Jenkins j = Jenkins.getInstance(); + if (j==null) { + // report who is doing legacy registration + LOGGER.log(Level.WARNING, "Filter instance is registered too early: "+filter, new Exception()); + LEGACY.add(filter); + } else { + PluginServletFilter container = getInstance(j.servletContext); + filter.init(container.config); + container.list.add(filter); + } } public static void removeFilter(Filter filter) throws ServletException { - synchronized (LIST) { - LIST.remove(filter); - } + Jenkins j = Jenkins.getInstance(); + if (j==null) { + LEGACY.remove(filter); + } else { + getInstance(j.servletContext).list.remove(filter); + } } public void doFilter(ServletRequest request, ServletResponse response, final FilterChain chain) throws IOException, ServletException { new FilterChain() { - private int position=0; - // capture the array for thread-safety - private final Filter[] filters = LIST.toArray(new Filter[LIST.size()]); + private final Iterator itr = list.iterator(); public void doFilter(ServletRequest request, ServletResponse response) throws IOException, ServletException { - if(position==filters.length) { + if(itr.hasNext()) { + // call next + itr.next().doFilter(request, response, this); + } else { // reached to the end chain.doFilter(request,response); - } else { - // call next - filters[position++].doFilter(request,response,this); } } }.doFilter(request,response); } public void destroy() { - synchronized (LIST) { - for (Filter f : LIST) - f.destroy(); + for (Filter f : list) { + f.destroy(); } + list.clear(); } + + private static final Logger LOGGER = Logger.getLogger(PluginServletFilter.class.getName()); } From 9ce5cec1123278ef61c5cdeaf1c92443ff7ca6bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Scheibe?= Date: Tue, 23 Dec 2014 22:00:31 +0100 Subject: [PATCH 085/701] fix Javadoc --- core/src/main/java/hudson/model/ParameterDefinition.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/hudson/model/ParameterDefinition.java b/core/src/main/java/hudson/model/ParameterDefinition.java index fcc1a5cca8..a62c4902c0 100644 --- a/core/src/main/java/hudson/model/ParameterDefinition.java +++ b/core/src/main/java/hudson/model/ParameterDefinition.java @@ -51,7 +51,7 @@ import org.kohsuke.stapler.export.ExportedBean; * *

            * The actual meaning and the purpose of parameters are entirely up to users, so - * what the concrete parameter implmentation is pluggable. Write subclasses + * what the concrete parameter implementation is pluggable. Write subclasses * in a plugin and put {@link Extension} on the descriptor to register them. * *

            @@ -82,8 +82,8 @@ import org.kohsuke.stapler.export.ExportedBean; *

            Assocaited Views

            *

            config.jelly

            *

            - * {@link ParameterDefinition} class uses config.jelly to provide contribute a form - * fragment in the job configuration screen. Values entered there is fed back to + * {@link ParameterDefinition} class uses config.jelly to contribute a form + * fragment in the job configuration screen. Values entered there are fed back to * {@link ParameterDescriptor#newInstance(StaplerRequest, JSONObject)} to create {@link ParameterDefinition}s. * *

            index.jelly

            From d2f49da5b6352a485af13da6f83d1ba63395dbc0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Scheibe?= Date: Thu, 25 Dec 2014 18:16:41 +0100 Subject: [PATCH 086/701] cleanup - make pom.xml files more consistent --- cli/pom.xml | 6 +++--- core/pom.xml | 13 ++++--------- plugins/pom.xml | 1 + pom.xml | 8 ++++++-- test/pom.xml | 15 ++++----------- test/src/main/preset-data/simple-projects/pom.xml | 6 ++---- war/pom.xml | 10 ++-------- 7 files changed, 22 insertions(+), 37 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index 35a9cdbad9..e98a9642fd 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -3,14 +3,15 @@ 4.0.0 - pom org.jenkins-ci.main + pom 1.597-SNAPSHOT cli - Jenkins CLI + Jenkins cli + Command line interface for Jenkins @@ -93,5 +94,4 @@ - diff --git a/core/pom.xml b/core/pom.xml index 1eb0ddeade..2f9134ebc0 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -1,3 +1,4 @@ + - 4.0.0 @@ -30,15 +30,12 @@ THE SOFTWARE. org.jenkins-ci.main pom 1.597-SNAPSHOT - ../pom.xml jenkins-core Jenkins core - - Contains the core Jenkins code and view files to render HTML. - + Jenkins core code and view files to render HTML. true @@ -862,7 +859,7 @@ THE SOFTWARE. - + findbugs @@ -880,9 +877,7 @@ THE SOFTWARE. - + cobertura diff --git a/plugins/pom.xml b/plugins/pom.xml index 6fee680ce5..fd63ca7879 100644 --- a/plugins/pom.xml +++ b/plugins/pom.xml @@ -1,6 +1,7 @@ 4.0.0 + org.jenkins-ci jenkins diff --git a/pom.xml b/pom.xml index cb50c1228e..babcc26c23 100644 --- a/pom.xml +++ b/pom.xml @@ -38,6 +38,7 @@ THE SOFTWARE. Jenkins main module The module that constitutes the main jenkins.war + The MIT license @@ -60,6 +61,7 @@ THE SOFTWARE. https://github.com/jenkinsci/jenkins HEAD + github-pages @@ -113,6 +115,7 @@ THE SOFTWARE. + repo.jenkins-ci.org @@ -128,7 +131,6 @@ THE SOFTWARE. - org.apache.ant ant @@ -222,6 +224,7 @@ THE SOFTWARE. + @@ -327,6 +330,7 @@ THE SOFTWARE. + org.apache.maven.plugins maven-gpg-plugin 1.4 @@ -476,7 +480,7 @@ THE SOFTWARE. org.apache.maven.plugins maven-pmd-plugin 2.7.1 - + org.jenkins-ci.tools diff --git a/test/pom.xml b/test/pom.xml index 6df582ab65..d08bc75181 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -22,22 +22,19 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --> - 4.0.0 - pom org.jenkins-ci.main + pom 1.597-SNAPSHOT - org.jenkins-ci.main + jenkins-test-harness Test harness for Jenkins and plugins - - Unit test harness (src/main) and Unit tests for Jenkins core (src/test) - + Unit test harness (src/main) and Unit tests for Jenkins core (src/test) 2 @@ -146,7 +143,6 @@ THE SOFTWARE. xalan 2.7.1 - org.jvnet.hudson embedded-rhino-debugger @@ -246,7 +242,6 @@ THE SOFTWARE. ant-launcher 1.8.0 - org.codehaus.gmaven.runtime gmaven-runtime-2.0 @@ -279,9 +274,7 @@ THE SOFTWARE. - + cobertura diff --git a/test/src/main/preset-data/simple-projects/pom.xml b/test/src/main/preset-data/simple-projects/pom.xml index abbd9bc544..942d26c344 100644 --- a/test/src/main/preset-data/simple-projects/pom.xml +++ b/test/src/main/preset-data/simple-projects/pom.xml @@ -1,6 +1,7 @@ - + 4.0.0 + com.example test.prop.hudson 1.0 @@ -9,7 +10,4 @@ default - - - diff --git a/war/pom.xml b/war/pom.xml index 4647a9f95c..1fbb94e958 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -1,3 +1,4 @@ + - 4.0.0 @@ -29,17 +29,13 @@ THE SOFTWARE. org.jenkins-ci.main pom 1.597-SNAPSHOT - ../pom.xml jenkins-war war Jenkins war - - Creates a war file. Also includes additional static web resources, such as images, CSS, JavaScript, and - some HTML files. - + Creates a war file. Also includes additional static web resources, such as images, CSS, JavaScript, and some HTML files. ${basedir}/work @@ -54,7 +50,6 @@ THE SOFTWARE. 1.29 provided - org.jenkins-ci.main jenkins-core @@ -168,7 +163,6 @@ THE SOFTWARE. slf4j-jdk14 - +

            What's new in 1.596 (2015/01/04)

            • Build page was broken in Hungarian localization while building. @@ -70,7 +73,6 @@ Upcoming changes Allow breaking label and node lists, (issue 25989)
            -

            What's new in 1.595 (2014/12/21)

            • From 8166c60243b45aa60f9f578b2f9dba6ccd408e7b Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sun, 4 Jan 2015 16:45:00 -0800 Subject: [PATCH 104/701] updated changelog as a part of the release --- debian/debian/changelog | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/debian/debian/changelog b/debian/debian/changelog index 396919e31a..85d2ecca42 100644 --- a/debian/debian/changelog +++ b/debian/debian/changelog @@ -1,3 +1,9 @@ +jenkins (1.596) unstable; urgency=low + + * See http://jenkins-ci.org/changelog for more details. + + -- Kohsuke Kawaguchi Sun, 04 Jan 2015 16:23:33 -0800 + jenkins (1.595) unstable; urgency=low * See http://jenkins-ci.org/changelog for more details. From 26e0ef58879bf56d717febb49b4ea0d5eaad2179 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sun, 4 Jan 2015 17:45:34 -0800 Subject: [PATCH 105/701] creating an RC branch --- changelog.html | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/changelog.html b/changelog.html index 97cb4d92bd..12725b88b9 100644 --- a/changelog.html +++ b/changelog.html @@ -54,6 +54,14 @@ Upcoming changes + + + - - -

              What's new in 1.596 (2015/01/04)

                From 239caf89ecbac1c3f0ea3604098b502a8098625e Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sun, 4 Jan 2015 17:45:38 -0800 Subject: [PATCH 106/701] the trunk is toward 1.598-SNAPSHOT --- cli/pom.xml | 2 +- core/pom.xml | 2 +- plugins/pom.xml | 8 ++++---- pom.xml | 2 +- test/pom.xml | 2 +- war/pom.xml | 2 +- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index e98a9642fd..9e3d92ea68 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main pom - 1.597-SNAPSHOT + 1.598-SNAPSHOT cli diff --git a/core/pom.xml b/core/pom.xml index 2f9134ebc0..e1093edab6 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 1.597-SNAPSHOT + 1.598-SNAPSHOT jenkins-core diff --git a/plugins/pom.xml b/plugins/pom.xml index fd63ca7879..8aa3f0cd33 100644 --- a/plugins/pom.xml +++ b/plugins/pom.xml @@ -12,7 +12,7 @@ org.jenkins-ci.plugins plugin Jenkins plugin POM - 1.597-SNAPSHOT + 1.598-SNAPSHOT pom From 9595175f1002e10e4468f6e51f185a5d2b624240 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20Gond=C5=BEa?= Date: Tue, 6 Jan 2015 12:28:01 +0100 Subject: [PATCH 117/701] Use JUnit4 in merged patch too --- test/src/test/java/hudson/model/QueueTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/src/test/java/hudson/model/QueueTest.java b/test/src/test/java/hudson/model/QueueTest.java index 85c3864525..01cc74dfc5 100644 --- a/test/src/test/java/hudson/model/QueueTest.java +++ b/test/src/test/java/hudson/model/QueueTest.java @@ -571,7 +571,7 @@ public class QueueTest { public void testWaitForStartAndCancelBeforeStart() throws Exception { final OneShotEvent ev = new OneShotEvent(); - FreeStyleProject p = createFreeStyleProject(); + FreeStyleProject p = r.createFreeStyleProject(); QueueTaskFuture f = p.scheduleBuild2(10); final Queue.Item item = Queue.getInstance().getItem(p); From 86ed77711b2a409e3f74bd1e068817d070bc3603 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Tue, 6 Jan 2015 07:03:08 -0500 Subject: [PATCH 118/701] Correcting 9595175f1002e10e4468f6e51f185a5d2b624240 (JUnit 4 merge fixup for #1472). --- test/src/test/java/hudson/model/QueueTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/src/test/java/hudson/model/QueueTest.java b/test/src/test/java/hudson/model/QueueTest.java index 01cc74dfc5..febe13d5f2 100644 --- a/test/src/test/java/hudson/model/QueueTest.java +++ b/test/src/test/java/hudson/model/QueueTest.java @@ -569,7 +569,7 @@ public class QueueTest { } } - public void testWaitForStartAndCancelBeforeStart() throws Exception { + @Test public void waitForStartAndCancelBeforeStart() throws Exception { final OneShotEvent ev = new OneShotEvent(); FreeStyleProject p = r.createFreeStyleProject(); From 0cdab01c7e2869be559537fabbbebd2f727ce5f3 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Tue, 6 Jan 2015 09:54:16 -0500 Subject: [PATCH 119/701] Jenkins was failing to log exceptions from raw Runnable/Callable sent to Timer (without using SafeTimerTask, PeriodicWork, etc.). --- ...rorLoggingScheduledThreadPoolExecutor.java | 85 +++++++++++++++++++ core/src/main/java/jenkins/util/Timer.java | 5 +- 2 files changed, 86 insertions(+), 4 deletions(-) create mode 100644 core/src/main/java/jenkins/util/ErrorLoggingScheduledThreadPoolExecutor.java diff --git a/core/src/main/java/jenkins/util/ErrorLoggingScheduledThreadPoolExecutor.java b/core/src/main/java/jenkins/util/ErrorLoggingScheduledThreadPoolExecutor.java new file mode 100644 index 0000000000..8765af84bf --- /dev/null +++ b/core/src/main/java/jenkins/util/ErrorLoggingScheduledThreadPoolExecutor.java @@ -0,0 +1,85 @@ +/* + * The MIT License + * + * Copyright 2015 Jesse Glick. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package jenkins.util; + +import java.util.concurrent.CancellationException; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Future; +import java.util.concurrent.RejectedExecutionHandler; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.ThreadFactory; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * Executor service that logs otherwise uncaught errors. + * TODO is there anything in Guava for this? + */ +class ErrorLoggingScheduledThreadPoolExecutor extends ScheduledThreadPoolExecutor { + + private static final Logger LOGGER = Logger.getLogger(ErrorLoggingScheduledThreadPoolExecutor.class.getName()); + + ErrorLoggingScheduledThreadPoolExecutor(int corePoolSize) { + super(corePoolSize); + } + + ErrorLoggingScheduledThreadPoolExecutor(int corePoolSize, ThreadFactory threadFactory) { + super(corePoolSize, threadFactory); + } + + ErrorLoggingScheduledThreadPoolExecutor(int corePoolSize, RejectedExecutionHandler handler) { + super(corePoolSize, handler); + } + + ErrorLoggingScheduledThreadPoolExecutor(int corePoolSize, ThreadFactory threadFactory, RejectedExecutionHandler handler) { + super(corePoolSize, threadFactory, handler); + } + + @Override protected void afterExecute(Runnable r, Throwable t) { + super.afterExecute(r, t); + if (t == null && r instanceof Future) { + Future f = (Future) r; + if (f.isDone()) { // TODO super Javadoc does not suggest this, but without it, we hang in FutureTask.awaitDone! + try { + f.get(/* just to be on the safe side, do not wait */0, TimeUnit.NANOSECONDS); + } catch (TimeoutException x) { + // should not happen, right? + } catch (CancellationException x) { + // probably best to ignore this + } catch (ExecutionException x) { + t = x.getCause(); + } catch (InterruptedException x) { + Thread.currentThread().interrupt(); + } + } + } + if (t != null) { + LOGGER.log(Level.WARNING, "failure in task not wrapped in SafeTimerTask", t); + } + } + +} diff --git a/core/src/main/java/jenkins/util/Timer.java b/core/src/main/java/jenkins/util/Timer.java index a84162364b..27870fd26b 100644 --- a/core/src/main/java/jenkins/util/Timer.java +++ b/core/src/main/java/jenkins/util/Timer.java @@ -1,13 +1,10 @@ package jenkins.util; - import hudson.util.DaemonThreadFactory; import hudson.util.NamingThreadFactory; import javax.annotation.Nonnull; -import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; - /** * Holds the {@link ScheduledExecutorService} for running all background tasks in Jenkins. * This ExecutorService will create additional threads to execute due (enabled) tasks. @@ -42,7 +39,7 @@ public class Timer { if (executorService == null) { // corePoolSize is set to 10, but will only be created if needed. // ScheduledThreadPoolExecutor "acts as a fixed-sized pool using corePoolSize threads" - executorService = Executors.newScheduledThreadPool(10, new NamingThreadFactory(new DaemonThreadFactory(), "jenkins.util.Timer")); + executorService = new ErrorLoggingScheduledThreadPoolExecutor(10, new NamingThreadFactory(new DaemonThreadFactory(), "jenkins.util.Timer")); } return executorService; } From 3a618a0633db8c6d16fa018e4a67714994e5cb94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Scheibe?= Date: Tue, 30 Dec 2014 14:29:08 +0100 Subject: [PATCH 120/701] migrate tests from using HudsonTestCase to JenkinsRule * these are simple tests without Jelly files or actions implemented in the test class --- .../hudson/cli/EnableJobCommandTest.groovy | 27 ++-- .../hudson/widgets/HistoryWidgetTest.groovy | 27 ++-- .../jenkins/model/BuildDiscarderTest.groovy | 32 +++-- .../model/PeepholePermalinkTest.groovy | 41 +++--- .../test/java/hudson/ExtensionListTest.java | 46 ++++-- .../hudson/FileSystemProvisionerTest.java | 35 +++-- test/src/test/java/hudson/ProcTest.java | 30 ++-- .../console/ExceptionAnnotationTest.java | 23 +-- .../java/hudson/console/UrlAnnotatorTest.java | 22 ++- .../HudsonHomeDiskUsageMonitorTest.java | 21 ++- .../hudson/markup/MarkupFormatterTest.java | 25 ++-- .../model/AbortedFreeStyleBuildTest.java | 43 +++--- test/src/test/java/hudson/model/ApiTest.java | 80 ++++++----- .../model/AutoCompletionCandidatesTest.java | 29 ++-- .../java/hudson/model/ComputerSetTest.java | 46 +++--- .../test/java/hudson/model/ExecutorTest.java | 47 ++++--- .../hudson/model/FreeStyleProjectTest.java | 69 +++++---- .../test/java/hudson/model/HelpLinkTest.java | 44 +++--- .../test/java/hudson/model/HudsonTest.java | 105 ++++++++------ .../java/hudson/model/JobPropertyTest.java | 70 ++++++---- .../test/java/hudson/model/JobQueueTest.java | 52 ++++--- .../java/hudson/model/ManagementLinkTest.java | 25 ++-- .../java/hudson/model/ParametersTest.java | 84 ++++++----- .../hudson/model/UsageStatisticsTest.java | 25 ++-- .../java/hudson/model/UserPropertyTest.java | 21 ++- .../model/labels/LabelAtomPropertyTest.java | 22 ++- .../model/labels/LabelExpressionTest.java | 131 ++++++++++-------- .../model/listeners/ItemListenerTest.java | 28 ++-- .../hudson/model/queue/LoadPredictorTest.java | 30 ++-- .../hudson/model/queue/WideExecutionTest.java | 21 ++- .../DiskSpaceMonitorDescriptorTest.java | 28 +++- .../pages/SystemConfigurationTestCase.java | 41 +++--- .../java/hudson/scm/ChangeLogSetTest.java | 28 ++-- test/src/test/java/hudson/scm/ScmTest.java | 36 +++-- .../security/CliAuthenticationTest.java | 36 +++-- .../HudsonPrivateSecurityRealmTest.java | 39 ++++-- .../test/java/hudson/security/LoginTest.java | 46 +++--- .../java/hudson/slaves/NodePropertyTest.java | 46 +++--- .../java/hudson/tasks/LogRotatorTest.java | 39 ++++-- .../hudson/tasks/UserAvatarResolverTest.java | 36 +++-- .../java/hudson/tools/JDKInstallerTest.java | 82 ++++++----- .../tools/ToolLocationNodePropertyTest.java | 104 +++++++------- .../java/hudson/tools/ToolLocationTest.java | 25 ++-- .../java/hudson/triggers/SCMTriggerTest.java | 39 +++--- .../util/AlternativeUiTextProviderTest.java | 19 ++- .../hudson/util/ArgumentListBuilder2Test.java | 22 ++- .../hudson/util/FormFieldValidatorTest.java | 34 +++-- .../hudson/util/ProcessTreeKillerTest.java | 35 +++-- .../java/hudson/views/ListViewColumnTest.java | 17 ++- .../java/jenkins/ExtensionFilterTest.java | 17 ++- .../model/ExtensionTypeHierarchyTest.java | 23 ++- .../JenkinsLocationConfigurationTest.java | 17 ++- .../jenkins/scm/SCMCheckoutStrategyTest.java | 30 ++-- .../security/ApiTokenPropertyTest.java | 35 +++-- .../src/test/java/lib/hudson/ActionsTest.java | 17 ++- .../java/lib/hudson/ListScmBrowsersTest.java | 29 ++-- .../java/org/jvnet/hudson/main/AppTest.java | 17 ++- .../config.xml | 0 .../hudson.scm.CVSSCM.xml | 0 .../hudson.tasks.Ant.xml | 0 .../hudson.tasks.Mailer.xml | 0 .../hudson.tasks.Maven.xml | 0 .../hudson.tasks.Shell.xml | 0 .../hudson.triggers.SCMTrigger.xml | 0 .../queue.xml | 0 .../secret.key | 0 ...282.zip => dataCompatibilityWith1_282.zip} | Bin .../config.xml | 0 .../hudson.tasks.Ant.xml | 0 .../hudson.tasks.Maven.xml | 0 .../config.xml | 0 .../jobs/foo/config.xml | 0 72 files changed, 1408 insertions(+), 830 deletions(-) rename test/src/test/resources/hudson/model/HudsonTest/{testSimpleConfigSubmit => simpleConfigSubmit}/config.xml (100%) rename test/src/test/resources/hudson/model/HudsonTest/{testSimpleConfigSubmit => simpleConfigSubmit}/hudson.scm.CVSSCM.xml (100%) rename test/src/test/resources/hudson/model/HudsonTest/{testSimpleConfigSubmit => simpleConfigSubmit}/hudson.tasks.Ant.xml (100%) rename test/src/test/resources/hudson/model/HudsonTest/{testSimpleConfigSubmit => simpleConfigSubmit}/hudson.tasks.Mailer.xml (100%) rename test/src/test/resources/hudson/model/HudsonTest/{testSimpleConfigSubmit => simpleConfigSubmit}/hudson.tasks.Maven.xml (100%) rename test/src/test/resources/hudson/model/HudsonTest/{testSimpleConfigSubmit => simpleConfigSubmit}/hudson.tasks.Shell.xml (100%) rename test/src/test/resources/hudson/model/HudsonTest/{testSimpleConfigSubmit => simpleConfigSubmit}/hudson.triggers.SCMTrigger.xml (100%) rename test/src/test/resources/hudson/model/HudsonTest/{testSimpleConfigSubmit => simpleConfigSubmit}/queue.xml (100%) rename test/src/test/resources/hudson/model/HudsonTest/{testSimpleConfigSubmit => simpleConfigSubmit}/secret.key (100%) rename test/src/test/resources/hudson/security/HudsonPrivateSecurityRealmTest/{testDataCompatibilityWith1_282.zip => dataCompatibilityWith1_282.zip} (100%) rename test/src/test/resources/hudson/tools/ToolLocationTest/{testToolCompatibility => toolCompatibility}/config.xml (100%) rename test/src/test/resources/hudson/tools/ToolLocationTest/{testToolCompatibility => toolCompatibility}/hudson.tasks.Ant.xml (100%) rename test/src/test/resources/hudson/tools/ToolLocationTest/{testToolCompatibility => toolCompatibility}/hudson.tasks.Maven.xml (100%) rename test/src/test/resources/jenkins/model/BuildDiscarderTest/{testCompatibility => compatibility}/config.xml (100%) rename test/src/test/resources/jenkins/model/BuildDiscarderTest/{testCompatibility => compatibility}/jobs/foo/config.xml (100%) diff --git a/test/src/test/groovy/hudson/cli/EnableJobCommandTest.groovy b/test/src/test/groovy/hudson/cli/EnableJobCommandTest.groovy index 479814cd72..a9ccca92c8 100644 --- a/test/src/test/groovy/hudson/cli/EnableJobCommandTest.groovy +++ b/test/src/test/groovy/hudson/cli/EnableJobCommandTest.groovy @@ -23,18 +23,26 @@ */ package hudson.cli -import org.jvnet.hudson.test.HudsonTestCase +import static org.junit.Assert.assertFalse +import static org.junit.Assert.assertTrue + +import org.junit.Rule +import org.junit.Test +import org.jvnet.hudson.test.JenkinsRule /** - * - * * @author Kohsuke Kawaguchi */ -public class EnableJobCommandTest extends HudsonTestCase { - void test1() { - def p = createFreeStyleProject(); +public class EnableJobCommandTest { - def cli = new CLI(getURL()) + @Rule + public JenkinsRule j = new JenkinsRule() + + @Test + void test() { + def p = j.createFreeStyleProject() + + def cli = new CLI(j.getURL()) try { cli.execute(["disable-job",p.name]) @@ -42,8 +50,7 @@ public class EnableJobCommandTest extends HudsonTestCase { cli.execute(["enable-job",p.name]) assertFalse(p.disabled) } finally { - cli.close(); + cli.close() } } - -} \ No newline at end of file +} diff --git a/test/src/test/groovy/hudson/widgets/HistoryWidgetTest.groovy b/test/src/test/groovy/hudson/widgets/HistoryWidgetTest.groovy index 6493c6cec2..9d32acfa6b 100644 --- a/test/src/test/groovy/hudson/widgets/HistoryWidgetTest.groovy +++ b/test/src/test/groovy/hudson/widgets/HistoryWidgetTest.groovy @@ -1,23 +1,28 @@ package hudson.widgets -import org.jvnet.hudson.test.HudsonTestCase -import org.jvnet.hudson.test.Bug +import org.junit.Rule +import org.junit.Test +import org.jvnet.hudson.test.Issue +import org.jvnet.hudson.test.JenkinsRule /** - * - * * @author Kohsuke Kawaguchi */ -class HistoryWidgetTest extends HudsonTestCase { - @Bug(15499) - void testMoreLink() { - def p = createFreeStyleProject(); +class HistoryWidgetTest { + + @Rule + public JenkinsRule j = new JenkinsRule() + + @Test + @Issue("JENKINS-15499") + void moreLink() { + def p = j.createFreeStyleProject() for (x in 1..3) { - assertBuildStatusSuccess(p.scheduleBuild2(0)) + j.assertBuildStatusSuccess(p.scheduleBuild2(0)) } - def wc = createWebClient() + def wc = j.createWebClient() wc.javaScriptEnabled = false - wc.goTo("job/${p.name}/buildHistory/all"); + wc.goTo("job/${p.name}/buildHistory/all") } } diff --git a/test/src/test/groovy/jenkins/model/BuildDiscarderTest.groovy b/test/src/test/groovy/jenkins/model/BuildDiscarderTest.groovy index a1243cc572..891cb0ac60 100644 --- a/test/src/test/groovy/jenkins/model/BuildDiscarderTest.groovy +++ b/test/src/test/groovy/jenkins/model/BuildDiscarderTest.groovy @@ -2,24 +2,28 @@ package jenkins.model import hudson.model.AbstractProject import hudson.tasks.LogRotator -import org.jvnet.hudson.test.Bug -import org.jvnet.hudson.test.HudsonTestCase +import org.junit.Rule +import org.junit.Test +import org.jvnet.hudson.test.Issue +import org.jvnet.hudson.test.JenkinsRule import org.jvnet.hudson.test.recipes.LocalData import javax.xml.transform.Source import javax.xml.transform.stream.StreamSource - /** - * - * * @author Kohsuke Kawaguchi */ -public class BuildDiscarderTest extends HudsonTestCase { - @Bug(16979) +public class BuildDiscarderTest { + + @Rule + public JenkinsRule j = new JenkinsRule() + + @Test + @Issue("JENKINS-16979") @LocalData - void testCompatibility() { - AbstractProject p = jenkins.getItem("foo") + void compatibility() { + AbstractProject p = j.jenkins.getItem("foo") verifyLogRotatorSanity(p) // now persist in the new format @@ -37,9 +41,9 @@ public class BuildDiscarderTest extends HudsonTestCase { private static void verifyLogRotatorSanity(AbstractProject p) { LogRotator d = p.buildDiscarder - assert d.daysToKeep == 4; - assert d.numToKeep == 3; - assert d.artifactDaysToKeep == 2; - assert d.artifactNumToKeep == 1; + assert d.daysToKeep == 4 + assert d.numToKeep == 3 + assert d.artifactDaysToKeep == 2 + assert d.artifactNumToKeep == 1 } -} \ No newline at end of file +} diff --git a/test/src/test/groovy/jenkins/model/PeepholePermalinkTest.groovy b/test/src/test/groovy/jenkins/model/PeepholePermalinkTest.groovy index 3470d2cb78..35d25a072d 100644 --- a/test/src/test/groovy/jenkins/model/PeepholePermalinkTest.groovy +++ b/test/src/test/groovy/jenkins/model/PeepholePermalinkTest.groovy @@ -1,26 +1,33 @@ package jenkins.model +import static org.junit.Assert.assertTrue + import hudson.Functions import hudson.Util import hudson.model.Run -import org.jvnet.hudson.test.Bug +import org.junit.Rule +import org.junit.Test import org.jvnet.hudson.test.FailureBuilder -import org.jvnet.hudson.test.HudsonTestCase +import org.jvnet.hudson.test.Issue +import org.jvnet.hudson.test.JenkinsRule /** - * - * * @author Kohsuke Kawaguchi */ -class PeepholePermalinkTest extends HudsonTestCase { +class PeepholePermalinkTest { + + @Rule + public JenkinsRule j = new JenkinsRule() + /** * Basic operation of the permalink generation. */ - void testBasics() { + @Test + void basics() { if (Functions.isWindows()) return; // can't run on windows because we rely on symlinks - def p = createFreeStyleProject() - def b1 = assertBuildStatusSuccess(p.scheduleBuild2(0)) + def p = j.createFreeStyleProject() + def b1 = j.assertBuildStatusSuccess(p.scheduleBuild2(0)) def lsb = new File(p.buildDir, "lastSuccessfulBuild") def lfb = new File(p.buildDir, "lastFailedBuild") @@ -36,7 +43,7 @@ class PeepholePermalinkTest extends HudsonTestCase { // one more build and this time it succeeds p.buildersList.clear() - def b3 = assertBuildStatusSuccess(p.scheduleBuild2(0)) + def b3 = j.assertBuildStatusSuccess(p.scheduleBuild2(0)) assertLink(lsb,b3) assertLink(lfb,b2) @@ -62,11 +69,12 @@ class PeepholePermalinkTest extends HudsonTestCase { /** * job/JOBNAME/lastStable and job/JOBNAME/lastSuccessful symlinks that we used to generate should still work */ - void testLegacyCompatibility() { + @Test + void legacyCompatibility() { if (Functions.isWindows()) return; // can't run on windows because we rely on symlinks - def p = createFreeStyleProject() - def b1 = assertBuildStatusSuccess(p.scheduleBuild2(0)) + def p = j.createFreeStyleProject() + def b1 = j.assertBuildStatusSuccess(p.scheduleBuild2(0)) ["lastStable","lastSuccessful"].each { n -> // test if they both point to b1 @@ -74,10 +82,11 @@ class PeepholePermalinkTest extends HudsonTestCase { } } - @Bug(19034) - void testRebuildBuildNumberPermalinks() { - def p = createFreeStyleProject() - def b = assertBuildStatusSuccess(p.scheduleBuild2(0)) + @Test + @Issue("JENKINS-19034") + void rebuildBuildNumberPermalinks() { + def p = j.createFreeStyleProject() + def b = j.assertBuildStatusSuccess(p.scheduleBuild2(0)) File f = new File(p.getBuildDir(), "1") // assertTrue(Util.isSymlink(f)) f.delete() diff --git a/test/src/test/java/hudson/ExtensionListTest.java b/test/src/test/java/hudson/ExtensionListTest.java index 27fcd842f5..791eef3e40 100644 --- a/test/src/test/java/hudson/ExtensionListTest.java +++ b/test/src/test/java/hudson/ExtensionListTest.java @@ -1,19 +1,32 @@ package hudson; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertTrue; + import jenkins.model.Jenkins; -import org.jvnet.hudson.test.HudsonTestCase; import hudson.model.Descriptor; import hudson.model.Describable; import hudson.util.DescriptorList; import java.util.List; import java.util.Collection; + +import org.junit.Rule; +import org.junit.Test; +import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.WithoutJenkins; /** * @author Kohsuke Kawaguchi */ -public class ExtensionListTest extends HudsonTestCase { +public class ExtensionListTest { + + @Rule + public JenkinsRule j = new JenkinsRule(); + // // // non-Descriptor extension point @@ -32,21 +45,24 @@ public class ExtensionListTest extends HudsonTestCase { } - public void testAutoDiscovery() throws Exception { + @Test + public void autoDiscovery() throws Exception { ExtensionList list = ExtensionList.lookup(Animal.class); assertEquals(2,list.size()); assertNotNull(list.get(Dog.class)); assertNotNull(list.get(Cat.class)); } + @Test @WithoutJenkins - public void testNullJenkinsInstance() throws Exception { + public void nullJenkinsInstance() throws Exception { ExtensionList list = ExtensionList.lookup(Animal.class); assertEquals(0, list.size()); assertFalse(list.iterator().hasNext()); } - public void testExtensionListView() throws Exception { + @Test + public void extensionListView() throws Exception { // this is how legacy list like UserNameResolver.LIST gets created. List LIST = ExtensionListView.createList(Animal.class); @@ -103,20 +119,22 @@ public class ExtensionListTest extends HudsonTestCase { /** * Verifies that the automated {@link Descriptor} lookup works. */ - public void testDescriptorLookup() throws Exception { + @Test + public void descriptorLookup() throws Exception { Descriptor d = new Sishamo().getDescriptor(); - DescriptorExtensionList> list = jenkins.>getDescriptorList(Fish.class); + DescriptorExtensionList> list = j.jenkins.>getDescriptorList(Fish.class); assertSame(d,list.get(Sishamo.DescriptorImpl.class)); - assertSame(d, jenkins.getDescriptor(Sishamo.class)); + assertSame(d, j.jenkins.getDescriptor(Sishamo.class)); } - public void testFishDiscovery() throws Exception { + @Test + public void fishDiscovery() throws Exception { // imagine that this is a static instance, like it is in many LIST static field in Hudson. DescriptorList LIST = new DescriptorList(Fish.class); - DescriptorExtensionList> list = jenkins.>getDescriptorList(Fish.class); + DescriptorExtensionList> list = j.jenkins.>getDescriptorList(Fish.class); assertEquals(2,list.size()); assertNotNull(list.get(Tai.DescriptorImpl.class)); assertNotNull(list.get(Saba.DescriptorImpl.class)); @@ -140,7 +158,8 @@ public class ExtensionListTest extends HudsonTestCase { assertNotNull(LIST.findByName(Saba.class.getName())); } - public void testLegacyDescriptorList() throws Exception { + @Test + public void legacyDescriptorList() throws Exception { // created in a legacy fashion without any tie to ExtensionList DescriptorList LIST = new DescriptorList(); @@ -182,8 +201,9 @@ public class ExtensionListTest extends HudsonTestCase { /** * Makes sure sorting of the components work as expected. */ - public void testOrdinals() { - ExtensionList list = jenkins.getExtensionList(Car.class); + @Test + public void ordinals() { + ExtensionList list = j.jenkins.getExtensionList(Car.class); assertEquals("honda",list.get(0).name); assertEquals("mazda",list.get(1).name); assertEquals("toyota",list.get(2).name); diff --git a/test/src/test/java/hudson/FileSystemProvisionerTest.java b/test/src/test/java/hudson/FileSystemProvisionerTest.java index d7c5da77ed..89ca9911d9 100644 --- a/test/src/test/java/hudson/FileSystemProvisionerTest.java +++ b/test/src/test/java/hudson/FileSystemProvisionerTest.java @@ -1,25 +1,38 @@ package hudson; +import static org.junit.Assert.assertTrue; + import hudson.model.FreeStyleBuild; import hudson.model.FreeStyleProject; import hudson.util.StreamTaskListener; -import org.jvnet.hudson.test.Bug; -import org.jvnet.hudson.test.HudsonTestCase; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; +import org.jvnet.hudson.test.Issue; +import org.jvnet.hudson.test.JenkinsRule; /** * @author Kohsuke Kawaguchi */ -public class FileSystemProvisionerTest extends HudsonTestCase { - @Bug(13165) - public void test13165() throws Exception { - FreeStyleProject p = createFreeStyleProject(); - FreeStyleBuild b = assertBuildStatusSuccess(p.scheduleBuild2(0)); +public class FileSystemProvisionerTest { + + @Rule + public JenkinsRule j = new JenkinsRule(); + + @Rule + public TemporaryFolder tmp = new TemporaryFolder(); + + @Test + @Issue("JENKINS-13165") + public void test() throws Exception { + FreeStyleProject p = j.createFreeStyleProject(); + FreeStyleBuild b = j.assertBuildStatusSuccess(p.scheduleBuild2(0)); b.getWorkspace().child(".dot").touch(0); StreamTaskListener listener = StreamTaskListener.fromStdout(); - WorkspaceSnapshot s = jenkins.getFileSystemProvisioner().snapshot(b, b.getWorkspace(), "**/*", listener); - FilePath tmp = new FilePath(createTmpDir()); - s.restoreTo(b, tmp,listener); - assertTrue(tmp.child(".dot").exists()); + WorkspaceSnapshot s = j.jenkins.getFileSystemProvisioner().snapshot(b, b.getWorkspace(), "**/*", listener); + FilePath dst = new FilePath(tmp.getRoot()); + s.restoreTo(b, dst, listener); + assertTrue(dst.child(".dot").exists()); } } diff --git a/test/src/test/java/hudson/ProcTest.java b/test/src/test/java/hudson/ProcTest.java index 6159fc6edd..c3eebe20a0 100644 --- a/test/src/test/java/hudson/ProcTest.java +++ b/test/src/test/java/hudson/ProcTest.java @@ -1,5 +1,8 @@ package hudson; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; + import hudson.Launcher.LocalLauncher; import hudson.Launcher.RemoteLauncher; import hudson.Proc.RemoteProc; @@ -9,8 +12,10 @@ import hudson.slaves.DumbSlave; import hudson.util.IOUtils; import hudson.util.StreamTaskListener; import jenkins.security.MasterToSlaveCallable; -import org.jvnet.hudson.test.Bug; -import org.jvnet.hudson.test.HudsonTestCase; +import org.junit.Rule; +import org.junit.Test; +import org.jvnet.hudson.test.Issue; +import org.jvnet.hudson.test.JenkinsRule; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; @@ -21,12 +26,17 @@ import java.nio.charset.Charset; /** * @author Kohsuke Kawaguchi */ -public class ProcTest extends HudsonTestCase { +@Issue("JENKINS-7809") +public class ProcTest { + + @Rule + public JenkinsRule j = new JenkinsRule(); + /** * Makes sure that the output flushing and {@link RemoteProc#join()} is synced. */ - @Bug(7809) - public void testRemoteProcOutputSync() throws Exception { + @Test + public void remoteProcOutputSync() throws Exception { VirtualChannel ch = createSlaveChannel(); // keep the pipe fairly busy @@ -59,7 +69,7 @@ public class ProcTest extends HudsonTestCase { } private VirtualChannel createSlaveChannel() throws Exception { - DumbSlave s = createSlave(); + DumbSlave s = j.createSlave(); s.toComputer().connect(false).get(); VirtualChannel ch=null; while (ch==null) { @@ -84,13 +94,13 @@ public class ProcTest extends HudsonTestCase { } } - @Bug(7809) - public void testIoPumpingWithLocalLaunch() throws Exception { + @Test + public void ioPumpingWithLocalLaunch() throws Exception { doIoPumpingTest(new LocalLauncher(new StreamTaskListener(System.out, Charset.defaultCharset()))); } - @Bug(7809) - public void testIoPumpingWithRemoteLaunch() throws Exception { + @Test + public void ioPumpingWithRemoteLaunch() throws Exception { doIoPumpingTest(new RemoteLauncher( new StreamTaskListener(System.out, Charset.defaultCharset()), createSlaveChannel(), true)); diff --git a/test/src/test/java/hudson/console/ExceptionAnnotationTest.java b/test/src/test/java/hudson/console/ExceptionAnnotationTest.java index 9e26289fc9..0c757f2afd 100644 --- a/test/src/test/java/hudson/console/ExceptionAnnotationTest.java +++ b/test/src/test/java/hudson/console/ExceptionAnnotationTest.java @@ -5,7 +5,9 @@ import hudson.model.AbstractBuild; import hudson.model.BuildListener; import hudson.model.FreeStyleBuild; import hudson.model.FreeStyleProject; -import org.jvnet.hudson.test.HudsonTestCase; +import org.junit.Rule; +import org.junit.Test; +import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.TestBuilder; import java.io.IOException; @@ -13,24 +15,29 @@ import java.io.IOException; /** * @author Kohsuke Kawaguchi */ -public class ExceptionAnnotationTest extends HudsonTestCase { - public void test1() throws Exception { - FreeStyleProject p = createFreeStyleProject(); +public class ExceptionAnnotationTest { + + @Rule + public JenkinsRule j = new JenkinsRule(); + + @Test + public void test() throws Exception { + FreeStyleProject p = j.createFreeStyleProject(); p.getBuildersList().add(new TestBuilder() { @Override - public boolean perform(AbstractBuild build, Launcher launcher, BuildListener listener) throws InterruptedException, IOException { + public boolean perform(AbstractBuild build, Launcher launcher, BuildListener listener) { new Throwable().printStackTrace(listener.error("Injecting a failure")); return true; } }); - FreeStyleBuild b = buildAndAssertSuccess(p); + FreeStyleBuild b = j.buildAndAssertSuccess(p); - createWebClient().getPage(b,"console"); + j.createWebClient().getPage(b,"console"); // TODO: check if the annotation is placed // TODO: test an exception with cause and message - + // interactiveBreak(); } } diff --git a/test/src/test/java/hudson/console/UrlAnnotatorTest.java b/test/src/test/java/hudson/console/UrlAnnotatorTest.java index fa3d8bb745..35f4d059eb 100644 --- a/test/src/test/java/hudson/console/UrlAnnotatorTest.java +++ b/test/src/test/java/hudson/console/UrlAnnotatorTest.java @@ -1,5 +1,7 @@ package hudson.console; +import static org.junit.Assert.assertTrue; + import com.gargoylesoftware.htmlunit.html.HtmlPage; import hudson.Launcher; import hudson.MarkupText; @@ -7,7 +9,9 @@ import hudson.model.AbstractBuild; import hudson.model.BuildListener; import hudson.model.FreeStyleBuild; import hudson.model.FreeStyleProject; -import org.jvnet.hudson.test.HudsonTestCase; +import org.junit.Rule; +import org.junit.Test; +import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.TestBuilder; import java.io.IOException; @@ -15,21 +19,26 @@ import java.io.IOException; /** * @author Kohsuke Kawaguchi */ -public class UrlAnnotatorTest extends HudsonTestCase { +public class UrlAnnotatorTest { + + @Rule + public JenkinsRule j = new JenkinsRule(); + + @Test public void test1() throws Exception { - FreeStyleProject p = createFreeStyleProject(); + FreeStyleProject p = j.createFreeStyleProject(); p.getBuildersList().add(new TestBuilder() { @Override - public boolean perform(AbstractBuild build, Launcher launcher, BuildListener listener) throws InterruptedException, IOException { + public boolean perform(AbstractBuild build, Launcher launcher, BuildListener listener) { listener.getLogger().println("http://www.sun.com/"); listener.getLogger().println(""); listener.getLogger().println(""); return true; } }); - FreeStyleBuild b = buildAndAssertSuccess(p); + FreeStyleBuild b = j.buildAndAssertSuccess(p); - HtmlPage c = createWebClient().getPage(b, "console"); + HtmlPage c = j.createWebClient().getPage(b, "console"); String rsp = c.getWebResponse().getContentAsString(); assertTrue(rsp, rsp.contains("http://www.sun.com/")); assertTrue(rsp, rsp.contains("http://www.kohsuke.org/")); @@ -39,6 +48,7 @@ public class UrlAnnotatorTest extends HudsonTestCase { /** * Mark up of URL should consider surrounding markers, if any. */ + @Test public void test2() throws Exception { MarkupText m = new MarkupText("{abc='http://url/',def='ghi'}"); new UrlAnnotator().newInstance(null).annotate(null,m); diff --git a/test/src/test/java/hudson/diagnosis/HudsonHomeDiskUsageMonitorTest.java b/test/src/test/java/hudson/diagnosis/HudsonHomeDiskUsageMonitorTest.java index c2511dd9fb..8f2e42c39a 100644 --- a/test/src/test/java/hudson/diagnosis/HudsonHomeDiskUsageMonitorTest.java +++ b/test/src/test/java/hudson/diagnosis/HudsonHomeDiskUsageMonitorTest.java @@ -1,6 +1,12 @@ package hudson.diagnosis; -import org.jvnet.hudson.test.HudsonTestCase; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import org.junit.Rule; +import org.junit.Test; +import org.jvnet.hudson.test.JenkinsRule; import org.xml.sax.SAXException; import com.gargoylesoftware.htmlunit.html.HtmlPage; import com.gargoylesoftware.htmlunit.html.HtmlForm; @@ -11,14 +17,19 @@ import java.io.IOException; /** * @author Kohsuke Kawaguchi */ -public class HudsonHomeDiskUsageMonitorTest extends HudsonTestCase { - public void testFlow() throws Exception { +public class HudsonHomeDiskUsageMonitorTest { + + @Rule + public JenkinsRule j = new JenkinsRule(); + + @Test + public void flow() throws Exception { // manually activate this HudsonHomeDiskUsageMonitor mon = HudsonHomeDiskUsageMonitor.get(); mon.activated = true; // clicking yes should take us to somewhere - submit(getForm(mon),"yes"); + j.submit(getForm(mon), "yes"); assertTrue(mon.isEnabled()); // now dismiss @@ -38,7 +49,7 @@ public class HudsonHomeDiskUsageMonitorTest extends HudsonTestCase { * Gets the warning form. */ private HtmlForm getForm(HudsonHomeDiskUsageMonitor mon) throws IOException, SAXException { - HtmlPage p = new WebClient().goTo("manage"); + HtmlPage p = j.createWebClient().goTo("manage"); return p.getFormByName(mon.id); } } diff --git a/test/src/test/java/hudson/markup/MarkupFormatterTest.java b/test/src/test/java/hudson/markup/MarkupFormatterTest.java index 8bc5a7bfe3..9410ffe5ba 100644 --- a/test/src/test/java/hudson/markup/MarkupFormatterTest.java +++ b/test/src/test/java/hudson/markup/MarkupFormatterTest.java @@ -23,9 +23,13 @@ */ package hudson.markup; +import static org.junit.Assert.assertEquals; + import hudson.security.AuthorizationStrategy.Unsecured; import hudson.security.HudsonPrivateSecurityRealm; -import org.jvnet.hudson.test.HudsonTestCase; +import org.junit.Rule; +import org.junit.Test; +import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.TestExtension; import org.kohsuke.stapler.DataBoundConstructor; @@ -35,14 +39,19 @@ import java.io.Writer; /** * @author Kohsuke Kawaguchi */ -public class MarkupFormatterTest extends HudsonTestCase { - public void testConfigRoundtrip() throws Exception { - jenkins.setSecurityRealm(new HudsonPrivateSecurityRealm(false)); - jenkins.setAuthorizationStrategy(new Unsecured()); - jenkins.setMarkupFormatter(new DummyMarkupImpl("hello")); - configRoundtrip(); +public class MarkupFormatterTest { - assertEquals("hello", ((DummyMarkupImpl) jenkins.getMarkupFormatter()).prefix); + @Rule + public JenkinsRule j = new JenkinsRule(); + + @Test + public void configRoundtrip() throws Exception { + j.jenkins.setSecurityRealm(new HudsonPrivateSecurityRealm(false)); + j.jenkins.setAuthorizationStrategy(new Unsecured()); + j.jenkins.setMarkupFormatter(new DummyMarkupImpl("hello")); + j.configRoundtrip(); + + assertEquals("hello", ((DummyMarkupImpl) j.jenkins.getMarkupFormatter()).prefix); } public static class DummyMarkupImpl extends MarkupFormatter { diff --git a/test/src/test/java/hudson/model/AbortedFreeStyleBuildTest.java b/test/src/test/java/hudson/model/AbortedFreeStyleBuildTest.java index b70b411811..e8557e2dcd 100644 --- a/test/src/test/java/hudson/model/AbortedFreeStyleBuildTest.java +++ b/test/src/test/java/hudson/model/AbortedFreeStyleBuildTest.java @@ -1,16 +1,26 @@ package hudson.model; +import static org.junit.Assert.assertEquals; + import hudson.Launcher; -import org.jvnet.hudson.test.Bug; -import org.jvnet.hudson.test.HudsonTestCase; +import org.junit.Rule; +import org.junit.Test; +import org.jvnet.hudson.test.Issue; +import org.jvnet.hudson.test.JenkinsRule; +import org.jvnet.hudson.test.JenkinsRule.TestBuildWrapper; import org.jvnet.hudson.test.TestBuilder; import java.io.IOException; -public class AbortedFreeStyleBuildTest extends HudsonTestCase { - @Bug(8054) - public void testBuildWrapperSeesAbortedStatus() throws Exception { - FreeStyleProject project = createFreeStyleProject(); +public class AbortedFreeStyleBuildTest { + + @Rule + public JenkinsRule j = new JenkinsRule(); + + @Test + @Issue("JENKINS-8054") + public void buildWrapperSeesAbortedStatus() throws Exception { + FreeStyleProject project = j.createFreeStyleProject(); TestBuildWrapper wrapper = new TestBuildWrapper(); project.getBuildWrappersList().add(wrapper); project.getBuildersList().add(new AbortingBuilder()); @@ -19,16 +29,10 @@ public class AbortedFreeStyleBuildTest extends HudsonTestCase { assertEquals(Result.ABORTED, wrapper.buildResultInTearDown); } - private static class AbortingBuilder extends TestBuilder { - @Override - public boolean perform(AbstractBuild build, Launcher launcher, BuildListener listener) throws InterruptedException, IOException { - throw new InterruptedException(); - } - } - - @Bug(9203) - public void testInterruptAsFailure() throws Exception { - FreeStyleProject project = createFreeStyleProject(); + @Test + @Issue("JENKINS-9203") + public void interruptAsFailure() throws Exception { + FreeStyleProject project = j.createFreeStyleProject(); TestBuildWrapper wrapper = new TestBuildWrapper(); project.getBuildWrappersList().add(wrapper); project.getBuildersList().add(new TestBuilder() { @@ -42,4 +46,11 @@ public class AbortedFreeStyleBuildTest extends HudsonTestCase { assertEquals(Result.FAILURE, build.getResult()); assertEquals(Result.FAILURE, wrapper.buildResultInTearDown); } + + private static class AbortingBuilder extends TestBuilder { + @Override + public boolean perform(AbstractBuild build, Launcher launcher, BuildListener listener) throws InterruptedException, IOException { + throw new InterruptedException(); + } + } } diff --git a/test/src/test/java/hudson/model/ApiTest.java b/test/src/test/java/hudson/model/ApiTest.java index 3b2d82f5fd..bb2ea6f2f7 100644 --- a/test/src/test/java/hudson/model/ApiTest.java +++ b/test/src/test/java/hudson/model/ApiTest.java @@ -1,18 +1,18 @@ /* * The MIT License - * + * * Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Yahoo!, Inc. - * + * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: - * + * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. - * + * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE @@ -23,60 +23,76 @@ */ package hudson.model; +import static org.junit.Assert.assertEquals; + import com.gargoylesoftware.htmlunit.Page; import java.net.HttpURLConnection; -import org.jvnet.hudson.test.HudsonTestCase; -import org.jvnet.hudson.test.Bug; + +import org.junit.Rule; +import org.junit.Test; +import org.jvnet.hudson.test.Issue; +import org.jvnet.hudson.test.JenkinsRule; /** * @author Kohsuke Kawaguchi */ -public class ApiTest extends HudsonTestCase { +public class ApiTest { - @Bug(2828) - public void testXPath() throws Exception { - new WebClient().goTo("api/xml?xpath=/*[1]","application/xml"); + @Rule + public JenkinsRule j = new JenkinsRule(); + + @Test + @Issue("JENKINS-2828") + public void xpath() throws Exception { + j.createWebClient().goTo("api/xml?xpath=/*[1]", "application/xml"); } - @Bug(3267) - public void testWrappedZeroItems() throws Exception { - Page page = new WebClient().goTo("api/xml?wrapper=root&xpath=/hudson/nonexistent", "application/xml"); + @Test + @Issue("JENKINS-3267") + public void wrappedZeroItems() throws Exception { + Page page = j.createWebClient().goTo("api/xml?wrapper=root&xpath=/hudson/nonexistent", "application/xml"); assertEquals("", page.getWebResponse().getContentAsString()); } - @Bug(3267) - public void testWrappedOneItem() throws Exception { - Page page = new WebClient().goTo("api/xml?wrapper=root&xpath=/hudson/view/name", "application/xml"); + @Test + @Issue("JENKINS-3267") + public void wrappedOneItem() throws Exception { + Page page = j.createWebClient().goTo("api/xml?wrapper=root&xpath=/hudson/view/name", "application/xml"); assertEquals("All", page.getWebResponse().getContentAsString()); } - public void testWrappedMultipleItems() throws Exception { - createFreeStyleProject(); - createFreeStyleProject(); - Page page = new WebClient().goTo("api/xml?wrapper=root&xpath=/hudson/job/name", "application/xml"); + @Test + public void wrappedMultipleItems() throws Exception { + j.createFreeStyleProject(); + j.createFreeStyleProject(); + Page page = j.createWebClient().goTo("api/xml?wrapper=root&xpath=/hudson/job/name", "application/xml"); assertEquals("test0test1", page.getWebResponse().getContentAsString()); } - public void testUnwrappedZeroItems() throws Exception { - new WebClient().assertFails("api/xml?xpath=/hudson/nonexistent", HttpURLConnection.HTTP_NOT_FOUND); + @Test + public void unwrappedZeroItems() throws Exception { + j.createWebClient().assertFails("api/xml?xpath=/hudson/nonexistent", HttpURLConnection.HTTP_NOT_FOUND); } - public void testUnwrappedOneItem() throws Exception { - Page page = new WebClient().goTo("api/xml?xpath=/hudson/view/name", "application/xml"); + @Test + public void unwrappedOneItem() throws Exception { + Page page = j.createWebClient().goTo("api/xml?xpath=/hudson/view/name", "application/xml"); assertEquals("All", page.getWebResponse().getContentAsString()); } - public void testUnwrappedLongString() throws Exception { - jenkins.setSystemMessage("Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."); - Page page = new WebClient().goTo("api/xml?xpath=/hudson/description", "application/xml"); + @Test + public void unwrappedLongString() throws Exception { + j.jenkins.setSystemMessage("Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."); + Page page = j.createWebClient().goTo("api/xml?xpath=/hudson/description", "application/xml"); assertEquals( - ""+jenkins.getSystemMessage()+"", + ""+j.jenkins.getSystemMessage()+"", page.getWebResponse().getContentAsString()); } - public void testUnwrappedMultipleItems() throws Exception { - createFreeStyleProject(); - createFreeStyleProject(); - new WebClient().assertFails("api/xml?xpath=/hudson/job/name", HttpURLConnection.HTTP_INTERNAL_ERROR); + @Test + public void unwrappedMultipleItems() throws Exception { + j.createFreeStyleProject(); + j.createFreeStyleProject(); + j.createWebClient().assertFails("api/xml?xpath=/hudson/job/name", HttpURLConnection.HTTP_INTERNAL_ERROR); } } diff --git a/test/src/test/java/hudson/model/AutoCompletionCandidatesTest.java b/test/src/test/java/hudson/model/AutoCompletionCandidatesTest.java index 13a336e96d..ff6b2f18bb 100644 --- a/test/src/test/java/hudson/model/AutoCompletionCandidatesTest.java +++ b/test/src/test/java/hudson/model/AutoCompletionCandidatesTest.java @@ -1,10 +1,14 @@ package hudson.model; +import static org.junit.Assert.assertEquals; + import hudson.matrix.AxisList; import hudson.matrix.MatrixConfiguration; import hudson.matrix.MatrixProject; import hudson.matrix.TextAxis; -import org.jvnet.hudson.test.HudsonTestCase; +import org.junit.Rule; +import org.junit.Test; +import org.jvnet.hudson.test.JenkinsRule; import java.util.Arrays; import java.util.TreeSet; @@ -12,29 +16,34 @@ import java.util.TreeSet; /** * @author Kohsuke Kawaguchi */ -public class AutoCompletionCandidatesTest extends HudsonTestCase { - public void testCompletion() throws Exception { - FreeStyleProject foo = jenkins.createProject(FreeStyleProject.class, "foo"); - MatrixProject bar = jenkins.createProject(MatrixProject.class, "bar"); +public class AutoCompletionCandidatesTest { + + @Rule + public JenkinsRule j = new JenkinsRule(); + + @Test + public void completion() throws Exception { + FreeStyleProject foo = j.createFreeStyleProject("foo"); + MatrixProject bar = j.createMatrixProject("bar"); bar.setAxes(new AxisList(new TextAxis("x","1","2","3"))); MatrixConfiguration x3 = bar.getItem("x=3"); AutoCompletionCandidates c; - c = AutoCompletionCandidates.ofJobNames(Item.class, "", foo, jenkins); + c = AutoCompletionCandidates.ofJobNames(Item.class, "", foo, j.jenkins); assertContains(c, "foo", "bar"); - c = AutoCompletionCandidates.ofJobNames(Item.class, "ba", foo, jenkins); + c = AutoCompletionCandidates.ofJobNames(Item.class, "ba", foo, j.jenkins); assertContains(c, "bar"); - c = AutoCompletionCandidates.ofJobNames(Item.class, "bar/", foo, jenkins); + c = AutoCompletionCandidates.ofJobNames(Item.class, "bar/", foo, j.jenkins); assertContains(c, "bar/x=1", "bar/x=2", "bar/x=3"); - c = AutoCompletionCandidates.ofJobNames(FreeStyleProject.class, "", foo, jenkins); + c = AutoCompletionCandidates.ofJobNames(FreeStyleProject.class, "", foo, j.jenkins); assertContains(c, "foo"); - c = AutoCompletionCandidates.ofJobNames(MatrixConfiguration.class, "bar/", foo, jenkins); + c = AutoCompletionCandidates.ofJobNames(MatrixConfiguration.class, "bar/", foo, j.jenkins); assertContains(c, "bar/x=1", "bar/x=2", "bar/x=3"); c = AutoCompletionCandidates.ofJobNames(Item.class, "", x3, x3.getParent()); diff --git a/test/src/test/java/hudson/model/ComputerSetTest.java b/test/src/test/java/hudson/model/ComputerSetTest.java index 1bfc6f7395..d8158e7c01 100644 --- a/test/src/test/java/hudson/model/ComputerSetTest.java +++ b/test/src/test/java/hudson/model/ComputerSetTest.java @@ -1,18 +1,18 @@ /* * The MIT License - * + * * Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi - * + * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: - * + * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. - * + * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE @@ -23,36 +23,48 @@ */ package hudson.model; +import static org.junit.Assert.assertTrue; + import hudson.cli.CLI; import hudson.slaves.DumbSlave; -import org.jvnet.hudson.test.HudsonTestCase; -import org.jvnet.hudson.test.Bug; +import org.junit.Rule; +import org.junit.Test; import com.gargoylesoftware.htmlunit.html.HtmlForm; +import org.jvnet.hudson.test.Issue; +import org.jvnet.hudson.test.JenkinsRule; +import org.jvnet.hudson.test.JenkinsRule.WebClient; /** * @author Kohsuke Kawaguchi */ -public class ComputerSetTest extends HudsonTestCase { - @Bug(2821) - public void testPageRendering() throws Exception { - HudsonTestCase.WebClient client = new WebClient(); - createSlave(); +public class ComputerSetTest { + + @Rule + public JenkinsRule j = new JenkinsRule(); + + @Test + @Issue("JENKINS-2821") + public void pageRendering() throws Exception { + WebClient client = j.createWebClient(); + j.createSlave(); client.goTo("computer"); } /** * Tests the basic UI behavior of the node monitoring */ - public void testConfiguration() throws Exception { - HudsonTestCase.WebClient client = new WebClient(); + @Test + public void configuration() throws Exception { + WebClient client = j.createWebClient(); HtmlForm form = client.goTo("computer/configure").getFormByName("config"); - submit(form); + j.submit(form); } - public void testNodeOfflineCli() throws Exception { - DumbSlave s = createSlave(); + @Test + public void nodeOfflineCli() throws Exception { + DumbSlave s = j.createSlave(); - CLI cli = new CLI(getURL()); + CLI cli = new CLI(j.getURL()); try { assertTrue(cli.execute("wait-node-offline","xxx")!=0); assertTrue(cli.execute("wait-node-online",s.getNodeName())==0); diff --git a/test/src/test/java/hudson/model/ExecutorTest.java b/test/src/test/java/hudson/model/ExecutorTest.java index 25234935a9..28c6c7c7c6 100644 --- a/test/src/test/java/hudson/model/ExecutorTest.java +++ b/test/src/test/java/hudson/model/ExecutorTest.java @@ -1,13 +1,16 @@ package hudson.model; +import static org.junit.Assert.*; + import com.gargoylesoftware.htmlunit.html.HtmlPage; import hudson.Launcher; import hudson.util.OneShotEvent; import jenkins.model.CauseOfInterruption.UserInterruption; import jenkins.model.InterruptedBuildAction; -import jenkins.model.Jenkins; -import org.jvnet.hudson.test.Bug; -import org.jvnet.hudson.test.HudsonTestCase; +import org.junit.Rule; +import org.junit.Test; +import org.jvnet.hudson.test.Issue; +import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.TestBuilder; import java.io.IOException; @@ -16,11 +19,16 @@ import java.util.concurrent.Future; /** * @author Kohsuke Kawaguchi */ -public class ExecutorTest extends HudsonTestCase { - public void testYank() throws Exception { - jenkins.setNumExecutors(1); - jenkins.updateComputerList(true); - Computer c = jenkins.toComputer(); +public class ExecutorTest { + + @Rule + public JenkinsRule j = new JenkinsRule(); + + @Test + public void yank() throws Exception { + j.jenkins.setNumExecutors(1); + j.jenkins.updateComputerList(true); + Computer c = j.jenkins.toComputer(); final Executor e = c.getExecutors().get(0); // kill an executor @@ -31,21 +39,22 @@ public class ExecutorTest extends HudsonTestCase { assertTrue(e.getCauseOfDeath()!=null); // test the UI - HtmlPage p = createWebClient().goTo("/"); + HtmlPage p = j.createWebClient().goTo(""); p = p.getAnchorByText("Dead (!)").click(); assertTrue(p.getWebResponse().getContentAsString().contains(ThreadDeath.class.getName())); - submit(p.getFormByName("yank")); + j.submit(p.getFormByName("yank")); assertFalse(c.getExecutors().contains(e)); waitUntilExecutorSizeIs(c, 1); } - @Bug(4756) - public void testWhenAnExecuterIsYankedANewExecuterTakesItsPlace() throws Exception { - jenkins.setNumExecutors(1); - jenkins.updateComputerList(true); + @Test + @Issue("JENKINS-4756") + public void whenAnExecutorIsYankedANewExecutorTakesItsPlace() throws Exception { + j.jenkins.setNumExecutors(1); + j.jenkins.updateComputerList(true); - Computer c = jenkins.toComputer(); + Computer c = j.jenkins.toComputer(); Executor e = getExecutorByNumber(c, 0); kill(e); @@ -67,7 +76,7 @@ public class ExecutorTest extends HudsonTestCase { private void kill(Executor e) throws InterruptedException, IOException { e.killHard(); // trigger a new build which causes the forced death of the executor - createFreeStyleProject().scheduleBuild2(0); + j.createFreeStyleProject().scheduleBuild2(0); while (e.isActive()) Thread.sleep(10); } @@ -84,10 +93,11 @@ public class ExecutorTest extends HudsonTestCase { /** * Makes sure that the cause of interruption is properly recorded. */ - public void testAbortCause() throws Exception { + @Test + public void abortCause() throws Exception { final OneShotEvent e = new OneShotEvent(); - FreeStyleProject p = createFreeStyleProject(); + FreeStyleProject p = j.createFreeStyleProject(); p.getBuildersList().add(new TestBuilder() { @Override public boolean perform(AbstractBuild build, Launcher launcher, BuildListener listener) throws InterruptedException, IOException { @@ -118,5 +128,4 @@ public class ExecutorTest extends HudsonTestCase { // make sure it shows up in the log assertTrue(b.getLog().contains("Johnny")); } - } diff --git a/test/src/test/java/hudson/model/FreeStyleProjectTest.java b/test/src/test/java/hudson/model/FreeStyleProjectTest.java index 75ca0874c1..71767a4f2a 100644 --- a/test/src/test/java/hudson/model/FreeStyleProjectTest.java +++ b/test/src/test/java/hudson/model/FreeStyleProjectTest.java @@ -1,18 +1,18 @@ /* * The MIT License - * + * * Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi - * + * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: - * + * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. - * + * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE @@ -23,14 +23,22 @@ */ package hudson.model; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + import com.gargoylesoftware.htmlunit.html.HtmlForm; import com.gargoylesoftware.htmlunit.html.HtmlPage; import edu.umd.cs.findbugs.annotations.SuppressWarnings; import hudson.tasks.Builder; import hudson.tasks.Shell; import java.io.ByteArrayInputStream; -import org.jvnet.hudson.test.Bug; -import org.jvnet.hudson.test.HudsonTestCase; + +import org.junit.Rule; +import org.junit.Test; +import org.jvnet.hudson.test.Issue; +import org.jvnet.hudson.test.JenkinsRule; +import org.jvnet.hudson.test.JenkinsRule.WebClient; import java.util.List; import java.io.File; @@ -38,23 +46,28 @@ import java.io.File; /** * @author Kohsuke Kawaguchi */ -public class FreeStyleProjectTest extends HudsonTestCase { +public class FreeStyleProjectTest { + + @Rule + public JenkinsRule j = new JenkinsRule(); + /** * Tests a trivial configuration round-trip. * * The goal is to catch a P1-level issue that prevents all the form submissions to fail. */ - public void testConfigSubmission() throws Exception { - FreeStyleProject project = createFreeStyleProject(); + @Test + public void configSubmission() throws Exception { + FreeStyleProject project = j.createFreeStyleProject(); Shell shell = new Shell("echo hello"); project.getBuildersList().add(shell); // emulate the user behavior - WebClient webClient = new WebClient(); + WebClient webClient = j.createWebClient(); HtmlPage page = webClient.getPage(project,"configure"); HtmlForm form = page.getFormByName("config"); - submit(form); + j.submit(form); List builders = project.getBuilders(); assertEquals(1,builders.size()); @@ -66,23 +79,25 @@ public class FreeStyleProjectTest extends HudsonTestCase { /** * Custom workspace and concurrent build had a bad interaction. */ - @Bug(4206) - public void testCustomWorkspaceAllocation() throws Exception { - FreeStyleProject f = createFreeStyleProject(); - File d = createTmpDir(); + @Test + @Issue("JENKINS-4206") + public void customWorkspaceAllocation() throws Exception { + FreeStyleProject f = j.createFreeStyleProject(); + File d = j.createTmpDir(); f.setCustomWorkspace(d.getPath()); - buildAndAssertSuccess(f); + j.buildAndAssertSuccess(f); } /** * Custom workspace and variable expansion. */ - @Bug(3997) - public void testCustomWorkspaceVariableExpansion() throws Exception { - FreeStyleProject f = createFreeStyleProject(); - File d = new File(createTmpDir(),"${JOB_NAME}"); + @Test + @Issue("JENKINS-3997") + public void customWorkspaceVariableExpansion() throws Exception { + FreeStyleProject f = j.createFreeStyleProject(); + File d = new File(j.createTmpDir(),"${JOB_NAME}"); f.setCustomWorkspace(d.getPath()); - FreeStyleBuild b = buildAndAssertSuccess(f); + FreeStyleBuild b = j.buildAndAssertSuccess(f); String path = b.getWorkspace().getRemote(); System.out.println(path); @@ -90,19 +105,20 @@ public class FreeStyleProjectTest extends HudsonTestCase { assertEquals(b.getWorkspace().getName(),f.getName()); } - @Bug(15817) + @Test + @Issue("JENKINS-15817") @SuppressWarnings("DM_DEFAULT_ENCODING") - public void testMinimalConfigXml() throws Exception { + public void minimalConfigXml() throws Exception { // Make sure it can be created without exceptions: - FreeStyleProject project = (FreeStyleProject) jenkins.createProjectFromXML("stuff", new ByteArrayInputStream("".getBytes())); + FreeStyleProject project = (FreeStyleProject) j.jenkins.createProjectFromXML("stuff", new ByteArrayInputStream("".getBytes())); System.out.println(project.getConfigFile().asString()); // and round-tripped: Shell shell = new Shell("echo hello"); project.getBuildersList().add(shell); - WebClient webClient = new WebClient(); + WebClient webClient = j.createWebClient(); HtmlPage page = webClient.getPage(project,"configure"); HtmlForm form = page.getFormByName("config"); - submit(form); + j.submit(form); List builders = project.getBuilders(); assertEquals(1,builders.size()); assertEquals(Shell.class,builders.get(0).getClass()); @@ -110,5 +126,4 @@ public class FreeStyleProjectTest extends HudsonTestCase { assertTrue(builders.get(0)!=shell); System.out.println(project.getConfigFile().asString()); } - } diff --git a/test/src/test/java/hudson/model/HelpLinkTest.java b/test/src/test/java/hudson/model/HelpLinkTest.java index 8dfe85f721..907f127cc9 100644 --- a/test/src/test/java/hudson/model/HelpLinkTest.java +++ b/test/src/test/java/hudson/model/HelpLinkTest.java @@ -1,8 +1,11 @@ package hudson.model; -import hudson.Functions; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + import hudson.tasks.BuildStepMonitor; -import org.jvnet.hudson.test.HudsonTestCase; +import org.junit.Rule; +import org.junit.Test; import com.gargoylesoftware.htmlunit.html.HtmlPage; import com.gargoylesoftware.htmlunit.html.HtmlAnchor; @@ -10,34 +13,42 @@ import java.util.List; import hudson.tasks.Publisher; import hudson.tasks.BuildStepDescriptor; -import hudson.tasks.Builder; import hudson.model.HelpLinkTest.HelpNotFoundBuilder.DescriptorImpl; +import org.jvnet.hudson.test.JenkinsRule; /** * Click all the help links and make sure they resolve to some text, not 404. * * @author Kohsuke Kawaguchi */ -public class HelpLinkTest extends HudsonTestCase { - public void testSystemConfig() throws Exception { - clickAllHelpLinks(new WebClient().goTo("configure")); +public class HelpLinkTest { + + @Rule + public JenkinsRule j = new JenkinsRule(); + + @Test + public void systemConfig() throws Exception { + clickAllHelpLinks(j.createWebClient().goTo("configure")); } - public void testFreestyleConfig() throws Exception { - clickAllHelpLinks(createFreeStyleProject()); + @Test + public void freestyleConfig() throws Exception { + clickAllHelpLinks(j.createFreeStyleProject()); } - public void testMavenConfig() throws Exception { - clickAllHelpLinks(createMavenProject()); + @Test + public void mavenConfig() throws Exception { + clickAllHelpLinks(j.createMavenProject()); } - public void testMatrixConfig() throws Exception { - clickAllHelpLinks(createMatrixProject()); + @Test + public void matrixConfig() throws Exception { + clickAllHelpLinks(j.createMatrixProject()); } - private void clickAllHelpLinks(AbstractProject j) throws Exception { + private void clickAllHelpLinks(AbstractProject p) throws Exception { // TODO: how do we add all the builders and publishers so that we can test this meaningfully? - clickAllHelpLinks(new WebClient().getPage(j, "configure")); + clickAllHelpLinks(j.createWebClient().getPage(p, "configure")); } private void clickAllHelpLinks(HtmlPage p) throws Exception { @@ -74,11 +85,12 @@ public class HelpLinkTest extends HudsonTestCase { * Make sure that this test is meaningful. * Intentionally put 404 and verify that it's detected. */ - public void testNegative() throws Exception { + @Test + public void negative() throws Exception { DescriptorImpl d = new DescriptorImpl(); Publisher.all().add(d); try { - FreeStyleProject p = createFreeStyleProject(); + FreeStyleProject p = j.createFreeStyleProject(); p.getPublishersList().add(new HelpNotFoundBuilder()); clickAllHelpLinks(p); fail("should detect a failure"); diff --git a/test/src/test/java/hudson/model/HudsonTest.java b/test/src/test/java/hudson/model/HudsonTest.java index d4f2caa1c0..4a296f895f 100644 --- a/test/src/test/java/hudson/model/HudsonTest.java +++ b/test/src/test/java/hudson/model/HudsonTest.java @@ -1,18 +1,18 @@ /* * The MIT License - * + * * Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Yahoo! Inc., CloudBees, Inc. - * + * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: - * + * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. - * + * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE @@ -23,6 +23,8 @@ */ package hudson.model; +import static org.junit.Assert.*; + import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException; import com.gargoylesoftware.htmlunit.HttpMethod; import com.gargoylesoftware.htmlunit.Page; @@ -39,9 +41,12 @@ import hudson.tasks.Ant; import hudson.tasks.BuildStep; import hudson.tasks.Ant.AntInstallation; import jenkins.model.Jenkins; -import org.jvnet.hudson.test.Bug; +import org.junit.Rule; +import org.junit.Test; import org.jvnet.hudson.test.Email; -import org.jvnet.hudson.test.HudsonTestCase; +import org.jvnet.hudson.test.Issue; +import org.jvnet.hudson.test.JenkinsRule; +import org.jvnet.hudson.test.JenkinsRule.WebClient; import org.jvnet.hudson.test.recipes.LocalData; import java.lang.reflect.Field; @@ -52,45 +57,51 @@ import java.util.List; /** * @author Kohsuke Kawaguchi */ -public class HudsonTest extends HudsonTestCase { +public class HudsonTest { + + @Rule + public JenkinsRule j = new JenkinsRule(); + /** * Tests the basic UI sanity and HtmlUnit set up. */ - public void testGlobalConfigRoundtrip() throws Exception { - jenkins.setQuietPeriod(10); - jenkins.setScmCheckoutRetryCount(9); - jenkins.setNumExecutors(8); - configRoundtrip(); - assertEquals(10,jenkins.getQuietPeriod()); - assertEquals(9,jenkins.getScmCheckoutRetryCount()); - assertEquals(8,jenkins.getNumExecutors()); + @Test + public void globalConfigRoundtrip() throws Exception { + j.jenkins.setQuietPeriod(10); + j.jenkins.setScmCheckoutRetryCount(9); + j.jenkins.setNumExecutors(8); + j.configRoundtrip(); + assertEquals(10, j.jenkins.getQuietPeriod()); + assertEquals(9, j.jenkins.getScmCheckoutRetryCount()); + assertEquals(8, j.jenkins.getNumExecutors()); } /** * Performs a very basic round-trip of a non-empty system configuration screen. * This makes sure that the structured form submission is working (to some limited extent.) */ + @Test @LocalData @Email("http://www.nabble.com/Hudson.configure-calling-deprecated-Descriptor.configure-td19051815.html") - public void testSimpleConfigSubmit() throws Exception { + public void simpleConfigSubmit() throws Exception { // just load the page and resubmit - HtmlPage configPage = new WebClient().goTo("configure"); + HtmlPage configPage = j.createWebClient().goTo("configure"); HtmlForm form = configPage.getFormByName("config"); - submit(form); + j.submit(form); // make sure all the pieces are intact - assertEquals(2, jenkins.getNumExecutors()); - assertSame(Mode.NORMAL, jenkins.getMode()); - assertSame(SecurityRealm.NO_AUTHENTICATION, jenkins.getSecurityRealm()); - assertSame(AuthorizationStrategy.UNSECURED, jenkins.getAuthorizationStrategy()); - assertEquals(5, jenkins.getQuietPeriod()); + assertEquals(2, j.jenkins.getNumExecutors()); + assertSame(Mode.NORMAL, j.jenkins.getMode()); + assertSame(SecurityRealm.NO_AUTHENTICATION, j.jenkins.getSecurityRealm()); + assertSame(AuthorizationStrategy.UNSECURED, j.jenkins.getAuthorizationStrategy()); + assertEquals(5, j.jenkins.getQuietPeriod()); - List jdks = jenkins.getJDKs(); + List jdks = j.jenkins.getJDKs(); assertEquals(3,jdks.size()); // Hudson adds one more assertJDK(jdks.get(0),"jdk1","/tmp"); assertJDK(jdks.get(1),"jdk2","/tmp"); - AntInstallation[] ants = jenkins.getDescriptorByType(Ant.DescriptorImpl.class).getInstallations(); + AntInstallation[] ants = j.jenkins.getDescriptorByType(Ant.DescriptorImpl.class).getInstallations(); assertEquals(2,ants.length); assertAnt(ants[0],"ant1","/tmp"); assertAnt(ants[1],"ant2","/tmp"); @@ -112,9 +123,10 @@ public class HudsonTest extends HudsonTestCase { * @see SearchTest#testFailure * This test makes sure that a failure will result in an exception */ - public void testSearchIndex() throws Exception { - FreeStyleProject p = createFreeStyleProject(); - Page jobPage = search(p.getName()); + @Test + public void searchIndex() throws Exception { + FreeStyleProject p = j.createFreeStyleProject(); + Page jobPage = j.search(p.getName()); URL url = jobPage.getWebResponse().getUrl(); System.out.println(url); @@ -124,8 +136,9 @@ public class HudsonTest extends HudsonTestCase { /** * Top page should only have one item in the breadcrumb. */ - public void testBreadcrumb() throws Exception { - HtmlPage root = new WebClient().goTo(""); + @Test + public void breadcrumb() throws Exception { + HtmlPage root = j.createWebClient().goTo(""); HtmlElement navbar = root.getElementById("breadcrumbs"); assertEquals(1,navbar.selectNodes("LI/A").size()); } @@ -133,18 +146,20 @@ public class HudsonTest extends HudsonTestCase { /** * Configure link from "/computer/(master)/" should work. */ + @Test @Email("http://www.nabble.com/Master-slave-refactor-td21361880.html") - public void testComputerConfigureLink() throws Exception { - HtmlPage page = new WebClient().goTo("computer/(master)/configure"); - submit(page.getFormByName("config")); + public void computerConfigureLink() throws Exception { + HtmlPage page = j.createWebClient().goTo("computer/(master)/configure"); + j.submit(page.getFormByName("config")); } /** * Configure link from "/computer/(master)/" should work. */ + @Test @Email("http://www.nabble.com/Master-slave-refactor-td21361880.html") - public void testDeleteHudsonComputer() throws Exception { - HudsonTestCase.WebClient wc = new WebClient(); + public void deleteHudsonComputer() throws Exception { + WebClient wc = j.createWebClient(); HtmlPage page = wc.goTo("computer/(master)/"); for (HtmlAnchor a : page.getAnchors()) assertFalse(a.getHrefAttribute(),a.getHrefAttribute().endsWith("delete")); @@ -165,8 +180,9 @@ public class HudsonTest extends HudsonTestCase { /** * Legacy descriptors should be visible in the /descriptor/xyz URL. */ + @Test @Email("http://www.nabble.com/1.286-version-and-description-The-requested-resource-%28%29-is-not--available.-td22233801.html") - public void testLegacyDescriptorLookup() throws Exception { + public void legacyDescriptorLookup() throws Exception { Descriptor dummy = new Descriptor(HudsonTest.class) { public String getDisplayName() { return "dummy"; @@ -174,24 +190,25 @@ public class HudsonTest extends HudsonTestCase { }; BuildStep.PUBLISHERS.addRecorder(dummy); - assertSame(dummy, jenkins.getDescriptor(HudsonTest.class.getName())); + assertSame(dummy, j.jenkins.getDescriptor(HudsonTest.class.getName())); BuildStep.PUBLISHERS.remove(dummy); - assertNull(jenkins.getDescriptor(HudsonTest.class.getName())); + assertNull(j.jenkins.getDescriptor(HudsonTest.class.getName())); } /** * Verify null/invalid primaryView setting doesn't result in infinite loop. */ - @Bug(6938) - public void testInvalidPrimaryView() throws Exception { + @Test + @Issue("JENKINS-6938") + public void invalidPrimaryView() throws Exception { Field pv = Jenkins.class.getDeclaredField("primaryView"); pv.setAccessible(true); String value = null; - pv.set(jenkins, value); - assertNull("null primaryView", jenkins.getView(value)); + pv.set(j.jenkins, value); + assertNull("null primaryView", j.jenkins.getView(value)); value = "some bogus name"; - pv.set(jenkins, value); - assertNull("invalid primaryView", jenkins.getView(value)); + pv.set(j.jenkins, value); + assertNull("invalid primaryView", j.jenkins.getView(value)); } } diff --git a/test/src/test/java/hudson/model/JobPropertyTest.java b/test/src/test/java/hudson/model/JobPropertyTest.java index 955c981a8b..f8d7cdf5d8 100644 --- a/test/src/test/java/hudson/model/JobPropertyTest.java +++ b/test/src/test/java/hudson/model/JobPropertyTest.java @@ -1,18 +1,18 @@ /* * The MIT License - * + * * Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Erik Ramfelt, CloudBees, Inc. - * + * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: - * + * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. - * + * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE @@ -23,43 +23,55 @@ */ package hudson.model; +import static org.junit.Assert.assertNotSame; +import static org.junit.Assert.assertSame; + import com.gargoylesoftware.htmlunit.WebAssert; import com.gargoylesoftware.htmlunit.html.HtmlPage; import hudson.matrix.MatrixProject; import hudson.maven.MavenModuleSet; import hudson.model.Descriptor.FormException; import net.sf.json.JSONObject; -import org.jvnet.hudson.test.Bug; -import org.jvnet.hudson.test.HudsonTestCase; +import org.junit.Rule; +import org.junit.Test; +import org.jvnet.hudson.test.Issue; +import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.TestExtension; import org.kohsuke.stapler.DataBoundConstructor; import org.kohsuke.stapler.StaplerRequest; -public class JobPropertyTest extends HudsonTestCase { +public class JobPropertyTest { - /** - * Asserts that rfe#2398 is fixed. - */ - @Bug(2398) - public void testJobPropertySummaryIsShownInMavenModuleSetIndexPage() throws Exception { + @Rule + public JenkinsRule j = new JenkinsRule(); + + @Test + @Issue("JENKINS-2398") + public void jobPropertySummaryIsShownInMavenModuleSetIndexPage() throws Exception { assertJobPropertySummaryIsShownInIndexPage(MavenModuleSet.class); } - public void testJobPropertySummaryIsShownInMatrixProjectIndexPage() throws Exception { + + @Test + @Issue("JENKINS-2398") + public void jobPropertySummaryIsShownInMatrixProjectIndexPage() throws Exception { assertJobPropertySummaryIsShownInIndexPage(MatrixProject.class); } - public void testJobPropertySummaryIsShownInFreeStyleProjectIndexPage() throws Exception { + + @Test + @Issue("JENKINS-2398") + public void jobPropertySummaryIsShownInFreeStyleProjectIndexPage() throws Exception { assertJobPropertySummaryIsShownInIndexPage(FreeStyleProject.class); } private void assertJobPropertySummaryIsShownInIndexPage(Class type) throws Exception { JobPropertyImpl jp = new JobPropertyImpl("NeedleInPage"); - Job project = (Job) jenkins.createProject(type, "job-test-case"); + Job project = (Job) j.jenkins.createProject(type, "job-test-case"); project.addProperty(jp); - - HtmlPage page = new WebClient().goTo("job/job-test-case"); + + HtmlPage page = j.createWebClient().goTo("job/job-test-case"); WebAssert.assertTextPresent(page, "NeedleInPage"); } - + public static class JobPropertyImpl extends JobProperty> { private final String propertyString; public JobPropertyImpl(String propertyString) { @@ -88,14 +100,15 @@ public class JobPropertyTest extends HudsonTestCase { /** * Make sure that the UI rendering works as designed. */ - public void testConfigRoundtrip() throws Exception { - FreeStyleProject p = createFreeStyleProject(); + @Test + public void configRoundtrip() throws Exception { + FreeStyleProject p = j.createFreeStyleProject(); JobPropertyWithConfigImpl before = new JobPropertyWithConfigImpl("Duke"); p.addProperty(before); - configRoundtrip((Item)p); + j.configRoundtrip((Item)p); JobPropertyWithConfigImpl after = p.getProperty(JobPropertyWithConfigImpl.class); assertNotSame(after,before); - assertEqualDataBoundBeans(before, after); + j.assertEqualDataBoundBeans(before, after); } public static class JobPropertyWithConfigImpl extends JobProperty> { @@ -106,20 +119,19 @@ public class JobPropertyTest extends HudsonTestCase { this.name = name; } - @TestExtension("testConfigRoundtrip") + @TestExtension("configRoundtrip") public static class DescriptorImpl extends JobPropertyDescriptor { @Override public String getDisplayName() { return null; } } } - - - public void testInvisibleProperty() throws Exception { - FreeStyleProject p = createFreeStyleProject(); + @Test + public void invisibleProperty() throws Exception { + FreeStyleProject p = j.createFreeStyleProject(); InvisibleImpl before = new InvisibleImpl(); p.addProperty(before); - configRoundtrip((Item)p); + j.configRoundtrip((Item)p); InvisibleImpl after = p.getProperty(InvisibleImpl.class); assertSame(after,before); } @@ -134,7 +146,7 @@ public class JobPropertyTest extends HudsonTestCase { return this; } - @TestExtension("testInvisibleProperty") + @TestExtension("invisibleProperty") public static class DescriptorImpl extends JobPropertyDescriptor { @Override public String getDisplayName() { return null; } diff --git a/test/src/test/java/hudson/model/JobQueueTest.java b/test/src/test/java/hudson/model/JobQueueTest.java index ba05d62aa5..4c92d2032d 100644 --- a/test/src/test/java/hudson/model/JobQueueTest.java +++ b/test/src/test/java/hudson/model/JobQueueTest.java @@ -1,19 +1,28 @@ package hudson.model; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; import hudson.model.Queue.BlockedItem; import hudson.model.Queue.WaitingItem; import hudson.model.listeners.RunListener; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.SleepBuilder; -import org.jvnet.hudson.test.HudsonTestCase; -public class JobQueueTest extends HudsonTestCase { +public class JobQueueTest { + + @Rule + public JenkinsRule j = new JenkinsRule(); private static volatile boolean fireCompletedFlag = false; private static volatile boolean fireFinalizeFlag = false; - @Override protected void setUp() throws Exception { - super.setUp(); + @Before + public void setUp() { RunListener listener = new RunListener() { @Override public void onCompleted(Run r, TaskListener listener) { JobQueueTest.fireCompletedFlag = true; @@ -33,9 +42,9 @@ public class JobQueueTest extends HudsonTestCase { RunListener.all().add(listener); } - - public void testBuildPendingWhenBuildRunning() throws Exception { - FreeStyleProject project = createFreeStyleProject("project"); + @Test + public void buildPendingWhenBuildRunning() throws Exception { + FreeStyleProject project = j.createFreeStyleProject("project"); project.getBuildersList().add(new SleepBuilder(2000)); //Kick the first Build @@ -47,16 +56,17 @@ public class JobQueueTest extends HudsonTestCase { assertTrue(project.isInQueue()); //Cancel the project from queue - jenkins.getQueue().cancel(project.getQueueItem()); + j.jenkins.getQueue().cancel(project.getQueueItem()); //Verify the project is removed from Queue - assertTrue(jenkins.getQueue().isEmpty()); + assertTrue(j.jenkins.getQueue().isEmpty()); } - public void testBuildPendingWhenBuildInPostProduction() throws Exception { - - FreeStyleProject project = createFreeStyleProject("project"); + @Test + public void buildPendingWhenBuildInPostProduction() throws Exception { + FreeStyleProject project = j.createFreeStyleProject("project"); project.getBuildersList().add(new SleepBuilder(1000)); + //Kick the first Build project.scheduleBuild2(1); int count =0; @@ -65,18 +75,18 @@ public class JobQueueTest extends HudsonTestCase { Thread.sleep(100); count++; } - + if(JobQueueTest.fireCompletedFlag) { //Schedule the build for the project and this build should be in Queue since the state is POST_PRODUCTION project.scheduleBuild2(0); - assertTrue(project.isInQueue()); //That means its pending or its waiting or blocked - jenkins.getQueue().maintain(); - while(jenkins.getQueue().getItem(project) instanceof WaitingItem) { - System.out.println(jenkins.getQueue().getItem(project)); - jenkins.getQueue().maintain(); + assertTrue(project.isInQueue()); //That means its pending or its waiting or blocked + j.jenkins.getQueue().maintain(); + while(j.jenkins.getQueue().getItem(project) instanceof WaitingItem) { + System.out.println(j.jenkins.getQueue().getItem(project)); + j.jenkins.getQueue().maintain(); Thread.sleep(10); } - assertTrue(jenkins.getQueue().getItem(project) instanceof BlockedItem); //check is it is blocked + assertTrue(j.jenkins.getQueue().getItem(project) instanceof BlockedItem); //check is it is blocked } else { fail("The maximum attemps for checking if the job is in POST_PRODUCTION State have reached"); @@ -90,8 +100,8 @@ public class JobQueueTest extends HudsonTestCase { if(JobQueueTest.fireFinalizeFlag) { //Verify the build is removed from Queue since now it is in Completed state //it should be scheduled for run - jenkins.getQueue().maintain(); - assertFalse(jenkins.getQueue().getItem(project) instanceof BlockedItem); + j.jenkins.getQueue().maintain(); + assertFalse(j.jenkins.getQueue().getItem(project) instanceof BlockedItem); } else { fail("The maximum attemps for checking if the job is in COMPLETED State have reached"); diff --git a/test/src/test/java/hudson/model/ManagementLinkTest.java b/test/src/test/java/hudson/model/ManagementLinkTest.java index 82385ff6c9..52622e28ef 100644 --- a/test/src/test/java/hudson/model/ManagementLinkTest.java +++ b/test/src/test/java/hudson/model/ManagementLinkTest.java @@ -1,18 +1,18 @@ /* * The MIT License - * + * * Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi - * + * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: - * + * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. - * + * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE @@ -23,21 +23,30 @@ */ package hudson.model; +import static org.junit.Assert.assertTrue; + import com.gargoylesoftware.htmlunit.html.HtmlAnchor; import com.gargoylesoftware.htmlunit.html.HtmlPage; -import org.jvnet.hudson.test.HudsonTestCase; +import org.junit.Rule; +import org.junit.Test; +import org.jvnet.hudson.test.JenkinsRule; import java.util.List; /** * @author Kohsuke Kawaguchi */ -public class ManagementLinkTest extends HudsonTestCase { +public class ManagementLinkTest { + + @Rule + public JenkinsRule j = new JenkinsRule(); + /** * Makes sure every link works. */ - public void testLinks() throws Exception { - HtmlPage page = new WebClient().goTo("manage"); + @Test + public void links() throws Exception { + HtmlPage page = j.createWebClient().goTo("manage"); List anchors = page.selectNodes("id('management-links')//*[@class='link']/a[not(@onclick)]"); assertTrue(anchors.size()>=8); for(HtmlAnchor e : (List) anchors) { diff --git a/test/src/test/java/hudson/model/ParametersTest.java b/test/src/test/java/hudson/model/ParametersTest.java index a8fdb5a677..2d87d5ef9e 100644 --- a/test/src/test/java/hudson/model/ParametersTest.java +++ b/test/src/test/java/hudson/model/ParametersTest.java @@ -1,12 +1,9 @@ package hudson.model; -import static org.hamcrest.CoreMatchers.containsString; -import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.Assert.*; +import org.junit.Rule; import org.junit.Test; -import org.jvnet.hudson.test.Bug; -import org.jvnet.hudson.test.HudsonTestCase; -import org.jvnet.hudson.test.CaptureEnvironmentBuilder; import com.gargoylesoftware.htmlunit.html.HtmlPage; import com.gargoylesoftware.htmlunit.html.HtmlForm; @@ -14,20 +11,27 @@ import com.gargoylesoftware.htmlunit.html.HtmlElement; import com.gargoylesoftware.htmlunit.html.HtmlTextInput; import com.gargoylesoftware.htmlunit.html.HtmlCheckBoxInput; import com.gargoylesoftware.htmlunit.html.HtmlOption; +import org.jvnet.hudson.test.CaptureEnvironmentBuilder; import org.jvnet.hudson.test.Issue; +import org.jvnet.hudson.test.JenkinsRule; +import org.jvnet.hudson.test.JenkinsRule.WebClient; import java.util.Set; /** * @author huybrechts */ -public class ParametersTest extends HudsonTestCase { +public class ParametersTest { - public void testParameterTypes() throws Exception { - FreeStyleProject otherProject = createFreeStyleProject(); + @Rule + public JenkinsRule j = new JenkinsRule(); + + @Test + public void parameterTypes() throws Exception { + FreeStyleProject otherProject = j.createFreeStyleProject(); otherProject.scheduleBuild2(0).get(); - FreeStyleProject project = createFreeStyleProject(); + FreeStyleProject project = j.createFreeStyleProject(); ParametersDefinitionProperty pdp = new ParametersDefinitionProperty( new StringParameterDefinition("string", "defaultValue", "string description"), new BooleanParameterDefinition("boolean", true, "boolean description"), @@ -37,9 +41,9 @@ public class ParametersTest extends HudsonTestCase { CaptureEnvironmentBuilder builder = new CaptureEnvironmentBuilder(); project.getBuildersList().add(builder); - WebClient wc = new WebClient(); + WebClient wc = j.createWebClient(); wc.setThrowExceptionOnFailingStatusCode(false); - HtmlPage page = wc.goTo("/job/" + project.getName() + "/build?delay=0sec"); + HtmlPage page = wc.goTo("job/" + project.getName() + "/build?delay=0sec"); HtmlForm form = page.getFormByName("parameters"); @@ -71,28 +75,29 @@ public class ParametersTest extends HudsonTestCase { assertEquals("run description", ((HtmlElement) element.getNextSibling().getNextSibling().selectSingleNode("td[@class='setting-description']")).getTextContent()); assertEquals("run", ((HtmlElement) element.selectSingleNode("td[@class='setting-name']")).getTextContent()); - submit(form); - Queue.Item q = jenkins.getQueue().getItem(project); + j.submit(form); + Queue.Item q = j.jenkins.getQueue().getItem(project); if (q != null) q.getFuture().get(); else Thread.sleep(1000); assertEquals("newValue", builder.getEnvVars().get("STRING")); assertEquals("true", builder.getEnvVars().get("BOOLEAN")); assertEquals("Choice 1", builder.getEnvVars().get("CHOICE")); - assertEquals(jenkins.getRootUrl() + otherProject.getLastBuild().getUrl(), builder.getEnvVars().get("RUN")); + assertEquals(j.jenkins.getRootUrl() + otherProject.getLastBuild().getUrl(), builder.getEnvVars().get("RUN")); } - public void testChoiceWithLTGT() throws Exception { - FreeStyleProject project = createFreeStyleProject(); + @Test + public void choiceWithLTGT() throws Exception { + FreeStyleProject project = j.createFreeStyleProject(); ParametersDefinitionProperty pdp = new ParametersDefinitionProperty( new ChoiceParameterDefinition("choice", "Choice 1\nChoice <2>", "choice description")); project.addProperty(pdp); CaptureEnvironmentBuilder builder = new CaptureEnvironmentBuilder(); project.getBuildersList().add(builder); - WebClient wc = new WebClient(); + WebClient wc = j.createWebClient(); wc.setThrowExceptionOnFailingStatusCode(false); - HtmlPage page = wc.goTo("/job/" + project.getName() + "/build?delay=0sec"); + HtmlPage page = wc.goTo("job/" + project.getName() + "/build?delay=0sec"); HtmlForm form = page.getFormByName("parameters"); HtmlElement element = (HtmlElement) form.selectSingleNode(".//tr[td/div/input/@value='choice']"); @@ -104,8 +109,8 @@ public class ParametersTest extends HudsonTestCase { assertEquals("Choice <2>", opt.asText()); opt.setSelected(true); - submit(form); - Queue.Item q = jenkins.getQueue().getItem(project); + j.submit(form); + Queue.Item q = j.jenkins.getQueue().getItem(project); if (q != null) q.getFuture().get(); else Thread.sleep(1000); @@ -113,8 +118,9 @@ public class ParametersTest extends HudsonTestCase { assertEquals("Choice <2>", builder.getEnvVars().get("CHOICE")); } - public void testSensitiveParameters() throws Exception { - FreeStyleProject project = createFreeStyleProject(); + @Test + public void sensitiveParameters() throws Exception { + FreeStyleProject project = j.createFreeStyleProject(); ParametersDefinitionProperty pdb = new ParametersDefinitionProperty( new PasswordParameterDefinition("password", "12345", "password description")); project.addProperty(pdb); @@ -127,10 +133,11 @@ public class ParametersTest extends HudsonTestCase { assertNotNull(sensitiveVars); assertTrue(sensitiveVars.contains("password")); -} + } - public void testNonSensitiveParameters() throws Exception { - FreeStyleProject project = createFreeStyleProject(); + @Test + public void nonSensitiveParameters() throws Exception { + FreeStyleProject project = j.createFreeStyleProject(); ParametersDefinitionProperty pdb = new ParametersDefinitionProperty( new StringParameterDefinition("string", "defaultValue", "string description")); project.addProperty(pdb); @@ -145,8 +152,9 @@ public class ParametersTest extends HudsonTestCase { assertFalse(sensitiveVars.contains("string")); } - public void testMixedSensitivity() throws Exception { - FreeStyleProject project = createFreeStyleProject(); + @Test + public void mixedSensitivity() throws Exception { + FreeStyleProject project = j.createFreeStyleProject(); ParametersDefinitionProperty pdb = new ParametersDefinitionProperty( new StringParameterDefinition("string", "defaultValue", "string description"), new PasswordParameterDefinition("password", "12345", "password description"), @@ -166,36 +174,38 @@ public class ParametersTest extends HudsonTestCase { assertFalse(sensitiveVars.contains("string2")); } + @Test @Issue("JENKINS-3539") - public void testFileParameterNotSet() throws Exception { - FreeStyleProject project = createFreeStyleProject(); + public void fileParameterNotSet() throws Exception { + FreeStyleProject project = j.createFreeStyleProject(); ParametersDefinitionProperty pdp = new ParametersDefinitionProperty( new FileParameterDefinition("filename", "description")); project.addProperty(pdp); - WebClient wc = new WebClient(); + WebClient wc = j.createWebClient(); wc.setThrowExceptionOnFailingStatusCode(false); - HtmlPage page = wc.goTo("/job/" + project.getName() + "/build?delay=0sec"); + HtmlPage page = wc.goTo("job/" + project.getName() + "/build?delay=0sec"); HtmlForm form = page.getFormByName("parameters"); - submit(form); - Queue.Item q = jenkins.getQueue().getItem(project); + j.submit(form); + Queue.Item q = j.jenkins.getQueue().getItem(project); if (q != null) q.getFuture().get(); else Thread.sleep(1000); assertFalse("file must not exist", project.getSomeWorkspace().child("filename").exists()); } - @Bug(11543) - public void testUnicodeParametersArePresetedCorrectly() throws Exception { - final FreeStyleProject p = createFreeStyleProject(); + @Test + @Issue("JENKINS-11543") + public void unicodeParametersArePresetCorrectly() throws Exception { + final FreeStyleProject p = j.createFreeStyleProject(); ParametersDefinitionProperty pdb = new ParametersDefinitionProperty( new StringParameterDefinition("sname:a¶‱ﻷ", "svalue:a¶‱ﻷ", "sdesc:a¶‱ﻷ"), new FileParameterDefinition("fname:a¶‱ﻷ", "fdesc:a¶‱ﻷ") ); p.addProperty(pdb); - WebClient wc = createWebClient(); + WebClient wc = j.createWebClient(); wc.setThrowExceptionOnFailingStatusCode(false); // Ignore 405 HtmlPage page = wc.getPage(p, "build"); diff --git a/test/src/test/java/hudson/model/UsageStatisticsTest.java b/test/src/test/java/hudson/model/UsageStatisticsTest.java index 38cbe50477..b453807033 100644 --- a/test/src/test/java/hudson/model/UsageStatisticsTest.java +++ b/test/src/test/java/hudson/model/UsageStatisticsTest.java @@ -1,18 +1,18 @@ /* * The MIT License - * + * * Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi - * + * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: - * + * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. - * + * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE @@ -23,12 +23,16 @@ */ package hudson.model; +import static org.junit.Assert.assertEquals; + import com.trilead.ssh2.crypto.Base64; import hudson.Util; import hudson.model.UsageStatistics.CombinedCipherInputStream; import net.sf.json.JSONObject; import org.apache.commons.io.IOUtils; -import org.jvnet.hudson.test.HudsonTestCase; +import org.junit.Rule; +import org.junit.Test; +import org.jvnet.hudson.test.JenkinsRule; import java.io.ByteArrayInputStream; import java.io.InputStreamReader; @@ -40,11 +44,16 @@ import java.util.zip.GZIPInputStream; /** * @author Kohsuke Kawaguchi */ -public class UsageStatisticsTest extends HudsonTestCase { +public class UsageStatisticsTest { + + @Rule + public JenkinsRule j = new JenkinsRule(); + /** * Makes sure that the stat data can be decrypted safely. */ - public void testRoundtrip() throws Exception { + @Test + public void roundtrip() throws Exception { // key pair for testing String privateKey = "30820276020100300d06092a864886f70d0101010500048202603082025c0201000281810084cababdb38040f659c2cb07a36d758f46e84ebc3d6ba39d967aedf1d396b0788ed3ab868d45ce280b1102b434c2a250ddc3254defe1785ab4f94d7038cf69ecca16753d2de3f6ad8976b3f74902d8634111d730982da74e1a6e3fc0bc3523bba53e45b8a8cbfd0321b94efc9f7fefbe66ad85281e3d0323d87f4426ec51204f0203010001028180784deaacdea8bd31f2d44578601954be3f714b93c2d977dbd76efb8f71303e249ad12dbeb2d2a1192a1d7923a6010768d7e06a3597b3df83de1d5688eb0f0e58c76070eddd696682730c93890dc727564c65dc8416bfbde5aad4eb7a97ed923efb55a291daf3c00810c0e43851298472fd539aab355af8cedcf1e9a0cbead661024100c498375102b068806c71dec838dc8dfa5624fb8a524a49cffadc19d10689a8c9c26db514faba6f96e50a605122abd3c9af16e82f2b7565f384528c9f31ea5947024100aceafd31d7f4872a873c7e5fe88f20c2fb086a053c6970026b3ce364768e2033100efb1ad8f2010fe53454a29decedc23a8a0c8df347742b1f13e11bd3a284b9024100931321470cd0f6cd24d4278bf8e61f9d69b6ef2bf3163a944aa340f91c7ffdf33aeea22b18cc43514af6714a21bb148d6cdca14530a8fa65acd7a8f62bfc9b5f024067452059f8438dc61466488336fce3f00ec483ad04db638dce45daf850e5a8cd5635dc39b87f2fab32940247ec5167ddabe06e870858104500967ac687aa73e102407e3b7997503e18d8d0f094d5e0bd5d57cb93cb39a2fc42cec1ea9a1562786438b61139e45813204d72c919f5397e139ad051d98e4d0f8a06d237f42c0d8440fb"; String publicKey = "30819f300d06092a864886f70d010101050003818d003081890281810084cababdb38040f659c2cb07a36d758f46e84ebc3d6ba39d967aedf1d396b0788ed3ab868d45ce280b1102b434c2a250ddc3254defe1785ab4f94d7038cf69ecca16753d2de3f6ad8976b3f74902d8634111d730982da74e1a6e3fc0bc3523bba53e45b8a8cbfd0321b94efc9f7fefbe66ad85281e3d0323d87f4426ec51204f0203010001"; @@ -62,6 +71,4 @@ public class UsageStatisticsTest extends HudsonTestCase { System.out.println(o); assertEquals(1,o.getInt("stat")); } - - } diff --git a/test/src/test/java/hudson/model/UserPropertyTest.java b/test/src/test/java/hudson/model/UserPropertyTest.java index 87474b69f0..650dbc3073 100644 --- a/test/src/test/java/hudson/model/UserPropertyTest.java +++ b/test/src/test/java/hudson/model/UserPropertyTest.java @@ -1,18 +1,27 @@ package hudson.model; -import org.jvnet.hudson.test.Bug; -import org.jvnet.hudson.test.HudsonTestCase; +import static org.junit.Assert.assertNotNull; + +import org.junit.Rule; +import org.junit.Test; +import org.jvnet.hudson.test.Issue; +import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.TestExtension; /** * @author Kohsuke Kawaguchi */ -public class UserPropertyTest extends HudsonTestCase { - @Bug(9062) - public void test9062() throws Exception { +public class UserPropertyTest { + + @Rule + public JenkinsRule j = new JenkinsRule(); + + @Test + @Issue("JENKINS-9062") + public void test() throws Exception { User u = User.get("foo"); u.addProperty(new UserProperty1()); - configRoundtrip(u); + j.configRoundtrip(u); for (UserProperty p : u.getAllProperties()) assertNotNull(p); } diff --git a/test/src/test/java/hudson/model/labels/LabelAtomPropertyTest.java b/test/src/test/java/hudson/model/labels/LabelAtomPropertyTest.java index 9a7dbc373e..4f8c0b9301 100644 --- a/test/src/test/java/hudson/model/labels/LabelAtomPropertyTest.java +++ b/test/src/test/java/hudson/model/labels/LabelAtomPropertyTest.java @@ -23,14 +23,23 @@ */ package hudson.model.labels; -import org.jvnet.hudson.test.HudsonTestCase; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import org.junit.Rule; +import org.junit.Test; +import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.TestExtension; import org.kohsuke.stapler.DataBoundConstructor; /** * @author Kohsuke Kawaguchi */ -public class LabelAtomPropertyTest extends HudsonTestCase { +public class LabelAtomPropertyTest { + + @Rule + public JenkinsRule j = new JenkinsRule(); + public static class LabelAtomPropertyImpl extends LabelAtomProperty { public final String abc; @@ -51,16 +60,17 @@ public class LabelAtomPropertyTest extends HudsonTestCase { /** * Tests the configuration persistence between disk, memory, and UI. */ - public void testConfigRoundtrip() throws Exception { - LabelAtom foo = jenkins.getLabelAtom("foo"); + @Test + public void configRoundtrip() throws Exception { + LabelAtom foo = j.jenkins.getLabelAtom("foo"); LabelAtomPropertyImpl old = new LabelAtomPropertyImpl("value"); foo.getProperties().add(old); assertTrue(foo.getConfigFile().exists()); foo.load(); // make sure load works // it should survive the configuration roundtrip - submit(createWebClient().goTo("label/foo/configure").getFormByName("config")); + j.submit(j.createWebClient().goTo("label/foo/configure").getFormByName("config")); assertEquals(1,foo.getProperties().size()); - assertEqualDataBoundBeans(old, foo.getProperties().get(LabelAtomPropertyImpl.class)); + j.assertEqualDataBoundBeans(old, foo.getProperties().get(LabelAtomPropertyImpl.class)); } } diff --git a/test/src/test/java/hudson/model/labels/LabelExpressionTest.java b/test/src/test/java/hudson/model/labels/LabelExpressionTest.java index 28acaeeebf..057d80d994 100644 --- a/test/src/test/java/hudson/model/labels/LabelExpressionTest.java +++ b/test/src/test/java/hudson/model/labels/LabelExpressionTest.java @@ -23,6 +23,8 @@ */ package hudson.model.labels; +import static org.junit.Assert.*; + import antlr.ANTLRException; import hudson.Launcher; import hudson.model.AbstractBuild; @@ -35,8 +37,10 @@ import hudson.model.Label; import hudson.model.Node.Mode; import hudson.slaves.DumbSlave; import hudson.slaves.RetentionStrategy; -import org.jvnet.hudson.test.Bug; -import org.jvnet.hudson.test.HudsonTestCase; +import org.junit.Rule; +import org.junit.Test; +import org.jvnet.hudson.test.Issue; +import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.SequenceLock; import org.jvnet.hudson.test.TestBuilder; @@ -49,18 +53,23 @@ import java.util.concurrent.Future; /** * @author Kohsuke Kawaguchi */ -public class LabelExpressionTest extends HudsonTestCase { +public class LabelExpressionTest { + + @Rule + public JenkinsRule j = new JenkinsRule(); + /** * Verifies the queueing behavior in the presence of the expression. */ - public void testQueueBehavior() throws Exception { - DumbSlave w32 = createSlave("win 32bit",null); - DumbSlave w64 = createSlave("win 64bit",null); - createSlave("linux 32bit",null); + @Test + public void queueBehavior1() throws Exception { + DumbSlave w32 = j.createSlave("win 32bit", null); + DumbSlave w64 = j.createSlave("win 64bit", null); + j.createSlave("linux 32bit", null); final SequenceLock seq = new SequenceLock(); - FreeStyleProject p1 = createFreeStyleProject(); + FreeStyleProject p1 = j.createFreeStyleProject(); p1.getBuildersList().add(new TestBuilder() { public boolean perform(AbstractBuild build, Launcher launcher, BuildListener listener) throws InterruptedException, IOException { seq.phase(0); // first, make sure the w32 slave is occupied @@ -69,13 +78,13 @@ public class LabelExpressionTest extends HudsonTestCase { return true; } }); - p1.setAssignedLabel(jenkins.getLabel("win && 32bit")); + p1.setAssignedLabel(j.jenkins.getLabel("win && 32bit")); - FreeStyleProject p2 = createFreeStyleProject(); - p2.setAssignedLabel(jenkins.getLabel("win && 32bit")); + FreeStyleProject p2 = j.createFreeStyleProject(); + p2.setAssignedLabel(j.jenkins.getLabel("win && 32bit")); - FreeStyleProject p3 = createFreeStyleProject(); - p3.setAssignedLabel(jenkins.getLabel("win")); + FreeStyleProject p3 = j.createFreeStyleProject(); + p3.setAssignedLabel(j.jenkins.getLabel("win")); Future f1 = p1.scheduleBuild2(0); @@ -85,17 +94,17 @@ public class LabelExpressionTest extends HudsonTestCase { Thread.sleep(1000); // time window to ensure queue has tried to assign f2 build // p3 is tied to 'win', so even though p1 is busy, this should still go ahead and complete - FreeStyleBuild b3 = assertBuildStatusSuccess(p3.scheduleBuild2(0)); + FreeStyleBuild b3 = j.assertBuildStatusSuccess(p3.scheduleBuild2(0)); assertSame(w64,b3.getBuiltOn()); seq.phase(3); // once we confirm that p3 build is over, we let p1 proceed // p1 should have been built on w32 - FreeStyleBuild b1 = assertBuildStatusSuccess(f1); + FreeStyleBuild b1 = j.assertBuildStatusSuccess(f1); assertSame(w32,b1.getBuiltOn()); // and so is p2 - FreeStyleBuild b2 = assertBuildStatusSuccess(f2); + FreeStyleBuild b2 = j.assertBuildStatusSuccess(f2); assertSame(w32,b2.getBuiltOn()); } @@ -103,42 +112,44 @@ public class LabelExpressionTest extends HudsonTestCase { * Push the build around to different nodes via the assignment * to make sure it gets where we need it to. */ - public void testQueueBehavior2() throws Exception { - DumbSlave s = createSlave("win",null); + @Test + public void queueBehavior2() throws Exception { + DumbSlave s = j.createSlave("win", null); - FreeStyleProject p = createFreeStyleProject(); + FreeStyleProject p = j.createFreeStyleProject(); - p.setAssignedLabel(jenkins.getLabel("!win")); - FreeStyleBuild b = assertBuildStatusSuccess(p.scheduleBuild2(0)); - assertSame(jenkins,b.getBuiltOn()); + p.setAssignedLabel(j.jenkins.getLabel("!win")); + FreeStyleBuild b = j.assertBuildStatusSuccess(p.scheduleBuild2(0)); + assertSame(j.jenkins,b.getBuiltOn()); - p.setAssignedLabel(jenkins.getLabel("win")); - b = assertBuildStatusSuccess(p.scheduleBuild2(0)); + p.setAssignedLabel(j.jenkins.getLabel("win")); + b = j.assertBuildStatusSuccess(p.scheduleBuild2(0)); assertSame(s,b.getBuiltOn()); - p.setAssignedLabel(jenkins.getLabel("!win")); - b = assertBuildStatusSuccess(p.scheduleBuild2(0)); - assertSame(jenkins,b.getBuiltOn()); + p.setAssignedLabel(j.jenkins.getLabel("!win")); + b = j.assertBuildStatusSuccess(p.scheduleBuild2(0)); + assertSame(j.jenkins,b.getBuiltOn()); } /** * Make sure we can reset the label of an existing slave. */ - public void testSetLabelString() throws Exception { - DumbSlave s = createSlave("foo","",null); + @Test + public void setLabelString() throws Exception { + DumbSlave s = j.createSlave("foo", "", null); assertSame(s.getLabelString(), ""); - + s.setLabelString("bar"); assertSame(s.getLabelString(), "bar"); - } /** * Tests the expression parser. */ - public void testParser() throws Exception { + @Test + public void parser1() throws Exception { parseAndVerify("foo", "foo"); parseAndVerify("32bit.dot", "32bit.dot"); parseAndVerify("foo||bar", "foo || bar"); @@ -152,8 +163,9 @@ public class LabelExpressionTest extends HudsonTestCase { parseAndVerify("!foo<->bar", "!foo <-> bar"); } - @Bug(8537) - public void testParser2() throws Exception { + @Issue("JENKINS-8537") + @Test + public void parser2() throws Exception { parseAndVerify("aaa&&bbb&&ccc","aaa&&bbb&&ccc"); } @@ -161,26 +173,29 @@ public class LabelExpressionTest extends HudsonTestCase { assertEquals(expected, LabelExpression.parseExpression(expr).getName()); } - public void testParserError() throws Exception { + @Test + public void parserError() throws Exception { parseShouldFail("foo bar"); parseShouldFail("foo (bar)"); } - public void testLaxParsing() { + @Test + public void laxParsing() { // this should parse as an atom - LabelAtom l = (LabelAtom) jenkins.getLabel("lucene.zones.apache.org (Solaris 10)"); + LabelAtom l = (LabelAtom) j.jenkins.getLabel("lucene.zones.apache.org (Solaris 10)"); assertEquals(l.getName(),"lucene.zones.apache.org (Solaris 10)"); assertEquals(l.getExpression(),"\"lucene.zones.apache.org (Solaris 10)\""); } - public void testDataCompatibilityWithHostNameWithWhitespace() throws Exception { + @Test + public void dataCompatibilityWithHostNameWithWhitespace() throws Exception { DumbSlave slave = new DumbSlave("abc def (xyz) : test", "dummy", - createTmpDir().getPath(), "1", Mode.NORMAL, "", createComputerLauncher(null), RetentionStrategy.NOOP, Collections.EMPTY_LIST); - jenkins.addNode(slave); + j.createTmpDir().getPath(), "1", Mode.NORMAL, "", j.createComputerLauncher(null), RetentionStrategy.NOOP, Collections.EMPTY_LIST); + j.jenkins.addNode(slave); - FreeStyleProject p = createFreeStyleProject(); - p.setAssignedLabel(jenkins.getLabel("abc def")); + FreeStyleProject p = j.createFreeStyleProject(); + p.setAssignedLabel(j.jenkins.getLabel("abc def")); assertEquals("abc def",p.getAssignedLabel().getName()); assertEquals("\"abc def\"",p.getAssignedLabel().getExpression()); @@ -194,27 +209,30 @@ public class LabelExpressionTest extends HudsonTestCase { assertEquals("a:b c",p.getAssignedLabel().getName()); } - public void testQuote() { - Label l = jenkins.getLabel("\"abc\\\\\\\"def\""); + @Test + public void quote() { + Label l = j.jenkins.getLabel("\"abc\\\\\\\"def\""); assertEquals("abc\\\"def",l.getName()); - - l = jenkins.getLabel("label1||label2"); // create label expression - l = jenkins.getLabel("\"label1||label2\""); + + l = j.jenkins.getLabel("label1||label2"); // create label expression + l = j.jenkins.getLabel("\"label1||label2\""); assertEquals("label1||label2",l.getName()); } /** * The name should have parenthesis at the right place to preserve the tree structure. */ - public void testComposite() { - LabelAtom x = jenkins.getLabelAtom("x"); + @Test + public void composite() { + LabelAtom x = j.jenkins.getLabelAtom("x"); assertEquals("!!x",x.not().not().getName()); assertEquals("(x||x)&&x",x.or(x).and(x).getName()); assertEquals("x&&x||x",x.and(x).or(x).getName()); } - public void testDash() { - jenkins.getLabelAtom("solaris-x86"); + @Test + public void dash() { + j.jenkins.getLabelAtom("solaris-x86"); } private void parseShouldFail(String expr) { @@ -226,13 +244,14 @@ public class LabelExpressionTest extends HudsonTestCase { } } - public void testFormValidation() throws Exception { - executeOnServer(new Callable() { + @Test + public void formValidation() throws Exception { + j.executeOnServer(new Callable() { public Object call() throws Exception { - DescriptorImpl d = jenkins.getDescriptorByType(DescriptorImpl.class); + DescriptorImpl d = j.jenkins.getDescriptorByType(DescriptorImpl.class); - Label l = jenkins.getLabel("foo"); - DumbSlave s = createSlave(l); + Label l = j.jenkins.getLabel("foo"); + DumbSlave s = j.createSlave(l); String msg = d.doCheckLabel(null, "goo").renderHtml(); assertTrue(msg.contains("foo")); assertTrue(msg.contains("goo")); diff --git a/test/src/test/java/hudson/model/listeners/ItemListenerTest.java b/test/src/test/java/hudson/model/listeners/ItemListenerTest.java index b323e0edb7..2353e1be9c 100644 --- a/test/src/test/java/hudson/model/listeners/ItemListenerTest.java +++ b/test/src/test/java/hudson/model/listeners/ItemListenerTest.java @@ -23,9 +23,15 @@ */ package hudson.model.listeners; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + import hudson.cli.CLI; import hudson.model.Item; -import org.jvnet.hudson.test.HudsonTestCase; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.jvnet.hudson.test.JenkinsRule; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; @@ -36,13 +42,16 @@ import java.util.Arrays; * Tests for ItemListener events. * @author Alan.Harder@sun.com */ -public class ItemListenerTest extends HudsonTestCase { - private ItemListener listener; +public class ItemListenerTest { + + @Rule + public JenkinsRule j = new JenkinsRule(); + private StringBuffer events = new StringBuffer(); - @Override protected void setUp() throws Exception { - super.setUp(); - listener = new ItemListener() { + @Before + public void setUp() throws Exception { + ItemListener listener = new ItemListener() { @Override public void onCreated(Item item) { events.append('C'); } @@ -53,17 +62,18 @@ public class ItemListenerTest extends HudsonTestCase { ItemListener.all().add(0, listener); } - public void testOnCreatedViaCLI() throws Exception { + @Test + public void onCreatedViaCLI() throws Exception { ByteArrayOutputStream buf = new ByteArrayOutputStream(); PrintStream out = new PrintStream(buf); - CLI cli = new CLI(getURL()); + CLI cli = new CLI(j.getURL()); try { cli.execute(Arrays.asList("create-job", "testJob"), new ByteArrayInputStream(("" + "").getBytes()), out, out); out.flush(); - assertNotNull("job should be created: " + buf, jenkins.getItem("testJob")); + assertNotNull("job should be created: " + buf, j.jenkins.getItem("testJob")); assertEquals("onCreated event should be triggered: " + buf, "C", events.toString()); } finally { cli.close(); diff --git a/test/src/test/java/hudson/model/queue/LoadPredictorTest.java b/test/src/test/java/hudson/model/queue/LoadPredictorTest.java index d89139c79b..2689e2218a 100644 --- a/test/src/test/java/hudson/model/queue/LoadPredictorTest.java +++ b/test/src/test/java/hudson/model/queue/LoadPredictorTest.java @@ -23,6 +23,12 @@ */ package hudson.model.queue; +import static java.util.Arrays.asList; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + import hudson.model.Action; import hudson.model.Computer; import hudson.model.Executor; @@ -32,20 +38,26 @@ import hudson.model.Queue.BuildableItem; import hudson.model.Queue.JobOffer; import hudson.model.Queue.Task; import hudson.model.Queue.WaitingItem; -import org.jvnet.hudson.test.HudsonTestCase; +import org.junit.Rule; +import org.junit.Test; +import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.TestExtension; import java.lang.reflect.Field; -import java.util.*; +import java.util.ArrayList; +import java.util.Collection; +import java.util.GregorianCalendar; +import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; -import static java.util.Arrays.*; -import static org.mockito.Mockito.*; - /** * @author Kohsuke Kawaguchi */ -public class LoadPredictorTest extends HudsonTestCase { +public class LoadPredictorTest { + + @Rule + public JenkinsRule j = new JenkinsRule(); + @TestExtension public static class LoadPredictorImpl extends LoadPredictor { @Override @@ -62,12 +74,12 @@ public class LoadPredictorTest extends HudsonTestCase { * - a future load of size 1 is predicted * - hence the consideration of the current task at hand shall fail, as it'll collide with the estimated future load. */ + @Test public void test1() throws Exception { Task t = mock(Task.class); when(t.getEstimatedDuration()).thenReturn(10000L); when(t.getSubTasks()).thenReturn((Collection) asList(t)); - Computer c = createMockComputer(1); JobOffer o = createMockOffer(c.getExecutors().get(0)); @@ -90,12 +102,12 @@ public class LoadPredictorTest extends HudsonTestCase { * - a future load of size 1 is predicted but it'll start after the currently building something is completed. * - hence the currently available executor should be considered available (unlike in test1) */ + @Test public void test2() throws Exception { Task t = mock(Task.class); when(t.getEstimatedDuration()).thenReturn(10000L); when(t.getSubTasks()).thenReturn((Collection) asList(t)); - Computer c = createMockComputer(2); Executor e = c.getExecutors().get(0); @@ -137,7 +149,7 @@ public class LoadPredictorTest extends HudsonTestCase { f.set(c, executors); when(c.getExecutors()).thenReturn(executors); - + return c; } } diff --git a/test/src/test/java/hudson/model/queue/WideExecutionTest.java b/test/src/test/java/hudson/model/queue/WideExecutionTest.java index 5f0155e52a..f5ac35c03e 100644 --- a/test/src/test/java/hudson/model/queue/WideExecutionTest.java +++ b/test/src/test/java/hudson/model/queue/WideExecutionTest.java @@ -23,6 +23,8 @@ */ package hudson.model.queue; +import static org.junit.Assert.assertEquals; + import hudson.model.AbstractBuild; import hudson.model.AbstractProject; import hudson.model.Executor; @@ -30,7 +32,9 @@ import hudson.model.FreeStyleBuild; import hudson.model.FreeStyleProject; import hudson.model.Queue.Executable; import hudson.model.Queue.Task; -import org.jvnet.hudson.test.HudsonTestCase; +import org.junit.Rule; +import org.junit.Test; +import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.TestExtension; import java.io.IOException; @@ -40,7 +44,11 @@ import java.util.Collections; /** * @author Kohsuke Kawaguchi */ -public class WideExecutionTest extends HudsonTestCase { +public class WideExecutionTest { + + @Rule + public JenkinsRule j = new JenkinsRule(); + @TestExtension public static class Contributer extends SubTaskContributor { public Collection forProject(final AbstractProject p) { @@ -79,9 +87,10 @@ public class WideExecutionTest extends HudsonTestCase { } } - public void testRun() throws Exception { - FreeStyleProject p = createFreeStyleProject(); - FreeStyleBuild b = assertBuildStatusSuccess(p.scheduleBuild2(0)); - assertTrue(b.getDescription().equals("I was here")); + @Test + public void run() throws Exception { + FreeStyleProject p = j.createFreeStyleProject(); + FreeStyleBuild b = j.assertBuildStatusSuccess(p.scheduleBuild2(0)); + assertEquals("I was here", b.getDescription()); } } diff --git a/test/src/test/java/hudson/node_monitors/DiskSpaceMonitorDescriptorTest.java b/test/src/test/java/hudson/node_monitors/DiskSpaceMonitorDescriptorTest.java index 7a5e6b4440..95bd47b933 100644 --- a/test/src/test/java/hudson/node_monitors/DiskSpaceMonitorDescriptorTest.java +++ b/test/src/test/java/hudson/node_monitors/DiskSpaceMonitorDescriptorTest.java @@ -1,21 +1,33 @@ package hudson.node_monitors; -import org.jvnet.hudson.test.Bug; -import org.jvnet.hudson.test.HudsonTestCase; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import org.junit.Rule; +import org.junit.Test; import hudson.slaves.DumbSlave; import hudson.slaves.SlaveComputer; import hudson.node_monitors.DiskSpaceMonitorDescriptor.DiskSpace; +import org.jvnet.hudson.test.Issue; +import org.jvnet.hudson.test.JenkinsRule; +import org.jvnet.hudson.test.WithoutJenkins; /** * @author Kohsuke Kawaguchi */ -public class DiskSpaceMonitorDescriptorTest extends HudsonTestCase { +public class DiskSpaceMonitorDescriptorTest { + + @Rule + public JenkinsRule j = new JenkinsRule(); + /** * Makes sure that it returns some value. */ - @Bug(3381) - public void testRemoteDiskSpaceUsage() throws Exception { - DumbSlave s = createSlave(); + @Test + @Issue("JENKINS-3381") + public void remoteDiskSpaceUsage() throws Exception { + DumbSlave s = j.createSlave(); SlaveComputer c = s.getComputer(); c.connect(false).get(); // wait until it's connected if(c.isOffline()) @@ -26,7 +38,9 @@ public class DiskSpaceMonitorDescriptorTest extends HudsonTestCase { assertTrue(du.size>0); } - public void testParse() throws Exception { + @Test + @WithoutJenkins + public void parse() throws Exception { assertEquals(1,DiskSpace.parse("1").size); assertEquals(1024,DiskSpace.parse("1KB").size); assertEquals(1024,DiskSpace.parse("1K").size); diff --git a/test/src/test/java/hudson/pages/SystemConfigurationTestCase.java b/test/src/test/java/hudson/pages/SystemConfigurationTestCase.java index 33b4854f5c..1cf5bb9253 100644 --- a/test/src/test/java/hudson/pages/SystemConfigurationTestCase.java +++ b/test/src/test/java/hudson/pages/SystemConfigurationTestCase.java @@ -23,45 +23,48 @@ */ package hudson.pages; +import static org.junit.Assert.assertEquals; + import com.gargoylesoftware.htmlunit.html.HtmlForm; import com.gargoylesoftware.htmlunit.html.HtmlPage; import hudson.model.PageDecorator; import net.sf.json.JSONObject; -import org.jvnet.hudson.test.HudsonTestCase; -import org.jvnet.hudson.test.Bug; +import org.junit.After; +import org.junit.Rule; +import org.junit.Test; +import org.jvnet.hudson.test.Issue; +import org.jvnet.hudson.test.JenkinsRule; import org.kohsuke.stapler.StaplerRequest; -public class SystemConfigurationTestCase extends HudsonTestCase { +public class SystemConfigurationTestCase { + + @Rule + public JenkinsRule j = new JenkinsRule(); private PageDecoratorImpl pageDecoratorImpl; - protected void tearDown() throws Exception { + @After + public void tearDown() { if (pageDecoratorImpl != null) { PageDecorator.ALL.remove(pageDecoratorImpl); } - super.tearDown(); } - - /** - * Asserts that bug#2289 is fixed. - */ - @Bug(2289) - public void testPageDecoratorIsListedInPage() throws Exception { + + @Test + @Issue("JENKINS-2289") + public void pageDecoratorIsListedInPage() throws Exception { pageDecoratorImpl = new PageDecoratorImpl(); PageDecorator.ALL.add(pageDecoratorImpl); - - HtmlPage page = new WebClient().goTo("configure"); - assertXPath(page,"//tr[@name='hudson-pages-SystemConfigurationTestCase$PageDecoratorImpl']"); + + HtmlPage page = j.createWebClient().goTo("configure"); + j.assertXPath(page, "//tr[@name='hudson-pages-SystemConfigurationTestCase$PageDecoratorImpl']"); HtmlForm form = page.getFormByName("config"); form.getInputByName("_.decoratorId").setValueAttribute("this_is_a_profile"); - submit(form); + j.submit(form); assertEquals("The decorator field was incorrect", "this_is_a_profile", pageDecoratorImpl.getDecoratorId()); } - /** - * PageDecorator for bug#2289 - */ private static class PageDecoratorImpl extends PageDecorator { private String decoratorId; @@ -75,7 +78,7 @@ public class SystemConfigurationTestCase extends HudsonTestCase { public String getDisplayName() { return "PageDecoratorImpl"; } - + public String getDecoratorId() { return decoratorId; } diff --git a/test/src/test/java/hudson/scm/ChangeLogSetTest.java b/test/src/test/java/hudson/scm/ChangeLogSetTest.java index c17d87d3eb..cf22379b90 100644 --- a/test/src/test/java/hudson/scm/ChangeLogSetTest.java +++ b/test/src/test/java/hudson/scm/ChangeLogSetTest.java @@ -1,20 +1,28 @@ package hudson.scm; +import static org.junit.Assert.assertEquals; + import hudson.Extension; import hudson.MarkupText; import hudson.model.AbstractBuild; import hudson.scm.ChangeLogSet.Entry; -import org.jvnet.hudson.test.Bug; +import org.junit.Rule; +import org.junit.Test; import org.jvnet.hudson.test.FakeChangeLogSCM.EntryImpl; -import org.jvnet.hudson.test.HudsonTestCase; +import org.jvnet.hudson.test.Issue; +import org.jvnet.hudson.test.JenkinsRule; -public class ChangeLogSetTest extends HudsonTestCase { +public class ChangeLogSetTest { - @Bug(17084) - public void testCatchingExceptionDuringAnnotation() throws Exception { + @Rule + public JenkinsRule j = new JenkinsRule(); + + @Test + @Issue("JENKINS-17084") + public void catchingExceptionDuringAnnotation() { EntryImpl change = new EntryImpl(); - change.setParent(ChangeLogSet.createEmpty(null)); // otherwise test would actually test only NPE thrown when accessing paret.build + change.setParent(ChangeLogSet.createEmpty(null)); // otherwise test would actually test only NPE thrown when accessing paret.build boolean notCaught = false; try { change.getMsgAnnotated(); @@ -24,24 +32,20 @@ public class ChangeLogSetTest extends HudsonTestCase { assertEquals((new EntryImpl()).getMsg(), change.getMsg()); assertEquals(false, notCaught); } - + @Extension public static final class ThrowExceptionChangeLogAnnotator extends ChangeLogAnnotator { - @Override public void annotate(AbstractBuild build, Entry change, MarkupText text ) { throw new RuntimeException(); } - } - + @Extension public static final class ThrowErrorChangeLogAnnotator extends ChangeLogAnnotator { - @Override public void annotate(AbstractBuild build, Entry change, MarkupText text ) { throw new Error(); } - } } diff --git a/test/src/test/java/hudson/scm/ScmTest.java b/test/src/test/java/hudson/scm/ScmTest.java index 9d1d91f452..502563fb15 100644 --- a/test/src/test/java/hudson/scm/ScmTest.java +++ b/test/src/test/java/hudson/scm/ScmTest.java @@ -23,9 +23,11 @@ */ package hudson.scm; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + import java.io.File; import java.io.IOException; -import java.util.concurrent.ExecutionException; import hudson.FilePath; import hudson.Launcher; @@ -37,20 +39,27 @@ import hudson.model.FreeStyleProject; import hudson.model.Node; import hudson.model.Result; -import org.jvnet.hudson.test.Bug; -import org.jvnet.hudson.test.HudsonTestCase; +import org.junit.Rule; +import org.junit.Test; +import org.jvnet.hudson.test.Issue; +import org.jvnet.hudson.test.JenkinsRule; /** * @author Kohsuke Kawaguchi */ -public class ScmTest extends HudsonTestCase { +public class ScmTest { + + @Rule + public JenkinsRule j = new JenkinsRule(); + /** * Makes sure that {@link SCM#processWorkspaceBeforeDeletion(AbstractProject, FilePath, Node)} is called * before a project deletion. */ - @Bug(2271) - public void testProjectDeletionAndCallback() throws Exception { - FreeStyleProject p = createFreeStyleProject(); + @Test + @Issue("JENKINS-2271") + public void projectDeletionAndCallback() throws Exception { + FreeStyleProject p = j.createFreeStyleProject(); final boolean[] callback = new boolean[1]; p.setScm(new NullSCM() { public boolean processWorkspaceBeforeDeletion(AbstractProject project, FilePath workspace, Node node) { @@ -66,10 +75,11 @@ public class ScmTest extends HudsonTestCase { p.delete(); assertTrue(callback[0]); } - - @Bug(4605) - public void testAbortDuringCheckoutMarksBuildAsAborted() throws IOException, InterruptedException, ExecutionException { - FreeStyleProject p = createFreeStyleProject(); + + @Test + @Issue("JENKINS-4605") + public void abortDuringCheckoutMarksBuildAsAborted() throws Exception { + FreeStyleProject p = j.createFreeStyleProject(); p.setScm(new NullSCM() { @Override public boolean checkout(AbstractBuild build, @@ -78,12 +88,12 @@ public class ScmTest extends HudsonTestCase { throws IOException, InterruptedException { throw new InterruptedException(); } - + private Object writeReplace() { // don't really care about save return new NullSCM(); } }); - + FreeStyleBuild build = p.scheduleBuild2(0).get(); assertEquals(Result.ABORTED, build.getResult()); } diff --git a/test/src/test/java/hudson/security/CliAuthenticationTest.java b/test/src/test/java/hudson/security/CliAuthenticationTest.java index aca444fe17..2c2247791b 100644 --- a/test/src/test/java/hudson/security/CliAuthenticationTest.java +++ b/test/src/test/java/hudson/security/CliAuthenticationTest.java @@ -1,5 +1,8 @@ package hudson.security; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + import hudson.cli.CLI; import hudson.cli.CLICommand; import hudson.cli.ClientAuthenticationCache; @@ -9,8 +12,10 @@ import jenkins.model.Jenkins; import org.acegisecurity.Authentication; import org.apache.commons.io.input.NullInputStream; import org.junit.Assert; +import org.junit.Rule; +import org.junit.Test; import org.jvnet.hudson.test.For; -import org.jvnet.hudson.test.HudsonTestCase; +import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.TestExtension; import java.io.ByteArrayOutputStream; @@ -19,10 +24,15 @@ import java.util.Arrays; /** * @author Kohsuke Kawaguchi */ -public class CliAuthenticationTest extends HudsonTestCase { - public void test1() throws Exception { +public class CliAuthenticationTest { + + @Rule + public JenkinsRule j = new JenkinsRule(); + + @Test + public void test() throws Exception { // dummy security realm that authenticates when username==password - jenkins.setSecurityRealm(createDummySecurityRealm()); + j.jenkins.setSecurityRealm(j.createDummySecurityRealm()); successfulCommand("test","--username","abc","--password","abc"); } @@ -32,7 +42,7 @@ public class CliAuthenticationTest extends HudsonTestCase { } private int command(String... args) throws Exception { - CLI cli = new CLI(getURL()); + CLI cli = new CLI(j.getURL()); try { return cli.execute(args); } finally { @@ -41,7 +51,7 @@ public class CliAuthenticationTest extends HudsonTestCase { } private String commandAndOutput(String... args) throws Exception { - CLI cli = new CLI(getURL()); + CLI cli = new CLI(j.getURL()); try { ByteArrayOutputStream baos = new ByteArrayOutputStream(); cli.execute(Arrays.asList(args), new NullInputStream(0), baos, baos); @@ -62,7 +72,7 @@ public class CliAuthenticationTest extends HudsonTestCase { protected int run() throws Exception { Authentication auth = Jenkins.getAuthentication(); Assert.assertNotSame(Jenkins.ANONYMOUS,auth); - Assert.assertEquals("abc", auth.getName()); + assertEquals("abc", auth.getName()); return 0; } } @@ -82,9 +92,10 @@ public class CliAuthenticationTest extends HudsonTestCase { } } + @Test @For({LoginCommand.class, LogoutCommand.class, ClientAuthenticationCache.class}) - public void testLogin() throws Exception { - jenkins.setSecurityRealm(createDummySecurityRealm()); + public void login() throws Exception { + j.jenkins.setSecurityRealm(j.createDummySecurityRealm()); successfulCommand("login","--username","abc","--password","abc"); successfulCommand("test"); // now we can run without an explicit credential @@ -95,10 +106,11 @@ public class CliAuthenticationTest extends HudsonTestCase { /** * Login failure shouldn't reveal information about the existence of user */ - public void testSecurity110() throws Exception { + @Test + public void security110() throws Exception { HudsonPrivateSecurityRealm realm = new HudsonPrivateSecurityRealm(false,false,null); - jenkins.setSecurityRealm(realm); - jenkins.setAuthorizationStrategy(new FullControlOnceLoggedInAuthorizationStrategy()); + j.jenkins.setSecurityRealm(realm); + j.jenkins.setAuthorizationStrategy(new FullControlOnceLoggedInAuthorizationStrategy()); realm.createAccount("alice","alice"); String out1 = commandAndOutput("help", "--username", "alice", "--password", "bogus"); diff --git a/test/src/test/java/hudson/security/HudsonPrivateSecurityRealmTest.java b/test/src/test/java/hudson/security/HudsonPrivateSecurityRealmTest.java index 78f9afa817..c83a7e4190 100644 --- a/test/src/test/java/hudson/security/HudsonPrivateSecurityRealmTest.java +++ b/test/src/test/java/hudson/security/HudsonPrivateSecurityRealmTest.java @@ -1,52 +1,65 @@ package hudson.security; -import org.jvnet.hudson.test.Bug; -import org.jvnet.hudson.test.HudsonTestCase; +import static hudson.security.HudsonPrivateSecurityRealm.CLASSIC; +import static hudson.security.HudsonPrivateSecurityRealm.PASSWORD_ENCODER; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import org.junit.Rule; +import org.junit.Test; +import org.jvnet.hudson.test.Issue; +import org.jvnet.hudson.test.JenkinsRule; +import org.jvnet.hudson.test.JenkinsRule.WebClient; import org.jvnet.hudson.test.WithoutJenkins; import org.jvnet.hudson.test.recipes.LocalData; import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException; import com.gargoylesoftware.htmlunit.html.HtmlPage; -import static hudson.security.HudsonPrivateSecurityRealm.*; - /** * @author Kohsuke Kawaguchi */ -public class HudsonPrivateSecurityRealmTest extends HudsonTestCase { +public class HudsonPrivateSecurityRealmTest { + + @Rule + public JenkinsRule j = new JenkinsRule(); + /** * Tests the data compatibility with Hudson before 1.283. * Starting 1.283, passwords are now stored hashed. */ - @Bug(2381) + @Test + @Issue("JENKINS-2381") @LocalData - public void testDataCompatibilityWith1_282() throws Exception { + public void dataCompatibilityWith1_282() throws Exception { // make sure we can login with the same password as before - WebClient wc = new WebClient().login("alice", "alice"); + WebClient wc = j.createWebClient().login("alice", "alice"); try { // verify the sanity that the password is really used // this should fail - new WebClient().login("bob","bob"); + j.createWebClient().login("bob", "bob"); } catch (FailingHttpStatusCodeException e) { assertEquals(401,e.getStatusCode()); } // resubmit the config and this should force the data store to be rewritten HtmlPage p = wc.goTo("user/alice/configure"); - submit(p.getFormByName("config")); + j.submit(p.getFormByName("config")); // verify that we can still login - new WebClient().login("alice", "alice"); + j.createWebClient().login("alice", "alice"); } + @Test @WithoutJenkins - public void testHashCompatibility() { + public void hashCompatibility() { String old = CLASSIC.encodePassword("hello world", null); assertTrue(PASSWORD_ENCODER.isPasswordValid(old,"hello world",null)); String secure = PASSWORD_ENCODER.encodePassword("hello world", null); assertTrue(PASSWORD_ENCODER.isPasswordValid(old,"hello world",null)); - assertTrue(!secure.equals(old)); + assertFalse(secure.equals(old)); } } diff --git a/test/src/test/java/hudson/security/LoginTest.java b/test/src/test/java/hudson/security/LoginTest.java index 187077293c..37551a39a3 100644 --- a/test/src/test/java/hudson/security/LoginTest.java +++ b/test/src/test/java/hudson/security/LoginTest.java @@ -1,31 +1,41 @@ package hudson.security; +import static javax.servlet.http.HttpServletResponse.SC_UNAUTHORIZED; +import static org.acegisecurity.ui.rememberme.TokenBasedRememberMeServices.ACEGI_SECURITY_HASHED_REMEMBER_ME_COOKIE_KEY; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; + import com.gargoylesoftware.htmlunit.html.HtmlPage; import com.gargoylesoftware.htmlunit.html.HtmlForm; import com.gargoylesoftware.htmlunit.html.HtmlCheckBoxInput; -import org.jvnet.hudson.test.HudsonTestCase; +import org.junit.Rule; +import org.junit.Test; +import org.jvnet.hudson.test.JenkinsRule; +import org.jvnet.hudson.test.JenkinsRule.WebClient; import org.jvnet.hudson.test.recipes.PresetData; import org.jvnet.hudson.test.recipes.PresetData.DataSet; import org.xml.sax.SAXException; -import static org.acegisecurity.ui.rememberme.TokenBasedRememberMeServices.ACEGI_SECURITY_HASHED_REMEMBER_ME_COOKIE_KEY; - import java.io.IOException; import java.net.URL; -import static javax.servlet.http.HttpServletResponse.SC_UNAUTHORIZED; - /** * @author Kohsuke Kawaguchi */ -public class LoginTest extends HudsonTestCase { +public class LoginTest { + + @Rule + public JenkinsRule j = new JenkinsRule(); + /** * Requesting a loginError page directly should result in a redirect, * on a non-secured Hudson. */ - public void testLoginErrorRedirect() throws Exception { - verifyNotError(createWebClient()); + @Test + public void loginErrorRedirect1() throws Exception { + verifyNotError(j.createWebClient()); } private void verifyNotError(WebClient wc) throws IOException, SAXException { @@ -36,12 +46,13 @@ public class LoginTest extends HudsonTestCase { } /** - * Same as {@link #testLoginErrorRedirect()} if the user has already successfully authenticated. + * Same as {@link #loginErrorRedirect1()} if the user has already successfully authenticated. */ + @Test @PresetData(DataSet.ANONYMOUS_READONLY) - public void testLoginErrorRedirect2() throws Exception { + public void loginErrorRedirect2() throws Exception { // in a secured Hudson, the error page should render. - WebClient wc = createWebClient(); + WebClient wc = j.createWebClient(); wc.assertFails("loginError", SC_UNAUTHORIZED); // but not once the user logs in. verifyNotError(wc.login("alice")); @@ -68,26 +79,27 @@ public class LoginTest extends HudsonTestCase { /** * Test 'remember me' cookie */ + @Test @PresetData(DataSet.SECURED_ACEGI) - public void testLoginRememberMe() throws Exception { - WebClient wc = createWebClient(); + public void loginRememberMe() throws Exception { + WebClient wc = j.createWebClient(); prepareLoginFormWithRememberMeChecked(wc).submit(null); assertNotNull(getRememberMeCookie(wc)); } - /** * Test that 'remember me' cookie will not be set if disabled even if requested by user. * This models the case when the feature is disabled between another user loading and submitting the login page. */ + @Test @PresetData(DataSet.SECURED_ACEGI) - public void testLoginDisabledRememberMe() throws Exception { - WebClient wc = createWebClient(); + public void loginDisabledRememberMe() throws Exception { + WebClient wc = j.createWebClient(); HtmlForm form = prepareLoginFormWithRememberMeChecked(wc); - jenkins.setDisableRememberMe(true); + j.jenkins.setDisableRememberMe(true); form.submit(null); assertNull(getRememberMeCookie(wc)); diff --git a/test/src/test/java/hudson/slaves/NodePropertyTest.java b/test/src/test/java/hudson/slaves/NodePropertyTest.java index c63792b717..6bcdb8070e 100644 --- a/test/src/test/java/hudson/slaves/NodePropertyTest.java +++ b/test/src/test/java/hudson/slaves/NodePropertyTest.java @@ -1,11 +1,19 @@ package hudson.slaves; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotSame; +import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertTrue; + import com.gargoylesoftware.htmlunit.html.HtmlForm; import com.gargoylesoftware.htmlunit.html.HtmlLabel; import hudson.model.Descriptor.FormException; import hudson.model.Slave; import net.sf.json.JSONObject; -import org.jvnet.hudson.test.HudsonTestCase; +import org.junit.Rule; +import org.junit.Test; +import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.TestExtension; import org.kohsuke.stapler.DataBoundConstructor; import org.kohsuke.stapler.StaplerRequest; @@ -13,15 +21,19 @@ import org.kohsuke.stapler.StaplerRequest; /** * @author Kohsuke Kawaguchi */ -public class NodePropertyTest extends HudsonTestCase { - public void testInvisibleProperty() throws Exception { - DumbSlave s = createSlave(); +public class NodePropertyTest { + + @Rule + public JenkinsRule j = new JenkinsRule(); + + @Test + public void invisibleProperty() throws Exception { + DumbSlave s = j.createSlave(); InvisibleProperty before = new InvisibleProperty(); s.getNodeProperties().add(before); assertFalse(before.reconfigured); - - DumbSlave s2 = configRoundtrip(s); + DumbSlave s2 = j.configRoundtrip(s); assertNotSame(s,s2); InvisibleProperty after = s2.getNodeProperties().get(InvisibleProperty.class); @@ -31,13 +43,14 @@ public class NodePropertyTest extends HudsonTestCase { public static class InvisibleProperty extends NodeProperty { boolean reconfigured = false; + @Override public NodeProperty reconfigure(StaplerRequest req, JSONObject form) throws FormException { reconfigured = true; return this; } - @TestExtension + @TestExtension("invisibleProperty") public static class DescriptorImpl extends NodePropertyDescriptor { @Override public String getDisplayName() { @@ -46,20 +59,21 @@ public class NodePropertyTest extends HudsonTestCase { } } - public void testBasicConfigRoundtrip() throws Exception { - DumbSlave s = createSlave(); - HtmlForm f = createWebClient().goTo("/computer/" + s.getNodeName() + "/configure").getFormByName("config"); + @Test + public void basicConfigRoundtrip() throws Exception { + DumbSlave s = j.createSlave(); + HtmlForm f = j.createWebClient().goTo("computer/" + s.getNodeName() + "/configure").getFormByName("config"); ((HtmlLabel)f.selectSingleNode(".//LABEL[text()='Some Property']")).click(); - submit(f); - PropertyImpl p = jenkins.getNode(s.getNodeName()).getNodeProperties().get(PropertyImpl.class); + j.submit(f); + PropertyImpl p = j.jenkins.getNode(s.getNodeName()).getNodeProperties().get(PropertyImpl.class); assertEquals("Duke",p.name); p.name = "Kohsuke"; - configRoundtrip(s); + j.configRoundtrip(s); - PropertyImpl p2 = jenkins.getNode(s.getNodeName()).getNodeProperties().get(PropertyImpl.class); + PropertyImpl p2 = j.jenkins.getNode(s.getNodeName()).getNodeProperties().get(PropertyImpl.class); assertNotSame(p,p2); - assertEqualDataBoundBeans(p,p2); + j.assertEqualDataBoundBeans(p, p2); } public static class PropertyImpl extends NodeProperty { @@ -70,7 +84,7 @@ public class NodePropertyTest extends HudsonTestCase { this.name = name; } - @TestExtension("testBasicConfigRoundtrip") + @TestExtension("basicConfigRoundtrip") public static class DescriptorImpl extends NodePropertyDescriptor { @Override public String getDisplayName() { diff --git a/test/src/test/java/hudson/tasks/LogRotatorTest.java b/test/src/test/java/hudson/tasks/LogRotatorTest.java index 9938a1545d..29e697301c 100644 --- a/test/src/test/java/hudson/tasks/LogRotatorTest.java +++ b/test/src/test/java/hudson/tasks/LogRotatorTest.java @@ -21,9 +21,13 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ - package hudson.tasks; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + import hudson.Launcher; import hudson.model.AbstractBuild; import hudson.model.BuildListener; @@ -34,17 +38,24 @@ import hudson.model.Run; import hudson.tasks.ArtifactArchiverTest.CreateArtifact; import java.util.Arrays; import java.util.Collections; -import org.jvnet.hudson.test.Bug; + +import org.junit.Rule; +import org.junit.Test; import org.jvnet.hudson.test.FailureBuilder; -import org.jvnet.hudson.test.HudsonTestCase; +import org.jvnet.hudson.test.Issue; +import org.jvnet.hudson.test.JenkinsRule; /** * Verifies that the last successful and stable builds of a job will be kept if requested. */ -public class LogRotatorTest extends HudsonTestCase { +public class LogRotatorTest { - public void testSuccessVsFailure() throws Exception { - FreeStyleProject project = createFreeStyleProject(); + @Rule + public JenkinsRule j = new JenkinsRule(); + + @Test + public void successVsFailure() throws Exception { + FreeStyleProject project = j.createFreeStyleProject(); project.setLogRotator(new LogRotator(-1, 2, -1, -1)); assertEquals(Result.SUCCESS, build(project)); // #1 project.getBuildersList().replaceBy(Collections.singleton(new FailureBuilder())); @@ -59,9 +70,10 @@ public class LogRotatorTest extends HudsonTestCase { assertEquals(3, numberOf(project.getLastFailedBuild())); } - @Bug(2417) - public void testStableVsUnstable() throws Exception { - FreeStyleProject project = createFreeStyleProject(); + @Test + @Issue("JENKINS-2417") + public void stableVsUnstable() throws Exception { + FreeStyleProject project = j.createFreeStyleProject(); project.setLogRotator(new LogRotator(-1, 2, -1, -1)); assertEquals(Result.SUCCESS, build(project)); // #1 project.getPublishersList().replaceBy(Collections.singleton(new TestsFail())); @@ -74,9 +86,10 @@ public class LogRotatorTest extends HudsonTestCase { assertEquals(null, project.getBuildByNumber(2)); } - @Bug(834) - public void testArtifactDelete() throws Exception { - FreeStyleProject project = createFreeStyleProject(); + @Test + @Issue("JENKINS-834") + public void artifactDelete() throws Exception { + FreeStyleProject project = j.createFreeStyleProject(); project.setLogRotator(new LogRotator(-1, 6, -1, 2)); project.getPublishersList().replaceBy(Collections.singleton(new ArtifactArchiver("f", "", true, false))); assertEquals("(no artifacts)", Result.FAILURE, build(project)); // #1 @@ -124,7 +137,6 @@ public class LogRotatorTest extends HudsonTestCase { assertTrue(project.getBuildByNumber(8).getHasArtifacts()); } - static Result build(FreeStyleProject project) throws Exception { return project.scheduleBuild2(0).get().getResult(); } @@ -151,5 +163,4 @@ public class LogRotatorTest extends HudsonTestCase { }; } } - } diff --git a/test/src/test/java/hudson/tasks/UserAvatarResolverTest.java b/test/src/test/java/hudson/tasks/UserAvatarResolverTest.java index eea2a1fcdd..8431da7371 100644 --- a/test/src/test/java/hudson/tasks/UserAvatarResolverTest.java +++ b/test/src/test/java/hudson/tasks/UserAvatarResolverTest.java @@ -23,40 +23,54 @@ */ package hudson.tasks; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + import hudson.Extension; import hudson.model.User; import java.util.regex.Matcher; -import org.jvnet.hudson.test.HudsonTestCase; +import org.junit.Rule; +import org.junit.Test; +import org.jvnet.hudson.test.JenkinsRule; +import org.jvnet.hudson.test.WithoutJenkins; -public class UserAvatarResolverTest extends HudsonTestCase { +public class UserAvatarResolverTest { + + @Rule + public JenkinsRule j = new JenkinsRule(); private static User expUser; - - public void testThatDefaultImageIsReturnedIfRegexFails() { + + @Test + public void defaultImageIsReturnedIfRegexFails() { String avatar = UserAvatarResolver.resolve(User.get("USER"), "meh"); assertTrue(avatar.endsWith("/images/meh/user.png")); } - - public void testThatResolverIsUsed() { + + @Test + public void resolverIsUsed() { expUser = User.get("unique-user-not-used-in-anyother-test", true); String avatar = UserAvatarResolver.resolve(expUser, "20x20"); assertEquals(avatar, "http://myown.image"); } - - public void testThatNoResolverCanFindAvatar() { + + @Test + public void noResolverCanFindAvatar() { String avatar = UserAvatarResolver.resolve(User.get("USER"), "20x20"); assertTrue(avatar.endsWith("/images/20x20/user.png")); } - public void testIconSizeRegex() { + @Test + @WithoutJenkins + public void iconSizeRegex() { Matcher matcher = UserAvatarResolver.iconSizeRegex.matcher("12x15"); assertTrue(matcher.matches()); assertEquals("12", matcher.group(1)); assertEquals("15", matcher.group(2)); } - + @Extension public static final class UserAvatarResolverImpl extends UserAvatarResolver { @@ -66,6 +80,6 @@ public class UserAvatarResolverTest extends HudsonTestCase { return "http://myown.image"; } return null; - } + } } } diff --git a/test/src/test/java/hudson/tools/JDKInstallerTest.java b/test/src/test/java/hudson/tools/JDKInstallerTest.java index 95ead8b937..f4b79f6ca5 100644 --- a/test/src/test/java/hudson/tools/JDKInstallerTest.java +++ b/test/src/test/java/hudson/tools/JDKInstallerTest.java @@ -1,9 +1,14 @@ package hudson.tools; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + import com.gargoylesoftware.htmlunit.html.HtmlForm; import com.gargoylesoftware.htmlunit.html.HtmlPage; import hudson.tools.JDKInstaller.DescriptorImpl; -import org.jvnet.hudson.test.HudsonTestCase; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; import hudson.model.JDK; import hudson.model.FreeStyleProject; import hudson.model.FreeStyleBuild; @@ -23,18 +28,24 @@ import java.util.Arrays; import java.util.Properties; import java.util.logging.Logger; -import org.jvnet.hudson.test.Bug; +import org.junit.rules.TemporaryFolder; +import org.jvnet.hudson.test.Issue; +import org.jvnet.hudson.test.JenkinsRule; import org.xml.sax.SAXException; /** * @author Kohsuke Kawaguchi */ -public class JDKInstallerTest extends HudsonTestCase { +public class JDKInstallerTest { - @Override - protected void setUp() throws Exception { - super.setUp(); + @Rule + public JenkinsRule j = new JenkinsRule(); + @Rule + public TemporaryFolder tmp = new TemporaryFolder(); + + @Before + public void setUp() throws Exception { File f = new File(new File(System.getProperty("user.home")),".jenkins-ci.org"); if (!f.exists()) { LOGGER.warning(f+" doesn't exist. Skipping JDK installation tests"); @@ -48,7 +59,7 @@ public class JDKInstallerTest extends HudsonTestCase { if (u==null || p==null) { LOGGER.warning(f+" doesn't contain oracle.userName and oracle.password. Skipping JDK installation tests."); } else { - DescriptorImpl d = jenkins.getDescriptorByType(DescriptorImpl.class); + DescriptorImpl d = j.jenkins.getDescriptorByType(DescriptorImpl.class); d.doPostCredential(u,p); } } finally { @@ -57,14 +68,15 @@ public class JDKInstallerTest extends HudsonTestCase { } } - public void testEnterCredential() throws Exception { - HtmlPage p = createWebClient().goTo("/descriptorByName/hudson.tools.JDKInstaller/enterCredential"); + @Test + public void enterCredential() throws Exception { + HtmlPage p = j.createWebClient().goTo("descriptorByName/hudson.tools.JDKInstaller/enterCredential"); HtmlForm form = p.getFormByName("postCredential"); form.getInputByName("username").setValueAttribute("foo"); form.getInputByName("password").setValueAttribute("bar"); form.submit(null); - DescriptorImpl d = jenkins.getDescriptorByType(DescriptorImpl.class); + DescriptorImpl d = j.jenkins.getDescriptorByType(DescriptorImpl.class); assertEquals("foo",d.getUsername()); assertEquals("bar",d.getPassword().getPlainText()); } @@ -72,25 +84,26 @@ public class JDKInstallerTest extends HudsonTestCase { /** * Tests the configuration round trip. */ - public void testConfigRoundtrip() throws Exception { - File tmp = env.temporaryDirectoryAllocator.allocate(); + @Test + public void configRoundtrip() throws Exception { JDKInstaller installer = new JDKInstaller("jdk-6u13-oth-JPR@CDS-CDS_Developer", true); - jenkins.getJDKs().add(new JDK("test",tmp.getAbsolutePath(), Arrays.asList( + j.jenkins.getJDKs().add(new JDK("test",tmp.getRoot().getAbsolutePath(), Arrays.asList( new InstallSourceProperty(Arrays.asList(installer))))); - submit(new WebClient().goTo("configure").getFormByName("config")); + j.submit(j.createWebClient().goTo("configure").getFormByName("config")); - JDK jdk = jenkins.getJDK("test"); + JDK jdk = j.jenkins.getJDK("test"); InstallSourceProperty isp = jdk.getProperties().get(InstallSourceProperty.class); assertEquals(1,isp.installers.size()); - assertEqualBeans(installer,isp.installers.get(JDKInstaller.class),"id,acceptLicense"); + j.assertEqualBeans(installer, isp.installers.get(JDKInstaller.class), "id,acceptLicense"); } /** * Can we locate the bundles? */ - public void testLocate() throws Exception { + @Test + public void locate() throws Exception { // this is a really time consuming test, so only run it when we really want. if(!Boolean.getBoolean("jenkins.testJDKInstaller")) return; @@ -105,25 +118,28 @@ public class JDKInstallerTest extends HudsonTestCase { } private void retrieveUpdateCenterData() throws IOException, SAXException { - new WebClient().goTo("/"); // make sure data is loaded + j.createWebClient().goTo("/"); // make sure data is loaded } /** * Tests the auto installation. */ - public void testAutoInstallation6u13() throws Exception { + @Test + public void autoInstallation6u13() throws Exception { doTestAutoInstallation("jdk-6u13-oth-JPR@CDS-CDS_Developer", "1.6.0_13-b03"); } /** * JDK7 is distributed as a gzip file */ - public void testAutoInstallation7() throws Exception { + @Test + public void autoInstallation7() throws Exception { doTestAutoInstallation("jdk-7-oth-JPR", "1.7.0-b147"); } - @Bug(3989) - public void testAutoInstallation142_17() throws Exception { + @Test + @Issue("JENKINS-3989") + public void autoInstallation142_17() throws Exception { doTestAutoInstallation("j2sdk-1.4.2_17-oth-JPR@CDS-CDS_Developer", "1.4.2_17-b06"); } @@ -137,33 +153,33 @@ public class JDKInstallerTest extends HudsonTestCase { retrieveUpdateCenterData(); - File tmp = env.temporaryDirectoryAllocator.allocate(); JDKInstaller installer = new JDKInstaller(id, true); - JDK jdk = new JDK("test", tmp.getAbsolutePath(), Arrays.asList( + JDK jdk = new JDK("test", tmp.getRoot().getAbsolutePath(), Arrays.asList( new InstallSourceProperty(Arrays.asList(installer)))); - jenkins.getJDKs().add(jdk); + j.jenkins.getJDKs().add(jdk); - FreeStyleProject p = createFreeStyleProject(); + FreeStyleProject p = j.createFreeStyleProject(); p.setJDK(jdk); p.getBuildersList().add(new Shell("java -fullversion\necho $JAVA_HOME")); - FreeStyleBuild b = buildAndAssertSuccess(p); + FreeStyleBuild b = j.buildAndAssertSuccess(p); @SuppressWarnings("deprecation") String log = b.getLog(); System.out.println(log); // make sure it runs with the JDK that just got installed assertTrue(log.contains(fullversion)); - assertTrue(log.contains(tmp.getAbsolutePath())); + assertTrue(log.contains(tmp.getRoot().getAbsolutePath())); } /** * Fake installation on Unix. */ - public void testFakeUnixInstall() throws Exception { + @Test + public void fakeUnixInstall() throws Exception { // If we're on Windows, don't bother doing this. if (Functions.isWindows()) return; - + File bundle = File.createTempFile("fake-jdk-by-hudson","sh"); try { new FilePath(bundle).write( @@ -172,12 +188,10 @@ public class JDKInstallerTest extends HudsonTestCase { "touch jdk1.6.0_dummy/bin/java","ASCII"); TaskListener l = StreamTaskListener.fromStdout(); - File d = env.temporaryDirectoryAllocator.allocate(); - new JDKInstaller("",true).install(new LocalLauncher(l),Platform.LINUX, - new JDKInstaller.FilePathFileSystem(jenkins),l,d.getPath(),bundle.getPath()); + new JDKInstaller.FilePathFileSystem(j.jenkins),l,tmp.getRoot().getPath(),bundle.getPath()); - assertTrue(new File(d,"bin/java").exists()); + assertTrue(new File(tmp.getRoot(),"bin/java").exists()); } finally { bundle.delete(); } diff --git a/test/src/test/java/hudson/tools/ToolLocationNodePropertyTest.java b/test/src/test/java/hudson/tools/ToolLocationNodePropertyTest.java index 3d0cb18fd3..6f9ddf287c 100644 --- a/test/src/test/java/hudson/tools/ToolLocationNodePropertyTest.java +++ b/test/src/test/java/hudson/tools/ToolLocationNodePropertyTest.java @@ -21,9 +21,10 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ - package hudson.tools; +import static org.junit.Assert.assertEquals; + import hudson.Functions; import hudson.model.*; import hudson.model.labels.LabelAtom; @@ -42,7 +43,11 @@ import java.io.IOException; import jenkins.model.Jenkins; import org.junit.Assert; -import org.jvnet.hudson.test.HudsonTestCase; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.jvnet.hudson.test.JenkinsRule; +import org.jvnet.hudson.test.JenkinsRule.WebClient; import org.jvnet.hudson.test.SingleFileSCM; import org.jvnet.hudson.test.ExtractResourceSCM; @@ -54,18 +59,21 @@ import com.gargoylesoftware.htmlunit.html.HtmlPage; * and that the priority is maintained: parameters > slave node properties > * master node properties */ -public class ToolLocationNodePropertyTest extends HudsonTestCase { +public class ToolLocationNodePropertyTest { + + @Rule + public JenkinsRule j = new JenkinsRule(); private DumbSlave slave; private FreeStyleProject project; - public void testFormRoundTrip() throws Exception { - - MavenInstallation.DescriptorImpl mavenDescriptor = jenkins.getDescriptorByType(MavenInstallation.DescriptorImpl.class); - mavenDescriptor.setInstallations(new MavenInstallation("maven", "XXX", NO_PROPERTIES)); - AntInstallation.DescriptorImpl antDescriptor = jenkins.getDescriptorByType(AntInstallation.DescriptorImpl.class); - antDescriptor.setInstallations(new AntInstallation("ant", "XXX", NO_PROPERTIES)); - JDK.DescriptorImpl jdkDescriptor = jenkins.getDescriptorByType(JDK.DescriptorImpl.class); + @Test + public void formRoundTrip() throws Exception { + MavenInstallation.DescriptorImpl mavenDescriptor = j.jenkins.getDescriptorByType(MavenInstallation.DescriptorImpl.class); + mavenDescriptor.setInstallations(new MavenInstallation("maven", "XXX", j.NO_PROPERTIES)); + AntInstallation.DescriptorImpl antDescriptor = j.jenkins.getDescriptorByType(AntInstallation.DescriptorImpl.class); + antDescriptor.setInstallations(new AntInstallation("ant", "XXX", j.NO_PROPERTIES)); + JDK.DescriptorImpl jdkDescriptor = j.jenkins.getDescriptorByType(JDK.DescriptorImpl.class); jdkDescriptor.setInstallations(new JDK("jdk", "XXX")); ToolLocationNodeProperty property = new ToolLocationNodeProperty( @@ -74,49 +82,50 @@ public class ToolLocationNodePropertyTest extends HudsonTestCase { new ToolLocationNodeProperty.ToolLocation(antDescriptor, "ant", "zotfoo")); slave.getNodeProperties().add(property); - WebClient webClient = new WebClient(); + WebClient webClient = j.createWebClient(); HtmlPage page = webClient.getPage(slave, "configure"); HtmlForm form = page.getFormByName("config"); - submit(form); + j.submit(form); - Assert.assertEquals(1, slave.getNodeProperties().toList().size()); + assertEquals(1, slave.getNodeProperties().toList().size()); ToolLocationNodeProperty prop = slave.getNodeProperties().get(ToolLocationNodeProperty.class); - Assert.assertEquals(3, prop.getLocations().size()); + assertEquals(3, prop.getLocations().size()); ToolLocationNodeProperty.ToolLocation location = prop.getLocations().get(0); - Assert.assertEquals(jdkDescriptor, location.getType()); - Assert.assertEquals("jdk", location.getName()); - Assert.assertEquals("foobar", location.getHome()); + assertEquals(jdkDescriptor, location.getType()); + assertEquals("jdk", location.getName()); + assertEquals("foobar", location.getHome()); location = prop.getLocations().get(1); - Assert.assertEquals(mavenDescriptor, location.getType()); - Assert.assertEquals("maven", location.getName()); - Assert.assertEquals("barzot", location.getHome()); + assertEquals(mavenDescriptor, location.getType()); + assertEquals("maven", location.getName()); + assertEquals("barzot", location.getHome()); location = prop.getLocations().get(2); - Assert.assertEquals(antDescriptor, location.getType()); - Assert.assertEquals("ant", location.getName()); - Assert.assertEquals("zotfoo", location.getHome()); + assertEquals(antDescriptor, location.getType()); + assertEquals("ant", location.getName()); + assertEquals("zotfoo", location.getHome()); } - public void testMaven() throws Exception { - MavenInstallation maven = configureDefaultMaven(); + @Test + public void maven() throws Exception { + MavenInstallation maven = j.configureDefaultMaven(); String mavenPath = maven.getHome(); - Jenkins.getInstance().getDescriptorByType(Maven.DescriptorImpl.class).setInstallations(new MavenInstallation("maven", "THIS IS WRONG", NO_PROPERTIES)); + Jenkins.getInstance().getDescriptorByType(Maven.DescriptorImpl.class).setInstallations(new MavenInstallation("maven", "THIS IS WRONG", j.NO_PROPERTIES)); project.getBuildersList().add(new Maven("--version", "maven")); configureDumpEnvBuilder(); Build build = project.scheduleBuild2(0).get(); - assertBuildStatus(Result.FAILURE, build); + j.assertBuildStatus(Result.FAILURE, build); ToolLocationNodeProperty property = new ToolLocationNodeProperty( - new ToolLocationNodeProperty.ToolLocation(jenkins.getDescriptorByType(MavenInstallation.DescriptorImpl.class), "maven", mavenPath)); + new ToolLocationNodeProperty.ToolLocation(j.jenkins.getDescriptorByType(MavenInstallation.DescriptorImpl.class), "maven", mavenPath)); slave.getNodeProperties().add(property); build = project.scheduleBuild2(0).get(); - assertBuildStatus(Result.SUCCESS, build); + j.assertBuildStatus(Result.SUCCESS, build); } private void configureDumpEnvBuilder() throws IOException { @@ -126,8 +135,9 @@ public class ToolLocationNodePropertyTest extends HudsonTestCase { project.getBuildersList().add(new Shell("export")); } - public void testAnt() throws Exception { - Ant.AntInstallation ant = configureDefaultAnt(); + @Test + public void ant() throws Exception { + Ant.AntInstallation ant = j.configureDefaultAnt(); String antPath = ant.getHome(); Jenkins.getInstance().getDescriptorByType(Ant.DescriptorImpl.class).setInstallations(new AntInstallation("ant", "THIS IS WRONG")); @@ -136,56 +146,54 @@ public class ToolLocationNodePropertyTest extends HudsonTestCase { configureDumpEnvBuilder(); Build build = project.scheduleBuild2(0).get(); - assertBuildStatus(Result.FAILURE, build); + j.assertBuildStatus(Result.FAILURE, build); ToolLocationNodeProperty property = new ToolLocationNodeProperty( - new ToolLocationNodeProperty.ToolLocation(jenkins.getDescriptorByType(AntInstallation.DescriptorImpl.class), "ant", antPath)); + new ToolLocationNodeProperty.ToolLocation(j.jenkins.getDescriptorByType(AntInstallation.DescriptorImpl.class), "ant", antPath)); slave.getNodeProperties().add(property); build = project.scheduleBuild2(0).get(); System.out.println(build.getLog()); - assertBuildStatus(Result.SUCCESS, build); + j.assertBuildStatus(Result.SUCCESS, build); } - public void testNativeMaven() throws Exception { - MavenInstallation maven = configureDefaultMaven(); + @Test + public void nativeMaven() throws Exception { + MavenInstallation maven = j.configureDefaultMaven(); String mavenPath = maven.getHome(); - Jenkins.getInstance().getDescriptorByType(Maven.DescriptorImpl.class).setInstallations(new MavenInstallation("maven", "THIS IS WRONG", NO_PROPERTIES)); + Jenkins.getInstance().getDescriptorByType(Maven.DescriptorImpl.class).setInstallations(new MavenInstallation("maven", "THIS IS WRONG", j.NO_PROPERTIES)); - MavenModuleSet project = createMavenProject(); + MavenModuleSet project = j.createMavenProject(); project.setScm(new ExtractResourceSCM(getClass().getResource( "/simple-projects.zip"))); project.setAssignedLabel(slave.getSelfLabel()); - project.setJDK(jenkins.getJDK("default")); + project.setJDK(j.jenkins.getJDK("default")); project.setMaven("maven"); project.setGoals("clean"); Run build = project.scheduleBuild2(0).get(); - assertBuildStatus(Result.FAILURE, build); + j.assertBuildStatus(Result.FAILURE, build); ToolLocationNodeProperty property = new ToolLocationNodeProperty( - new ToolLocationNodeProperty.ToolLocation(jenkins.getDescriptorByType(MavenInstallation.DescriptorImpl.class), "maven", mavenPath)); + new ToolLocationNodeProperty.ToolLocation(j.jenkins.getDescriptorByType(MavenInstallation.DescriptorImpl.class), "maven", mavenPath)); slave.getNodeProperties().add(property); build = project.scheduleBuild2(0).get(); System.out.println(build.getLog()); - assertBuildStatus(Result.SUCCESS, build); - + j.assertBuildStatus(Result.SUCCESS, build); } - // //////////////////////// setup ////////////////////////////////////////// - + @Before public void setUp() throws Exception { - super.setUp(); EnvVars env = new EnvVars(); // we don't want Maven, Ant, etc. to be discovered in the path for this test to work, // but on Unix these tools rely on other basic Unix tools (like env) for its operation, // so empty path breaks the test. env.put("PATH", "/bin:/usr/bin"); env.put("M2_HOME", "empty"); - slave = createSlave(new LabelAtom("slave"), env); - project = createFreeStyleProject(); + slave = j.createSlave(new LabelAtom("slave"), env); + project = j.createFreeStyleProject(); project.setAssignedLabel(slave.getSelfLabel()); } } diff --git a/test/src/test/java/hudson/tools/ToolLocationTest.java b/test/src/test/java/hudson/tools/ToolLocationTest.java index 0cc9f6d3db..cad37655ca 100644 --- a/test/src/test/java/hudson/tools/ToolLocationTest.java +++ b/test/src/test/java/hudson/tools/ToolLocationTest.java @@ -1,7 +1,10 @@ package hudson.tools; -import jenkins.model.Jenkins; -import org.jvnet.hudson.test.HudsonTestCase; +import static org.junit.Assert.assertEquals; + +import org.junit.Rule; +import org.junit.Test; +import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.recipes.LocalData; import hudson.tasks.Maven; import hudson.tasks.Ant; @@ -12,31 +15,33 @@ import java.util.Arrays; /** * @author huybrechts */ -public class ToolLocationTest extends HudsonTestCase { +public class ToolLocationTest { + + @Rule + public JenkinsRule j = new JenkinsRule(); /** * Test xml compatibility since 'extends ToolInstallation' */ + @Test @LocalData - public void testToolCompatibility() { - Maven.MavenInstallation[] maven = Jenkins.getInstance().getDescriptorByType(Maven.DescriptorImpl.class).getInstallations(); + public void toolCompatibility() { + Maven.MavenInstallation[] maven = j.jenkins.getDescriptorByType(Maven.DescriptorImpl.class).getInstallations(); assertEquals(maven.length, 1); assertEquals(maven[0].getHome(), "bar"); assertEquals(maven[0].getName(), "Maven 1"); - - Ant.AntInstallation[] ant = Jenkins.getInstance().getDescriptorByType(Ant.DescriptorImpl.class).getInstallations(); + Ant.AntInstallation[] ant = j.jenkins.getDescriptorByType(Ant.DescriptorImpl.class).getInstallations(); assertEquals(ant.length, 1); assertEquals(ant[0].getHome(), "foo"); assertEquals(ant[0].getName(), "Ant 1"); - JDK[] jdk = Jenkins.getInstance().getDescriptorByType(JDK.DescriptorImpl.class).getInstallations(); - assertEquals(Arrays.asList(jdk), Jenkins.getInstance().getJDKs()); + JDK[] jdk = j.jenkins.getDescriptorByType(JDK.DescriptorImpl.class).getInstallations(); + assertEquals(Arrays.asList(jdk), j.jenkins.getJDKs()); assertEquals(2, jdk.length); // HudsonTestCase adds a 'default' JDK assertEquals("default", jdk[1].getName()); // make sure it's really that we're seeing assertEquals("FOOBAR", jdk[0].getHome()); assertEquals("FOOBAR", jdk[0].getJavaHome()); assertEquals("1.6", jdk[0].getName()); - } } diff --git a/test/src/test/java/hudson/triggers/SCMTriggerTest.java b/test/src/test/java/hudson/triggers/SCMTriggerTest.java index 01535ae711..7df7eeda50 100644 --- a/test/src/test/java/hudson/triggers/SCMTriggerTest.java +++ b/test/src/test/java/hudson/triggers/SCMTriggerTest.java @@ -23,6 +23,10 @@ */ package hudson.triggers; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + import hudson.FilePath; import hudson.Launcher; import hudson.util.OneShotEvent; @@ -36,32 +40,35 @@ import hudson.model.FreeStyleProject; import hudson.model.TaskListener; import hudson.model.Cause.UserCause; import hudson.scm.NullSCM; -import hudson.scm.PollingResult; -import hudson.scm.PollingResult.Change; -import hudson.scm.RepositoryBrowser; -import hudson.scm.SCMDescriptor; -import hudson.scm.SCMRevisionState; import hudson.triggers.SCMTrigger.SCMTriggerCause; import hudson.triggers.SCMTrigger.BuildAction; -import org.jvnet.hudson.test.Bug; -import org.jvnet.hudson.test.HudsonTestCase; -import org.jvnet.hudson.test.SingleFileSCM; +import org.junit.Rule; +import org.junit.Test; +import org.jvnet.hudson.test.Issue; +import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.TestBuilder; + import java.io.File; import java.io.IOException; import java.util.concurrent.Future; import java.util.List; + /** * @author Alan Harder */ -public class SCMTriggerTest extends HudsonTestCase { +public class SCMTriggerTest { + + @Rule + public JenkinsRule j = new JenkinsRule(); + /** * Make sure that SCMTrigger doesn't trigger another build when a build has just started, * but not yet completed its SCM update. */ - @Bug(2671) - public void testSimultaneousPollAndBuild() throws Exception { - FreeStyleProject p = createFreeStyleProject(); + @Test + @Issue("JENKINS-2671") + public void simultaneousPollAndBuild() throws Exception { + FreeStyleProject p = j.createFreeStyleProject(); // used to coordinate polling and check out final OneShotEvent checkoutStarted = new OneShotEvent(); @@ -99,11 +106,12 @@ public class SCMTriggerTest extends HudsonTestCase { /** * Make sure that only one polling result shows up per build. */ - @Bug(7649) - public void testMultiplePollingOneBuildAction() throws Exception { + @Test + @Issue("JENKINS-7649") + public void multiplePollingOneBuildAction() throws Exception { final OneShotEvent buildStarted = new OneShotEvent(); final OneShotEvent buildShouldComplete = new OneShotEvent(); - FreeStyleProject p = createFreeStyleProject(); + FreeStyleProject p = j.createFreeStyleProject(); // Make build sleep a while so it blocks new builds p.getBuildersList().add(new TestBuilder() { public boolean perform(AbstractBuild build, Launcher launcher, BuildListener listener) throws InterruptedException, IOException { @@ -137,4 +145,3 @@ public class SCMTriggerTest extends HudsonTestCase { assertFalse("There should only be one BuildAction.", ba.size()!=1); } } - diff --git a/test/src/test/java/hudson/util/AlternativeUiTextProviderTest.java b/test/src/test/java/hudson/util/AlternativeUiTextProviderTest.java index 95c2bddb5d..ecb0ba3ecb 100644 --- a/test/src/test/java/hudson/util/AlternativeUiTextProviderTest.java +++ b/test/src/test/java/hudson/util/AlternativeUiTextProviderTest.java @@ -23,15 +23,22 @@ */ package hudson.util; +import static org.junit.Assert.assertTrue; + import hudson.model.AbstractProject; import hudson.model.FreeStyleProject; -import org.jvnet.hudson.test.HudsonTestCase; +import org.junit.Rule; +import org.junit.Test; +import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.TestExtension; /** * @author Kohsuke Kawaguchi */ -public class AlternativeUiTextProviderTest extends HudsonTestCase { +public class AlternativeUiTextProviderTest { + + @Rule + public JenkinsRule j = new JenkinsRule(); @TestExtension public static class Impl extends AlternativeUiTextProvider { @@ -45,9 +52,9 @@ public class AlternativeUiTextProviderTest extends HudsonTestCase { /** * Makes sure that {@link AlternativeUiTextProvider} actually works at some basic level. */ - public void testBasics() throws Exception { - FreeStyleProject p = createFreeStyleProject("aaa"); - assertTrue(createWebClient().getPage(p).asText().contains("XYZ:aaa")); + @Test + public void basics() throws Exception { + FreeStyleProject p = j.createFreeStyleProject("aaa"); + assertTrue(j.createWebClient().getPage(p).asText().contains("XYZ:aaa")); } } - diff --git a/test/src/test/java/hudson/util/ArgumentListBuilder2Test.java b/test/src/test/java/hudson/util/ArgumentListBuilder2Test.java index b8edacc77a..e37eb609ca 100644 --- a/test/src/test/java/hudson/util/ArgumentListBuilder2Test.java +++ b/test/src/test/java/hudson/util/ArgumentListBuilder2Test.java @@ -21,33 +21,41 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ - package hudson.util; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + import hudson.Launcher.RemoteLauncher; import hudson.model.Slave; +import org.junit.Rule; +import org.junit.Test; import org.jvnet.hudson.test.Email; -import org.jvnet.hudson.test.HudsonTestCase; +import org.jvnet.hudson.test.JenkinsRule; import java.io.StringWriter; /** - * * @author Kohsuke Kawaguchi */ -public class ArgumentListBuilder2Test extends HudsonTestCase { +public class ArgumentListBuilder2Test { + + @Rule + public JenkinsRule j = new JenkinsRule(); + /** * Makes sure {@link RemoteLauncher} properly masks arguments. */ + @Test @Email("http://n4.nabble.com/Password-masking-when-running-commands-on-a-slave-tp1753033p1753033.html") - public void testSlaveMask() throws Exception { + public void slaveMask() throws Exception { ArgumentListBuilder args = new ArgumentListBuilder(); args.add("java"); args.addMasked("-version"); - Slave s = createSlave(); + Slave s = j.createSlave(); s.toComputer().connect(false).get(); - + StringWriter out = new StringWriter(); assertEquals(0,s.createLauncher(new StreamTaskListener(out)).launch().cmds(args).join()); System.out.println(out); diff --git a/test/src/test/java/hudson/util/FormFieldValidatorTest.java b/test/src/test/java/hudson/util/FormFieldValidatorTest.java index 50bfaeeea9..bcdd0ecde0 100644 --- a/test/src/test/java/hudson/util/FormFieldValidatorTest.java +++ b/test/src/test/java/hudson/util/FormFieldValidatorTest.java @@ -23,25 +23,33 @@ */ package hudson.util; +import static org.junit.Assert.fail; + import hudson.model.FreeStyleProject; import hudson.tasks.BuildStepMonitor; -import hudson.tasks.Builder; import hudson.tasks.BuildStepDescriptor; import hudson.tasks.Publisher; import hudson.util.FormFieldValidatorTest.BrokenFormValidatorBuilder.DescriptorImpl; -import org.jvnet.hudson.test.Bug; -import org.jvnet.hudson.test.HudsonTestCase; +import org.junit.Rule; +import org.junit.Test; +import org.jvnet.hudson.test.Issue; +import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.recipes.WithPlugin; /** * @author Kohsuke Kawaguchi */ -public class FormFieldValidatorTest extends HudsonTestCase { - @Bug(2771) +public class FormFieldValidatorTest { + + @Rule + public JenkinsRule j = new JenkinsRule(); + + @Test + @Issue("JENKINS-2771") @WithPlugin("tasks.jpi") - public void test2771() throws Exception { - FreeStyleProject p = createFreeStyleProject(); - new WebClient().getPage(p,"configure"); + public void configure() throws Exception { + FreeStyleProject p = j.createFreeStyleProject(); + j.createWebClient().getPage(p, "configure"); } public static class BrokenFormValidatorBuilder extends Publisher { @@ -67,14 +75,15 @@ public class FormFieldValidatorTest extends HudsonTestCase { /** * Make sure that the validation methods are really called by testing a negative case. */ - @Bug(3382) - public void testNegative() throws Exception { + @Test + @Issue("JENKINS-3382") + public void negative() throws Exception { DescriptorImpl d = new DescriptorImpl(); Publisher.all().add(d); try { - FreeStyleProject p = createFreeStyleProject(); + FreeStyleProject p = j.createFreeStyleProject(); p.getPublishersList().add(new BrokenFormValidatorBuilder()); - new WebClient().getPage(p,"configure"); + j.createWebClient().getPage(p, "configure"); fail("should have failed"); } catch(AssertionError e) { if(e.getMessage().contains("doCheckXyz is broken")) @@ -85,5 +94,4 @@ public class FormFieldValidatorTest extends HudsonTestCase { Publisher.all().remove(d); } } - } diff --git a/test/src/test/java/hudson/util/ProcessTreeKillerTest.java b/test/src/test/java/hudson/util/ProcessTreeKillerTest.java index d7de77e6df..20a52c8b59 100644 --- a/test/src/test/java/hudson/util/ProcessTreeKillerTest.java +++ b/test/src/test/java/hudson/util/ProcessTreeKillerTest.java @@ -5,16 +5,22 @@ import hudson.model.FreeStyleBuild; import hudson.model.FreeStyleProject; import hudson.tasks.Maven; import hudson.tasks.Shell; -import org.jvnet.hudson.test.Bug; +import org.junit.Rule; +import org.junit.Test; import org.jvnet.hudson.test.ExtractResourceSCM; -import org.jvnet.hudson.test.HudsonTestCase; +import org.jvnet.hudson.test.Issue; +import org.jvnet.hudson.test.JenkinsRule; -public class ProcessTreeKillerTest extends HudsonTestCase { +public class ProcessTreeKillerTest { - public void testManualAbortProcess() throws Exception { + @Rule + public JenkinsRule j = new JenkinsRule(); + + @Test + public void manualAbortProcess() throws Exception { ProcessTree.enabled = true; - FreeStyleProject project = createFreeStyleProject(); - + FreeStyleProject project = j.createFreeStyleProject(); + // this contains a maven project with a single test that sleeps 5s. project.setScm(new ExtractResourceSCM(getClass().getResource( "ProcessTreeKiller-test-project.jar"))); @@ -27,27 +33,26 @@ public class ProcessTreeKillerTest extends HudsonTestCase { b.doStop(); Thread.sleep(1000); - + // will fail (at least on windows) if test process is still running b.getWorkspace().deleteRecursive(); - } - @Bug(22641) - public void testProcessProperlyKilledUnix() throws Exception { + @Test + @Issue("JENKINS-22641") + public void processProperlyKilledUnix() throws Exception { ProcessTree.enabled = true; if (Functions.isWindows()) return; // This test does not involve windows. - FreeStyleProject sleepProject = createFreeStyleProject(); - FreeStyleProject processJob = createFreeStyleProject(); + FreeStyleProject sleepProject = j.createFreeStyleProject(); + FreeStyleProject processJob = j.createFreeStyleProject(); sleepProject.getBuildersList().add(new Shell("nohup sleep 100000 &")); - assertBuildStatusSuccess(sleepProject.scheduleBuild2(0).get()); + j.assertBuildStatusSuccess(sleepProject.scheduleBuild2(0).get()); processJob.getBuildersList().add(new Shell("ps -ef | grep sleep")); - assertLogNotContains("sleep 100000", processJob.scheduleBuild2(0).get()); + j.assertLogNotContains("sleep 100000", processJob.scheduleBuild2(0).get()); } - } diff --git a/test/src/test/java/hudson/views/ListViewColumnTest.java b/test/src/test/java/hudson/views/ListViewColumnTest.java index 1382c93975..f21af4b318 100644 --- a/test/src/test/java/hudson/views/ListViewColumnTest.java +++ b/test/src/test/java/hudson/views/ListViewColumnTest.java @@ -1,14 +1,21 @@ package hudson.views; import hudson.model.ListView; -import org.jvnet.hudson.test.HudsonTestCase; +import org.junit.Rule; +import org.junit.Test; +import org.jvnet.hudson.test.JenkinsRule; /** * @author Kohsuke Kawaguchi */ -public class ListViewColumnTest extends HudsonTestCase { - public void testCreateView() throws Exception { - jenkins.addView(new ListView("test")); - submit(createWebClient().goTo("view/test/configure").getFormByName("viewConfig")); +public class ListViewColumnTest { + + @Rule + public JenkinsRule j = new JenkinsRule(); + + @Test + public void createView() throws Exception { + j.jenkins.addView(new ListView("test")); + j.submit(j.createWebClient().goTo("view/test/configure").getFormByName("viewConfig")); } } diff --git a/test/src/test/java/jenkins/ExtensionFilterTest.java b/test/src/test/java/jenkins/ExtensionFilterTest.java index 665b1b4560..54ae39b750 100644 --- a/test/src/test/java/jenkins/ExtensionFilterTest.java +++ b/test/src/test/java/jenkins/ExtensionFilterTest.java @@ -1,21 +1,30 @@ package jenkins; +import static org.junit.Assert.assertTrue; + import hudson.ExtensionComponent; import hudson.console.ConsoleAnnotatorFactory; import hudson.model.PageDecorator; -import org.jvnet.hudson.test.HudsonTestCase; +import org.junit.Rule; +import org.junit.Test; +import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.TestExtension; /** * @author Kohsuke Kawaguchi */ -public class ExtensionFilterTest extends HudsonTestCase { - public void testFilter() { +public class ExtensionFilterTest { + + @Rule + public JenkinsRule j = new JenkinsRule(); + + @Test + public void filter() { assertTrue(PageDecorator.all().isEmpty()); assertTrue(ConsoleAnnotatorFactory.all().isEmpty()); } - @TestExtension("testFilter") + @TestExtension("filter") public static class Impl extends ExtensionFilter { @Override public boolean allows(Class type, ExtensionComponent component) { diff --git a/test/src/test/java/jenkins/model/ExtensionTypeHierarchyTest.java b/test/src/test/java/jenkins/model/ExtensionTypeHierarchyTest.java index 2fb3edd76c..f3b861ac0f 100644 --- a/test/src/test/java/jenkins/model/ExtensionTypeHierarchyTest.java +++ b/test/src/test/java/jenkins/model/ExtensionTypeHierarchyTest.java @@ -1,7 +1,13 @@ package jenkins.model; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertTrue; + import hudson.ExtensionPoint; -import org.jvnet.hudson.test.HudsonTestCase; +import org.junit.Rule; +import org.junit.Test; +import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.TestExtension; import java.util.Arrays; @@ -10,7 +16,11 @@ import java.util.Comparator; /** * @author Kohsuke Kawaguchi */ -public class ExtensionTypeHierarchyTest extends HudsonTestCase { +public class ExtensionTypeHierarchyTest { + + @Rule + public JenkinsRule j = new JenkinsRule(); + public static interface Animal extends ExtensionPoint {} public static interface White extends ExtensionPoint {} @@ -22,17 +32,18 @@ public class ExtensionTypeHierarchyTest extends HudsonTestCase { /** * Swan is both white and animal, so a single swan instance gets listed to both. */ - public void testSameExtensionCanImplementMultipleExtensionPoints() { - Animal[] animals = sort(jenkins.getExtensionList(Animal.class).toArray(new Animal[2])); + @Test + public void sameExtensionCanImplementMultipleExtensionPoints() { + Animal[] animals = sort(j.jenkins.getExtensionList(Animal.class).toArray(new Animal[2])); assertTrue(animals[0] instanceof Crow); assertTrue(animals[1] instanceof Swan); assertEquals(2, animals.length); - White[] whites = sort(jenkins.getExtensionList(White.class).toArray(new White[1])); + White[] whites = sort(j.jenkins.getExtensionList(White.class).toArray(new White[1])); assertTrue(whites[0] instanceof Swan); assertEquals(1, whites.length); - assertSame(animals[1],whites[0]); + assertSame(animals[1], whites[0]); } /** diff --git a/test/src/test/java/jenkins/model/JenkinsLocationConfigurationTest.java b/test/src/test/java/jenkins/model/JenkinsLocationConfigurationTest.java index 9a0d0d56fb..9acce428f7 100644 --- a/test/src/test/java/jenkins/model/JenkinsLocationConfigurationTest.java +++ b/test/src/test/java/jenkins/model/JenkinsLocationConfigurationTest.java @@ -1,18 +1,27 @@ package jenkins.model; +import static org.junit.Assert.assertTrue; + import com.gargoylesoftware.htmlunit.html.HtmlInput; import com.gargoylesoftware.htmlunit.html.HtmlPage; -import org.jvnet.hudson.test.HudsonTestCase; +import org.junit.Rule; +import org.junit.Test; +import org.jvnet.hudson.test.JenkinsRule; /** * @author Kohsuke Kawaguchi */ -public class JenkinsLocationConfigurationTest extends HudsonTestCase { +public class JenkinsLocationConfigurationTest { + + @Rule + public JenkinsRule j = new JenkinsRule(); + /** * Makes sure the use of "localhost" in the Hudson URL reports a warning. */ - public void testLocalHostWarning() throws Exception { - HtmlPage p = new WebClient().goTo("configure"); + @Test + public void localhostWarning() throws Exception { + HtmlPage p = j.createWebClient().goTo("configure"); HtmlInput url = p.getFormByName("config").getInputByName("_.url"); url.setValueAttribute("http://localhost:1234/"); assertTrue(p.getDocumentElement().getTextContent().contains("instead of localhost")); diff --git a/test/src/test/java/jenkins/scm/SCMCheckoutStrategyTest.java b/test/src/test/java/jenkins/scm/SCMCheckoutStrategyTest.java index 3cfb47de75..ccf3a506e9 100644 --- a/test/src/test/java/jenkins/scm/SCMCheckoutStrategyTest.java +++ b/test/src/test/java/jenkins/scm/SCMCheckoutStrategyTest.java @@ -1,10 +1,14 @@ package jenkins.scm; +import static org.junit.Assert.*; + import com.gargoylesoftware.htmlunit.html.HtmlPage; import hudson.model.FreeStyleProject; import hudson.model.Item; -import org.jvnet.hudson.test.HudsonTestCase; +import org.junit.Rule; +import org.junit.Test; +import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.TestExtension; import hudson.model.AbstractProject; import org.kohsuke.stapler.DataBoundConstructor; @@ -14,28 +18,32 @@ import org.xml.sax.SAXException; import java.io.IOException; /** - * - * * @author Kohsuke Kawaguchi */ -public class SCMCheckoutStrategyTest extends HudsonTestCase { - public void testConfigRoundtrip() throws Exception { +public class SCMCheckoutStrategyTest { + + @Rule + public JenkinsRule j = new JenkinsRule(); + + @Test + public void configRoundtrip1() throws Exception { assertEquals(1,SCMCheckoutStrategyDescriptor.all().size()); - FreeStyleProject p = createFreeStyleProject(); + FreeStyleProject p = j.createFreeStyleProject(); assertFalse(pageHasUI(p)); // no configuration UI because there's only one option } /** * This should show the UI. */ - public void testConfigRoundtrip2() throws Exception { + @Test + public void configRoundtrip2() throws Exception { assertEquals(2,SCMCheckoutStrategyDescriptor.all().size()); - FreeStyleProject p = createFreeStyleProject(); + FreeStyleProject p = j.createFreeStyleProject(); System.out.println(SCMCheckoutStrategyDescriptor.all()); TestSCMCheckoutStrategy before = new TestSCMCheckoutStrategy(); p.setScmCheckoutStrategy(before); - configRoundtrip((Item)p); + j.configRoundtrip((Item)p); SCMCheckoutStrategy after = p.getScmCheckoutStrategy(); assertNotSame(before,after); assertSame(before.getClass(), after.getClass()); @@ -44,7 +52,7 @@ public class SCMCheckoutStrategyTest extends HudsonTestCase { } private boolean pageHasUI(FreeStyleProject p) throws IOException, SAXException { - HtmlPage page = createWebClient().getPage(p, "configure"); + HtmlPage page = j.createWebClient().getPage(p, "configure"); return page.getWebResponse().getContentAsString().contains("Advanced Source Code Management"); } @@ -60,7 +68,7 @@ public class SCMCheckoutStrategyTest extends HudsonTestCase { super.checkout(execution); } - @TestExtension("testConfigRoundtrip2") + @TestExtension("configRoundtrip2") public static class DescriptorImpl extends SCMCheckoutStrategyDescriptor { @Override public boolean isApplicable(AbstractProject project) { diff --git a/test/src/test/java/jenkins/security/ApiTokenPropertyTest.java b/test/src/test/java/jenkins/security/ApiTokenPropertyTest.java index cf4e85dcfe..a28c0582a0 100644 --- a/test/src/test/java/jenkins/security/ApiTokenPropertyTest.java +++ b/test/src/test/java/jenkins/security/ApiTokenPropertyTest.java @@ -1,5 +1,10 @@ package jenkins.security; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertTrue; + import com.gargoylesoftware.htmlunit.HttpWebConnection; import com.gargoylesoftware.htmlunit.html.HtmlForm; import com.gargoylesoftware.htmlunit.html.HtmlPage; @@ -13,33 +18,41 @@ import org.apache.commons.httpclient.auth.AuthScheme; import org.apache.commons.httpclient.auth.AuthScope; import org.apache.commons.httpclient.auth.CredentialsNotAvailableException; import org.apache.commons.httpclient.auth.CredentialsProvider; -import org.jvnet.hudson.test.HudsonTestCase; +import org.junit.Rule; +import org.junit.Test; +import org.jvnet.hudson.test.JenkinsRule; +import org.jvnet.hudson.test.JenkinsRule.WebClient; import java.util.concurrent.Callable; /** * @author Kohsuke Kawaguchi */ -public class ApiTokenPropertyTest extends HudsonTestCase { +public class ApiTokenPropertyTest { + + @Rule + public JenkinsRule j = new JenkinsRule(); + /** * Tests the UI interaction and authentication. */ - public void testBasics() throws Exception { - jenkins.setSecurityRealm(createDummySecurityRealm()); + @Test + public void basics() throws Exception { + j.jenkins.setSecurityRealm(j.createDummySecurityRealm()); User u = User.get("foo"); ApiTokenProperty t = u.getProperty(ApiTokenProperty.class); final String token = t.getApiToken(); // make sure the UI shows the token - HtmlPage config = createWebClient().goTo(u.getUrl() + "/configure"); + HtmlPage config = j.createWebClient().goTo(u.getUrl() + "/configure"); HtmlForm form = config.getFormByName("config"); assertEquals(token, form.getInputByName("_.apiToken").getValueAttribute()); // round-trip shouldn't change the API token - submit(form); + j.submit(form); assertSame(t, u.getProperty(ApiTokenProperty.class)); - WebClient wc = createWebClient(); + WebClient wc = j.createWebClient(); wc.setCredentialsProvider(new CredentialsProvider() { public Credentials getCredentials(AuthScheme scheme, String host, int port, boolean proxy) throws CredentialsNotAvailableException { return new UsernamePasswordCredentials("foo", token); @@ -50,7 +63,7 @@ public class ApiTokenPropertyTest extends HudsonTestCase { protected HttpClient getHttpClient() { HttpClient c = super.getHttpClient(); c.getParams().setAuthenticationPreemptive(true); - c.getState().setCredentials(new AuthScope("localhost", localPort, AuthScope.ANY_REALM), new UsernamePasswordCredentials("foo", token)); + c.getState().setCredentials(new AuthScope("localhost", AuthScope.ANY_PORT, AuthScope.ANY_REALM), new UsernamePasswordCredentials("foo", token)); return c; } }); @@ -63,8 +76,9 @@ public class ApiTokenPropertyTest extends HudsonTestCase { })); } - public void testSecurity49Upgrade() throws Exception { - jenkins.setSecurityRealm(createDummySecurityRealm()); + @Test + public void security49Upgrade() throws Exception { + j.jenkins.setSecurityRealm(j.createDummySecurityRealm()); User u = User.get("foo"); String historicalInitialValue = Util.getDigestOf(Jenkins.getInstance().getSecretKey() + ":" + u.getId()); @@ -83,6 +97,5 @@ public class ApiTokenPropertyTest extends HudsonTestCase { t = new ApiTokenProperty(historicalInitialValue+"somethingElse"); u.addProperty(t); assertTrue(t.getApiToken().equals(Util.getDigestOf(historicalInitialValue+"somethingElse"))); - } } diff --git a/test/src/test/java/lib/hudson/ActionsTest.java b/test/src/test/java/lib/hudson/ActionsTest.java index 74b8772299..c5f5ecdb5d 100644 --- a/test/src/test/java/lib/hudson/ActionsTest.java +++ b/test/src/test/java/lib/hudson/ActionsTest.java @@ -23,17 +23,26 @@ */ package lib.hudson; +import static org.junit.Assert.assertNotNull; + import hudson.model.InvisibleAction; import hudson.model.RootAction; -import org.jvnet.hudson.test.HudsonTestCase; +import org.junit.Rule; +import org.junit.Test; +import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.TestExtension; /** * @author Kohsuke Kawaguchi */ -public class ActionsTest extends HudsonTestCase { - public void testOverride() throws Exception { - assertNotNull(createWebClient().goTo("").getElementById("bravo")); +public class ActionsTest { + + @Rule + public JenkinsRule j = new JenkinsRule(); + + @Test + public void override() throws Exception { + assertNotNull(j.createWebClient().goTo("").getElementById("bravo")); } @TestExtension diff --git a/test/src/test/java/lib/hudson/ListScmBrowsersTest.java b/test/src/test/java/lib/hudson/ListScmBrowsersTest.java index 144744fc55..5c24db227e 100644 --- a/test/src/test/java/lib/hudson/ListScmBrowsersTest.java +++ b/test/src/test/java/lib/hudson/ListScmBrowsersTest.java @@ -1,10 +1,14 @@ package lib.hudson; +import static org.junit.Assert.assertTrue; + import com.gargoylesoftware.htmlunit.html.HtmlOption; import com.gargoylesoftware.htmlunit.html.HtmlPage; import com.gargoylesoftware.htmlunit.html.HtmlSelect; import hudson.model.Item; -import org.jvnet.hudson.test.HudsonTestCase; +import org.junit.Rule; +import org.junit.Test; +import org.jvnet.hudson.test.JenkinsRule; import org.xml.sax.SAXException; import java.util.HashSet; @@ -15,21 +19,28 @@ import java.io.IOException; /** * @author Kohsuke Kawaguchi */ -public class ListScmBrowsersTest extends HudsonTestCase { - public void testSelectBoxesUnique() throws Exception { - check(createFreeStyleProject()); +public class ListScmBrowsersTest { + + @Rule + public JenkinsRule j = new JenkinsRule(); + + @Test + public void selectBoxesUnique_FreeStyleProject() throws Exception { + check(j.createFreeStyleProject()); } - public void testSelectBoxesUnique2() throws Exception { - check(createMavenProject()); + @Test + public void selectBoxesUnique_MavenProject() throws Exception { + check(j.createMavenProject()); } - public void testSelectBoxesUnique3() throws Exception { - check(createMatrixProject()); + @Test + public void selectBoxesUnique_MatrixProject() throws Exception { + check(j.createMatrixProject()); } private void check(Item p) throws IOException, SAXException { - HtmlPage page = new WebClient().getPage(p, "configure"); + HtmlPage page = j.createWebClient().getPage(p, "configure"); List selects = page.selectNodes("//select"); assertTrue(selects.size()>0); for (HtmlSelect select : selects) { diff --git a/test/src/test/java/org/jvnet/hudson/main/AppTest.java b/test/src/test/java/org/jvnet/hudson/main/AppTest.java index 2fc18fa3cd..ea9e5a03ed 100644 --- a/test/src/test/java/org/jvnet/hudson/main/AppTest.java +++ b/test/src/test/java/org/jvnet/hudson/main/AppTest.java @@ -23,12 +23,16 @@ */ package org.jvnet.hudson.main; +import static org.junit.Assert.assertTrue; + import hudson.model.FreeStyleBuild; import hudson.model.FreeStyleProject; import hudson.tasks.Shell; import hudson.tasks.BatchFile; import org.apache.commons.io.FileUtils; -import org.jvnet.hudson.test.HudsonTestCase; +import org.junit.Rule; +import org.junit.Test; +import org.jvnet.hudson.test.JenkinsRule; import java.io.IOException; import java.util.concurrent.ExecutionException; @@ -36,18 +40,23 @@ import java.util.concurrent.ExecutionException; /** * Experimenting with Hudson test suite. */ -public class AppTest extends HudsonTestCase -{ +public class AppTest { + + @Rule + public JenkinsRule j = new JenkinsRule(); + + @Test public void test1() throws Exception { meat(); } + @Test public void test2() throws Exception { meat(); } private void meat() throws IOException, InterruptedException, ExecutionException { - FreeStyleProject project = createFreeStyleProject(); + FreeStyleProject project = j.createFreeStyleProject(); if(System.getProperty("os.name").contains("Windows")) { project.getBuildersList().add(new BatchFile("echo hello")); } else { diff --git a/test/src/test/resources/hudson/model/HudsonTest/testSimpleConfigSubmit/config.xml b/test/src/test/resources/hudson/model/HudsonTest/simpleConfigSubmit/config.xml similarity index 100% rename from test/src/test/resources/hudson/model/HudsonTest/testSimpleConfigSubmit/config.xml rename to test/src/test/resources/hudson/model/HudsonTest/simpleConfigSubmit/config.xml diff --git a/test/src/test/resources/hudson/model/HudsonTest/testSimpleConfigSubmit/hudson.scm.CVSSCM.xml b/test/src/test/resources/hudson/model/HudsonTest/simpleConfigSubmit/hudson.scm.CVSSCM.xml similarity index 100% rename from test/src/test/resources/hudson/model/HudsonTest/testSimpleConfigSubmit/hudson.scm.CVSSCM.xml rename to test/src/test/resources/hudson/model/HudsonTest/simpleConfigSubmit/hudson.scm.CVSSCM.xml diff --git a/test/src/test/resources/hudson/model/HudsonTest/testSimpleConfigSubmit/hudson.tasks.Ant.xml b/test/src/test/resources/hudson/model/HudsonTest/simpleConfigSubmit/hudson.tasks.Ant.xml similarity index 100% rename from test/src/test/resources/hudson/model/HudsonTest/testSimpleConfigSubmit/hudson.tasks.Ant.xml rename to test/src/test/resources/hudson/model/HudsonTest/simpleConfigSubmit/hudson.tasks.Ant.xml diff --git a/test/src/test/resources/hudson/model/HudsonTest/testSimpleConfigSubmit/hudson.tasks.Mailer.xml b/test/src/test/resources/hudson/model/HudsonTest/simpleConfigSubmit/hudson.tasks.Mailer.xml similarity index 100% rename from test/src/test/resources/hudson/model/HudsonTest/testSimpleConfigSubmit/hudson.tasks.Mailer.xml rename to test/src/test/resources/hudson/model/HudsonTest/simpleConfigSubmit/hudson.tasks.Mailer.xml diff --git a/test/src/test/resources/hudson/model/HudsonTest/testSimpleConfigSubmit/hudson.tasks.Maven.xml b/test/src/test/resources/hudson/model/HudsonTest/simpleConfigSubmit/hudson.tasks.Maven.xml similarity index 100% rename from test/src/test/resources/hudson/model/HudsonTest/testSimpleConfigSubmit/hudson.tasks.Maven.xml rename to test/src/test/resources/hudson/model/HudsonTest/simpleConfigSubmit/hudson.tasks.Maven.xml diff --git a/test/src/test/resources/hudson/model/HudsonTest/testSimpleConfigSubmit/hudson.tasks.Shell.xml b/test/src/test/resources/hudson/model/HudsonTest/simpleConfigSubmit/hudson.tasks.Shell.xml similarity index 100% rename from test/src/test/resources/hudson/model/HudsonTest/testSimpleConfigSubmit/hudson.tasks.Shell.xml rename to test/src/test/resources/hudson/model/HudsonTest/simpleConfigSubmit/hudson.tasks.Shell.xml diff --git a/test/src/test/resources/hudson/model/HudsonTest/testSimpleConfigSubmit/hudson.triggers.SCMTrigger.xml b/test/src/test/resources/hudson/model/HudsonTest/simpleConfigSubmit/hudson.triggers.SCMTrigger.xml similarity index 100% rename from test/src/test/resources/hudson/model/HudsonTest/testSimpleConfigSubmit/hudson.triggers.SCMTrigger.xml rename to test/src/test/resources/hudson/model/HudsonTest/simpleConfigSubmit/hudson.triggers.SCMTrigger.xml diff --git a/test/src/test/resources/hudson/model/HudsonTest/testSimpleConfigSubmit/queue.xml b/test/src/test/resources/hudson/model/HudsonTest/simpleConfigSubmit/queue.xml similarity index 100% rename from test/src/test/resources/hudson/model/HudsonTest/testSimpleConfigSubmit/queue.xml rename to test/src/test/resources/hudson/model/HudsonTest/simpleConfigSubmit/queue.xml diff --git a/test/src/test/resources/hudson/model/HudsonTest/testSimpleConfigSubmit/secret.key b/test/src/test/resources/hudson/model/HudsonTest/simpleConfigSubmit/secret.key similarity index 100% rename from test/src/test/resources/hudson/model/HudsonTest/testSimpleConfigSubmit/secret.key rename to test/src/test/resources/hudson/model/HudsonTest/simpleConfigSubmit/secret.key diff --git a/test/src/test/resources/hudson/security/HudsonPrivateSecurityRealmTest/testDataCompatibilityWith1_282.zip b/test/src/test/resources/hudson/security/HudsonPrivateSecurityRealmTest/dataCompatibilityWith1_282.zip similarity index 100% rename from test/src/test/resources/hudson/security/HudsonPrivateSecurityRealmTest/testDataCompatibilityWith1_282.zip rename to test/src/test/resources/hudson/security/HudsonPrivateSecurityRealmTest/dataCompatibilityWith1_282.zip diff --git a/test/src/test/resources/hudson/tools/ToolLocationTest/testToolCompatibility/config.xml b/test/src/test/resources/hudson/tools/ToolLocationTest/toolCompatibility/config.xml similarity index 100% rename from test/src/test/resources/hudson/tools/ToolLocationTest/testToolCompatibility/config.xml rename to test/src/test/resources/hudson/tools/ToolLocationTest/toolCompatibility/config.xml diff --git a/test/src/test/resources/hudson/tools/ToolLocationTest/testToolCompatibility/hudson.tasks.Ant.xml b/test/src/test/resources/hudson/tools/ToolLocationTest/toolCompatibility/hudson.tasks.Ant.xml similarity index 100% rename from test/src/test/resources/hudson/tools/ToolLocationTest/testToolCompatibility/hudson.tasks.Ant.xml rename to test/src/test/resources/hudson/tools/ToolLocationTest/toolCompatibility/hudson.tasks.Ant.xml diff --git a/test/src/test/resources/hudson/tools/ToolLocationTest/testToolCompatibility/hudson.tasks.Maven.xml b/test/src/test/resources/hudson/tools/ToolLocationTest/toolCompatibility/hudson.tasks.Maven.xml similarity index 100% rename from test/src/test/resources/hudson/tools/ToolLocationTest/testToolCompatibility/hudson.tasks.Maven.xml rename to test/src/test/resources/hudson/tools/ToolLocationTest/toolCompatibility/hudson.tasks.Maven.xml diff --git a/test/src/test/resources/jenkins/model/BuildDiscarderTest/testCompatibility/config.xml b/test/src/test/resources/jenkins/model/BuildDiscarderTest/compatibility/config.xml similarity index 100% rename from test/src/test/resources/jenkins/model/BuildDiscarderTest/testCompatibility/config.xml rename to test/src/test/resources/jenkins/model/BuildDiscarderTest/compatibility/config.xml diff --git a/test/src/test/resources/jenkins/model/BuildDiscarderTest/testCompatibility/jobs/foo/config.xml b/test/src/test/resources/jenkins/model/BuildDiscarderTest/compatibility/jobs/foo/config.xml similarity index 100% rename from test/src/test/resources/jenkins/model/BuildDiscarderTest/testCompatibility/jobs/foo/config.xml rename to test/src/test/resources/jenkins/model/BuildDiscarderTest/compatibility/jobs/foo/config.xml From 3e29bd7eff12d73a9b49c1d6039dc6d0699db15a Mon Sep 17 00:00:00 2001 From: christ66 Date: Tue, 6 Jan 2015 19:41:51 -0800 Subject: [PATCH 121/701] [JENKINS-22811] Folder loading can break when an item inside the folder fails to load or throws an Exception. --- .../java/hudson/model/ItemGroupMixIn.java | 2 + .../java/hudson/model/ItemGroupMixInTest.java | 79 ++++++++++++++++++ .../xmlFileReadExceptionOnLoad.zip | Bin 0 -> 1545 bytes 3 files changed, 81 insertions(+) create mode 100644 test/src/test/resources/hudson/model/ItemGroupMixInTest/xmlFileReadExceptionOnLoad.zip diff --git a/core/src/main/java/hudson/model/ItemGroupMixIn.java b/core/src/main/java/hudson/model/ItemGroupMixIn.java index d34b5e7f93..e2f2e0e2b7 100644 --- a/core/src/main/java/hudson/model/ItemGroupMixIn.java +++ b/core/src/main/java/hudson/model/ItemGroupMixIn.java @@ -116,6 +116,8 @@ public abstract class ItemGroupMixIn { configurations.put(key.call(item), item); } catch (IOException e) { Logger.getLogger(ItemGroupMixIn.class.getName()).log(Level.WARNING, "could not load " + subdir, e); + } catch (Exception e) { + Logger.getLogger(ItemGroupMixIn.class.getName()).log(Level.WARNING, "could not load " + subdir, e); } } diff --git a/test/src/test/java/hudson/model/ItemGroupMixInTest.java b/test/src/test/java/hudson/model/ItemGroupMixInTest.java index ddf14573db..b9ff4ec32f 100644 --- a/test/src/test/java/hudson/model/ItemGroupMixInTest.java +++ b/test/src/test/java/hudson/model/ItemGroupMixInTest.java @@ -26,13 +26,20 @@ package hudson.model; import java.util.Collection; import static org.junit.Assert.*; +import hudson.Extension; +import hudson.tasks.BuildWrapper; +import hudson.tasks.BuildWrapperDescriptor; +import org.apache.commons.io.FileUtils; import org.junit.Rule; import org.junit.Test; import org.jvnet.hudson.test.Bug; +import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.MockFolder; import org.jvnet.hudson.test.recipes.LocalData; +import java.io.File; + public class ItemGroupMixInTest { @Rule public JenkinsRule r = new JenkinsRule(); @@ -47,4 +54,76 @@ public class ItemGroupMixInTest { assertEquals("valid", items.iterator().next().getName()); } + /** + * This test unit makes sure that if part of the config.xml file is + * deleted it will still load everything else inside the folder. + * The test unit expects an IOException is thrown, and the one failed + * job fails to load. + */ + @Issue("JENKINS-22811") + @Test + public void xmlFileFailsToLoad() throws Exception { + MockFolder folder = r.createFolder("folder"); + assertNotNull(folder); + + AbstractProject project = folder.createProject(FreeStyleProject.class, "job1"); + AbstractProject project2 = folder.createProject(FreeStyleProject.class, "job2"); + AbstractProject project3 = folder.createProject(FreeStyleProject.class, "job3"); + + File configFile = project.getConfigFile().getFile(); + + List lines = FileUtils.readLines(configFile).subList(0, 5); + configFile.delete(); + + // Remove half of the config.xml file to make "invalid" or fail to load + FileUtils.writeByteArrayToFile(configFile, lines.toString().getBytes()); + for (int i = lines.size() / 2; i < lines.size(); i++) { + FileUtils.writeStringToFile(configFile, lines.get(i), true); + } + + // Reload Jenkins. + r.jenkins.reload(); + + // Folder + assertNotNull("Folder failed to load.", folder); + assertNull("Job should have failed to load.", r.jenkins.getItemByFullName("folder/job1")); + assertNotNull("Other job in folder should have loaded.", r.jenkins.getItemByFullName("folder/job2")); + assertNotNull("Other job in folder should have loaded.", r.jenkins.getItemByFullName("folder/job3")); + } + + /** + * This test unit makes sure that any exception that is thrown is caught, however the folder + * will continue to load not impacting any other jobs in the folder. + */ + @LocalData + @Issue("JENKINS-22811") + @Test + public void xmlFileReadExceptionOnLoad() throws Exception { + MockFolder d = r.jenkins.getItemByFullName("d", MockFolder.class); + assertNotNull(d); + Collection items = d.getItems(); + assertEquals(1, items.size()); + assertEquals("valid", items.iterator().next().getName()); + } + + @Extension + public static class MockBuilderThrowsError extends BuildWrapper { + @Override + public Collection getProjectActions(AbstractProject project){ + throw new NullPointerException(); + } + + @Extension + public static class DescriptorImpl extends BuildWrapperDescriptor { + @Override + public boolean isApplicable(AbstractProject item) { + return true; + } + + @Override + public String getDisplayName() { + return null; + } + } + } } diff --git a/test/src/test/resources/hudson/model/ItemGroupMixInTest/xmlFileReadExceptionOnLoad.zip b/test/src/test/resources/hudson/model/ItemGroupMixInTest/xmlFileReadExceptionOnLoad.zip new file mode 100644 index 0000000000000000000000000000000000000000..70b2d12f980864ecc812c3c6b8c589a91d57d6d9 GIT binary patch literal 1545 zcmWIWW@h1H0D-j0UCv+zlwf6$VaUo)D%KAT;bdSASiC%F5fGPFa5FHnykKTv022Xl z?WJhi*5T-Pv znIeK_N@iYJVooMB2-<)q;Rr(!V1RNkgv?ZPvt7OH$TOh#e=;&K$N_1vV^Z|N6wEY4 zc(evu2OTyLSbI{_=;cOzg&+qBwN_09A1}9QV$m-9Z%$Q{k@q}l<|i0h6<-_X!n1$D zrLwOIehh`|f_vE3^IZ7m9>sJ~|L3E%8#!ihz0y{BdhL|gqUC4jn6lm%T~>YmTHQXL z*=d27>RDdyn35Q{MbR?qf{x+3TN%w(w&}@V3)%K_r~7j{?sAi~FMKxd{kGTI_p+0& zZ&F`4Q_W$QjdsOU!Gp`w9!^u;8#P_^*skX(XBL~980Xv)Ozml1`ES~ef6KU~a<=s&jGp!iit@8klS{x!jFCx>8CRZ?09phB0t|m0 zK{Pb2u|jefnyCTa2%|9b7qU_IFrz?84QLpa?163=YF>jF2267dTN)b>h9Uc&u(6nV z3fYbC5ym2X4a#A7e2tmEkWDlNx))pi00#jmw_!2ao*8#u13C~06dJZPHsdfE5gy3F ziJ2;qUAdGA)s?U`3JgyyDGA+N)D(&wO&_tEi*O-06tLRB$_DZ$2M{g Date: Tue, 6 Jan 2015 19:46:01 -0800 Subject: [PATCH 122/701] Fixed compilation error --- test/src/test/java/hudson/model/ItemGroupMixInTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/test/src/test/java/hudson/model/ItemGroupMixInTest.java b/test/src/test/java/hudson/model/ItemGroupMixInTest.java index b9ff4ec32f..d807ee35d5 100644 --- a/test/src/test/java/hudson/model/ItemGroupMixInTest.java +++ b/test/src/test/java/hudson/model/ItemGroupMixInTest.java @@ -39,6 +39,7 @@ import org.jvnet.hudson.test.MockFolder; import org.jvnet.hudson.test.recipes.LocalData; import java.io.File; +import java.util.List; public class ItemGroupMixInTest { From bd1d6251e018d09b4f10606d3b418255a4c09513 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Scheibe?= Date: Wed, 7 Jan 2015 17:12:21 +0100 Subject: [PATCH 123/701] replace all deprecated @Bug annotations with @Issue --- core/src/test/java/hudson/FilePathTest.java | 2 +- core/src/test/java/hudson/FunctionsTest.java | 12 +++---- core/src/test/java/hudson/MarkupTextTest.java | 2 +- core/src/test/java/hudson/UtilTest.java | 4 +-- .../java/hudson/cli/ListJobsCommandTest.java | 2 +- .../java/hudson/console/UrlAnnotatorTest.java | 4 +-- .../java/hudson/logging/LogRecorderTest.java | 4 +-- .../hudson/model/ParametersActionTest.java | 4 +-- core/src/test/java/hudson/model/RunTest.java | 4 +-- .../scheduler/CronTabDayOfWeekLocaleTest.java | 4 +-- .../scheduler/CronTabEventualityTest.java | 6 ++-- .../java/hudson/scheduler/CronTabTest.java | 6 ++-- .../java/hudson/util/FormValidationTest.java | 2 +- .../test/java/hudson/util/RunListTest.java | 4 +-- .../test/java/hudson/util/XStream2Test.java | 6 ++-- .../java/hudson/util/io/TarArchiverTest.java | 6 ++-- .../java/hudson/util/io/ZipArchiverTest.java | 4 +-- .../java/jenkins/ResilientJsonObjectTest.java | 4 +-- .../model/CoreEnvironmentContributorTest.java | 4 +-- .../jenkins/model/JenkinsGetRootUrlTest.java | 8 ++--- .../jenkins/model/PeepholePermalinkTest.java | 4 +-- .../lazy/AbstractLazyLoadRunMapTest.java | 10 +++--- .../src/test/java/jenkins/util/TimerTest.java | 4 +-- .../groovy/hudson/RelativePathTest.groovy | 4 +-- .../groovy/hudson/cli/BuildCommandTest.groovy | 4 +-- .../hudson/model/AbstractBuildTest.groovy | 4 +-- .../hudson/model/AbstractProjectTest.groovy | 32 +++++++++---------- .../jenkins/bugs/Jenkins19124Test.groovy | 4 +-- .../groovy/lib/form/ApplyButtonTest.groovy | 4 +-- .../test/groovy/lib/form/TextAreaTest.groovy | 4 +-- .../hudson/ClassicPluginStrategyTest.java | 4 +-- .../test/java/hudson/PluginManagerTest.java | 6 ++-- .../src/test/java/hudson/ProcStarterTest.java | 4 +-- .../java/hudson/bugs/LoginRedirectTest.java | 4 +-- .../java/hudson/cli/CopyJobCommandTest.java | 4 +-- .../java/hudson/cli/CreateJobCommandTest.java | 4 +-- .../java/hudson/cli/GetJobCommandTest.java | 4 +-- .../java/hudson/cli/GroovyshCommandTest.java | 4 +-- .../hudson/console/ConsoleAnnotatorTest.java | 8 ++--- .../hudson/diagnosis/OldDataMonitorTest.java | 6 ++-- .../init/impl/GroovyInitScriptTest.java | 4 +-- .../logging/LogRecorderManagerTest.java | 4 +-- .../java/hudson/model/AsynchPeopleTest.java | 4 +-- .../src/test/java/hudson/model/CauseTest.java | 6 ++-- .../hudson/model/DependencyGraphTest.java | 6 ++-- .../java/hudson/model/DescriptorTest.java | 4 +-- .../model/DirectoryBrowserSupportTest.java | 4 +-- .../java/hudson/model/DisplayNameTest.java | 4 +-- .../hudson/model/DownloadServiceTest.java | 4 +-- .../model/GetEnvironmentOutsideBuildTest.java | 4 +-- .../java/hudson/model/ItemGroupMixInTest.java | 4 +-- test/src/test/java/hudson/model/JobTest.java | 10 +++--- .../test/java/hudson/model/ListViewTest.java | 12 +++---- .../test/java/hudson/model/ProjectTest.java | 4 +-- .../model/RunParameterDefinitionTest.java | 4 +-- test/src/test/java/hudson/model/RunTest.java | 4 +-- test/src/test/java/hudson/model/UserTest.java | 8 ++--- .../test/java/hudson/model/ViewJobTest.java | 4 +-- test/src/test/java/hudson/model/ViewTest.java | 16 +++++----- .../model/WorkspaceCleanupThreadTest.java | 6 ++-- .../test/java/hudson/search/SearchTest.java | 8 ++--- .../security/csrf/DefaultCrumbIssuerTest.java | 12 +++---- .../hudson/tasks/ArtifactArchiverTest.java | 14 ++++---- .../java/hudson/tasks/FingerprinterTest.java | 6 ++-- .../src/test/java/hudson/tasks/MavenTest.java | 4 +-- .../hudson/triggers/TriggerStartTest.java | 4 +-- .../hudson/util/RingBufferLogHandlerTest.java | 4 +-- .../util/RobustReflectionConverterTest.java | 4 +-- .../java/jenkins/model/ContextMenuTest.java | 4 +-- .../test/java/jenkins/model/JenkinsTest.java | 10 +++--- .../model/lazy/LazyBuildMixInTest.java | 6 ++-- test/src/test/java/lib/form/ComboBoxTest.java | 8 ++--- .../java/lib/form/ExpandableTextboxTest.java | 4 +-- test/src/test/java/lib/layout/LayoutTest.java | 4 +-- .../test/HudsonTestCaseShutdownSlaveTest.java | 2 +- test/src/test/java/scripts/BehaviorTest.java | 4 +-- 76 files changed, 214 insertions(+), 214 deletions(-) diff --git a/core/src/test/java/hudson/FilePathTest.java b/core/src/test/java/hudson/FilePathTest.java index d9370cf145..999b3e792c 100644 --- a/core/src/test/java/hudson/FilePathTest.java +++ b/core/src/test/java/hudson/FilePathTest.java @@ -273,7 +273,7 @@ public class FilePathTest { compare("abc/..","."); compare(".","."); - // @Bug(5951) + // @Issue("JENKINS-5951") compare("C:\\Hudson\\jobs\\foo\\workspace/../../otherjob/workspace/build.xml", "C:\\Hudson\\jobs/otherjob/workspace/build.xml"); // Other cases that failed before diff --git a/core/src/test/java/hudson/FunctionsTest.java b/core/src/test/java/hudson/FunctionsTest.java index d34d9b6bbb..45f845f181 100644 --- a/core/src/test/java/hudson/FunctionsTest.java +++ b/core/src/test/java/hudson/FunctionsTest.java @@ -40,7 +40,7 @@ import static org.junit.Assert.*; import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; -import org.jvnet.hudson.test.Bug; +import org.jvnet.hudson.test.Issue; import org.kohsuke.stapler.Ancestor; import org.kohsuke.stapler.Stapler; import org.kohsuke.stapler.StaplerRequest; @@ -67,7 +67,7 @@ public class FunctionsTest { } @Test - @Bug(7725) + @Issue("JENKINS-7725") public void testGetActionUrl_absoluteUriWithoutAuthority(){ String[] uris = { "mailto:nobody@example.com", @@ -190,7 +190,7 @@ public class FunctionsTest { assertEquals("job/i/", result); } - @Bug(17713) + @Issue("JENKINS-17713") @PrepareForTest({Stapler.class, Jenkins.class}) @Test public void getRelativeLinkTo_MavenModules() throws Exception { Jenkins j = createMockJenkins(); @@ -285,7 +285,7 @@ public class FunctionsTest { } @Test - @Bug(16630) + @Issue("JENKINS-16630") public void testHumanReadableFileSize(){ Locale defaultLocale = Locale.getDefault(); try{ @@ -303,7 +303,7 @@ public class FunctionsTest { } } - @Bug(17030) + @Issue("JENKINS-17030") @Test public void testBreakableString() { @@ -332,7 +332,7 @@ public class FunctionsTest { ); } - @Bug(20800) + @Issue("JENKINS-20800") @Test public void printLogRecordHtml() throws Exception { LogRecord lr = new LogRecord(Level.INFO, "Bad input "); lr.setLoggerName("test"); diff --git a/core/src/test/java/hudson/MarkupTextTest.java b/core/src/test/java/hudson/MarkupTextTest.java index 6662bf500a..31549685bf 100644 --- a/core/src/test/java/hudson/MarkupTextTest.java +++ b/core/src/test/java/hudson/MarkupTextTest.java @@ -111,7 +111,7 @@ public class MarkupTextTest { assertEquals("Line
                \n2 & 3\n<End>\n", text.toString(true)); } - /* @Bug(6252) */ + /* @Issue("JENKINS-6252") */ @Test public void subTextSubText() { MarkupText text = new MarkupText("abcdefgh"); diff --git a/core/src/test/java/hudson/UtilTest.java b/core/src/test/java/hudson/UtilTest.java index ea1a13b6cb..788be00ca2 100644 --- a/core/src/test/java/hudson/UtilTest.java +++ b/core/src/test/java/hudson/UtilTest.java @@ -35,7 +35,7 @@ import java.io.IOException; import static org.junit.Assert.*; import org.junit.Assume; import org.junit.Test; -import org.jvnet.hudson.test.Bug; +import org.jvnet.hudson.test.Issue; import hudson.util.StreamTaskListener; import java.io.FileOutputStream; @@ -281,7 +281,7 @@ public class UtilTest { * Compute 'known-correct' digests and see if I still get them when computed concurrently * to another digest. */ - @Bug(10346) + @Issue("JENKINS-10346") @Test public void testDigestThreadSafety() throws InterruptedException { String a = "abcdefgh"; diff --git a/core/src/test/java/hudson/cli/ListJobsCommandTest.java b/core/src/test/java/hudson/cli/ListJobsCommandTest.java index 420de2a8c2..51b4cd980c 100644 --- a/core/src/test/java/hudson/cli/ListJobsCommandTest.java +++ b/core/src/test/java/hudson/cli/ListJobsCommandTest.java @@ -68,7 +68,7 @@ public class ListJobsCommandTest { /* @Test - @Bug(18393) + @Issue("JENKINS-18393") public void failForMatrixProject() throws Exception { final MatrixProject matrix = mock(MatrixProject.class); diff --git a/core/src/test/java/hudson/console/UrlAnnotatorTest.java b/core/src/test/java/hudson/console/UrlAnnotatorTest.java index 385bf5c8f8..f86fc07a22 100644 --- a/core/src/test/java/hudson/console/UrlAnnotatorTest.java +++ b/core/src/test/java/hudson/console/UrlAnnotatorTest.java @@ -28,7 +28,7 @@ import hudson.MarkupText; import org.junit.Test; -import org.jvnet.hudson.test.Bug; +import org.jvnet.hudson.test.Issue; /** * @author Alan Harder @@ -59,7 +59,7 @@ public class UrlAnnotatorTest { } @Test - @Bug(19866) + @Issue("JENKINS-19866") public void annotateFileScheme() { assertEquals( "Get this file://here/in/this/folder/.", diff --git a/core/src/test/java/hudson/logging/LogRecorderTest.java b/core/src/test/java/hudson/logging/LogRecorderTest.java index 4bf87146b1..6ff4618dd0 100644 --- a/core/src/test/java/hudson/logging/LogRecorderTest.java +++ b/core/src/test/java/hudson/logging/LogRecorderTest.java @@ -29,11 +29,11 @@ import java.util.logging.Level; import java.util.logging.LogRecord; import org.junit.Test; import static org.junit.Assert.*; -import org.jvnet.hudson.test.Bug; +import org.jvnet.hudson.test.Issue; public class LogRecorderTest { - @Bug(17983) + @Issue("JENKINS-17983") @Test public void targetIncludes() { assertTrue(includes("hudson", "hudson")); assertFalse(includes("hudson", "hudsone")); diff --git a/core/src/test/java/hudson/model/ParametersActionTest.java b/core/src/test/java/hudson/model/ParametersActionTest.java index 69c76ebc73..8b96940a7b 100644 --- a/core/src/test/java/hudson/model/ParametersActionTest.java +++ b/core/src/test/java/hudson/model/ParametersActionTest.java @@ -11,7 +11,7 @@ import static org.junit.Assert.assertNull; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotSame; import org.junit.runner.RunWith; -import org.jvnet.hudson.test.Bug; +import org.jvnet.hudson.test.Issue; import static org.powermock.api.mockito.PowerMockito.mock; import org.powermock.modules.junit4.PowerMockRunner; @@ -88,7 +88,7 @@ public class ParametersActionTest { } @Test - @Bug(15094) + @Issue("JENKINS-15094") public void checkNullParamaterValues() { SubTask subtask = mock(SubTask.class); Build build = mock(Build.class); diff --git a/core/src/test/java/hudson/model/RunTest.java b/core/src/test/java/hudson/model/RunTest.java index 95a436d16e..d6b8af4af5 100644 --- a/core/src/test/java/hudson/model/RunTest.java +++ b/core/src/test/java/hudson/model/RunTest.java @@ -34,11 +34,11 @@ import java.util.concurrent.Executors; import static org.junit.Assert.*; import org.junit.Test; -import org.jvnet.hudson.test.Bug; +import org.jvnet.hudson.test.Issue; public class RunTest { - @Bug(15816) + @Issue("JENKINS-15816") @SuppressWarnings({"unchecked", "rawtypes"}) @Test public void timezoneOfID() throws Exception { TimeZone origTZ = TimeZone.getDefault(); diff --git a/core/src/test/java/hudson/scheduler/CronTabDayOfWeekLocaleTest.java b/core/src/test/java/hudson/scheduler/CronTabDayOfWeekLocaleTest.java index e777a3d49f..ba4d8ecff7 100644 --- a/core/src/test/java/hudson/scheduler/CronTabDayOfWeekLocaleTest.java +++ b/core/src/test/java/hudson/scheduler/CronTabDayOfWeekLocaleTest.java @@ -13,7 +13,7 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.junit.runners.Parameterized.Parameters; -import org.jvnet.hudson.test.Bug; +import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.For; import org.jvnet.hudson.test.Url; @@ -276,7 +276,7 @@ public class CronTabDayOfWeekLocaleTest { } @Test - @Bug(12357) + @Issue("JENKINS-12357") public void isSundayAndNextRunIsNextSunday7() throws Exception { final Calendar cal = Calendar.getInstance(locale); cal.set(2011, 0, 16, 1, 0, 0); // Sunday, Jan 16th 2011, 01:00 diff --git a/core/src/test/java/hudson/scheduler/CronTabEventualityTest.java b/core/src/test/java/hudson/scheduler/CronTabEventualityTest.java index 45fae2367e..85d3ca6c6b 100644 --- a/core/src/test/java/hudson/scheduler/CronTabEventualityTest.java +++ b/core/src/test/java/hudson/scheduler/CronTabEventualityTest.java @@ -6,7 +6,7 @@ import static org.junit.Assert.*; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; -import org.jvnet.hudson.test.Bug; +import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.For; import java.text.DateFormat; @@ -42,7 +42,7 @@ public class CronTabEventualityTest { } @Test - @Bug(12388) + @Issue("JENKINS-12388") public void testYearlyWillBeEventuallyTriggeredWithinOneYear() throws ANTLRException { Calendar start = new GregorianCalendar(2012, 0, 11, 22, 33); // Jan 11th 2012 22:33 Calendar limit = createLimit(start, Calendar.YEAR, 1); @@ -50,7 +50,7 @@ public class CronTabEventualityTest { } @Test - @Bug(12388) + @Issue("JENKINS-12388") public void testAnnuallyWillBeEventuallyTriggeredWithinOneYear() throws ANTLRException { Calendar start = new GregorianCalendar(2012, 0, 11, 22, 33); // Jan 11th 2012 22:33 Calendar limit = createLimit(start, Calendar.YEAR, 1); diff --git a/core/src/test/java/hudson/scheduler/CronTabTest.java b/core/src/test/java/hudson/scheduler/CronTabTest.java index e49b9d5297..ea291835bb 100644 --- a/core/src/test/java/hudson/scheduler/CronTabTest.java +++ b/core/src/test/java/hudson/scheduler/CronTabTest.java @@ -32,7 +32,7 @@ import java.util.Locale; import static org.junit.Assert.*; import org.junit.Test; -import org.jvnet.hudson.test.Bug; +import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.Url; import static java.util.Calendar.MONDAY; @@ -81,7 +81,7 @@ public class CronTabTest { } @Test(timeout = 1000) - @Bug(12357) + @Issue("JENKINS-12357") public void testCeil3_DoW7() throws Exception { // similar to testCeil3, but DoW=7 may stuck in an infinite loop CronTab x = new CronTab("0 0 1 * 7"); @@ -162,7 +162,7 @@ public class CronTabTest { compare(new GregorianCalendar(2010,7,1,0,0),x.floor(c)); } - @Bug(8401) + @Issue("JENKINS-8401") @Test public void testFloor4() throws Exception { // conflict between DoM and DoW. In this we need to find a day that's the first day of a month and Sunday in 2010 diff --git a/core/src/test/java/hudson/util/FormValidationTest.java b/core/src/test/java/hudson/util/FormValidationTest.java index f5c18f4510..7f22a1371e 100644 --- a/core/src/test/java/hudson/util/FormValidationTest.java +++ b/core/src/test/java/hudson/util/FormValidationTest.java @@ -54,7 +54,7 @@ public class FormValidationTest { assertEquals(FormValidation.Kind.ERROR, actual.kind); } - // @Bug(7438) + // @Issue("JENKINS-7438") @Test public void testMessage() { assertEquals("test msg", FormValidation.errorWithMarkup("test msg").getMessage()); diff --git a/core/src/test/java/hudson/util/RunListTest.java b/core/src/test/java/hudson/util/RunListTest.java index d6a2c61a33..2ced98d439 100644 --- a/core/src/test/java/hudson/util/RunListTest.java +++ b/core/src/test/java/hudson/util/RunListTest.java @@ -31,7 +31,7 @@ import java.util.ArrayList; import hudson.model.Run; import org.junit.Test; import org.junit.runner.RunWith; -import org.jvnet.hudson.test.Bug; +import org.jvnet.hudson.test.Issue; import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; @@ -72,7 +72,7 @@ public class RunListTest { assertEquals(2, tested.toArray().length); } - @Bug(21159) + @Issue("JENKINS-21159") @PrepareForTest({Run.class}) @Test public void byTimestampFirstRun() { diff --git a/core/src/test/java/hudson/util/XStream2Test.java b/core/src/test/java/hudson/util/XStream2Test.java index 4f86ab00f7..ed29c8c8f2 100644 --- a/core/src/test/java/hudson/util/XStream2Test.java +++ b/core/src/test/java/hudson/util/XStream2Test.java @@ -39,7 +39,7 @@ import java.util.logging.Level; import java.util.logging.Logger; import org.apache.commons.io.FileUtils; import org.junit.Test; -import org.jvnet.hudson.test.Bug; +import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.Issue; /** @@ -244,14 +244,14 @@ public class XStream2Test { assertEquals(l,a.l); } - @Bug(8006) // Previously a null entry in an array caused NPE + @Issue("JENKINS-8006") // Previously a null entry in an array caused NPE @Test public void emptyStack() { assertEquals("", Run.XSTREAM.toXML(new Object[2]).replaceAll("[ \n\r\t]+", "")); } - @Bug(9843) + @Issue("JENKINS-9843") @Test public void compatibilityAlias() { XStream2 xs = new XStream2(); diff --git a/core/src/test/java/hudson/util/io/TarArchiverTest.java b/core/src/test/java/hudson/util/io/TarArchiverTest.java index 3278928ff6..e063e784a0 100644 --- a/core/src/test/java/hudson/util/io/TarArchiverTest.java +++ b/core/src/test/java/hudson/util/io/TarArchiverTest.java @@ -37,7 +37,7 @@ import static org.junit.Assume.*; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; -import org.jvnet.hudson.test.Bug; +import org.jvnet.hudson.test.Issue; public class TarArchiverTest { @@ -46,7 +46,7 @@ public class TarArchiverTest { /** * Makes sure that permissions are properly stored in the tar file. */ - @Bug(9397) + @Issue("JENKINS-9397") @Test public void permission() throws Exception { assumeTrue(!Functions.isWindows()); @@ -98,7 +98,7 @@ public class TarArchiverTest { } } - @Bug(14922) + @Issue("JENKINS-14922") @Test public void brokenSymlinks() throws Exception { assumeTrue(!Functions.isWindows()); File dir = tmp.getRoot(); diff --git a/core/src/test/java/hudson/util/io/ZipArchiverTest.java b/core/src/test/java/hudson/util/io/ZipArchiverTest.java index c0c6b14dd0..08ec7f2f14 100644 --- a/core/src/test/java/hudson/util/io/ZipArchiverTest.java +++ b/core/src/test/java/hudson/util/io/ZipArchiverTest.java @@ -14,7 +14,7 @@ import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; -import org.jvnet.hudson.test.Bug; +import org.jvnet.hudson.test.Issue; public class ZipArchiverTest { @@ -39,7 +39,7 @@ public class ZipArchiverTest { deleteDir(tmpDir); } - @Bug(9942) + @Issue("JENKINS-9942") @Test public void backwardsSlashesOnWindows() { // create foo/bar/baz/Test.txt diff --git a/core/src/test/java/jenkins/ResilientJsonObjectTest.java b/core/src/test/java/jenkins/ResilientJsonObjectTest.java index 4d3172e995..da049792d5 100644 --- a/core/src/test/java/jenkins/ResilientJsonObjectTest.java +++ b/core/src/test/java/jenkins/ResilientJsonObjectTest.java @@ -2,7 +2,7 @@ package jenkins; import net.sf.json.JSONObject; import org.junit.Test; -import org.jvnet.hudson.test.Bug; +import org.jvnet.hudson.test.Issue; /** * @author Kohsuke Kawaguchi @@ -14,7 +14,7 @@ public class ResilientJsonObjectTest { * {@link JSONObject} databinding should be able to ignore non-existent fields. */ @Test - @Bug(15105) + @Issue("JENKINS-15105") public void databindingShouldIgnoreUnrecognizedJsonProperty() { JSONObject o = JSONObject.fromObject("{a:1,b:2}"); Foo f = (Foo)JSONObject.toBean(o,Foo.class); diff --git a/core/src/test/java/jenkins/model/CoreEnvironmentContributorTest.java b/core/src/test/java/jenkins/model/CoreEnvironmentContributorTest.java index 1057916cb0..642abb1323 100644 --- a/core/src/test/java/jenkins/model/CoreEnvironmentContributorTest.java +++ b/core/src/test/java/jenkins/model/CoreEnvironmentContributorTest.java @@ -14,7 +14,7 @@ import java.io.IOException; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import org.jvnet.hudson.test.Bug; +import org.jvnet.hudson.test.Issue; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.powermock.api.mockito.PowerMockito; @@ -40,7 +40,7 @@ public class CoreEnvironmentContributorTest { instance = new CoreEnvironmentContributor(); } - @Bug(19307) + @Issue("JENKINS-19307") @Test @PrepareForTest(fullyQualifiedNames={"hudson.model.Computer", "jenkins.model.Jenkins"}) public void buildEnvironmentForJobShouldntUseCurrentComputer() throws IOException, InterruptedException { diff --git a/core/src/test/java/jenkins/model/JenkinsGetRootUrlTest.java b/core/src/test/java/jenkins/model/JenkinsGetRootUrlTest.java index 0c255e4d0f..a2b5f3afd2 100644 --- a/core/src/test/java/jenkins/model/JenkinsGetRootUrlTest.java +++ b/core/src/test/java/jenkins/model/JenkinsGetRootUrlTest.java @@ -34,7 +34,7 @@ import java.net.URL; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import org.jvnet.hudson.test.Bug; +import org.jvnet.hudson.test.Issue; import org.kohsuke.stapler.Stapler; import org.kohsuke.stapler.StaplerRequest; import static org.mockito.Matchers.anyString; @@ -88,7 +88,7 @@ public class JenkinsGetRootUrlTest { rootUrlIs("http://configured.host/"); } - @Bug(16368) + @Issue("JENKINS-16368") @Test public void doNotInheritProtocolWhenDispatchingRequest() { @@ -98,7 +98,7 @@ public class JenkinsGetRootUrlTest { rootUrlIs("http://configured.host/"); } - @Bug(16511) + @Issue("JENKINS-16511") @Test public void doNotInheritProtocolWhenDispatchingRequest2() { configured("https://ci/jenkins/"); @@ -106,7 +106,7 @@ public class JenkinsGetRootUrlTest { rootUrlIs("https://ci/jenkins/"); } - @Bug(10675) + @Issue("JENKINS-10675") @Test public void useForwardedProtoWhenPresent() { configured("https://ci/jenkins/"); diff --git a/core/src/test/java/jenkins/model/PeepholePermalinkTest.java b/core/src/test/java/jenkins/model/PeepholePermalinkTest.java index fbe40b1c27..fa992e0bb1 100644 --- a/core/src/test/java/jenkins/model/PeepholePermalinkTest.java +++ b/core/src/test/java/jenkins/model/PeepholePermalinkTest.java @@ -29,13 +29,13 @@ import org.junit.Test; import static org.junit.Assert.*; import org.junit.Rule; import org.junit.rules.TemporaryFolder; -import org.jvnet.hudson.test.Bug; +import org.jvnet.hudson.test.Issue; public class PeepholePermalinkTest { @Rule public TemporaryFolder tmp = new TemporaryFolder(); - @Bug(17681) + @Issue("JENKINS-17681") @Test public void symlinks() throws Exception { File link = new File(tmp.getRoot(), "link"); PeepholePermalink.writeSymlink(link, "stuff"); diff --git a/core/src/test/java/jenkins/model/lazy/AbstractLazyLoadRunMapTest.java b/core/src/test/java/jenkins/model/lazy/AbstractLazyLoadRunMapTest.java index 247653e501..cfd8d5f53a 100644 --- a/core/src/test/java/jenkins/model/lazy/AbstractLazyLoadRunMapTest.java +++ b/core/src/test/java/jenkins/model/lazy/AbstractLazyLoadRunMapTest.java @@ -38,7 +38,7 @@ import java.util.Set; import java.util.SortedMap; import java.util.logging.Level; import org.junit.BeforeClass; -import org.jvnet.hudson.test.Bug; +import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.Issue; /** @@ -150,7 +150,7 @@ public class AbstractLazyLoadRunMapTest extends Assert { assertNull(a.search(-99, Direction.DESC)); } - @Bug(19418) + @Issue("JENKINS-19418") @Test public void searchExactWhenIndexedButSoftReferenceExpired() throws IOException { final FakeMap m = localExpiredBuilder.add(1).add(2).make(); @@ -163,7 +163,7 @@ public class AbstractLazyLoadRunMapTest extends Assert { assertNull(m.search(0, Direction.EXACT)); } - @Bug(22681) + @Issue("JENKINS-22681") @Test public void exactSearchShouldNotReload() throws Exception { FakeMap m = localBuilder.add(1).add(2).make(); assertNull(m.search(0, Direction.EXACT)); @@ -220,7 +220,7 @@ public class AbstractLazyLoadRunMapTest extends Assert { b.hashCode(); } - @Bug(15439) + @Issue("JENKINS-15439") @Test public void indexOutOfBounds() throws Exception { FakeMapBuilder f = localBuilder; @@ -239,7 +239,7 @@ public class AbstractLazyLoadRunMapTest extends Assert { assert x.n==201; } - @Bug(18065) + @Issue("JENKINS-18065") @Test public void all() throws Exception { assertEquals("[]", a.getLoadedBuilds().keySet().toString()); Set> entries = a.entrySet(); diff --git a/core/src/test/java/jenkins/util/TimerTest.java b/core/src/test/java/jenkins/util/TimerTest.java index 9e0079d4a8..d95ffddd28 100644 --- a/core/src/test/java/jenkins/util/TimerTest.java +++ b/core/src/test/java/jenkins/util/TimerTest.java @@ -3,7 +3,7 @@ package jenkins.util; import hudson.triggers.SafeTimerTask; import org.junit.Assert; import org.junit.Test; -import org.jvnet.hudson.test.Bug; +import org.jvnet.hudson.test.Issue; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; @@ -15,7 +15,7 @@ public class TimerTest { * by running doRun() concurrently. */ @Test - @Bug(19622) + @Issue("JENKINS-19622") public void timersArentBlocked() throws InterruptedException { final CountDownLatch startLatch = new CountDownLatch(1); final CountDownLatch stopLatch = new CountDownLatch(1); diff --git a/test/src/test/groovy/hudson/RelativePathTest.groovy b/test/src/test/groovy/hudson/RelativePathTest.groovy index b135bc906c..a6a865f6a0 100644 --- a/test/src/test/groovy/hudson/RelativePathTest.groovy +++ b/test/src/test/groovy/hudson/RelativePathTest.groovy @@ -4,7 +4,7 @@ import hudson.model.AbstractDescribableImpl import hudson.model.Describable import hudson.model.Descriptor import hudson.util.ListBoxModel -import org.jvnet.hudson.test.Bug +import org.jvnet.hudson.test.Issue import org.jvnet.hudson.test.HudsonTestCase import org.jvnet.hudson.test.TestExtension import org.kohsuke.stapler.QueryParameter @@ -15,7 +15,7 @@ import org.kohsuke.stapler.QueryParameter * @author Kohsuke Kawaguchi */ class RelativePathTest extends HudsonTestCase implements Describable { - @Bug(18776) + @Issue("JENKINS-18776") void testRelativePath() { // I was having trouble causing annotation processing on test stubs jenkins.getDescriptorOrDie(RelativePathTest.class) diff --git a/test/src/test/groovy/hudson/cli/BuildCommandTest.groovy b/test/src/test/groovy/hudson/cli/BuildCommandTest.groovy index e13c8a59ea..bec4c67584 100644 --- a/test/src/test/groovy/hudson/cli/BuildCommandTest.groovy +++ b/test/src/test/groovy/hudson/cli/BuildCommandTest.groovy @@ -32,7 +32,7 @@ import hudson.Extension import org.junit.Rule import org.junit.Test -import org.jvnet.hudson.test.Bug +import org.jvnet.hudson.test.Issue import org.jvnet.hudson.test.CaptureEnvironmentBuilder import org.jvnet.hudson.test.JenkinsRule import org.jvnet.hudson.test.RandomlyFails @@ -232,7 +232,7 @@ public class BuildCommandTest { assertEquals("a=b", project.getBuildByNumber(1).getBuildVariables().get("expr")); } - @Bug(15094) + @Issue("JENKINS-15094") @Test public void executorsAliveOnParameterWithNullDefaultValue() throws Exception { def slave = j.createSlave(); FreeStyleProject project = j.createFreeStyleProject("foo"); diff --git a/test/src/test/groovy/hudson/model/AbstractBuildTest.groovy b/test/src/test/groovy/hudson/model/AbstractBuildTest.groovy index 1c2d03ad9a..f237f9b12e 100644 --- a/test/src/test/groovy/hudson/model/AbstractBuildTest.groovy +++ b/test/src/test/groovy/hudson/model/AbstractBuildTest.groovy @@ -38,7 +38,7 @@ import org.jvnet.hudson.test.UnstableBuilder import static org.junit.Assert.* import org.junit.Rule import org.junit.Test -import org.jvnet.hudson.test.Bug +import org.jvnet.hudson.test.Issue public class AbstractBuildTest { @@ -123,7 +123,7 @@ public class AbstractBuildTest { assertCulprits(b,["george"]) } - @Bug(19920) + @Issue("JENKINS-19920") @Test void lastBuildNextBuild() { FreeStyleProject p = j.createFreeStyleProject(); AbstractBuild b1 = j.assertBuildStatusSuccess(p.scheduleBuild2(0)); diff --git a/test/src/test/groovy/hudson/model/AbstractProjectTest.groovy b/test/src/test/groovy/hudson/model/AbstractProjectTest.groovy index 56e8696754..b29a40e0de 100644 --- a/test/src/test/groovy/hudson/model/AbstractProjectTest.groovy +++ b/test/src/test/groovy/hudson/model/AbstractProjectTest.groovy @@ -55,7 +55,7 @@ import jenkins.model.Jenkins; import org.acegisecurity.context.SecurityContext; import org.acegisecurity.context.SecurityContextHolder import org.jvnet.hudson.test.HudsonTestCase -import org.jvnet.hudson.test.Bug; +import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.MemoryAssert import org.jvnet.hudson.test.SequenceLock; import org.jvnet.hudson.test.recipes.PresetData; @@ -150,7 +150,7 @@ public class AbstractProjectTest extends HudsonTestCase { /** * Tests round trip configuration of the blockBuildWhenUpstreamBuilding field */ - @Bug(4423) + @Issue("JENKINS-4423") public void testConfiguringBlockBuildWhenUpstreamBuildingRoundtrip() { def p = createFreeStyleProject(); p.blockBuildWhenUpstreamBuilding = false; @@ -172,7 +172,7 @@ public class AbstractProjectTest extends HudsonTestCase { * Unless the concurrent build option is enabled, polling and build should be mutually exclusive * to avoid allocating unnecessary workspaces. */ - @Bug(4202) + @Issue("JENKINS-4202") public void testPollingAndBuildExclusion() { final OneShotEvent sync = new OneShotEvent(); @@ -230,7 +230,7 @@ public class AbstractProjectTest extends HudsonTestCase { } } - @Bug(1986) + @Issue("JENKINS-1986") public void testBuildSymlinks() { // If we're on Windows, don't bother doing this. if (Functions.isWindows()) @@ -266,7 +266,7 @@ public class AbstractProjectTest extends HudsonTestCase { assert s.contains("Build #" + buildNumber + "\n") : "link should point to build #$buildNumber, but link was: ${Util.resolveSymlink(file, TaskListener.NULL)}\nand log was:\n$s"; } - @Bug(2543) + @Issue("JENKINS-2543") public void testSymlinkForPostBuildFailure() { // If we're on Windows, don't bother doing this. if (Functions.isWindows()) @@ -292,7 +292,7 @@ public class AbstractProjectTest extends HudsonTestCase { } /* TODO too slow, seems capable of causing testWorkspaceLock to time out: - @Bug(15156) + @Issue("JENKINS-15156") public void testGetBuildAfterGC() { FreeStyleProject job = createFreeStyleProject(); job.scheduleBuild2(0, new Cause.UserIdCause()).get(); @@ -302,7 +302,7 @@ public class AbstractProjectTest extends HudsonTestCase { } */ - @Bug(17137) + @Issue("JENKINS-17137") public void testExternalBuildDirectorySymlinks() { // TODO when using JUnit 4 add: Assume.assumeFalse(Functions.isWindows()); // symlinks may not be available def form = createWebClient().goTo("configure").getFormByName("config"); @@ -333,7 +333,7 @@ public class AbstractProjectTest extends HudsonTestCase { } } - @Bug(17138) + @Issue("JENKINS-17138") public void testExternalBuildDirectoryRenameDelete() { def form = createWebClient().goTo("configure").getFormByName("config"); def builds = createTmpDir(); @@ -353,7 +353,7 @@ public class AbstractProjectTest extends HudsonTestCase { assert !b.rootDir.isDirectory(); } - @Bug(18678) + @Issue("JENKINS-18678") public void testRenameJobLostBuilds() throws Exception { def p = createFreeStyleProject("initial"); assertBuildStatusSuccess(p.scheduleBuild2(0)); @@ -372,7 +372,7 @@ public class AbstractProjectTest extends HudsonTestCase { assertEquals(1, p.getBuilds().size()); } - @Bug(17575) + @Issue("JENKINS-17575") public void testDeleteRedirect() { createFreeStyleProject("j1"); assert "" == deleteRedirectTarget("job/j1"); @@ -396,7 +396,7 @@ public class AbstractProjectTest extends HudsonTestCase { return loc.substring(base.length()); } - @Bug(18407) + @Issue("JENKINS-18407") public void testQueueSuccessBehavior() { // prevent any builds to test the behaviour jenkins.numExecutors = 0; @@ -415,7 +415,7 @@ public class AbstractProjectTest extends HudsonTestCase { /** * Do the same as {@link #testQueueSuccessBehavior()} but over HTTP */ - @Bug(18407) + @Issue("JENKINS-18407") public void testQueueSuccessBehaviorOverHTTP() { // prevent any builds to test the behaviour jenkins.numExecutors = 0; @@ -454,7 +454,7 @@ public class AbstractProjectTest extends HudsonTestCase { assert t.spec=="*/10 * * * *" } - @Bug(18813) + @Issue("JENKINS-18813") public void testRemoveTrigger() { AbstractProject j = jenkins.createProjectFromXML("foo", getClass().getResourceAsStream("AbstractProjectTest/vectorTriggers.xml")) @@ -463,7 +463,7 @@ public class AbstractProjectTest extends HudsonTestCase { assert j.triggers().size()==0 } - @Bug(18813) + @Issue("JENKINS-18813") public void testAddTriggerSameType() { AbstractProject j = jenkins.createProjectFromXML("foo", getClass().getResourceAsStream("AbstractProjectTest/vectorTriggers.xml")) @@ -476,7 +476,7 @@ public class AbstractProjectTest extends HudsonTestCase { assert t.spec=="H/5 * * * *" } - @Bug(18813) + @Issue("JENKINS-18813") public void testAddTriggerDifferentType() { AbstractProject j = jenkins.createProjectFromXML("foo", getClass().getResourceAsStream("AbstractProjectTest/vectorTriggers.xml")) @@ -488,7 +488,7 @@ public class AbstractProjectTest extends HudsonTestCase { assert t == newTrigger } - @Bug(10615) + @Issue("JENKINS-10615") public void testWorkspaceLock() { def p = createFreeStyleProject() p.concurrentBuild = true; diff --git a/test/src/test/groovy/jenkins/bugs/Jenkins19124Test.groovy b/test/src/test/groovy/jenkins/bugs/Jenkins19124Test.groovy index eb9aa86d3f..5e7d248be9 100644 --- a/test/src/test/groovy/jenkins/bugs/Jenkins19124Test.groovy +++ b/test/src/test/groovy/jenkins/bugs/Jenkins19124Test.groovy @@ -10,7 +10,7 @@ import hudson.util.FormValidation import hudson.util.ListBoxModel import org.junit.Rule import org.junit.Test -import org.jvnet.hudson.test.Bug +import org.jvnet.hudson.test.Issue import org.jvnet.hudson.test.JenkinsRule import org.jvnet.hudson.test.TestExtension import org.kohsuke.stapler.QueryParameter @@ -29,7 +29,7 @@ class Jenkins19124Test { @Inject DescriptorImpl d; - @Bug(19124) + @Issue("JENKINS-19124") @Test public void interrelatedFormValidation() { j.jenkins.injector.injectMembers(this); diff --git a/test/src/test/groovy/lib/form/ApplyButtonTest.groovy b/test/src/test/groovy/lib/form/ApplyButtonTest.groovy index be84961f20..ceae5ed940 100644 --- a/test/src/test/groovy/lib/form/ApplyButtonTest.groovy +++ b/test/src/test/groovy/lib/form/ApplyButtonTest.groovy @@ -3,7 +3,7 @@ package lib.form import hudson.markup.RawHtmlMarkupFormatter import org.junit.Rule import org.junit.Test -import org.jvnet.hudson.test.Bug +import org.jvnet.hudson.test.Issue import org.jvnet.hudson.test.JenkinsRule /** @@ -17,7 +17,7 @@ class ApplyButtonTest { /** * Editing code mirror should still gets reflected when you click apply. */ - @Test @Bug(18436) + @Test @Issue("JENKINS-18436") public void editDescription() { j.jenkins.markupFormatter = RawHtmlMarkupFormatter.INSTANCE // need something using CodeMirror def p = j.createFreeStyleProject() diff --git a/test/src/test/groovy/lib/form/TextAreaTest.groovy b/test/src/test/groovy/lib/form/TextAreaTest.groovy index 6da2fa4b4e..d3bc537212 100644 --- a/test/src/test/groovy/lib/form/TextAreaTest.groovy +++ b/test/src/test/groovy/lib/form/TextAreaTest.groovy @@ -6,7 +6,7 @@ import hudson.tasks.Builder import hudson.util.FormValidation import org.junit.Rule import org.junit.Test -import org.jvnet.hudson.test.Bug +import org.jvnet.hudson.test.Issue import org.jvnet.hudson.test.JenkinsRule import org.jvnet.hudson.test.TestExtension import org.kohsuke.stapler.DataBoundConstructor @@ -26,7 +26,7 @@ class TextAreaTest { @Inject TestBuilder.DescriptorImpl d; - @Test @Bug(19457) + @Test @Issue("JENKINS-19457") public void validation() { j.jenkins.injector.injectMembers(this) def p = j.createFreeStyleProject() diff --git a/test/src/test/java/hudson/ClassicPluginStrategyTest.java b/test/src/test/java/hudson/ClassicPluginStrategyTest.java index 26779a1371..3080dd7028 100644 --- a/test/src/test/java/hudson/ClassicPluginStrategyTest.java +++ b/test/src/test/java/hudson/ClassicPluginStrategyTest.java @@ -24,7 +24,7 @@ */ package hudson; -import org.jvnet.hudson.test.Bug; +import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.HudsonTestCase; import org.jvnet.hudson.test.recipes.LocalData; @@ -74,7 +74,7 @@ public class ClassicPluginStrategyTest extends HudsonTestCase { * Check transitive dependency exclude disabled plugins */ @LocalData - @Bug(18654) + @Issue("JENKINS-18654") public void testDisabledDependencyClassLoader() throws Exception { PluginWrapper p = jenkins.getPluginManager().getPlugin("foo4"); diff --git a/test/src/test/java/hudson/PluginManagerTest.java b/test/src/test/java/hudson/PluginManagerTest.java index ad7b6bd9fd..6ac6d363de 100644 --- a/test/src/test/java/hudson/PluginManagerTest.java +++ b/test/src/test/java/hudson/PluginManagerTest.java @@ -47,7 +47,7 @@ import static org.junit.Assert.*; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; -import org.jvnet.hudson.test.Bug; +import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.Url; import org.jvnet.hudson.test.recipes.WithPlugin; @@ -318,7 +318,7 @@ public class PluginManagerTest { * * @throws Exception */ - @Bug(19976) + @Issue("JENKINS-19976") @Test public void installDependedPluginWithoutRestart() throws Exception { // Load depender. { @@ -357,7 +357,7 @@ public class PluginManagerTest { assertTrue(r.jenkins.getExtensionList("org.jenkinsci.plugins.dependencytest.dependee.DependeeExtensionPoint").isEmpty()); } - @Bug(12753) + @Issue("JENKINS-12753") @WithPlugin("tasks.jpi") @Test public void dynamicLoadRestartRequiredException() throws Exception { File jpi = new File(r.jenkins.getRootDir(), "plugins/tasks.jpi"); diff --git a/test/src/test/java/hudson/ProcStarterTest.java b/test/src/test/java/hudson/ProcStarterTest.java index 49ab5b6b5c..6e4064464f 100644 --- a/test/src/test/java/hudson/ProcStarterTest.java +++ b/test/src/test/java/hudson/ProcStarterTest.java @@ -31,7 +31,7 @@ import hudson.model.Run; import hudson.tasks.BuildWrapper; import hudson.tasks.BuildWrapperDescriptor; import java.io.IOException; -import org.jvnet.hudson.test.Bug; +import org.jvnet.hudson.test.Issue; import hudson.Launcher.DecoratedLauncher; import org.junit.Rule; import org.junit.Test; @@ -48,7 +48,7 @@ public class ProcStarterTest { public JenkinsRule rule = new JenkinsRule(); @Test - @Bug(20559) + @Issue("JENKINS-20559") public void testNonInitializedEnvsNPE() throws Exception { // Create nodes and other test stuff rule.hudson.setNumExecutors(0); diff --git a/test/src/test/java/hudson/bugs/LoginRedirectTest.java b/test/src/test/java/hudson/bugs/LoginRedirectTest.java index e9e3455cc1..d26ab3c11a 100644 --- a/test/src/test/java/hudson/bugs/LoginRedirectTest.java +++ b/test/src/test/java/hudson/bugs/LoginRedirectTest.java @@ -26,7 +26,7 @@ package hudson.bugs; import com.gargoylesoftware.htmlunit.html.HtmlForm; import com.gargoylesoftware.htmlunit.html.HtmlPage; import java.net.HttpURLConnection; -import org.jvnet.hudson.test.Bug; +import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.HudsonTestCase; import org.jvnet.hudson.test.recipes.PresetData; import org.jvnet.hudson.test.recipes.PresetData.DataSet; @@ -36,7 +36,7 @@ import org.jvnet.hudson.test.recipes.PresetData.DataSet; * * @author Kohsuke Kawaguchi */ -@Bug(2290) +@Issue("JENKINS-2290") public class LoginRedirectTest extends HudsonTestCase { protected void setUp() throws Exception { contextPath = "/hudson"; diff --git a/test/src/test/java/hudson/cli/CopyJobCommandTest.java b/test/src/test/java/hudson/cli/CopyJobCommandTest.java index 175fe555c5..06fac566f6 100644 --- a/test/src/test/java/hudson/cli/CopyJobCommandTest.java +++ b/test/src/test/java/hudson/cli/CopyJobCommandTest.java @@ -43,7 +43,7 @@ import static org.junit.Assert.*; import org.junit.Before; import org.junit.Rule; import org.junit.Test; -import org.jvnet.hudson.test.Bug; +import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.MockFolder; @@ -72,7 +72,7 @@ public class CopyJobCommandTest { // TODO test copying from/to root, or into nonexistent folder } - @Bug(22262) + @Issue("JENKINS-22262") @Test public void folderPermissions() throws Exception { final MockFolder d1 = j.createFolder("d1"); final FreeStyleProject p = d1.createProject(FreeStyleProject.class, "p"); diff --git a/test/src/test/java/hudson/cli/CreateJobCommandTest.java b/test/src/test/java/hudson/cli/CreateJobCommandTest.java index 81a82fa307..a11b0461ac 100644 --- a/test/src/test/java/hudson/cli/CreateJobCommandTest.java +++ b/test/src/test/java/hudson/cli/CreateJobCommandTest.java @@ -41,7 +41,7 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.Assert.*; import org.junit.Rule; import org.junit.Test; -import org.jvnet.hudson.test.Bug; +import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.MockFolder; @@ -49,7 +49,7 @@ public class CreateJobCommandTest { @Rule public JenkinsRule r = new JenkinsRule(); - @Bug(22262) + @Issue("JENKINS-22262") @Test public void folderPermissions() throws Exception { CLICommand cmd = new CreateJobCommand(); CLICommandInvoker invoker = new CLICommandInvoker(r, cmd); diff --git a/test/src/test/java/hudson/cli/GetJobCommandTest.java b/test/src/test/java/hudson/cli/GetJobCommandTest.java index 2ecbf318ba..cc36bff8b1 100644 --- a/test/src/test/java/hudson/cli/GetJobCommandTest.java +++ b/test/src/test/java/hudson/cli/GetJobCommandTest.java @@ -34,7 +34,7 @@ import org.apache.commons.io.input.NullInputStream; import static org.junit.Assert.*; import org.junit.Rule; import org.junit.Test; -import org.jvnet.hudson.test.Bug; +import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.MockFolder; @@ -43,7 +43,7 @@ public class GetJobCommandTest { @Rule public JenkinsRule j = new JenkinsRule(); - @Bug(20236) + @Issue("JENKINS-20236") @Test public void withFolders() throws Exception { MockFolder d = j.createFolder("d"); FreeStyleProject p = d.createProject(FreeStyleProject.class, "p"); diff --git a/test/src/test/java/hudson/cli/GroovyshCommandTest.java b/test/src/test/java/hudson/cli/GroovyshCommandTest.java index a2561f89f0..8c7d1a4066 100644 --- a/test/src/test/java/hudson/cli/GroovyshCommandTest.java +++ b/test/src/test/java/hudson/cli/GroovyshCommandTest.java @@ -31,14 +31,14 @@ import static org.hamcrest.CoreMatchers.containsString; import static org.junit.Assert.*; import org.junit.Rule; import org.junit.Test; -import org.jvnet.hudson.test.Bug; +import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.JenkinsRule; public class GroovyshCommandTest { @Rule public JenkinsRule r = new JenkinsRule(); - @Bug(17929) + @Issue("JENKINS-17929") @Test public void authentication() throws Exception { CLICommandInvoker.Result result = new CLICommandInvoker(r, new GroovyshCommand()) .authorizedTo(Jenkins.READ, Jenkins.RUN_SCRIPTS) diff --git a/test/src/test/java/hudson/console/ConsoleAnnotatorTest.java b/test/src/test/java/hudson/console/ConsoleAnnotatorTest.java index 993f749c77..7ab76e9170 100644 --- a/test/src/test/java/hudson/console/ConsoleAnnotatorTest.java +++ b/test/src/test/java/hudson/console/ConsoleAnnotatorTest.java @@ -29,7 +29,7 @@ import java.util.concurrent.Future; import static org.junit.Assert.*; import org.junit.Rule; import org.junit.Test; -import org.jvnet.hudson.test.Bug; +import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.SequenceLock; import org.jvnet.hudson.test.SingleFileSCM; @@ -46,7 +46,7 @@ public class ConsoleAnnotatorTest { /** * Let the build complete, and see if stateless {@link ConsoleAnnotator} annotations happen as expected. */ - @Bug(6031) + @Issue("JENKINS-6031") @Test public void completedStatelessLogAnnotation() throws Exception { FreeStyleProject p = r.createFreeStyleProject(); p.getBuildersList().add(new TestBuilder() { @@ -97,7 +97,7 @@ public class ConsoleAnnotatorTest { } } - @Bug(6034) + @Issue("JENKINS-6034") @Test public void consoleAnnotationFilterOut() throws Exception { FreeStyleProject p = r.createFreeStyleProject(); p.getBuildersList().add(new TestBuilder() { @@ -315,7 +315,7 @@ public class ConsoleAnnotatorTest { /** * Makes sure '<', '&', are escaped. */ - @Bug(5952) + @Issue("JENKINS-5952") @Test public void escape() throws Exception { FreeStyleProject p = r.createFreeStyleProject(); p.getBuildersList().add(new TestBuilder() { diff --git a/test/src/test/java/hudson/diagnosis/OldDataMonitorTest.java b/test/src/test/java/hudson/diagnosis/OldDataMonitorTest.java index 28360f0583..57bdaea9fc 100644 --- a/test/src/test/java/hudson/diagnosis/OldDataMonitorTest.java +++ b/test/src/test/java/hudson/diagnosis/OldDataMonitorTest.java @@ -49,7 +49,7 @@ import static org.junit.Assert.*; import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; -import org.jvnet.hudson.test.Bug; +import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.MemoryAssert; @@ -66,7 +66,7 @@ public class OldDataMonitorTest { @Rule public JenkinsRule r = new JenkinsRule(); @Ignore("constantly failing on CI builders, makes problems for memory()") - @Bug(19544) + @Issue("JENKINS-19544") @LocalData @Test public void robustness() throws Exception { OldDataMonitor odm = OldDataMonitor.get(r.jenkins); @@ -86,7 +86,7 @@ public class OldDataMonitorTest { // did not manage to save p, but at least we are not holding onto a reference to it anymore } - @Bug(19544) + @Issue("JENKINS-19544") @Test public void memory() throws Exception { FreeStyleProject p = r.createFreeStyleProject("p"); FreeStyleBuild b = r.assertBuildStatusSuccess(p.scheduleBuild2(0)); diff --git a/test/src/test/java/hudson/init/impl/GroovyInitScriptTest.java b/test/src/test/java/hudson/init/impl/GroovyInitScriptTest.java index 5a8ab124c4..33a2e806af 100644 --- a/test/src/test/java/hudson/init/impl/GroovyInitScriptTest.java +++ b/test/src/test/java/hudson/init/impl/GroovyInitScriptTest.java @@ -27,7 +27,7 @@ package hudson.init.impl; import static org.junit.Assert.*; import org.junit.Rule; import org.junit.Test; -import org.jvnet.hudson.test.Bug; +import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.recipes.LocalData; @@ -35,7 +35,7 @@ public class GroovyInitScriptTest { @Rule public JenkinsRule j = new JenkinsRule(); - @Bug(17933) + @Issue("JENKINS-17933") @LocalData @Test public void errorsHandled() throws Exception { assertEquals("true", System.getProperty("started")); diff --git a/test/src/test/java/hudson/logging/LogRecorderManagerTest.java b/test/src/test/java/hudson/logging/LogRecorderManagerTest.java index d27ea875c4..0a7e215dbe 100644 --- a/test/src/test/java/hudson/logging/LogRecorderManagerTest.java +++ b/test/src/test/java/hudson/logging/LogRecorderManagerTest.java @@ -38,7 +38,7 @@ import java.util.logging.LogRecord; import static org.junit.Assert.*; import org.junit.Rule; import org.junit.Test; -import org.jvnet.hudson.test.Bug; +import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.JenkinsRule; /** @@ -64,7 +64,7 @@ public class LogRecorderManagerTest { assertEquals(logger.getLevel(), Level.FINEST); } - @Bug(18274) + @Issue("JENKINS-18274") @Test public void loggingOnSlaves() throws Exception { // TODO could also go through WebClient to assert that the config UI works LogRecorderManager mgr = j.jenkins.getLog(); diff --git a/test/src/test/java/hudson/model/AsynchPeopleTest.java b/test/src/test/java/hudson/model/AsynchPeopleTest.java index b2b8174fe0..00fae6b364 100644 --- a/test/src/test/java/hudson/model/AsynchPeopleTest.java +++ b/test/src/test/java/hudson/model/AsynchPeopleTest.java @@ -30,7 +30,7 @@ import com.gargoylesoftware.htmlunit.html.HtmlPage; import static org.junit.Assert.*; import org.junit.Rule; import org.junit.Test; -import org.jvnet.hudson.test.Bug; +import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.For; import org.jvnet.hudson.test.JenkinsRule; @@ -39,7 +39,7 @@ public class AsynchPeopleTest { @Rule public JenkinsRule j = new JenkinsRule(); - @Bug(18641) + @Issue("JENKINS-18641") @Test public void display() throws Exception { User.get("bob"); JenkinsRule.WebClient wc = j.createWebClient(); diff --git a/test/src/test/java/hudson/model/CauseTest.java b/test/src/test/java/hudson/model/CauseTest.java index 750a023411..9aeabdec9f 100644 --- a/test/src/test/java/hudson/model/CauseTest.java +++ b/test/src/test/java/hudson/model/CauseTest.java @@ -31,14 +31,14 @@ import java.util.regex.Pattern; import static org.junit.Assert.*; import org.junit.Rule; import org.junit.Test; -import org.jvnet.hudson.test.Bug; +import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.JenkinsRule; public class CauseTest { @Rule public JenkinsRule j = new JenkinsRule(); - @Bug(14814) + @Issue("JENKINS-14814") @Test public void deeplyNestedCauses() throws Exception { FreeStyleProject a = j.createFreeStyleProject("a"); FreeStyleProject b = j.createFreeStyleProject("b"); @@ -56,7 +56,7 @@ public class CauseTest { assertFalse("too big:\n" + buildXml, buildXml.contains("1")); } - @Bug(15747) + @Issue("JENKINS-15747") @Test public void broadlyNestedCauses() throws Exception { FreeStyleProject a = j.createFreeStyleProject("a"); FreeStyleProject b = j.createFreeStyleProject("b"); diff --git a/test/src/test/java/hudson/model/DependencyGraphTest.java b/test/src/test/java/hudson/model/DependencyGraphTest.java index 8ea0daf818..1bb7e134cf 100644 --- a/test/src/test/java/hudson/model/DependencyGraphTest.java +++ b/test/src/test/java/hudson/model/DependencyGraphTest.java @@ -35,7 +35,7 @@ import java.util.concurrent.TimeUnit; import org.acegisecurity.context.SecurityContextHolder; import org.jvnet.hudson.test.HudsonTestCase; -import org.jvnet.hudson.test.Bug; +import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.MockBuilder; import org.jvnet.hudson.test.recipes.LocalData; @@ -112,7 +112,7 @@ public class DependencyGraphTest extends HudsonTestCase { /** * Tests that all dependencies are found even when some projects have restricted visibility. */ - @LocalData @Bug(5265) + @LocalData @Issue("JENKINS-5265") public void testItemReadPermission() throws Exception { // Rebuild dependency graph as anonymous user: jenkins.rebuildDependencyGraph(); @@ -129,7 +129,7 @@ public class DependencyGraphTest extends HudsonTestCase { } } - @Bug(17247) + @Issue("JENKINS-17247") public void testTopologicalSort() throws Exception { /* A-B---C-E diff --git a/test/src/test/java/hudson/model/DescriptorTest.java b/test/src/test/java/hudson/model/DescriptorTest.java index b8c0c5bc38..1c2ef01f81 100644 --- a/test/src/test/java/hudson/model/DescriptorTest.java +++ b/test/src/test/java/hudson/model/DescriptorTest.java @@ -29,14 +29,14 @@ import hudson.tasks.Shell; import static org.junit.Assert.*; import org.junit.Rule; import org.junit.Test; -import org.jvnet.hudson.test.Bug; +import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.JenkinsRule; public class DescriptorTest { public @Rule JenkinsRule rule = new JenkinsRule(); - @Bug(12307) + @Issue("JENKINS-12307") @Test public void getItemTypeDescriptorOrDie() throws Exception { Describable instance = new Shell("echo hello"); Descriptor descriptor = instance.getDescriptor(); diff --git a/test/src/test/java/hudson/model/DirectoryBrowserSupportTest.java b/test/src/test/java/hudson/model/DirectoryBrowserSupportTest.java index 2963d4d6df..fc07a335b0 100644 --- a/test/src/test/java/hudson/model/DirectoryBrowserSupportTest.java +++ b/test/src/test/java/hudson/model/DirectoryBrowserSupportTest.java @@ -42,7 +42,7 @@ import java.util.zip.ZipFile; import org.junit.Rule; import org.junit.Test; -import org.jvnet.hudson.test.Bug; +import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.Email; import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.SingleFileSCM; @@ -145,7 +145,7 @@ public class DirectoryBrowserSupportTest { assertFalse(text, text.contains("x.txt")); } - @Bug(19752) + @Issue("JENKINS-19752") @Test public void zipDownload() throws Exception { FreeStyleProject p = j.createFreeStyleProject(); diff --git a/test/src/test/java/hudson/model/DisplayNameTest.java b/test/src/test/java/hudson/model/DisplayNameTest.java index 38fd8a0610..60e7356788 100644 --- a/test/src/test/java/hudson/model/DisplayNameTest.java +++ b/test/src/test/java/hudson/model/DisplayNameTest.java @@ -28,7 +28,7 @@ import jenkins.model.Jenkins; import org.junit.Assert; import org.junit.Rule; import org.junit.Test; -import org.jvnet.hudson.test.Bug; +import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.MockFolder; @@ -93,7 +93,7 @@ public class DisplayNameTest { } - @Bug(18074) + @Issue("JENKINS-18074") @Test public void copyJobWithDisplayNameToDifferentFolder() throws Exception { MockFolder d1 = j.createFolder("d1"); FreeStyleProject job = d1.createProject(FreeStyleProject.class, "job"); diff --git a/test/src/test/java/hudson/model/DownloadServiceTest.java b/test/src/test/java/hudson/model/DownloadServiceTest.java index 0b01c00c9f..387e2ad4cb 100644 --- a/test/src/test/java/hudson/model/DownloadServiceTest.java +++ b/test/src/test/java/hudson/model/DownloadServiceTest.java @@ -6,7 +6,7 @@ import java.net.URL; import java.util.Set; import java.util.TreeSet; import net.sf.json.JSONObject; -import org.jvnet.hudson.test.Bug; +import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.HudsonTestCase; import org.jvnet.hudson.test.WithoutJenkins; import org.kohsuke.stapler.StaplerResponse; @@ -32,7 +32,7 @@ public class DownloadServiceTest extends HudsonTestCase { Downloadable.all().add(job); } - @Bug(5536) + @Issue("JENKINS-5536") public void testPost() throws Exception { // initially it should fail because the data doesn't have a signature assertNull(job.getData()); diff --git a/test/src/test/java/hudson/model/GetEnvironmentOutsideBuildTest.java b/test/src/test/java/hudson/model/GetEnvironmentOutsideBuildTest.java index 0ea986f094..be4dc2aa88 100644 --- a/test/src/test/java/hudson/model/GetEnvironmentOutsideBuildTest.java +++ b/test/src/test/java/hudson/model/GetEnvironmentOutsideBuildTest.java @@ -12,7 +12,7 @@ import hudson.util.StreamTaskListener; import jenkins.model.Jenkins; import org.junit.Assert; -import org.jvnet.hudson.test.Bug; +import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.ExtractResourceSCM; import org.jvnet.hudson.test.HudsonTestCase; @@ -21,7 +21,7 @@ import org.jvnet.hudson.test.HudsonTestCase; * * @author kutzi */ -@Bug(11592) +@Issue("JENKINS-11592") public class GetEnvironmentOutsideBuildTest extends HudsonTestCase { private int oldExecNum; diff --git a/test/src/test/java/hudson/model/ItemGroupMixInTest.java b/test/src/test/java/hudson/model/ItemGroupMixInTest.java index ddf14573db..cb8150b63c 100644 --- a/test/src/test/java/hudson/model/ItemGroupMixInTest.java +++ b/test/src/test/java/hudson/model/ItemGroupMixInTest.java @@ -28,7 +28,7 @@ import java.util.Collection; import static org.junit.Assert.*; import org.junit.Rule; import org.junit.Test; -import org.jvnet.hudson.test.Bug; +import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.MockFolder; import org.jvnet.hudson.test.recipes.LocalData; @@ -37,7 +37,7 @@ public class ItemGroupMixInTest { @Rule public JenkinsRule r = new JenkinsRule(); - @Bug(20951) + @Issue("JENKINS-20951") @LocalData @Test public void xmlFileReadCannotResolveClassException() throws Exception { MockFolder d = r.jenkins.getItemByFullName("d", MockFolder.class); diff --git a/test/src/test/java/hudson/model/JobTest.java b/test/src/test/java/hudson/model/JobTest.java index 2d3d7e7b90..b8176491f4 100644 --- a/test/src/test/java/hudson/model/JobTest.java +++ b/test/src/test/java/hudson/model/JobTest.java @@ -39,7 +39,7 @@ import jenkins.model.ProjectNamingStrategy; import static org.junit.Assert.*; import org.junit.Rule; import org.junit.Test; -import org.jvnet.hudson.test.Bug; +import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.FailureBuilder; import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.RunLoadCounter; @@ -219,7 +219,7 @@ public class JobTest { wc.goTo("logout"); } - @LocalData @Bug(6371) + @LocalData @Issue("JENKINS-6371") @Test public void getArtifactsUpTo() throws Exception { // There was a bug where intermediate directories were counted, // so too few artifacts were returned. @@ -230,7 +230,7 @@ public class JobTest { assertEquals(1, r.getArtifactsUpTo(1).size()); } - @Bug(10182) + @Issue("JENKINS-10182") @Test public void emptyDescriptionReturnsEmptyPage() throws Exception { // A NPE was thrown if a job had a null (empty) description. JenkinsRule.WebClient wc = j.createWebClient(); @@ -257,7 +257,7 @@ public class JobTest { j.createFreeStyleProject("project"); } - @Bug(16023) + @Issue("JENKINS-16023") @Test public void getLastFailedBuild() throws Exception { final FreeStyleProject p = j.createFreeStyleProject(); RunLoadCounter.prepare(p); @@ -277,7 +277,7 @@ public class JobTest { }).intValue()); } - @Bug(19764) + @Issue("JENKINS-19764") @Test public void testRenameWithCustomBuildsDirWithSubdir() throws Exception { j.jenkins.setRawBuildsDir("${JENKINS_HOME}/builds/${ITEM_FULL_NAME}/builds"); final FreeStyleProject p = j.createFreeStyleProject(); diff --git a/test/src/test/java/hudson/model/ListViewTest.java b/test/src/test/java/hudson/model/ListViewTest.java index a4d9a06049..c82df5b591 100644 --- a/test/src/test/java/hudson/model/ListViewTest.java +++ b/test/src/test/java/hudson/model/ListViewTest.java @@ -46,7 +46,7 @@ import static org.junit.Assert.*; import org.junit.Rule; import org.junit.Test; -import org.jvnet.hudson.test.Bug; +import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.JenkinsRule.WebClient; @@ -58,7 +58,7 @@ public class ListViewTest { @Rule public JenkinsRule j = new JenkinsRule(); - @Bug(15309) + @Issue("JENKINS-15309") @LocalData @Test public void nullJobNames() throws Exception { assertTrue(j.jenkins.getView("v").getItems().isEmpty()); @@ -108,7 +108,7 @@ public class ListViewTest { webClient.getPage(top, link.getHrefAttribute()); } - @Bug(20415) + @Issue("JENKINS-20415") @Test public void nonTopLevelItemGroup() throws Exception { MatrixProject mp = j.createMatrixProject(); mp.setAxes(new AxisList(new TextAxis("axis", "one", "two"))); @@ -121,7 +121,7 @@ public class ListViewTest { assertEquals(Collections.singletonList(mp), v.getItems()); } - @Bug(18680) + @Issue("JENKINS-18680") @Test public void renamesMovesAndDeletes() throws Exception { MockFolder top = j.createFolder("top"); MockFolder sub = top.createProject(MockFolder.class, "sub"); @@ -145,7 +145,7 @@ public class ListViewTest { assertEquals(new HashSet(Arrays.asList(p1, p2)), new HashSet(v.getItems())); } - @Bug(23893) + @Issue("JENKINS-23893") @Test public void renameJobContainedInTopLevelView() throws Exception { ListView view = new ListView("view", j.jenkins); j.jenkins.addView(view); @@ -180,7 +180,7 @@ public class ListViewTest { assertTrue(view.jobNamesContains(job)); } - @Bug(23893) + @Issue("JENKINS-23893") @Test public void deleteJobContainedInTopLevelView() throws Exception { ListView view = new ListView("view", j.jenkins); j.jenkins.addView(view); diff --git a/test/src/test/java/hudson/model/ProjectTest.java b/test/src/test/java/hudson/model/ProjectTest.java index f5db722bbf..3bb2095ef8 100644 --- a/test/src/test/java/hudson/model/ProjectTest.java +++ b/test/src/test/java/hudson/model/ProjectTest.java @@ -87,7 +87,7 @@ import java.util.concurrent.TimeUnit; import java.util.logging.Logger; import org.junit.Ignore; -import org.jvnet.hudson.test.Bug; +import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.Issue; /** @@ -764,7 +764,7 @@ public class ProjectTest { assertEquals(1, j.jenkins.getQueue().getItems().length); } - @Bug(22750) + @Issue("JENKINS-22750") @Test public void testMasterJobPutInQueue() throws Exception { FreeStyleProject proj = j.createFreeStyleProject("JENKINS-21394-yes-master-queue"); diff --git a/test/src/test/java/hudson/model/RunParameterDefinitionTest.java b/test/src/test/java/hudson/model/RunParameterDefinitionTest.java index 24c1feb966..dde065fcae 100644 --- a/test/src/test/java/hudson/model/RunParameterDefinitionTest.java +++ b/test/src/test/java/hudson/model/RunParameterDefinitionTest.java @@ -38,7 +38,7 @@ import java.util.logging.Logger; import org.junit.Rule; import org.junit.Test; -import org.jvnet.hudson.test.Bug; +import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.MockFolder; @@ -49,7 +49,7 @@ public class RunParameterDefinitionTest { @Rule public JenkinsRule j = new JenkinsRule(); - @Bug(16462) + @Issue("JENKINS-16462") @Test public void inFolders() throws Exception { MockFolder dir = j.createFolder("dir"); MockFolder subdir = dir.createProject(MockFolder.class, "sub dir"); diff --git a/test/src/test/java/hudson/model/RunTest.java b/test/src/test/java/hudson/model/RunTest.java index a54a0d3f86..0d872f8840 100644 --- a/test/src/test/java/hudson/model/RunTest.java +++ b/test/src/test/java/hudson/model/RunTest.java @@ -28,7 +28,7 @@ import java.util.Collection; import java.util.Collections; import org.junit.Rule; import org.junit.Test; -import org.jvnet.hudson.test.Bug; +import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.JenkinsRule; /** @@ -38,7 +38,7 @@ public class RunTest { @Rule public JenkinsRule j = new JenkinsRule(); - @Bug(17935) + @Issue("JENKINS-17935") @Test public void getDynamicInvisibleTransientAction() throws Exception { TransientBuildActionFactory.all().add(0, new TransientBuildActionFactory() { @Override public Collection createFor(Run target) { diff --git a/test/src/test/java/hudson/model/UserTest.java b/test/src/test/java/hudson/model/UserTest.java index 9509b8eb9e..588726f251 100644 --- a/test/src/test/java/hudson/model/UserTest.java +++ b/test/src/test/java/hudson/model/UserTest.java @@ -48,7 +48,7 @@ import static org.junit.Assert.*; import static org.junit.Assume.*; import org.junit.Rule; import org.junit.Test; -import org.jvnet.hudson.test.Bug; +import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.FakeChangeLogSCM; import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.JenkinsRule; @@ -102,7 +102,7 @@ public class UserTest { } } - @Bug(2331) + @Issue("JENKINS-2331") @Test public void userPropertySummaryAndActionAreShownInUserPage() throws Exception { UserProperty property = new UserPropertyImpl("NeedleInPage"); @@ -121,7 +121,7 @@ public class UserTest { /** * Asserts that the default user avatar can be fetched (ie no 404) */ - @Bug(7494) + @Issue("JENKINS-7494") @Test public void defaultUserAvatarCanBeFetched() throws Exception { User user = User.get("avatar-user", true); HtmlPage page = j.createWebClient().goTo("user/" + user.getDisplayName()); @@ -343,7 +343,7 @@ public class UserTest { assertNotNull("User should be saved with all changes.", user.getProperty(SomeUserProperty.class)); } - @Bug(16332) + @Issue("JENKINS-16332") @Test public void unrecoverableFullName() throws Throwable { User u = User.get("John Smith "); assertEquals("jsmith@nowhere.net", MailAddressResolver.resolve(u)); diff --git a/test/src/test/java/hudson/model/ViewJobTest.java b/test/src/test/java/hudson/model/ViewJobTest.java index e352c3cc5f..6432631ea7 100644 --- a/test/src/test/java/hudson/model/ViewJobTest.java +++ b/test/src/test/java/hudson/model/ViewJobTest.java @@ -30,7 +30,7 @@ import jenkins.model.Jenkins; import static org.junit.Assert.*; import org.junit.Rule; import org.junit.Test; -import org.jvnet.hudson.test.Bug; +import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.TestExtension; @@ -38,7 +38,7 @@ public class ViewJobTest { @Rule public JenkinsRule rule = new JenkinsRule(); - @Bug(19377) + @Issue("JENKINS-19377") @Test public void removeRun() throws Exception { J j = rule.jenkins.createProject(J.class, "j"); R r1 = j.nue(); diff --git a/test/src/test/java/hudson/model/ViewTest.java b/test/src/test/java/hudson/model/ViewTest.java index 0f2220982f..1b37513e6c 100644 --- a/test/src/test/java/hudson/model/ViewTest.java +++ b/test/src/test/java/hudson/model/ViewTest.java @@ -24,7 +24,7 @@ package hudson.model; import jenkins.model.Jenkins; -import org.jvnet.hudson.test.Bug; +import org.jvnet.hudson.test.Issue; import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException; import com.gargoylesoftware.htmlunit.HttpMethod; import com.gargoylesoftware.htmlunit.WebRequestSettings; @@ -67,7 +67,7 @@ public class ViewTest { @Rule public JenkinsRule j = new JenkinsRule(); - @Bug(7100) + @Issue("JENKINS-7100") @Test public void xHudsonHeader() throws Exception { assertNotNull(j.createWebClient().goTo("").getWebResponse().getResponseHeaderValue("X-Hudson")); } @@ -144,7 +144,7 @@ public class ViewTest { } - @Bug(9367) + @Issue("JENKINS-9367") @Test public void persistence() throws Exception { ListView view = listView("foo"); @@ -153,7 +153,7 @@ public class ViewTest { assertNotNull(v.getProperties()); } - @Bug(9367) + @Issue("JENKINS-9367") @Test public void allImagesCanBeLoaded() throws Exception { User.get("user", true); WebClient webClient = j.createWebClient(); @@ -161,7 +161,7 @@ public class ViewTest { j.assertAllImageLoadSuccessfully(webClient.goTo("asynchPeople")); } - @Bug(16608) + @Issue("JENKINS-16608") @Test public void notAllowedName() throws Exception { HtmlForm form = j.createWebClient().goTo("newView").getFormByName("createItem"); form.getInputByName("name").setValueAttribute(".."); @@ -176,7 +176,7 @@ public class ViewTest { } @Ignore("verified manually in Winstone but org.mortbay.JettyResponse.sendRedirect (6.1.26) seems to mangle the location") - @Bug(18373) + @Issue("JENKINS-18373") @Test public void unicodeName() throws Exception { HtmlForm form = j.createWebClient().goTo("newView").getFormByName("createItem"); String name = "I ♥ NY"; @@ -188,7 +188,7 @@ public class ViewTest { j.submit(j.createWebClient().getPage(view, "configure").getFormByName("viewConfig")); } - @Bug(17302) + @Issue("JENKINS-17302") @Test public void doConfigDotXml() throws Exception { ListView view = listView("v"); view.description = "one"; @@ -304,7 +304,7 @@ public class ViewTest { } @Test - @Bug(21474) + @Issue("JENKINS-21474") public void testGetComputersNPE() throws Exception { ListView view = listView("aView"); view.filterExecutors = true; diff --git a/test/src/test/java/hudson/model/WorkspaceCleanupThreadTest.java b/test/src/test/java/hudson/model/WorkspaceCleanupThreadTest.java index 1a5e509a6f..7eab9d8e42 100644 --- a/test/src/test/java/hudson/model/WorkspaceCleanupThreadTest.java +++ b/test/src/test/java/hudson/model/WorkspaceCleanupThreadTest.java @@ -40,7 +40,7 @@ import org.junit.Assume; import org.junit.BeforeClass; import org.junit.Rule; import org.junit.Test; -import org.jvnet.hudson.test.Bug; +import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.MockFolder; @@ -84,7 +84,7 @@ public class WorkspaceCleanupThreadTest { assertFalse(ws2.exists()); } - @Bug(21023) + @Issue("JENKINS-21023") @Test public void modernMasterWorkspaceLocation() throws Exception { FreeStyleProject p = r.createFreeStyleProject(); FreeStyleBuild b1 = r.assertBuildStatusSuccess(p.scheduleBuild2(0)); @@ -105,7 +105,7 @@ public class WorkspaceCleanupThreadTest { assertTrue(ws2.exists()); } - @Bug(21023) + @Issue("JENKINS-21023") @Test public void jobInFolder() throws Exception { MockFolder d = r.createFolder("d"); FreeStyleProject p1 = d.createProject(FreeStyleProject.class, "p"); diff --git a/test/src/test/java/hudson/search/SearchTest.java b/test/src/test/java/hudson/search/SearchTest.java index f524685b95..9687e68761 100644 --- a/test/src/test/java/hudson/search/SearchTest.java +++ b/test/src/test/java/hudson/search/SearchTest.java @@ -40,7 +40,7 @@ import net.sf.json.JSONSerializer; import org.junit.Assert; import org.junit.Rule; import org.junit.Test; -import org.jvnet.hudson.test.Bug; +import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.JenkinsRule.WebClient; import org.jvnet.hudson.test.MockFolder; @@ -72,7 +72,7 @@ public class SearchTest { /** * Makes sure the script doesn't execute. */ - @Bug(3415) + @Issue("JENKINS-3415") @Test public void testXSS() throws Exception { try { @@ -227,7 +227,7 @@ public class SearchTest { /** * Disable/enable status shouldn't affect the search */ - @Bug(13148) + @Issue("JENKINS-13148") @Test public void testDisabledJobShouldBeSearchable() throws Exception { FreeStyleProject p = j.createFreeStyleProject("foo-bar"); @@ -240,7 +240,7 @@ public class SearchTest { /** * All top-level jobs should be searchable, not just jobs in the current view. */ - @Bug(13148) + @Issue("JENKINS-13148") @Test public void testCompletionOutsideView() throws Exception { FreeStyleProject p = j.createFreeStyleProject("foo-bar"); diff --git a/test/src/test/java/hudson/security/csrf/DefaultCrumbIssuerTest.java b/test/src/test/java/hudson/security/csrf/DefaultCrumbIssuerTest.java index 2d877e9022..70583b6363 100644 --- a/test/src/test/java/hudson/security/csrf/DefaultCrumbIssuerTest.java +++ b/test/src/test/java/hudson/security/csrf/DefaultCrumbIssuerTest.java @@ -13,7 +13,7 @@ import static org.junit.Assert.*; import org.junit.Before; import org.junit.Rule; import org.junit.Test; -import org.jvnet.hudson.test.Bug; +import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.JenkinsRule.WebClient; import org.jvnet.hudson.test.recipes.PresetData; @@ -38,7 +38,7 @@ public class DefaultCrumbIssuerTest { }; private static final String HEADER_NAME = "X-Forwarded-For"; - @Bug(3854) + @Issue("JENKINS-3854") @Test public void clientIPFromHeader() throws Exception { WebClient wc = r.createWebClient(); @@ -47,7 +47,7 @@ public class DefaultCrumbIssuerTest { r.submit(p.getFormByName("config")); } - @Bug(3854) + @Issue("JENKINS-3854") @Test public void headerChange() throws Exception { WebClient wc = r.createWebClient(); @@ -64,7 +64,7 @@ public class DefaultCrumbIssuerTest { } } - @Bug(3854) + @Issue("JENKINS-3854") @Test public void proxyIPChanged() throws Exception { WebClient wc = r.createWebClient(); @@ -78,7 +78,7 @@ public class DefaultCrumbIssuerTest { r.submit(p.getFormByName("config")); } - @Bug(3854) + @Issue("JENKINS-3854") @Test public void proxyIPChain() throws Exception { WebClient wc = r.createWebClient(); @@ -87,7 +87,7 @@ public class DefaultCrumbIssuerTest { r.submit(p.getFormByName("config")); } - @Bug(7518) + @Issue("JENKINS-7518") @Test public void proxyCompatibilityMode() throws Exception { CrumbIssuer issuer = new DefaultCrumbIssuer(true); assertNotNull(issuer); diff --git a/test/src/test/java/hudson/tasks/ArtifactArchiverTest.java b/test/src/test/java/hudson/tasks/ArtifactArchiverTest.java index aca8671334..e13740051f 100644 --- a/test/src/test/java/hudson/tasks/ArtifactArchiverTest.java +++ b/test/src/test/java/hudson/tasks/ArtifactArchiverTest.java @@ -44,7 +44,7 @@ import static org.junit.Assume.*; import org.junit.Rule; import org.junit.Test; -import org.jvnet.hudson.test.Bug; +import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.TestBuilder; import org.jvnet.hudson.test.recipes.LocalData; @@ -54,7 +54,7 @@ public class ArtifactArchiverTest { @Rule public JenkinsRule j = new JenkinsRule(); @Test - @Bug(3227) + @Issue("JENKINS-3227") public void testEmptyDirectories() throws Exception { FreeStyleProject project = j.createFreeStyleProject(); Publisher artifactArchiver = new ArtifactArchiver("dir/"); @@ -83,7 +83,7 @@ public class ArtifactArchiverTest { } @Test - @Bug(10502) + @Issue("JENKINS-10502") public void testAllowEmptyArchive() throws Exception { FreeStyleProject project = j.createFreeStyleProject(); ArtifactArchiver aa = new ArtifactArchiver("f"); @@ -93,7 +93,7 @@ public class ArtifactArchiverTest { assertFalse(project.getBuildByNumber(1).getHasArtifacts()); } - @Bug(21958) + @Issue("JENKINS-21958") @Test public void symlinks() throws Exception { FreeStyleProject p = j.createFreeStyleProject(); p.getBuildersList().add(new TestBuilder() { @@ -153,7 +153,7 @@ public class ArtifactArchiverTest { } @Test - @Bug(22698) + @Issue("JENKINS-22698") public void testArchivingSkippedWhenOnlyIfSuccessfulChecked() throws Exception { FreeStyleProject project = j.createFreeStyleProject(); ArtifactArchiver aa = new ArtifactArchiver("f"); @@ -187,7 +187,7 @@ public class ArtifactArchiverTest { } @Test - @Bug(20086) + @Issue("JENKINS-20086") public void testDefaultExcludesOn() throws Exception { FreeStyleProject project = j.createFreeStyleProject(); @@ -203,7 +203,7 @@ public class ArtifactArchiverTest { } @Test - @Bug(20086) + @Issue("JENKINS-20086") public void testDefaultExcludesOff() throws Exception { FreeStyleProject project = j.createFreeStyleProject(); diff --git a/test/src/test/java/hudson/tasks/FingerprinterTest.java b/test/src/test/java/hudson/tasks/FingerprinterTest.java index b270c1ca4e..c1ac17d21c 100644 --- a/test/src/test/java/hudson/tasks/FingerprinterTest.java +++ b/test/src/test/java/hudson/tasks/FingerprinterTest.java @@ -51,7 +51,7 @@ import org.hamcrest.Matchers; import org.junit.BeforeClass; import org.junit.Rule; import org.junit.Test; -import org.jvnet.hudson.test.Bug; +import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.RandomlyFails; @@ -292,7 +292,7 @@ public class FingerprinterTest { } } - @Bug(17125) + @Issue("JENKINS-17125") @LocalData @Test public void actionSerialization() throws Exception { FreeStyleProject job = j.jenkins.getItemByFullName("j", FreeStyleProject.class); @@ -316,7 +316,7 @@ public class FingerprinterTest { @SuppressWarnings("unchecked") @RandomlyFails("for p3.upstreamProjects expected:<[hudson.model.FreeStyleProject@590e5b8[test0]]> but was:<[]>") - @Bug(18417) + @Issue("JENKINS-18417") @Test public void fingerprintCleanup() throws Exception { // file names shouldn't matter diff --git a/test/src/test/java/hudson/tasks/MavenTest.java b/test/src/test/java/hudson/tasks/MavenTest.java index 294d0b7933..72cb2b973a 100644 --- a/test/src/test/java/hudson/tasks/MavenTest.java +++ b/test/src/test/java/hudson/tasks/MavenTest.java @@ -55,7 +55,7 @@ import com.gargoylesoftware.htmlunit.html.HtmlButton; import hudson.EnvVars; import hudson.model.FreeStyleBuild; import hudson.model.PasswordParameterDefinition; -import org.jvnet.hudson.test.Bug; +import org.jvnet.hudson.test.Issue; import static org.junit.Assert.*; import org.junit.Rule; import org.junit.Test; @@ -261,7 +261,7 @@ public class MavenTest { } } - @Bug(18898) + @Issue("JENKINS-18898") public void testNullHome() throws Exception { EnvVars env = new EnvVars(); new MavenInstallation("_", "", Collections.>emptyList()).buildEnvVars(env); diff --git a/test/src/test/java/hudson/triggers/TriggerStartTest.java b/test/src/test/java/hudson/triggers/TriggerStartTest.java index d5206eb20a..5946d8c799 100644 --- a/test/src/test/java/hudson/triggers/TriggerStartTest.java +++ b/test/src/test/java/hudson/triggers/TriggerStartTest.java @@ -38,12 +38,12 @@ import javax.xml.transform.stream.StreamSource; import static org.junit.Assert.*; import org.junit.Rule; import org.junit.Test; -import org.jvnet.hudson.test.Bug; +import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.TestExtension; import org.kohsuke.stapler.DataBoundConstructor; -@Bug(14759) +@Issue("JENKINS-14759") public class TriggerStartTest { @Rule public JenkinsRule j = new JenkinsRule(); diff --git a/test/src/test/java/hudson/util/RingBufferLogHandlerTest.java b/test/src/test/java/hudson/util/RingBufferLogHandlerTest.java index 8b9f56d9de..7c01e12672 100644 --- a/test/src/test/java/hudson/util/RingBufferLogHandlerTest.java +++ b/test/src/test/java/hudson/util/RingBufferLogHandlerTest.java @@ -24,12 +24,12 @@ package hudson.util; import org.junit.Test; -import org.jvnet.hudson.test.Bug; +import org.jvnet.hudson.test.Issue; public class RingBufferLogHandlerTest { @Test - @Bug(9120) + @Issue("JENKINS-9120") public void tooMuchRecordsShouldNotCrashHandler() { final RingBufferLogHandler handler = new RingBufferLogHandler(); diff --git a/test/src/test/java/hudson/util/RobustReflectionConverterTest.java b/test/src/test/java/hudson/util/RobustReflectionConverterTest.java index 009c40a4c4..edcf7d003b 100644 --- a/test/src/test/java/hudson/util/RobustReflectionConverterTest.java +++ b/test/src/test/java/hudson/util/RobustReflectionConverterTest.java @@ -32,7 +32,7 @@ import java.util.Map; import static org.junit.Assert.*; import org.junit.Rule; import org.junit.Test; -import org.jvnet.hudson.test.Bug; +import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.recipes.LocalData; @@ -40,7 +40,7 @@ public class RobustReflectionConverterTest { @Rule public JenkinsRule r = new JenkinsRule(); - @Bug(21024) + @Issue("JENKINS-21024") @LocalData @Test public void randomExceptionsReported() throws Exception { FreeStyleProject p = r.jenkins.getItemByFullName("j", FreeStyleProject.class); diff --git a/test/src/test/java/jenkins/model/ContextMenuTest.java b/test/src/test/java/jenkins/model/ContextMenuTest.java index 2efd6e91f3..18d113c417 100644 --- a/test/src/test/java/jenkins/model/ContextMenuTest.java +++ b/test/src/test/java/jenkins/model/ContextMenuTest.java @@ -37,7 +37,7 @@ import static jenkins.model.ModelObjectWithContextMenu.*; import static org.junit.Assert.assertEquals; import org.junit.Rule; import org.junit.Test; -import org.jvnet.hudson.test.Bug; +import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.For; import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.TestExtension; @@ -48,7 +48,7 @@ public class ContextMenuTest { @Rule public JenkinsRule j = new JenkinsRule(); - @Bug(19173) + @Issue("JENKINS-19173") @Test public void contextMenuVisibility() throws Exception { final FreeStyleProject p = j.createFreeStyleProject("p"); Callable doContextMenu = new Callable() { diff --git a/test/src/test/java/jenkins/model/JenkinsTest.java b/test/src/test/java/jenkins/model/JenkinsTest.java index 885b0a6413..0ce3a66196 100644 --- a/test/src/test/java/jenkins/model/JenkinsTest.java +++ b/test/src/test/java/jenkins/model/JenkinsTest.java @@ -49,7 +49,7 @@ import hudson.util.FormValidation; import org.junit.Assert; import org.junit.Test; -import org.jvnet.hudson.test.Bug; +import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.ExtractResourceSCM; import org.jvnet.hudson.test.HudsonTestCase; import org.jvnet.hudson.test.TestExtension; @@ -220,7 +220,7 @@ public class JenkinsTest extends HudsonTestCase implements UnprotectedRootAction } } - @Bug(12251) + @Issue("JENKINS-12251") public void testItemFullNameExpansion() throws Exception { HtmlForm f = createWebClient().goTo("/configure").getFormByName("config"); f.getInputByName("_.rawBuildsDir").setValueAttribute("${JENKINS_HOME}/test12251_builds/${ITEM_FULL_NAME}"); @@ -240,7 +240,7 @@ public class JenkinsTest extends HudsonTestCase implements UnprotectedRootAction /** * Makes sure access to "/foobar" for UnprotectedRootAction gets through. */ - @Bug(14113) + @Issue("JENKINS-14113") public void testUnprotectedRootAction() throws Exception { jenkins.setSecurityRealm(createDummySecurityRealm()); jenkins.setAuthorizationStrategy(new FullControlOnceLoggedInAuthorizationStrategy()); @@ -364,7 +364,7 @@ public class JenkinsTest extends HudsonTestCase implements UnprotectedRootAction } } - @Bug(20866) + @Issue("JENKINS-20866") public void testErrorPageShouldBeAnonymousAccessible() throws Exception { HudsonPrivateSecurityRealm s = new HudsonPrivateSecurityRealm(false, false, null); User alice = s.createAccount("alice", "alice"); @@ -388,7 +388,7 @@ public class JenkinsTest extends HudsonTestCase implements UnprotectedRootAction return new Failure("My car is black"); } - @Bug(23551) + @Issue("JENKINS-23551") public void testComputerListenerNotifiedOnRestart() { // Simulate restart calling listeners for (RestartListener listener : RestartListener.all()) diff --git a/test/src/test/java/jenkins/model/lazy/LazyBuildMixInTest.java b/test/src/test/java/jenkins/model/lazy/LazyBuildMixInTest.java index ce6dee7b36..f63f22d7d6 100644 --- a/test/src/test/java/jenkins/model/lazy/LazyBuildMixInTest.java +++ b/test/src/test/java/jenkins/model/lazy/LazyBuildMixInTest.java @@ -30,7 +30,7 @@ import hudson.model.listeners.RunListener; import static org.junit.Assert.*; import org.junit.Rule; import org.junit.Test; -import org.jvnet.hudson.test.Bug; +import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.SleepBuilder; @@ -39,7 +39,7 @@ public class LazyBuildMixInTest { @Rule public JenkinsRule r = new JenkinsRule(); - @Bug(22395) + @Issue("JENKINS-22395") @Test public void dropLinksAfterGC() throws Exception { RunListener.all().clear(); // see commit message for the discussion @@ -83,7 +83,7 @@ public class LazyBuildMixInTest { assertEquals(b3, b1a.getNextBuild()); } - @Bug(20662) + @Issue("JENKINS-20662") @Test public void newRunningBuildRelationFromPrevious() throws Exception { FreeStyleProject p = r.createFreeStyleProject(); p.getBuildersList().add(new SleepBuilder(1000)); diff --git a/test/src/test/java/lib/form/ComboBoxTest.java b/test/src/test/java/lib/form/ComboBoxTest.java index 08dac5c165..f038d59dba 100644 --- a/test/src/test/java/lib/form/ComboBoxTest.java +++ b/test/src/test/java/lib/form/ComboBoxTest.java @@ -33,7 +33,7 @@ import hudson.tasks.BuildStepMonitor; import hudson.tasks.Publisher; import hudson.util.ComboBoxModel; -import org.jvnet.hudson.test.Bug; +import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.HudsonTestCase; import org.jvnet.hudson.test.HudsonTestCase.WebClient; import org.kohsuke.stapler.DataBoundConstructor; @@ -45,7 +45,7 @@ import org.kohsuke.stapler.QueryParameter; public class ComboBoxTest extends HudsonTestCase { /** - * Used in testCompoundFieldDependentCombobox for Bug(16719) + * Used in testCompoundFieldDependentCombobox for Issue("JENKINS-16719") */ public static class CompoundFieldComboBoxBuilder extends Publisher { private CompoundField compoundField; @@ -88,7 +88,7 @@ public class ComboBoxTest extends HudsonTestCase { } /** - * Used in testCompoundFieldDependentCombobox for Bug(16719) + * Used in testCompoundFieldDependentCombobox for Issue("JENKINS-16719") */ public static class CompoundField extends AbstractDescribableImpl { private final String abc; @@ -117,7 +117,7 @@ public class ComboBoxTest extends HudsonTestCase { /** * Confirms that relative paths work when prefilling a combobox text field */ - @Bug(16719) + @Issue("JENKINS-16719") public void testCompoundFieldDependentComboBox() throws Exception { Descriptor d1 = new CompoundFieldComboBoxBuilder.DescriptorImpl(); Publisher.all().add(d1); diff --git a/test/src/test/java/lib/form/ExpandableTextboxTest.java b/test/src/test/java/lib/form/ExpandableTextboxTest.java index cbccb48a1c..b930652d15 100644 --- a/test/src/test/java/lib/form/ExpandableTextboxTest.java +++ b/test/src/test/java/lib/form/ExpandableTextboxTest.java @@ -27,7 +27,7 @@ import static com.gargoylesoftware.htmlunit.HttpMethod.POST; import com.gargoylesoftware.htmlunit.Page; import com.gargoylesoftware.htmlunit.WebRequestSettings; import com.gargoylesoftware.htmlunit.html.HtmlPage; -import org.jvnet.hudson.test.Bug; +import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.HudsonTestCase; import org.w3c.dom.NodeList; @@ -35,7 +35,7 @@ import org.w3c.dom.NodeList; * @author Kohsuke Kawaguchi */ public class ExpandableTextboxTest extends HudsonTestCase { - @Bug(2816) + @Issue("JENKINS-2816") public void testMultiline() throws Exception { // because attribute values are normalized, it's not very easy to encode multi-line string as @value. So let's use the system message here. jenkins.setSystemMessage("foo\nbar\nzot"); diff --git a/test/src/test/java/lib/layout/LayoutTest.java b/test/src/test/java/lib/layout/LayoutTest.java index a632b18cce..8590ff4aed 100644 --- a/test/src/test/java/lib/layout/LayoutTest.java +++ b/test/src/test/java/lib/layout/LayoutTest.java @@ -28,7 +28,7 @@ import com.gargoylesoftware.htmlunit.html.HtmlElement; import com.gargoylesoftware.htmlunit.html.HtmlLink; import org.junit.Rule; import org.junit.Test; -import org.jvnet.hudson.test.Bug; +import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.recipes.PresetData; @@ -36,7 +36,7 @@ public class LayoutTest { @Rule public JenkinsRule r = new JenkinsRule(); - @Bug(21254) + @Issue("JENKINS-21254") @PresetData(PresetData.DataSet.NO_ANONYMOUS_READACCESS) @Test public void rejectedLinks() throws Exception { JenkinsRule.WebClient wc = r.createWebClient(); diff --git a/test/src/test/java/org/jvnet/hudson/test/HudsonTestCaseShutdownSlaveTest.java b/test/src/test/java/org/jvnet/hudson/test/HudsonTestCaseShutdownSlaveTest.java index e180797f29..2afbb60fbe 100644 --- a/test/src/test/java/org/jvnet/hudson/test/HudsonTestCaseShutdownSlaveTest.java +++ b/test/src/test/java/org/jvnet/hudson/test/HudsonTestCaseShutdownSlaveTest.java @@ -40,7 +40,7 @@ import hudson.slaves.SlaveComputer; * When using JenkinsRule, the exception is squashed in after(), * and does not cause failures. */ -@Bug(18259) +@Issue("JENKINS-18259") public class HudsonTestCaseShutdownSlaveTest extends HudsonTestCase { public void testShutdownSlave() throws Exception { DumbSlave slave1 = createOnlineSlave(); // online, and a build finished. diff --git a/test/src/test/java/scripts/BehaviorTest.java b/test/src/test/java/scripts/BehaviorTest.java index 2d92747272..de5949257e 100644 --- a/test/src/test/java/scripts/BehaviorTest.java +++ b/test/src/test/java/scripts/BehaviorTest.java @@ -25,7 +25,7 @@ package scripts; import com.gargoylesoftware.htmlunit.ScriptResult; import com.gargoylesoftware.htmlunit.html.HtmlPage; -import org.jvnet.hudson.test.Bug; +import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.HudsonTestCase; /** @@ -54,7 +54,7 @@ public class BehaviorTest extends HudsonTestCase { return ((Double)r.getJavaScriptResult()).intValue(); } - @Bug(14495) + @Issue("JENKINS-14495") public void testDuplicateRegistrations() throws Exception { HtmlPage p = createWebClient().goTo("self/testDuplicateRegistrations"); ScriptResult r = p.executeJavaScript("document.getElementsBySelector('DIV.a')[0].innerHTML"); From 8f24c4aa5ccd944c4647e9f99077cad46cb24a2d Mon Sep 17 00:00:00 2001 From: christ66 Date: Wed, 7 Jan 2015 10:14:26 -0800 Subject: [PATCH 124/701] Obtain folder from jenkins instead of using local variable. --- test/src/test/java/hudson/model/ItemGroupMixInTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/src/test/java/hudson/model/ItemGroupMixInTest.java b/test/src/test/java/hudson/model/ItemGroupMixInTest.java index d807ee35d5..75478aca1d 100644 --- a/test/src/test/java/hudson/model/ItemGroupMixInTest.java +++ b/test/src/test/java/hudson/model/ItemGroupMixInTest.java @@ -86,7 +86,7 @@ public class ItemGroupMixInTest { r.jenkins.reload(); // Folder - assertNotNull("Folder failed to load.", folder); + assertNotNull("Folder failed to load.", r.jenkins.getItemByFullName("folder")); assertNull("Job should have failed to load.", r.jenkins.getItemByFullName("folder/job1")); assertNotNull("Other job in folder should have loaded.", r.jenkins.getItemByFullName("folder/job2")); assertNotNull("Other job in folder should have loaded.", r.jenkins.getItemByFullName("folder/job3")); From fa40c102f5dbd8b02470317d730a3778c9153b64 Mon Sep 17 00:00:00 2001 From: christ66 Date: Wed, 7 Jan 2015 10:16:08 -0800 Subject: [PATCH 125/701] Mark test extension with the correct annotation --- test/src/test/java/hudson/model/ItemGroupMixInTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/src/test/java/hudson/model/ItemGroupMixInTest.java b/test/src/test/java/hudson/model/ItemGroupMixInTest.java index 75478aca1d..27c2bd18f7 100644 --- a/test/src/test/java/hudson/model/ItemGroupMixInTest.java +++ b/test/src/test/java/hudson/model/ItemGroupMixInTest.java @@ -36,6 +36,7 @@ import org.jvnet.hudson.test.Bug; import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.MockFolder; +import org.jvnet.hudson.test.TestExtension; import org.jvnet.hudson.test.recipes.LocalData; import java.io.File; @@ -107,7 +108,7 @@ public class ItemGroupMixInTest { assertEquals("valid", items.iterator().next().getName()); } - @Extension + @TestExtension public static class MockBuilderThrowsError extends BuildWrapper { @Override public Collection getProjectActions(AbstractProject project){ From c3eb1cac794e2cf8efcb26695e8eb27ed80ece5c Mon Sep 17 00:00:00 2001 From: christ66 Date: Wed, 7 Jan 2015 15:17:58 -0800 Subject: [PATCH 126/701] If a project action fails to load we should log the project action and continue to load the project. --- .../java/hudson/model/AbstractProject.java | 9 +- .../main/java/hudson/model/Actionable.java | 11 ++- core/src/main/java/hudson/model/Project.java | 41 +++++++-- .../java/hudson/model/ItemGroupMixInTest.java | 83 ++++++++++++++++-- .../xmlFileReadExceptionOnLoad.zip | Bin 1545 -> 2854 bytes 5 files changed, 128 insertions(+), 16 deletions(-) diff --git a/core/src/main/java/hudson/model/AbstractProject.java b/core/src/main/java/hudson/model/AbstractProject.java index 4da0cc2ef6..abea5887b7 100644 --- a/core/src/main/java/hudson/model/AbstractProject.java +++ b/core/src/main/java/hudson/model/AbstractProject.java @@ -751,8 +751,13 @@ public abstract class AbstractProject

                ,R extends A for (JobProperty p : Util.fixNull(properties)) ta.addAll(p.getJobActions((P)this)); - for (TransientProjectActionFactory tpaf : TransientProjectActionFactory.all()) - ta.addAll(Util.fixNull(tpaf.createFor(this))); // be defensive against null + for (TransientProjectActionFactory tpaf : TransientProjectActionFactory.all()) { + try { + ta.addAll(Util.fixNull(tpaf.createFor(this))); // be defensive against null + } catch (Exception e) { + LOGGER.log(Level.SEVERE, "Error loading transient project action factory."); + } + } return ta; } diff --git a/core/src/main/java/hudson/model/Actionable.java b/core/src/main/java/hudson/model/Actionable.java index ba19d39257..ca1332aa0f 100644 --- a/core/src/main/java/hudson/model/Actionable.java +++ b/core/src/main/java/hudson/model/Actionable.java @@ -30,6 +30,9 @@ import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; +import java.util.logging.Level; +import java.util.logging.Logger; + import jenkins.model.ModelObjectWithContextMenu; import jenkins.model.TransientActionFactory; import org.kohsuke.stapler.StaplerRequest; @@ -91,7 +94,11 @@ public abstract class Actionable extends AbstractModelObject implements ModelObj List _actions = new ArrayList(getActions()); for (TransientActionFactory taf : ExtensionList.lookup(TransientActionFactory.class)) { if (taf.type().isInstance(this)) { - _actions.addAll(createFor(taf)); + try { + _actions.addAll(createFor(taf)); + } catch (Exception e) { + LOGGER.log(Level.SEVERE, "Error loading action.", e); + } } } return Collections.unmodifiableList(_actions); @@ -177,4 +184,6 @@ public abstract class Actionable extends AbstractModelObject implements ModelObj @Override public ContextMenu doContextMenu(StaplerRequest request, StaplerResponse response) throws Exception { return new ContextMenu().from(this,request,response); } + + private static final Logger LOGGER = Logger.getLogger(Actionable.class.getName()); } diff --git a/core/src/main/java/hudson/model/Project.java b/core/src/main/java/hudson/model/Project.java index 701ed893f7..894bb612d7 100644 --- a/core/src/main/java/hudson/model/Project.java +++ b/core/src/main/java/hudson/model/Project.java @@ -52,6 +52,9 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.atomic.AtomicReferenceFieldUpdater; +import java.util.logging.Level; +import java.util.logging.Logger; + import jenkins.triggers.SCMTriggerItem; /** @@ -234,15 +237,37 @@ public abstract class Project

                ,B extends Build> protected List createTransientActions() { List r = super.createTransientActions(); - for (BuildStep step : getBuildersList()) - r.addAll(step.getProjectActions(this)); - for (BuildStep step : getPublishersList()) - r.addAll(step.getProjectActions(this)); - for (BuildWrapper step : getBuildWrappers().values()) - r.addAll(step.getProjectActions(this)); - for (Trigger trigger : triggers()) - r.addAll(trigger.getProjectActions()); + for (BuildStep step : getBuildersList()) { + try { + r.addAll(step.getProjectActions(this)); + } catch (Exception e) { + LOGGER.log(Level.SEVERE, "Error loading build step.", e); + } + } + for (BuildStep step : getPublishersList()) { + try { + r.addAll(step.getProjectActions(this)); + } catch (Exception e) { + LOGGER.log(Level.SEVERE, "Error loading publisher.", e); + } + } + for (BuildWrapper step : getBuildWrappers().values()) { + try { + r.addAll(step.getProjectActions(this)); + } catch (Exception e) { + LOGGER.log(Level.SEVERE, "Error loading build wrapper.", e); + } + } + for (Trigger trigger : triggers()) { + try { + r.addAll(trigger.getProjectActions()); + } catch (Exception e) { + LOGGER.log(Level.SEVERE, "Error loading trigger.", e); + } + } return r; } + + private static final Logger LOGGER = Logger.getLogger(Project.class.getName()); } diff --git a/test/src/test/java/hudson/model/ItemGroupMixInTest.java b/test/src/test/java/hudson/model/ItemGroupMixInTest.java index b5514329d2..2a95dbe7a5 100644 --- a/test/src/test/java/hudson/model/ItemGroupMixInTest.java +++ b/test/src/test/java/hudson/model/ItemGroupMixInTest.java @@ -24,11 +24,15 @@ package hudson.model; -import java.util.Collection; -import static org.junit.Assert.*; import hudson.Extension; +import hudson.tasks.BuildStepDescriptor; +import hudson.tasks.BuildStepMonitor; +import hudson.tasks.BuildTrigger; import hudson.tasks.BuildWrapper; import hudson.tasks.BuildWrapperDescriptor; +import hudson.tasks.Builder; +import hudson.tasks.Publisher; +import hudson.triggers.Trigger; import org.apache.commons.io.FileUtils; import org.junit.Rule; import org.junit.Test; @@ -39,8 +43,14 @@ import org.jvnet.hudson.test.TestExtension; import org.jvnet.hudson.test.recipes.LocalData; import java.io.File; +import java.util.Collection; +import java.util.Iterator; import java.util.List; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; + public class ItemGroupMixInTest { @Rule public JenkinsRule r = new JenkinsRule(); @@ -103,12 +113,17 @@ public class ItemGroupMixInTest { MockFolder d = r.jenkins.getItemByFullName("d", MockFolder.class); assertNotNull(d); Collection items = d.getItems(); - assertEquals(1, items.size()); - assertEquals("valid", items.iterator().next().getName()); + assertEquals(5, items.size()); + Iterator iterator = items.iterator(); + assertEquals("badBuildStep", iterator.next().getName()); + assertEquals("badBuildTrigger", iterator.next().getName()); + assertEquals("badBuildWrapper", iterator.next().getName()); + assertEquals("badPublisher", iterator.next().getName()); + assertEquals("valid", iterator.next().getName()); } @TestExtension - public static class MockBuilderThrowsError extends BuildWrapper { + public static class MockBuildWrapperThrowsError extends BuildWrapper { @Override public Collection getProjectActions(AbstractProject project){ throw new NullPointerException(); @@ -127,4 +142,62 @@ public class ItemGroupMixInTest { } } } + + @TestExtension + public static class MockBuilderThrowsError extends Builder { + @Override + public Collection getProjectActions(AbstractProject project){ + throw new NullPointerException(); + } + @Extension public static final Descriptor DESCRIPTOR = new DescriptorImpl(); + + public static class DescriptorImpl extends BuildStepDescriptor { + @Override + public boolean isApplicable(Class jobType) { + return false; + } + + @Override + public String getDisplayName() { + return null; + } + } + } + + @TestExtension + public static class MockBuildTriggerThrowsError extends Trigger { + @Override + public Collection getProjectActions() { + throw new NullPointerException(); + } + + @Extension public static final Descriptor DESCRIPTOR = new BuildTrigger.DescriptorImpl(); + } + + @TestExtension + public static class MockPublisherThrowsError extends Publisher { + @Override + public Collection getProjectActions(AbstractProject project) { + throw new NullPointerException(); + } + + @Override + public BuildStepMonitor getRequiredMonitorService() { + return null; + } + + @Extension public static final Descriptor DESCRIPTOR = new DescriptorImpl(); + + public static class DescriptorImpl extends BuildStepDescriptor { + @Override + public boolean isApplicable(Class jobType) { + return false; + } + + @Override + public String getDisplayName() { + return null; + } + } + } } diff --git a/test/src/test/resources/hudson/model/ItemGroupMixInTest/xmlFileReadExceptionOnLoad.zip b/test/src/test/resources/hudson/model/ItemGroupMixInTest/xmlFileReadExceptionOnLoad.zip index 70b2d12f980864ecc812c3c6b8c589a91d57d6d9..21a4e02c26b6940478b20acf97d8e4b64bb0399c 100644 GIT binary patch literal 2854 zcmWIWW@Zs#W&i@I9CbGk4Fjw|Mpk}Ov3>wfCG0RIDPTohU~@{VyPTiOW-zM&B|%sa zp(r^&FD)}&uOc_cCch|MFRLsswL~wYG^IE{Pp>4kxJ1u4KRMeiKPM%%NZ*bNVJ}}X zs?&H7Mxwc}HXl``B$~>k#1yB}%$$_qlGFmY$2b^3+O*UzJ>_I%U{GLUU{J=V4dIK{ zz>P)C20V8^i^hm8bJ$&~@MN9u?b8nJ(_)Uz+ZbAqoHIXVR!yDZ4d*_^+4nDBo;)w~ z&APo_{}?=__WH_iZZ}~(+dE;`-DSsr<$j*>?o?>v#Xn5tPqjR|j2rGYv+BAnWznji zp``JN)xN8CF>8tP8FimM{yUOfZkL*K7+Fcre3KmT>h;p7^HS%&EKjWc(tBZgi^??( zfsJAxLvp4(eE!@~tMHY>`?Ic-ofGyhuUT-TBz(Jx^)2hLz^x`l8n?wJIGHW}*}!qj zchQSt?{1a_UgCitEiZavFfzb@p$-w~9DLyG>FE=m_RDp4z zMnETWG}!tdHW0bS!yg9?a-g8oXrR!(rJ5Recy!si+xW%@7 z@Zy|OZ|pi@UHTsJ?{3^LY-0FlR7e*d?bwuhnbXMXqtB;nnqPm0=(zKy|2n+E>9b%j*}v)lyygaYy^S8S~bgGKFj^zOZl6%N)h?*0D@G*M~k_|4l9? zwfULL`3|<@d%miE*z~sH%&o$u;w|?7nPI`nz>tfUopD7(cu`_O0ZK%GbZRml;e7^- zfPcWqz!ecNoyZYk9dy`0VC_jwqn8`?6@nZj)LJzae7xMIiAB5Yzd2P+M&7eRI@o3E zz3};>f``plY`K4@liR_@fo1(cZRRciCrxwslD)4YTZd^`(=RU1oohEudXZ?J?t8Gj z^<~`Vt?&I0uZx`WCEw9XFEv6W*P~C&#Jgv;*{ub7{Wl|O=N*(kbT!y%!n(j?{&RLd z{eAzdV7}?b?7NdM_y{ZfwbibeDtK^t+QVt4dv8utJ+|w4%9+KcCdN6pBvX4@SN@w8 zQFob@cbm0ZfxbkM%$f5S=Qmt>{&&NjX^WRj9-cZ+konu`m48=7eX;oxj|k(5MFdNm zfYPL#%;F4`00wE3S@hmi5*WC(*h?FPHbm$y4ch1j4BflGMFXe%_$DM51aoq&aF$dE zb$@cpJ^9s*Yjd4{|2$H7#-WXG?wjxL_Nw2Xd-K($S8v!SOffzEXWx#~#s-JHQu|KV zgzwjp`xI)L%=gxuBmV5Bp1BNnq+}#+YKsPZJ!;CRtzM(g=f?h`I)ZP8%WTfGozp%q zo1Ef%(fDZe@~_7)m&utn%`QKEd&=wt4NuoU3mlh49diD-V6BC1nb+xB=Cs`NZ8l8# z%%W0W%U18oym2nJ(`!}c1ou)KrXU7encaD7Sz>c+wye*v-X1!=cV*+B=Sj1LUT3V4 z-jZJBwnakukcezY*VKm+$)}@>BWKDng_&g4?-)>OdGhlR(rXqQIu0C_gJT zxddE0F*4aRU46I(TkuyZy-JBDkqRjUY{N6~bmRkAQoW3Of*#(>=a2cI$6eT1#HLAc8e zn75z-0;XW@LexD7r(vso5Ke0#U=nuMVJm_Wt~(EGEn#yVtXM_F90#~CM=z2QuH$6E zZxVLbVJo~4t}_NU|Il2AD3g$#hOIC|I4ujGG1%ROEe|8yb%YJoU9cRD$RybEG{Qk& Yu5T-Pv znIeK_N@iYJVooMB2-<)q;Rr(!V1RNkgv?ZPvt7OH$TOh#e=;&K$N_1vV^Z|N6wEY4 zc(evu2OTyLSbI{_=;cOzg&+qBwN_09A1}9QV$m-9Z%$Q{k@q}l<|i0h6<-_X!n1$D zrLwOIehh`|f_vE3^IZ7m9>sJ~|L3E%8#!ihz0y{BdhL|gqUC4jn6lm%T~>YmTHQXL z*=d27>RDdyn35Q{MbR?qf{x+3TN%w(w&}@V3)%K_r~7j{?sAi~FMKxd{kGTI_p+0& zZ&F`4Q_W$QjdsOU!Gp`w9!^u;8#P_^*skX(XBL~980Xv)Ozml1`ES~ef6KU~a<=s&jGp!iit@8klS{x!jFCx>8CRZ?09phB0t|m0 zK{Pb2u|jefnyCTa2%|9b7qU_IFrz?84QLpa?163=YF>jF2267dTN)b>h9Uc&u(6nV z3fYbC5ym2X4a#A7e2tmEkWDlNx))pi00#jmw_!2ao*8#u13C~06dJZPHsdfE5gy3F ziJ2;qUAdGA)s?U`3JgyyDGA+N)D(&wO&_tEi*O-06tLRB$_DZ$2M{g Date: Thu, 8 Jan 2015 15:39:58 +0100 Subject: [PATCH 127/701] [JENKINS-26331] use buildDirectory system property to configure target directory --- test/src/main/java/org/jvnet/hudson/test/WarExploder.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/src/main/java/org/jvnet/hudson/test/WarExploder.java b/test/src/main/java/org/jvnet/hudson/test/WarExploder.java index 304a21ea65..5e0a11d1d5 100644 --- a/test/src/main/java/org/jvnet/hudson/test/WarExploder.java +++ b/test/src/main/java/org/jvnet/hudson/test/WarExploder.java @@ -88,7 +88,8 @@ final class WarExploder { File war = Which.jarFile(Class.forName("executable.Executable")); // TODO this assumes that the CWD of the Maven process is the plugin ${basedir}, which may not be the case - File explodeDir = new File("./target/jenkins-for-test").getAbsoluteFile(); + File buildDirectory = new File(System.getProperty("buildDirectory", "target")); + File explodeDir = new File(buildDirectory, "jenkins-for-test").getAbsoluteFile(); explodeDir.getParentFile().mkdirs(); while (new File(explodeDir + ".exploding").isFile()) { explodeDir = new File(explodeDir + "x"); From da1c74f619feea134aa887b1e5b1774307ea0e47 Mon Sep 17 00:00:00 2001 From: christ66 Date: Thu, 8 Jan 2015 11:01:12 -0800 Subject: [PATCH 128/701] Fix log message to report more verbose message. --- core/src/main/java/hudson/model/AbstractProject.java | 2 +- core/src/main/java/hudson/model/Actionable.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/hudson/model/AbstractProject.java b/core/src/main/java/hudson/model/AbstractProject.java index abea5887b7..4a8e3dd901 100644 --- a/core/src/main/java/hudson/model/AbstractProject.java +++ b/core/src/main/java/hudson/model/AbstractProject.java @@ -755,7 +755,7 @@ public abstract class AbstractProject

                ,R extends A try { ta.addAll(Util.fixNull(tpaf.createFor(this))); // be defensive against null } catch (Exception e) { - LOGGER.log(Level.SEVERE, "Error loading transient project action factory."); + LOGGER.log(Level.SEVERE, "Could not load actions from " + tpaf + " for " + this, e); } } return ta; diff --git a/core/src/main/java/hudson/model/Actionable.java b/core/src/main/java/hudson/model/Actionable.java index ca1332aa0f..8285544821 100644 --- a/core/src/main/java/hudson/model/Actionable.java +++ b/core/src/main/java/hudson/model/Actionable.java @@ -97,7 +97,7 @@ public abstract class Actionable extends AbstractModelObject implements ModelObj try { _actions.addAll(createFor(taf)); } catch (Exception e) { - LOGGER.log(Level.SEVERE, "Error loading action.", e); + LOGGER.log(Level.SEVERE, "Could not load actions from " + taf + " for " + this, e); } } } From d58c3cd5d6ac851f0a28b1c1bb6dbeb02fd2b1c9 Mon Sep 17 00:00:00 2001 From: christ66 Date: Thu, 8 Jan 2015 11:19:06 -0800 Subject: [PATCH 129/701] Remove redundant catch exception --- core/src/main/java/hudson/model/ItemGroupMixIn.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/core/src/main/java/hudson/model/ItemGroupMixIn.java b/core/src/main/java/hudson/model/ItemGroupMixIn.java index e2f2e0e2b7..6a02420d95 100644 --- a/core/src/main/java/hudson/model/ItemGroupMixIn.java +++ b/core/src/main/java/hudson/model/ItemGroupMixIn.java @@ -114,8 +114,6 @@ public abstract class ItemGroupMixIn { item.onLoad(parent, subdir.getName()); } configurations.put(key.call(item), item); - } catch (IOException e) { - Logger.getLogger(ItemGroupMixIn.class.getName()).log(Level.WARNING, "could not load " + subdir, e); } catch (Exception e) { Logger.getLogger(ItemGroupMixIn.class.getName()).log(Level.WARNING, "could not load " + subdir, e); } From 2d3dbad35a25998e94c7bedb5a185730e390cfcd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Scheibe?= Date: Thu, 8 Jan 2015 20:25:18 +0100 Subject: [PATCH 130/701] statically import methods used from org.junit.Assert * that's a common practice so do it consistently in all tests --- .../java/hudson/model/AbstractItemTest.java | 22 ++++++----- .../hudson/model/DisplayNameListenerTest.java | 12 +++--- .../hudson/model/FileParameterValueTest.java | 20 +++++----- core/src/test/java/hudson/model/JobTest.java | 7 ++-- core/src/test/java/hudson/model/ViewTest.java | 18 +++++---- .../jenkins/RemotingJarSignatureTest.java | 5 ++- .../src/test/java/jenkins/util/TimerTest.java | 5 ++- .../java/hudson/cli/CLIRegistererTest.java | 7 ++-- .../java/hudson/model/DisplayNameTest.java | 28 ++++++------- .../model/GetEnvironmentOutsideBuildTest.java | 8 ++-- .../test/java/hudson/model/SimpleJobTest.java | 18 +++++---- .../test/java/hudson/search/SearchTest.java | 39 ++++++++++--------- .../security/CliAuthenticationTest.java | 7 ++-- .../EnvironmentVariableNodePropertyTest.java | 29 +++++++------- .../hudson/slaves/NodeCanTakeTaskTest.java | 14 ++++--- .../src/test/java/hudson/tasks/ShellTest.java | 10 +++-- .../test/java/jenkins/model/JenkinsTest.java | 30 +++++++------- .../model/MasterBuildConfigurationTest.java | 9 +++-- .../FrameOptionsPageDecoratorTest.java | 8 ++-- test/src/test/java/lib/layout/IconTest.java | 10 +++-- 20 files changed, 169 insertions(+), 137 deletions(-) diff --git a/core/src/test/java/hudson/model/AbstractItemTest.java b/core/src/test/java/hudson/model/AbstractItemTest.java index bb210feb0f..82ada9dea5 100644 --- a/core/src/test/java/hudson/model/AbstractItemTest.java +++ b/core/src/test/java/hudson/model/AbstractItemTest.java @@ -3,9 +3,11 @@ */ package hudson.model; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; + import java.util.Collection; -import org.junit.Assert; import org.junit.Test; /** @@ -42,7 +44,7 @@ public class AbstractItemTest { final String displayName = "testDisplayName"; StubAbstractItem i = new StubAbstractItem(); i.setDisplayName(displayName); - Assert.assertEquals(displayName, i.getDisplayName()); + assertEquals(displayName, i.getDisplayName()); } @Test @@ -51,7 +53,7 @@ public class AbstractItemTest { StubAbstractItem i = new StubAbstractItem(); i.doSetName(name); // assert that if the displayname is not set, the name is actually returned - Assert.assertEquals(name, i.getDisplayName()); + assertEquals(name, i.getDisplayName()); } @@ -61,7 +63,7 @@ public class AbstractItemTest { StubAbstractItem i = new StubAbstractItem(); i.doSetName(name); - Assert.assertEquals(i.getName(), i.getSearchName()); + assertEquals(i.getName(), i.getSearchName()); } @Test @@ -70,11 +72,11 @@ public class AbstractItemTest { final String displayName = "displayName"; StubAbstractItem i = new StubAbstractItem(); i.doSetName(projectName); - Assert.assertEquals(projectName, i.getName()); - Assert.assertNull(i.getDisplayNameOrNull()); + assertEquals(projectName, i.getName()); + assertNull(i.getDisplayNameOrNull()); i.setDisplayName(displayName); - Assert.assertEquals(displayName, i.getDisplayNameOrNull()); + assertEquals(displayName, i.getDisplayNameOrNull()); } @Test @@ -83,10 +85,10 @@ public class AbstractItemTest { final String displayName = "displayName"; StubAbstractItem i = new StubAbstractItem(); i.doSetName(projectName); - Assert.assertNull(i.getDisplayNameOrNull()); + assertNull(i.getDisplayNameOrNull()); i.setDisplayNameOrNull(displayName); - Assert.assertEquals(displayName, i.getDisplayNameOrNull()); - Assert.assertEquals(displayName, i.getDisplayName()); + assertEquals(displayName, i.getDisplayNameOrNull()); + assertEquals(displayName, i.getDisplayName()); } } diff --git a/core/src/test/java/hudson/model/DisplayNameListenerTest.java b/core/src/test/java/hudson/model/DisplayNameListenerTest.java index 91b16e3ae5..e74ddc7dee 100644 --- a/core/src/test/java/hudson/model/DisplayNameListenerTest.java +++ b/core/src/test/java/hudson/model/DisplayNameListenerTest.java @@ -23,7 +23,9 @@ */ package hudson.model; -import org.junit.Assert; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; + import org.junit.Test; public class DisplayNameListenerTest { @@ -38,11 +40,11 @@ public class DisplayNameListenerTest { dest.setDisplayName("this should be cleared"); // make sure the displayname and the name are different at this point - Assert.assertFalse(dest.getName().equals(dest.getDisplayName())); + assertFalse(dest.getName().equals(dest.getDisplayName())); listener.onCopied(src, dest); // make sure the displayname is equals to the name as it should be null - Assert.assertEquals(dest.getName(), dest.getDisplayName()); + assertEquals(dest.getName(), dest.getDisplayName()); } @Test @@ -56,7 +58,7 @@ public class DisplayNameListenerTest { listener.onRenamed(src, oldName, newName); - Assert.assertEquals(newName, src.getDisplayName()); + assertEquals(newName, src.getDisplayName()); } @Test @@ -72,6 +74,6 @@ public class DisplayNameListenerTest { listener.onRenamed(src, oldName, oldName); // make sure displayname is still intact - Assert.assertEquals(displayName, src.getDisplayName()); + assertEquals(displayName, src.getDisplayName()); } } diff --git a/core/src/test/java/hudson/model/FileParameterValueTest.java b/core/src/test/java/hudson/model/FileParameterValueTest.java index cd03b68409..06dfe70842 100644 --- a/core/src/test/java/hudson/model/FileParameterValueTest.java +++ b/core/src/test/java/hudson/model/FileParameterValueTest.java @@ -24,8 +24,10 @@ package hudson.model; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; + import java.io.File; -import org.junit.Assert; import org.junit.Test; import org.jvnet.hudson.test.Issue; @@ -41,8 +43,8 @@ public class FileParameterValueTest { final FileParameterValue param1 = new FileParameterValue(paramName, new File("ws_param1.txt"), "param1.txt"); final FileParameterValue param2 = new FileParameterValue(paramName, new File("ws_param2.txt"), "param2.txt"); - Assert.assertNotEquals("Files with same locations shoud be considered as different", param1, param2); - Assert.assertNotEquals("Files with same locations shoud be considered as different", param2, param1); + assertNotEquals("Files with same locations shoud be considered as different", param1, param2); + assertNotEquals("Files with same locations shoud be considered as different", param2, param1); } @Test public void compareNullParams() { @@ -52,13 +54,13 @@ public class FileParameterValueTest { FileParameterValue nullParam2 = new FileParameterValue(null, new File("null_param2.txt"), "null_param2.txt"); // Combine nulls - Assert.assertEquals(nullParam1, nullParam1); - Assert.assertEquals(nullParam1, nullParam2); - Assert.assertEquals(nullParam2, nullParam1); - Assert.assertEquals(nullParam2, nullParam2); + assertEquals(nullParam1, nullParam1); + assertEquals(nullParam1, nullParam2); + assertEquals(nullParam2, nullParam1); + assertEquals(nullParam2, nullParam2); // Compare with non-null - Assert.assertNotEquals(nullParam1, nonNullParam); - Assert.assertNotEquals(nonNullParam, nullParam1); + assertNotEquals(nullParam1, nonNullParam); + assertNotEquals(nonNullParam, nullParam1); } } diff --git a/core/src/test/java/hudson/model/JobTest.java b/core/src/test/java/hudson/model/JobTest.java index 5a0d1a03fe..8306d9d24b 100644 --- a/core/src/test/java/hudson/model/JobTest.java +++ b/core/src/test/java/hudson/model/JobTest.java @@ -1,7 +1,6 @@ package hudson.model; - -import org.junit.Assert; +import static org.junit.Assert.assertEquals; import org.junit.Test; @@ -16,7 +15,7 @@ public class JobTest { j.setDisplayNameOrNull(displayName); // make sure the displayname has been set - Assert.assertEquals(displayName, j.getDisplayName()); + assertEquals(displayName, j.getDisplayName()); } @Test @@ -26,6 +25,6 @@ public class JobTest { j.setDisplayNameOrNull(""); // make sure the getDisplayName returns the project name - Assert.assertEquals(StubJob.DEFAULT_STUB_JOB_NAME, j.getDisplayName()); + assertEquals(StubJob.DEFAULT_STUB_JOB_NAME, j.getDisplayName()); } } diff --git a/core/src/test/java/hudson/model/ViewTest.java b/core/src/test/java/hudson/model/ViewTest.java index e521ab2ee9..adcb7deee1 100644 --- a/core/src/test/java/hudson/model/ViewTest.java +++ b/core/src/test/java/hudson/model/ViewTest.java @@ -1,5 +1,8 @@ package hudson.model; +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; + import hudson.model.Descriptor.FormException; import hudson.search.SearchIndex; import hudson.search.SearchIndexBuilder; @@ -14,7 +17,6 @@ import java.util.List; import javax.servlet.ServletException; -import org.junit.Assert; import org.junit.Test; import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerResponse; @@ -59,19 +61,19 @@ public class ViewTest { // now make sure we can fetch item1 from the index List result = new ArrayList(); index.find(displayName1, result); - Assert.assertEquals(1, result.size()); + assertEquals(1, result.size()); SearchItem actual = result.get(0); - Assert.assertEquals(actual.getSearchName(), item1.getDisplayName()); - Assert.assertEquals(actual.getSearchUrl(), item1.getSearchUrl()); + assertEquals(actual.getSearchName(), item1.getDisplayName()); + assertEquals(actual.getSearchUrl(), item1.getSearchUrl()); // clear the result array for the next search result to test result.clear(); // make sure we can fetch item 2 from the index index.find(displayName2, result); - Assert.assertEquals(1, result.size()); + assertEquals(1, result.size()); actual = result.get(0); - Assert.assertEquals(actual.getSearchName(), item2.getDisplayName()); - Assert.assertEquals(actual.getSearchUrl(), item2.getSearchUrl()); + assertEquals(actual.getSearchName(), item2.getDisplayName()); + assertEquals(actual.getSearchUrl(), item2.getSearchUrl()); } /* @@ -100,7 +102,7 @@ public class ViewTest { final TopLevelItem[] expected = new TopLevelItem[] {rootJob, sharedJob, leftJob, rightJob}; - Assert.assertArrayEquals(expected, rootView.getAllItems().toArray()); + assertArrayEquals(expected, rootView.getAllItems().toArray()); } private TopLevelItem createJob(String jobName) { diff --git a/core/src/test/java/jenkins/RemotingJarSignatureTest.java b/core/src/test/java/jenkins/RemotingJarSignatureTest.java index b64b8d278f..60c878b20f 100644 --- a/core/src/test/java/jenkins/RemotingJarSignatureTest.java +++ b/core/src/test/java/jenkins/RemotingJarSignatureTest.java @@ -1,9 +1,10 @@ package jenkins; +import static org.junit.Assert.fail; + import hudson.remoting.Channel; import hudson.remoting.Which; import org.apache.commons.io.output.NullOutputStream; -import org.junit.Assert; import org.junit.Test; import java.io.File; @@ -43,7 +44,7 @@ public class RemotingJarSignatureTest { // make sure bits are signed IOUtils.copy(myJar.getInputStream(entry), new NullOutputStream()); if (entry.getCodeSigners()==null) { - Assert.fail("No signature for " + name); + fail("No signature for " + name); } } } diff --git a/core/src/test/java/jenkins/util/TimerTest.java b/core/src/test/java/jenkins/util/TimerTest.java index d95ffddd28..cbe40de66d 100644 --- a/core/src/test/java/jenkins/util/TimerTest.java +++ b/core/src/test/java/jenkins/util/TimerTest.java @@ -1,7 +1,8 @@ package jenkins.util; +import static org.junit.Assert.fail; + import hudson.triggers.SafeTimerTask; -import org.junit.Assert; import org.junit.Test; import org.jvnet.hudson.test.Issue; @@ -39,7 +40,7 @@ public class TimerTest { startLatch.await(); Timer.get().schedule(task2, 2, TimeUnit.MILLISECONDS); if (! stopLatch.await(10000, TimeUnit.MILLISECONDS)) { - Assert.fail("Failed to run the two tasks simultaneously"); + fail("Failed to run the two tasks simultaneously"); } } diff --git a/test/src/test/java/hudson/cli/CLIRegistererTest.java b/test/src/test/java/hudson/cli/CLIRegistererTest.java index b775ff6fbf..99d65175ff 100644 --- a/test/src/test/java/hudson/cli/CLIRegistererTest.java +++ b/test/src/test/java/hudson/cli/CLIRegistererTest.java @@ -4,11 +4,12 @@ import static hudson.cli.CLICommandInvoker.Matcher.failedWith; import static hudson.cli.CLICommandInvoker.Matcher.succeededSilently; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.CoreMatchers.containsString; +import static org.hamcrest.CoreMatchers.is; + import jenkins.model.Jenkins; import hudson.cli.CLICommandInvoker; import hudson.cli.CLICommandInvoker.Result; -import org.junit.Assert; import org.junit.Rule; import org.junit.Test; import org.jvnet.hudson.test.JenkinsRule; @@ -27,10 +28,10 @@ public class CLIRegistererTest { Result invocation = command.invokeWithArgs("--username", "foo", "--password", "invalid"); assertThat(invocation, failedWith(1)); assertThat(invocation.stderr(), containsString("BadCredentialsException: foo")); - Assert.assertFalse("Unauthorized command was executed", Jenkins.getInstance().isQuietingDown()); + assertThat("Unauthorized command was executed", Jenkins.getInstance().isQuietingDown(), is(false)); invocation = command.invokeWithArgs("--username", "foo", "--password", "foo"); assertThat(invocation, succeededSilently()); - Assert.assertTrue("Authorized command was not executed", Jenkins.getInstance().isQuietingDown()); + assertThat("Authorized command was not executed", Jenkins.getInstance().isQuietingDown(), is(true)); } } diff --git a/test/src/test/java/hudson/model/DisplayNameTest.java b/test/src/test/java/hudson/model/DisplayNameTest.java index 60e7356788..41797928e4 100644 --- a/test/src/test/java/hudson/model/DisplayNameTest.java +++ b/test/src/test/java/hudson/model/DisplayNameTest.java @@ -23,9 +23,11 @@ */ package hudson.model; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + import jenkins.model.Jenkins; -import org.junit.Assert; import org.junit.Rule; import org.junit.Test; import org.jvnet.hudson.test.Issue; @@ -45,10 +47,10 @@ public class DisplayNameTest { final String projectName = "projectName"; final String newProjectName = "newProjectName"; FreeStyleProject project = j.createFreeStyleProject(projectName); - Assert.assertEquals(projectName, project.getDisplayName()); + assertEquals(projectName, project.getDisplayName()); project.renameTo(newProjectName); - Assert.assertEquals(newProjectName, project.getDisplayName()); + assertEquals(newProjectName, project.getDisplayName()); } @Test @@ -58,10 +60,10 @@ public class DisplayNameTest { final String displayName = "displayName"; FreeStyleProject project = j.createFreeStyleProject(projectName); project.setDisplayName(displayName); - Assert.assertEquals(displayName, project.getDisplayName()); + assertEquals(displayName, project.getDisplayName()); project.renameTo(newProjectName); - Assert.assertEquals(displayName, project.getDisplayName()); + assertEquals(displayName, project.getDisplayName()); } @SuppressWarnings("rawtypes") @@ -70,11 +72,11 @@ public class DisplayNameTest { final String projectName = "projectName"; final String newProjectName = "newProjectName"; FreeStyleProject project = j.createFreeStyleProject(projectName); - Assert.assertEquals(projectName, project.getDisplayName()); + assertEquals(projectName, project.getDisplayName()); AbstractProject newProject = Jenkins.getInstance().copy((AbstractProject)project, newProjectName); - Assert.assertEquals(newProjectName, newProject.getName()); - Assert.assertEquals(newProjectName, newProject.getDisplayName()); + assertEquals(newProjectName, newProject.getName()); + assertEquals(newProjectName, newProject.getDisplayName()); } @SuppressWarnings("rawtypes") @@ -85,11 +87,11 @@ public class DisplayNameTest { final String oldDisplayName = "oldDisplayName"; FreeStyleProject project = j.createFreeStyleProject(projectName); project.setDisplayName(oldDisplayName); - Assert.assertEquals(oldDisplayName, project.getDisplayName()); + assertEquals(oldDisplayName, project.getDisplayName()); AbstractProject newProject = Jenkins.getInstance().copy((AbstractProject)project, newProjectName); - Assert.assertEquals(newProjectName, newProject.getName()); - Assert.assertEquals(newProjectName, newProject.getDisplayName()); + assertEquals(newProjectName, newProject.getName()); + assertEquals(newProjectName, newProject.getDisplayName()); } @@ -100,8 +102,8 @@ public class DisplayNameTest { job.setDisplayName("My Job"); MockFolder d2 = j.jenkins.copy(d1, "d2"); FreeStyleProject j2 = (FreeStyleProject) d2.getItem("job"); - Assert.assertNotNull(j2); - Assert.assertEquals("My Job", j2.getDisplayName()); + assertNotNull(j2); + assertEquals("My Job", j2.getDisplayName()); } } diff --git a/test/src/test/java/hudson/model/GetEnvironmentOutsideBuildTest.java b/test/src/test/java/hudson/model/GetEnvironmentOutsideBuildTest.java index be4dc2aa88..66f4322206 100644 --- a/test/src/test/java/hudson/model/GetEnvironmentOutsideBuildTest.java +++ b/test/src/test/java/hudson/model/GetEnvironmentOutsideBuildTest.java @@ -1,5 +1,8 @@ package hudson.model; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; + import java.io.IOException; import java.io.StringReader; @@ -10,7 +13,6 @@ import hudson.tasks.Maven.MavenInstallation; import hudson.util.StreamTaskListener; import jenkins.model.Jenkins; -import org.junit.Assert; import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.ExtractResourceSCM; @@ -47,7 +49,7 @@ public class GetEnvironmentOutsideBuildTest extends HudsonTestCase { private void restoreOldNumExecutors() throws IOException { Jenkins.getInstance().setNumExecutors(this.oldExecNum); Jenkins.getInstance().setNodes(Jenkins.getInstance().getNodes()); - Assert.assertNotNull(Jenkins.getInstance().toComputer()); + assertNotNull(Jenkins.getInstance().toComputer()); } private MavenModuleSet createSimpleMavenProject() throws Exception { @@ -64,7 +66,7 @@ public class GetEnvironmentOutsideBuildTest extends HudsonTestCase { Jenkins.getInstance().setNumExecutors(0); // force update of nodes: Jenkins.getInstance().setNodes(Jenkins.getInstance().getNodes()); - Assert.assertNull(Jenkins.getInstance().toComputer()); + assertNull(Jenkins.getInstance().toComputer()); } public void testMaven() throws Exception { diff --git a/test/src/test/java/hudson/model/SimpleJobTest.java b/test/src/test/java/hudson/model/SimpleJobTest.java index 43523b04ad..ad26b57e68 100644 --- a/test/src/test/java/hudson/model/SimpleJobTest.java +++ b/test/src/test/java/hudson/model/SimpleJobTest.java @@ -1,10 +1,12 @@ package hudson.model; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + import java.io.IOException; import java.util.SortedMap; import java.util.TreeMap; -import org.junit.Assert; import org.junit.Rule; import org.junit.Test; import org.jvnet.hudson.test.JenkinsRule; @@ -36,8 +38,8 @@ public class SimpleJobTest { // without assuming to know too much about the internal calculation // we can only assume that the result is between the maximum and the minimum - Assert.assertTrue("Expected < 42, but was "+project.getEstimatedDuration(), project.getEstimatedDuration() < 42); - Assert.assertTrue("Expected > 15, but was "+project.getEstimatedDuration(), project.getEstimatedDuration() > 15); + assertTrue("Expected < 42, but was "+project.getEstimatedDuration(), project.getEstimatedDuration() < 42); + assertTrue("Expected > 15, but was "+project.getEstimatedDuration(), project.getEstimatedDuration() > 15); } @Test @@ -50,7 +52,7 @@ public class SimpleJobTest { TestBuild lastBuild = new TestBuild(project, Result.SUCCESS, 42, null); runs.put(1, lastBuild); - Assert.assertEquals(42, project.getEstimatedDuration()); + assertEquals(42, project.getEstimatedDuration()); } public void testGetEstimatedDurationWithFailedRun() throws IOException { @@ -62,7 +64,7 @@ public class SimpleJobTest { TestBuild lastBuild = new TestBuild(project, Result.FAILURE, 42, null); runs.put(1, lastBuild); - Assert.assertEquals(-1, project.getEstimatedDuration()); + assertEquals(-1, project.getEstimatedDuration()); } @Test @@ -72,7 +74,7 @@ public class SimpleJobTest { Job project = createMockProject(runs); - Assert.assertEquals(-1, project.getEstimatedDuration()); + assertEquals(-1, project.getEstimatedDuration()); } @Test @@ -101,7 +103,7 @@ public class SimpleJobTest { runs.put(1, lastBuild); // failed builds must not be used, if there are succesfulBuilds available. - Assert.assertEquals(1, project.getEstimatedDuration()); + assertEquals(1, project.getEstimatedDuration()); } @Test @@ -114,7 +116,7 @@ public class SimpleJobTest { TestBuild lastBuild = new TestBuild(project, Result.FAILURE, 50, null); runs.put(1, lastBuild); - Assert.assertEquals(50, project.getEstimatedDuration()); + assertEquals(50, project.getEstimatedDuration()); } private Job createMockProject(final SortedMap runs) { diff --git a/test/src/test/java/hudson/search/SearchTest.java b/test/src/test/java/hudson/search/SearchTest.java index 9687e68761..c90858e388 100644 --- a/test/src/test/java/hudson/search/SearchTest.java +++ b/test/src/test/java/hudson/search/SearchTest.java @@ -26,7 +26,9 @@ package hudson.search; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; +import static org.junit.Assert.assertNotNull; import static org.junit.Assert.fail; + import hudson.model.FreeStyleProject; import hudson.model.ListView; @@ -37,7 +39,6 @@ import net.sf.json.JSONArray; import net.sf.json.JSONObject; import net.sf.json.JSONSerializer; -import org.junit.Assert; import org.junit.Rule; import org.junit.Test; import org.jvnet.hudson.test.Issue; @@ -96,12 +97,12 @@ public class SearchTest { j.createFreeStyleProject(projectName); Page result = j.search(projectName); - Assert.assertNotNull(result); + assertNotNull(result); j.assertGoodStatus(result); // make sure we've fetched the testSearchByDisplayName project page String contents = result.getWebResponse().getContentAsString(); - Assert.assertTrue(contents.contains(String.format("%s [Jenkins]", projectName))); + assertTrue(contents.contains(String.format("%s [Jenkins]", projectName))); } @Test @@ -112,12 +113,12 @@ public class SearchTest { project.setDisplayName(displayName); Page result = j.search(displayName); - Assert.assertNotNull(result); + assertNotNull(result); j.assertGoodStatus(result); // make sure we've fetched the testSearchByDisplayName project page String contents = result.getWebResponse().getContentAsString(); - Assert.assertTrue(contents.contains(String.format("%s [Jenkins]", displayName))); + assertTrue(contents.contains(String.format("%s [Jenkins]", displayName))); } @Test @@ -140,13 +141,13 @@ public class SearchTest { // matter which one as long as the one that is returned has displayName // as the display name Page result = j.search(displayName); - Assert.assertNotNull(result); + assertNotNull(result); j.assertGoodStatus(result); // make sure we've fetched the testSearchByDisplayName project page String contents = result.getWebResponse().getContentAsString(); - Assert.assertTrue(contents.contains(String.format("%s [Jenkins]", displayName))); - Assert.assertFalse(contents.contains(otherDisplayName)); + assertTrue(contents.contains(String.format("%s [Jenkins]", displayName))); + assertFalse(contents.contains(otherDisplayName)); } @Test @@ -172,16 +173,16 @@ public class SearchTest { // search for foo Page result = j.search(project1Name); - Assert.assertNotNull(result); + assertNotNull(result); j.assertGoodStatus(result); // make sure we get the project with the name foo String contents = result.getWebResponse().getContentAsString(); - Assert.assertTrue(contents.contains(String.format("%s [Jenkins]", project1DisplayName))); + assertTrue(contents.contains(String.format("%s [Jenkins]", project1DisplayName))); // make sure projects 2 and 3 were not picked up - Assert.assertFalse(contents.contains(project2Name)); - Assert.assertFalse(contents.contains(project3Name)); - Assert.assertFalse(contents.contains(project3DisplayName)); + assertFalse(contents.contains(project2Name)); + assertFalse(contents.contains(project3Name)); + assertFalse(contents.contains(project3DisplayName)); } @Test @@ -194,17 +195,17 @@ public class SearchTest { WebClient wc = j.createWebClient(); Page result = wc.goTo("search/suggest?query=name", "application/json"); - Assert.assertNotNull(result); + assertNotNull(result); j.assertGoodStatus(result); String content = result.getWebResponse().getContentAsString(); System.out.println(content); JSONObject jsonContent = (JSONObject)JSONSerializer.toJSON(content); - Assert.assertNotNull(jsonContent); + assertNotNull(jsonContent); JSONArray jsonArray = jsonContent.getJSONArray("suggestions"); - Assert.assertNotNull(jsonArray); + assertNotNull(jsonArray); - Assert.assertEquals(2, jsonArray.size()); + assertEquals(2, jsonArray.size()); boolean foundProjectName = false; boolean foundDispayName = false; @@ -220,8 +221,8 @@ public class SearchTest { } } - Assert.assertTrue(foundProjectName); - Assert.assertTrue(foundDispayName); + assertTrue(foundProjectName); + assertTrue(foundDispayName); } /** diff --git a/test/src/test/java/hudson/security/CliAuthenticationTest.java b/test/src/test/java/hudson/security/CliAuthenticationTest.java index 2c2247791b..7080fa501f 100644 --- a/test/src/test/java/hudson/security/CliAuthenticationTest.java +++ b/test/src/test/java/hudson/security/CliAuthenticationTest.java @@ -1,6 +1,8 @@ package hudson.security; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotSame; +import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; import hudson.cli.CLI; @@ -11,7 +13,6 @@ import hudson.cli.LogoutCommand; import jenkins.model.Jenkins; import org.acegisecurity.Authentication; import org.apache.commons.io.input.NullInputStream; -import org.junit.Assert; import org.junit.Rule; import org.junit.Test; import org.jvnet.hudson.test.For; @@ -71,7 +72,7 @@ public class CliAuthenticationTest { @Override protected int run() throws Exception { Authentication auth = Jenkins.getAuthentication(); - Assert.assertNotSame(Jenkins.ANONYMOUS,auth); + assertNotSame(Jenkins.ANONYMOUS,auth); assertEquals("abc", auth.getName()); return 0; } @@ -87,7 +88,7 @@ public class CliAuthenticationTest { @Override protected int run() throws Exception { Authentication auth = Jenkins.getAuthentication(); - Assert.assertSame(Jenkins.ANONYMOUS,auth); + assertSame(Jenkins.ANONYMOUS,auth); return 0; } } diff --git a/test/src/test/java/hudson/slaves/EnvironmentVariableNodePropertyTest.java b/test/src/test/java/hudson/slaves/EnvironmentVariableNodePropertyTest.java index f35b5476bf..b1a989ead9 100644 --- a/test/src/test/java/hudson/slaves/EnvironmentVariableNodePropertyTest.java +++ b/test/src/test/java/hudson/slaves/EnvironmentVariableNodePropertyTest.java @@ -1,5 +1,7 @@ package hudson.slaves; +import static org.junit.Assert.assertEquals; + import hudson.model.FreeStyleBuild; import hudson.model.FreeStyleProject; import hudson.model.Node; @@ -12,7 +14,6 @@ import java.io.IOException; import java.util.Collections; import java.util.Map; -import org.junit.Assert; import org.jvnet.hudson.test.CaptureEnvironmentBuilder; import org.jvnet.hudson.test.HudsonTestCase; @@ -35,7 +36,7 @@ public class EnvironmentVariableNodePropertyTest extends HudsonTestCase { public void testSlavePropertyOnSlave() throws Exception { setVariables(slave, new Entry("KEY", "slaveValue")); Map envVars = executeBuild(slave); - Assert.assertEquals("slaveValue", envVars.get("KEY")); + assertEquals("slaveValue", envVars.get("KEY")); } /** @@ -48,7 +49,7 @@ public class EnvironmentVariableNodePropertyTest extends HudsonTestCase { Map envVars = executeBuild(jenkins); - Assert.assertEquals("masterValue", envVars.get("KEY")); + assertEquals("masterValue", envVars.get("KEY")); } /** @@ -62,7 +63,7 @@ public class EnvironmentVariableNodePropertyTest extends HudsonTestCase { Map envVars = executeBuild(slave); - Assert.assertEquals("slaveValue", envVars.get("KEY")); + assertEquals("slaveValue", envVars.get("KEY")); } /** @@ -81,7 +82,7 @@ public class EnvironmentVariableNodePropertyTest extends HudsonTestCase { Map envVars = executeBuild(slave); - Assert.assertEquals("parameterValue", envVars.get("KEY")); + assertEquals("parameterValue", envVars.get("KEY")); } public void testVariableResolving() throws Exception { @@ -89,8 +90,8 @@ public class EnvironmentVariableNodePropertyTest extends HudsonTestCase { Collections.singleton(new EnvironmentVariablesNodeProperty( new Entry("KEY1", "value"), new Entry("KEY2", "$KEY1")))); Map envVars = executeBuild(jenkins); - Assert.assertEquals("value", envVars.get("KEY1")); - Assert.assertEquals("value", envVars.get("KEY2")); + assertEquals("value", envVars.get("KEY1")); + assertEquals("value", envVars.get("KEY2")); } public void testFormRoundTripForMaster() throws Exception { @@ -103,11 +104,11 @@ public class EnvironmentVariableNodePropertyTest extends HudsonTestCase { HtmlForm form = page.getFormByName("config"); submit(form); - Assert.assertEquals(1, jenkins.getGlobalNodeProperties().toList().size()); + assertEquals(1, jenkins.getGlobalNodeProperties().toList().size()); EnvironmentVariablesNodeProperty prop = jenkins.getGlobalNodeProperties().get(EnvironmentVariablesNodeProperty.class); - Assert.assertEquals(1, prop.getEnvVars().size()); - Assert.assertEquals("value", prop.getEnvVars().get("KEY")); + assertEquals(1, prop.getEnvVars().size()); + assertEquals("value", prop.getEnvVars().get("KEY")); } public void testFormRoundTripForSlave() throws Exception { @@ -118,11 +119,11 @@ public class EnvironmentVariableNodePropertyTest extends HudsonTestCase { HtmlForm form = page.getFormByName("config"); submit(form); - Assert.assertEquals(1, slave.getNodeProperties().toList().size()); + assertEquals(1, slave.getNodeProperties().toList().size()); EnvironmentVariablesNodeProperty prop = slave.getNodeProperties().get(EnvironmentVariablesNodeProperty.class); - Assert.assertEquals(1, prop.getEnvVars().size()); - Assert.assertEquals("value", prop.getEnvVars().get("KEY")); + assertEquals(1, prop.getEnvVars().size()); + assertEquals("value", prop.getEnvVars().get("KEY")); } // //////////////////////// setup ////////////////////////////////////////// @@ -155,7 +156,7 @@ public class EnvironmentVariableNodePropertyTest extends HudsonTestCase { FreeStyleBuild build = project.scheduleBuild2(0).get(/*10, TimeUnit.SECONDS*/); System.out.println(build.getLog()); - Assert.assertEquals(Result.SUCCESS, build.getResult()); + assertEquals(Result.SUCCESS, build.getResult()); return builder.getEnvVars(); } diff --git a/test/src/test/java/hudson/slaves/NodeCanTakeTaskTest.java b/test/src/test/java/hudson/slaves/NodeCanTakeTaskTest.java index 80f0f2887a..3747d64cca 100644 --- a/test/src/test/java/hudson/slaves/NodeCanTakeTaskTest.java +++ b/test/src/test/java/hudson/slaves/NodeCanTakeTaskTest.java @@ -24,6 +24,9 @@ package hudson.slaves; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + import java.util.List; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; @@ -39,7 +42,6 @@ import hudson.model.Queue.Task; import hudson.model.Slave; import hudson.model.queue.CauseOfBlockage; -import org.junit.Assert; import org.jvnet.hudson.test.HudsonTestCase; public class NodeCanTakeTaskTest extends HudsonTestCase { @@ -68,13 +70,13 @@ public class NodeCanTakeTaskTest extends HudsonTestCase { fail("Expected timeout exception"); } catch (TimeoutException e) { List buildables = jenkins.getQueue().getBuildableItems(); - Assert.assertNotNull(buildables); - Assert.assertEquals(1, buildables.size()); + assertNotNull(buildables); + assertEquals(1, buildables.size()); BuildableItem item = buildables.get(0); - Assert.assertEquals(project, item.task); - Assert.assertNotNull(item.getCauseOfBlockage()); - Assert.assertEquals(Messages.Queue_WaitingForNextAvailableExecutor(), item.getCauseOfBlockage().getShortDescription()); + assertEquals(project, item.task); + assertNotNull(item.getCauseOfBlockage()); + assertEquals(Messages.Queue_WaitingForNextAvailableExecutor(), item.getCauseOfBlockage().getShortDescription()); } } diff --git a/test/src/test/java/hudson/tasks/ShellTest.java b/test/src/test/java/hudson/tasks/ShellTest.java index 8aadb4f4ba..3edd014a48 100644 --- a/test/src/test/java/hudson/tasks/ShellTest.java +++ b/test/src/test/java/hudson/tasks/ShellTest.java @@ -1,5 +1,8 @@ package hudson.tasks; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + import hudson.Functions; import hudson.Launcher.ProcStarter; import hudson.Proc; @@ -14,7 +17,6 @@ import java.io.IOException; import java.io.PrintStream; import java.util.List; -import org.junit.Assert; import org.junit.Rule; import org.junit.Test; import org.jvnet.hudson.test.JenkinsRule; @@ -54,7 +56,7 @@ public class ShellTest { List cmds = p.cmds(); rule.assertStringContains("/bin/sh",cmds.get(0)); rule.assertStringContains("-xe",cmds.get(1)); - Assert.assertTrue(new File(cmds.get(2)).exists()); + assertTrue(new File(cmds.get(2)).exists()); // fake the execution PrintStream ps = new PrintStream(p.stdout()); @@ -70,7 +72,7 @@ public class ShellTest { FreeStyleBuild b = rule.assertBuildStatusSuccess(p.scheduleBuild2(0).get()); - Assert.assertEquals(1,s.numLaunch); - Assert.assertTrue(FileUtils.readFileToString(b.getLogFile()).contains("Hudson was here")); + assertEquals(1,s.numLaunch); + assertTrue(FileUtils.readFileToString(b.getLogFile()).contains("Hudson was here")); } } diff --git a/test/src/test/java/jenkins/model/JenkinsTest.java b/test/src/test/java/jenkins/model/JenkinsTest.java index 0ce3a66196..cfbdc53e10 100644 --- a/test/src/test/java/jenkins/model/JenkinsTest.java +++ b/test/src/test/java/jenkins/model/JenkinsTest.java @@ -23,6 +23,11 @@ */ package jenkins.model; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; + import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException; import com.gargoylesoftware.htmlunit.HttpMethod; import com.gargoylesoftware.htmlunit.WebRequestSettings; @@ -47,7 +52,6 @@ import hudson.slaves.ComputerListener; import hudson.slaves.OfflineCause; import hudson.util.FormValidation; -import org.junit.Assert; import org.junit.Test; import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.ExtractResourceSCM; @@ -77,8 +81,8 @@ public class JenkinsTest extends HudsonTestCase implements UnprotectedRootAction p.setDisplayName("displayName"); Jenkins jenkins = Jenkins.getInstance(); - Assert.assertTrue(jenkins.isDisplayNameUnique("displayName1", curJobName)); - Assert.assertTrue(jenkins.isDisplayNameUnique(jobName, curJobName)); + assertTrue(jenkins.isDisplayNameUnique("displayName1", curJobName)); + assertTrue(jenkins.isDisplayNameUnique(jobName, curJobName)); } @Test @@ -94,7 +98,7 @@ public class JenkinsTest extends HudsonTestCase implements UnprotectedRootAction p.setDisplayName(displayName); Jenkins jenkins = Jenkins.getInstance(); - Assert.assertFalse(jenkins.isDisplayNameUnique(displayName, curJobName)); + assertFalse(jenkins.isDisplayNameUnique(displayName, curJobName)); } @Test @@ -107,7 +111,7 @@ public class JenkinsTest extends HudsonTestCase implements UnprotectedRootAction Jenkins jenkins = Jenkins.getInstance(); // should be true as we don't test against the current job - Assert.assertTrue(jenkins.isDisplayNameUnique(displayName, curJobName)); + assertTrue(jenkins.isDisplayNameUnique(displayName, curJobName)); } @@ -119,7 +123,7 @@ public class JenkinsTest extends HudsonTestCase implements UnprotectedRootAction createFreeStyleProject(jobName); Jenkins jenkins = Jenkins.getInstance(); - Assert.assertTrue(jenkins.isNameUnique("jobName1", curJobName)); + assertTrue(jenkins.isNameUnique("jobName1", curJobName)); } @Test @@ -130,7 +134,7 @@ public class JenkinsTest extends HudsonTestCase implements UnprotectedRootAction createFreeStyleProject(jobName); Jenkins jenkins = Jenkins.getInstance(); - Assert.assertFalse(jenkins.isNameUnique(jobName, curJobName)); + assertFalse(jenkins.isNameUnique(jobName, curJobName)); } @Test @@ -142,7 +146,7 @@ public class JenkinsTest extends HudsonTestCase implements UnprotectedRootAction Jenkins jenkins = Jenkins.getInstance(); // true because we don't test against the current job - Assert.assertTrue(jenkins.isNameUnique(curJobName, curJobName)); + assertTrue(jenkins.isNameUnique(curJobName, curJobName)); } @Test @@ -157,7 +161,7 @@ public class JenkinsTest extends HudsonTestCase implements UnprotectedRootAction Jenkins jenkins = Jenkins.getInstance(); FormValidation v = jenkins.doCheckDisplayName("1displayName", curJobName); - Assert.assertEquals(FormValidation.ok(), v); + assertEquals(FormValidation.ok(), v); } @Test @@ -173,7 +177,7 @@ public class JenkinsTest extends HudsonTestCase implements UnprotectedRootAction Jenkins jenkins = Jenkins.getInstance(); FormValidation v = jenkins.doCheckDisplayName(displayName, curJobName); - Assert.assertEquals(FormValidation.Kind.WARNING, v.kind); + assertEquals(FormValidation.Kind.WARNING, v.kind); } @Test @@ -189,7 +193,7 @@ public class JenkinsTest extends HudsonTestCase implements UnprotectedRootAction Jenkins jenkins = Jenkins.getInstance(); FormValidation v = jenkins.doCheckDisplayName(jobName, curJobName); - Assert.assertEquals(FormValidation.Kind.WARNING, v.kind); + assertEquals(FormValidation.Kind.WARNING, v.kind); } @Test @@ -201,7 +205,7 @@ public class JenkinsTest extends HudsonTestCase implements UnprotectedRootAction Jenkins jenkins = Jenkins.getInstance(); for (String viewName : viewNames) { FormValidation v = jenkins.doCheckViewName(viewName); - Assert.assertEquals(FormValidation.Kind.OK, v.kind); + assertEquals(FormValidation.Kind.OK, v.kind); } } @@ -216,7 +220,7 @@ public class JenkinsTest extends HudsonTestCase implements UnprotectedRootAction for (String viewName : viewNames) { FormValidation v = jenkins.doCheckViewName(viewName); - Assert.assertEquals(FormValidation.Kind.ERROR, v.kind); + assertEquals(FormValidation.Kind.ERROR, v.kind); } } diff --git a/test/src/test/java/jenkins/model/MasterBuildConfigurationTest.java b/test/src/test/java/jenkins/model/MasterBuildConfigurationTest.java index 25b5b4423c..e314ee0fe5 100644 --- a/test/src/test/java/jenkins/model/MasterBuildConfigurationTest.java +++ b/test/src/test/java/jenkins/model/MasterBuildConfigurationTest.java @@ -1,8 +1,9 @@ package jenkins.model; +import static org.junit.Assert.assertTrue; + import hudson.model.Node.Mode; -import org.junit.Assert; import org.junit.Rule; import org.junit.Test; import org.jvnet.hudson.test.Issue; @@ -17,7 +18,7 @@ public class MasterBuildConfigurationTest { public void retainMasterLabelWhenNoSlaveDefined() throws Exception { Jenkins jenkins = j.getInstance(); - Assert.assertTrue("Test is for master with no slave", jenkins.getComputers().length == 1); + assertTrue("Test is for master with no slave", jenkins.getComputers().length == 1); // set our own label & mode final String myTestLabel = "TestLabelx0123"; @@ -28,7 +29,7 @@ public class MasterBuildConfigurationTest { j.configRoundtrip(); // make sure settings were not lost - Assert.assertTrue("Master's label is lost", myTestLabel.equals(jenkins.getLabelString())); - Assert.assertTrue("Master's mode is lost", Mode.EXCLUSIVE.equals(jenkins.getMode())); + assertTrue("Master's label is lost", myTestLabel.equals(jenkins.getLabelString())); + assertTrue("Master's mode is lost", Mode.EXCLUSIVE.equals(jenkins.getMode())); } } diff --git a/test/src/test/java/jenkins/security/FrameOptionsPageDecoratorTest.java b/test/src/test/java/jenkins/security/FrameOptionsPageDecoratorTest.java index aea1fab745..f4507f81c8 100644 --- a/test/src/test/java/jenkins/security/FrameOptionsPageDecoratorTest.java +++ b/test/src/test/java/jenkins/security/FrameOptionsPageDecoratorTest.java @@ -1,9 +1,11 @@ package jenkins.security; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; + import com.gargoylesoftware.htmlunit.WebResponse; import com.gargoylesoftware.htmlunit.html.HtmlPage; import org.apache.commons.httpclient.NameValuePair; -import org.junit.Assert; import org.junit.Rule; import org.junit.Test; import org.jvnet.hudson.test.JenkinsRule; @@ -19,7 +21,7 @@ public class FrameOptionsPageDecoratorTest { public void defaultHeaderPresent() throws IOException, SAXException { JenkinsRule.WebClient wc = j.createWebClient(); HtmlPage page = wc.goTo(""); - Assert.assertEquals("Expected different X-Frame-Options value", getFrameOptionsFromResponse(page.getWebResponse()), "sameorigin"); + assertEquals("Expected different X-Frame-Options value", getFrameOptionsFromResponse(page.getWebResponse()), "sameorigin"); } @Test @@ -27,7 +29,7 @@ public class FrameOptionsPageDecoratorTest { FrameOptionsPageDecorator.enabled = false; JenkinsRule.WebClient wc = j.createWebClient(); HtmlPage page = wc.goTo(""); - Assert.assertNull("Expected X-Frame-Options unset", getFrameOptionsFromResponse(page.getWebResponse())); + assertNull("Expected X-Frame-Options unset", getFrameOptionsFromResponse(page.getWebResponse())); } private static String getFrameOptionsFromResponse(WebResponse response) { diff --git a/test/src/test/java/lib/layout/IconTest.java b/test/src/test/java/lib/layout/IconTest.java index 0f001cfaaa..dbcfc7e19b 100644 --- a/test/src/test/java/lib/layout/IconTest.java +++ b/test/src/test/java/lib/layout/IconTest.java @@ -23,6 +23,9 @@ */ package lib.layout; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + import com.gargoylesoftware.htmlunit.html.HtmlElement; import com.gargoylesoftware.htmlunit.html.HtmlPage; import com.google.common.collect.Lists; @@ -30,7 +33,6 @@ import hudson.model.BallColor; import hudson.model.StatusIcon; import hudson.model.StockStatusIcon; import jenkins.util.NonLocalizable; -import org.junit.Assert; import org.jvnet.hudson.test.HudsonTestCase; import javax.xml.transform.Transformer; @@ -123,10 +125,10 @@ public class IconTest extends HudsonTestCase { } private void assertIconToImageOkay(HtmlElement icon, String imgPath, String classSpec) { - Assert.assertEquals("img", icon.getTagName()); - Assert.assertTrue(icon.getAttribute("src").endsWith(imgPath)); + assertEquals("img", icon.getTagName()); + assertTrue(icon.getAttribute("src").endsWith(imgPath)); if (classSpec != null) { - Assert.assertEquals(classSpec, icon.getAttribute("class")); + assertEquals(classSpec, icon.getAttribute("class")); } } From 3661ed5093ee1f4dd508bbea8272de447fcc6996 Mon Sep 17 00:00:00 2001 From: christ66 Date: Thu, 8 Jan 2015 11:27:29 -0800 Subject: [PATCH 131/701] Remove unnecessary check in test unit. Fix misleading test unit comment. --- .../src/test/java/hudson/model/ItemGroupMixInTest.java | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/test/src/test/java/hudson/model/ItemGroupMixInTest.java b/test/src/test/java/hudson/model/ItemGroupMixInTest.java index 2a95dbe7a5..8b26e332f1 100644 --- a/test/src/test/java/hudson/model/ItemGroupMixInTest.java +++ b/test/src/test/java/hudson/model/ItemGroupMixInTest.java @@ -103,8 +103,8 @@ public class ItemGroupMixInTest { } /** - * This test unit makes sure that any exception that is thrown is caught, however the folder - * will continue to load not impacting any other jobs in the folder. + * This test unit makes sure that jobs that contain bad get*Action methods will continue to + * load the project. */ @LocalData @Issue("JENKINS-22811") @@ -114,12 +114,6 @@ public class ItemGroupMixInTest { assertNotNull(d); Collection items = d.getItems(); assertEquals(5, items.size()); - Iterator iterator = items.iterator(); - assertEquals("badBuildStep", iterator.next().getName()); - assertEquals("badBuildTrigger", iterator.next().getName()); - assertEquals("badBuildWrapper", iterator.next().getName()); - assertEquals("badPublisher", iterator.next().getName()); - assertEquals("valid", iterator.next().getName()); } @TestExtension From 12251abe8fc46958a1ee931e9bd1ec6730f1efb0 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Thu, 8 Jan 2015 17:35:47 -0500 Subject: [PATCH 132/701] [FIXED JENKINS-22811] Noting merge of #1517. --- changelog.html | 3 +++ 1 file changed, 3 insertions(+) diff --git a/changelog.html b/changelog.html index ca9428101b..114fa178db 100644 --- a/changelog.html +++ b/changelog.html @@ -58,6 +58,9 @@ Upcoming changes

              • FutureImpl does not cancel its start future. (issue 25514) +
              • + Folder loading broken when child item loading throws exception. + (issue 22811) From 13ab787d5f915e38d1eedc507f9073af6f41bed4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Scheibe?= Date: Fri, 9 Jan 2015 12:25:37 +0100 Subject: [PATCH 133/701] don't extend a test class from org.junit.Assert to use its static methods --- cli/src/test/java/hudson/cli/ConnectionTest.java | 6 ++++-- .../jenkins/model/lazy/AbstractLazyLoadRunMapTest.java | 5 +++-- core/src/test/java/jenkins/model/lazy/SortedListTest.java | 7 +++++-- test/src/test/groovy/hudson/util/BootFailureTest.groovy | 3 +-- .../java/jenkins/security/BasicHeaderProcessorTest.java | 6 ++++-- 5 files changed, 17 insertions(+), 10 deletions(-) diff --git a/cli/src/test/java/hudson/cli/ConnectionTest.java b/cli/src/test/java/hudson/cli/ConnectionTest.java index 167198a182..8cfac14fb4 100644 --- a/cli/src/test/java/hudson/cli/ConnectionTest.java +++ b/cli/src/test/java/hudson/cli/ConnectionTest.java @@ -1,8 +1,9 @@ package hudson.cli; +import static org.junit.Assert.assertEquals; + import hudson.remoting.FastPipedInputStream; import hudson.remoting.FastPipedOutputStream; -import org.junit.Assert; import org.junit.Before; import org.junit.Test; @@ -13,7 +14,8 @@ import java.io.IOException; /** * @author Kohsuke Kawaguchi */ -public class ConnectionTest extends Assert { +public class ConnectionTest { + Throwable e; private Connection c1; private Connection c2; diff --git a/core/src/test/java/jenkins/model/lazy/AbstractLazyLoadRunMapTest.java b/core/src/test/java/jenkins/model/lazy/AbstractLazyLoadRunMapTest.java index cfd8d5f53a..e219b2da1b 100644 --- a/core/src/test/java/jenkins/model/lazy/AbstractLazyLoadRunMapTest.java +++ b/core/src/test/java/jenkins/model/lazy/AbstractLazyLoadRunMapTest.java @@ -23,8 +23,9 @@ */ package jenkins.model.lazy; +import static org.junit.Assert.*; + import jenkins.model.lazy.AbstractLazyLoadRunMap.Direction; -import org.junit.Assert; import org.junit.Before; import org.junit.Rule; import org.junit.Test; @@ -44,7 +45,7 @@ import org.jvnet.hudson.test.Issue; /** * @author Kohsuke Kawaguchi */ -public class AbstractLazyLoadRunMapTest extends Assert { +public class AbstractLazyLoadRunMapTest { // A=1, B=3, C=5 @Rule public FakeMapBuilder aBuilder = new FakeMapBuilder(); diff --git a/core/src/test/java/jenkins/model/lazy/SortedListTest.java b/core/src/test/java/jenkins/model/lazy/SortedListTest.java index 025317387e..b4ceb72c11 100644 --- a/core/src/test/java/jenkins/model/lazy/SortedListTest.java +++ b/core/src/test/java/jenkins/model/lazy/SortedListTest.java @@ -23,7 +23,10 @@ */ package jenkins.model.lazy; -import org.junit.Assert; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + import org.junit.Test; import java.util.ArrayList; @@ -32,7 +35,7 @@ import java.util.Arrays; /** * @author Kohsuke Kawaguchi */ -public class SortedListTest extends Assert { +public class SortedListTest { SortedList l = new SortedList(new ArrayList(Arrays.asList("B","D","F"))); @Test diff --git a/test/src/test/groovy/hudson/util/BootFailureTest.groovy b/test/src/test/groovy/hudson/util/BootFailureTest.groovy index aac2771831..389ad757e5 100644 --- a/test/src/test/groovy/hudson/util/BootFailureTest.groovy +++ b/test/src/test/groovy/hudson/util/BootFailureTest.groovy @@ -5,7 +5,6 @@ import hudson.model.Hudson import hudson.model.listeners.ItemListener import jenkins.model.Jenkins import org.junit.After -import org.junit.Assert import org.junit.Rule import org.junit.Test import org.junit.rules.TemporaryFolder @@ -22,7 +21,7 @@ import javax.servlet.ServletContextEvent * * @author Kohsuke Kawaguchi */ -class BootFailureTest extends Assert { +class BootFailureTest { @Rule public TemporaryFolder tmpDir = new TemporaryFolder(); diff --git a/test/src/test/java/jenkins/security/BasicHeaderProcessorTest.java b/test/src/test/java/jenkins/security/BasicHeaderProcessorTest.java index c11726fd93..b83327a118 100644 --- a/test/src/test/java/jenkins/security/BasicHeaderProcessorTest.java +++ b/test/src/test/java/jenkins/security/BasicHeaderProcessorTest.java @@ -1,5 +1,8 @@ package jenkins.security; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.fail; + import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException; import com.gargoylesoftware.htmlunit.Page; import com.gargoylesoftware.htmlunit.WebRequestSettings; @@ -7,7 +10,6 @@ import hudson.model.UnprotectedRootAction; import hudson.model.User; import hudson.util.HttpResponses; import hudson.util.Scrambler; -import org.junit.Assert; import org.junit.Rule; import org.junit.Test; import org.jvnet.hudson.test.JenkinsRule; @@ -22,7 +24,7 @@ import java.net.URL; /** * @author Kohsuke Kawaguchi */ -public class BasicHeaderProcessorTest extends Assert { +public class BasicHeaderProcessorTest { @Rule public JenkinsRule j = new JenkinsRule(); From 665c4985d7eaae00caf995b73cc8037762190728 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Scheibe?= Date: Fri, 9 Jan 2015 12:30:00 +0100 Subject: [PATCH 134/701] don't extend a test class from org.junit.Assert to use its static methods * to simplify the static import and test use Hamcrest to compare arrays * no need to box boolean[] to Boolean[] when using Hamcrest --- .../hudson/util/ArgumentListBuilderTest.java | 43 ++++++------------- 1 file changed, 14 insertions(+), 29 deletions(-) diff --git a/core/src/test/java/hudson/util/ArgumentListBuilderTest.java b/core/src/test/java/hudson/util/ArgumentListBuilderTest.java index 66834c965c..8bef4df9fd 100644 --- a/core/src/test/java/hudson/util/ArgumentListBuilderTest.java +++ b/core/src/test/java/hudson/util/ArgumentListBuilderTest.java @@ -23,6 +23,7 @@ */ package hudson.util; +import static org.junit.Assert.*; import static org.hamcrest.CoreMatchers.*; import java.io.IOException; @@ -30,23 +31,9 @@ import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; -import org.junit.Assert; import org.junit.Test; -public class ArgumentListBuilderTest extends Assert { - - public static void assertArrayEquals(String msg, boolean[] expected, boolean[] actual) { - assertArrayEquals(msg,box(expected),box(actual)); - } - - private static Boolean[] box(boolean[] a) { - if(a==null) return null; - Boolean[] r = new Boolean[a.length]; - for (int i = 0; i < a.length; i++) - r[i] = a[i]; - return r; - } - +public class ArgumentListBuilderTest { @Test public void assertEmptyMask() { @@ -57,7 +44,7 @@ public class ArgumentListBuilderTest extends Assert { assertFalse("There shouldnt be any masked arguments", builder.hasMaskedArguments()); boolean[] array = builder.toMaskArray(); assertNotNull("The mask array should not be null", array); - assertArrayEquals("The mask array was incorrect", new boolean[]{false,false,false}, array); + assertThat("The mask array was incorrect", array, is(new boolean[] { false, false, false })); } @Test @@ -69,7 +56,7 @@ public class ArgumentListBuilderTest extends Assert { assertTrue("There should be masked arguments", builder.hasMaskedArguments()); boolean[] array = builder.toMaskArray(); assertNotNull("The mask array should not be null", array); - assertArrayEquals("The mask array was incorrect", new boolean[]{false,true}, array); + assertThat("The mask array was incorrect", array, is(new boolean[] { false, true })); } @Test @@ -83,7 +70,7 @@ public class ArgumentListBuilderTest extends Assert { assertTrue("There should be masked arguments", builder.hasMaskedArguments()); boolean[] array = builder.toMaskArray(); assertNotNull("The mask array should not be null", array); - assertArrayEquals("The mask array was incorrect", new boolean[]{false,true, false, true}, array); + assertThat("The mask array was incorrect", array, is(new boolean[] { false, true, false, true })); } @Test @@ -96,7 +83,7 @@ public class ArgumentListBuilderTest extends Assert { assertTrue("There should be masked arguments", builder.hasMaskedArguments()); boolean[] array = builder.toMaskArray(); assertNotNull("The mask array should not be null", array); - assertArrayEquals("The mask array was incorrect", new boolean[]{false,false,true,false}, array); + assertThat("The mask array was incorrect", array, is(new boolean[] { false, false, true, false })); } @Test @@ -109,7 +96,7 @@ public class ArgumentListBuilderTest extends Assert { assertTrue("There should be masked arguments", builder.hasMaskedArguments()); boolean[] array = builder.toMaskArray(); assertNotNull("The mask array should not be null", array); - assertArrayEquals("The mask array was incorrect", new boolean[]{false,false,true,false}, array); + assertThat("The mask array was incorrect", array, is(new boolean[] { false, false, true, false })); } @Test @@ -123,21 +110,19 @@ public class ArgumentListBuilderTest extends Assert { "-Dfoo8=% %QED% %comspec% %-%(%.%", // add quotes, and extra quotes for %Q and %c "-Dfoo9=%'''%%@%"); // no quotes as none of the % are followed by a letter // By default, does not escape %VAR% - assertArrayEquals(new String[] { "cmd.exe", "/C", + assertThat(builder.toWindowsCommand().toCommandArray(), is(new String[] { "cmd.exe", "/C", "\"ant.bat -Dfoo1=abc \"-Dfoo2=foo bar\"" + " \"-Dfoo3=/u*r\" \"-Dfoo4=/us?\" \"-Dfoo10=bar,baz\" \"-Dfoo5=foo;bar^baz\"" + " \"-Dfoo6=&here;\" \"-Dfoo7=foo|bar\"\"baz\"" + " \"-Dfoo8=% %QED% %comspec% %-%(%.%\"" - + " -Dfoo9=%'''%%@% && exit %%ERRORLEVEL%%\"" }, - builder.toWindowsCommand().toCommandArray()); + + " -Dfoo9=%'''%%@% && exit %%ERRORLEVEL%%\"" })); // Pass flag to escape %VAR% - assertArrayEquals(new String[] { "cmd.exe", "/C", + assertThat(builder.toWindowsCommand(true).toCommandArray(), is(new String[] { "cmd.exe", "/C", "\"ant.bat -Dfoo1=abc \"-Dfoo2=foo bar\"" + " \"-Dfoo3=/u*r\" \"-Dfoo4=/us?\" \"-Dfoo10=bar,baz\" \"-Dfoo5=foo;bar^baz\"" + " \"-Dfoo6=&here;\" \"-Dfoo7=foo|bar\"\"baz\"" + " \"-Dfoo8=% %\"Q\"ED% %\"c\"omspec% %-%(%.%\"" - + " -Dfoo9=%'''%%@% && exit %%ERRORLEVEL%%\"" }, - builder.toWindowsCommand(true).toCommandArray()); + + " -Dfoo9=%'''%%@% && exit %%ERRORLEVEL%%\"" })); } @Test @@ -151,7 +136,7 @@ public class ArgumentListBuilderTest extends Assert { assertTrue("There should be masked arguments", clone.hasMaskedArguments()); boolean[] array = clone.toMaskArray(); assertNotNull("The mask array should not be null", array); - assertArrayEquals("The mask array was incorrect", builder.toMaskArray(), array); + assertThat("The mask array was incorrect", array, is(builder.toMaskArray())); } private static final Map KEY_VALUES = new HashMap() {{ @@ -172,7 +157,7 @@ public class ArgumentListBuilderTest extends Assert { assertTrue("There should be masked arguments", builder.hasMaskedArguments()); boolean[] array = builder.toMaskArray(); assertNotNull("The mask array should not be null", array); - assertArrayEquals("The mask array was incorrect", new boolean[]{false,true,false}, array); + assertThat("The mask array was incorrect", array, is(new boolean[] { false, true, false })); } @@ -184,7 +169,7 @@ public class ArgumentListBuilderTest extends Assert { assertFalse("There shouldnt be any masked arguments", builder.hasMaskedArguments()); boolean[] array = builder.toMaskArray(); assertNotNull("The mask array should not be null", array); - assertArrayEquals("The mask array was incorrect", new boolean[]{false,false,false}, array); + assertThat("The mask array was incorrect", array, is(new boolean[] { false, false, false })); } @Test From 82d6292cf8d9c21cbf9346930cbc3e2a69548fe7 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Fri, 21 Mar 2014 11:53:17 -0700 Subject: [PATCH 135/701] [FIXED JENKINS-18537] Integrated the new version of XStream that contains the fix. (cherry picked from commit 585eb87c2d1fdd93c585efca2b993ad734afdb20) Conflicts: changelog.html --- core/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/pom.xml b/core/pom.xml index d760dce28a..ca98181c32 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -219,7 +219,7 @@ THE SOFTWARE. org.jvnet.hudson xstream - 1.4.4-jenkins-5 + 1.4.7-jenkins-1 jfree From 90e989827e9e7a826c12997d7f7109ac21b0411b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20Gond=C5=BEa?= Date: Sat, 12 Apr 2014 23:15:21 +0200 Subject: [PATCH 136/701] [FIXED JENKINS-21341] Merge pull request #1169 from pliljenberg/master Ugly hack to fix destroyProcess for Java8 (cherry picked from commit 19640e7b4aa6d54865bc0816b604f4c0a9add6b6) --- .../main/java/hudson/util/ProcessTree.java | 29 +++++++++++++++---- 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/core/src/main/java/hudson/util/ProcessTree.java b/core/src/main/java/hudson/util/ProcessTree.java index 23e5cb3b91..e367f71fad 100644 --- a/core/src/main/java/hudson/util/ProcessTree.java +++ b/core/src/main/java/hudson/util/ProcessTree.java @@ -428,15 +428,15 @@ public abstract class ProcessTree implements Iterable, IProcessTree, public synchronized EnvVars getEnvironmentVariables() { if(env !=null) return env; - env = new EnvVars(); - - try + env = new EnvVars(); + + try { env.putAll(p.getEnvironmentVariables()); } catch (WinpException e) { LOGGER.log(FINE, "Failed to get environment variable ", e); - } + } return env; } }); @@ -549,7 +549,7 @@ public abstract class ProcessTree implements Iterable, IProcessTree, try { int pid = getPid(); LOGGER.fine("Killing pid="+pid); - UnixReflection.DESTROY_PROCESS.invoke(null, pid); + UnixReflection.destroy(pid); } catch (IllegalAccessException e) { // this is impossible IllegalAccessError x = new IllegalAccessError(); @@ -604,7 +604,11 @@ public abstract class ProcessTree implements Iterable, IProcessTree, PID_FIELD = clazz.getDeclaredField("pid"); PID_FIELD.setAccessible(true); - DESTROY_PROCESS = clazz.getDeclaredMethod("destroyProcess",int.class); + if (isPreJava8()) { + DESTROY_PROCESS = clazz.getDeclaredMethod("destroyProcess",int.class); + } else { + DESTROY_PROCESS = clazz.getDeclaredMethod("destroyProcess",int.class, boolean.class); + } DESTROY_PROCESS.setAccessible(true); } catch (ClassNotFoundException e) { LinkageError x = new LinkageError(); @@ -620,6 +624,19 @@ public abstract class ProcessTree implements Iterable, IProcessTree, throw x; } } + + public static void destroy(int pid) throws IllegalAccessException, InvocationTargetException { + if (isPreJava8()) { + DESTROY_PROCESS.invoke(null, pid); + } else { + DESTROY_PROCESS.invoke(null, pid, false); + } + } + + private static boolean isPreJava8() { + int javaVersionAsAnInteger = Integer.parseInt(System.getProperty("java.version").replaceAll("\\.", "").replaceAll("_", "").substring(0, 2)); + return javaVersionAsAnInteger < 18; + } } From 33d88c015c7fc6c6cdb093d4a3d04a75aa85fa80 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Thu, 27 Feb 2014 16:31:07 -0500 Subject: [PATCH 137/701] [FIXED JENKINS-19081] Offer the option of downloading metadata directly from the server. (cherry picked from commit 1ac77750e93f9a1970fecbecdf7f84279d0a62b9) Conflicts: core/src/main/java/hudson/model/DownloadService.java core/src/main/java/hudson/model/UpdateSite.java --- core/src/main/java/hudson/PluginManager.java | 23 ++++ .../java/hudson/model/DownloadService.java | 75 +++++++++-- .../main/java/hudson/model/UpdateCenter.java | 3 +- .../main/java/hudson/model/UpdateSite.java | 73 +++++------ .../main/java/hudson/util/FormValidation.java | 6 +- .../jenkins/security/DownloadSettings.java | 123 ++++++++++++++++++ .../hudson/PluginManager/advanced.jelly | 3 +- .../PageDecoratorImpl/footer.jelly | 3 + .../security/DownloadSettings/config.groovy | 12 ++ .../DownloadSettings/help-checkSignature.html | 4 + .../DownloadSettings/help-useBrowser.html | 6 + .../jenkins/security/Messages.properties | 4 +- .../hudson/model/DownloadServiceTest.java | 5 +- 13 files changed, 278 insertions(+), 62 deletions(-) create mode 100644 core/src/main/java/jenkins/security/DownloadSettings.java create mode 100644 core/src/main/resources/jenkins/security/DownloadSettings/config.groovy create mode 100644 core/src/main/resources/jenkins/security/DownloadSettings/help-checkSignature.html create mode 100644 core/src/main/resources/jenkins/security/DownloadSettings/help-useBrowser.html diff --git a/core/src/main/java/hudson/PluginManager.java b/core/src/main/java/hudson/PluginManager.java index ace1d44d41..40f577f4e5 100644 --- a/core/src/main/java/hudson/PluginManager.java +++ b/core/src/main/java/hudson/PluginManager.java @@ -108,7 +108,12 @@ import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; import static hudson.init.InitMilestone.*; +import hudson.model.DownloadService; +import hudson.util.FormValidation; import static java.util.logging.Level.WARNING; +import jenkins.security.DownloadSettings; +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.NoExternalUse; /** * Manages {@link PluginWrapper}s. @@ -775,6 +780,24 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas } } + @Restricted(NoExternalUse.class) + @RequirePOST public HttpResponse doCheckUpdatesServer() throws IOException { + for (UpdateSite site : Jenkins.getInstance().getUpdateCenter().getSites()) { + FormValidation v = site.updateDirectlyNow(DownloadSettings.get().isCheckSignature()); + if (v.kind != FormValidation.Kind.OK) { + // TODO crude but enough for now + return v; + } + } + for (DownloadService.Downloadable d : DownloadService.Downloadable.all()) { + FormValidation v = d.updateNow(); + if (v.kind != FormValidation.Kind.OK) { + return v; + } + } + return HttpResponses.forwardToPreviousPage(); + } + protected String identifyPluginShortName(File t) { try { JarFile j = new JarFile(t); diff --git a/core/src/main/java/hudson/model/DownloadService.java b/core/src/main/java/hudson/model/DownloadService.java index 8561a13c57..658e21a18d 100644 --- a/core/src/main/java/hudson/model/DownloadService.java +++ b/core/src/main/java/hudson/model/DownloadService.java @@ -26,20 +26,25 @@ package hudson.model; import hudson.Extension; import hudson.ExtensionList; import hudson.ExtensionPoint; +import hudson.ProxyConfiguration; import hudson.util.FormValidation; import hudson.util.FormValidation.Kind; import hudson.util.QuotedStringTokenizer; import hudson.util.TextFile; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.net.URLEncoder; +import java.util.logging.Logger; +import jenkins.security.DownloadSettings; import jenkins.model.Jenkins; import jenkins.util.JSONSignatureValidator; import net.sf.json.JSONException; -import org.kohsuke.stapler.Stapler; - -import java.io.File; -import java.io.IOException; -import java.util.logging.Logger; - import net.sf.json.JSONObject; +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.NoExternalUse; +import org.kohsuke.stapler.Stapler; import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerResponse; @@ -62,6 +67,9 @@ public class DownloadService extends PageDecorator { * Builds up an HTML fragment that starts all the download jobs. */ public String generateFragment() { + if (!DownloadSettings.get().isUseBrowser()) { + return ""; + } if (neverUpdate) return ""; if (doesNotSupportPostMessage()) return ""; @@ -135,6 +143,34 @@ public class DownloadService extends PageDecorator { return null; } + /** + * Loads JSON from a JSONP URL. + * Metadata for downloadables and update centers is offered in two formats, both designed for download from the browser (predating {@link DownloadSettings}): + * HTML using {@code postMessage} for newer browsers, and JSONP as a fallback. + * Confusingly, the JSONP files are given the {@code *.json} file extension, when they are really JavaScript and should be {@code *.js}. + * This method extracts the JSON from a JSONP URL, since that is what we actually want when we download from the server. + * (Currently the true JSON is not published separately, and extracting from the {@code *.json.html} is more work.) + * @param src a URL to a JSONP file (typically including {@code id} and {@code version} query parameters) + * @return the embedded JSON text + * @throws IOException if either downloading or processing failed + */ + @Restricted(NoExternalUse.class) + public static String loadJSON(URL src) throws IOException { + InputStream is = ProxyConfiguration.open(src).getInputStream(); + try { + String jsonp = IOUtils.toString(is, "UTF-8"); + int start = jsonp.indexOf('{'); + int end = jsonp.lastIndexOf('}'); + if (start >= 0 && end > start) { + return jsonp.substring(start, end + 1); + } else { + throw new IOException("Could not find JSON in " + src); + } + } finally { + is.close(); + } + } + /** * Represents a periodically updated JSON data file obtained from a remote URL. * @@ -248,17 +284,28 @@ public class DownloadService extends PageDecorator { * This is where the browser sends us the data. */ public void doPostBack(StaplerRequest req, StaplerResponse rsp) throws IOException { + if (!DownloadSettings.get().isUseBrowser()) { + throw new IOException("not allowed"); + } long dataTimestamp = System.currentTimeMillis(); due = dataTimestamp+getInterval(); // success or fail, don't try too often String json = IOUtils.toString(req.getInputStream(),"UTF-8"); + FormValidation e = load(json, dataTimestamp); + if (e.kind != Kind.OK) { + LOGGER.severe(e.renderHtml()); + throw e; + } + rsp.setContentType("text/plain"); // So browser won't try to parse response + } + + private FormValidation load(String json, long dataTimestamp) throws IOException { JSONObject o = JSONObject.fromObject(json); - if (signatureCheck) { + if (DownloadSettings.get().isCheckSignature()) { FormValidation e = new JSONSignatureValidator("downloadable '"+id+"'").verifySignature(o); if (e.kind!= Kind.OK) { - LOGGER.severe(e.renderHtml()); - throw e; + return e; } } @@ -266,8 +313,12 @@ public class DownloadService extends PageDecorator { df.write(json); df.file.setLastModified(dataTimestamp); LOGGER.info("Obtained the updated data file for "+id); + return FormValidation.ok(); + } - rsp.setContentType("text/plain"); // So browser won't try to parse response + @Restricted(NoExternalUse.class) + public FormValidation updateNow() throws IOException { + return load(loadJSON(new URL(getUrl() + "?id=" + URLEncoder.encode(getId(), "UTF-8") + "&version=" + URLEncoder.encode(Jenkins.VERSION, "UTF-8"))), System.currentTimeMillis()); } /** @@ -295,9 +346,7 @@ public class DownloadService extends PageDecorator { public static boolean neverUpdate = Boolean.getBoolean(DownloadService.class.getName()+".never"); - /** - * Off by default until we know this is reasonably working. - */ + /** @deprecated Use {@link DownloadSettings#setIgnoreSignature} instead. */ public static boolean signatureCheck = !Boolean.getBoolean(DownloadService.class.getName()+".noSignatureCheck"); } diff --git a/core/src/main/java/hudson/model/UpdateCenter.java b/core/src/main/java/hudson/model/UpdateCenter.java index 344ab98582..b7ec3a4e30 100644 --- a/core/src/main/java/hudson/model/UpdateCenter.java +++ b/core/src/main/java/hudson/model/UpdateCenter.java @@ -88,6 +88,7 @@ import java.util.jar.JarFile; import java.util.logging.Level; import java.util.logging.Logger; import javax.annotation.CheckForNull; +import jenkins.security.DownloadSettings; import org.acegisecurity.context.SecurityContextHolder; import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.restrictions.NoExternalUse; @@ -630,7 +631,7 @@ public class UpdateCenter extends AbstractModelObject implements Saveable, OnMas public List updateAllSites() throws InterruptedException, ExecutionException { List > futures = new ArrayList>(); for (UpdateSite site : getSites()) { - Future future = site.updateDirectly(true); + Future future = site.updateDirectly(DownloadSettings.get().isCheckSignature()); if (future != null) { futures.add(future); } diff --git a/core/src/main/java/hudson/model/UpdateSite.java b/core/src/main/java/hudson/model/UpdateSite.java index 5b85cf266e..1681aabab1 100644 --- a/core/src/main/java/hudson/model/UpdateSite.java +++ b/core/src/main/java/hudson/model/UpdateSite.java @@ -27,32 +27,18 @@ package hudson.model; import hudson.PluginManager; import hudson.PluginWrapper; -import hudson.ProxyConfiguration; import hudson.lifecycle.Lifecycle; import hudson.model.UpdateCenter.UpdateCenterJob; import hudson.util.FormValidation; import hudson.util.FormValidation.Kind; import hudson.util.HttpResponses; import hudson.util.TextFile; +import static hudson.util.TimeUnit2.*; import hudson.util.VersionNumber; -import jenkins.model.Jenkins; -import jenkins.util.JSONSignatureValidator; -import net.sf.json.JSONException; -import net.sf.json.JSONObject; -import org.apache.commons.lang.StringUtils; -import org.kohsuke.stapler.DataBoundConstructor; -import org.kohsuke.stapler.HttpResponse; -import org.kohsuke.stapler.StaplerRequest; -import org.kohsuke.stapler.export.Exported; -import org.kohsuke.stapler.export.ExportedBean; -import org.kohsuke.stapler.interceptor.RequirePOST; - import java.io.File; import java.io.IOException; -import java.io.InputStream; import java.net.URI; import java.net.URL; -import java.net.URLConnection; import java.net.URLEncoder; import java.security.GeneralSecurityException; import java.util.ArrayList; @@ -66,10 +52,23 @@ import java.util.concurrent.Callable; import java.util.concurrent.Future; import java.util.logging.Level; import java.util.logging.Logger; - -import static hudson.util.TimeUnit2.*; import org.apache.commons.io.IOUtils; - +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; +import jenkins.model.Jenkins; +import jenkins.security.DownloadSettings; +import jenkins.util.JSONSignatureValidator; +import net.sf.json.JSONException; +import net.sf.json.JSONObject; +import org.apache.commons.lang.StringUtils; +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.NoExternalUse; +import org.kohsuke.stapler.DataBoundConstructor; +import org.kohsuke.stapler.HttpResponse; +import org.kohsuke.stapler.StaplerRequest; +import org.kohsuke.stapler.export.Exported; +import org.kohsuke.stapler.export.ExportedBean; +import org.kohsuke.stapler.interceptor.RequirePOST; /** * Source of the update center information, like "http://jenkins-ci.org/update-center.json" @@ -154,42 +153,30 @@ public class UpdateSite { * @return null if no updates are necessary, or the future result * @since 1.502 */ - public Future updateDirectly(final boolean signatureCheck) { + public @CheckForNull Future updateDirectly(final boolean signatureCheck) { if (! getDataFile().exists() || isDue()) { return Jenkins.getInstance().getUpdateCenter().updateService.submit(new Callable() { - - public FormValidation call() throws Exception { - URL src = new URL(getUrl() + "?id=" + URLEncoder.encode(getId(),"UTF-8") - + "&version="+URLEncoder.encode(Jenkins.VERSION, "UTF-8")); - URLConnection conn = ProxyConfiguration.open(src); - InputStream is = conn.getInputStream(); - try { - String uncleanJson = IOUtils.toString(is,"UTF-8"); - int jsonStart = uncleanJson.indexOf("{\""); - if (jsonStart >= 0) { - uncleanJson = uncleanJson.substring(jsonStart); - int end = uncleanJson.lastIndexOf('}'); - if (end>0) - uncleanJson = uncleanJson.substring(0,end+1); - return updateData(uncleanJson, signatureCheck); - } else { - throw new IOException("Could not find json in content of " + - "update center from url: "+src.toExternalForm()); - } - } finally { - if (is != null) - is.close(); - } + @Override public FormValidation call() throws Exception { + return updateDirectlyNow(signatureCheck); } }); - } + } else { return null; + } + } + + @Restricted(NoExternalUse.class) + public @Nonnull FormValidation updateDirectlyNow(boolean signatureCheck) throws IOException { + return updateData(DownloadService.loadJSON(new URL(getUrl() + "?id=" + URLEncoder.encode(getId(), "UTF-8") + "&version=" + URLEncoder.encode(Jenkins.VERSION, "UTF-8"))), signatureCheck); } /** * This is the endpoint that receives the update center data file from the browser. */ public FormValidation doPostBack(StaplerRequest req) throws IOException, GeneralSecurityException { + if (!DownloadSettings.get().isUseBrowser()) { + throw new IOException("not allowed"); + } return updateData(IOUtils.toString(req.getInputStream(),"UTF-8"), true); } diff --git a/core/src/main/java/hudson/util/FormValidation.java b/core/src/main/java/hudson/util/FormValidation.java index 2816b3a55b..8190dab1f1 100644 --- a/core/src/main/java/hudson/util/FormValidation.java +++ b/core/src/main/java/hudson/util/FormValidation.java @@ -239,9 +239,13 @@ public abstract class FormValidation extends IOException implements HttpResponse return ok(); return new FormValidation(kind, message) { public String renderHtml() { + StaplerRequest req = Stapler.getCurrentRequest(); + if (req == null) { // being called from some other context + return message; + } // 1x16 spacer needed for IE since it doesn't support min-height return "
                "+ + req.getContextPath()+ Jenkins.RESOURCE_PATH+"/images/none.gif' height=16 width=1>"+ message+"
                "; } @Override public String toString() { diff --git a/core/src/main/java/jenkins/security/DownloadSettings.java b/core/src/main/java/jenkins/security/DownloadSettings.java new file mode 100644 index 0000000000..d620237468 --- /dev/null +++ b/core/src/main/java/jenkins/security/DownloadSettings.java @@ -0,0 +1,123 @@ +/* + * The MIT License + * + * Copyright 2014 Jesse Glick. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package jenkins.security; + +import hudson.Extension; +import hudson.model.AsyncPeriodicWork; +import hudson.model.DownloadService; +import hudson.model.TaskListener; +import hudson.model.UpdateSite; +import hudson.util.FormValidation; +import java.io.IOException; +import jenkins.model.GlobalConfiguration; +import jenkins.model.GlobalConfigurationCategory; +import jenkins.model.Jenkins; +import net.sf.json.JSONObject; +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.NoExternalUse; +import org.kohsuke.stapler.HttpResponse; +import org.kohsuke.stapler.QueryParameter; +import org.kohsuke.stapler.StaplerRequest; + +/** + * Lets user configure how metadata files should be downloaded. + * @see UpdateSite + * @see DownloadService + */ +@Restricted(NoExternalUse.class) // no clear reason for this to be an API +@Extension public final class DownloadSettings extends GlobalConfiguration { + + public static DownloadSettings get() { + return Jenkins.getInstance().getInjector().getInstance(DownloadSettings.class); + } + + private boolean useBrowser = true; // historical default, not necessarily recommended + @SuppressWarnings("deprecation") + private boolean checkSignature = DownloadService.signatureCheck; + + public DownloadSettings() { + load(); + } + + @Override public GlobalConfigurationCategory getCategory() { + return GlobalConfigurationCategory.get(GlobalConfigurationCategory.Security.class); + } + + @Override public boolean configure(StaplerRequest req, JSONObject json) throws FormException { + req.bindJSON(this, json); + return true; + } + + public boolean isUseBrowser() { + return useBrowser; + } + + public void setUseBrowser(boolean useBrowser) { + this.useBrowser = useBrowser; + save(); + } + + public boolean isCheckSignature() { + return checkSignature; + } + + public void setCheckSignature(boolean checkSignature) { + this.checkSignature = checkSignature; + save(); + } + + public FormValidation doCheckCheckSignature(@QueryParameter boolean value, @QueryParameter boolean useBrowser) { + if (value) { + return FormValidation.ok(); + } else if (useBrowser) { + return FormValidation.warningWithMarkup(Messages.DownloadSettings_disabling_signature_checks_for_in_browse()); + } else { + return FormValidation.warningWithMarkup(Messages.DownloadSettings_disabling_signature_checks_is_not_recomm()); + } + } + + @Extension public static final class DailyCheck extends AsyncPeriodicWork { + + public DailyCheck() { + super("Download metadata"); + } + + @Override public long getRecurrencePeriod() { + return DAY; + } + + @Override protected void execute(TaskListener listener) throws IOException, InterruptedException { + if (get().isUseBrowser()) { + return; + } + HttpResponse rsp = Jenkins.getInstance().getPluginManager().doCheckUpdatesServer(); + if (rsp instanceof FormValidation) { + listener.error(((FormValidation) rsp).renderHtml()); + } + } + + } + +} diff --git a/core/src/main/resources/hudson/PluginManager/advanced.jelly b/core/src/main/resources/hudson/PluginManager/advanced.jelly index 32c5316a39..79dc056fbc 100644 --- a/core/src/main/resources/hudson/PluginManager/advanced.jelly +++ b/core/src/main/resources/hudson/PluginManager/advanced.jelly @@ -96,7 +96,8 @@ THE SOFTWARE.
                -
                + + ${%lastUpdated(app.updateCenter.lastUpdatedString)} diff --git a/core/src/main/resources/hudson/model/UpdateCenter/PageDecoratorImpl/footer.jelly b/core/src/main/resources/hudson/model/UpdateCenter/PageDecoratorImpl/footer.jelly index e792c77836..1751517592 100644 --- a/core/src/main/resources/hudson/model/UpdateCenter/PageDecoratorImpl/footer.jelly +++ b/core/src/main/resources/hudson/model/UpdateCenter/PageDecoratorImpl/footer.jelly @@ -31,6 +31,8 @@ THE SOFTWARE. --> + + + diff --git a/core/src/main/resources/jenkins/security/DownloadSettings/config.groovy b/core/src/main/resources/jenkins/security/DownloadSettings/config.groovy new file mode 100644 index 0000000000..9b11a442ef --- /dev/null +++ b/core/src/main/resources/jenkins/security/DownloadSettings/config.groovy @@ -0,0 +1,12 @@ +package jenkins.security.DownloadSettings + +def f = namespace(lib.FormTagLib) + +f.section(title: _("Download Preferences")) { + f.entry(title: _("Use Browser"), field: "useBrowser") { + f.checkbox() + } + f.entry(title: _("Check Signatures"), field: "checkSignature") { + f.checkbox() + } +} diff --git a/core/src/main/resources/jenkins/security/DownloadSettings/help-checkSignature.html b/core/src/main/resources/jenkins/security/DownloadSettings/help-checkSignature.html new file mode 100644 index 0000000000..d639bbaf78 --- /dev/null +++ b/core/src/main/resources/jenkins/security/DownloadSettings/help-checkSignature.html @@ -0,0 +1,4 @@ +
                + Uncheck to skip the signature check on downloaded metadata. + This is generally dangerous and should only be used as an emergency measure when dealing with broken upstream metadata. +
                diff --git a/core/src/main/resources/jenkins/security/DownloadSettings/help-useBrowser.html b/core/src/main/resources/jenkins/security/DownloadSettings/help-useBrowser.html new file mode 100644 index 0000000000..2336961826 --- /dev/null +++ b/core/src/main/resources/jenkins/security/DownloadSettings/help-useBrowser.html @@ -0,0 +1,6 @@ +
                + Check to force the user’s browser to download metadata rather than Jenkins itself doing it. + Actual file downloads (plugins, tools) will still happen from Jenkins itself, + but this can be used to at least see new metadata when Jenkins cannot access the Internet + (but your own browser can, perhaps using some special proxy that Jenkins is not configured to use). +
                diff --git a/core/src/main/resources/jenkins/security/Messages.properties b/core/src/main/resources/jenkins/security/Messages.properties index fc71097d03..2c93ecc382 100644 --- a/core/src/main/resources/jenkins/security/Messages.properties +++ b/core/src/main/resources/jenkins/security/Messages.properties @@ -22,4 +22,6 @@ ApiTokenProperty.DisplayName=API Token ApiTokenProperty.ChangeToken.Success=
                Updated
                -RekeySecretAdminMonitor.DisplayName=Re-keying \ No newline at end of file +DownloadSettings.disabling_signature_checks_for_in_browse=Disabling signature checks for in-browser downloads is very dangerous as unprivileged users could submit spoofed metadata! +DownloadSettings.disabling_signature_checks_is_not_recomm=Disabling signature checks is not recommended except as a temporary measure when upstream metadata is broken, such as due to expired certificates. +RekeySecretAdminMonitor.DisplayName=Re-keying diff --git a/test/src/test/java/hudson/model/DownloadServiceTest.java b/test/src/test/java/hudson/model/DownloadServiceTest.java index 11f3f026a4..62958422f4 100644 --- a/test/src/test/java/hudson/model/DownloadServiceTest.java +++ b/test/src/test/java/hudson/model/DownloadServiceTest.java @@ -7,6 +7,7 @@ import org.jvnet.hudson.test.HudsonTestCase; import org.kohsuke.stapler.StaplerResponse; import java.io.IOException; +import jenkins.security.DownloadSettings; /** * @author Kohsuke Kawaguchi @@ -40,13 +41,13 @@ public class DownloadServiceTest extends HudsonTestCase { assertNull(job.getData()); // and now it should work - DownloadService.signatureCheck = false; + DownloadSettings.get().setCheckSignature(false); try { createWebClient().goTo("/self/testPost"); JSONObject d = job.getData(); assertEquals(hashCode(),d.getInt("hello")); } finally { - DownloadService.signatureCheck = true; + DownloadSettings.get().setCheckSignature(true); } // TODO: test with a signature From a47dc036d8ea06f162d8980223c1ca17bd2b961c Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Thu, 27 Feb 2014 16:54:16 -0500 Subject: [PATCH 138/701] Be a bit paranoid and ensure the admin has CONFIGURE_UPDATECENTER before turning off signature checks. (cherry picked from commit 1262d88289d94c1ee7d6736341ce354e948ceef7) --- core/src/main/java/jenkins/security/DownloadSettings.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/core/src/main/java/jenkins/security/DownloadSettings.java b/core/src/main/java/jenkins/security/DownloadSettings.java index d620237468..9961e64a06 100644 --- a/core/src/main/java/jenkins/security/DownloadSettings.java +++ b/core/src/main/java/jenkins/security/DownloadSettings.java @@ -25,6 +25,7 @@ package jenkins.security; import hudson.Extension; +import hudson.PluginManager; import hudson.model.AsyncPeriodicWork; import hudson.model.DownloadService; import hudson.model.TaskListener; @@ -84,6 +85,11 @@ import org.kohsuke.stapler.StaplerRequest; } public void setCheckSignature(boolean checkSignature) { + if (!checkSignature) { + // Just to be on the safe side. Normally this is implied by ADMINISTER, needed to configure the security screen anyway, + // but in case ADMINISTER but not CONFIGURE_UPDATECENTER is somehow granted, make sure signature checking cannot be disabled. + Jenkins.getInstance().checkPermission(PluginManager.CONFIGURE_UPDATECENTER); + } this.checkSignature = checkSignature; save(); } From 8c9910f2bba19076ff29216f993027ca77ee8675 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Thu, 27 Feb 2014 17:10:01 -0500 Subject: [PATCH 139/701] @kohsuke prefers that the option to disable signature checks not even be presented unless -Dhudson.model.DownloadService.noSignatureCheck is used. (cherry picked from commit 54c85007f355dadfbf8b0fc5924ded55f1614280) --- core/src/main/java/hudson/model/DownloadService.java | 2 +- .../jenkins/security/DownloadSettings/config.groovy | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/hudson/model/DownloadService.java b/core/src/main/java/hudson/model/DownloadService.java index 658e21a18d..2e592d8222 100644 --- a/core/src/main/java/hudson/model/DownloadService.java +++ b/core/src/main/java/hudson/model/DownloadService.java @@ -346,7 +346,7 @@ public class DownloadService extends PageDecorator { public static boolean neverUpdate = Boolean.getBoolean(DownloadService.class.getName()+".never"); - /** @deprecated Use {@link DownloadSettings#setIgnoreSignature} instead. */ + /** Now used only to set default value of, and enable UI switching of, {@link DownloadSettings#setIgnoreSignature}. */ public static boolean signatureCheck = !Boolean.getBoolean(DownloadService.class.getName()+".noSignatureCheck"); } diff --git a/core/src/main/resources/jenkins/security/DownloadSettings/config.groovy b/core/src/main/resources/jenkins/security/DownloadSettings/config.groovy index 9b11a442ef..90c81a0dab 100644 --- a/core/src/main/resources/jenkins/security/DownloadSettings/config.groovy +++ b/core/src/main/resources/jenkins/security/DownloadSettings/config.groovy @@ -6,7 +6,9 @@ f.section(title: _("Download Preferences")) { f.entry(title: _("Use Browser"), field: "useBrowser") { f.checkbox() } - f.entry(title: _("Check Signatures"), field: "checkSignature") { - f.checkbox() + if (!instance.checkSignature || !hudson.model.DownloadService.signatureCheck) { // do not display this option by default + f.entry(title: _("Check Signatures"), field: "checkSignature") { + f.checkbox() + } } } From 01ba28d0a2ca3f9c0a9b5b1571a5f81be600573f Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Fri, 28 Feb 2014 10:19:15 -0500 Subject: [PATCH 140/701] Testing the loadJSON method directly to make sure various JSONP formats are handled. (cherry picked from commit fb5241451337b2c084d8c7772c1d0552a0cc0169) --- .../hudson/model/DownloadServiceTest.java | 34 +- .../hudson.tasks.Maven.MavenInstaller.json | 137 + .../model/hudson.tools.JDKInstaller.json | 5925 +++++++++++++++++ 3 files changed, 6087 insertions(+), 9 deletions(-) create mode 100644 test/src/test/resources/hudson/model/hudson.tasks.Maven.MavenInstaller.json create mode 100644 test/src/test/resources/hudson/model/hudson.tools.JDKInstaller.json diff --git a/test/src/test/java/hudson/model/DownloadServiceTest.java b/test/src/test/java/hudson/model/DownloadServiceTest.java index 62958422f4..50ff400070 100644 --- a/test/src/test/java/hudson/model/DownloadServiceTest.java +++ b/test/src/test/java/hudson/model/DownloadServiceTest.java @@ -1,14 +1,17 @@ package hudson.model; import hudson.model.DownloadService.Downloadable; +import java.io.IOException; +import java.net.URL; +import java.util.Set; +import java.util.TreeSet; +import jenkins.security.DownloadSettings; import net.sf.json.JSONObject; import org.jvnet.hudson.test.Bug; import org.jvnet.hudson.test.HudsonTestCase; +import org.jvnet.hudson.test.WithoutJenkins; import org.kohsuke.stapler.StaplerResponse; -import java.io.IOException; -import jenkins.security.DownloadSettings; - /** * @author Kohsuke Kawaguchi */ @@ -21,18 +24,15 @@ public class DownloadServiceTest extends HudsonTestCase { @Override protected void setUp() throws Exception { super.setUp(); + if (jenkins == null) { + return; + } // this object receives the submission. // to bypass the URL restriction, we'll trigger downloadService.download ourselves job = new Downloadable("test", "UNUSED"); Downloadable.all().add(job); } - @Override - protected void tearDown() throws Exception { - Downloadable.all().remove(job); - super.tearDown(); - } - @Bug(5536) public void testPost() throws Exception { // initially it should fail because the data doesn't have a signature @@ -60,4 +60,20 @@ public class DownloadServiceTest extends HudsonTestCase { rsp.setContentType("application/javascript"); rsp.getWriter().println("downloadService.post('test',{'hello':"+hashCode()+"})"); } + + @WithoutJenkins // could have been in core/src/test/ but update-center.json was already in test/src/test/ (used by UpdateSiteTest) + public void testLoadJSON() throws Exception { + assertRoots("[list]", "hudson.tasks.Maven.MavenInstaller.json"); // format used by most tools + assertRoots("[data, version]", "hudson.tools.JDKInstaller.json"); // anomalous format + assertRoots("[connectionCheckUrl, core, id, plugins, signature, updateCenterVersion]", "update-center.json"); + } + + private static void assertRoots(String expected, String file) throws Exception { + URL resource = DownloadServiceTest.class.getResource(file); + assertNotNull(file, resource); + JSONObject json = JSONObject.fromObject(DownloadService.loadJSON(resource)); + @SuppressWarnings("unchecked") Set keySet = json.keySet(); + assertEquals(expected, new TreeSet(keySet).toString()); + } + } diff --git a/test/src/test/resources/hudson/model/hudson.tasks.Maven.MavenInstaller.json b/test/src/test/resources/hudson/model/hudson.tasks.Maven.MavenInstaller.json new file mode 100644 index 0000000000..ff0d77bf6a --- /dev/null +++ b/test/src/test/resources/hudson/model/hudson.tasks.Maven.MavenInstaller.json @@ -0,0 +1,137 @@ +downloadService.post('hudson.tasks.Maven.MavenInstaller',{"list": [ + { + "id": "3.1.1", + "name": "3.1.1", + "url": "http://archive.apache.org/dist/maven/binaries/apache-maven-3.1.1-bin.zip" + }, + { + "id": "3.1.0", + "name": "3.1.0", + "url": "http://archive.apache.org/dist/maven/binaries/apache-maven-3.1.0-bin.zip" + }, + { + "id": "3.0.5", + "name": "3.0.5", + "url": "http://archive.apache.org/dist/maven/binaries/apache-maven-3.0.5-bin.zip" + }, + { + "id": "3.0.4", + "name": "3.0.4", + "url": "http://archive.apache.org/dist/maven/binaries/apache-maven-3.0.4-bin.zip" + }, + { + "id": "3.0.3", + "name": "3.0.3", + "url": "http://archive.apache.org/dist/maven/binaries/apache-maven-3.0.3-bin.zip" + }, + { + "id": "3.0.2", + "name": "3.0.2", + "url": "http://archive.apache.org/dist/maven/binaries/apache-maven-3.0.2-bin.zip" + }, + { + "id": "3.0.1", + "name": "3.0.1", + "url": "http://archive.apache.org/dist/maven/binaries/apache-maven-3.0.1-bin.zip" + }, + { + "id": "3.0", + "name": "3.0", + "url": "http://archive.apache.org/dist/maven/binaries/apache-maven-3.0-bin.zip" + }, + { + "id": "2.2.1", + "name": "2.2.1", + "url": "http://archive.apache.org/dist/maven/binaries/apache-maven-2.2.1-bin.zip" + }, + { + "id": "2.2.0", + "name": "2.2.0", + "url": "http://archive.apache.org/dist/maven/binaries/apache-maven-2.2.0-bin.zip" + }, + { + "id": "2.1.0", + "name": "2.1.0", + "url": "http://archive.apache.org/dist/maven/binaries/apache-maven-2.1.0-bin.zip" + }, + { + "id": "2.0.11", + "name": "2.0.11", + "url": "http://archive.apache.org/dist/maven/binaries/apache-maven-2.0.11-bin.zip" + }, + { + "id": "2.0.10", + "name": "2.0.10", + "url": "http://archive.apache.org/dist/maven/binaries/apache-maven-2.0.10-bin.zip" + }, + { + "id": "2.0.9", + "name": "2.0.9", + "url": "http://archive.apache.org/dist/maven/binaries/apache-maven-2.0.9-bin.zip" + }, + { + "id": "2.0.8", + "name": "2.0.8", + "url": "http://archive.apache.org/dist/maven/binaries/apache-maven-2.0.8-bin.zip" + }, + { + "id": "2.0.7", + "name": "2.0.7", + "url": "http://archive.apache.org/dist/maven/binaries/maven-2.0.7-bin.zip" + }, + { + "id": "2.0.6", + "name": "2.0.6", + "url": "http://archive.apache.org/dist/maven/binaries/maven-2.0.6-bin.zip" + }, + { + "id": "2.0.5", + "name": "2.0.5", + "url": "http://archive.apache.org/dist/maven/binaries/maven-2.0.5-bin.zip" + }, + { + "id": "2.0.4", + "name": "2.0.4", + "url": "http://archive.apache.org/dist/maven/binaries/maven-2.0.4-bin.zip" + }, + { + "id": "2.0.3", + "name": "2.0.3", + "url": "http://archive.apache.org/dist/maven/binaries/maven-2.0.3-bin.zip" + }, + { + "id": "2.0.2", + "name": "2.0.2", + "url": "http://archive.apache.org/dist/maven/binaries/maven-2.0.2-bin.zip" + }, + { + "id": "2.0.1", + "name": "2.0.1", + "url": "http://archive.apache.org/dist/maven/binaries/maven-2.0.1-bin.zip" + }, + { + "id": "2.0", + "name": "2.0", + "url": "http://archive.apache.org/dist/maven/binaries/maven-2.0-bin.zip" + }, + { + "id": "1.1", + "name": "1.1", + "url": "http://archive.apache.org/dist/maven/binaries/maven-1.1.zip" + }, + { + "id": "1.0.2", + "name": "1.0.2", + "url": "http://archive.apache.org/dist/maven/binaries/maven-1.0.2.zip" + }, + { + "id": "1.0.1", + "name": "1.0.1", + "url": "http://archive.apache.org/dist/maven/binaries/maven-1.0.1.zip" + }, + { + "id": "1.0", + "name": "1.0", + "url": "http://archive.apache.org/dist/maven/binaries/maven-1.0.zip" + } +]}) \ No newline at end of file diff --git a/test/src/test/resources/hudson/model/hudson.tools.JDKInstaller.json b/test/src/test/resources/hudson/model/hudson.tools.JDKInstaller.json new file mode 100644 index 0000000000..7b7e24f831 --- /dev/null +++ b/test/src/test/resources/hudson/model/hudson.tools.JDKInstaller.json @@ -0,0 +1,5925 @@ +downloadService.post('hudson.tools.JDKInstaller',{ + "data": [ + { + "name": "JDK 7", + "releases": [ + { + "files": [ + { + "filepath": "http://download.oracle.com/otn-pub/java/jdk/7u51-b13/jdk-7u51-linux-arm-vfp-hflt.tar.gz", + "name": "jdk-7u51-linux-arm-vfp-hflt.tar.gz", + "title": "Linux ARM v6/v7 Hard Float ABI" + }, + { + "filepath": "http://download.oracle.com/otn-pub/java/jdk/7u51-b13/jdk-7u51-linux-arm-vfp-sflt.tar.gz", + "name": "jdk-7u51-linux-arm-vfp-sflt.tar.gz", + "title": "Linux ARM v6/v7 Soft Float ABI" + }, + { + "filepath": "http://download.oracle.com/otn-pub/java/jdk/7u51-b13/jdk-7u51-linux-i586.tar.gz", + "name": "jdk-7u51-linux-i586.tar.gz", + "title": "Linux x86" + }, + { + "filepath": "http://download.oracle.com/otn-pub/java/jdk/7u51-b13/jdk-7u51-linux-x64.tar.gz", + "name": "jdk-7u51-linux-x64.tar.gz", + "title": "Linux x64" + }, + { + "filepath": "http://download.oracle.com/otn-pub/java/jdk/7u51-b13/jdk-7u51-macosx-x64.dmg", + "name": "jdk-7u51-macosx-x64.dmg", + "title": "Mac OS X x64" + }, + { + "filepath": "http://download.oracle.com/otn-pub/java/jdk/7u51-b13/jdk-7u51-solaris-i586.tar.gz", + "name": "jdk-7u51-solaris-i586.tar.gz", + "title": "Solaris x86" + }, + { + "filepath": "http://download.oracle.com/otn-pub/java/jdk/7u51-b13/jdk-7u51-solaris-sparc.tar.gz", + "name": "jdk-7u51-solaris-sparc.tar.gz", + "title": "Solaris SPARC" + }, + { + "filepath": "http://download.oracle.com/otn-pub/java/jdk/7u51-b13/jdk-7u51-solaris-sparcv9.tar.gz", + "name": "jdk-7u51-solaris-sparcv9.tar.gz", + "title": "Solaris SPARC 64-bit" + }, + { + "filepath": "http://download.oracle.com/otn-pub/java/jdk/7u51-b13/jdk-7u51-solaris-x64.tar.gz", + "name": "jdk-7u51-solaris-x64.tar.gz", + "title": "Solaris x64" + }, + { + "filepath": "http://download.oracle.com/otn-pub/java/jdk/7u51-b13/jdk-7u51-windows-i586.exe", + "name": "jdk-7u51-windows-i586.exe", + "title": "Windows x86" + }, + { + "filepath": "http://download.oracle.com/otn-pub/java/jdk/7u51-b13/jdk-7u51-windows-x64.exe", + "name": "jdk-7u51-windows-x64.exe", + "title": "Windows x64" + } + ], + "licpath": "/technetwork/java/javase/terms/license", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "jdk-7u51-oth-JPR", + "title": "Java SE Development Kit 7u51" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u45-b18/jdk-7u45-linux-arm-vfp-hflt.tar.gz", + "name": "jdk-7u45-linux-arm-vfp-hflt.tar.gz", + "title": "Linux ARM v6/v7 Hard Float ABI" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u45-b18/jdk-7u45-linux-arm-vfp-sflt.tar.gz", + "name": "jdk-7u45-linux-arm-vfp-sflt.tar.gz", + "title": "Linux ARM v6/v7 Soft Float ABI" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u45-b18/jdk-7u45-linux-i586.tar.gz", + "name": "jdk-7u45-linux-i586.tar.gz", + "title": "Linux x86" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u45-b18/jdk-7u45-linux-x64.tar.gz", + "name": "jdk-7u45-linux-x64.tar.gz", + "title": "Linux x64" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u45-b18/jdk-7u45-macosx-x64.dmg", + "name": "jdk-7u45-macosx-x64.dmg", + "title": "Mac OS X x64" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u45-b18/jdk-7u45-solaris-i586.tar.gz", + "name": "jdk-7u45-solaris-i586.tar.gz", + "title": "Solaris x86" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u45-b18/jdk-7u45-solaris-sparc.tar.gz", + "name": "jdk-7u45-solaris-sparc.tar.gz", + "title": "Solaris SPARC" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u45-b18/jdk-7u45-solaris-sparcv9.tar.gz", + "name": "jdk-7u45-solaris-sparcv9.tar.gz", + "title": "Solaris SPARC 64-bit" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u45-b18/jdk-7u45-solaris-x64.tar.gz", + "name": "jdk-7u45-solaris-x64.tar.gz", + "title": "Solaris x64" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u45-b18/jdk-7u45-windows-i586.exe", + "name": "jdk-7u45-windows-i586.exe", + "title": "Windows x86" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u45-b18/jdk-7u45-windows-x64.exe", + "name": "jdk-7u45-windows-x64.exe", + "title": "Windows x64" + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "jdk-7u45-oth-JPR", + "title": "Java SE Development Kit 7u45" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u40-b43/jdk-7u40-linux-arm-vfp-hflt.tar.gz", + "name": "jdk-7u40-linux-arm-vfp-hflt.tar.gz", + "title": "Linux ARM v7 Hard Float ABI" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u40-b43/jdk-7u40-linux-arm-vfp-sflt.tar.gz", + "name": "jdk-7u40-linux-arm-vfp-sflt.tar.gz", + "title": "Linux ARM v6/v7 Soft Float ABI" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u40-b43/jdk-7u40-linux-i586.tar.gz", + "name": "jdk-7u40-linux-i586.tar.gz", + "title": "Linux x86" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u40-b43/jdk-7u40-linux-x64.tar.gz", + "name": "jdk-7u40-linux-x64.tar.gz", + "title": "Linux x64" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u40-b43/jdk-7u40-macosx-x64.dmg", + "name": "jdk-7u40-macosx-x64.dmg", + "title": "Mac OS X x64" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u40-b43/jdk-7u40-solaris-i586.tar.gz", + "name": "jdk-7u40-solaris-i586.tar.gz", + "title": "Solaris x86" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u40-b43/jdk-7u40-solaris-sparc.tar.gz", + "name": "jdk-7u40-solaris-sparc.tar.gz", + "title": "Solaris SPARC" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u40-b43/jdk-7u40-solaris-sparcv9.tar.gz", + "name": "jdk-7u40-solaris-sparcv9.tar.gz", + "title": "Solaris SPARC 64-bit" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u40-b43/jdk-7u40-solaris-x64.tar.gz", + "name": "jdk-7u40-solaris-x64.tar.gz", + "title": "Solaris x64" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u40-b43/jdk-7u40-windows-i586.exe", + "name": "jdk-7u40-windows-i586.exe", + "title": "Windows x86" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u40-b43/jdk-7u40-windows-x64.exe", + "name": "jdk-7u40-windows-x64.exe", + "title": "Windows x64" + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "jdk-7u40-oth-JPR", + "title": "Java SE Development Kit 7u40" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u25-b15/jdk-7u25-linux-i586.tar.gz", + "name": "jdk-7u25-linux-i586.tar.gz", + "title": "Linux x86" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u25-b15/jdk-7u25-linux-x64.tar.gz", + "name": "jdk-7u25-linux-x64.tar.gz", + "title": "Linux x64" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u25-b15/jdk-7u25-macosx-x64.dmg", + "name": "jdk-7u25-macosx-x64.dmg", + "title": "Mac OS X x64" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u25-b15/jdk-7u25-solaris-i586.tar.gz", + "name": "jdk-7u25-solaris-i586.tar.gz", + "title": "Solaris x86" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u25-b15/jdk-7u25-solaris-sparc.tar.gz", + "name": "jdk-7u25-solaris-sparc.tar.gz", + "title": "Solaris SPARC" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u25-b15/jdk-7u25-solaris-sparcv9.tar.gz", + "name": "jdk-7u25-solaris-sparcv9.tar.gz", + "title": "Solaris SPARC 64-bit" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u25-b15/jdk-7u25-solaris-x64.tar.gz", + "name": "jdk-7u25-solaris-x64.tar.gz", + "title": "Solaris x64" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u25-b17/jdk-7u25-windows-i586.exe", + "name": "jdk-7u25-windows-i586.exe", + "title": "Windows x86" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u25-b17/jdk-7u25-windows-x64.exe", + "name": "jdk-7u25-windows-x64.exe", + "title": "Windows x64" + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "jdk-7u25-oth-JPR", + "title": "Java SE Development Kit 7u25" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u21-b11/jdk-7u21-linux-arm-sfp.tar.gz", + "name": "jdk-7u21-linux-arm-sfp.tar.gz", + "title": "Linux ARM v6/v7 Soft Float ABI" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u21-b11/jdk-7u21-linux-i586.tar.gz", + "name": "jdk-7u21-linux-i586.tar.gz", + "title": "Linux x86" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u21-b11/jdk-7u21-linux-x64.tar.gz", + "name": "jdk-7u21-linux-x64.tar.gz", + "title": "Linux x64" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u21-b12/jdk-7u21-macosx-x64.dmg", + "name": "jdk-7u21-macosx-x64.dmg", + "title": "Mac OS X x64" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u21-b11/jdk-7u21-solaris-i586.tar.gz", + "name": "jdk-7u21-solaris-i586.tar.gz", + "title": "Solaris x86" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u21-b11/jdk-7u21-solaris-sparc.tar.gz", + "name": "jdk-7u21-solaris-sparc.tar.gz", + "title": "Solaris SPARC" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u21-b11/jdk-7u21-solaris-sparcv9.tar.gz", + "name": "jdk-7u21-solaris-sparcv9.tar.gz", + "title": "Solaris SPARC 64-bit" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u21-b11/jdk-7u21-solaris-x64.tar.gz", + "name": "jdk-7u21-solaris-x64.tar.gz", + "title": "Solaris x64" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u21-b11/jdk-7u21-windows-i586.exe", + "name": "jdk-7u21-windows-i586.exe", + "title": "Windows x86" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u21-b11/jdk-7u21-windows-x64.exe", + "name": "jdk-7u21-windows-x64.exe", + "title": "Windows x64" + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "jdk-7u21-oth-JPR", + "title": "Java SE Development Kit 7u21" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u17-b02/jdk-7u17-linux-i586.tar.gz", + "name": "jdk-7u17-linux-i586.tar.gz", + "title": "Linux x86" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u17-b02/jdk-7u17-linux-x64.tar.gz", + "name": "jdk-7u17-linux-x64.tar.gz", + "title": "Linux x64" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u17-b02/jdk-7u17-macosx-x64.dmg", + "name": "jdk-7u17-macosx-x64.dmg", + "title": "Mac OS X x64" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u17-b02/jdk-7u17-solaris-i586.tar.gz", + "name": "jdk-7u17-solaris-i586.tar.gz", + "title": "Solaris x86" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u17-b02/jdk-7u17-solaris-sparc.tar.gz", + "name": "jdk-7u17-solaris-sparc.tar.gz", + "title": "Solaris SPARC" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u17-b02/jdk-7u17-solaris-sparcv9.tar.gz", + "name": "jdk-7u17-solaris-sparcv9.tar.gz", + "title": "Solaris SPARC 64-bit" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u17-b02/jdk-7u17-solaris-x64.tar.gz", + "name": "jdk-7u17-solaris-x64.tar.gz", + "title": "Solaris x64" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u17-b02/jdk-7u17-windows-i586.exe", + "name": "jdk-7u17-windows-i586.exe", + "title": "Windows x86" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u17-b02/jdk-7u17-windows-x64.exe", + "name": "jdk-7u17-windows-x64.exe", + "title": "Windows x64" + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "jdk-7u17-oth-JPR", + "title": "Java SE Development Kit 7u17" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u15-b03/jdk-7u15-linux-i586.tar.gz", + "name": "jdk-7u15-linux-i586.tar.gz", + "title": "Linux x86" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u15-b03/jdk-7u15-linux-x64.tar.gz", + "name": "jdk-7u15-linux-x64.tar.gz", + "title": "Linux x64" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u15-b03/jdk-7u15-macosx-x64.dmg", + "name": "jdk-7u15-macosx-x64.dmg", + "title": "Mac OS X x64" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u15-b03/jdk-7u15-solaris-i586.tar.gz", + "name": "jdk-7u15-solaris-i586.tar.gz", + "title": "Solaris x86" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u15-b03/jdk-7u15-solaris-sparc.tar.gz", + "name": "jdk-7u15-solaris-sparc.tar.gz", + "title": "Solaris SPARC" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u15-b03/jdk-7u15-solaris-sparcv9.tar.gz", + "name": "jdk-7u15-solaris-sparcv9.tar.gz", + "title": "Solaris SPARC 64-bit" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u15-b03/jdk-7u15-solaris-x64.tar.gz", + "name": "jdk-7u15-solaris-x64.tar.gz", + "title": "Solaris x64" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u15-b03/jdk-7u15-windows-i586.exe", + "name": "jdk-7u15-windows-i586.exe", + "title": "Windows x86" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u15-b03/jdk-7u15-windows-x64.exe", + "name": "jdk-7u15-windows-x64.exe", + "title": "Windows x64" + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "jdk-7u15-oth-JPR", + "title": "Java SE Development Kit 7u15" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u13-b20/jdk-7u13-linux-i586.tar.gz", + "name": "jdk-7u13-linux-i586.tar.gz", + "title": "Linux x86" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u13-b20/jdk-7u13-linux-x64.tar.gz", + "name": "jdk-7u13-linux-x64.tar.gz", + "title": "Linux x64" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u13-b20/jdk-7u13-macosx-x64.dmg", + "name": "jdk-7u13-macosx-x64.dmg", + "title": "Mac OS X x64" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u13-b20/jdk-7u13-solaris-i586.tar.gz", + "name": "jdk-7u13-solaris-i586.tar.gz", + "title": "Solaris x86" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u13-b20/jdk-7u13-solaris-sparc.tar.gz", + "name": "jdk-7u13-solaris-sparc.tar.gz", + "title": "Solaris SPARC" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u13-b20/jdk-7u13-solaris-sparcv9.tar.gz", + "name": "jdk-7u13-solaris-sparcv9.tar.gz", + "title": "Solaris SPARC 64-bit" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u13-b20/jdk-7u13-solaris-x64.tar.gz", + "name": "jdk-7u13-solaris-x64.tar.gz", + "title": "Solaris x64" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u13-b20/jdk-7u13-windows-i586.exe", + "name": "jdk-7u13-windows-i586.exe", + "title": "Windows x86" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u13-b20/jdk-7u13-windows-x64.exe", + "name": "jdk-7u13-windows-x64.exe", + "title": "Windows x64" + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "jdk-7u13-oth-JPR", + "title": "Java SE Development Kit 7u13" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u11-b21/jdk-7u11-linux-i586.tar.gz", + "name": "jdk-7u11-linux-i586.tar.gz", + "title": "Linux x86" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u11-b21/jdk-7u11-linux-x64.tar.gz", + "name": "jdk-7u11-linux-x64.tar.gz", + "title": "Linux x64" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u11-b21/jdk-7u11-macosx-x64.dmg", + "name": "jdk-7u11-macosx-x64.dmg", + "title": "Mac OS X x64" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u11-b21/jdk-7u11-macosx-x64.tar.gz", + "name": "jdk-7u11-macosx-x64.tar.gz", + "title": "Mac OS X x64" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u11-b21/jdk-7u11-solaris-i586.tar.gz", + "name": "jdk-7u11-solaris-i586.tar.gz", + "title": "Solaris x86" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u11-b21/jdk-7u11-solaris-sparc.tar.gz", + "name": "jdk-7u11-solaris-sparc.tar.gz", + "title": "Solaris SPARC" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u11-b21/jdk-7u11-solaris-sparcv9.tar.gz", + "name": "jdk-7u11-solaris-sparcv9.tar.gz", + "title": "Solaris SPARC 64-bit" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u11-b21/jdk-7u11-solaris-x64.tar.gz", + "name": "jdk-7u11-solaris-x64.tar.gz", + "title": "Solaris x64" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u11-b21/jdk-7u11-windows-i586.exe", + "name": "jdk-7u11-windows-i586.exe", + "title": "Windows x86" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u11-b21/jdk-7u11-windows-x64.exe", + "name": "jdk-7u11-windows-x64.exe", + "title": "Windows x64" + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "jdk-7u11-oth-JPR", + "title": "Java SE Development Kit 7u11" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u10-b18/jdk-7u10-linux-arm-sfp.tar.gz", + "name": "jdk-7u10-linux-arm-sfp.tar.gz", + "title": "Linux ARM" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u10-b18/jdk-7u10-linux-i586.tar.gz", + "name": "jdk-7u10-linux-i586.tar.gz", + "title": "Linux x86" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u10-b18/jdk-7u10-linux-x64.tar.gz", + "name": "jdk-7u10-linux-x64.tar.gz", + "title": "Linux x64" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u10-b18/jdk-7u10-macosx-x64.dmg", + "name": "jdk-7u10-macosx-x64.dmg", + "title": "Mac OS X x64" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u10-b18/jdk-7u10-solaris-i586.tar.gz", + "name": "jdk-7u10-solaris-i586.tar.gz", + "title": "Solaris x86" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u10-b18/jdk-7u10-solaris-sparc.tar.gz", + "name": "jdk-7u10-solaris-sparc.tar.gz", + "title": "Solaris SPARC" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u10-b18/jdk-7u10-solaris-sparcv9.tar.gz", + "name": "jdk-7u10-solaris-sparcv9.tar.gz", + "title": "Solaris SPARC 64-bit" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u10-b18/jdk-7u10-solaris-x64.tar.gz", + "name": "jdk-7u10-solaris-x64.tar.gz", + "title": "Solaris x64" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u10-b18/jdk-7u10-windows-i586.exe", + "name": "jdk-7u10-windows-i586.exe", + "title": "Windows x86" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u10-b18/jdk-7u10-windows-x64.exe", + "name": "jdk-7u10-windows-x64.exe", + "title": "Windows x64" + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "jdk-7u10-oth-JPR", + "title": "Java SE Development Kit 7u10" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u9-b05/jdk-7u9-linux-i586.tar.gz", + "name": "jdk-7u9-linux-i586.tar.gz", + "title": "Linux x86" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u9-b05/jdk-7u9-linux-x64.tar.gz", + "name": "jdk-7u9-linux-x64.tar.gz", + "title": "Linux x64" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u9-b05/jdk-7u9-macosx-x64.dmg", + "name": "jdk-7u9-macosx-x64.dmg", + "title": "Mac OS X" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u9-b05/jdk-7u9-solaris-i586.tar.gz", + "name": "jdk-7u9-solaris-i586.tar.gz", + "title": "Solaris x86" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u9-b05/jdk-7u9-solaris-sparc.tar.gz", + "name": "jdk-7u9-solaris-sparc.tar.gz", + "title": "Solaris SPARC" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u9-b05/jdk-7u9-solaris-sparcv9.tar.gz", + "name": "jdk-7u9-solaris-sparcv9.tar.gz", + "title": "Solaris SPARC 64-bit" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u9-b05/jdk-7u9-solaris-x64.tar.gz", + "name": "jdk-7u9-solaris-x64.tar.gz", + "title": "Solaris x64" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u9-b05/jdk-7u9-windows-i586.exe", + "name": "jdk-7u9-windows-i586.exe", + "title": "Windows x86" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u9-b05/jdk-7u9-windows-x64.exe", + "name": "jdk-7u9-windows-x64.exe", + "title": "Windows x64" + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "jdk-7u9-oth-JPR", + "title": "Java SE Development Kit 7u9" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u7-b10/jdk-7u7-linux-i586.tar.gz", + "name": "jdk-7u7-linux-i586.tar.gz", + "title": "Linux x86" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u7-b10/jdk-7u7-linux-x64.tar.gz", + "name": "jdk-7u7-linux-x64.tar.gz", + "title": "Linux x64" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u7-b10/jdk-7u7-macosx-x64.dmg", + "name": "jdk-7u7-macosx-x64.dmg", + "title": "Mac OS X x64" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u7-b10/jdk-7u7-solaris-i586.tar.gz", + "name": "jdk-7u7-solaris-i586.tar.gz", + "title": "Solaris x86" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u7-b10/jdk-7u7-solaris-sparc.tar.gz", + "name": "jdk-7u7-solaris-sparc.tar.gz", + "title": "Solaris SPARC" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u7-b10/jdk-7u7-solaris-sparcv9.tar.gz", + "name": "jdk-7u7-solaris-sparcv9.tar.gz", + "title": "Solaris SPARC 64-bit" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u7-b10/jdk-7u7-solaris-x64.tar.gz", + "name": "jdk-7u7-solaris-x64.tar.gz", + "title": "Solaris x64" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u7-b11/jdk-7u7-windows-i586.exe", + "name": "jdk-7u7-windows-i586.exe", + "title": "Windows x86" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u7-b11/jdk-7u7-windows-x64.exe", + "name": "jdk-7u7-windows-x64.exe", + "title": "Windows x64" + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "jdk-7u7-oth-JPR", + "title": "Java SE Development Kit 7u7" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u6-b24/jdk-7u6-linux-arm-sfp.tar.gz", + "name": "jdk-7u6-linux-arm-sfp.tar.gz", + "title": "Linux ARM" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u6-b24/jdk-7u6-linux-i586.tar.gz", + "name": "jdk-7u6-linux-i586.tar.gz", + "title": "Linux x86" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u6-b24/jdk-7u6-linux-x64.tar.gz", + "name": "jdk-7u6-linux-x64.tar.gz", + "title": "Linux x64" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u6-b24/jdk-7u6-macosx-x64.dmg", + "name": "jdk-7u6-macosx-x64.dmg", + "title": "Mac OS X x64" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u6-b24/jdk-7u6-solaris-i586.tar.gz", + "name": "jdk-7u6-solaris-i586.tar.gz", + "title": "Solaris x86" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u6-b24/jdk-7u6-solaris-sparc.tar.gz", + "name": "jdk-7u6-solaris-sparc.tar.gz", + "title": "Solaris SPARC" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u6-b24/jdk-7u6-solaris-sparcv9.tar.gz", + "name": "jdk-7u6-solaris-sparcv9.tar.gz", + "title": "Solaris SPARC 64-bit" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u6-b24/jdk-7u6-solaris-x64.tar.gz", + "name": "jdk-7u6-solaris-x64.tar.gz", + "title": "Solaris x64" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u6-b24/jdk-7u6-windows-i586.exe", + "name": "jdk-7u6-windows-i586.exe", + "title": "Windows x86" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u6-b24/jdk-7u6-windows-x64.exe", + "name": "jdk-7u6-windows-x64.exe", + "title": "Windows x64" + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "jdk-7u6-oth-JPR", + "title": "Java SE Development Kit 7u6" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u5-b06/jdk-7u5-linux-i586.tar.gz", + "name": "jdk-7u5-linux-i586.tar.gz", + "title": "Linux x86" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u5-b06/jdk-7u5-linux-x64.tar.gz", + "name": "jdk-7u5-linux-x64.tar.gz", + "title": "Linux x64" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u5-b06/jdk-7u5-macosx-x64.dmg", + "name": "jdk-7u5-macosx-x64.dmg", + "title": "Mac OS X x64" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u5-b06/jdk-7u5-solaris-i586.tar.gz", + "name": "jdk-7u5-solaris-i586.tar.gz", + "title": "Solaris x86" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u5-b06/jdk-7u5-solaris-sparc.tar.gz", + "name": "jdk-7u5-solaris-sparc.tar.gz", + "title": "Solaris SPARC" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u5-b06/jdk-7u5-solaris-sparcv9.tar.gz", + "name": "jdk-7u5-solaris-sparcv9.tar.gz", + "title": "Solaris SPARC 64-bit" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u5-b06/jdk-7u5-solaris-x64.tar.gz", + "name": "jdk-7u5-solaris-x64.tar.gz", + "title": "Solaris x64" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u5-b06/jdk-7u5-windows-i586.exe", + "name": "jdk-7u5-windows-i586.exe", + "title": "Windows x86" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u5-b06/jdk-7u5-windows-x64.exe", + "name": "jdk-7u5-windows-x64.exe", + "title": "Windows x64" + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "jdk-7u5-oth-JPR", + "title": "Java SE Development Kit 7u5" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u4-b20/jdk-7u4-linux-i586.tar.gz", + "name": "jdk-7u4-linux-i586.tar.gz", + "title": "Linux x86" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u4-b20/jdk-7u4-linux-x64.tar.gz", + "name": "jdk-7u4-linux-x64.tar.gz", + "title": "Linux x64" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u4-b21/jdk-7u4-macosx-x64.dmg", + "name": "jdk-7u4-macosx-x64.dmg", + "title": "Macosx-x64" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u4-b20/jdk-7u4-solaris-i586.tar.gz", + "name": "jdk-7u4-solaris-i586.tar.gz", + "title": "Solaris x86" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u4-b20/jdk-7u4-solaris-sparc.tar.gz", + "name": "jdk-7u4-solaris-sparc.tar.gz", + "title": "Solaris SPARC" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u4-b20/jdk-7u4-solaris-sparcv9.tar.gz", + "name": "jdk-7u4-solaris-sparcv9.tar.gz", + "title": "Solaris SPARC 64-bit" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u4-b20/jdk-7u4-solaris-x64.tar.gz", + "name": "jdk-7u4-solaris-x64.tar.gz", + "title": "Solaris x64" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u4-b22/jdk-7u4-windows-i586.exe", + "name": "jdk-7u4-windows-i586.exe", + "title": "Windows x86" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u4-b22/jdk-7u4-windows-x64.exe", + "name": "jdk-7u4-windows-x64.exe", + "title": "Windows x64" + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "jdk-7u4-oth-JPR", + "title": "Java SE Development Kit 7u4" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u3-b04/jdk-7u3-linux-i586.tar.gz", + "name": "jdk-7u3-linux-i586.tar.gz", + "title": "Linux x86 (32-bit)" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u3-b04/jdk-7u3-linux-x64.tar.gz", + "name": "jdk-7u3-linux-x64.tar.gz", + "title": "Linux x64 (64-bit)" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u3-b04/jdk-7u3-solaris-i586.tar.gz", + "name": "jdk-7u3-solaris-i586.tar.gz", + "title": "Solaris x86 (32-bit)" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u3-b04/jdk-7u3-solaris-sparc.tar.gz", + "name": "jdk-7u3-solaris-sparc.tar.gz", + "title": "Solaris SPARC (32-bit)" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u3-b04/jdk-7u3-solaris-sparcv9.tar.gz", + "name": "jdk-7u3-solaris-sparcv9.tar.gz", + "title": "Solaris SPARC (64-bit)" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u3-b04/jdk-7u3-solaris-x64.tar.gz", + "name": "jdk-7u3-solaris-x64.tar.gz", + "title": "Solaris x64 (64-bit)" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u3-b05/jdk-7u3-windows-i586.exe", + "name": "jdk-7u3-windows-i586.exe", + "title": "Windows x86 (32-bit)" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u3-b05/jdk-7u3-windows-x64.exe", + "name": "jdk-7u3-windows-x64.exe", + "title": "Windows x64 (64-bit)" + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "jdk-7u3-oth-JPR", + "title": "Java SE Development Kit 7u3" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u2-b13/jdk-7u2-linux-i586.tar.gz", + "name": "jdk-7u2-linux-i586.tar.gz", + "title": "Linux x86" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u2-b13/jdk-7u2-linux-x64.tar.gz", + "name": "jdk-7u2-linux-x64.tar.gz", + "title": "Linux x64" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u2-b13/jdk-7u2-solaris-i586.tar.gz", + "name": "jdk-7u2-solaris-i586.tar.gz", + "title": "Solaris x86" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u2-b13/jdk-7u2-solaris-sparc.tar.gz", + "name": "jdk-7u2-solaris-sparc.tar.gz", + "title": "Solaris SPARC" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u2-b13/jdk-7u2-solaris-sparcv9.tar.gz", + "name": "jdk-7u2-solaris-sparcv9.tar.gz", + "title": "Solaris SPARC 64-bit" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u2-b13/jdk-7u2-solaris-x64.tar.gz", + "name": "jdk-7u2-solaris-x64.tar.gz", + "title": "Solaris x64" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u2-b13/jdk-7u2-windows-i586.exe", + "name": "jdk-7u2-windows-i586.exe", + "title": "Windows x86" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u2-b13/jdk-7u2-windows-x64.exe", + "name": "jdk-7u2-windows-x64.exe", + "title": "Windows x64" + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "jdk-7u2-oth-JPR", + "title": "Java SE Development Kit 7u2" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u1-b08/jdk-7u1-linux-i586.tar.gz", + "name": "jdk-7u1-linux-i586.tar.gz", + "title": "Linux x86" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u1-b08/jdk-7u1-linux-x64.tar.gz", + "name": "jdk-7u1-linux-x64.tar.gz", + "title": "Linux x64" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u1-b08/jdk-7u1-solaris-i586.tar.gz", + "name": "jdk-7u1-solaris-i586.tar.gz", + "title": "Solaris x86" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u1-b08/jdk-7u1-solaris-sparc.tar.gz", + "name": "jdk-7u1-solaris-sparc.tar.gz", + "title": "Solaris SPARC" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u1-b08/jdk-7u1-solaris-sparcv9.tar.gz", + "name": "jdk-7u1-solaris-sparcv9.tar.gz", + "title": "Solaris SPARC 64-bit" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u1-b08/jdk-7u1-solaris-x64.tar.gz", + "name": "jdk-7u1-solaris-x64.tar.gz", + "title": "Solaris x64" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u1-b08/jdk-7u1-windows-i586.exe", + "name": "jdk-7u1-windows-i586.exe", + "title": "Windows x86" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7u1-b08/jdk-7u1-windows-x64.exe", + "name": "jdk-7u1-windows-x64.exe", + "title": "Windows x64" + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "jdk-7u1-oth-JPR", + "title": "Java SE Development Kit 7u1" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/jdk/7/jdk-7-linux-i586.tar.gz", + "name": "jdk-7-linux-i586.tar.gz", + "title": "Linux x86 - Compressed Binary" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7/jdk-7-linux-x64.tar.gz", + "name": "jdk-7-linux-x64.tar.gz", + "title": "Linux x64 - Compressed Binary" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7/jdk-7-solaris-i586.tar.gz", + "name": "jdk-7-solaris-i586.tar.gz", + "title": "Solaris x86 - Compressed Binary" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7/jdk-7-solaris-sparc.tar.gz", + "name": "jdk-7-solaris-sparc.tar.gz", + "title": "Solaris SPARC - Compressed Binary" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7/jdk-7-solaris-sparcv9.tar.gz", + "name": "jdk-7-solaris-sparcv9.tar.gz", + "title": "Solaris SPARC 64-bit - Compressed Binary" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7/jdk-7-solaris-x64.tar.gz", + "name": "jdk-7-solaris-x64.tar.gz", + "title": "Solaris x64 - Compressed Binary" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7/jdk-7-windows-i586.exe", + "name": "jdk-7-windows-i586.exe", + "title": "Windows x86" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/7/jdk-7-windows-x64.exe", + "name": "jdk-7-windows-x64.exe", + "title": "Windows x64" + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "jdk-7-oth-JPR", + "title": "Java SE Development Kit 7" + } + ] + }, + { + "name": "JDK 6", + "releases": [ + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u45-b06/jdk-6u45-linux-i586.bin", + "name": "jdk-6u45-linux-i586.bin", + "title": "Linux x86" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u45-b06/jdk-6u45-linux-ia64.bin", + "name": "jdk-6u45-linux-ia64.bin", + "title": "Linux Intel Itanium" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u45-b06/jdk-6u45-linux-x64.bin", + "name": "jdk-6u45-linux-x64.bin", + "title": "Linux x64" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u45-b06/jdk-6u45-solaris-i586.sh", + "name": "jdk-6u45-solaris-i586.sh", + "title": "Solaris x86" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u45-b06/jdk-6u45-solaris-sparc.sh", + "name": "jdk-6u45-solaris-sparc.sh", + "title": "Solaris SPARC" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u45-b06/jdk-6u45-solaris-sparcv9.sh", + "name": "jdk-6u45-solaris-sparcv9.sh", + "title": "Solaris SPARC 64-bit" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u45-b06/jdk-6u45-solaris-x64.sh", + "name": "jdk-6u45-solaris-x64.sh", + "title": "Solaris x64" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u45-b06/jdk-6u45-windows-i586.exe", + "name": "jdk-6u45-windows-i586.exe", + "title": "Windows x86" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u45-b06/jdk-6u45-windows-ia64.exe", + "name": "jdk-6u45-windows-ia64.exe", + "title": "Windows Intel Itanium" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u45-b06/jdk-6u45-windows-x64.exe", + "name": "jdk-6u45-windows-x64.exe", + "title": "Windows x64" + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "jdk-6u45-oth-JPR", + "title": "Java SE Development Kit 6u45" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u43-b01/jdk-6u43-linux-i586.bin", + "name": "jdk-6u43-linux-i586.bin", + "title": "Linux x86" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u43-b01/jdk-6u43-linux-ia64.bin", + "name": "jdk-6u43-linux-ia64.bin", + "title": "Linux Intel Itanium" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u43-b01/jdk-6u43-linux-x64.bin", + "name": "jdk-6u43-linux-x64.bin", + "title": "Linux x64" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u43-b01/jdk-6u43-solaris-i586.sh", + "name": "jdk-6u43-solaris-i586.sh", + "title": "Solaris x86" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u43-b01/jdk-6u43-solaris-sparc.sh", + "name": "jdk-6u43-solaris-sparc.sh", + "title": "Solaris SPARC" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u43-b01/jdk-6u43-solaris-sparcv9.sh", + "name": "jdk-6u43-solaris-sparcv9.sh", + "title": "Solaris SPARC 64-bit" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u43-b01/jdk-6u43-solaris-x64.sh", + "name": "jdk-6u43-solaris-x64.sh", + "title": "Solaris x64" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u43-b01/jdk-6u43-windows-i586.exe", + "name": "jdk-6u43-windows-i586.exe", + "title": "Windows x86" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u43-b01/jdk-6u43-windows-ia64.exe", + "name": "jdk-6u43-windows-ia64.exe", + "title": "Windows Intel Itanium" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u43-b01/jdk-6u43-windows-x64.exe", + "name": "jdk-6u43-windows-x64.exe", + "title": "Windows x64" + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "jdk-6u43-oth-JPR", + "title": "Java SE Development Kit 6u43" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u41-b02/jdk-6u41-linux-i586.bin", + "name": "jdk-6u41-linux-i586.bin", + "title": "Linux x86" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u41-b02/jdk-6u41-linux-ia64.bin", + "name": "jdk-6u41-linux-ia64.bin", + "title": "Linux Intel Itanium" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u41-b02/jdk-6u41-linux-x64.bin", + "name": "jdk-6u41-linux-x64.bin", + "title": "Linux x64" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u41-b02/jdk-6u41-solaris-i586.sh", + "name": "jdk-6u41-solaris-i586.sh", + "title": "Solaris x86" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u41-b02/jdk-6u41-solaris-sparc.sh", + "name": "jdk-6u41-solaris-sparc.sh", + "title": "Solaris SPARC" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u41-b02/jdk-6u41-solaris-sparcv9.sh", + "name": "jdk-6u41-solaris-sparcv9.sh", + "title": "Solaris SPARC 64-bit" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u41-b02/jdk-6u41-solaris-x64.sh", + "name": "jdk-6u41-solaris-x64.sh", + "title": "Solaris x64" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u41-b02/jdk-6u41-windows-i586.exe", + "name": "jdk-6u41-windows-i586.exe", + "title": "Windows x86" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u41-b02/jdk-6u41-windows-ia64.exe", + "name": "jdk-6u41-windows-ia64.exe", + "title": "Windows Intel Itanium" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u41-b02/jdk-6u41-windows-x64.exe", + "name": "jdk-6u41-windows-x64.exe", + "title": "Windows x64" + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "jdk-6u41-oth-JPR", + "title": "Java SE Development Kit 6u41" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u39-b04/jdk-6u39-linux-i586.bin", + "name": "jdk-6u39-linux-i586.bin", + "title": "Linux x86" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u39-b04/jdk-6u39-linux-ia64.bin", + "name": "jdk-6u39-linux-ia64.bin", + "title": "Linux Intel Itanium" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u39-b04/jdk-6u39-linux-x64.bin", + "name": "jdk-6u39-linux-x64.bin", + "title": "Linux x64" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u39-b04/jdk-6u39-solaris-i586.sh", + "name": "jdk-6u39-solaris-i586.sh", + "title": "Solaris x86" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u39-b04/jdk-6u39-solaris-sparc.sh", + "name": "jdk-6u39-solaris-sparc.sh", + "title": "Solaris SPARC" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u39-b04/jdk-6u39-solaris-sparcv9.sh", + "name": "jdk-6u39-solaris-sparcv9.sh", + "title": "Solaris SPARC 64-bit" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u39-b04/jdk-6u39-solaris-x64.sh", + "name": "jdk-6u39-solaris-x64.sh", + "title": "Solaris x64" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u39-b04/jdk-6u39-windows-i586.exe", + "name": "jdk-6u39-windows-i586.exe", + "title": "Windows x86" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u39-b04/jdk-6u39-windows-ia64.exe", + "name": "jdk-6u39-windows-ia64.exe", + "title": "Windows Intel Itanium" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u39-b04/jdk-6u39-windows-x64.exe", + "name": "jdk-6u39-windows-x64.exe", + "title": "Windows x64" + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "jdk-6u39-oth-JPR", + "title": "Java SE Development Kit 6u39" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u38-b05/jdk-6u38-linux-i586.bin", + "name": "jdk-6u38-linux-i586.bin", + "title": "Linux x86" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u38-b05/jdk-6u38-linux-x64.bin", + "name": "jdk-6u38-linux-x64.bin", + "title": "Linux x64" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u38-b05/jdk-6u38-solaris-i586.sh", + "name": "jdk-6u38-solaris-i586.sh", + "title": "Solaris x86" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u38-b05/jdk-6u38-solaris-sparc.sh", + "name": "jdk-6u38-solaris-sparc.sh", + "title": "Solaris SPARC" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u38-b05/jdk-6u38-solaris-sparcv9.sh", + "name": "jdk-6u38-solaris-sparcv9.sh", + "title": "Solaris SPARC 64-bit" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u38-b05/jdk-6u38-solaris-x64.sh", + "name": "jdk-6u38-solaris-x64.sh", + "title": "Solaris x64" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u38-b05/jdk-6u38-windows-i586.exe", + "name": "jdk-6u38-windows-i586.exe", + "title": "Windows x86" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u38-b05/jdk-6u38-windows-x64.exe", + "name": "jdk-6u38-windows-x64.exe", + "title": "Windows x64" + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "jdk-6u38-oth-JPR", + "title": "Java SE Development Kit 6u38" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u37-b06/jdk-6u37-linux-i586.bin", + "name": "jdk-6u37-linux-i586.bin", + "title": "Linux x86" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u37-b06/jdk-6u37-linux-ia64.bin", + "name": "jdk-6u37-linux-ia64.bin", + "title": "Linux Intel Itanium" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u37-b06/jdk-6u37-linux-x64.bin", + "name": "jdk-6u37-linux-x64.bin", + "title": "Linux x64" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u37-b06/jdk-6u37-solaris-i586.sh", + "name": "jdk-6u37-solaris-i586.sh", + "title": "Solaris x86" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u37-b06/jdk-6u37-solaris-sparc.sh", + "name": "jdk-6u37-solaris-sparc.sh", + "title": "Solaris SPARC" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u37-b06/jdk-6u37-solaris-sparcv9.sh", + "name": "jdk-6u37-solaris-sparcv9.sh", + "title": "Solaris SPARC 64-bit" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u37-b06/jdk-6u37-solaris-x64.sh", + "name": "jdk-6u37-solaris-x64.sh", + "title": "Solaris x64" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u37-b06/jdk-6u37-windows-i586.exe", + "name": "jdk-6u37-windows-i586.exe", + "title": "Windows x86" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u37-b06/jdk-6u37-windows-ia64.exe", + "name": "jdk-6u37-windows-ia64.exe", + "title": "Windows Intel Itanium" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u37-b06/jdk-6u37-windows-x64.exe", + "name": "jdk-6u37-windows-x64.exe", + "title": "Windows x64" + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "jdk-6u37-oth-JPR", + "title": "Java SE Development Kit 6u37" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u35-b10/jdk-6u35-linux-i586.bin", + "name": "jdk-6u35-linux-i586.bin", + "title": "Linux x86" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u35-b10/jdk-6u35-linux-ia64.bin", + "name": "jdk-6u35-linux-ia64.bin", + "title": "Linux Intel Itanium" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u35-b10/jdk-6u35-linux-x64.bin", + "name": "jdk-6u35-linux-x64.bin", + "title": "Linux x64" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u35-b10/jdk-6u35-solaris-i586.sh", + "name": "jdk-6u35-solaris-i586.sh", + "title": "Solaris x86" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u35-b10/jdk-6u35-solaris-sparc.sh", + "name": "jdk-6u35-solaris-sparc.sh", + "title": "Solaris SPARC" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u35-b10/jdk-6u35-solaris-sparcv9.sh", + "name": "jdk-6u35-solaris-sparcv9.sh", + "title": "Solaris SPARC 64-bit" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u35-b10/jdk-6u35-solaris-x64.sh", + "name": "jdk-6u35-solaris-x64.sh", + "title": "Solaris x64" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u35-b10/jdk-6u35-windows-i586.exe", + "name": "jdk-6u35-windows-i586.exe", + "title": "Windows x86" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u35-b10/jdk-6u35-windows-ia64.exe", + "name": "jdk-6u35-windows-ia64.exe", + "title": "Windows Intel Itanium" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u35-b10/jdk-6u35-windows-x64.exe", + "name": "jdk-6u35-windows-x64.exe", + "title": "Windows x64" + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "jdk-6u35-oth-JPR", + "title": "Java SE Development Kit 6u35" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u34-b04/jdk-6u34-linux-i586.bin", + "name": "jdk-6u34-linux-i586.bin", + "title": "Linux x86" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u34-b04/jdk-6u34-linux-x64.bin", + "name": "jdk-6u34-linux-x64.bin", + "title": "Linux x64" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u34-b04/jdk-6u34-solaris-i586.sh", + "name": "jdk-6u34-solaris-i586.sh", + "title": "Solaris x86" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u34-b04/jdk-6u34-solaris-sparc.sh", + "name": "jdk-6u34-solaris-sparc.sh", + "title": "Solaris SPARC" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u34-b04/jdk-6u34-solaris-sparcv9.sh", + "name": "jdk-6u34-solaris-sparcv9.sh", + "title": "Solaris SPARC 64-bit" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u34-b04/jdk-6u34-solaris-x64.sh", + "name": "jdk-6u34-solaris-x64.sh", + "title": "Solaris x64" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u34-b04/jdk-6u34-windows-i586.exe", + "name": "jdk-6u34-windows-i586.exe", + "title": "Windows x86" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u34-b04/jdk-6u34-windows-x64.exe", + "name": "jdk-6u34-windows-x64.exe", + "title": "Windows x64" + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "jdk-6u34-oth-JPR", + "title": "Java SE Development Kit 6u34" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u33-b04/jdk-6u33-linux-i586.bin", + "name": "jdk-6u33-linux-i586.bin", + "title": "Linux x86" + }, + { + "filepath": "http://download.oracle.com/otn-pub/java/jdk/6u33-b03/jdk-6u33-linux-ia64.bin", + "name": "jdk-6u33-linux-ia64.bin", + "title": "Linux Intel Itanium" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u33-b04/jdk-6u33-linux-x64.bin", + "name": "jdk-6u33-linux-x64.bin", + "title": "Linux x64" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u33-b04/jdk-6u33-solaris-i586.sh", + "name": "jdk-6u33-solaris-i586.sh", + "title": "Solaris x86" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u33-b04/jdk-6u33-solaris-sparc.sh", + "name": "jdk-6u33-solaris-sparc.sh", + "title": "Solaris SPARC" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u33-b04/jdk-6u33-solaris-sparcv9.sh", + "name": "jdk-6u33-solaris-sparcv9.sh", + "title": "Solaris SPARC 64-bit" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u33-b04/jdk-6u33-solaris-x64.sh", + "name": "jdk-6u33-solaris-x64.sh", + "title": "Solaris x64" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u33-b05/jdk-6u33-windows-i586.exe", + "name": "jdk-6u33-windows-i586.exe", + "title": "Windows x86" + }, + { + "filepath": "http://download.oracle.com/otn-pub/java/jdk/6u33-b03/jdk-6u33-windows-ia64.exe", + "name": "jdk-6u33-windows-ia64.exe", + "title": "Windows Intel Itanium" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u33-b05/jdk-6u33-windows-x64.exe", + "name": "jdk-6u33-windows-x64.exe", + "title": "Windows x64" + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "jdk-6u33-oth-JPR", + "title": "Java SE Development Kit 6u33" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u32-b05/jdk-6u32-linux-i586.bin", + "name": "jdk-6u32-linux-i586.bin", + "title": "Linux x86" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u32-b05/jdk-6u32-linux-x64.bin", + "name": "jdk-6u32-linux-x64.bin", + "title": "Linux x64" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u32-b05/jdk-6u32-solaris-i586.sh", + "name": "jdk-6u32-solaris-i586.sh", + "title": "Solaris x86" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u32-b05/jdk-6u32-solaris-sparc.sh", + "name": "jdk-6u32-solaris-sparc.sh", + "title": "Solaris SPARC" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u32-b05/jdk-6u32-solaris-sparcv9.sh", + "name": "jdk-6u32-solaris-sparcv9.sh", + "title": "Solaris SPARC 64-bit" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u32-b05/jdk-6u32-solaris-x64.sh", + "name": "jdk-6u32-solaris-x64.sh", + "title": "Solaris x64" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u32-b05/jdk-6u32-windows-i586.exe", + "name": "jdk-6u32-windows-i586.exe", + "title": "Windows x86" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u32-b05/jdk-6u32-windows-x64.exe", + "name": "jdk-6u32-windows-x64.exe", + "title": "Windows x64" + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "jdk-6u32-oth-JPR", + "title": "Java SE Development Kit 6u32" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u31-b04/jdk-6u31-linux-i586.bin", + "name": "jdk-6u31-linux-i586.bin", + "title": "Linux x86 (32-bit)" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u31-b04/jdk-6u31-linux-ia64.bin", + "name": "jdk-6u31-linux-ia64.bin", + "title": "Linux Intel Itanium (64-bit)" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u31-b04/jdk-6u31-linux-x64.bin", + "name": "jdk-6u31-linux-x64.bin", + "title": "Linux x64 (64-bit)" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u31-b04/jdk-6u31-solaris-i586.sh", + "name": "jdk-6u31-solaris-i586.sh", + "title": "Solaris x86 (32-bit)" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u31-b04/jdk-6u31-solaris-sparc.sh", + "name": "jdk-6u31-solaris-sparc.sh", + "title": "Solaris SPARC (32-bit)" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u31-b04/jdk-6u31-solaris-sparcv9.sh", + "name": "jdk-6u31-solaris-sparcv9.sh", + "title": "Solaris SPARC (64-bit)" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u31-b04/jdk-6u31-solaris-x64.sh", + "name": "jdk-6u31-solaris-x64.sh", + "title": "Solaris x64 (64-bit)" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u31-b05/jdk-6u31-windows-i586.exe", + "name": "jdk-6u31-windows-i586.exe", + "title": "Windows x86 (32-bit)" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u31-b05/jdk-6u31-windows-ia64.exe", + "name": "jdk-6u31-windows-ia64.exe", + "title": "Windows Intel Itanium (64-bit)" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u31-b05/jdk-6u31-windows-x64.exe", + "name": "jdk-6u31-windows-x64.exe", + "title": "Windows x64 (64-bit)" + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "jdk-6u31-oth-JPR", + "title": "Java SE Development Kit 6u31" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u30-b12/jdk-6u30-linux-i586.bin", + "name": "jdk-6u30-linux-i586.bin", + "title": "Linux x86" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u30-b12/jdk-6u30-linux-x64.bin", + "name": "jdk-6u30-linux-x64.bin", + "title": "Linux x64" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u30-b12/jdk-6u30-solaris-i586.sh", + "name": "jdk-6u30-solaris-i586.sh", + "title": "Solaris x86" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u30-b12/jdk-6u30-solaris-sparc.sh", + "name": "jdk-6u30-solaris-sparc.sh", + "title": "Solaris SPARC" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u30-b12/jdk-6u30-solaris-sparcv9.sh", + "name": "jdk-6u30-solaris-sparcv9.sh", + "title": "Solaris SPARC 64-bit" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u30-b12/jdk-6u30-solaris-x64.sh", + "name": "jdk-6u30-solaris-x64.sh", + "title": "Solaris x64" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u30-b12/jdk-6u30-windows-i586.exe", + "name": "jdk-6u30-windows-i586.exe", + "title": "Windows x86" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u30-b12/jdk-6u30-windows-x64.exe", + "name": "jdk-6u30-windows-x64.exe", + "title": "Windows x64" + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "jdk-6u30-oth-JPR", + "title": "Java SE Development Kit 6u30" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u29-b11/jdk-6u29-linux-i586.bin", + "name": "jdk-6u29-linux-i586.bin", + "title": "Linux x86" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u29-b11/jdk-6u29-linux-ia64.bin", + "name": "jdk-6u29-linux-ia64.bin", + "title": "Linux Intel Itanium" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u29-b11/jdk-6u29-linux-x64.bin", + "name": "jdk-6u29-linux-x64.bin", + "title": "Linux x64" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u29-b11/jdk-6u29-solaris-i586.sh", + "name": "jdk-6u29-solaris-i586.sh", + "title": "Solaris x86" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u29-b11/jdk-6u29-solaris-sparc.sh", + "name": "jdk-6u29-solaris-sparc.sh", + "title": "Solaris SPARC" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u29-b11/jdk-6u29-solaris-sparcv9.sh", + "name": "jdk-6u29-solaris-sparcv9.sh", + "title": "Solaris SPARC 64-bit" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u29-b11/jdk-6u29-solaris-x64.sh", + "name": "jdk-6u29-solaris-x64.sh", + "title": "Solaris x64" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u29-b11/jdk-6u29-windows-i586.exe", + "name": "jdk-6u29-windows-i586.exe", + "title": "Windows x86" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u29-b11/jdk-6u29-windows-ia64.exe", + "name": "jdk-6u29-windows-ia64.exe", + "title": "Windows Intel Itanium" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u29-b11/jdk-6u29-windows-x64.exe", + "name": "jdk-6u29-windows-x64.exe", + "title": "Windows x64" + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "jdk-6u29-oth-JPR", + "path": "http://download.oracle.com/otn/java/jdk/6u29-b11/", + "title": "Java SE Development Kit 6u29" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u27-b07/jdk-6u27-linux-i586.bin", + "name": "jdk-6u27-linux-i586.bin", + "title": "Linux x86 - Self Extracting Installer" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u27-b07/jdk-6u27-linux-x64.bin", + "name": "jdk-6u27-linux-x64.bin", + "title": "Linux x64 - Self Extracting Installer" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u27-b07/jdk-6u27-solaris-i586.sh", + "name": "jdk-6u27-solaris-i586.sh", + "title": "Solaris x86 - Self Extracting Binary" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u27-b07/jdk-6u27-solaris-sparc.sh", + "name": "jdk-6u27-solaris-sparc.sh", + "title": "Solaris SPARC - Self Extracting Binary" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u27-b07/jdk-6u27-solaris-sparcv9.sh", + "name": "jdk-6u27-solaris-sparcv9.sh", + "title": "Solaris SPARC 64-bit - Self Extracting Binary" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u27-b07/jdk-6u27-solaris-x64.sh", + "name": "jdk-6u27-solaris-x64.sh", + "title": "Solaris x64 - Self Extracting Binary" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u27-b07/jdk-6u27-windows-i586.exe", + "name": "jdk-6u27-windows-i586.exe", + "title": "Windows x86" + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u27-b07/jdk-6u27-windows-x64.exe", + "name": "jdk-6u27-windows-x64.exe", + "title": "Windows x64" + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "jdk-6u27-oth-JPR", + "path": "http://download.oracle.com/otn/java/jdk/6u27-b07/", + "title": "Java SE Development Kit 6u27" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u26-b03/jdk-6u26-linux-i586.bin", + "name": "jdk-6u26-linux-i586.bin", + "title": "Java SE Development Kit 6u26 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u26-b03/jdk-6u26-linux-ia64.bin", + "name": "jdk-6u26-linux-ia64.bin", + "title": "Java SE Development Kit 6u26 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u26-b03/jdk-6u26-linux-x64.bin", + "name": "jdk-6u26-linux-x64.bin", + "title": "Java SE Development Kit 6u26 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u26-b03/jdk-6u26-solaris-i586.sh", + "name": "jdk-6u26-solaris-i586.sh", + "title": "Java SE Development Kit 6u26 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u26-b03/jdk-6u26-solaris-sparc.sh", + "name": "jdk-6u26-solaris-sparc.sh", + "title": "Java SE Development Kit 6u26 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u26-b03/jdk-6u26-solaris-sparcv9.sh", + "name": "jdk-6u26-solaris-sparcv9.sh", + "title": "Java SE Development Kit 6u26 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u26-b03/jdk-6u26-solaris-x64.sh", + "name": "jdk-6u26-solaris-x64.sh", + "title": "Java SE Development Kit 6u26 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u26-b03/jdk-6u26-windows-i586.exe", + "name": "jdk-6u26-windows-i586.exe", + "title": "Java SE Development Kit 6u26 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u26-b03/jdk-6u26-windows-ia64.exe", + "name": "jdk-6u26-windows-ia64.exe", + "title": "Java SE Development Kit 6u26 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u26-b03/jdk-6u26-windows-x64.exe", + "name": "jdk-6u26-windows-x64.exe", + "title": "Java SE Development Kit 6u26 " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "jdk-6u26-oth-JPR", + "title": "Java SE Development Kit 6u26" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u25-b06/jdk-6u25-linux-i586.bin", + "name": "jdk-6u25-linux-i586.bin", + "title": "Java SE Development Kit 6u25 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u25-b06/jdk-6u25-linux-x64.bin", + "name": "jdk-6u25-linux-x64.bin", + "title": "Java SE Development Kit 6u25 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u25-b06/jdk-6u25-solaris-i586.sh", + "name": "jdk-6u25-solaris-i586.sh", + "title": "Java SE Development Kit 6u25 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u25-b06/jdk-6u25-solaris-sparc.sh", + "name": "jdk-6u25-solaris-sparc.sh", + "title": "Java SE Development Kit 6u25 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u25-b06/jdk-6u25-solaris-sparcv9.sh", + "name": "jdk-6u25-solaris-sparcv9.sh", + "title": "Java SE Development Kit 6u25 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u25-b06/jdk-6u25-solaris-x64.sh", + "name": "jdk-6u25-solaris-x64.sh", + "title": "Java SE Development Kit 6u25 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u25-b06/jdk-6u25-windows-i586.exe", + "name": "jdk-6u25-windows-i586.exe", + "title": "Java SE Development Kit 6u25 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u25-b06/jdk-6u25-windows-x64.exe", + "name": "jdk-6u25-windows-x64.exe", + "title": "Java SE Development Kit 6u25 " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "jdk-6u25-oth-JPR", + "title": "Java SE Development Kit 6u25" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u24-b07/jdk-6u24-linux-i586.bin", + "name": "jdk-6u24-linux-i586.bin", + "title": "Java SE Development Kit 6u24 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u24-b07/jdk-6u24-linux-ia64.bin", + "name": "jdk-6u24-linux-ia64.bin", + "title": "Java SE Development Kit 6u24 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u24-b07/jdk-6u24-linux-x64.bin", + "name": "jdk-6u24-linux-x64.bin", + "title": "Java SE Development Kit 6u24 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u24-b07/jdk-6u24-solaris-i586.sh", + "name": "jdk-6u24-solaris-i586.sh", + "title": "Java SE Development Kit 6u24 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u24-b07/jdk-6u24-solaris-sparc.sh", + "name": "jdk-6u24-solaris-sparc.sh", + "title": "Java SE Development Kit 6u24 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u24-b07/jdk-6u24-solaris-sparcv9.sh", + "name": "jdk-6u24-solaris-sparcv9.sh", + "title": "Java SE Development Kit 6u24 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u24-b07/jdk-6u24-solaris-x64.sh", + "name": "jdk-6u24-solaris-x64.sh", + "title": "Java SE Development Kit 6u24 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u24-b07/jdk-6u24-windows-i586.exe", + "name": "jdk-6u24-windows-i586.exe", + "title": "Java SE Development Kit 6u24 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u24-b07/jdk-6u24-windows-ia64.exe", + "name": "jdk-6u24-windows-ia64.exe", + "title": "Java SE Development Kit 6u24 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u24-b07/jdk-6u24-windows-x64.exe", + "name": "jdk-6u24-windows-x64.exe", + "title": "Java SE Development Kit 6u24 " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "jdk-6u24-oth-JPR", + "title": "Java SE Development Kit 6u24" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u23-b05/jdk-6u23-linux-i586.bin", + "name": "jdk-6u23-linux-i586.bin", + "title": "Java SE Development Kit 6u23 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u23-b05/jdk-6u23-linux-x64.bin", + "name": "jdk-6u23-linux-x64.bin", + "title": "Java SE Development Kit 6u23 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u23-b05/jdk-6u23-solaris-i586.sh", + "name": "jdk-6u23-solaris-i586.sh", + "title": "Java SE Development Kit 6u23 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u23-b05/jdk-6u23-solaris-sparc.sh", + "name": "jdk-6u23-solaris-sparc.sh", + "title": "Java SE Development Kit 6u23 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u23-b05/jdk-6u23-solaris-sparcv9.sh", + "name": "jdk-6u23-solaris-sparcv9.sh", + "title": "Java SE Development Kit 6u23 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u23-b05/jdk-6u23-solaris-x64.sh", + "name": "jdk-6u23-solaris-x64.sh", + "title": "Java SE Development Kit 6u23 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u23-b05/jdk-6u23-windows-i586.exe", + "name": "jdk-6u23-windows-i586.exe", + "title": "Java SE Development Kit 6u23 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u23-b05/jdk-6u23-windows-x64.exe", + "name": "jdk-6u23-windows-x64.exe", + "title": "Java SE Development Kit 6u23 " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "jdk-6u23-oth-JPR", + "title": "Java SE Development Kit 6u23" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u22-b04/jdk-6u22-linux-i586.bin", + "name": "jdk-6u22-linux-i586.bin", + "title": "Java SE Development Kit 6u22 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u22-b04/jdk-6u22-linux-ia64.bin", + "name": "jdk-6u22-linux-ia64.bin", + "title": "Java SE Development Kit 6u22 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u22-b04/jdk-6u22-linux-x64.bin", + "name": "jdk-6u22-linux-x64.bin", + "title": "Java SE Development Kit 6u22 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u22-b04/jdk-6u22-solaris-i586.sh", + "name": "jdk-6u22-solaris-i586.sh", + "title": "Java SE Development Kit 6u22 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u22-b04/jdk-6u22-solaris-sparc.sh", + "name": "jdk-6u22-solaris-sparc.sh", + "title": "Java SE Development Kit 6u22 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u22-b04/jdk-6u22-solaris-sparcv9.sh", + "name": "jdk-6u22-solaris-sparcv9.sh", + "title": "Java SE Development Kit 6u22 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u22-b04/jdk-6u22-solaris-x64.sh", + "name": "jdk-6u22-solaris-x64.sh", + "title": "Java SE Development Kit 6u22 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u22-b04/jdk-6u22-windows-i586.exe", + "name": "jdk-6u22-windows-i586.exe", + "title": "Java SE Development Kit 6u22 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u22-b04/jdk-6u22-windows-ia64.exe", + "name": "jdk-6u22-windows-ia64.exe", + "title": "Java SE Development Kit 6u22 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u22-b04/jdk-6u22-windows-x64.exe", + "name": "jdk-6u22-windows-x64.exe", + "title": "Java SE Development Kit 6u22 " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "jdk-6u22-oth-JPR", + "title": "Java SE Development Kit 6u22" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u21-b07/jdk-6u21-linux-i586.bin", + "name": "jdk-6u21-linux-i586.bin", + "title": "Java SE Development Kit 6u21 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u21-b07/jdk-6u21-linux-ia64.bin", + "name": "jdk-6u21-linux-ia64.bin", + "title": "Java SE Development Kit 6u21 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u21-b07/jdk-6u21-linux-x64.bin", + "name": "jdk-6u21-linux-x64.bin", + "title": "Java SE Development Kit 6u21 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u21-b07/jdk-6u21-solaris-i586.sh", + "name": "jdk-6u21-solaris-i586.sh", + "title": "Java SE Development Kit 6u21 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u21-b07/jdk-6u21-solaris-sparc.sh", + "name": "jdk-6u21-solaris-sparc.sh", + "title": "Java SE Development Kit 6u21 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u21-b07/jdk-6u21-solaris-sparcv9.sh", + "name": "jdk-6u21-solaris-sparcv9.sh", + "title": "Java SE Development Kit 6u21 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u21-b07/jdk-6u21-solaris-x64.sh", + "name": "jdk-6u21-solaris-x64.sh", + "title": "Java SE Development Kit 6u21 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u21-b07/jdk-6u21-windows-i586.exe", + "name": "jdk-6u21-windows-i586.exe", + "title": "Java SE Development Kit 6u21 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u21-b07/jdk-6u21-windows-ia64.exe", + "name": "jdk-6u21-windows-ia64.exe", + "title": "Java SE Development Kit 6u21 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u21-b07/jdk-6u21-windows-x64.exe", + "name": "jdk-6u21-windows-x64.exe", + "title": "Java SE Development Kit 6u21 " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "jdk-6u21-b07-oth-JPR", + "title": "Java SE Development Kit 6u21" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u20-b02/jdk-6u20-linux-i586.bin", + "name": "jdk-6u20-linux-i586.bin", + "title": "Java SE Development Kit 6u20 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u20-b02/jdk-6u20-linux-ia64.bin", + "name": "jdk-6u20-linux-ia64.bin", + "title": "Java SE Development Kit 6u20 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u20-b02/jdk-6u20-linux-x64.bin", + "name": "jdk-6u20-linux-x64.bin", + "title": "Java SE Development Kit 6u20 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u20-b02/jdk-6u20-solaris-i586.sh", + "name": "jdk-6u20-solaris-i586.sh", + "title": "Java SE Development Kit 6u20 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u20-b02/jdk-6u20-solaris-sparc.sh", + "name": "jdk-6u20-solaris-sparc.sh", + "title": "Java SE Development Kit 6u20 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u20-b02/jdk-6u20-solaris-sparcv9.sh", + "name": "jdk-6u20-solaris-sparcv9.sh", + "title": "Java SE Development Kit 6u20 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u20-b02/jdk-6u20-solaris-x64.sh", + "name": "jdk-6u20-solaris-x64.sh", + "title": "Java SE Development Kit 6u20 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u20-b02/jdk-6u20-windows-i586.exe", + "name": "jdk-6u20-windows-i586.exe", + "title": "Java SE Development Kit 6u20 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u20-b02/jdk-6u20-windows-ia64.exe", + "name": "jdk-6u20-windows-ia64.exe", + "title": "Java SE Development Kit 6u20 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u20-b02/jdk-6u20-windows-x64.exe", + "name": "jdk-6u20-windows-x64.exe", + "title": "Java SE Development Kit 6u20 " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "jdk-6u20-oth-JPR", + "title": "Java SE Development Kit 6u20" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u19-b04/jdk-6u19-linux-i586.bin", + "name": "jdk-6u19-linux-i586.bin", + "title": "Java SE Development Kit 6u19 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u19-b04/jdk-6u19-linux-ia64.bin", + "name": "jdk-6u19-linux-ia64.bin", + "title": "Java SE Development Kit 6u19 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u19-b04/jdk-6u19-linux-x64.bin", + "name": "jdk-6u19-linux-x64.bin", + "title": "Java SE Development Kit 6u19 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u19-b04/jdk-6u19-solaris-i586.sh", + "name": "jdk-6u19-solaris-i586.sh", + "title": "Java SE Development Kit 6u19 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u19-b04/jdk-6u19-solaris-sparc.sh", + "name": "jdk-6u19-solaris-sparc.sh", + "title": "Java SE Development Kit 6u19 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u19-b04/jdk-6u19-solaris-sparcv9.sh", + "name": "jdk-6u19-solaris-sparcv9.sh", + "title": "Java SE Development Kit 6u19 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u19-b04/jdk-6u19-solaris-x64.sh", + "name": "jdk-6u19-solaris-x64.sh", + "title": "Java SE Development Kit 6u19 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u19-b04/jdk-6u19-windows-i586.exe", + "name": "jdk-6u19-windows-i586.exe", + "title": "Java SE Development Kit 6u19 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u19-b04/jdk-6u19-windows-ia64.exe", + "name": "jdk-6u19-windows-ia64.exe", + "title": "Java SE Development Kit 6u19 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u19-b04/jdk-6u19-windows-x64.exe", + "name": "jdk-6u19-windows-x64.exe", + "title": "Java SE Development Kit 6u19 " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "jdk-6u19-oth-JPR", + "title": "Java SE Development Kit 6u19" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u18-b07/jdk-6u18-linux-i586.bin", + "name": "jdk-6u18-linux-i586.bin", + "title": "Java SE Development Kit 6u18 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u18-b07/jdk-6u18-linux-ia64.bin", + "name": "jdk-6u18-linux-ia64.bin", + "title": "Java SE Development Kit 6u18 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u18-b07/jdk-6u18-linux-x64.bin", + "name": "jdk-6u18-linux-x64.bin", + "title": "Java SE Development Kit 6u18 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u18-b07/jdk-6u18-solaris-i586.sh", + "name": "jdk-6u18-solaris-i586.sh", + "title": "Java SE Development Kit 6u18 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u18-b07/jdk-6u18-solaris-sparc.sh", + "name": "jdk-6u18-solaris-sparc.sh", + "title": "Java SE Development Kit 6u18 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u18-b07/jdk-6u18-solaris-sparcv9.sh", + "name": "jdk-6u18-solaris-sparcv9.sh", + "title": "Java SE Development Kit 6u18 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u18-b07/jdk-6u18-solaris-x64.sh", + "name": "jdk-6u18-solaris-x64.sh", + "title": "Java SE Development Kit 6u18 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jre/6u18-b79/jdk-6u18-windows-i586.exe", + "name": "jdk-6u18-windows-i586.exe", + "title": "Java SE Development Kit 6u18 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u18-b07/jdk-6u18-windows-ia64.exe", + "name": "jdk-6u18-windows-ia64.exe", + "title": "Java SE Development Kit 6u18 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u18-b07/jdk-6u18-windows-x64.exe", + "name": "jdk-6u18-windows-x64.exe", + "title": "Java SE Development Kit 6u18 " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "jdk-6u18-oth-JPR", + "title": "Java SE Development Kit 6u18" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u17-b04/jdk-6u17-linux-i586.bin", + "name": "jdk-6u17-linux-i586.bin", + "title": "Java SE Development Kit 6u17 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u17-b04/jdk-6u17-linux-ia64.bin", + "name": "jdk-6u17-linux-ia64.bin", + "title": "Java SE Development Kit 6u17 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u17-b04/jdk-6u17-linux-x64.bin", + "name": "jdk-6u17-linux-x64.bin", + "title": "Java SE Development Kit 6u17 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u17-b04/jdk-6u17-sla.pdf", + "name": "jdk-6u17-sla.pdf", + "title": "Software License Agreement " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u17-b04/jdk-6u17-solaris-i586.sh", + "name": "jdk-6u17-solaris-i586.sh", + "title": "Java SE Development Kit 6u17 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u17-b04/jdk-6u17-solaris-sparc.sh", + "name": "jdk-6u17-solaris-sparc.sh", + "title": "Java SE Development Kit 6u17 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u17-b04/jdk-6u17-solaris-sparcv9.sh", + "name": "jdk-6u17-solaris-sparcv9.sh", + "title": "Java SE Development Kit 6u17 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u17-b04/jdk-6u17-solaris-x64.sh", + "name": "jdk-6u17-solaris-x64.sh", + "title": "Java SE Development Kit 6u17 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u17-b04/jdk-6u17-windows-i586.exe", + "name": "jdk-6u17-windows-i586.exe", + "title": "Java SE Development Kit 6u17 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u17-b04/jdk-6u17-windows-ia64.exe", + "name": "jdk-6u17-windows-ia64.exe", + "title": "Java SE Development Kit 6u17 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u17-b04/jdk-6u17-windows-x64.exe", + "name": "jdk-6u17-windows-x64.exe", + "title": "Java SE Development Kit 6u17 " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "jdk-6u17-oth-JPR", + "title": "Java SE Development Kit 6u17" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u16-b01/jdk-6u16-linux-i586.bin", + "name": "jdk-6u16-linux-i586.bin", + "title": "Java SE Development Kit 6u16 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u16-b01/jdk-6u16-linux-ia64.bin", + "name": "jdk-6u16-linux-ia64.bin", + "title": "Java SE Development Kit 6u16 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u16-b01/jdk-6u16-linux-x64.bin", + "name": "jdk-6u16-linux-x64.bin", + "title": "Java SE Development Kit 6u16 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u16-b01/jdk-6u16-solaris-i586.sh", + "name": "jdk-6u16-solaris-i586.sh", + "title": "Java SE Development Kit 6u16 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u16-b01/jdk-6u16-solaris-sparc.sh", + "name": "jdk-6u16-solaris-sparc.sh", + "title": "Java SE Development Kit 6u16 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u16-b01/jdk-6u16-solaris-sparcv9.sh", + "name": "jdk-6u16-solaris-sparcv9.sh", + "title": "Java SE Development Kit 6u16 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u16-b01/jdk-6u16-solaris-x64.sh", + "name": "jdk-6u16-solaris-x64.sh", + "title": "Java SE Development Kit 6u16 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u16-b01/jdk-6u16-windows-i586.exe", + "name": "jdk-6u16-windows-i586.exe", + "title": "Java SE Development Kit 6u16 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u16-b01/jdk-6u16-windows-ia64.exe", + "name": "jdk-6u16-windows-ia64.exe", + "title": "Java SE Development Kit 6u16 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u16-b01/jdk-6u16-windows-x64.exe", + "name": "jdk-6u16-windows-x64.exe", + "title": "Java SE Development Kit 6u16 " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "jdk-6u16-oth-JPR", + "title": "Java SE Development Kit 6u16" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u15-b03/jdk-6u15-linux-i586.bin", + "name": "jdk-6u15-linux-i586.bin", + "title": "Java SE Development Kit 6u15 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u15-b03/scott/jdk-6u15-linux-ia64.bin", + "name": "jdk-6u15-linux-ia64.bin", + "title": "Java SE Development Kit 6u15 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u15-b03/jdk-6u15-linux-x64.bin", + "name": "jdk-6u15-linux-x64.bin", + "title": "Java SE Development Kit 6u15 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u15-b03/jdk-6u15-solaris-i586.sh", + "name": "jdk-6u15-solaris-i586.sh", + "title": "Java SE Development Kit 6u15 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u15-b03/jdk-6u15-solaris-sparc.sh", + "name": "jdk-6u15-solaris-sparc.sh", + "title": "Java SE Development Kit 6u15 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u15-b03/jdk-6u15-solaris-sparcv9.sh", + "name": "jdk-6u15-solaris-sparcv9.sh", + "title": "Java SE Development Kit 6u15 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u15-b03/jdk-6u15-solaris-x64.sh", + "name": "jdk-6u15-solaris-x64.sh", + "title": "Java SE Development Kit 6u15 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u15-b03/jdk-6u15-windows-i586.exe", + "name": "jdk-6u15-windows-i586.exe", + "title": "Java SE Development Kit 6u15 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u15-b03/scott/jdk-6u15-windows-ia64.exe", + "name": "jdk-6u15-windows-ia64.exe", + "title": "Java SE Development Kit 6u15 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u15-b03/jdk-6u15-windows-x64.exe", + "name": "jdk-6u15-windows-x64.exe", + "title": "Java SE Development Kit 6u15 " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "jdk-6u15-oth-JPR", + "title": "Java SE Development Kit 6u15" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u14-b08/jdk-6u14-linux-i586.bin", + "name": "jdk-6u14-linux-i586.bin", + "title": "Java SE Development Kit 6u14 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u14-b08/jdk-6u14-linux-ia64.bin", + "name": "jdk-6u14-linux-ia64.bin", + "title": "Java SE Development Kit 6u14 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u14-b08/jdk-6u14-linux-x64.bin", + "name": "jdk-6u14-linux-x64.bin", + "title": "Java SE Development Kit 6u14 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u14-b08/jdk-6u14-solaris-i586.sh", + "name": "jdk-6u14-solaris-i586.sh", + "title": "Java SE Development Kit 6u14 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u14-b08/jdk-6u14-solaris-sparc.sh", + "name": "jdk-6u14-solaris-sparc.sh", + "title": "Java SE Development Kit 6u14 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u14-b08/jdk-6u14-solaris-sparcv9.sh", + "name": "jdk-6u14-solaris-sparcv9.sh", + "title": "Java SE Development Kit 6u14 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u14-b08/jdk-6u14-solaris-x64.sh", + "name": "jdk-6u14-solaris-x64.sh", + "title": "Java SE Development Kit 6u14 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u14-b08/jdk-6u14-windows-i586.exe", + "name": "jdk-6u14-windows-i586.exe", + "title": "Java SE Development Kit 6u14 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u14-b08/jdk-6u14-windows-ia64.exe", + "name": "jdk-6u14-windows-ia64.exe", + "title": "Java SE Development Kit 6u14 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u14-b08/jdk-6u14-windows-x64.exe", + "name": "jdk-6u14-windows-x64.exe", + "title": "Java SE Development Kit 6u14 " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "jdk-6u14-oth-JPR", + "title": "Java SE Development Kit 6u14" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u13-b03/jdk-6u13-linux-i586.bin", + "name": "jdk-6u13-linux-i586.bin", + "title": "Java SE Development Kit 6u13 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u13-b03/jdk-6u13-linux-ia64.bin", + "name": "jdk-6u13-linux-ia64.bin", + "title": "Java SE Development Kit 6u13 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u13-b03/jdk-6u13-linux-x64.bin", + "name": "jdk-6u13-linux-x64.bin", + "title": "Java SE Development Kit 6u13 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u13-b03/jdk-6u13-solaris-i586.sh", + "name": "jdk-6u13-solaris-i586.sh", + "title": "Java SE Development Kit 6u13 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u13-b03/jdk-6u13-solaris-sparc.sh", + "name": "jdk-6u13-solaris-sparc.sh", + "title": "Java SE Development Kit 6u13 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u13-b03/jdk-6u13-solaris-sparcv9.sh", + "name": "jdk-6u13-solaris-sparcv9.sh", + "title": "Java SE Development Kit 6u13 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u13-b03/jdk-6u13-solaris-x64.sh", + "name": "jdk-6u13-solaris-x64.sh", + "title": "Java SE Development Kit 6u13 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u13-b03/jdk-6u13-windows-i586-p.exe", + "name": "jdk-6u13-windows-i586-p.exe", + "title": "Java SE Development Kit 6u13 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u13-b03/jdk-6u13-windows-ia64.exe", + "name": "jdk-6u13-windows-ia64.exe", + "title": "Java SE Development Kit 6u13 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u13-b03/jdk-6u13-windows-x64-p.exe", + "name": "jdk-6u13-windows-x64-p.exe", + "title": "Java SE Development Kit 6u13 " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "jdk-6u13-oth-JPR", + "title": "Java SE Development Kit 6u13" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u12-b04/jdk-6u12-linux-i586.bin", + "name": "jdk-6u12-linux-i586.bin", + "title": "Java SE Development Kit 6u12 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u12-b04/jdk-6u12-linux-ia64.bin", + "name": "jdk-6u12-linux-ia64.bin", + "title": "Java SE Development Kit 6u12 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u12-b04/jdk-6u12-linux-x64.bin", + "name": "jdk-6u12-linux-x64.bin", + "title": "Java SE Development Kit 6u12 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u12-b04/jdk-6u12-solaris-i586.sh", + "name": "jdk-6u12-solaris-i586.sh", + "title": "Java SE Development Kit 6u12 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u12-b04/jdk-6u12-solaris-sparc.sh", + "name": "jdk-6u12-solaris-sparc.sh", + "title": "Java SE Development Kit 6u12 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u12-b04/jdk-6u12-solaris-sparcv9.sh", + "name": "jdk-6u12-solaris-sparcv9.sh", + "title": "Java SE Development Kit 6u12 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u12-b04/jdk-6u12-solaris-x64.sh", + "name": "jdk-6u12-solaris-x64.sh", + "title": "Java SE Development Kit 6u12 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u12-b04/jdk-6u12-windows-i586-p.exe", + "name": "jdk-6u12-windows-i586-p.exe", + "title": "Java SE Development Kit 6u12 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u12-b04/jdk-6u12-windows-ia64.exe", + "name": "jdk-6u12-windows-ia64.exe", + "title": "Java SE Development Kit 6u12 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u12-b04/jdk-6u12-windows-x64-p.exe", + "name": "jdk-6u12-windows-x64-p.exe", + "title": "Java SE Development Kit 6u12 " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "jdk-6u12-oth-JPR", + "title": "Java SE Development Kit 6u12" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u11-b03/jdk-6u11-linux-i586.bin", + "name": "jdk-6u11-linux-i586.bin", + "title": "Java SE Development Kit 6u11 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u11-b03/jdk-6u11-linux-ia64.bin", + "name": "jdk-6u11-linux-ia64.bin", + "title": "Java SE Development Kit 6u11 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u11-b03/jdk-6u11-linux-x64.bin", + "name": "jdk-6u11-linux-x64.bin", + "title": "Java SE Development Kit 6u11 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u11-b03/jdk-6u11-solaris-i586.sh", + "name": "jdk-6u11-solaris-i586.sh", + "title": "Java SE Development Kit 6u11 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u11-b03/jdk-6u11-solaris-sparc.sh", + "name": "jdk-6u11-solaris-sparc.sh", + "title": "Java SE Development Kit 6u11 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u11-b03/jdk-6u11-solaris-sparcv9.sh", + "name": "jdk-6u11-solaris-sparcv9.sh", + "title": "Java SE Development Kit 6u11 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u11-b03/jdk-6u11-solaris-x64.sh", + "name": "jdk-6u11-solaris-x64.sh", + "title": "Java SE Development Kit 6u11 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u11-b03/jdk-6u11-windows-i586-p.exe", + "name": "jdk-6u11-windows-i586-p.exe", + "title": "Java SE Development Kit 6u11 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u11-b03/jdk-6u11-windows-ia64.exe", + "name": "jdk-6u11-windows-ia64.exe", + "title": "Java SE Development Kit 6u11 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u11-b03/jdk-6u11-windows-x64.exe", + "name": "jdk-6u11-windows-x64.exe", + "title": "Java SE Development Kit 6u11 " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "jdk-6u11-oth-JPR", + "title": "Java SE Development Kit 6u11" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u10/jdk-6u10-linux-i586.bin", + "name": "jdk-6u10-linux-i586.bin", + "title": "Java SE Development Kit 6u10 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u10/jdk-6u10-linux-x64.bin", + "name": "jdk-6u10-linux-x64.bin", + "title": "Java SE Development Kit 6u10 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u10/jdk-6u10-solaris-i586.sh", + "name": "jdk-6u10-solaris-i586.sh", + "title": "Java SE Development Kit 6u10 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u10/jdk-6u10-solaris-sparc.sh", + "name": "jdk-6u10-solaris-sparc.sh", + "title": "Java SE Development Kit 6u10 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u10/jdk-6u10-solaris-sparcv9.sh", + "name": "jdk-6u10-solaris-sparcv9.sh", + "title": "Java SE Development Kit 6u10 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u10/jdk-6u10-solaris-x64.sh", + "name": "jdk-6u10-solaris-x64.sh", + "title": "Java SE Development Kit 6u10 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u10/jdk-6u10-windows-i586-p.exe", + "name": "jdk-6u10-windows-i586-p.exe", + "title": "Windows Offline Installation " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u10/jdk-6u10-windows-x64.exe", + "name": "jdk-6u10-windows-x64.exe", + "title": "Java SE Development Kit 6u10 " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "jdk-6u10-oth-JPR", + "title": "Java SE Development Kit 6u10" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u7/jdk-6u7-linux-i586.bin", + "name": "jdk-6u7-linux-i586.bin", + "title": "Java SE Development Kit 6u7 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u7/jdk-6u7-linux-x64.bin", + "name": "jdk-6u7-linux-x64.bin", + "title": "Java SE Development Kit 6u7 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u7/jdk-6u7-solaris-i586.sh", + "name": "jdk-6u7-solaris-i586.sh", + "title": "Java SE Development Kit 6u7 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u7/jdk-6u7-solaris-sparc.sh", + "name": "jdk-6u7-solaris-sparc.sh", + "title": "Java SE Development Kit 6u7 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u7/jdk-6u7-solaris-sparcv9.sh", + "name": "jdk-6u7-solaris-sparcv9.sh", + "title": "Java SE Development Kit 6u7 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u7/jdk-6u7-solaris-x64.sh", + "name": "jdk-6u7-solaris-x64.sh", + "title": "Java SE Development Kit 6u7 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u7/jdk-6u7-windows-i586-p.exe", + "name": "jdk-6u7-windows-i586-p.exe", + "title": "Windows Offline Installation " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u7/jdk-6u7-windows-x64.exe", + "name": "jdk-6u7-windows-x64.exe", + "title": "Java SE Development Kit 6u7 " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "jdk-6u7-oth-JPR", + "title": "Java SE Development Kit 6u7" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u7-ia64/jdk-6u7-linux-ia64.bin", + "name": "jdk-6u7-linux-ia64.bin", + "title": "Java SE Development Kit for Itanium 6u7 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u7-ia64/jdk-6u7-windows-ia64.exe", + "name": "jdk-6u7-windows-ia64.exe", + "title": "Java SE Development Kit for Itanium 6u7 " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "jdk-6u7-ia64-JPR", + "title": "Java SE Development Kit for Itanium 6u7" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u6-p2/jdk-6u6-p-linux-x64.tar.gz", + "name": "jdk-6u6-p-linux-x64.tar.gz", + "title": "Java SE Development Kit 6u6 Performance Release " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u6-p2/jdk-6u6-p-solaris-i586.tar", + "name": "jdk-6u6-p-solaris-i586.tar", + "title": "Java SE Development Kit 6u6 Performance Release " + }, + { + "filepath": "http://download.oracle.com/otn/java/jre/6u6p/jdk-6u6-p-solaris-sparc.tar", + "name": "jdk-6u6-p-solaris-sparc.tar", + "title": "Java SE Development Kit 6u6 Performance Release " + }, + { + "filepath": "http://download.oracle.com/otn/java/jre/6u6p/jdk-6u6-p-solaris-sparcv9.tar", + "name": "jdk-6u6-p-solaris-sparcv9.tar", + "title": "Java SE Development Kit 6u6 Performance Release " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u6-p2/jdk-6u6-p-solaris-x64.tar", + "name": "jdk-6u6-p-solaris-x64.tar", + "title": "Java SE Development Kit 6u6 Performance Release " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u6-p2/jdk-6u6-p-windows-i586.tar", + "name": "jdk-6u6-p-windows-i586.tar", + "title": "Java SE Development Kit 6u6 Performance Release " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u6-p2/jdk-6u6-p-windows-x64.tar", + "name": "jdk-6u6-p-windows-x64.tar", + "title": "Java SE Development Kit 6u6 Performance Release " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "jdk-6u6-p2-oth-JPR", + "title": "Java SE Development Kit 6u6 Performance" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u6/jdk-6u6-linux-i586.bin", + "name": "jdk-6u6-linux-i586.bin", + "title": "Linux self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u6/jdk-6u6-linux-x64.bin", + "name": "jdk-6u6-linux-x64.bin", + "title": "Linux x64 self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u6/jdk-6u6-solaris-i586.sh", + "name": "jdk-6u6-solaris-i586.sh", + "title": "Solaris x86 self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u6/jdk-6u6-solaris-sparc.sh", + "name": "jdk-6u6-solaris-sparc.sh", + "title": "Solaris SPARC 32-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u6/jdk-6u6-solaris-sparcv9.sh", + "name": "jdk-6u6-solaris-sparcv9.sh", + "title": "Solaris SPARC 64-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u6/jdk-6u6-solaris-x64.sh", + "name": "jdk-6u6-solaris-x64.sh", + "title": "Solaris x64 self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u6/jdk-6u6-windows-i586-p.exe", + "name": "jdk-6u6-windows-i586-p.exe", + "title": "Windows Offline Installation " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u6/jdk-6u6-windows-x64.exe", + "name": "jdk-6u6-windows-x64.exe", + "title": "Windows x64 executable " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "jdk-6u6-oth-JPR", + "title": "Java SE Development Kit 6u6" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u5b/jdk-6u5-linux-i586.bin", + "name": "jdk-6u5-linux-i586.bin", + "title": "Linux self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u5b/jdk-6u5-linux-x64.bin", + "name": "jdk-6u5-linux-x64.bin", + "title": "Linux x64 self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u5b/jdk-6u5-solaris-i586.sh", + "name": "jdk-6u5-solaris-i586.sh", + "title": "Solaris x86 self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u5b/jdk-6u5-solaris-sparc.sh", + "name": "jdk-6u5-solaris-sparc.sh", + "title": "Solaris SPARC 32-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u5b/jdk-6u5-solaris-sparcv9.sh", + "name": "jdk-6u5-solaris-sparcv9.sh", + "title": "Solaris SPARC 64-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u5b/jdk-6u5-solaris-x64.sh", + "name": "jdk-6u5-solaris-x64.sh", + "title": "Solaris x64 self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u5b/jdk-6u5-windows-i586-p.exe", + "name": "jdk-6u5-windows-i586-p.exe", + "title": "Windows Offline Installation " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u5b/jdk-6u5-windows-x64.exe", + "name": "jdk-6u5-windows-x64.exe", + "title": "Windows x64 executable " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "jdk-6u5-oth-JPR", + "title": "Java SE Development Kit 6u5" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u4-b12/jdk-6u4-linux-i586.bin", + "name": "jdk-6u4-linux-i586.bin", + "title": "Linux self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u4-b12/jdk-6u4-linux-x64.bin", + "name": "jdk-6u4-linux-x64.bin", + "title": "Linux x64 self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u4-b12/jdk-6u4-solaris-i586.sh", + "name": "jdk-6u4-solaris-i586.sh", + "title": "Solaris x86 self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u4-b12/jdk-6u4-solaris-sparc.sh", + "name": "jdk-6u4-solaris-sparc.sh", + "title": "Solaris SPARC 32-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u4-b12/jdk-6u4-solaris-sparcv9.sh", + "name": "jdk-6u4-solaris-sparcv9.sh", + "title": "Solaris SPARC 64-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u4-b12/jdk-6u4-solaris-x64.sh", + "name": "jdk-6u4-solaris-x64.sh", + "title": "Solaris x64 self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u4-b12/jdk-6u4-windows-i586-p.exe", + "name": "jdk-6u4-windows-i586-p.exe", + "title": "Windows Offline Installation " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u4-b12/jdk-6u4-windows-x64.exe", + "name": "jdk-6u4-windows-x64.exe", + "title": "Windows x64 executable " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "jdk-6u4-b-oth-JPR", + "title": "Java SE Development Kit 6u4" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u3/jdk-6u3-linux-amd64.bin", + "name": "jdk-6u3-linux-amd64.bin", + "title": "Linux x64 self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u3/jdk-6u3-linux-i586.bin", + "name": "jdk-6u3-linux-i586.bin", + "title": "Linux self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u3/jdk-6u3-solaris-amd64.sh", + "name": "jdk-6u3-solaris-amd64.sh", + "title": "Solaris x64 self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u3/jdk-6u3-solaris-i586.sh", + "name": "jdk-6u3-solaris-i586.sh", + "title": "Solaris x86 self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u3/jdk-6u3-solaris-sparc.sh", + "name": "jdk-6u3-solaris-sparc.sh", + "title": "Solaris SPARC 32-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u3/jdk-6u3-solaris-sparcv9.sh", + "name": "jdk-6u3-solaris-sparcv9.sh", + "title": "Solaris SPARC 64-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u3/jdk-6u3-windows-amd64.exe", + "name": "jdk-6u3-windows-amd64.exe", + "title": "Windows x64 executable " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u3/jdk-6u3-windows-i586-p.exe", + "name": "jdk-6u3-windows-i586-p.exe", + "title": "Windows Offline Installation " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "jdk-6u3-oth-JPR", + "title": "Java SE Development Kit 6u3" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u2/jdk-6u2-linux-amd64.bin", + "name": "jdk-6u2-linux-amd64.bin", + "title": "Linux x64 self-extracting file (build 05) " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u2/jdk-6u2-linux-i586.bin", + "name": "jdk-6u2-linux-i586.bin", + "title": "Linux self-extracting file (build 05) " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u2/jdk-6u2-solaris-amd64.sh", + "name": "jdk-6u2-solaris-amd64.sh", + "title": "Solaris x64 self-extracting file (build 05) " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u2/jdk-6u2-solaris-i586.sh", + "name": "jdk-6u2-solaris-i586.sh", + "title": "Solaris x86 self-extracting file (build 05) " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u2/jdk-6u2-solaris-sparc.sh", + "name": "jdk-6u2-solaris-sparc.sh", + "title": "Solaris SPARC 32-bit self-extracting file (build 05) " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u2/jdk-6u2-solaris-sparcv9.sh", + "name": "jdk-6u2-solaris-sparcv9.sh", + "title": "Solaris SPARC 64-bit self-extracting file (build 05) " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u2/jdk-6u2-windows-amd64.exe", + "name": "jdk-6u2-windows-amd64.exe", + "title": "Windows x64 executable (build 05) " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u2/jdk-6u2-windows-i586-p.exe", + "name": "jdk-6u2-windows-i586-p.exe", + "title": "Windows Offline Installation (build 06) " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "jdk-6u2-oth-JPR", + "title": "Java SE Development Kit 6u2" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u1/jdk-6u1-linux-amd64.bin", + "name": "jdk-6u1-linux-amd64.bin", + "title": "Linux x64 self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u1/jdk-6u1-linux-i586.bin", + "name": "jdk-6u1-linux-i586.bin", + "title": "Linux self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u1/jdk-6u1-solaris-amd64.sh", + "name": "jdk-6u1-solaris-amd64.sh", + "title": "Solaris x64 self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u1/jdk-6u1-solaris-i586.sh", + "name": "jdk-6u1-solaris-i586.sh", + "title": "Solaris x86 self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u1/jdk-6u1-solaris-sparc.sh", + "name": "jdk-6u1-solaris-sparc.sh", + "title": "Solaris SPARC 32-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u1/jdk-6u1-solaris-sparcv9.sh", + "name": "jdk-6u1-solaris-sparcv9.sh", + "title": "Solaris SPARC 64-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u1/jdk-6u1-windows-amd64.exe", + "name": "jdk-6u1-windows-amd64.exe", + "title": "Windows x64 executable " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6u1/jdk-6u1-windows-i586-p.exe", + "name": "jdk-6u1-windows-i586-p.exe", + "title": "Windows Offline Installation " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "jdk-6u1-oth-JPR", + "title": "Java SE Development Kit 6u1" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/jdk/6/jdk-6-linux-amd64.bin", + "name": "jdk-6-linux-amd64.bin", + "title": "Linux x64 self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6/jdk-6-linux-i586.bin", + "name": "jdk-6-linux-i586.bin", + "title": "Linux self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6/jdk-6-solaris-amd64.sh", + "name": "jdk-6-solaris-amd64.sh", + "title": "Solaris x64 self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6/jdk-6-solaris-i586.sh", + "name": "jdk-6-solaris-i586.sh", + "title": "Solaris x86 self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6/jdk-6-solaris-sparc.sh", + "name": "jdk-6-solaris-sparc.sh", + "title": "Solaris SPARC 32-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6/jdk-6-solaris-sparcv9.sh", + "name": "jdk-6-solaris-sparcv9.sh", + "title": "Solaris SPARC 64-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6/jdk-6-windows-amd64.exe", + "name": "jdk-6-windows-amd64.exe", + "title": "Windows x64 executable " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/6/jdk-6-windows-i586.exe", + "name": "jdk-6-windows-i586.exe", + "title": "Windows Offline Installation " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "jdk-6-oth-JPR", + "title": "Java SE Development Kit 6" + } + ] + }, + { + "name": "JDK 5", + "releases": [ + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_22/jdk-1_5_0_22-linux-amd64.bin", + "name": "jdk-1_5_0_22-linux-amd64.bin", + "title": "Java Development Kit 5.0 Update 22 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_22/jdk-1_5_0_22-linux-i586.bin", + "name": "jdk-1_5_0_22-linux-i586.bin", + "title": "Java Development Kit 5.0 Update 22 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_22/jdk-1_5_0_22-solaris-amd64.sh", + "name": "jdk-1_5_0_22-solaris-amd64.sh", + "title": "Java Development Kit 5.0 Update 22 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_22/jdk-1_5_0_22-solaris-i586.sh", + "name": "jdk-1_5_0_22-solaris-i586.sh", + "title": "Java Development Kit 5.0 Update 22 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_22/jdk-1_5_0_22-solaris-sparc.sh", + "name": "jdk-1_5_0_22-solaris-sparc.sh", + "title": "Java Development Kit 5.0 Update 22 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_22/jdk-1_5_0_22-solaris-sparcv9.sh", + "name": "jdk-1_5_0_22-solaris-sparcv9.sh", + "title": "Java Development Kit 5.0 Update 22 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_22/jdk-1_5_0_22-windows-amd64.exe", + "name": "jdk-1_5_0_22-windows-amd64.exe", + "title": "Java Development Kit 5.0 Update 22 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_22/jdk-1_5_0_22-windows-i586-p.exe", + "name": "jdk-1_5_0_22-windows-i586-p.exe", + "title": "Windows Offline Installation " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "jdk-1.5.0_22-oth-JPR", + "title": "Java SE Development Kit 5.0u22" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_21/jdk-1_5_0_21-linux-amd64.bin", + "name": "jdk-1_5_0_21-linux-amd64.bin", + "title": "Java Development Kit 5.0 Update 21 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_21/jdk-1_5_0_21-linux-i586.bin", + "name": "jdk-1_5_0_21-linux-i586.bin", + "title": "Java Development Kit 5.0 Update 21 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_21/jdk-1_5_0_21-solaris-amd64.sh", + "name": "jdk-1_5_0_21-solaris-amd64.sh", + "title": "Java Development Kit 5.0 Update 21 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_21/jdk-1_5_0_21-solaris-i586.sh", + "name": "jdk-1_5_0_21-solaris-i586.sh", + "title": "Java Development Kit 5.0 Update 21 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_21/jdk-1_5_0_21-solaris-sparc.sh", + "name": "jdk-1_5_0_21-solaris-sparc.sh", + "title": "Java Development Kit 5.0 Update 21 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_21/jdk-1_5_0_21-solaris-sparcv9.sh", + "name": "jdk-1_5_0_21-solaris-sparcv9.sh", + "title": "Java Development Kit 5.0 Update 21 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_21/jdk-1_5_0_21-windows-amd64.exe", + "name": "jdk-1_5_0_21-windows-amd64.exe", + "title": "Java Development Kit 5.0 Update 21 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_21/jdk-1_5_0_21-windows-i586-p.exe", + "name": "jdk-1_5_0_21-windows-i586-p.exe", + "title": "Windows Offline Installation " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "jdk-1.5.0_21-oth-JPR", + "title": "Java SE Development Kit 5.0u21" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_20/jdk-1_5_0_20-linux-amd64.bin", + "name": "jdk-1_5_0_20-linux-amd64.bin", + "title": "Java Development Kit 5.0 Update 20 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_20/jdk-1_5_0_20-linux-i586.bin", + "name": "jdk-1_5_0_20-linux-i586.bin", + "title": "Java Development Kit 5.0 Update 20 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_20/jdk-1_5_0_20-solaris-amd64.sh", + "name": "jdk-1_5_0_20-solaris-amd64.sh", + "title": "Java Development Kit 5.0 Update 20 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_20/jdk-1_5_0_20-solaris-i586.sh", + "name": "jdk-1_5_0_20-solaris-i586.sh", + "title": "Java Development Kit 5.0 Update 20 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_20/jdk-1_5_0_20-solaris-sparc.sh", + "name": "jdk-1_5_0_20-solaris-sparc.sh", + "title": "Java Development Kit 5.0 Update 20 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_20/jdk-1_5_0_20-solaris-sparcv9.sh", + "name": "jdk-1_5_0_20-solaris-sparcv9.sh", + "title": "Java Development Kit 5.0 Update 20 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_20/jdk-1_5_0_20-windows-amd64.exe", + "name": "jdk-1_5_0_20-windows-amd64.exe", + "title": "Java Development Kit 5.0 Update 20 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_20/jdk-1_5_0_20-windows-i586-p.exe", + "name": "jdk-1_5_0_20-windows-i586-p.exe", + "title": "Java Development Kit 5.0 Update 20 " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "jdk-1.5.0_20-oth-JPR", + "title": "Java SE Development Kit 5.0u20" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_19/jdk-1_5_0_19-linux-amd64.bin", + "name": "jdk-1_5_0_19-linux-amd64.bin", + "title": "Java Development Kit 5.0 Update 19 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_19/jdk-1_5_0_19-linux-i586.bin", + "name": "jdk-1_5_0_19-linux-i586.bin", + "title": "Java Development Kit 5.0 Update 19 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_19/jdk-1_5_0_19-solaris-amd64.sh", + "name": "jdk-1_5_0_19-solaris-amd64.sh", + "title": "Java Development Kit 5.0 Update 19 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_19/jdk-1_5_0_19-solaris-i586.sh", + "name": "jdk-1_5_0_19-solaris-i586.sh", + "title": "Java Development Kit 5.0 Update 19 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_19/jdk-1_5_0_19-solaris-sparc.sh", + "name": "jdk-1_5_0_19-solaris-sparc.sh", + "title": "Java Development Kit 5.0 Update 19 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_19/jdk-1_5_0_19-solaris-sparcv9.sh", + "name": "jdk-1_5_0_19-solaris-sparcv9.sh", + "title": "Java Development Kit 5.0 Update 19 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_19/jdk-1_5_0_19-windows-amd64.exe", + "name": "jdk-1_5_0_19-windows-amd64.exe", + "title": "Java Development Kit 5.0 Update 19 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_19/jdk-1_5_0_19-windows-i586-p.exe", + "name": "jdk-1_5_0_19-windows-i586-p.exe", + "title": "Windows Offline Installation " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "jdk-1.5.0_19-oth-JPR", + "title": "Java SE Development Kit 5.0u19" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_18/jdk-1_5_0_18-linux-amd64.bin", + "name": "jdk-1_5_0_18-linux-amd64.bin", + "title": "Java Development Kit 5.0 Update 18 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_18/jdk-1_5_0_18-linux-i586.bin", + "name": "jdk-1_5_0_18-linux-i586.bin", + "title": "Java Development Kit 5.0 Update 18 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_18/jdk-1_5_0_18-solaris-amd64.sh", + "name": "jdk-1_5_0_18-solaris-amd64.sh", + "title": "Java Development Kit 5.0 Update 18 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_18/jdk-1_5_0_18-solaris-i586.sh", + "name": "jdk-1_5_0_18-solaris-i586.sh", + "title": "Java Development Kit 5.0 Update 18 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_18/jdk-1_5_0_18-solaris-sparc.sh", + "name": "jdk-1_5_0_18-solaris-sparc.sh", + "title": "Java Development Kit 5.0 Update 18 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_18/jdk-1_5_0_18-solaris-sparcv9.sh", + "name": "jdk-1_5_0_18-solaris-sparcv9.sh", + "title": "Java Development Kit 5.0 Update 18 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_18/jdk-1_5_0_18-windows-amd64.exe", + "name": "jdk-1_5_0_18-windows-amd64.exe", + "title": "Java Development Kit 5.0 Update 18 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_18/jdk-1_5_0_18-windows-i586-p.exe", + "name": "jdk-1_5_0_18-windows-i586-p.exe", + "title": "Windows Offline Installation " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "jdk-1.5.0_18-oth-JPR", + "title": "Java SE Development Kit 5.0u18" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_17/jdk-1_5_0_17-linux-amd64.bin", + "name": "jdk-1_5_0_17-linux-amd64.bin", + "title": "Java Development Kit 5.0 Update 17 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_17/jdk-1_5_0_17-linux-i586.bin", + "name": "jdk-1_5_0_17-linux-i586.bin", + "title": "Java Development Kit 5.0 Update 17 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_17/jdk-1_5_0_17-solaris-amd64.sh", + "name": "jdk-1_5_0_17-solaris-amd64.sh", + "title": "Java Development Kit 5.0 Update 17 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_17/jdk-1_5_0_17-solaris-i586.sh", + "name": "jdk-1_5_0_17-solaris-i586.sh", + "title": "Java Development Kit 5.0 Update 17 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_17/jdk-1_5_0_17-solaris-sparc.sh", + "name": "jdk-1_5_0_17-solaris-sparc.sh", + "title": "Java Development Kit 5.0 Update 17 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_17/jdk-1_5_0_17-solaris-sparcv9.sh", + "name": "jdk-1_5_0_17-solaris-sparcv9.sh", + "title": "Java Development Kit 5.0 Update 17 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_17/jdk-1_5_0_17-windows-amd64.exe", + "name": "jdk-1_5_0_17-windows-amd64.exe", + "title": "Java Development Kit 5.0 Update 17 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_17/jdk-1_5_0_17-windows-i586-p.exe", + "name": "jdk-1_5_0_17-windows-i586-p.exe", + "title": "Windows Offline Installation " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "jdk-1.5.0_17-oth-JPR", + "title": "Java SE Development Kit 5.0u17" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_16/jdk-1_5_0_16-linux-amd64.bin", + "name": "jdk-1_5_0_16-linux-amd64.bin", + "title": "Java Development Kit 5.0 Update 16 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_16/jdk-1_5_0_16-linux-i586.bin", + "name": "jdk-1_5_0_16-linux-i586.bin", + "title": "Java Development Kit 5.0 Update 16 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_16/jdk-1_5_0_16-solaris-amd64.sh", + "name": "jdk-1_5_0_16-solaris-amd64.sh", + "title": "Java Development Kit 5.0 Update 16 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_16/jdk-1_5_0_16-solaris-i586.sh", + "name": "jdk-1_5_0_16-solaris-i586.sh", + "title": "Java Development Kit 5.0 Update 16 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_16/jdk-1_5_0_16-solaris-sparc.sh", + "name": "jdk-1_5_0_16-solaris-sparc.sh", + "title": "Java Development Kit 5.0 Update 16 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_16/jdk-1_5_0_16-solaris-sparcv9.sh", + "name": "jdk-1_5_0_16-solaris-sparcv9.sh", + "title": "Java Development Kit 5.0 Update 16 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_16/jdk-1_5_0_16-windows-amd64.exe", + "name": "jdk-1_5_0_16-windows-amd64.exe", + "title": "Java Development Kit 5.0 Update 16 " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_16/jdk-1_5_0_16-windows-i586-p.exe", + "name": "jdk-1_5_0_16-windows-i586-p.exe", + "title": "Windows Offline Installation " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "jdk-1.5.0_16-oth-JPR", + "title": "Java SE Development Kit 5.0u16" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/jdk/5.0_15/jdk-1_5_0_15-linux-amd64.bin", + "name": "jdk-1_5_0_15-linux-amd64.bin", + "title": "Linux x64 self-extracting file (use 32-bit version for applet and Java Web Start support) " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/5.0_15/jdk-1_5_0_15-linux-i586.bin", + "name": "jdk-1_5_0_15-linux-i586.bin", + "title": "Linux self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/5.0_15/jdk-1_5_0_15-solaris-amd64.sh", + "name": "jdk-1_5_0_15-solaris-amd64.sh", + "title": "Solaris x64 self-extracting file (use 32-bit version for applet and Java Web Start support) " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/5.0_15/jdk-1_5_0_15-solaris-i586.sh", + "name": "jdk-1_5_0_15-solaris-i586.sh", + "title": "Solaris x86 self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/5.0_15/jdk-1_5_0_15-solaris-sparc.sh", + "name": "jdk-1_5_0_15-solaris-sparc.sh", + "title": "Solaris SPARC 32-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/5.0_15/jdk-1_5_0_15-solaris-sparcv9.sh", + "name": "jdk-1_5_0_15-solaris-sparcv9.sh", + "title": "Solaris SPARC 64-bit self-extracting file (use 32-bit version for applet and Java Web Start support) " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/5.0_15/jdk-1_5_0_15-windows-amd64.exe", + "name": "jdk-1_5_0_15-windows-amd64.exe", + "title": "Windows x64 executable (use 32-bit version for applet and Java Web Start support) " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/5.0_15/jdk-1_5_0_15-windows-i586-p.exe", + "name": "jdk-1_5_0_15-windows-i586-p.exe", + "title": "Windows Offline Installation " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "jdk-1.5.0_15-oth-JPR", + "title": "Java SE Development Kit 5.0 Update 15" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_14/jdk-1_5_0_14-linux-amd64.bin", + "name": "jdk-1_5_0_14-linux-amd64.bin", + "title": "Linux x64 self-extracting file (use 32-bit version for applet and Java Web Start support) " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_14/jdk-1_5_0_14-linux-i586.bin", + "name": "jdk-1_5_0_14-linux-i586.bin", + "title": "Linux self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_14/jdk-1_5_0_14-solaris-amd64.sh", + "name": "jdk-1_5_0_14-solaris-amd64.sh", + "title": "Solaris x64 self-extracting file (use 32-bit version for applet and Java Web Start support) " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_14/jdk-1_5_0_14-solaris-i586.sh", + "name": "jdk-1_5_0_14-solaris-i586.sh", + "title": "Solaris x86 self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_14/jdk-1_5_0_14-solaris-sparc.sh", + "name": "jdk-1_5_0_14-solaris-sparc.sh", + "title": "Solaris SPARC 32-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_14/jdk-1_5_0_14-solaris-sparcv9.sh", + "name": "jdk-1_5_0_14-solaris-sparcv9.sh", + "title": "Solaris SPARC 64-bit self-extracting file (use 32-bit version for applet and Java Web Start support) " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_14/jdk-1_5_0_14-windows-amd64.exe", + "name": "jdk-1_5_0_14-windows-amd64.exe", + "title": "Windows x64 executable (use 32-bit version for applet and Java Web Start support) " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_14/jdk-1_5_0_14-windows-i586-p.exe", + "name": "jdk-1_5_0_14-windows-i586-p.exe", + "title": "Windows Offline Installation " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "jdk-1.5.0_14-oth-JPR", + "title": "Java Development Kit 5.0 Update 14" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_13/jdk-1_5_0_13-linux-amd64.bin", + "name": "jdk-1_5_0_13-linux-amd64.bin", + "title": "Linux x64 self-extracting file (use 32-bit version for applet and Java Web Start support) " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_13/jdk-1_5_0_13-linux-i586.bin", + "name": "jdk-1_5_0_13-linux-i586.bin", + "title": "Linux self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_13/jdk-1_5_0_13-solaris-amd64.sh", + "name": "jdk-1_5_0_13-solaris-amd64.sh", + "title": "Solaris x64 self-extracting file (use 32-bit version for applet and Java Web Start support) " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_13/jdk-1_5_0_13-solaris-i586.sh", + "name": "jdk-1_5_0_13-solaris-i586.sh", + "title": "Solaris x86 self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_13/jdk-1_5_0_13-solaris-sparc.sh", + "name": "jdk-1_5_0_13-solaris-sparc.sh", + "title": "Solaris SPARC 32-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_13/jdk-1_5_0_13-solaris-sparcv9.sh", + "name": "jdk-1_5_0_13-solaris-sparcv9.sh", + "title": "Solaris SPARC 64-bit self-extracting file (use 32-bit version for applet and Java Web Start support) " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_13/jdk-1_5_0_13-windows-amd64.exe", + "name": "jdk-1_5_0_13-windows-amd64.exe", + "title": "Windows x64 executable (use 32-bit version for applet and Java Web Start support) " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_13/jdk-1_5_0_13-windows-i586-p.exe", + "name": "jdk-1_5_0_13-windows-i586-p.exe", + "title": "Windows Offline Installation " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "jdk-1.5.0_13-oth-JPR", + "title": "Java Development Kit 5.0 Update 13" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_12/jdk-1_5_0_12-linux-amd64.bin", + "name": "jdk-1_5_0_12-linux-amd64.bin", + "title": "Linux x64 self-extracting file (use 32-bit version for applet and Java Web Start support) " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_12/jdk-1_5_0_12-linux-i586.bin", + "name": "jdk-1_5_0_12-linux-i586.bin", + "title": "Linux self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_12/jdk-1_5_0_12-solaris-amd64.sh", + "name": "jdk-1_5_0_12-solaris-amd64.sh", + "title": "Solaris x64 self-extracting file (use 32-bit version for applet and Java Web Start support) " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_12/jdk-1_5_0_12-solaris-i586.sh", + "name": "jdk-1_5_0_12-solaris-i586.sh", + "title": "Solaris x86 self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_12/jdk-1_5_0_12-solaris-sparc.sh", + "name": "jdk-1_5_0_12-solaris-sparc.sh", + "title": "Solaris SPARC 32-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_12/jdk-1_5_0_12-solaris-sparcv9.sh", + "name": "jdk-1_5_0_12-solaris-sparcv9.sh", + "title": "Solaris SPARC 64-bit self-extracting file (use 32-bit version for applet and Java Web Start support) " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_12/jdk-1_5_0_12-windows-amd64.exe", + "name": "jdk-1_5_0_12-windows-amd64.exe", + "title": "Windows x64 executable (use 32-bit version for applet and Java Web Start support) " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_12/jdk-1_5_0_12-windows-i586-p.exe", + "name": "jdk-1_5_0_12-windows-i586-p.exe", + "title": "Windows Offline Installation " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "jdk-1.5.0_12-oth-JPR", + "title": "Java Development Kit 5.0 Update 12" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_11/jdk-1_5_0_11-linux-amd64.bin", + "name": "jdk-1_5_0_11-linux-amd64.bin", + "title": "Linux x64 self-extracting file (use 32-bit version for applet and Java Web Start support) " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_11/jdk-1_5_0_11-linux-i586.bin", + "name": "jdk-1_5_0_11-linux-i586.bin", + "title": "Linux self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_11/jdk-1_5_0_11-solaris-amd64.sh", + "name": "jdk-1_5_0_11-solaris-amd64.sh", + "title": "Solaris x64 self-extracting file (use 32-bit version for applet and Java Web Start support) " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_11/jdk-1_5_0_11-solaris-i586.sh", + "name": "jdk-1_5_0_11-solaris-i586.sh", + "title": "Solaris x86 self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_11/jdk-1_5_0_11-solaris-sparc.sh", + "name": "jdk-1_5_0_11-solaris-sparc.sh", + "title": "Solaris SPARC 32-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_11/jdk-1_5_0_11-solaris-sparcv9.sh", + "name": "jdk-1_5_0_11-solaris-sparcv9.sh", + "title": "Solaris SPARC 64-bit self-extracting file (use 32-bit version for applet and Java Web Start support) " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_11/jdk-1_5_0_11-windows-amd64.exe", + "name": "jdk-1_5_0_11-windows-amd64.exe", + "title": "Windows x64 executable (use 32-bit version for applet and Java Web Start support) " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_11/jdk-1_5_0_11-windows-i586-p.exe", + "name": "jdk-1_5_0_11-windows-i586-p.exe", + "title": "Windows Offline Installation " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "jdk-1.5.0_11-oth-JPR", + "title": "J2SE(TM) Development Kit 5.0 Update 11" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_10/jdk-1_5_0_10-linux-amd64.bin", + "name": "jdk-1_5_0_10-linux-amd64.bin", + "title": "Linux x64 self-extracting file (use 32-bit version for applet and Java Web Start support) " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_10/jdk-1_5_0_10-linux-i586.bin", + "name": "jdk-1_5_0_10-linux-i586.bin", + "title": "Linux self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_10/jdk-1_5_0_10-solaris-amd64.sh", + "name": "jdk-1_5_0_10-solaris-amd64.sh", + "title": "Solaris x64 self-extracting file (use 32-bit version for applet and Java Web Start support) " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_10/jdk-1_5_0_10-solaris-i586.sh", + "name": "jdk-1_5_0_10-solaris-i586.sh", + "title": "Solaris x86 self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_10/jdk-1_5_0_10-solaris-sparc.sh", + "name": "jdk-1_5_0_10-solaris-sparc.sh", + "title": "Solaris SPARC 32-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_10/jdk-1_5_0_10-solaris-sparcv9.sh", + "name": "jdk-1_5_0_10-solaris-sparcv9.sh", + "title": "Solaris SPARC 64-bit self-extracting file (use 32-bit version for applet and Java Web Start support) " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_10/jdk-1_5_0_10-windows-amd64.exe", + "name": "jdk-1_5_0_10-windows-amd64.exe", + "title": "Windows x64 executable (use 32-bit version for applet and Java Web Start support) " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_10/jdk-1_5_0_10-windows-i586-p.exe", + "name": "jdk-1_5_0_10-windows-i586-p.exe", + "title": "Windows Offline Installation " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "jdk-1.5.0_10-oth-JPR", + "title": "J2SE(TM) Development Kit 5.0 Update 10" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_09_b03/jdk-1_5_0_09-linux-amd64.bin", + "name": "jdk-1_5_0_09-linux-amd64.bin", + "title": "Linux x64 self-extracting file (use 32-bit version for applet and Java Web Start support) " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_09_b03/jdk-1_5_0_09-linux-i586.bin", + "name": "jdk-1_5_0_09-linux-i586.bin", + "title": "Linux self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_09_b03/jdk-1_5_0_09-solaris-amd64.sh", + "name": "jdk-1_5_0_09-solaris-amd64.sh", + "title": "Solaris x64 self-extracting file (use 32-bit version for applet and Java Web Start support) " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_09_b03/jdk-1_5_0_09-solaris-i586.sh", + "name": "jdk-1_5_0_09-solaris-i586.sh", + "title": "Solaris x86 self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_09_b03/jdk-1_5_0_09-solaris-sparc.sh", + "name": "jdk-1_5_0_09-solaris-sparc.sh", + "title": "Solaris SPARC 32-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_09_b03/jdk-1_5_0_09-solaris-sparcv9.sh", + "name": "jdk-1_5_0_09-solaris-sparcv9.sh", + "title": "Solaris SPARC 64-bit self-extracting file (use 32-bit version for applet and Java Web Start support) " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_09_b03/jdk-1_5_0_09-windows-amd64.exe", + "name": "jdk-1_5_0_09-windows-amd64.exe", + "title": "Windows x64 executable (use 32-bit version for applet and Java Web Start support) " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_09_b03/jdk-1_5_0_09-windows-i586-p.exe", + "name": "jdk-1_5_0_09-windows-i586-p.exe", + "title": "Windows Offline Installation " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "jdk-1.5.0_09-oth-JPR", + "title": "J2SE(TM) Development Kit 5.0 Update 9" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_08/jdk-1_5_0_08-linux-amd64.bin", + "name": "jdk-1_5_0_08-linux-amd64.bin", + "title": "Linux x64 self-extracting file (use 32-bit version for applet and Java Web Start support) " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_08/jdk-1_5_0_08-linux-i586.bin", + "name": "jdk-1_5_0_08-linux-i586.bin", + "title": "Linux self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_08/jdk-1_5_0_08-solaris-amd64.sh", + "name": "jdk-1_5_0_08-solaris-amd64.sh", + "title": "Solaris x64 self-extracting file (use 32-bit version for applet and Java Web Start support) " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_08/jdk-1_5_0_08-solaris-i586.sh", + "name": "jdk-1_5_0_08-solaris-i586.sh", + "title": "Solaris x86 self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_08/jdk-1_5_0_08-solaris-sparc.sh", + "name": "jdk-1_5_0_08-solaris-sparc.sh", + "title": "Solaris SPARC 32-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_08/jdk-1_5_0_08-solaris-sparcv9.sh", + "name": "jdk-1_5_0_08-solaris-sparcv9.sh", + "title": "Solaris SPARC 64-bit self-extracting file (use 32-bit version for applet and Java Web Start support) " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_08/jdk-1_5_0_08-windows-amd64.exe", + "name": "jdk-1_5_0_08-windows-amd64.exe", + "title": "Windows x64 executable (use 32-bit version for applet and Java Web Start support) " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_08/jdk-1_5_0_08-windows-i586-p.exe", + "name": "jdk-1_5_0_08-windows-i586-p.exe", + "title": "Windows Offline Installation " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "jdk-1.5.0_08-oth-JPR", + "title": "J2SE(TM) Development Kit 5.0 Update 8" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_07/jdk-1_5_0_07-linux-amd64.bin", + "name": "jdk-1_5_0_07-linux-amd64.bin", + "title": "Linux AMD64 self-extracting file (use 32-bit version for applet and Java Web Start support) " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_07/jdk-1_5_0_07-linux-i586.bin", + "name": "jdk-1_5_0_07-linux-i586.bin", + "title": "Linux self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_07/jdk-1_5_0_07-solaris-amd64.sh", + "name": "jdk-1_5_0_07-solaris-amd64.sh", + "title": "Solaris x64 self-extracting file (use 32-bit version for applet and Java Web Start support) " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_07/jdk-1_5_0_07-solaris-i586.sh", + "name": "jdk-1_5_0_07-solaris-i586.sh", + "title": "Solaris x86 self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_07/jdk-1_5_0_07-solaris-sparc.sh", + "name": "jdk-1_5_0_07-solaris-sparc.sh", + "title": "Solaris SPARC 32-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_07/jdk-1_5_0_07-solaris-sparcv9.sh", + "name": "jdk-1_5_0_07-solaris-sparcv9.sh", + "title": "Solaris SPARC 64-bit self-extracting file (use 32-bit version for applet and Java Web Start support) " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_07/jdk-1_5_0_07-windows-amd64.exe", + "name": "jdk-1_5_0_07-windows-amd64.exe", + "title": "Windows AMD64 executable (use 32-bit version for applet and Java Web Start support) " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_07/jdk-1_5_0_07-windows-i586-p.exe", + "name": "jdk-1_5_0_07-windows-i586-p.exe", + "title": "Windows Offline Installation " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "jdk-1.5.0_07-oth-JPR", + "title": "J2SE(TM) Development Kit 5.0 Update 7" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_06/jdk-1_5_0_06-linux-amd64.bin", + "name": "jdk-1_5_0_06-linux-amd64.bin", + "title": "Linux AMD64 self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_06/jdk-1_5_0_06-linux-i586.bin", + "name": "jdk-1_5_0_06-linux-i586.bin", + "title": "Linux self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_06/jdk-1_5_0_06-solaris-amd64.sh", + "name": "jdk-1_5_0_06-solaris-amd64.sh", + "title": "Solaris x64 self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_06/jdk-1_5_0_06-solaris-i586.sh", + "name": "jdk-1_5_0_06-solaris-i586.sh", + "title": "Solaris x86 self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_06/jdk-1_5_0_06-solaris-sparc.sh", + "name": "jdk-1_5_0_06-solaris-sparc.sh", + "title": "Solaris SPARC 32-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_06/jdk-1_5_0_06-solaris-sparcv9.sh", + "name": "jdk-1_5_0_06-solaris-sparcv9.sh", + "title": "Solaris SPARC 64-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_06/jdk-1_5_0_06-windows-amd64.exe", + "name": "jdk-1_5_0_06-windows-amd64.exe", + "title": "Windows AMD64 executable " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_06/jdk-1_5_0_06-windows-i586-p.exe", + "name": "jdk-1_5_0_06-windows-i586-p.exe", + "title": "Windows Offline Installation " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "jdk-1.5.0_06-oth-JPR", + "title": "J2SE(TM) Development Kit 5.0 Update 6" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_06b02-cap/jdk-1_5_0_06-ea-bin-b02-linux-amd64-23_aug_2005.bin", + "name": "jdk-1_5_0_06-ea-bin-b02-linux-amd64-23_aug_2005.bin", + "title": "Linux AMD64 self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_06b02-cap/jdk-1_5_0_06-ea-bin-b02-linux-i586-23_aug_2005.bin", + "name": "jdk-1_5_0_06-ea-bin-b02-linux-i586-23_aug_2005.bin", + "title": "Linux Installation " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_06b02-cap/jdk-1_5_0_06-ea-bin-b02-solaris-amd64-23_aug_2005.sh", + "name": "jdk-1_5_0_06-ea-bin-b02-solaris-amd64-23_aug_2005.sh", + "title": "Solaris x64 self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_06b02-cap/jdk-1_5_0_06-ea-bin-b02-solaris-i586-23_aug_2005.sh", + "name": "jdk-1_5_0_06-ea-bin-b02-solaris-i586-23_aug_2005.sh", + "title": "Solaris x86 self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_06b02-cap/jdk-1_5_0_06-ea-bin-b02-solaris-sparc-23_aug_2005.sh", + "name": "jdk-1_5_0_06-ea-bin-b02-solaris-sparc-23_aug_2005.sh", + "title": "Solaris SPARC 32-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_06b02-cap/jdk-1_5_0_06-ea-bin-b02-solaris-sparcv9-23_aug_2005.sh", + "name": "jdk-1_5_0_06-ea-bin-b02-solaris-sparcv9-23_aug_2005.sh", + "title": "Solaris SPARC 64-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_06b02-cap/jdk-1_5_0_06-ea-bin-b02-windows-amd64-23_aug_2005.exe", + "name": "jdk-1_5_0_06-ea-bin-b02-windows-amd64-23_aug_2005.exe", + "title": "Windows AMD64 executable " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_06b02-cap/jdk-1_5_0_06-ea-bin-b02-windows-i586-p-23_aug_2005.exe", + "name": "jdk-1_5_0_06-ea-bin-b02-windows-i586-p-23_aug_2005.exe", + "title": "Windows Installation " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "jdk-1.5.0_06-b02-cap-oth-JPR", + "title": "Java(TM) SDK, Standard Edition, Compatibility and Performance (CAP) 5.0_06 Build 2" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_05/jdk-1_5_0_05-linux-amd64.bin", + "name": "jdk-1_5_0_05-linux-amd64.bin", + "title": "Linux AMD64 self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_05/jdk-1_5_0_05-linux-i586.bin", + "name": "jdk-1_5_0_05-linux-i586.bin", + "title": "Linux self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_05/jdk-1_5_0_05-solaris-amd64.sh", + "name": "jdk-1_5_0_05-solaris-amd64.sh", + "title": "Solaris x64 self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_05/jdk-1_5_0_05-solaris-i586.sh", + "name": "jdk-1_5_0_05-solaris-i586.sh", + "title": "Solaris x86 self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_05/jdk-1_5_0_05-solaris-sparc.sh", + "name": "jdk-1_5_0_05-solaris-sparc.sh", + "title": "Solaris SPARC 32-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_05/jdk-1_5_0_05-solaris-sparcv9.sh", + "name": "jdk-1_5_0_05-solaris-sparcv9.sh", + "title": "Solaris SPARC 64-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_05/jdk-1_5_0_05-windows-amd64.exe", + "name": "jdk-1_5_0_05-windows-amd64.exe", + "title": "Windows AMD64 executable " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_05/jdk-1_5_0_05-windows-i586-p.exe", + "name": "jdk-1_5_0_05-windows-i586-p.exe", + "title": "Windows Offline Installation " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "jdk-1.5.0_05-oth-JPR", + "title": "J2SE(TM) Development Kit 5.0 Update 5" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_04/jdk-1_5_0_04-linux-amd64.bin", + "name": "jdk-1_5_0_04-linux-amd64.bin", + "title": "Linux AMD64 self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_04/jdk-1_5_0_04-linux-i586.bin", + "name": "jdk-1_5_0_04-linux-i586.bin", + "title": "Linux self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_04/jdk-1_5_0_04-solaris-amd64.sh", + "name": "jdk-1_5_0_04-solaris-amd64.sh", + "title": "Solaris x64 self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_04/jdk-1_5_0_04-solaris-i586.sh", + "name": "jdk-1_5_0_04-solaris-i586.sh", + "title": "Solaris x86 self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_04/jdk-1_5_0_04-solaris-sparc.sh", + "name": "jdk-1_5_0_04-solaris-sparc.sh", + "title": "Solaris SPARC 32-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_04/jdk-1_5_0_04-solaris-sparcv9.sh", + "name": "jdk-1_5_0_04-solaris-sparcv9.sh", + "title": "Solaris SPARC 64-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_04/jdk-1_5_0_04-windows-amd64.exe", + "name": "jdk-1_5_0_04-windows-amd64.exe", + "title": "Windows AMD64 executable " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_04/jdk-1_5_0_04-windows-i586-p.exe", + "name": "jdk-1_5_0_04-windows-i586-p.exe", + "title": "Windows Offline Installation " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "jdk-1.5.0_04-oth-JPR", + "title": "J2SE(TM) Development Kit 5.0 Update 4" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_03/jdk-1_5_0_03-linux-amd64.bin", + "name": "jdk-1_5_0_03-linux-amd64.bin", + "title": "Linux AMD64 self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_03/jdk-1_5_0_03-linux-i586.bin", + "name": "jdk-1_5_0_03-linux-i586.bin", + "title": "Linux self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_03/jdk-1_5_0_03-solaris-amd64.sh", + "name": "jdk-1_5_0_03-solaris-amd64.sh", + "title": "Solaris AMD64 self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_03/jdk-1_5_0_03-solaris-i586.sh", + "name": "jdk-1_5_0_03-solaris-i586.sh", + "title": "Solaris x86 self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_03/jdk-1_5_0_03-solaris-sparc.sh", + "name": "jdk-1_5_0_03-solaris-sparc.sh", + "title": "Solaris SPARC 32-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_03/jdk-1_5_0_03-solaris-sparcv9.sh", + "name": "jdk-1_5_0_03-solaris-sparcv9.sh", + "title": "Solaris SPARC 64-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_03/jdk-1_5_0_03-windows-i586-p.exe", + "name": "jdk-1_5_0_03-windows-i586-p.exe", + "title": "Windows Offline Installation " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "jdk-1.5.0_03-oth-JPR", + "title": "J2SE(TM) Development Kit 5.0 Update 3" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_02/jdk-1_5_0_02-linux-amd64.bin", + "name": "jdk-1_5_0_02-linux-amd64.bin", + "title": "Linux AMD64 self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_02/jdk-1_5_0_02-linux-i586.bin", + "name": "jdk-1_5_0_02-linux-i586.bin", + "title": "Linux self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_02/jdk-1_5_0_02-solaris-amd64.sh", + "name": "jdk-1_5_0_02-solaris-amd64.sh", + "title": "Solaris AMD64 self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_02/jdk-1_5_0_02-solaris-i586.sh", + "name": "jdk-1_5_0_02-solaris-i586.sh", + "title": "Solaris x86 self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_02/jdk-1_5_0_02-solaris-sparc.sh", + "name": "jdk-1_5_0_02-solaris-sparc.sh", + "title": "Solaris SPARC 32-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_02/jdk-1_5_0_02-solaris-sparcv9.sh", + "name": "jdk-1_5_0_02-solaris-sparcv9.sh", + "title": "Solaris SPARC 64-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_02/jdk-1_5_0_02-windows-i586-p.exe", + "name": "jdk-1_5_0_02-windows-i586-p.exe", + "title": "Windows Offline Installation " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "jdk-1.5.0_02-oth-JPR", + "title": "J2SE(TM) Development Kit 5.0 Update 2" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_01/jdk-1_5_0_01-linux-amd64.bin", + "name": "jdk-1_5_0_01-linux-amd64.bin", + "title": "Linux AMD64 self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_01/jdk-1_5_0_01-linux-i586.bin", + "name": "jdk-1_5_0_01-linux-i586.bin", + "title": "Linux self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_01/jdk-1_5_0_01-solaris-i586.sh", + "name": "jdk-1_5_0_01-solaris-i586.sh", + "title": "Solaris x86 self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_01/jdk-1_5_0_01-solaris-sparc.sh", + "name": "jdk-1_5_0_01-solaris-sparc.sh", + "title": "Solaris SPARC 32-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_01/jdk-1_5_0_01-solaris-sparcv9.sh", + "name": "jdk-1_5_0_01-solaris-sparcv9.sh", + "title": "Solaris SPARC 64-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0_01/jdk-1_5_0_01-windows-i586-p.exe", + "name": "jdk-1_5_0_01-windows-i586-p.exe", + "title": "Windows Offline Installation " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "jdk-1.5.0_01-oth-JPR", + "title": "J2SE(TM) Development Kit 5.0 Update 1" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0/jdk-1_5_0-linux-amd64.bin", + "name": "jdk-1_5_0-linux-amd64.bin", + "title": "Linux AMD64 self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0/jdk-1_5_0-linux-i586.bin", + "name": "jdk-1_5_0-linux-i586.bin", + "title": "Linux self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0/jdk-1_5_0-solaris-i586.sh", + "name": "jdk-1_5_0-solaris-i586.sh", + "title": "Solaris x86 self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0/jdk-1_5_0-solaris-sparc.sh", + "name": "jdk-1_5_0-solaris-sparc.sh", + "title": "Solaris SPARC 32-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0/jdk-1_5_0-solaris-sparcv9.sh", + "name": "jdk-1_5_0-solaris-sparcv9.sh", + "title": "Solaris SPARC 64-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/jdk/1.5.0/jdk-1_5_0-windows-i586.exe", + "name": "jdk-1_5_0-windows-i586.exe", + "title": "Windows Offline Installation " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "jdk-1.5.0-oth-JPR", + "title": "J2SE(TM) Development Kit 5.0" + } + ] + }, + { + "name": "JDK 1.4", + "releases": [ + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_30-b04/j2sdk-1_4_2_30-solaris-amd64.sh", + "name": "j2sdk-1_4_2_30-solaris-amd64.sh", + "title": "Java 2 Software Development Kit (J2SDK) Standard Edition for Solaris 1.4.2_30 " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_30-b04/j2sdk-1_4_2_30-solaris-i586.sh", + "name": "j2sdk-1_4_2_30-solaris-i586.sh", + "title": "Java 2 Software Development Kit (J2SDK) Standard Edition for Solaris 1.4.2_30 " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_30-b04/j2sdk-1_4_2_30-solaris-sparc.sh", + "name": "j2sdk-1_4_2_30-solaris-sparc.sh", + "title": "Java 2 Software Development Kit (J2SDK) Standard Edition for Solaris 1.4.2_30 " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_30-b04/j2sdk-1_4_2_30-solaris-sparcv9.sh", + "name": "j2sdk-1_4_2_30-solaris-sparcv9.sh", + "title": "Java 2 Software Development Kit (J2SDK) Standard Edition for Solaris 1.4.2_30 " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "j2sdk-1.4.2_30-sol-JPR", + "title": "Java SE Development Kit 1.4.2_30" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_29-b01/j2sdk-1_4_2_29-solaris-amd64.sh", + "name": "j2sdk-1_4_2_29-solaris-amd64.sh", + "title": "Java 2 Software Development Kit (J2SDK) Standard Edition for Solaris 1.4.2_29 " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_29-b01/j2sdk-1_4_2_29-solaris-i586.sh", + "name": "j2sdk-1_4_2_29-solaris-i586.sh", + "title": "Java 2 Software Development Kit (J2SDK) Standard Edition for Solaris 1.4.2_29 " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_29-b01/j2sdk-1_4_2_29-solaris-sparc.sh", + "name": "j2sdk-1_4_2_29-solaris-sparc.sh", + "title": "Java 2 Software Development Kit (J2SDK) Standard Edition for Solaris 1.4.2_29 " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_29-b01/j2sdk-1_4_2_29-solaris-sparcv9.sh", + "name": "j2sdk-1_4_2_29-solaris-sparcv9.sh", + "title": "Java 2 Software Development Kit (J2SDK) Standard Edition for Solaris 1.4.2_29 " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "j2sdk-1.4.2_29-sol-JPR", + "title": "Java SE Development Kit 1.4.2_29" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_28-b03/j2sdk-1_4_2_28-solaris-amd64.sh", + "name": "j2sdk-1_4_2_28-solaris-amd64.sh", + "title": "Java 2 Software Development Kit (J2SDK) Standard Edition for Solaris 1.4.2_28 " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_28-b03/j2sdk-1_4_2_28-solaris-i586.sh", + "name": "j2sdk-1_4_2_28-solaris-i586.sh", + "title": "Java 2 Software Development Kit (J2SDK) Standard Edition for Solaris 1.4.2_28 " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_28-b03/j2sdk-1_4_2_28-solaris-sparc.sh", + "name": "j2sdk-1_4_2_28-solaris-sparc.sh", + "title": "Java 2 Software Development Kit (J2SDK) Standard Edition for Solaris 1.4.2_28 " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_28-b03/j2sdk-1_4_2_28-solaris-sparcv9.sh", + "name": "j2sdk-1_4_2_28-solaris-sparcv9.sh", + "title": "Java 2 Software Development Kit (J2SDK) Standard Edition for Solaris 1.4.2_28 " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "j2sdk-1.4.2_28-sol-JPR", + "title": "Java SE Development Kit 1.4.2_28" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_27-b03/j2sdk-1_4_2_27-solaris-amd64.sh", + "name": "j2sdk-1_4_2_27-solaris-amd64.sh", + "title": "Java 2 Software Development Kit (J2SDK) Standard Edition for Solaris 1.4.2_27 " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_27-b03/j2sdk-1_4_2_27-solaris-i586.sh", + "name": "j2sdk-1_4_2_27-solaris-i586.sh", + "title": "Java 2 Software Development Kit (J2SDK) Standard Edition for Solaris 1.4.2_27 " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_27-b03/j2sdk-1_4_2_27-solaris-sparc.sh", + "name": "j2sdk-1_4_2_27-solaris-sparc.sh", + "title": "Java 2 Software Development Kit (J2SDK) Standard Edition for Solaris 1.4.2_27 " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_27-b03/j2sdk-1_4_2_27-solaris-sparcv9.sh", + "name": "j2sdk-1_4_2_27-solaris-sparcv9.sh", + "title": "Java 2 Software Development Kit (J2SDK) Standard Edition for Solaris 1.4.2_27 " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "j2sdk-1.4.2_27-sol-JPR", + "title": "Java SE Development Kit 1.4.2_27" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_26-b03/j2sdk-1_4_2_26-solaris-amd64.sh", + "name": "j2sdk-1_4_2_26-solaris-amd64.sh", + "title": "Java 2 Software Development Kit (J2SDK) Standard Edition for Solaris 1.4.2_26 " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_26-b03/j2sdk-1_4_2_26-solaris-i586.sh", + "name": "j2sdk-1_4_2_26-solaris-i586.sh", + "title": "Java 2 Software Development Kit (J2SDK) Standard Edition for Solaris 1.4.2_26 " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_26-b03/j2sdk-1_4_2_26-solaris-sparc.sh", + "name": "j2sdk-1_4_2_26-solaris-sparc.sh", + "title": "Java 2 Software Development Kit (J2SDK) Standard Edition for Solaris 1.4.2_26 " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_26-b03/j2sdk-1_4_2_26-solaris-sparcv9.sh", + "name": "j2sdk-1_4_2_26-solaris-sparcv9.sh", + "title": "Java 2 Software Development Kit (J2SDK) Standard Edition for Solaris 1.4.2_26 " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "j2sdk-1.4.2_26-sol-JPR", + "title": "Java SE Development Kit 1.4.2_26" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_25/j2sdk-1_4_2_25-solaris-amd64.sh", + "name": "j2sdk-1_4_2_25-solaris-amd64.sh", + "title": "Java 2 Software Development Kit (J2SDK) Standard Edition for Solaris 1.4.2_25 " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_25/j2sdk-1_4_2_25-solaris-i586.sh", + "name": "j2sdk-1_4_2_25-solaris-i586.sh", + "title": "Java 2 Software Development Kit (J2SDK) Standard Edition for Solaris 1.4.2_25 " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_25/j2sdk-1_4_2_25-solaris-sparc.sh", + "name": "j2sdk-1_4_2_25-solaris-sparc.sh", + "title": "Java 2 Software Development Kit (J2SDK) Standard Edition for Solaris 1.4.2_25 " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_25/j2sdk-1_4_2_25-solaris-sparcv9.sh", + "name": "j2sdk-1_4_2_25-solaris-sparcv9.sh", + "title": "Java 2 Software Development Kit (J2SDK) Standard Edition for Solaris 1.4.2_25 " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "j2sdk-1.4.2_25-sol-JPR", + "title": "Java SE Development Kit 1.4.2_25" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_24/j2sdk-1_4_2_24-solaris-amd64.sh", + "name": "j2sdk-1_4_2_24-solaris-amd64.sh", + "title": "Java 2 Software Development Kit (J2SDK) Standard Edition for Solaris 1.4.2_24 " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_24/j2sdk-1_4_2_24-solaris-i586.sh", + "name": "j2sdk-1_4_2_24-solaris-i586.sh", + "title": "Java 2 Software Development Kit (J2SDK) Standard Edition for Solaris 1.4.2_24 " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_24/j2sdk-1_4_2_24-solaris-sparc.sh", + "name": "j2sdk-1_4_2_24-solaris-sparc.sh", + "title": "Java 2 Software Development Kit (J2SDK) Standard Edition for Solaris 1.4.2_24 " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_24/j2sdk-1_4_2_24-solaris-sparcv9.sh", + "name": "j2sdk-1_4_2_24-solaris-sparcv9.sh", + "title": "Java 2 Software Development Kit (J2SDK) Standard Edition for Solaris 1.4.2_24 " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "j2sdk-1.4.2_24-sol-JPR", + "title": "Java SE Development Kit 1.4.2_24 for Solaris" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_23/j2sdk-1_4_2_23-solaris-amd64.sh", + "name": "j2sdk-1_4_2_23-solaris-amd64.sh", + "title": "Java SE Development Kit 1.4.2_23 " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_23/j2sdk-1_4_2_23-solaris-i586.sh", + "name": "j2sdk-1_4_2_23-solaris-i586.sh", + "title": "Java SE Development Kit 1.4.2_23 " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_23/j2sdk-1_4_2_23-solaris-sparc.sh", + "name": "j2sdk-1_4_2_23-solaris-sparc.sh", + "title": "Java SE Development Kit 1.4.2_23 " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_23/j2sdk-1_4_2_23-solaris-sparcv9.sh", + "name": "j2sdk-1_4_2_23-solaris-sparcv9.sh", + "title": "Java SE Development Kit 1.4.2_23 " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "j2sdk-1.4.2_23-oth-JPR", + "title": "Java SE Development Kit 1.4.2_23" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_22/j2sdk-1_4_2_22-solaris-amd64.sh", + "name": "j2sdk-1_4_2_22-solaris-amd64.sh", + "title": "Java SE Development Kit 1.4.2_22 " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_22/j2sdk-1_4_2_22-solaris-i586.sh", + "name": "j2sdk-1_4_2_22-solaris-i586.sh", + "title": "Java SE Development Kit 1.4.2_22 " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_22/j2sdk-1_4_2_22-solaris-sparc.sh", + "name": "j2sdk-1_4_2_22-solaris-sparc.sh", + "title": "Java SE Development Kit 1.4.2_22 " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_22/j2sdk-1_4_2_22-solaris-sparcv9.sh", + "name": "j2sdk-1_4_2_22-solaris-sparcv9.sh", + "title": "Java SE Development Kit 1.4.2_22 " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "j2sdk-1.4.2_22-oth-JPR", + "title": "Java SE Development Kit 1.4.2_22" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_19/j2sdk-1_4_2_19-linux-i586.bin", + "name": "j2sdk-1_4_2_19-linux-i586.bin", + "title": "Java SE Development Kit 1.4.2_19 " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_19/j2sdk-1_4_2_19-linux-ia64.bin", + "name": "j2sdk-1_4_2_19-linux-ia64.bin", + "title": "Java SE Development Kit 1.4.2_19 " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_19/j2sdk-1_4_2_19-solaris-i586.sh", + "name": "j2sdk-1_4_2_19-solaris-i586.sh", + "title": "Java SE Development Kit 1.4.2_19 " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_19/j2sdk-1_4_2_19-solaris-sparc.sh", + "name": "j2sdk-1_4_2_19-solaris-sparc.sh", + "title": "Java SE Development Kit 1.4.2_19 " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_19/j2sdk-1_4_2_19-solaris-sparcv9.sh", + "name": "j2sdk-1_4_2_19-solaris-sparcv9.sh", + "title": "Java SE Development Kit 1.4.2_19 " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_19/j2sdk-1_4_2_19-windows-i586-p.exe", + "name": "j2sdk-1_4_2_19-windows-i586-p.exe", + "title": "Windows Offline Installation " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_19/j2sdk-1_4_2_19-windows-ia64.exe", + "name": "j2sdk-1_4_2_19-windows-ia64.exe", + "title": "Java SE Development Kit 1.4.2_19 " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "j2sdk-1.4.2_19-oth-JPR", + "title": "Java SE Development Kit 1.4.2_19" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_18/j2sdk-1_4_2_18-linux-i586.bin", + "name": "j2sdk-1_4_2_18-linux-i586.bin", + "title": "Java SE Development Kit 1.4.2_18 " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_18/j2sdk-1_4_2_18-linux-ia64.bin", + "name": "j2sdk-1_4_2_18-linux-ia64.bin", + "title": "Java SE Development Kit 1.4.2_18 " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_18/j2sdk-1_4_2_18-solaris-i586.sh", + "name": "j2sdk-1_4_2_18-solaris-i586.sh", + "title": "Java SE Development Kit 1.4.2_18 " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_18/j2sdk-1_4_2_18-solaris-sparc.sh", + "name": "j2sdk-1_4_2_18-solaris-sparc.sh", + "title": "Java SE Development Kit 1.4.2_18 " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_18/j2sdk-1_4_2_18-solaris-sparcv9.sh", + "name": "j2sdk-1_4_2_18-solaris-sparcv9.sh", + "title": "Java SE Development Kit 1.4.2_18 " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_18/j2sdk-1_4_2_18-windows-i586-p.exe", + "name": "j2sdk-1_4_2_18-windows-i586-p.exe", + "title": "Windows Offline Installation " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_18/j2sdk-1_4_2_18-windows-ia64.exe", + "name": "j2sdk-1_4_2_18-windows-ia64.exe", + "title": "Java SE Development Kit 1.4.2_18 " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "j2sdk-1.4.2_18-oth-JPR", + "title": "Java SE Development Kit 1.4.2_18" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/j2sdk-1_4_2_17-linux-i586.bin", + "name": "j2sdk-1_4_2_17-linux-i586.bin", + "title": "self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/j2sdk-1_4_2_17-linux-ia64.bin", + "name": "j2sdk-1_4_2_17-linux-ia64.bin", + "title": "self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/j2sdk-1_4_2_17-solaris-i586.sh", + "name": "j2sdk-1_4_2_17-solaris-i586.sh", + "title": "self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/j2sdk-1_4_2_17-solaris-sparc.sh", + "name": "j2sdk-1_4_2_17-solaris-sparc.sh", + "title": "32-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/j2sdk-1_4_2_17-solaris-sparcv9.sh", + "name": "j2sdk-1_4_2_17-solaris-sparcv9.sh", + "title": "64-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/j2sdk-1_4_2_17-windows-i586-p.exe", + "name": "j2sdk-1_4_2_17-windows-i586-p.exe", + "title": "Windows Offline Installation " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/j2sdk-1_4_2_17-windows-ia64.exe", + "name": "j2sdk-1_4_2_17-windows-ia64.exe", + "title": "Windows Offline Installation " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "j2sdk-1.4.2_17-oth-JPR", + "title": "Java SE Development Kit 1.4.2_17" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_16/j2sdk-1_4_2_16-linux-i586.bin", + "name": "j2sdk-1_4_2_16-linux-i586.bin", + "title": "self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_16/j2sdk-1_4_2_16-linux-ia64.bin", + "name": "j2sdk-1_4_2_16-linux-ia64.bin", + "title": "self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_16/j2sdk-1_4_2_16-solaris-i586.sh", + "name": "j2sdk-1_4_2_16-solaris-i586.sh", + "title": "self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_16/j2sdk-1_4_2_16-solaris-sparc.sh", + "name": "j2sdk-1_4_2_16-solaris-sparc.sh", + "title": "32-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_16/j2sdk-1_4_2_16-solaris-sparcv9.sh", + "name": "j2sdk-1_4_2_16-solaris-sparcv9.sh", + "title": "64-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_16/j2sdk-1_4_2_16-windows-i586-p.exe", + "name": "j2sdk-1_4_2_16-windows-i586-p.exe", + "title": "Windows Offline Installation " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_16/j2sdk-1_4_2_16-windows-ia64.exe", + "name": "j2sdk-1_4_2_16-windows-ia64.exe", + "title": "Windows 64-bit " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "j2sdk-1.4.2_16-oth-JPR", + "title": "Java SE Development Kit 1.4.2_16" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_15/j2sdk-1_4_2_15-linux-i586.bin", + "name": "j2sdk-1_4_2_15-linux-i586.bin", + "title": "self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_15/j2sdk-1_4_2_15-linux-ia64.bin", + "name": "j2sdk-1_4_2_15-linux-ia64.bin", + "title": "self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_15/j2sdk-1_4_2_15-solaris-i586.sh", + "name": "j2sdk-1_4_2_15-solaris-i586.sh", + "title": "self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_15/j2sdk-1_4_2_15-solaris-sparc.sh", + "name": "j2sdk-1_4_2_15-solaris-sparc.sh", + "title": "32-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_15/j2sdk-1_4_2_15-solaris-sparcv9.sh", + "name": "j2sdk-1_4_2_15-solaris-sparcv9.sh", + "title": "64-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_15/j2sdk-1_4_2_15-windows-i586-p.exe", + "name": "j2sdk-1_4_2_15-windows-i586-p.exe", + "title": "Windows Offline Installation " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_15/j2sdk-1_4_2_15-windows-ia64.exe", + "name": "j2sdk-1_4_2_15-windows-ia64.exe", + "title": "Windows 64-bit " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "j2sdk-1.4.2_15-oth-JPR", + "title": "Java SE Development Kit 1.4.2_15" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_14/j2sdk-1_4_2_14-linux-i586.bin", + "name": "j2sdk-1_4_2_14-linux-i586.bin", + "title": "self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_14/j2sdk-1_4_2_14-linux-ia64.bin", + "name": "j2sdk-1_4_2_14-linux-ia64.bin", + "title": "self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_14/j2sdk-1_4_2_14-solaris-i586.sh", + "name": "j2sdk-1_4_2_14-solaris-i586.sh", + "title": "self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_14/j2sdk-1_4_2_14-solaris-sparc.sh", + "name": "j2sdk-1_4_2_14-solaris-sparc.sh", + "title": "32-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_14/j2sdk-1_4_2_14-solaris-sparcv9.sh", + "name": "j2sdk-1_4_2_14-solaris-sparcv9.sh", + "title": "64-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_14/j2sdk-1_4_2_14-windows-i586-p.exe", + "name": "j2sdk-1_4_2_14-windows-i586-p.exe", + "title": "Windows Offline Installation " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_14/j2sdk-1_4_2_14-windows-ia64.exe", + "name": "j2sdk-1_4_2_14-windows-ia64.exe", + "title": "Windows 64-bit " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "j2sdk-1.4.2_14-oth-JPR", + "title": "Java SE Development Kit 1.4.2_14" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_13/j2sdk-1_4_2_13-linux-i586.bin", + "name": "j2sdk-1_4_2_13-linux-i586.bin", + "title": "self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_13/j2sdk-1_4_2_13-linux-ia64.bin", + "name": "j2sdk-1_4_2_13-linux-ia64.bin", + "title": "self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_13/j2sdk-1_4_2_13-solaris-i586.sh", + "name": "j2sdk-1_4_2_13-solaris-i586.sh", + "title": "self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_13/j2sdk-1_4_2_13-solaris-sparc.sh", + "name": "j2sdk-1_4_2_13-solaris-sparc.sh", + "title": "32-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_13/j2sdk-1_4_2_13-solaris-sparcv9.sh", + "name": "j2sdk-1_4_2_13-solaris-sparcv9.sh", + "title": "64-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_13/j2sdk-1_4_2_13-windows-i586-p.exe", + "name": "j2sdk-1_4_2_13-windows-i586-p.exe", + "title": "Windows Offline Installation " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_13/j2sdk-1_4_2_13-windows-ia64.exe", + "name": "j2sdk-1_4_2_13-windows-ia64.exe", + "title": "Windows 64-bit " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "j2sdk-1.4.2_13-oth-JPR", + "title": "Java SE Development Kit 1.4.2_13" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_12/j2sdk-1_4_2_12-linux-i586.bin", + "name": "j2sdk-1_4_2_12-linux-i586.bin", + "title": "self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_12/j2sdk-1_4_2_12-linux-ia64.bin", + "name": "j2sdk-1_4_2_12-linux-ia64.bin", + "title": "self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_12/j2sdk-1_4_2_12-solaris-i586.sh", + "name": "j2sdk-1_4_2_12-solaris-i586.sh", + "title": "self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_12/j2sdk-1_4_2_12-solaris-sparc.sh", + "name": "j2sdk-1_4_2_12-solaris-sparc.sh", + "title": "32-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_12/j2sdk-1_4_2_12-solaris-sparcv9.sh", + "name": "j2sdk-1_4_2_12-solaris-sparcv9.sh", + "title": "64-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_12/j2sdk-1_4_2_12-windows-i586-p.exe", + "name": "j2sdk-1_4_2_12-windows-i586-p.exe", + "title": "Windows Offline Installation " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_12/j2sdk-1_4_2_12-windows-ia64.exe", + "name": "j2sdk-1_4_2_12-windows-ia64.exe", + "title": "Windows 64-bit " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "j2sdk-1.4.2_12-oth-JPR", + "title": "Java SE Development Kit 1.4.2_12" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_11/j2sdk-1_4_2_11-linux-i586.bin", + "name": "j2sdk-1_4_2_11-linux-i586.bin", + "title": "self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_11/j2sdk-1_4_2_11-linux-ia64.bin", + "name": "j2sdk-1_4_2_11-linux-ia64.bin", + "title": "self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_11/j2sdk-1_4_2_11-solaris-i586.sh", + "name": "j2sdk-1_4_2_11-solaris-i586.sh", + "title": "self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_11/j2sdk-1_4_2_11-solaris-sparc.sh", + "name": "j2sdk-1_4_2_11-solaris-sparc.sh", + "title": "32-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_11/j2sdk-1_4_2_11-solaris-sparcv9.sh", + "name": "j2sdk-1_4_2_11-solaris-sparcv9.sh", + "title": "64-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_11/j2sdk-1_4_2_11-windows-i586-p.exe", + "name": "j2sdk-1_4_2_11-windows-i586-p.exe", + "title": "Windows Offline Installation " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_11/j2sdk-1_4_2_11-windows-ia64.exe", + "name": "j2sdk-1_4_2_11-windows-ia64.exe", + "title": "Windows 64-bit " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "j2sdk-1.4.2_11-oth-JPR", + "title": "Java SE Development Kit 1.4.2_11" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_10/j2sdk-1_4_2_10-linux-i586.bin", + "name": "j2sdk-1_4_2_10-linux-i586.bin", + "title": "self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_10/j2sdk-1_4_2_10-linux-ia64.bin", + "name": "j2sdk-1_4_2_10-linux-ia64.bin", + "title": "self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_10/j2sdk-1_4_2_10-solaris-i586.sh", + "name": "j2sdk-1_4_2_10-solaris-i586.sh", + "title": "self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_10/j2sdk-1_4_2_10-solaris-sparc.sh", + "name": "j2sdk-1_4_2_10-solaris-sparc.sh", + "title": "32-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_10/j2sdk-1_4_2_10-solaris-sparcv9.sh", + "name": "j2sdk-1_4_2_10-solaris-sparcv9.sh", + "title": "64-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_10/j2sdk-1_4_2_10-windows-i586-p.exe", + "name": "j2sdk-1_4_2_10-windows-i586-p.exe", + "title": "Windows Offline Installation " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_10/j2sdk-1_4_2_10-windows-ia64.exe", + "name": "j2sdk-1_4_2_10-windows-ia64.exe", + "title": "Windows 64-bit " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "j2sdk-1.4.2_10-oth-JPR", + "title": "Java SE Development Kit 1.4.2_10" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_09/j2sdk-1_4_2_09-linux-i586.bin", + "name": "j2sdk-1_4_2_09-linux-i586.bin", + "title": "self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_09/j2sdk-1_4_2_09-linux-ia64.bin", + "name": "j2sdk-1_4_2_09-linux-ia64.bin", + "title": "self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_09/j2sdk-1_4_2_09-solaris-i586.sh", + "name": "j2sdk-1_4_2_09-solaris-i586.sh", + "title": "self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_09/j2sdk-1_4_2_09-solaris-sparc.sh", + "name": "j2sdk-1_4_2_09-solaris-sparc.sh", + "title": "32-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_09/j2sdk-1_4_2_09-solaris-sparcv9.sh", + "name": "j2sdk-1_4_2_09-solaris-sparcv9.sh", + "title": "64-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_09/j2sdk-1_4_2_09-windows-i586-p.exe", + "name": "j2sdk-1_4_2_09-windows-i586-p.exe", + "title": "Windows Offline Installation " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_09/j2sdk-1_4_2_09-windows-ia64.exe", + "name": "j2sdk-1_4_2_09-windows-ia64.exe", + "title": "Windows 64-bit " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "j2sdk-1.4.2_09-oth-JPR", + "title": "Java SE Development Kit 1.4.2_09" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_08/j2sdk-1_4_2_08-linux-i586.bin", + "name": "j2sdk-1_4_2_08-linux-i586.bin", + "title": "self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_08/j2sdk-1_4_2_08-linux-ia64.bin", + "name": "j2sdk-1_4_2_08-linux-ia64.bin", + "title": "self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_08/j2sdk-1_4_2_08-solaris-i586.sh", + "name": "j2sdk-1_4_2_08-solaris-i586.sh", + "title": "self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_08/j2sdk-1_4_2_08-solaris-sparc.sh", + "name": "j2sdk-1_4_2_08-solaris-sparc.sh", + "title": "32-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_08/j2sdk-1_4_2_08-solaris-sparcv9.sh", + "name": "j2sdk-1_4_2_08-solaris-sparcv9.sh", + "title": "64-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_08/j2sdk-1_4_2_08-windows-i586-p.exe", + "name": "j2sdk-1_4_2_08-windows-i586-p.exe", + "title": "Windows Offline Installation " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_08/j2sdk-1_4_2_08-windows-ia64.exe", + "name": "j2sdk-1_4_2_08-windows-ia64.exe", + "title": "Windows 64-bit " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "j2sdk-1.4.2_08-oth-JPR", + "title": "Java SE Development Kit 1.4.2_08" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_07/j2sdk-1_4_2_07-linux-i586.bin", + "name": "j2sdk-1_4_2_07-linux-i586.bin", + "title": "self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_07/j2sdk-1_4_2_07-linux-ia64.bin", + "name": "j2sdk-1_4_2_07-linux-ia64.bin", + "title": "self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_07/j2sdk-1_4_2_07-solaris-i586.sh", + "name": "j2sdk-1_4_2_07-solaris-i586.sh", + "title": "self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_07/j2sdk-1_4_2_07-solaris-sparc.sh", + "name": "j2sdk-1_4_2_07-solaris-sparc.sh", + "title": "32-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_07/j2sdk-1_4_2_07-solaris-sparcv9.sh", + "name": "j2sdk-1_4_2_07-solaris-sparcv9.sh", + "title": "64-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_07/j2sdk-1_4_2_07-windows-i586-p.exe", + "name": "j2sdk-1_4_2_07-windows-i586-p.exe", + "title": "Windows Offline Installation " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_07/j2sdk-1_4_2_07-windows-ia64.exe", + "name": "j2sdk-1_4_2_07-windows-ia64.exe", + "title": "Windows 64-bit " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "j2sdk-1.4.2_07-oth-JPR", + "title": "Java SE Development Kit 1.4.2_07" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_06/j2sdk-1_4_2_06-linux-i586.bin", + "name": "j2sdk-1_4_2_06-linux-i586.bin", + "title": "self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_06/j2sdk-1_4_2_06-linux-ia64.bin", + "name": "j2sdk-1_4_2_06-linux-ia64.bin", + "title": "self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_06/j2sdk-1_4_2_06-solaris-i586.sh", + "name": "j2sdk-1_4_2_06-solaris-i586.sh", + "title": "self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_06/j2sdk-1_4_2_06-solaris-sparc.sh", + "name": "j2sdk-1_4_2_06-solaris-sparc.sh", + "title": "32-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_06/j2sdk-1_4_2_06-solaris-sparcv9.sh", + "name": "j2sdk-1_4_2_06-solaris-sparcv9.sh", + "title": "64-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_06/j2sdk-1_4_2_06-windows-i586-p.exe", + "name": "j2sdk-1_4_2_06-windows-i586-p.exe", + "title": "Windows Offline Installation " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_06/j2sdk-1_4_2_06-windows-ia64.exe", + "name": "j2sdk-1_4_2_06-windows-ia64.exe", + "title": "Windows 64-bit " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "j2sdk-1.4.2_06-oth-JPR", + "title": "Java SE Development Kit 1.4.2_06" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_05/j2sdk-1_4_2_05-linux-i586.bin", + "name": "j2sdk-1_4_2_05-linux-i586.bin", + "title": "self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_05/j2sdk-1_4_2_05-linux-ia64.bin", + "name": "j2sdk-1_4_2_05-linux-ia64.bin", + "title": "self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_05/j2sdk-1_4_2_05-solaris-i586.sh", + "name": "j2sdk-1_4_2_05-solaris-i586.sh", + "title": "self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_05/j2sdk-1_4_2_05-solaris-sparc.sh", + "name": "j2sdk-1_4_2_05-solaris-sparc.sh", + "title": "32-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_05/j2sdk-1_4_2_05-solaris-sparcv9.sh", + "name": "j2sdk-1_4_2_05-solaris-sparcv9.sh", + "title": "64-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_05/j2sdk-1_4_2_05-windows-i586-p.exe", + "name": "j2sdk-1_4_2_05-windows-i586-p.exe", + "title": "Windows Offline Installation " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_05/j2sdk-1_4_2_05-windows-ia64.exe", + "name": "j2sdk-1_4_2_05-windows-ia64.exe", + "title": "Windows 64-bit " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "j2sdk-1.4.2_05-oth-JPR", + "title": "Java SE Development Kit 1.4.2_05" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_04/j2sdk-1_4_2_04-linux-i586.bin", + "name": "j2sdk-1_4_2_04-linux-i586.bin", + "title": "self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_04/j2sdk-1_4_2_04-linux-ia64.bin", + "name": "j2sdk-1_4_2_04-linux-ia64.bin", + "title": "self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_04/j2sdk-1_4_2_04-solaris-i586.sh", + "name": "j2sdk-1_4_2_04-solaris-i586.sh", + "title": "self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_04/j2sdk-1_4_2_04-solaris-sparc.sh", + "name": "j2sdk-1_4_2_04-solaris-sparc.sh", + "title": "32-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_04/j2sdk-1_4_2_04-solaris-sparcv9.sh", + "name": "j2sdk-1_4_2_04-solaris-sparcv9.sh", + "title": "64-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_04/j2sdk-1_4_2_04-windows-i586-p.exe", + "name": "j2sdk-1_4_2_04-windows-i586-p.exe", + "title": "Windows Offline Installation " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_04/j2sdk-1_4_2_04-windows-ia64.exe", + "name": "j2sdk-1_4_2_04-windows-ia64.exe", + "title": "Windows 64-bit " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "j2sdk-1.4.2_04-oth-JPR", + "title": "Java SE Development Kit 1.4.2_04" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_03/j2sdk-1_4_2_03-linux-i586.bin", + "name": "j2sdk-1_4_2_03-linux-i586.bin", + "title": "self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_03/j2sdk-1_4_2_03-linux-ia64.bin", + "name": "j2sdk-1_4_2_03-linux-ia64.bin", + "title": "self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_03/j2sdk-1_4_2_03-solaris-i586.sh", + "name": "j2sdk-1_4_2_03-solaris-i586.sh", + "title": "self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_03/j2sdk-1_4_2_03-solaris-sparc.sh", + "name": "j2sdk-1_4_2_03-solaris-sparc.sh", + "title": "32-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_03/j2sdk-1_4_2_03-solaris-sparcv9.sh", + "name": "j2sdk-1_4_2_03-solaris-sparcv9.sh", + "title": "64-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_03/j2sdk-1_4_2_03-windows-i586-p.exe", + "name": "j2sdk-1_4_2_03-windows-i586-p.exe", + "title": "Windows Offline Installation " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_03/j2sdk-1_4_2_03-windows-ia64.exe", + "name": "j2sdk-1_4_2_03-windows-ia64.exe", + "title": "Windows 64-bit " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "j2sdk-1.4.2_03-oth-JPR", + "title": "Java SE Development Kit 1.4.2_03" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.1_07/j2sdk-1_4_1_07-linux-i586.bin", + "name": "j2sdk-1_4_1_07-linux-i586.bin", + "title": "self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.1_07/j2sdk-1_4_1_07-solaris-i586.sh", + "name": "j2sdk-1_4_1_07-solaris-i586.sh", + "title": "self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.1_07/j2sdk-1_4_1_07-solaris-sparc.sh", + "name": "j2sdk-1_4_1_07-solaris-sparc.sh", + "title": "32-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.1_07/j2sdk-1_4_1_07-solaris-sparcv9.sh", + "name": "j2sdk-1_4_1_07-solaris-sparcv9.sh", + "title": "64-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.1_07/j2sdk-1_4_1_07-windows-i586.exe", + "name": "j2sdk-1_4_1_07-windows-i586.exe", + "title": "Windows (all languages, including English) " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "j2sdk-1.4.1_07-oth-JPR", + "title": "Java SE Development Kit 1.4.1_07" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.1_06/j2sdk-1_4_1_06-linux-i586.bin", + "name": "j2sdk-1_4_1_06-linux-i586.bin", + "title": "self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.1_06/j2sdk-1_4_1_06-solaris-i586.sh", + "name": "j2sdk-1_4_1_06-solaris-i586.sh", + "title": "self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.1_06/j2sdk-1_4_1_06-solaris-sparc.sh", + "name": "j2sdk-1_4_1_06-solaris-sparc.sh", + "title": "32-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.1_06/j2sdk-1_4_1_06-solaris-sparcv9.sh", + "name": "j2sdk-1_4_1_06-solaris-sparcv9.sh", + "title": "64-bit self-extracting file * " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.1_06/j2sdk-1_4_1_06-windows-i586.exe", + "name": "j2sdk-1_4_1_06-windows-i586.exe", + "title": "Windows (all languages, including English) " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "j2sdk-1.4.1_06-oth-JPR", + "title": "Java SE Development Kit 1.4.1_06" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_02/j2sdk-1_4_2_02-linux-i586.bin", + "name": "j2sdk-1_4_2_02-linux-i586.bin", + "title": "Linux self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_02/j2sdk-1_4_2_02-linux-ia64.bin", + "name": "j2sdk-1_4_2_02-linux-ia64.bin", + "title": "Linux 64-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_02/j2sdk-1_4_2_02-solaris-i586.sh", + "name": "j2sdk-1_4_2_02-solaris-i586.sh", + "title": "Solaris x86 self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_02/j2sdk-1_4_2_02-solaris-sparc.sh", + "name": "j2sdk-1_4_2_02-solaris-sparc.sh", + "title": "Solaris SPARC 32-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_02/j2sdk-1_4_2_02-solaris-sparcv9.sh", + "name": "j2sdk-1_4_2_02-solaris-sparcv9.sh", + "title": "Solaris SPARC 64-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_02/j2sdk-1_4_2_02-windows-i586-p.exe", + "name": "j2sdk-1_4_2_02-windows-i586-p.exe", + "title": "Windows Offline Installation " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_02/j2sdk-1_4_2_02-windows-ia64.exe", + "name": "j2sdk-1_4_2_02-windows-ia64.exe", + "title": "Windows 64-bit " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "7741-j2sdk-1.4.2_02-oth-JPR", + "title": "Java SE Development Kit 1.4.2_02" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_01/j2sdk-1_4_2_01-linux-i586.bin", + "name": "j2sdk-1_4_2_01-linux-i586.bin", + "title": "Linux self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_01/j2sdk-1_4_2_01-linux-ia64.bin", + "name": "j2sdk-1_4_2_01-linux-ia64.bin", + "title": "Linux 64-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_01/j2sdk-1_4_2_01-solaris-i586.sh", + "name": "j2sdk-1_4_2_01-solaris-i586.sh", + "title": "Solaris x86 self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_01/j2sdk-1_4_2_01-solaris-sparc.sh", + "name": "j2sdk-1_4_2_01-solaris-sparc.sh", + "title": "Solaris SPARC 32-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_01/j2sdk-1_4_2_01-solaris-sparcv9.sh", + "name": "j2sdk-1_4_2_01-solaris-sparcv9.sh", + "title": "Solaris SPARC 64-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_01/j2sdk-1_4_2_01-windows-i586.exe", + "name": "j2sdk-1_4_2_01-windows-i586.exe", + "title": "Windows Offline Installation " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2_01/j2sdk-1_4_2_01-windows-ia64.exe", + "name": "j2sdk-1_4_2_01-windows-ia64.exe", + "title": "Windows 64-bit " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "7639-j2sdk-1.4.2_01-oth-JPR", + "title": "Java SE Development Kit 1.4.2_01" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.1_05/j2sdk-1_4_1_05-linux-i586.bin", + "name": "j2sdk-1_4_1_05-linux-i586.bin", + "title": "Linux self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.1_05/j2sdk-1_4_1_05-solaris-i586.sh", + "name": "j2sdk-1_4_1_05-solaris-i586.sh", + "title": "Solaris x86 self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.1_05/j2sdk-1_4_1_05-solaris-sparc.sh", + "name": "j2sdk-1_4_1_05-solaris-sparc.sh", + "title": "Solaris SPARC 32-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.1_05/j2sdk-1_4_1_05-solaris-sparcv9.sh", + "name": "j2sdk-1_4_1_05-solaris-sparcv9.sh", + "title": "Solaris SPARC 64-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.1_05/j2sdk-1_4_1_05-windows-i586.exe", + "name": "j2sdk-1_4_1_05-windows-i586.exe", + "title": "Windows (all languages, including English) " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "7637-j2sdk-1.4.1_05-oth-JPR", + "title": "Java SE Development Kit 1.4.1_05" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.1_04/j2sdk-1_4_1_04-linux-i586.bin", + "name": "j2sdk-1_4_1_04-linux-i586.bin", + "title": "Linux self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.1_04/j2sdk-1_4_1_04-solaris-i586.sh", + "name": "j2sdk-1_4_1_04-solaris-i586.sh", + "title": "Solaris x86 self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.1_04/j2sdk-1_4_1_04-solaris-sparc.sh", + "name": "j2sdk-1_4_1_04-solaris-sparc.sh", + "title": "Solaris SPARC 32-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.1_04/j2sdk-1_4_1_04-solaris-sparcv9.sh", + "name": "j2sdk-1_4_1_04-solaris-sparcv9.sh", + "title": "Solaris SPARC 64-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.1_04/j2sdk-1_4_1_04-windows-i586.exe", + "name": "j2sdk-1_4_1_04-windows-i586.exe", + "title": "Windows (all languages, including English) " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "7533-j2sdk-1.4.1_04-oth-JPR", + "title": "Java SE Development Kit 1.4.1_04" + }, + { + "files": [ { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2/j2sdk-1_4_2-doc.zip", + "name": "j2sdk-1_4_2-doc.zip", + "title": "J2SE 1.4.2 Documentation " + }], + "licpath": "http://download.oracle.com/otn-pub/java/licenses/J2SE 1.4.2.txt", + "lictitle": "JDK Documentation License Agreement", + "name": "7502-j2sdk-1.4.2-doc-oth-JPR", + "title": "Java SE Development Kit Documentation 1.4.2" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2/j2sdk-1_4_2-linux-i586.bin", + "name": "j2sdk-1_4_2-linux-i586.bin", + "title": "Linux self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2/j2sdk-1_4_2-linux-ia64.bin", + "name": "j2sdk-1_4_2-linux-ia64.bin", + "title": "Linux 64-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2/j2sdk-1_4_2-solaris-i586.sh", + "name": "j2sdk-1_4_2-solaris-i586.sh", + "title": "Solaris x86 self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2/j2sdk-1_4_2-solaris-sparc.sh", + "name": "j2sdk-1_4_2-solaris-sparc.sh", + "title": "Solaris SPARC 32-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2/j2sdk-1_4_2-solaris-sparcv9.sh", + "name": "j2sdk-1_4_2-solaris-sparcv9.sh", + "title": "Solaris SPARC 64-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2/j2sdk-1_4_2-windows-i586.exe", + "name": "j2sdk-1_4_2-windows-i586.exe", + "title": "Windows Offline Installation " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.2/j2sdk-1_4_2-windows-ia64.exe", + "name": "j2sdk-1_4_2-windows-ia64.exe", + "title": "Windows 64-bit " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "7501-j2sdk-1.4.2-oth-JPR", + "title": "Java SE Development Kit 1.4.2" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.1_03/j2sdk-1_4_1_03-linux-i586.bin", + "name": "j2sdk-1_4_1_03-linux-i586.bin", + "title": "Linux self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.1_03/j2sdk-1_4_1_03-solaris-i586.sh", + "name": "j2sdk-1_4_1_03-solaris-i586.sh", + "title": "Solaris x86 self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.1_03/j2sdk-1_4_1_03-solaris-sparc.sh", + "name": "j2sdk-1_4_1_03-solaris-sparc.sh", + "title": "Solaris SPARC 32-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.1_03/j2sdk-1_4_1_03-solaris-sparcv9.sh", + "name": "j2sdk-1_4_1_03-solaris-sparcv9.sh", + "title": "Solaris SPARC 64-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.1_03/j2sdk-1_4_1_03-windows-i586.exe", + "name": "j2sdk-1_4_1_03-windows-i586.exe", + "title": "Windows (all languages, including English) " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "7405-j2sdk-1.4.1_03-oth-JPR", + "title": "Java SE Development Kit 1.4.1_03" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.0_04/j2sdk-1_4_0_04-linux-i586.bin", + "name": "j2sdk-1_4_0_04-linux-i586.bin", + "title": "Linux self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.0_04/j2sdk-1_4_0_04-solaris-i586.sh", + "name": "j2sdk-1_4_0_04-solaris-i586.sh", + "title": "Solaris x86 self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.0_04/j2sdk-1_4_0_04-solaris-sparc.sh", + "name": "j2sdk-1_4_0_04-solaris-sparc.sh", + "title": "Solaris SPARC 32-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.0_04/j2sdk-1_4_0_04-solaris-sparcv9.sh", + "name": "j2sdk-1_4_0_04-solaris-sparcv9.sh", + "title": "Solaris SPARC 64-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.0_04/j2sdk-1_4_0_04-windows-i586.exe", + "name": "j2sdk-1_4_0_04-windows-i586.exe", + "title": "Windows (all languages, including English) " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "7225-j2sdk-1.4.0_04-oth-JPR", + "title": "Java SE Development Kit 1.4.0_04" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.1_02/j2sdk-1_4_1_02-linux-i586.bin", + "name": "j2sdk-1_4_1_02-linux-i586.bin", + "title": "Linux self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.1_02/j2sdk-1_4_1_02-solaris-i586.sh", + "name": "j2sdk-1_4_1_02-solaris-i586.sh", + "title": "Solaris x86 self-extracting file (Solaris 7, Solaris 8) " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.1_02/j2sdk-1_4_1_02-solaris-sparc.sh", + "name": "j2sdk-1_4_1_02-solaris-sparc.sh", + "title": "Solaris SPARC 32-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.1_02/j2sdk-1_4_1_02-solaris-sparcv9.sh", + "name": "j2sdk-1_4_1_02-solaris-sparcv9.sh", + "title": "Solaris SPARC 64-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.1_02/j2sdk-1_4_1_02-windows-i586.exe", + "name": "j2sdk-1_4_1_02-windows-i586.exe", + "title": "Windows (all languages, including English) " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "7190-j2sdk-1.4.1_02-oth-JPR", + "title": "Java SE Development Kit 1.4.1_02" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.0/j2sdk-1_4_0-doc-ja.zip", + "name": "j2sdk-1_4_0-doc-ja.zip", + "title": "J2SE 1.4 Documentation, Japanese " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.0/j2sdk-1_4_0-doc.zip", + "name": "j2sdk-1_4_0-doc.zip", + "title": "J2SE 1.4 Documentation, English " + } + ], + "licpath": "http://download.oracle.com/otn/java/licenses/J2SE 1.4.0.txt", + "lictitle": "Java SE Documentation License Agreement", + "name": "7114-j2sdk-1.4.0-doc-oth-JPR", + "title": "Java SE Development Kit Documentation 1.4.0" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.0_01/j2sdk-1_4_0_01-linux-i586.bin", + "name": "j2sdk-1_4_0_01-linux-i586.bin", + "title": "Linux self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.0_01/j2sdk-1_4_0_01-solaris-i586.sh", + "name": "j2sdk-1_4_0_01-solaris-i586.sh", + "title": "Solaris x86 self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.0_01/j2sdk-1_4_0_01-solaris-sparc.sh", + "name": "j2sdk-1_4_0_01-solaris-sparc.sh", + "title": "Solaris SPARC 32-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.0_01/j2sdk-1_4_0_01-solaris-sparcv9.sh", + "name": "j2sdk-1_4_0_01-solaris-sparcv9.sh", + "title": "Solaris SPARC 64-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.0_01/j2sdk-1_4_0_01-windows-i586.exe", + "name": "j2sdk-1_4_0_01-windows-i586.exe", + "title": "Windows (all languages, including English) " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "7093-j2sdk-1.4.0_01-oth-JPR", + "title": "Java SE Development Kit 1.4.0_01" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.0_03/j2sdk-1_4_0_03-linux-i586.bin", + "name": "j2sdk-1_4_0_03-linux-i586.bin", + "title": "Linux self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.0_03/j2sdk-1_4_0_03-solaris-i586.sh", + "name": "j2sdk-1_4_0_03-solaris-i586.sh", + "title": "Solaris x86 self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.0_03/j2sdk-1_4_0_03-solaris-sparc.sh", + "name": "j2sdk-1_4_0_03-solaris-sparc.sh", + "title": "Solaris SPARC 32-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.0_03/j2sdk-1_4_0_03-solaris-sparcv9.sh", + "name": "j2sdk-1_4_0_03-solaris-sparcv9.sh", + "title": "Solaris SPARC 64-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.0_03/j2sdk-1_4_0_03-windows-i586.exe", + "name": "j2sdk-1_4_0_03-windows-i586.exe", + "title": "Windows (all languages, including English) " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "7087-j2sdk-1.4.0_03-oth-JPR", + "title": "Java SE Development Kit 1.4.0_03" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.0/j2sdk-1_4_0-linux-i386.bin", + "name": "j2sdk-1_4_0-linux-i386.bin", + "title": "Linux self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.0/j2sdk-1_4_0-solsparc.sh", + "name": "j2sdk-1_4_0-solsparc.sh", + "title": "Solaris SPARC 32-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.0/j2sdk-1_4_0-solsparcv9.sh", + "name": "j2sdk-1_4_0-solsparcv9.sh", + "title": "Solaris SPARC 64-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.0/j2sdk-1_4_0-solx86.sh", + "name": "j2sdk-1_4_0-solx86.sh", + "title": "Solaris Intel self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.0/j2sdk-1_4_0-win.exe", + "name": "j2sdk-1_4_0-win.exe", + "title": "Windows (all languages, including English) " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "7074-j2sdk-1.4.0-oth-JPR", + "title": "Java SE Development Kit 1.4.0" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.1/j2sdk-1_4_1-linux-ia64.bin", + "name": "j2sdk-1_4_1-linux-ia64.bin", + "title": "Linux 64-bit (Itanium) self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.1/j2sdk-1_4_1-windows-ia64.tar", + "name": "j2sdk-1_4_1-windows-ia64.tar", + "title": "Windows 64-bit (Itanium) " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "7027-j2sdk-1.4.1-ia64-JPR", + "title": "Java SE Development Kit 1.4.1-ia64" + }, + { + "files": [ { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.1/j2sdk-1_4_1-doc.zip", + "name": "j2sdk-1_4_1-doc.zip", + "title": "J2SE 1.4.1 Documentation " + }], + "licpath": "http://download.oracle.com/otn-pub/java/licenses/J2SE 1.4.1.txt", + "lictitle": "Java SE Documentation License Agreement", + "name": "7020-j2sdk-1.4.1-doc-oth-JPR", + "title": "Java SE Development Kit Documentation 1.4.1" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.1/j2sdk-1_4_1-linux-i586.bin", + "name": "j2sdk-1_4_1-linux-i586.bin", + "title": "Linux self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.1/j2sdk-1_4_1-solaris-i586.sh", + "name": "j2sdk-1_4_1-solaris-i586.sh", + "title": "Solaris x86 self-extracting file (Solaris 7, Solaris 8) " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.1/j2sdk-1_4_1-solaris-sparc.sh", + "name": "j2sdk-1_4_1-solaris-sparc.sh", + "title": "Solaris SPARC self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.1/j2sdk-1_4_1-solaris-sparcv9.sh", + "name": "j2sdk-1_4_1-solaris-sparcv9.sh", + "title": "Solaris SPARC 64-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.1/j2sdk-1_4_1-windows-i586.exe", + "name": "j2sdk-1_4_1-windows-i586.exe", + "title": "Windows (all languages, including English) " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "7018-j2sdk-1.4.1-oth-JPR", + "title": "Java SE Development Kit 1.4.1" + }, + { + "files": [ + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.0_02/j2sdk-1_4_0_02-linux-i586.bin", + "name": "j2sdk-1_4_0_02-linux-i586.bin", + "title": "Linux self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.0_02/j2sdk-1_4_0_02-linux-i586.tar.gz", + "name": "j2sdk-1_4_0_02-linux-i586.tar.gz", + "title": "Java SE Development Kit " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.0_02/j2sdk-1_4_0_02-solaris-i586.sh", + "name": "j2sdk-1_4_0_02-solaris-i586.sh", + "title": "Solaris x86 self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.0_02/j2sdk-1_4_0_02-solaris-sparc.sh", + "name": "j2sdk-1_4_0_02-solaris-sparc.sh", + "title": "Solaris SPARC 32-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.0_02/j2sdk-1_4_0_02-solaris-sparcv9.sh", + "name": "j2sdk-1_4_0_02-solaris-sparcv9.sh", + "title": "Solaris SPARC 64-bit self-extracting file " + }, + { + "filepath": "http://download.oracle.com/otn/java/j2sdk/1.4.0_02/j2sdk-1_4_0_02-windows-i586.exe", + "name": "j2sdk-1_4_0_02-windows-i586.exe", + "title": "Windows (all languages, including English) " + } + ], + "licpath": "/technetwork/java/javase/downloads/java-se-archive-license-1382604.html", + "lictitle": "Oracle Binary Code License Agreement for Java SE", + "name": "7013-j2sdk-1.4.0_02-oth-JPR", + "title": "Java SE Development Kit 1.4.0_02" + } + ] + } + ], + "version": 2 +}) \ No newline at end of file From 6c6e1751feadb17ada65e8e53612eea6840ee175 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Fri, 28 Feb 2014 10:20:54 -0500 Subject: [PATCH 141/701] Deleting failing test updateDirectlyWithHtml. loadJSON does not support parsing HTML. Nor should it need to, since UC URLs are supposed to be to the JSONP file. The .html extension is added automatically by downloadService when postBack is supported. (cherry picked from commit d6b37a94579a0d01359ba393f792fc0823275593) Conflicts: test/src/test/java/hudson/model/UpdateSiteTest.java test/src/test/resources/hudson/model/update-center.json.html --- test/src/test/java/hudson/model/UpdateSiteTest.java | 6 ------ .../src/test/resources/hudson/model/update-center.json.html | 3 --- 2 files changed, 9 deletions(-) delete mode 100644 test/src/test/resources/hudson/model/update-center.json.html diff --git a/test/src/test/java/hudson/model/UpdateSiteTest.java b/test/src/test/java/hudson/model/UpdateSiteTest.java index d7b8bc4783..1f0971ea62 100644 --- a/test/src/test/java/hudson/model/UpdateSiteTest.java +++ b/test/src/test/java/hudson/model/UpdateSiteTest.java @@ -128,10 +128,4 @@ public class UpdateSiteTest { assertNotNull(us.getPlugin("AdaptivePlugin")); } - @Test public void updateDirectlyWithHtml() throws Exception { - UpdateSite us = new UpdateSite("default", new URL(baseUrl, "update-center.json.html").toExternalForm()); - assertNull(us.getPlugin("AdaptivePlugin")); - assertEquals(FormValidation.ok(), us.updateDirectly(false).get()); - assertNotNull(us.getPlugin("AdaptivePlugin")); - } } diff --git a/test/src/test/resources/hudson/model/update-center.json.html b/test/src/test/resources/hudson/model/update-center.json.html deleted file mode 100644 index 43cfa5c37c..0000000000 --- a/test/src/test/resources/hudson/model/update-center.json.html +++ /dev/null @@ -1,3 +0,0 @@ - \ No newline at end of file From 8311fb5c7f74d0a1b2ee057fd3bc5585b3b2cee1 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Fri, 28 Feb 2014 10:52:54 -0500 Subject: [PATCH 142/701] May as well use new DownloadService.loadJSON method here. (cherry picked from commit 1c99cc1af00eb52f6d9ae1963f9db7c12c1fbb5a) --- test/src/test/java/hudson/model/UpdateCenterTest.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/test/src/test/java/hudson/model/UpdateCenterTest.java b/test/src/test/java/hudson/model/UpdateCenterTest.java index 96250ff032..0fc68a1a04 100644 --- a/test/src/test/java/hudson/model/UpdateCenterTest.java +++ b/test/src/test/java/hudson/model/UpdateCenterTest.java @@ -26,7 +26,6 @@ package hudson.model; import com.trilead.ssh2.crypto.Base64; import hudson.util.TimeUnit2; import net.sf.json.JSONObject; -import org.apache.commons.io.IOUtils; import java.io.ByteArrayInputStream; import java.net.URL; @@ -57,8 +56,8 @@ public class UpdateCenterTest { } private void doData(String location) throws Exception { URL url = new URL(location); - String jsonp = IOUtils.toString(url.openStream()); - JSONObject json = JSONObject.fromObject(jsonp.substring(jsonp.indexOf('(') + 1, jsonp.lastIndexOf(')'))); + String jsonp = DownloadService.loadJSON(url); + JSONObject json = JSONObject.fromObject(jsonp); UpdateSite us = new UpdateSite("default", url.toExternalForm()); UpdateSite.Data data = us.new Data(json); From d00f7ab9b62d1524bb286c4bb7be9274adae29cd Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Mon, 17 Mar 2014 12:48:24 -0400 Subject: [PATCH 143/701] Removed DownloadSettings.checkSignature; back to using a plain system property for this. (cherry picked from commit df9c92e461443415be06743f0f8fc0b3937f2408) --- core/src/main/java/hudson/PluginManager.java | 3 +- .../java/hudson/model/DownloadService.java | 11 ++++-- .../main/java/hudson/model/UpdateCenter.java | 3 +- .../main/java/hudson/model/UpdateSite.java | 2 +- .../{security => model}/DownloadSettings.java | 37 +------------------ .../hudson/PluginManager/advanced.jelly | 2 +- .../PageDecoratorImpl/footer.jelly | 2 +- .../model/DownloadSettings/config.groovy | 9 +++++ .../DownloadSettings/help-useBrowser.html | 0 .../security/DownloadSettings/config.groovy | 14 ------- .../DownloadSettings/help-checkSignature.html | 4 -- .../jenkins/security/Messages.properties | 4 +- .../hudson/model/DownloadServiceTest.java | 5 +-- 13 files changed, 26 insertions(+), 70 deletions(-) rename core/src/main/java/jenkins/{security => model}/DownloadSettings.java (66%) create mode 100644 core/src/main/resources/jenkins/model/DownloadSettings/config.groovy rename core/src/main/resources/jenkins/{security => model}/DownloadSettings/help-useBrowser.html (100%) delete mode 100644 core/src/main/resources/jenkins/security/DownloadSettings/config.groovy delete mode 100644 core/src/main/resources/jenkins/security/DownloadSettings/help-checkSignature.html diff --git a/core/src/main/java/hudson/PluginManager.java b/core/src/main/java/hudson/PluginManager.java index 40f577f4e5..c444105b96 100644 --- a/core/src/main/java/hudson/PluginManager.java +++ b/core/src/main/java/hudson/PluginManager.java @@ -111,7 +111,6 @@ import static hudson.init.InitMilestone.*; import hudson.model.DownloadService; import hudson.util.FormValidation; import static java.util.logging.Level.WARNING; -import jenkins.security.DownloadSettings; import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.restrictions.NoExternalUse; @@ -783,7 +782,7 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas @Restricted(NoExternalUse.class) @RequirePOST public HttpResponse doCheckUpdatesServer() throws IOException { for (UpdateSite site : Jenkins.getInstance().getUpdateCenter().getSites()) { - FormValidation v = site.updateDirectlyNow(DownloadSettings.get().isCheckSignature()); + FormValidation v = site.updateDirectlyNow(DownloadService.signatureCheck); if (v.kind != FormValidation.Kind.OK) { // TODO crude but enough for now return v; diff --git a/core/src/main/java/hudson/model/DownloadService.java b/core/src/main/java/hudson/model/DownloadService.java index 2e592d8222..bedf45db0f 100644 --- a/core/src/main/java/hudson/model/DownloadService.java +++ b/core/src/main/java/hudson/model/DownloadService.java @@ -37,7 +37,7 @@ import java.io.InputStream; import java.net.URL; import java.net.URLEncoder; import java.util.logging.Logger; -import jenkins.security.DownloadSettings; +import jenkins.model.DownloadSettings; import jenkins.model.Jenkins; import jenkins.util.JSONSignatureValidator; import net.sf.json.JSONException; @@ -302,7 +302,7 @@ public class DownloadService extends PageDecorator { private FormValidation load(String json, long dataTimestamp) throws IOException { JSONObject o = JSONObject.fromObject(json); - if (DownloadSettings.get().isCheckSignature()) { + if (signatureCheck) { FormValidation e = new JSONSignatureValidator("downloadable '"+id+"'").verifySignature(o); if (e.kind!= Kind.OK) { return e; @@ -346,7 +346,12 @@ public class DownloadService extends PageDecorator { public static boolean neverUpdate = Boolean.getBoolean(DownloadService.class.getName()+".never"); - /** Now used only to set default value of, and enable UI switching of, {@link DownloadSettings#setIgnoreSignature}. */ + /** + * May be used to temporarily disable signature checking on {@link DownloadService} and {@link UpdateCenter}. + * Useful when upstream signatures are broken, such as due to expired certificates. + * Should only be used when {@link DownloadSettings#isUseBrowser}; + * disabling signature checks for in-browser downloads is very dangerous as unprivileged users could submit spoofed metadata! + */ public static boolean signatureCheck = !Boolean.getBoolean(DownloadService.class.getName()+".noSignatureCheck"); } diff --git a/core/src/main/java/hudson/model/UpdateCenter.java b/core/src/main/java/hudson/model/UpdateCenter.java index b7ec3a4e30..040c288f75 100644 --- a/core/src/main/java/hudson/model/UpdateCenter.java +++ b/core/src/main/java/hudson/model/UpdateCenter.java @@ -88,7 +88,6 @@ import java.util.jar.JarFile; import java.util.logging.Level; import java.util.logging.Logger; import javax.annotation.CheckForNull; -import jenkins.security.DownloadSettings; import org.acegisecurity.context.SecurityContextHolder; import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.restrictions.NoExternalUse; @@ -631,7 +630,7 @@ public class UpdateCenter extends AbstractModelObject implements Saveable, OnMas public List updateAllSites() throws InterruptedException, ExecutionException { List > futures = new ArrayList>(); for (UpdateSite site : getSites()) { - Future future = site.updateDirectly(DownloadSettings.get().isCheckSignature()); + Future future = site.updateDirectly(DownloadService.signatureCheck); if (future != null) { futures.add(future); } diff --git a/core/src/main/java/hudson/model/UpdateSite.java b/core/src/main/java/hudson/model/UpdateSite.java index 1681aabab1..006b8a003b 100644 --- a/core/src/main/java/hudson/model/UpdateSite.java +++ b/core/src/main/java/hudson/model/UpdateSite.java @@ -56,7 +56,7 @@ import org.apache.commons.io.IOUtils; import javax.annotation.CheckForNull; import javax.annotation.Nonnull; import jenkins.model.Jenkins; -import jenkins.security.DownloadSettings; +import jenkins.model.DownloadSettings; import jenkins.util.JSONSignatureValidator; import net.sf.json.JSONException; import net.sf.json.JSONObject; diff --git a/core/src/main/java/jenkins/security/DownloadSettings.java b/core/src/main/java/jenkins/model/DownloadSettings.java similarity index 66% rename from core/src/main/java/jenkins/security/DownloadSettings.java rename to core/src/main/java/jenkins/model/DownloadSettings.java index 9961e64a06..0cf410c28b 100644 --- a/core/src/main/java/jenkins/security/DownloadSettings.java +++ b/core/src/main/java/jenkins/model/DownloadSettings.java @@ -22,24 +22,19 @@ * THE SOFTWARE. */ -package jenkins.security; +package jenkins.model; import hudson.Extension; -import hudson.PluginManager; import hudson.model.AsyncPeriodicWork; import hudson.model.DownloadService; import hudson.model.TaskListener; import hudson.model.UpdateSite; import hudson.util.FormValidation; import java.io.IOException; -import jenkins.model.GlobalConfiguration; -import jenkins.model.GlobalConfigurationCategory; -import jenkins.model.Jenkins; import net.sf.json.JSONObject; import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.restrictions.NoExternalUse; import org.kohsuke.stapler.HttpResponse; -import org.kohsuke.stapler.QueryParameter; import org.kohsuke.stapler.StaplerRequest; /** @@ -55,17 +50,11 @@ import org.kohsuke.stapler.StaplerRequest; } private boolean useBrowser = true; // historical default, not necessarily recommended - @SuppressWarnings("deprecation") - private boolean checkSignature = DownloadService.signatureCheck; public DownloadSettings() { load(); } - @Override public GlobalConfigurationCategory getCategory() { - return GlobalConfigurationCategory.get(GlobalConfigurationCategory.Security.class); - } - @Override public boolean configure(StaplerRequest req, JSONObject json) throws FormException { req.bindJSON(this, json); return true; @@ -80,30 +69,6 @@ import org.kohsuke.stapler.StaplerRequest; save(); } - public boolean isCheckSignature() { - return checkSignature; - } - - public void setCheckSignature(boolean checkSignature) { - if (!checkSignature) { - // Just to be on the safe side. Normally this is implied by ADMINISTER, needed to configure the security screen anyway, - // but in case ADMINISTER but not CONFIGURE_UPDATECENTER is somehow granted, make sure signature checking cannot be disabled. - Jenkins.getInstance().checkPermission(PluginManager.CONFIGURE_UPDATECENTER); - } - this.checkSignature = checkSignature; - save(); - } - - public FormValidation doCheckCheckSignature(@QueryParameter boolean value, @QueryParameter boolean useBrowser) { - if (value) { - return FormValidation.ok(); - } else if (useBrowser) { - return FormValidation.warningWithMarkup(Messages.DownloadSettings_disabling_signature_checks_for_in_browse()); - } else { - return FormValidation.warningWithMarkup(Messages.DownloadSettings_disabling_signature_checks_is_not_recomm()); - } - } - @Extension public static final class DailyCheck extends AsyncPeriodicWork { public DailyCheck() { diff --git a/core/src/main/resources/hudson/PluginManager/advanced.jelly b/core/src/main/resources/hudson/PluginManager/advanced.jelly index 79dc056fbc..b6ade3c2d5 100644 --- a/core/src/main/resources/hudson/PluginManager/advanced.jelly +++ b/core/src/main/resources/hudson/PluginManager/advanced.jelly @@ -96,7 +96,7 @@ THE SOFTWARE.
                - +
                ${%lastUpdated(app.updateCenter.lastUpdatedString)} diff --git a/core/src/main/resources/hudson/model/UpdateCenter/PageDecoratorImpl/footer.jelly b/core/src/main/resources/hudson/model/UpdateCenter/PageDecoratorImpl/footer.jelly index 1751517592..777f1192c7 100644 --- a/core/src/main/resources/hudson/model/UpdateCenter/PageDecoratorImpl/footer.jelly +++ b/core/src/main/resources/hudson/model/UpdateCenter/PageDecoratorImpl/footer.jelly @@ -31,7 +31,7 @@ THE SOFTWARE. --> - + diff --git a/core/src/main/resources/jenkins/model/DownloadSettings/config.groovy b/core/src/main/resources/jenkins/model/DownloadSettings/config.groovy new file mode 100644 index 0000000000..9c8987f561 --- /dev/null +++ b/core/src/main/resources/jenkins/model/DownloadSettings/config.groovy @@ -0,0 +1,9 @@ +package jenkins.security.DownloadSettings + +def f = namespace(lib.FormTagLib) + +f.section(title: _("Download Preferences")) { + f.entry(title: _("Use Browser"), field: "useBrowser") { + f.checkbox() + } +} diff --git a/core/src/main/resources/jenkins/security/DownloadSettings/help-useBrowser.html b/core/src/main/resources/jenkins/model/DownloadSettings/help-useBrowser.html similarity index 100% rename from core/src/main/resources/jenkins/security/DownloadSettings/help-useBrowser.html rename to core/src/main/resources/jenkins/model/DownloadSettings/help-useBrowser.html diff --git a/core/src/main/resources/jenkins/security/DownloadSettings/config.groovy b/core/src/main/resources/jenkins/security/DownloadSettings/config.groovy deleted file mode 100644 index 90c81a0dab..0000000000 --- a/core/src/main/resources/jenkins/security/DownloadSettings/config.groovy +++ /dev/null @@ -1,14 +0,0 @@ -package jenkins.security.DownloadSettings - -def f = namespace(lib.FormTagLib) - -f.section(title: _("Download Preferences")) { - f.entry(title: _("Use Browser"), field: "useBrowser") { - f.checkbox() - } - if (!instance.checkSignature || !hudson.model.DownloadService.signatureCheck) { // do not display this option by default - f.entry(title: _("Check Signatures"), field: "checkSignature") { - f.checkbox() - } - } -} diff --git a/core/src/main/resources/jenkins/security/DownloadSettings/help-checkSignature.html b/core/src/main/resources/jenkins/security/DownloadSettings/help-checkSignature.html deleted file mode 100644 index d639bbaf78..0000000000 --- a/core/src/main/resources/jenkins/security/DownloadSettings/help-checkSignature.html +++ /dev/null @@ -1,4 +0,0 @@ -
                - Uncheck to skip the signature check on downloaded metadata. - This is generally dangerous and should only be used as an emergency measure when dealing with broken upstream metadata. -
                diff --git a/core/src/main/resources/jenkins/security/Messages.properties b/core/src/main/resources/jenkins/security/Messages.properties index 2c93ecc382..fc71097d03 100644 --- a/core/src/main/resources/jenkins/security/Messages.properties +++ b/core/src/main/resources/jenkins/security/Messages.properties @@ -22,6 +22,4 @@ ApiTokenProperty.DisplayName=API Token ApiTokenProperty.ChangeToken.Success=
                Updated
                -DownloadSettings.disabling_signature_checks_for_in_browse=Disabling signature checks for in-browser downloads is very dangerous as unprivileged users could submit spoofed metadata! -DownloadSettings.disabling_signature_checks_is_not_recomm=Disabling signature checks is not recommended except as a temporary measure when upstream metadata is broken, such as due to expired certificates. -RekeySecretAdminMonitor.DisplayName=Re-keying +RekeySecretAdminMonitor.DisplayName=Re-keying \ No newline at end of file diff --git a/test/src/test/java/hudson/model/DownloadServiceTest.java b/test/src/test/java/hudson/model/DownloadServiceTest.java index 50ff400070..0b01c00c9f 100644 --- a/test/src/test/java/hudson/model/DownloadServiceTest.java +++ b/test/src/test/java/hudson/model/DownloadServiceTest.java @@ -5,7 +5,6 @@ import java.io.IOException; import java.net.URL; import java.util.Set; import java.util.TreeSet; -import jenkins.security.DownloadSettings; import net.sf.json.JSONObject; import org.jvnet.hudson.test.Bug; import org.jvnet.hudson.test.HudsonTestCase; @@ -41,13 +40,13 @@ public class DownloadServiceTest extends HudsonTestCase { assertNull(job.getData()); // and now it should work - DownloadSettings.get().setCheckSignature(false); + DownloadService.signatureCheck = false; try { createWebClient().goTo("/self/testPost"); JSONObject d = job.getData(); assertEquals(hashCode(),d.getInt("hello")); } finally { - DownloadSettings.get().setCheckSignature(true); + DownloadService.signatureCheck = true; } // TODO: test with a signature From 6b71faccb95285fb15a72703b2c2e4efdc905512 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Fri, 9 Jan 2015 15:25:41 -0500 Subject: [PATCH 144/701] Reproduced problem in a test. --- .../java/jenkins/model/DownloadSettings.java | 2 +- .../hudson/model/DownloadService2Test.java | 45 +++++++++++++++++++ 2 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 test/src/test/java/hudson/model/DownloadService2Test.java diff --git a/core/src/main/java/jenkins/model/DownloadSettings.java b/core/src/main/java/jenkins/model/DownloadSettings.java index 0cf410c28b..73b80a4e74 100644 --- a/core/src/main/java/jenkins/model/DownloadSettings.java +++ b/core/src/main/java/jenkins/model/DownloadSettings.java @@ -49,7 +49,7 @@ import org.kohsuke.stapler.StaplerRequest; return Jenkins.getInstance().getInjector().getInstance(DownloadSettings.class); } - private boolean useBrowser = true; // historical default, not necessarily recommended + private boolean useBrowser = false; // TODO switch saved preferences one time, or add an admin monitor, or just delete the option (in which case can also delete DownloadServiceTest and its testPost.jelly) public DownloadSettings() { load(); diff --git a/test/src/test/java/hudson/model/DownloadService2Test.java b/test/src/test/java/hudson/model/DownloadService2Test.java new file mode 100644 index 0000000000..5d35f9c7c3 --- /dev/null +++ b/test/src/test/java/hudson/model/DownloadService2Test.java @@ -0,0 +1,45 @@ +/* + * The MIT License + * + * Copyright 2015 Jesse Glick. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package hudson.model; + +import hudson.util.FormValidation; +import org.junit.Test; +import static org.junit.Assert.*; +import org.junit.Rule; +import org.jvnet.hudson.test.JenkinsRule; + +public class DownloadService2Test { + + @Rule public JenkinsRule r = new JenkinsRule(); + + //@Issue("SECURITY-163") + @Test public void updateNow() throws Exception { + for (DownloadService.Downloadable d : DownloadService.Downloadable.all()) { + FormValidation v = d.updateNow(); + assertEquals(v.toString(), FormValidation.Kind.OK, v.kind); + } + } + +} From 877f4b37ee49e46c6bb6e13536f1f4f53560fa97 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Fri, 5 Dec 2014 11:32:51 -0500 Subject: [PATCH 145/701] Misleading error message. (cherry picked from commit e4c5c7104206536c80379ce18ec640f56b7dba74) --- .../main/java/jenkins/security/DefaultConfidentialStore.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/jenkins/security/DefaultConfidentialStore.java b/core/src/main/java/jenkins/security/DefaultConfidentialStore.java index 88eb84fc1c..989769b32a 100644 --- a/core/src/main/java/jenkins/security/DefaultConfidentialStore.java +++ b/core/src/main/java/jenkins/security/DefaultConfidentialStore.java @@ -106,7 +106,7 @@ public class DefaultConfidentialStore extends ConfidentialStore { byte[] bytes = IOUtils.toByteArray(cis); return verifyMagic(bytes); } catch (GeneralSecurityException e) { - throw new IOException("Failed to persist the key: "+key.getId(),e); + throw new IOException("Failed to load the key: "+key.getId(),e); } finally { IOUtils.closeQuietly(cis); IOUtils.closeQuietly(fis); From 16afb73b254504d0f0f1246e34cce1fb5bd65c35 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Fri, 5 Dec 2014 12:07:50 -0500 Subject: [PATCH 146/701] [FIXED JENKINS-25937] Treat BadPaddingException as an unloadable key and continue. (cherry picked from commit 6318b8d800abdf8b280f4e1b8ce8bf22e49242ad) --- changelog.html | 4 +++- .../java/jenkins/security/DefaultConfidentialStore.java | 7 +++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/changelog.html b/changelog.html index 585cba089c..4f9927792f 100644 --- a/changelog.html +++ b/changelog.html @@ -55,7 +55,9 @@ Upcoming changes diff --git a/core/src/main/java/jenkins/security/DefaultConfidentialStore.java b/core/src/main/java/jenkins/security/DefaultConfidentialStore.java index 989769b32a..7821f492fd 100644 --- a/core/src/main/java/jenkins/security/DefaultConfidentialStore.java +++ b/core/src/main/java/jenkins/security/DefaultConfidentialStore.java @@ -16,6 +16,7 @@ import java.io.FileOutputStream; import java.io.IOException; import java.security.GeneralSecurityException; import java.security.SecureRandom; +import javax.crypto.BadPaddingException; import org.apache.commons.io.IOUtils; /** @@ -107,6 +108,12 @@ public class DefaultConfidentialStore extends ConfidentialStore { return verifyMagic(bytes); } catch (GeneralSecurityException e) { throw new IOException("Failed to load the key: "+key.getId(),e); + } catch (IOException x) { + if (x.getCause() instanceof BadPaddingException) { + return null; // broken somehow + } else { + throw x; + } } finally { IOUtils.closeQuietly(cis); IOUtils.closeQuietly(fis); From cc95634ddf077d0fddc3deaba79d66c48586c2a2 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Fri, 9 Jan 2015 16:18:04 -0500 Subject: [PATCH 147/701] Can get signatures from *.json.html. --- .../java/hudson/model/DownloadService.java | 30 +- .../java/jenkins/model/DownloadSettings.java | 2 +- .../hudson/model/DownloadService2Test.java | 21 +- ...udson.tasks.Maven.MavenInstaller.json.html | 158 + .../model/hudson.tools.JDKInstaller.json.html | 6498 +++++++++++++++++ 5 files changed, 6704 insertions(+), 5 deletions(-) create mode 100644 test/src/test/resources/hudson/model/hudson.tasks.Maven.MavenInstaller.json.html create mode 100644 test/src/test/resources/hudson/model/hudson.tools.JDKInstaller.json.html diff --git a/core/src/main/java/hudson/model/DownloadService.java b/core/src/main/java/hudson/model/DownloadService.java index bedf45db0f..90d6109a48 100644 --- a/core/src/main/java/hudson/model/DownloadService.java +++ b/core/src/main/java/hudson/model/DownloadService.java @@ -171,6 +171,30 @@ public class DownloadService extends PageDecorator { } } + /** + * Loads JSON from a JSON-with-{@code postMessage} URL. + * @param src a URL to a JSON HTML file (typically including {@code id} and {@code version} query parameters) + * @return the embedded JSON text + * @throws IOException if either downloading or processing failed + */ + @Restricted(NoExternalUse.class) + public static String loadJSONHTML(URL src) throws IOException { + InputStream is = ProxyConfiguration.open(src).getInputStream(); + try { + String jsonp = IOUtils.toString(is, "UTF-8"); + String preamble = "window.parent.postMessage(JSON.stringify("; + int start = jsonp.indexOf(preamble); + int end = jsonp.lastIndexOf("),'*');"); + if (start >= 0 && end > start) { + return jsonp.substring(start + preamble.length(), end); + } else { + throw new IOException("Could not find JSON in " + src); + } + } finally { + is.close(); + } + } + /** * Represents a periodically updated JSON data file obtained from a remote URL. * @@ -205,7 +229,7 @@ public class DownloadService extends PageDecorator { public Downloadable() { this.id = getClass().getName().replace('$','.'); - this.url = this.id+".json"; + this.url = this.id + ".json.html"; this.interval = DEFAULT_INTERVAL; } @@ -217,7 +241,7 @@ public class DownloadService extends PageDecorator { } public Downloadable(String id) { - this(id,id+".json"); + this(id, id + ".json.html"); } public Downloadable(String id, String url) { @@ -318,7 +342,7 @@ public class DownloadService extends PageDecorator { @Restricted(NoExternalUse.class) public FormValidation updateNow() throws IOException { - return load(loadJSON(new URL(getUrl() + "?id=" + URLEncoder.encode(getId(), "UTF-8") + "&version=" + URLEncoder.encode(Jenkins.VERSION, "UTF-8"))), System.currentTimeMillis()); + return load(loadJSONHTML(new URL(getUrl() + "?id=" + URLEncoder.encode(getId(), "UTF-8") + "&version=" + URLEncoder.encode(Jenkins.VERSION, "UTF-8"))), System.currentTimeMillis()); } /** diff --git a/core/src/main/java/jenkins/model/DownloadSettings.java b/core/src/main/java/jenkins/model/DownloadSettings.java index 73b80a4e74..ba015ccc92 100644 --- a/core/src/main/java/jenkins/model/DownloadSettings.java +++ b/core/src/main/java/jenkins/model/DownloadSettings.java @@ -49,7 +49,7 @@ import org.kohsuke.stapler.StaplerRequest; return Jenkins.getInstance().getInjector().getInstance(DownloadSettings.class); } - private boolean useBrowser = false; // TODO switch saved preferences one time, or add an admin monitor, or just delete the option (in which case can also delete DownloadServiceTest and its testPost.jelly) + private boolean useBrowser = false; // TODO switch saved preferences one time, or add an admin monitor, or just delete the option (in which case can also delete DownloadServiceTest and its testPost.jelly and its *Installer.json) public DownloadSettings() { load(); diff --git a/test/src/test/java/hudson/model/DownloadService2Test.java b/test/src/test/java/hudson/model/DownloadService2Test.java index 5d35f9c7c3..02f917cb07 100644 --- a/test/src/test/java/hudson/model/DownloadService2Test.java +++ b/test/src/test/java/hudson/model/DownloadService2Test.java @@ -25,16 +25,21 @@ package hudson.model; import hudson.util.FormValidation; +import java.net.URL; +import java.util.Set; +import java.util.TreeSet; +import net.sf.json.JSONObject; import org.junit.Test; import static org.junit.Assert.*; import org.junit.Rule; import org.jvnet.hudson.test.JenkinsRule; +import org.jvnet.hudson.test.WithoutJenkins; +//@Issue("SECURITY-163") public class DownloadService2Test { @Rule public JenkinsRule r = new JenkinsRule(); - //@Issue("SECURITY-163") @Test public void updateNow() throws Exception { for (DownloadService.Downloadable d : DownloadService.Downloadable.all()) { FormValidation v = d.updateNow(); @@ -42,4 +47,18 @@ public class DownloadService2Test { } } + @WithoutJenkins + @Test public void loadJSONHTML() throws Exception { + assertRoots("[list, signature]", "hudson.tasks.Maven.MavenInstaller.json.html"); // format used by most tools + assertRoots("[data, signature, version]", "hudson.tools.JDKInstaller.json.html"); // anomalous format + } + + private static void assertRoots(String expected, String file) throws Exception { + URL resource = DownloadService2Test.class.getResource(file); + assertNotNull(file, resource); + JSONObject json = JSONObject.fromObject(DownloadService.loadJSONHTML(resource)); + @SuppressWarnings("unchecked") Set keySet = json.keySet(); + assertEquals(expected, new TreeSet(keySet).toString()); + } + } diff --git a/test/src/test/resources/hudson/model/hudson.tasks.Maven.MavenInstaller.json.html b/test/src/test/resources/hudson/model/hudson.tasks.Maven.MavenInstaller.json.html new file mode 100644 index 0000000000..18518c13e0 --- /dev/null +++ b/test/src/test/resources/hudson/model/hudson.tasks.Maven.MavenInstaller.json.html @@ -0,0 +1,158 @@ + \ No newline at end of file diff --git a/test/src/test/resources/hudson/model/hudson.tools.JDKInstaller.json.html b/test/src/test/resources/hudson/model/hudson.tools.JDKInstaller.json.html new file mode 100644 index 0000000000..5b315032c5 --- /dev/null +++ b/test/src/test/resources/hudson/model/hudson.tools.JDKInstaller.json.html @@ -0,0 +1,6498 @@ + \ No newline at end of file From 712a223728afa6694146f450a32891e2b6ccfa56 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Fri, 9 Jan 2015 16:48:23 -0500 Subject: [PATCH 148/701] Trim whitespace off JSONP. --- core/src/main/java/hudson/model/DownloadService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/hudson/model/DownloadService.java b/core/src/main/java/hudson/model/DownloadService.java index 90d6109a48..b549c416b0 100644 --- a/core/src/main/java/hudson/model/DownloadService.java +++ b/core/src/main/java/hudson/model/DownloadService.java @@ -186,7 +186,7 @@ public class DownloadService extends PageDecorator { int start = jsonp.indexOf(preamble); int end = jsonp.lastIndexOf("),'*');"); if (start >= 0 && end > start) { - return jsonp.substring(start + preamble.length(), end); + return jsonp.substring(start + preamble.length(), end).trim(); } else { throw new IOException("Could not find JSON in " + src); } From 52cc68808d20266ba85ed7e0b170538c468890c2 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Fri, 9 Jan 2015 16:48:33 -0500 Subject: [PATCH 149/701] Keep comments in the PR. --- core/src/main/java/jenkins/model/DownloadSettings.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/jenkins/model/DownloadSettings.java b/core/src/main/java/jenkins/model/DownloadSettings.java index ba015ccc92..577d884892 100644 --- a/core/src/main/java/jenkins/model/DownloadSettings.java +++ b/core/src/main/java/jenkins/model/DownloadSettings.java @@ -49,7 +49,7 @@ import org.kohsuke.stapler.StaplerRequest; return Jenkins.getInstance().getInjector().getInstance(DownloadSettings.class); } - private boolean useBrowser = false; // TODO switch saved preferences one time, or add an admin monitor, or just delete the option (in which case can also delete DownloadServiceTest and its testPost.jelly and its *Installer.json) + private boolean useBrowser = false; public DownloadSettings() { load(); From 03f047d801406f8fd60ac0bc86c12e71ccfe12c5 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Sat, 10 Jan 2015 08:33:02 -0500 Subject: [PATCH 150/701] Test failure. --- test/src/test/java/hudson/model/DownloadServiceTest.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/src/test/java/hudson/model/DownloadServiceTest.java b/test/src/test/java/hudson/model/DownloadServiceTest.java index 0b01c00c9f..4325702f06 100644 --- a/test/src/test/java/hudson/model/DownloadServiceTest.java +++ b/test/src/test/java/hudson/model/DownloadServiceTest.java @@ -5,6 +5,7 @@ import java.io.IOException; import java.net.URL; import java.util.Set; import java.util.TreeSet; +import jenkins.model.DownloadSettings; import net.sf.json.JSONObject; import org.jvnet.hudson.test.Bug; import org.jvnet.hudson.test.HudsonTestCase; @@ -30,6 +31,7 @@ public class DownloadServiceTest extends HudsonTestCase { // to bypass the URL restriction, we'll trigger downloadService.download ourselves job = new Downloadable("test", "UNUSED"); Downloadable.all().add(job); + DownloadSettings.get().setUseBrowser(true); } @Bug(5536) From 74162aa7b2223c0c4ec193952dae245c55d93cd0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20Gond=C5=BEa?= Date: Sun, 11 Jan 2015 13:10:50 +0100 Subject: [PATCH 151/701] Noting #1511 --- changelog.html | 3 +++ 1 file changed, 3 insertions(+) diff --git a/changelog.html b/changelog.html index b53b66f5f5..8366b20ce1 100644 --- a/changelog.html +++ b/changelog.html @@ -77,6 +77,9 @@ Upcoming changes
              • Better support functional tests from Gradle-based plugins. (issue 26331) +
              • + Allow users to delete builds even if they are supposed to be kept. + (issue 26281)
              • From 66c02a4cc32a22cc81311eb6b478359082924c92 Mon Sep 17 00:00:00 2001 From: tfennelly Date: Wed, 7 Jan 2015 18:34:36 +0000 Subject: [PATCH 152/701] Revert "Tweak of earlier fix for JENKINS-25971" This reverts commit 3e9cdcbc8527d6ee2be143aad3365df8fcd02c74. --- war/src/main/webapp/css/style.css | 29 +++++++---------------------- 1 file changed, 7 insertions(+), 22 deletions(-) diff --git a/war/src/main/webapp/css/style.css b/war/src/main/webapp/css/style.css index b1f4a057f0..1a99fc5d26 100644 --- a/war/src/main/webapp/css/style.css +++ b/war/src/main/webapp/css/style.css @@ -75,34 +75,19 @@ body { } #side-panel, #main-panel { + margin: 0px 0px 40px 0px; padding: 0px; } -#page-body.fixedGridLayout, .fixedGridLayout #side-panel, .fixedGridLayout #main-panel { - left: 0px; -} - -#page-body.fixedGridLayout { - position: fixed; - top: 66px; /* height of #header + #breadcrumbBar */ - bottom: 37px; /* height of #footer-container */ - right: 0px; - overflow: scroll; -} -.fixedGridLayout #side-panel, .fixedGridLayout #main-panel { - position: absolute; - top: 0px; - bottom: 0px; -} - .fixedGridLayout #side-panel { - width: 375px; - padding-left: 15px; + float:left; + position: fixed; + width: 360px; + margin-left: 15px; } .fixedGridLayout #main-panel { - right: 0px; - margin-left: 375px; + margin-left: 370px; margin-right: 15px; } @@ -127,7 +112,7 @@ body { } #footer-container { - position: fixed; + position: absolute; bottom: 0; width: 100%; padding: 10px 0px; From e2ec9eb3c23a6b4f63c338e634d647486a136f7b Mon Sep 17 00:00:00 2001 From: tfennelly Date: Thu, 8 Jan 2015 13:09:47 +0000 Subject: [PATCH 153/701] [FIX JENKINS-26312] reimpl of layout changes 3e9cdcb Attempt to do it in pure CSS ala 3e9cdcb failed so using CSS and JS combo. --- .../main/resources/lib/layout/layout.jelly | 116 +++++++++--------- war/src/main/webapp/css/style.css | 19 ++- .../main/webapp/scripts/hudson-behavior.js | 94 +++++++++++--- 3 files changed, 150 insertions(+), 79 deletions(-) diff --git a/core/src/main/resources/lib/layout/layout.jelly b/core/src/main/resources/lib/layout/layout.jelly index 4ddbbe645d..d41c186864 100644 --- a/core/src/main/resources/lib/layout/layout.jelly +++ b/core/src/main/resources/lib/layout/layout.jelly @@ -156,65 +156,67 @@ ${h.initPageVariables(context)} -
              • Allow users to delete builds even if they are supposed to be kept. (issue 26281) +
              • + Fixed side/main panel scrolling issues. + (issue 26312, + issue 26298, + issue 26306) From 7e7d545588b01a44e5f1edcf766f506138bf25c4 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Mon, 12 Jan 2015 11:16:00 -0500 Subject: [PATCH 157/701] Set up an admin monitor in case of browser-based download. Also moving this switch to security settings. --- .../java/jenkins/model/DownloadSettings.java | 13 +++++++ .../DownloadSettings/Warning/message.jelly | 34 +++++++++++++++++++ .../Warning/message.properties | 26 ++++++++++++++ .../model/DownloadSettings/config.groovy | 7 ++-- .../DownloadSettings/help-useBrowser.html | 8 +++-- 5 files changed, 82 insertions(+), 6 deletions(-) create mode 100644 core/src/main/resources/jenkins/model/DownloadSettings/Warning/message.jelly create mode 100644 core/src/main/resources/jenkins/model/DownloadSettings/Warning/message.properties diff --git a/core/src/main/java/jenkins/model/DownloadSettings.java b/core/src/main/java/jenkins/model/DownloadSettings.java index 577d884892..78999177a0 100644 --- a/core/src/main/java/jenkins/model/DownloadSettings.java +++ b/core/src/main/java/jenkins/model/DownloadSettings.java @@ -25,6 +25,7 @@ package jenkins.model; import hudson.Extension; +import hudson.model.AdministrativeMonitor; import hudson.model.AsyncPeriodicWork; import hudson.model.DownloadService; import hudson.model.TaskListener; @@ -69,6 +70,10 @@ import org.kohsuke.stapler.StaplerRequest; save(); } + @Override public GlobalConfigurationCategory getCategory() { + return GlobalConfigurationCategory.get(GlobalConfigurationCategory.Security.class); + } + @Extension public static final class DailyCheck extends AsyncPeriodicWork { public DailyCheck() { @@ -91,4 +96,12 @@ import org.kohsuke.stapler.StaplerRequest; } + @Extension public static final class Warning extends AdministrativeMonitor { + + @Override public boolean isActivated() { + return DownloadSettings.get().isUseBrowser(); + } + + } + } diff --git a/core/src/main/resources/jenkins/model/DownloadSettings/Warning/message.jelly b/core/src/main/resources/jenkins/model/DownloadSettings/Warning/message.jelly new file mode 100644 index 0000000000..8e1ee79cf8 --- /dev/null +++ b/core/src/main/resources/jenkins/model/DownloadSettings/Warning/message.jelly @@ -0,0 +1,34 @@ + + + + + +
                +
                + + + +
                +
                diff --git a/core/src/main/resources/jenkins/model/DownloadSettings/Warning/message.properties b/core/src/main/resources/jenkins/model/DownloadSettings/Warning/message.properties new file mode 100644 index 0000000000..57c6a3b68d --- /dev/null +++ b/core/src/main/resources/jenkins/model/DownloadSettings/Warning/message.properties @@ -0,0 +1,26 @@ +# The MIT License +# +# Copyright 2015 Jesse Glick. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + +blurb=\ + You currently are using browser-based download to retrieve metadata for Jenkins plugins and tools. \ + This has reliability issues and is not considered fully secure. \ + Consider switching to server-based download. diff --git a/core/src/main/resources/jenkins/model/DownloadSettings/config.groovy b/core/src/main/resources/jenkins/model/DownloadSettings/config.groovy index 9c8987f561..6b0751e563 100644 --- a/core/src/main/resources/jenkins/model/DownloadSettings/config.groovy +++ b/core/src/main/resources/jenkins/model/DownloadSettings/config.groovy @@ -2,8 +2,7 @@ package jenkins.security.DownloadSettings def f = namespace(lib.FormTagLib) -f.section(title: _("Download Preferences")) { - f.entry(title: _("Use Browser"), field: "useBrowser") { - f.checkbox() - } +// TODO avoid indentation somehow +f.entry(field: "useBrowser") { + f.checkbox(title: _("Use browser for metadata download")) } diff --git a/core/src/main/resources/jenkins/model/DownloadSettings/help-useBrowser.html b/core/src/main/resources/jenkins/model/DownloadSettings/help-useBrowser.html index 2336961826..b0f50b29fe 100644 --- a/core/src/main/resources/jenkins/model/DownloadSettings/help-useBrowser.html +++ b/core/src/main/resources/jenkins/model/DownloadSettings/help-useBrowser.html @@ -1,6 +1,10 @@ -
                +

                Check to force the user’s browser to download metadata rather than Jenkins itself doing it. Actual file downloads (plugins, tools) will still happen from Jenkins itself, but this can be used to at least see new metadata when Jenkins cannot access the Internet (but your own browser can, perhaps using some special proxy that Jenkins is not configured to use). -

                +

                +

                + Use of browser mode is discouraged. + It is not very secure, as malicious users could submit signed but obsolete information, causing denials of service or build errors. +

                From 8d1968f5bdfc60eefa5102671f456e4f3de54c94 Mon Sep 17 00:00:00 2001 From: Daniel Beck Date: Mon, 12 Jan 2015 20:38:28 +0100 Subject: [PATCH 158/701] [FIXED JENKINS-26382] Allow admin signup from /manage as well --- .../main/java/hudson/security/HudsonPrivateSecurityRealm.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/hudson/security/HudsonPrivateSecurityRealm.java b/core/src/main/java/hudson/security/HudsonPrivateSecurityRealm.java index ef4b338822..642ebac84b 100644 --- a/core/src/main/java/hudson/security/HudsonPrivateSecurityRealm.java +++ b/core/src/main/java/hudson/security/HudsonPrivateSecurityRealm.java @@ -697,7 +697,8 @@ public class HudsonPrivateSecurityRealm extends AbstractPasswordBasedSecurityRea public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; - if(req.getRequestURI().equals(req.getContextPath()+"/")) { + /* allow signup from the Jenkins home page, or /manage, which is where a /configureSecurity form redirects to */ + if(req.getRequestURI().equals(req.getContextPath()+"/") || req.getRequestURI().equals(req.getContextPath() + "/manage")) { if (needsToCreateFirstUser()) { ((HttpServletResponse)response).sendRedirect("securityRealm/firstUser"); } else {// the first user already created. the role of this filter is over. From b0908bd5ae64e161ec310164ba293aec8bc1d29b Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Mon, 12 Jan 2015 18:19:13 -0500 Subject: [PATCH 159/701] [JENKINS-26382] Noting merge of #1525. --- changelog.html | 3 +++ 1 file changed, 3 insertions(+) diff --git a/changelog.html b/changelog.html index 2936e4e7ab..2cc8242eb9 100644 --- a/changelog.html +++ b/changelog.html @@ -65,6 +65,9 @@ Upcoming changes
              • Folder loading broken when child item loading throws exception. (issue 22811) +
              • + Allow admin signup from /manage as well. + (issue 26382)
              • Amend JAVA_HOME check to work with JDK 9. (issue 25601) From 6351a8a25826679a69648e772e163dafdfc5cae3 Mon Sep 17 00:00:00 2001 From: Felix Belzunce Arcos Date: Mon, 22 Dec 2014 23:58:09 +0100 Subject: [PATCH 160/701] JENKINS-26203 --- .../java/hudson/ClassicPluginStrategy.java | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/hudson/ClassicPluginStrategy.java b/core/src/main/java/hudson/ClassicPluginStrategy.java index 75d1414acc..b295de6405 100644 --- a/core/src/main/java/hudson/ClassicPluginStrategy.java +++ b/core/src/main/java/hudson/ClassicPluginStrategy.java @@ -56,6 +56,8 @@ import java.io.FileInputStream; import java.io.FilenameFilter; import java.io.IOException; import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.net.URI; import java.net.URL; import java.util.ArrayList; import java.util.Arrays; @@ -147,8 +149,8 @@ public class ClassicPluginStrategy implements PluginStrategy { @Override public PluginWrapper createPluginWrapper(File archive) throws IOException { final Manifest manifest; - URL baseResourceURL; + URL baseResourceURL = null; File expandDir = null; // if .hpi, this is the directory where war is expanded @@ -197,7 +199,21 @@ public class ClassicPluginStrategy implements PluginStrategy { if (libs != null) paths.addAll(Arrays.asList(libs)); - baseResourceURL = expandDir.toURI().toURL(); + try { + Class pathJDK7 = Class.forName("java.nio.file.Path"); + Object toPath = File.class.getMethod("toPath").invoke(expandDir); + URI uri = (URI) pathJDK7.getMethod("toUri").invoke(toPath); + + baseResourceURL = uri.toURL(); + } catch (NoSuchMethodException e) { + throw new Error(e); + } catch (ClassNotFoundException e) { + baseResourceURL = expandDir.toURI().toURL(); + } catch (InvocationTargetException e) { + throw new Error(e); + } catch (IllegalAccessException e) { + throw new Error(e); + } } File disableFile = new File(archive.getPath() + ".disabled"); if (disableFile.exists()) { From 80966d014a88b6df6082530e8d7fc6a728de1913 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Tue, 13 Jan 2015 12:20:51 -0500 Subject: [PATCH 161/701] =?UTF-8?q?7b90662=20added=20logging=20in=20case?= =?UTF-8?q?=20of=20an=20erroneous=20condition=20but=20failed=20to=20recove?= =?UTF-8?q?r=20gracefully.=20This=20results=20in=20an=20error=20in=20the?= =?UTF-8?q?=20JavaScript=20console=20during=20the=20usual=20=E2=80=9CLOADI?= =?UTF-8?q?NG=20overlay=20fails=20to=20disappear=E2=80=9D=20kind=20of=20bu?= =?UTF-8?q?g:=20TypeError:=20Argument=201=20of=20Node.replaceChild=20is=20?= =?UTF-8?q?not=20an=20object.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- war/src/main/webapp/scripts/hudson-behavior.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/war/src/main/webapp/scripts/hudson-behavior.js b/war/src/main/webapp/scripts/hudson-behavior.js index e03d9c1d3c..23759a3e1c 100644 --- a/war/src/main/webapp/scripts/hudson-behavior.js +++ b/war/src/main/webapp/scripts/hudson-behavior.js @@ -1478,7 +1478,10 @@ function refreshPart(id,url) { new Ajax.Request(url, { onSuccess: function(rsp) { var hist = $(id); - if (hist==null) console.log("There's no element that has ID of "+id) + if (hist == null) { + console.log("There's no element that has ID of " + id); + return; + } var p = hist.up(); var div = document.createElement('div'); From 83cf4aa451e0010bbf7f1e7419752df3eb26d7f4 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Tue, 13 Jan 2015 14:16:09 -0500 Subject: [PATCH 162/701] Need to append .html to .json only in updateNow, not for browser-based checks. --- core/src/main/java/hudson/model/DownloadService.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/hudson/model/DownloadService.java b/core/src/main/java/hudson/model/DownloadService.java index b549c416b0..0d35c01538 100644 --- a/core/src/main/java/hudson/model/DownloadService.java +++ b/core/src/main/java/hudson/model/DownloadService.java @@ -229,7 +229,7 @@ public class DownloadService extends PageDecorator { public Downloadable() { this.id = getClass().getName().replace('$','.'); - this.url = this.id + ".json.html"; + this.url = this.id+".json"; this.interval = DEFAULT_INTERVAL; } @@ -241,7 +241,7 @@ public class DownloadService extends PageDecorator { } public Downloadable(String id) { - this(id, id + ".json.html"); + this(id,id+".json"); } public Downloadable(String id, String url) { @@ -342,7 +342,7 @@ public class DownloadService extends PageDecorator { @Restricted(NoExternalUse.class) public FormValidation updateNow() throws IOException { - return load(loadJSONHTML(new URL(getUrl() + "?id=" + URLEncoder.encode(getId(), "UTF-8") + "&version=" + URLEncoder.encode(Jenkins.VERSION, "UTF-8"))), System.currentTimeMillis()); + return load(loadJSONHTML(new URL(getUrl() + ".html?id=" + URLEncoder.encode(getId(), "UTF-8") + "&version=" + URLEncoder.encode(Jenkins.VERSION, "UTF-8"))), System.currentTimeMillis()); } /** From aa36a5d3dbd778d7086bfcba0c16e4ada99a5b1d Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Tue, 13 Jan 2015 14:19:53 -0500 Subject: [PATCH 163/701] DailyCheck.initialDelay=0 so it runs right after startup if using server-based download. --- core/src/main/java/jenkins/model/DownloadSettings.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/core/src/main/java/jenkins/model/DownloadSettings.java b/core/src/main/java/jenkins/model/DownloadSettings.java index 78999177a0..a027e4236e 100644 --- a/core/src/main/java/jenkins/model/DownloadSettings.java +++ b/core/src/main/java/jenkins/model/DownloadSettings.java @@ -84,6 +84,10 @@ import org.kohsuke.stapler.StaplerRequest; return DAY; } + @Override public long getInitialDelay() { + return 0; + } + @Override protected void execute(TaskListener listener) throws IOException, InterruptedException { if (get().isUseBrowser()) { return; From fd430a34320e197e6f72baaf21f0ed794b6dc43f Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Wed, 2 Apr 2014 17:09:18 -0400 Subject: [PATCH 164/701] Do not redirectTestOutputToFile when we are running an individual test (suite or case). In this case we are probably interested in looking at the output as it arrives in real time. Can always be overridden on the command line if desired. (cherry picked from commit 44a8ec110459e560a79c0f11883841bd7095f723) --- test/pom.xml | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/test/pom.xml b/test/pom.xml index 6c2c5291c0..345d20029b 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -197,7 +197,6 @@ THE SOFTWARE. true ${concurrency} - true @@ -257,6 +256,17 @@ THE SOFTWARE. true + + all-tests + + + !test + + + + true + + From c7f9c63086089dfa23ecbff2f2f098e3781f2e81 Mon Sep 17 00:00:00 2001 From: Puru Tuladhar Date: Fri, 16 Jan 2015 14:11:24 +0000 Subject: [PATCH 177/701] Fix jenkins debian init script to exit with proper return code on error. --- debian/debian/jenkins.init | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/debian/debian/jenkins.init b/debian/debian/jenkins.init index 2ec7789531..bc32f3d53a 100644 --- a/debian/debian/jenkins.init +++ b/debian/debian/jenkins.init @@ -34,13 +34,13 @@ SU=/bin/su # Exit if the package is not installed if [ ! -x "$DAEMON" ]; then echo "daemon package not installed" >&2 - exit 0 + exit 1 fi # Exit if not supposed to run standalone if [ "$RUN_STANDALONE" = "false" ]; then echo "Not configured to run standalone" >&2 - exit 0 + exit 1 fi # load environments From 36bce39ff4fe7fe3f606d7d9599c30e4c7392785 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Fri, 16 Jan 2015 14:24:52 -0500 Subject: [PATCH 178/701] [FIXED JENKINS-26476] Work around Remoting problem by avoiding reference to Functions. --- core/src/main/java/hudson/FilePath.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/hudson/FilePath.java b/core/src/main/java/hudson/FilePath.java index fbbc89e876..1fe2de55c8 100644 --- a/core/src/main/java/hudson/FilePath.java +++ b/core/src/main/java/hudson/FilePath.java @@ -1581,6 +1581,7 @@ public final class FilePath implements Serializable { act(new SecureFileCallable() { private static final long serialVersionUID = 1L; public Void invoke(File f, VirtualChannel channel) throws IOException { + // TODO first check for Java 7+ and use PosixFileAttributeView _chmod(writing(f), mask); return null; @@ -1592,7 +1593,9 @@ public final class FilePath implements Serializable { * Run chmod via jnr-posix */ private static void _chmod(File f, int mask) throws IOException { - if (Functions.isWindows()) return; // noop + // TODO WindowsPosix actually does something here (WindowsLibC._wchmod); should we let it? + // Anyway the existing calls already skip this method if on Windows. + if (File.pathSeparatorChar==';') return; // noop PosixAPI.jnr().chmod(f.getAbsolutePath(),mask); } From e9aeaf11b7171aed80381e8f66c5fb7056960141 Mon Sep 17 00:00:00 2001 From: Vojtech Juranek Date: Sat, 8 Nov 2014 18:10:32 +0100 Subject: [PATCH 179/701] [JENKINS-25455] Avoid zero height of CodeMirror textarea --- .../resources/lib/form/textarea/textarea.js | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/core/src/main/resources/lib/form/textarea/textarea.js b/core/src/main/resources/lib/form/textarea/textarea.js index 51f842d14d..4b07cd7caa 100644 --- a/core/src/main/resources/lib/form/textarea/textarea.js +++ b/core/src/main/resources/lib/form/textarea/textarea.js @@ -1,5 +1,15 @@ Behaviour.specify("TEXTAREA.codemirror", 'textarea', 0, function(e) { - var h = e.clientHeight; + //ensure, that textarea is visible, when obtaining its height, see JENKINS-25455 + function getTextareaHeight() { + var p = e.parentNode.parentNode; //first parent is CodeMirror div, second is actual element which needs to be visible + var display = p.style.display; + p.style.display = ""; + var h = e.clientHeight; + p.style.display = display; + return h; + } + + var h = e.clientHeight || getTextareaHeight(); var config = e.getAttribute("codemirror-config") || ""; config = eval('({'+config+'})'); var codemirror = CodeMirror.fromTextArea(e,config); @@ -19,7 +29,13 @@ Behaviour.specify("TEXTAREA.codemirror", 'textarea', 0, function(e) { Element.on(e.up('form'),"jenkins:apply", function() { e.value = codemirror.getValue() }) - } + } + + //refresh CM when there are some layout updates + function refreshCM() { + codemirror.refresh(); + } + layoutUpdateCallback.add(refreshCM); }); Behaviour.specify("DIV.textarea-preview-container", 'textarea', 100, function (e) { From 4e48eaa05ca3a76fcb0e1eee307fd20f222079bc Mon Sep 17 00:00:00 2001 From: Vojtech Juranek Date: Mon, 10 Nov 2014 22:35:49 +0100 Subject: [PATCH 180/701] [FIXED JENKINS-23151, JENKINS-23026] Save CodeMirror editor when it loses focus * Save CM editor when it loses focus to ensure that test is saved back to textarea * Turn on again CM editor for shell scripts --- core/src/main/resources/hudson/tasks/Shell/config.groovy | 3 +-- core/src/main/resources/lib/form/textarea/textarea.js | 3 ++- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/core/src/main/resources/hudson/tasks/Shell/config.groovy b/core/src/main/resources/hudson/tasks/Shell/config.groovy index c608e2469c..3e81fb53d4 100644 --- a/core/src/main/resources/hudson/tasks/Shell/config.groovy +++ b/core/src/main/resources/hudson/tasks/Shell/config.groovy @@ -25,6 +25,5 @@ package hudson.tasks.Shell; f=namespace(lib.FormTagLib) f.entry(title:_("Command"),description:_("description",rootURL)) { - // TODO JENKINS-23151 'codemirror-mode': 'shell' is broken - f.textarea(name: "command", value: instance?.command, class: "fixed-width") + f.textarea(name: "command", value: instance?.command, class: "fixed-width", 'codemirror-mode': 'shell', 'codemirror-config': "mode: 'text/x-sh'") } diff --git a/core/src/main/resources/lib/form/textarea/textarea.js b/core/src/main/resources/lib/form/textarea/textarea.js index 4b07cd7caa..f1c1b2238f 100644 --- a/core/src/main/resources/lib/form/textarea/textarea.js +++ b/core/src/main/resources/lib/form/textarea/textarea.js @@ -10,7 +10,8 @@ Behaviour.specify("TEXTAREA.codemirror", 'textarea', 0, function(e) { } var h = e.clientHeight || getTextareaHeight(); - var config = e.getAttribute("codemirror-config") || ""; + var config = e.getAttribute("codemirror-config"); + config += (config ? ", " : " ") + "onBlur: function(editor){editor.save()}"; config = eval('({'+config+'})'); var codemirror = CodeMirror.fromTextArea(e,config); e.codemirrorObject = codemirror; From 19c7aaa5f7751a122b2108cc7c2a2311398b574d Mon Sep 17 00:00:00 2001 From: Vojtech Juranek Date: Fri, 16 Jan 2015 23:10:01 +0100 Subject: [PATCH 181/701] Add changelog record for PR #1460 --- changelog.html | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/changelog.html b/changelog.html index c6b6287c3c..f9df51e898 100644 --- a/changelog.html +++ b/changelog.html @@ -94,6 +94,10 @@ Upcoming changes
              • Improve error reporting when channel closed during build. (issue 26411) +
              • + Fixed CodeMirror issue with height and re-enabled syntax highlighting in shell build step. + (issue 25455, + issue 23151) From 3c8e1b516a1cf0164d19a9afa488cff1ffc19b32 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Fri, 16 Jan 2015 17:34:03 -0500 Subject: [PATCH 182/701] API refinements and documentation. --- .../jenkins/tasks/SimpleBuildWrapper.java | 46 +++++++++++++++++-- 1 file changed, 43 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/jenkins/tasks/SimpleBuildWrapper.java b/core/src/main/java/jenkins/tasks/SimpleBuildWrapper.java index 1987bc273f..3590cf45e5 100644 --- a/core/src/main/java/jenkins/tasks/SimpleBuildWrapper.java +++ b/core/src/main/java/jenkins/tasks/SimpleBuildWrapper.java @@ -40,8 +40,11 @@ import java.io.OutputStream; import java.io.Serializable; import java.util.Collection; import java.util.Collections; +import java.util.HashMap; import java.util.Map; import java.util.Set; +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; /** * A generalization of {@link BuildWrapper} that, like {@link SimpleBuildStep}, may be called at various points within a build. @@ -64,16 +67,53 @@ public abstract class SimpleBuildWrapper extends BuildWrapper { */ public abstract void setUp(Context context, Run build, FilePath workspace, Launcher launcher, TaskListener listener, EnvVars initialEnvironment) throws IOException, InterruptedException; + /** + * Parameter passed to {@link #setUp} to allow an implementation to specify its behavior after the initial setup. + */ public static final class Context { - // TODO convert to bean or builder pattern - public Disposer disposer; - public EnvVars env; + private Disposer disposer; + private final Map env = new HashMap(); + public @Nonnull Map getEnv() { + return env; + } + /** + * Specify an environment variable override (as in {@link EnvVars#override}) to apply to processes launched within the block. + * If unspecified, environment variables will be inherited unmodified. + */ + public void env(String key, String value) { + if (env.put(key, value) != null) { + throw new IllegalStateException("just one binding for " + key); + } + } + public @CheckForNull Disposer getDisposer() { + return disposer; + } + /** + * Specify an action to take when the block ends. + * If not specified, nothing special happens. + */ + public void setDisposer(@Nonnull Disposer disposer) { + if (disposer != null) { + throw new IllegalStateException("just one disposer"); + } + this.disposer = disposer; + } } /** * An optional callback to run at the end of the wrapped block. + * Must be safely serializable, so it receives runtime context comparable to that of the original setup. */ public static abstract class Disposer implements Serializable { + /** + * Attempt to clean up anything that was done in the initial setup. + * @param build a build being run + * @param workspace a workspace of the build + * @param launcher a way to start commands + * @param listener a way to report progress + * @throws IOException if something fails; {@link AbortException} for user errors + * @throws InterruptedException if tear down is interrupted + */ public abstract void tearDown(Run build, FilePath workspace, Launcher launcher, TaskListener listener) throws IOException, InterruptedException; } From 1b1ad56b23bc4025310fc79a3747c3b9e6b0e7be Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Fri, 16 Jan 2015 17:37:54 -0500 Subject: [PATCH 183/701] Typo. --- core/src/main/java/jenkins/tasks/SimpleBuildWrapper.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/jenkins/tasks/SimpleBuildWrapper.java b/core/src/main/java/jenkins/tasks/SimpleBuildWrapper.java index 3590cf45e5..988d7d06dd 100644 --- a/core/src/main/java/jenkins/tasks/SimpleBuildWrapper.java +++ b/core/src/main/java/jenkins/tasks/SimpleBuildWrapper.java @@ -93,7 +93,7 @@ public abstract class SimpleBuildWrapper extends BuildWrapper { * If not specified, nothing special happens. */ public void setDisposer(@Nonnull Disposer disposer) { - if (disposer != null) { + if (this.disposer != null) { throw new IllegalStateException("just one disposer"); } this.disposer = disposer; From 84b211db457958240ea47e0ea6d14541a38d93c7 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Mon, 19 Jan 2015 03:56:48 -0800 Subject: [PATCH 184/701] [maven-release-plugin] prepare release jenkins-1.597 --- cli/pom.xml | 2 +- core/pom.xml | 2 +- plugins/pom.xml | 10 +++++----- pom.xml | 4 ++-- test/pom.xml | 2 +- war/pom.xml | 2 +- 6 files changed, 11 insertions(+), 11 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index e98a9642fd..7f13a833cc 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main pom - 1.597-SNAPSHOT + 1.597 cli diff --git a/core/pom.xml b/core/pom.xml index 2f9134ebc0..b61fb2a758 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 1.597-SNAPSHOT + 1.597 jenkins-core diff --git a/plugins/pom.xml b/plugins/pom.xml index fd63ca7879..503732dc1b 100644 --- a/plugins/pom.xml +++ b/plugins/pom.xml @@ -12,7 +12,7 @@ org.jenkins-ci.plugins plugin Jenkins plugin POM - 1.597-SNAPSHOT + 1.597 pom +

                What's new in 1.597 (2015/01/19)

                • JENKINS_HOME layout change: builds are now keyed by build numbers and not timestamps. @@ -90,7 +93,6 @@ Upcoming changes Add range check for H(X-Y) syntax. (issue 25897)
                -

                What's new in 1.596 (2015/01/04)

                • From 32e004cb21f407a9a0d07fa6bf83d53620102563 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Mon, 19 Jan 2015 05:51:12 -0800 Subject: [PATCH 187/701] updated changelog as a part of the release --- debian/debian/changelog | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/debian/debian/changelog b/debian/debian/changelog index 85d2ecca42..b6db699b71 100644 --- a/debian/debian/changelog +++ b/debian/debian/changelog @@ -1,3 +1,9 @@ +jenkins (1.597) unstable; urgency=low + + * See http://jenkins-ci.org/changelog for more details. + + -- Kohsuke Kawaguchi Mon, 19 Jan 2015 04:59:20 -0800 + jenkins (1.596) unstable; urgency=low * See http://jenkins-ci.org/changelog for more details. From 876d492bd10056744f6eb73f82d328cf08340732 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Mon, 19 Jan 2015 10:23:50 -0800 Subject: [PATCH 188/701] creating an RC branch --- changelog.html | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/changelog.html b/changelog.html index 3d0dae1f8d..9f2c29fd59 100644 --- a/changelog.html +++ b/changelog.html @@ -54,6 +54,14 @@ Upcoming changes + + + - - -

                  What's new in 1.597 (2015/01/19)

                    From a4165a04dd5be5f48b76ba3b8ef9ca40a61821ab Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Mon, 19 Jan 2015 10:23:54 -0800 Subject: [PATCH 189/701] the trunk is toward 1.599-SNAPSHOT --- cli/pom.xml | 2 +- core/pom.xml | 2 +- plugins/pom.xml | 8 ++++---- pom.xml | 2 +- test/pom.xml | 2 +- war/pom.xml | 2 +- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index 9e3d92ea68..67da3a05cd 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main pom - 1.598-SNAPSHOT + 1.599-SNAPSHOT cli diff --git a/core/pom.xml b/core/pom.xml index 3414cad2de..66905e2196 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 1.598-SNAPSHOT + 1.599-SNAPSHOT jenkins-core diff --git a/plugins/pom.xml b/plugins/pom.xml index 8aa3f0cd33..fbc82cb8bc 100644 --- a/plugins/pom.xml +++ b/plugins/pom.xml @@ -12,7 +12,7 @@ org.jenkins-ci.plugins plugin Jenkins plugin POM - 1.598-SNAPSHOT + 1.599-SNAPSHOT pom - - + + diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_ar.properties b/core/src/main/resources/hudson/views/BuildButtonColumn/column_ar.properties index 1453a1656c..ecd7fa7c47 100644 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_ar.properties +++ b/core/src/main/resources/hudson/views/BuildButtonColumn/column_ar.properties @@ -20,5 +20,5 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Build\ scheduled=\u0627\u0644\u0628\u0646\u0627\u0621 \u0645\u0642\u0631\u0631 -Schedule\ a\ build=\u062A\u062D\u062F\u064A\u062F \u0645\u0648\u0639\u062F \u0644\u0644\u0628\u0646\u0627\u0621 +Build_scheduled=\u0627\u0644\u0628\u0646\u0627\u0621 \u0645\u0642\u0631\u0631 +Schedule_a_build=\u062A\u062D\u062F\u064A\u062F \u0645\u0648\u0639\u062F \u0644\u0644\u0628\u0646\u0627\u0621\u003a {0} diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_bg.properties b/core/src/main/resources/hudson/views/BuildButtonColumn/column_bg.properties index 47b62710c7..400d357771 100644 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_bg.properties +++ b/core/src/main/resources/hudson/views/BuildButtonColumn/column_bg.properties @@ -20,5 +20,5 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Build\ scheduled=\u0411\u0438\u043B\u0434\u0430 \u0431\u0435\u0448\u0435 \u043D\u0430\u0441\u0440\u043E\u0447\u0435\u043D -Schedule\ a\ build=\u041D\u0430\u0441\u0440\u043E\u0447\u0438 \u0431\u0438\u043B\u0434 +Build_scheduled=\u0411\u0438\u043B\u0434\u0430 \u0431\u0435\u0448\u0435 \u043D\u0430\u0441\u0440\u043E\u0447\u0435\u043D +Schedule_a_build=\u041D\u0430\u0441\u0440\u043E\u0447\u0438 \u0431\u0438\u043B\u0434 \u0437\u0430 {0} diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_ca.properties b/core/src/main/resources/hudson/views/BuildButtonColumn/column_ca.properties index 9720f61697..f951cfe05a 100644 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_ca.properties +++ b/core/src/main/resources/hudson/views/BuildButtonColumn/column_ca.properties @@ -20,6 +20,6 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Build\ scheduled=S''ha planificat el muntatge -Schedule\ a\ build=Planifica un muntatge -Schedule\ a\ build\ with\ parameters=Planifica un muntatge amb par\u00E0metres +Build_scheduled=S''ha planificat el muntatge +Schedule_a_build=Planifica un muntatge per {0} +Schedule_a_build_with_parameters=Planifica un muntatge amb par\u00E0metres per {0} diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_cs.properties b/core/src/main/resources/hudson/views/BuildButtonColumn/column_cs.properties index bfbbf89629..b4c7da1f5f 100644 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_cs.properties +++ b/core/src/main/resources/hudson/views/BuildButtonColumn/column_cs.properties @@ -20,5 +20,5 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Build\ scheduled=Build napl\u00E1nov\u00E1n -Schedule\ a\ build=Napl\u00E1novat build +Build_scheduled=Build napl\u00E1nov\u00E1n +Schedule_a_build=Napl\u00E1novat build pro {0} diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_da.properties b/core/src/main/resources/hudson/views/BuildButtonColumn/column_da.properties index bf7e9a5c2a..35a096259a 100644 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_da.properties +++ b/core/src/main/resources/hudson/views/BuildButtonColumn/column_da.properties @@ -20,5 +20,5 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Build\ scheduled=Byg er planlagt -Schedule\ a\ build=Planl\u00E6g et byggeri +Build_scheduled=Byg er planlagt +Schedule_a_build=Planl\u00E6g et byggeri til {0} diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_de.properties b/core/src/main/resources/hudson/views/BuildButtonColumn/column_de.properties index 004c66fc7d..a85db0e735 100644 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_de.properties +++ b/core/src/main/resources/hudson/views/BuildButtonColumn/column_de.properties @@ -20,6 +20,6 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Build\ scheduled=Build geplant -Schedule\ a\ build=Build planen -Schedule\ a\ build\ with\ parameters=Build mit Parametern planen +Build_scheduled=Build geplant +Schedule_a_build=Build planen f\u00FCr {0} +Schedule_a_build_with_parameters=Build mit Parametern planen f\u00FCr {0} diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_el.properties b/core/src/main/resources/hudson/views/BuildButtonColumn/column_el.properties index f8d9f96a10..c31c100730 100644 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_el.properties +++ b/core/src/main/resources/hudson/views/BuildButtonColumn/column_el.properties @@ -20,4 +20,4 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Schedule\ a\ build=\u0395\u03BA\u03C4\u03AD\u03BB\u03B5\u03C3\u03B7 \u0394\u03B9\u03B5\u03C1\u03B3\u03B1\u03C3\u03AF\u03B1\u03C2 +Schedule_a_build=\u0395\u03BA\u03C4\u03AD\u03BB\u03B5\u03C3\u03B7 \u0394\u03B9\u03B5\u03C1\u03B3\u03B1\u03C3\u03AF\u03B1\u03C2 \u03B3\u03B9\u03B1 {0} diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_eo.properties b/core/src/main/resources/hudson/views/BuildButtonColumn/column_eo.properties index 22823e099a..9a226e1ff5 100644 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_eo.properties +++ b/core/src/main/resources/hudson/views/BuildButtonColumn/column_eo.properties @@ -20,4 +20,4 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Schedule\ a\ build=Enhorarigi konstruon +Schedule_a_build=Enhorarigi konstruon por {0} diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_es.properties b/core/src/main/resources/hudson/views/BuildButtonColumn/column_es.properties index b78021b7ac..039c98f4bf 100644 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_es.properties +++ b/core/src/main/resources/hudson/views/BuildButtonColumn/column_es.properties @@ -20,6 +20,6 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Build\ scheduled=Ejecuci\u00F3n programada -Schedule\ a\ build=Programar una construcci\u00F3n -Schedule\ a\ build\ with\ parameters=Planificar una construcci\u00F3n con parametros +Build_scheduled=Ejecuci\u00F3n programada +Schedule_a_build=Programar una construcci\u00F3n de {0} +Schedule_a_build_with_parameters=Planificar una construcci\u00F3n con parametros de {0} diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_es_AR.properties b/core/src/main/resources/hudson/views/BuildButtonColumn/column_es_AR.properties index 134ec50ed3..014de880f1 100644 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_es_AR.properties +++ b/core/src/main/resources/hudson/views/BuildButtonColumn/column_es_AR.properties @@ -1,4 +1,4 @@ # This file is under the MIT License by authors -Build\ scheduled=Corrida en espera -Schedule\ a\ build=Activar una corrida +Build_scheduled=Corrida en espera +Schedule_a_build=Activar una corrida de {0} diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_et.properties b/core/src/main/resources/hudson/views/BuildButtonColumn/column_et.properties index 4141aa4e93..689c082d1c 100644 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_et.properties +++ b/core/src/main/resources/hudson/views/BuildButtonColumn/column_et.properties @@ -1,4 +1,4 @@ # This file is under the MIT License by authors -Build\ scheduled=Ehitus planeeritud -Schedule\ a\ build=Plaani uus t\u00F6\u00F6 +Build_scheduled=Ehitus planeeritud +Schedule_a_build=Plaani uus t\u00F6\u00F6\u003a {0} diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_eu.properties b/core/src/main/resources/hudson/views/BuildButtonColumn/column_eu.properties index 9b52342009..7d21004037 100644 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_eu.properties +++ b/core/src/main/resources/hudson/views/BuildButtonColumn/column_eu.properties @@ -1,4 +1,4 @@ # This file is under the MIT License by authors -Build\ scheduled=Exekuzioa planifikatu da -Schedule\ a\ build=Eraikuntza antolatu +Build_scheduled=Exekuzioa planifikatu da +Schedule_a_build=Eraikuntza antolatu\u003a {0} diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_fi.properties b/core/src/main/resources/hudson/views/BuildButtonColumn/column_fi.properties index 6855452b44..c29801ba3b 100644 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_fi.properties +++ b/core/src/main/resources/hudson/views/BuildButtonColumn/column_fi.properties @@ -20,5 +20,5 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Build\ scheduled=Ajastettu buildi -Schedule\ a\ build=Aloita k\u00E4\u00E4nn\u00F6s +Build_scheduled=Ajastettu buildi +Schedule_a_build=Aloita k\u00E4\u00E4nn\u00F6s\u003a {0} diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_fr.properties b/core/src/main/resources/hudson/views/BuildButtonColumn/column_fr.properties index 578991008b..3ae8f854b6 100644 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_fr.properties +++ b/core/src/main/resources/hudson/views/BuildButtonColumn/column_fr.properties @@ -20,7 +20,7 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Build\ scheduled=Prochaines ex\u00E9cutions +Build_scheduled=Prochaines ex\u00E9cutions -Schedule\ a\ build=Programmer une construction -Schedule\ a\ build\ with\ parameters=Planifier une construction avec des param\u00E8tres +Schedule_a_build=Programmer une construction pour {0} +Schedule_a_build_with_parameters=Planifier une construction avec des param\u00E8tres pour {0} diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_ga_IE.properties b/core/src/main/resources/hudson/views/BuildButtonColumn/column_ga_IE.properties index 18961d1cd5..73e43fa66b 100644 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_ga_IE.properties +++ b/core/src/main/resources/hudson/views/BuildButtonColumn/column_ga_IE.properties @@ -1,3 +1,3 @@ # This file is under the MIT License by authors -Schedule\ a\ build=Sceideal t\u00F3g\u00E1il +Schedule_a_build=Sceideal t\u00F3g\u00E1il\u003a {0} diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_he.properties b/core/src/main/resources/hudson/views/BuildButtonColumn/column_he.properties index 376d740384..16e0cef6b3 100644 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_he.properties +++ b/core/src/main/resources/hudson/views/BuildButtonColumn/column_he.properties @@ -20,6 +20,6 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Build\ scheduled=\u05D1\u05E0\u05D9\u05D4 \u05DE\u05EA\u05D5\u05D6\u05DE\u05E0\u05EA -Schedule\ a\ build=\u05EA\u05D6\u05DE\u05DF \u05D1\u05E0\u05D9\u05D4 -Schedule\ a\ build\ with\ parameters=\u05EA\u05D6\u05DE\u05DF \u05D1\u05E0\u05D9\u05D4 \u05E2\u05DD \u05E4\u05E8\u05DE\u05D8\u05E8\u05D9\u05DD +Build_scheduled=\u05D1\u05E0\u05D9\u05D4 \u05DE\u05EA\u05D5\u05D6\u05DE\u05E0\u05EA +Schedule_a_build=\u05EA\u05D6\u05DE\u05DF \u05D1\u05E0\u05D9\u05D4\u003a {0} +Schedule_a_build_with_parameters=\u05EA\u05D6\u05DE\u05DF \u05D1\u05E0\u05D9\u05D4 \u05E2\u05DD \u05E4\u05E8\u05DE\u05D8\u05E8\u05D9\u05DD\u003a {0} diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_hi_IN.properties b/core/src/main/resources/hudson/views/BuildButtonColumn/column_hi_IN.properties index dbf7395bbe..5e60575fec 100644 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_hi_IN.properties +++ b/core/src/main/resources/hudson/views/BuildButtonColumn/column_hi_IN.properties @@ -1,3 +1,3 @@ # This file is under the MIT License by authors -Schedule\ a\ build=Build \u0915\u0940 \u0938\u092E\u092F \u0938\u093E\u0930\u0923\u0940 \u092C\u0928\u093E\u092F\u0947 +Schedule_a_build=Build \u0915\u0940 \u0938\u092E\u092F \u0938\u093E\u0930\u0923\u0940 \u092C\u0928\u093E\u092F\u0947\u003a {0} diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_hu.properties b/core/src/main/resources/hudson/views/BuildButtonColumn/column_hu.properties index ec02fb2e8d..612478b4f0 100644 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_hu.properties +++ b/core/src/main/resources/hudson/views/BuildButtonColumn/column_hu.properties @@ -20,5 +20,5 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Build\ scheduled=Build \u00FCtemezve -Schedule\ a\ build=Build \u00FCtemez\u00E9se +Build_scheduled=Build \u00FCtemezve +Schedule_a_build=Build \u00FCtemez\u00E9se\u003a {0} diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_id.properties b/core/src/main/resources/hudson/views/BuildButtonColumn/column_id.properties index 0d9f4ef82c..72dbfb41f9 100644 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_id.properties +++ b/core/src/main/resources/hudson/views/BuildButtonColumn/column_id.properties @@ -1,4 +1,4 @@ # This file is under the MIT License by authors -Build\ scheduled=Pekerjaan terjadwal -Schedule\ a\ build=Jadwalkan pekerjaan +Build_scheduled=Pekerjaan terjadwal +Schedule_a_build=Jadwalkan pekerjaan\u003a {0} diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_is.properties b/core/src/main/resources/hudson/views/BuildButtonColumn/column_is.properties index b8e8e21713..d3d4d38df0 100644 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_is.properties +++ b/core/src/main/resources/hudson/views/BuildButtonColumn/column_is.properties @@ -20,4 +20,4 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Schedule\ a\ build=Setja keyrslu \u00ED r\u00F6\u00F0 +Schedule_a_build=Setja keyrslu \u00ED r\u00F6\u00F0 fyrir {0} diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_it.properties b/core/src/main/resources/hudson/views/BuildButtonColumn/column_it.properties index 0d6a1dbc4a..7f47abbc68 100644 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_it.properties +++ b/core/src/main/resources/hudson/views/BuildButtonColumn/column_it.properties @@ -20,6 +20,6 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Build\ scheduled=Build pianificata -Schedule\ a\ build=Pianifica una build -Schedule\ a\ build\ with\ parameters=Pianifica una build personalizzata +Build_scheduled=Build pianificata +Schedule_a_build=Pianifica una build per {0} +Schedule_a_build_with_parameters=Pianifica una build personalizzata per {0} diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_ja.properties b/core/src/main/resources/hudson/views/BuildButtonColumn/column_ja.properties index 8eb3c9e0a1..ba9f00f5dd 100644 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_ja.properties +++ b/core/src/main/resources/hudson/views/BuildButtonColumn/column_ja.properties @@ -20,6 +20,6 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Schedule\ a\ build=\u30d3\u30eb\u30c9\u5b9f\u884c -Schedule\ a\ build\ with\ parameters=\u30d1\u30e9\u30e1\u30fc\u30bf\u4ed8\u304d\u30d3\u30eb\u30c9\u5b9f\u884c -Build\ scheduled=\u30d3\u30eb\u30c9\u306f\u30b9\u30b1\u30b8\u30e5\u30fc\u30eb\u3055\u308c\u307e\u3057\u305f\u3002 \ No newline at end of file +Schedule_a_build=\u30d3\u30eb\u30c9\u5b9f\u884c\u003a {0} +Schedule_a_build_with_parameters=\u30d1\u30e9\u30e1\u30fc\u30bf\u4ed8\u304d\u30d3\u30eb\u30c9\u5b9f\u884c\u003a {0} +Build_scheduled=\u30d3\u30eb\u30c9\u306f\u30b9\u30b1\u30b8\u30e5\u30fc\u30eb\u3055\u308c\u307e\u3057\u305f\u3002 diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_kn.properties b/core/src/main/resources/hudson/views/BuildButtonColumn/column_kn.properties index bfa73ab9e7..3b703fea3d 100644 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_kn.properties +++ b/core/src/main/resources/hudson/views/BuildButtonColumn/column_kn.properties @@ -1,4 +1,4 @@ # This file is under the MIT License by authors -Build\ scheduled=\u0CA8\u0CBF\u0C97\u0CA6\u0CBF\u0CA4 \u0CA8\u0CBF\u0CB0\u0CCD\u0CAE\u0CBE\u0CA3 -Schedule\ a\ build=\u0C92\u0C82\u0CA6\u0CC1 \u0CA8\u0CBF\u0CB0\u0CCD\u0CAE\u0CBE\u0CA3 \u0CB5\u0CC6\u0CD5\u0CB3\u0CBE\u0CAA\u0C9F\u0CCD\u0C9F\u0CBF +Build_scheduled=\u0CA8\u0CBF\u0C97\u0CA6\u0CBF\u0CA4 \u0CA8\u0CBF\u0CB0\u0CCD\u0CAE\u0CBE\u0CA3 \u003a {0} +Schedule_a_build=\u0C92\u0C82\u0CA6\u0CC1 \u0CA8\u0CBF\u0CB0\u0CCD\u0CAE\u0CBE\u0CA3 \u0CB5\u0CC6\u0CD5\u0CB3\u0CBE\u0CAA\u0C9F\u0CCD\u0C9F\u0CBF\u003a {0} diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_ko.properties b/core/src/main/resources/hudson/views/BuildButtonColumn/column_ko.properties index 46e31d22c5..d97a057e19 100644 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_ko.properties +++ b/core/src/main/resources/hudson/views/BuildButtonColumn/column_ko.properties @@ -20,5 +20,5 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Build\ scheduled=\uBE4C\uB4DC\uAC00 \uC608\uC57D\uB418\uC5C8\uC2B5\uB2C8\uB2E4. -Schedule\ a\ build=\uBE4C\uB4DC \uC989\uC2DC \uC2E4\uD589 +Build_scheduled=\uBE4C\uB4DC\uAC00 \uC608\uC57D\uB418\uC5C8\uC2B5\uB2C8\uB2E4. +Schedule_a_build=\uBE4C\uB4DC \uC989\uC2DC \uC2E4\uD589\u003a {0} diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_lt.properties b/core/src/main/resources/hudson/views/BuildButtonColumn/column_lt.properties index ad3501938e..77fe4d6a89 100644 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_lt.properties +++ b/core/src/main/resources/hudson/views/BuildButtonColumn/column_lt.properties @@ -20,5 +20,5 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Build\ scheduled=Kompiliavimo tvarkara\u0161tis -Schedule\ a\ build=Planuoti u\u017Eduot\u012F +Build_scheduled=Kompiliavimo tvarkara\u0161tis +Schedule_a_build=Planuoti u\u017Eduot\u012F\u003a {0} diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_lv.properties b/core/src/main/resources/hudson/views/BuildButtonColumn/column_lv.properties index e6b5fd6797..c539dc5880 100644 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_lv.properties +++ b/core/src/main/resources/hudson/views/BuildButtonColumn/column_lv.properties @@ -20,6 +20,6 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Build\ scheduled=B\u016Bv\u0113jums iepl\u0101nots -Schedule\ a\ build=Iepl\u0101not b\u016Bv\u0113jumu -Schedule\ a\ build\ with\ parameters=Iepl\u0101not parametriz\u0113tu b\u016Bv\u0113jumu +Build_scheduled=B\u016Bv\u0113jums iepl\u0101nots +Schedule_a_build=Iepl\u0101not b\u016Bv\u0113jumu\u003a {0} +Schedule_a_build_with_parameters=Iepl\u0101not parametriz\u0113tu b\u016Bv\u0113jumu\u003a {0} diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_mk.properties b/core/src/main/resources/hudson/views/BuildButtonColumn/column_mk.properties index 443ad83ee1..f57328abaf 100644 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_mk.properties +++ b/core/src/main/resources/hudson/views/BuildButtonColumn/column_mk.properties @@ -1,3 +1,3 @@ # This file is under the MIT License by authors -Schedule\ a\ build=\u0417\u0430\u043A\u0430\u0436\u0438 build-\u0430\u045A\u0435 +Schedule_a_build=\u0417\u0430\u043A\u0430\u0436\u0438 build-\u0430\u045A\u0435\u003a {0} diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_mr.properties b/core/src/main/resources/hudson/views/BuildButtonColumn/column_mr.properties index bda448f08f..b29f7be1cd 100644 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_mr.properties +++ b/core/src/main/resources/hudson/views/BuildButtonColumn/column_mr.properties @@ -20,4 +20,4 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Schedule\ a\ build=\u092A\u0941\u0922\u0940\u0932 \u092C\u093E\u0902\u0927\u094D\u0915\u093E\u092E\u091A\u0940 \u0935\u0947\u0933 \u0920\u0930\u0935\u093E +Schedule_a_build=\u092A\u0941\u0922\u0940\u0932 \u092C\u093E\u0902\u0927\u094D\u0915\u093E\u092E\u091A\u0940 \u0935\u0947\u0933 \u0920\u0930\u0935\u093E\u003a {0} diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_nb_NO.properties b/core/src/main/resources/hudson/views/BuildButtonColumn/column_nb_NO.properties index d47451fa99..d066866c0d 100644 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_nb_NO.properties +++ b/core/src/main/resources/hudson/views/BuildButtonColumn/column_nb_NO.properties @@ -20,5 +20,5 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Build\ scheduled=Bygg planlagt -Schedule\ a\ build=Planlegg et bygg +Build_scheduled=Bygg planlagt +Schedule_a_build=Planlegg et bygg for {0} diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_nl.properties b/core/src/main/resources/hudson/views/BuildButtonColumn/column_nl.properties index 995b60a356..3dfee37435 100644 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_nl.properties +++ b/core/src/main/resources/hudson/views/BuildButtonColumn/column_nl.properties @@ -20,6 +20,6 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Build\ scheduled=Build geplanned -Schedule\ a\ build=Plan een project -Schedule\ a\ build\ with\ parameters=Plan een build met parameters +Build_scheduled=Build geplanned +Schedule_a_build=Plan een project voor {0} +Schedule_a_build_with_parameters=Plan een build met parameters voor {0} diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_pl.properties b/core/src/main/resources/hudson/views/BuildButtonColumn/column_pl.properties index a7238a8669..2b3d505f7b 100644 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_pl.properties +++ b/core/src/main/resources/hudson/views/BuildButtonColumn/column_pl.properties @@ -20,6 +20,6 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Build\ scheduled=Zaplanowany build -Schedule\ a\ build=Dodaj kompilacj\u0119 do kolejki -Schedule\ a\ build\ with\ parameters=Zbuduj z parametrami +Build_scheduled=Zaplanowany build +Schedule_a_build=Dodaj kompilacj\u0119 do kolejki dla {0} +Schedule_a_build_with_parameters=Zbuduj z parametrami dla {0} diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_pt_BR.properties b/core/src/main/resources/hudson/views/BuildButtonColumn/column_pt_BR.properties index 378d2544ae..04959a2886 100644 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_pt_BR.properties +++ b/core/src/main/resources/hudson/views/BuildButtonColumn/column_pt_BR.properties @@ -22,6 +22,6 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Build\ scheduled=Builds agendados -Schedule\ a\ build=Agendar um build -Schedule\ a\ build\ with\ parameters=Agendar compila\u00e7\u00e3o com par\u00e2metros +Build_scheduled=Builds agendados +Schedule_a_build=Agendar um build\u003a {0} +Schedule_a_build_with_parameters=Agendar compila\u00e7\u00e3o com par\u00e2metros\u003a {0} diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_pt_PT.properties b/core/src/main/resources/hudson/views/BuildButtonColumn/column_pt_PT.properties index acaa0d75b5..e23e3567c3 100644 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_pt_PT.properties +++ b/core/src/main/resources/hudson/views/BuildButtonColumn/column_pt_PT.properties @@ -20,6 +20,6 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Build\ scheduled=Compila\u00E7\u00E3o agendada -Schedule\ a\ build=Agendar uma compila\u00E7\u00E3o -Schedule\ a\ build\ with\ parameters=Agendar compila\u00E7\u00E3o com par\u00E2metros +Build_scheduled=Compila\u00E7\u00E3o agendada +Schedule_a_build=Agendar uma compila\u00E7\u00E3o\u003a {0} +Schedule_a_build_with_parameters=Agendar compila\u00E7\u00E3o com par\u00E2metros\u003a {0} diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_ro.properties b/core/src/main/resources/hudson/views/BuildButtonColumn/column_ro.properties index 3b354623e6..b461a98be2 100644 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_ro.properties +++ b/core/src/main/resources/hudson/views/BuildButtonColumn/column_ro.properties @@ -20,5 +20,5 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Build\ scheduled=Build programat -Schedule\ a\ build=Programeaz\u0103 un build +Build_scheduled=Build programat +Schedule_a_build=Programeaz\u0103 un build pentru {0} diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_ru.properties b/core/src/main/resources/hudson/views/BuildButtonColumn/column_ru.properties index 8af8df211c..ff02568785 100644 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_ru.properties +++ b/core/src/main/resources/hudson/views/BuildButtonColumn/column_ru.properties @@ -20,8 +20,8 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Build\ scheduled=\u0421\u0431\u043e\u0440\u043a\u0430 \u0437\u0430\u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0430 +Build_scheduled=\u0421\u0431\u043e\u0440\u043a\u0430 \u0437\u0430\u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0430 !!! NB Change my previsous translation of this field to this value!!! -Schedule\ a\ build=\u0417\u0430\u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0431\u043e\u0440\u043a\u0443 -Schedule\ a\ build\ with\ parameters=\u0417\u0430\u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0431\u043e\u0440\u043a\u0443 \u0441 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 +Schedule_a_build=\u0417\u0430\u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0431\u043e\u0440\u043a\u0443\u003a {0} +Schedule_a_build_with_parameters=\u0417\u0430\u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0431\u043e\u0440\u043a\u0443 \u0441 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438\u003a {0} diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_sk.properties b/core/src/main/resources/hudson/views/BuildButtonColumn/column_sk.properties index 1a9f7aca65..6dde922e36 100644 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_sk.properties +++ b/core/src/main/resources/hudson/views/BuildButtonColumn/column_sk.properties @@ -20,6 +20,6 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Build\ scheduled=Napl\u00E1novan\u00E9 zostavenia -Schedule\ a\ build=Napl\u00E1nuj zostavenie -Schedule\ a\ build\ with\ parameters=Napl\u00E1nuj zostavenie s parametrami +Build_scheduled=Napl\u00E1novan\u00E9 zostavenia +Schedule_a_build=Napl\u00E1nuj zostavenie pre {0} +Schedule_a_build_with_parameters=Napl\u00E1nuj zostavenie s parametrami pre {0} diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_sl.properties b/core/src/main/resources/hudson/views/BuildButtonColumn/column_sl.properties index 708ade0e43..1038c11c91 100644 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_sl.properties +++ b/core/src/main/resources/hudson/views/BuildButtonColumn/column_sl.properties @@ -1,3 +1,3 @@ # This file is under the MIT License by authors -Schedule\ a\ build=Na\u010Drtuj build +Schedule_a_build=Na\u010Drtuj build\u003a {0} diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_sr.properties b/core/src/main/resources/hudson/views/BuildButtonColumn/column_sr.properties index 74507a6d5f..98c763b42c 100644 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_sr.properties +++ b/core/src/main/resources/hudson/views/BuildButtonColumn/column_sr.properties @@ -1,4 +1,4 @@ # This file is under the MIT License by authors -Build\ scheduled=Plan pokretanja -Schedule\ a\ build=Zaka\u017Ei gradnju +Build_scheduled=Plan pokretanja +Schedule_a_build=Zaka\u017Ei gradnju \u0437\u0430 {0} diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_sv_SE.properties b/core/src/main/resources/hudson/views/BuildButtonColumn/column_sv_SE.properties index 636fd065f2..1b20eb77db 100644 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_sv_SE.properties +++ b/core/src/main/resources/hudson/views/BuildButtonColumn/column_sv_SE.properties @@ -20,6 +20,6 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Build\ scheduled=Bygge schemalagt -Schedule\ a\ build=Schemal\u00E4gg ett bygge -Schedule\ a\ build\ with\ parameters=Schemal\u00E4gg ett bygge med parametrar. +Build_scheduled=Bygge schemalagt +Schedule_a_build=Schemal\u00E4gg ett bygge f\u00FCr {0} +Schedule_a_build_with_parameters=Schemal\u00E4gg ett bygge med parametrar f\u00FCr {0} diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_te.properties b/core/src/main/resources/hudson/views/BuildButtonColumn/column_te.properties index 9823965796..f8a5ebae59 100644 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_te.properties +++ b/core/src/main/resources/hudson/views/BuildButtonColumn/column_te.properties @@ -1,4 +1,4 @@ # This file is under the MIT License by authors -Build\ scheduled=Build varusa kramamu lo unchabadinadi -Schedule\ a\ build=Build ni varusa kramamu lo pettumu +Build_scheduled=Build varusa kramamu lo unchabadinadi +Schedule_a_build=Build ni varusa kramamu lo pettumu\u003a {0} diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_tr.properties b/core/src/main/resources/hudson/views/BuildButtonColumn/column_tr.properties index 591f06da27..bbfd79a206 100644 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_tr.properties +++ b/core/src/main/resources/hudson/views/BuildButtonColumn/column_tr.properties @@ -20,6 +20,6 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Build\ scheduled=Yap\u0131land\u0131rma planland\u0131 -Schedule\ a\ build=Bir\ yap\u0131land\u0131rma\ planla -Schedule\ a\ build\ with\ parameters=Parametreli yap\u0131land\u0131rma planla +Build_scheduled=Yap\u0131land\u0131rma planland\u0131 +Schedule_a_build=Bir\ yap\u0131land\u0131rma\ planla\u003a {0} +Schedule_a_build_with_parameters=Parametreli yap\u0131land\u0131rma planla\u003a {0} diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_uk.properties b/core/src/main/resources/hudson/views/BuildButtonColumn/column_uk.properties index 2b563879c5..506c29ee13 100644 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_uk.properties +++ b/core/src/main/resources/hudson/views/BuildButtonColumn/column_uk.properties @@ -20,5 +20,5 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Build\ scheduled=\u0417\u0431\u0456\u0440\u043A\u0438 \u0437\u0430\u043F\u043B\u0430\u043D\u043E\u0432\u0430\u043D\u0430 -Schedule\ a\ build=\u0417\u0430\u043F\u043B\u0430\u043D\u0443\u0432\u0430\u0442\u0438 \u043F\u043E\u0431\u0443\u0434\u043E\u0432\u0443 +Build_scheduled=\u0417\u0431\u0456\u0440\u043A\u0438 \u0437\u0430\u043F\u043B\u0430\u043D\u043E\u0432\u0430\u043D\u0430 +Schedule_a_build=\u0417\u0430\u043F\u043B\u0430\u043D\u0443\u0432\u0430\u0442\u0438 \u043F\u043E\u0431\u0443\u0434\u043E\u0432\u0443\u003a {0} diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_zh_CN.properties b/core/src/main/resources/hudson/views/BuildButtonColumn/column_zh_CN.properties index 307d778972..c5222b638b 100644 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_zh_CN.properties +++ b/core/src/main/resources/hudson/views/BuildButtonColumn/column_zh_CN.properties @@ -20,6 +20,6 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Build\ scheduled=\u6784\u5EFA\u8BA1\u5212 -Schedule\ a\ build=\u8ba1\u5212\u4e00\u6b21\u6784\u5efa -Schedule\ a\ build\ with\ parameters=\u8BA1\u5212\u4E00\u6B21\u5E26\u53C2\u6570\u7684\u6784\u5EFA +Build_scheduled=\u6784\u5EFA\u8BA1\u5212 +Schedule_a_build=\u8ba1\u5212\u4e00\u6b21\u6784\u5efa\u003a {0} +Schedule_a_build_with_parameters=\u8BA1\u5212\u4E00\u6B21\u5E26\u53C2\u6570\u7684\u6784\u5EFA\u003a {0} diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_zh_TW.properties b/core/src/main/resources/hudson/views/BuildButtonColumn/column_zh_TW.properties index 077a59224b..fc76ede1fd 100644 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_zh_TW.properties +++ b/core/src/main/resources/hudson/views/BuildButtonColumn/column_zh_TW.properties @@ -20,6 +20,6 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Schedule\ a\ build=\u6392\u7a0b\u5efa\u7f6e\u4f5c\u696d -Build\ scheduled=\u5efa\u7f6e\u5df2\u52a0\u9032\u6392\u7a0b -Schedule\ a\ build\ with\ parameters=\u53C3\u6578\u5316\u5EFA\u7F6E +Schedule_a_build=\u6392\u7a0b\u5efa\u7f6e\u4f5c\u696d +Build_scheduled=\u5efa\u7f6e\u5df2\u52a0\u9032\u6392\u7a0b\u003a {0} +Schedule_a_build_with_parameters=\u53C3\u6578\u5316\u5EFA\u7F6E\u003a {0} From fc60cd09f9c95a43a167f2aae2dc2146d7413119 Mon Sep 17 00:00:00 2001 From: Peter Marcoen Date: Thu, 22 Jan 2015 17:36:27 +0100 Subject: [PATCH 204/701] Added default locale --- .../views/BuildButtonColumn/column.properties | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 core/src/main/resources/hudson/views/BuildButtonColumn/column.properties diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column.properties b/core/src/main/resources/hudson/views/BuildButtonColumn/column.properties new file mode 100644 index 0000000000..9557233e6b --- /dev/null +++ b/core/src/main/resources/hudson/views/BuildButtonColumn/column.properties @@ -0,0 +1,25 @@ +# The MIT License +# +# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, id:sorokh, Martin Eigenbrodt +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. + +Build_scheduled=Build scheduled +Schedule_a_build=Schedule a build for {0} +Schedule_a_build_with_parameters=Schedule a build with parameters for {0} From 3b39c308345c994dbf7057260eddd9954ff11ac7 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Fri, 23 Jan 2015 05:09:09 +0900 Subject: [PATCH 205/701] Inject parameters from Guice when we can. This allows @Initializer to have parameter injection --- core/src/main/java/hudson/init/TaskMethodFinder.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/core/src/main/java/hudson/init/TaskMethodFinder.java b/core/src/main/java/hudson/init/TaskMethodFinder.java index 7747e850b6..9ced2cb1ab 100644 --- a/core/src/main/java/hudson/init/TaskMethodFinder.java +++ b/core/src/main/java/hudson/init/TaskMethodFinder.java @@ -1,5 +1,6 @@ package hudson.init; +import com.google.inject.Injector; import hudson.model.Hudson; import jenkins.model.Jenkins; import org.jvnet.hudson.annotation_indexer.Index; @@ -116,6 +117,12 @@ abstract class TaskMethodFinder extends TaskBuilder { private Object lookUp(Class type) { if (type==Jenkins.class || type==Hudson.class) return Jenkins.getInstance(); + Jenkins j = Jenkins.getInstance(); + if (j!=null) { + Injector i = j.getInjector(); + if (i!=null) + return i.getInstance(type); + } throw new IllegalArgumentException("Unable to inject "+type); } From bb7b1f950ddfa25dc59ecb55321f352a9a5cc1d1 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Thu, 22 Jan 2015 18:51:01 -0500 Subject: [PATCH 206/701] Updating SingleFileSCM to nondeprecated overload of checkout. --- .../java/org/jvnet/hudson/test/SingleFileSCM.java | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/test/src/main/java/org/jvnet/hudson/test/SingleFileSCM.java b/test/src/main/java/org/jvnet/hudson/test/SingleFileSCM.java index 7ace835fd3..e7157b5ab8 100644 --- a/test/src/main/java/org/jvnet/hudson/test/SingleFileSCM.java +++ b/test/src/main/java/org/jvnet/hudson/test/SingleFileSCM.java @@ -23,19 +23,18 @@ */ package org.jvnet.hudson.test; +import hudson.FilePath; +import hudson.Launcher; +import hudson.model.Run; +import hudson.model.TaskListener; import hudson.scm.NullSCM; import hudson.scm.SCM; -import hudson.model.AbstractBuild; -import hudson.model.BuildListener; -import hudson.Launcher; -import hudson.FilePath; - +import hudson.scm.SCMRevisionState; import java.io.File; import java.io.IOException; import java.io.OutputStream; import java.io.UnsupportedEncodingException; import java.net.URL; - import org.apache.commons.io.IOUtils; /** @@ -66,12 +65,11 @@ public class SingleFileSCM extends NullSCM { } @Override - public boolean checkout(AbstractBuild build, Launcher launcher, FilePath workspace, BuildListener listener, File changeLogFile) throws IOException, InterruptedException { + public void checkout(Run build, Launcher launcher, FilePath workspace, TaskListener listener, File changelogFile, SCMRevisionState baseline) throws IOException, InterruptedException { listener.getLogger().println("Staging "+path); OutputStream os = workspace.child(path).write(); IOUtils.write(contents, os); os.close(); - return true; } /** From 4c8f33d52466388c52a4e1d451e44d4cdc9842f9 Mon Sep 17 00:00:00 2001 From: Peter Marcoen Date: Fri, 23 Jan 2015 09:12:47 +0100 Subject: [PATCH 207/701] Use the same name as the job column --- .../resources/hudson/views/BuildButtonColumn/column.jelly | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column.jelly b/core/src/main/resources/hudson/views/BuildButtonColumn/column.jelly index 376ff95031..48b22533fb 100644 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column.jelly +++ b/core/src/main/resources/hudson/views/BuildButtonColumn/column.jelly @@ -30,11 +30,11 @@ THE SOFTWARE. - + - + From 6e6e2d7ec93f99ef178f87ef20fa4bb09d0073ae Mon Sep 17 00:00:00 2001 From: Peter Marcoen Date: Fri, 23 Jan 2015 11:29:46 +0100 Subject: [PATCH 208/701] [FIXED JENKINS-20606] Wrong spelling in Russian localization --- core/src/main/resources/hudson/model/Messages_ru.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/resources/hudson/model/Messages_ru.properties b/core/src/main/resources/hudson/model/Messages_ru.properties index ce37ae82f8..c0be7aa273 100644 --- a/core/src/main/resources/hudson/model/Messages_ru.properties +++ b/core/src/main/resources/hudson/model/Messages_ru.properties @@ -44,7 +44,7 @@ BallColor.Failed=\u041f\u0440\u043e\u0432\u0430\u043b\u0438\u043b\u043e\u0441\u0 BallColor.InProgress=\u0412 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 BallColor.Pending=\u041e\u0436\u0438\u0434\u0430\u0435\u0442 BallColor.Success=\u0423\u0441\u043f\u0435\u0448\u043d\u043e -BallColor.Unstable=\u041d\u0435\u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e +BallColor.Unstable=\u041D\u0435\u0441\u0442\u0430\u0431\u0438\u043B\u044C\u043D\u044B\u0439 Computer.Caption=\u041f\u043e\u0434\u0447\u0438\u043d\u0435\u043d\u043d\u044b\u0439 \u0443\u0437\u0435\u043b {0} From 1dd60ec7780870f9c11686659178e52d251c15fc Mon Sep 17 00:00:00 2001 From: tfennelly Date: Fri, 23 Jan 2015 13:00:56 +0000 Subject: [PATCH 209/701] [FIXED JENKINS-26365] Animated ball in job's build history widget won't open Console Output --- changelog.html | 3 +++ war/src/main/webapp/css/style.css | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/changelog.html b/changelog.html index 320d67cb85..d44f9ca6a5 100644 --- a/changelog.html +++ b/changelog.html @@ -58,6 +58,9 @@ Upcoming changes
                  • Remote FilePath.chmod fails with ClassNotFoundException: javax.servlet.ServletException. (issue 26476) +
                  • + Animated ball in job's build history widget won't open Console Output. + (issue 26365)
                  diff --git a/war/src/main/webapp/css/style.css b/war/src/main/webapp/css/style.css index 02fcd373ee..b7dcd0ac80 100644 --- a/war/src/main/webapp/css/style.css +++ b/war/src/main/webapp/css/style.css @@ -1066,7 +1066,7 @@ table.parameters > tbody:hover { .build-row-cell .pane.build-name .display-name, .build-row-cell .indent-multiline { - padding-left: 20px !important; /* Sync changes with func expandControlsTo50Percent in hudson-behavior.js */ + margin-left: 20px !important; /* Sync changes with func expandControlsTo50Percent in hudson-behavior.js */ } .build-row .build-row-cell { From c1e89aa74ee1a3f9061645fdea9aaeaa8efc70e8 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Fri, 23 Jan 2015 10:46:17 -0800 Subject: [PATCH 210/701] report URL in case of a failure --- .../java/org/jvnet/hudson/test/JellyTestSuiteBuilder.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/src/main/java/org/jvnet/hudson/test/JellyTestSuiteBuilder.java b/test/src/main/java/org/jvnet/hudson/test/JellyTestSuiteBuilder.java index 37a1c08bb1..3607273be4 100644 --- a/test/src/main/java/org/jvnet/hudson/test/JellyTestSuiteBuilder.java +++ b/test/src/main/java/org/jvnet/hudson/test/JellyTestSuiteBuilder.java @@ -95,7 +95,7 @@ public class JellyTestSuiteBuilder { if (requirePI) { ProcessingInstruction pi = dom.processingInstruction("jelly"); if (pi==null || !pi.getText().contains("escape-by-default")) - throw new AssertionError(" is missing"); + throw new AssertionError(" is missing in "+jelly); } // TODO: what else can we check statically? use of taglibs? @@ -109,7 +109,7 @@ public class JellyTestSuiteBuilder { if (!dom.selectNodes("//label[@for]").isEmpty()) throw new AssertionError("
                • Animated ball in job's build history widget won't open Console Output. (issue 26365) +
                • + Show job name in Schedule Build column tool tip. + (issue 25234)
                From 01c0ac0488c840ee71fe5c489e904bcc56bc4df6 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sun, 25 Jan 2015 17:15:39 -0800 Subject: [PATCH 212/701] [maven-release-plugin] prepare release jenkins-1.598 --- cli/pom.xml | 2 +- core/pom.xml | 2 +- plugins/pom.xml | 10 +++++----- pom.xml | 4 ++-- test/pom.xml | 2 +- war/pom.xml | 2 +- 6 files changed, 11 insertions(+), 11 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index 9e3d92ea68..4c1c6b15e6 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main pom - 1.598-SNAPSHOT + 1.598 cli diff --git a/core/pom.xml b/core/pom.xml index 3414cad2de..ed19b5b2dc 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 1.598-SNAPSHOT + 1.598 jenkins-core diff --git a/plugins/pom.xml b/plugins/pom.xml index 8aa3f0cd33..bc6a1cc831 100644 --- a/plugins/pom.xml +++ b/plugins/pom.xml @@ -12,7 +12,7 @@ org.jenkins-ci.plugins plugin Jenkins plugin POM - 1.598-SNAPSHOT + 1.598 pom +

                What's new in 1.598 (2015/01/25)

                • Build format change migrator in 1.597 did not work on some Windows systems. @@ -110,7 +113,6 @@ Upcoming changes (issue 25455, issue 23151)
                -

                What's new in 1.597 (2015/01/19)

                • From cebb18c1185f4f24f2aeb9a540d36fcafb787c75 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sun, 25 Jan 2015 20:21:29 -0800 Subject: [PATCH 215/701] updated changelog as a part of the release --- debian/debian/changelog | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/debian/debian/changelog b/debian/debian/changelog index b6db699b71..ba3fc57bde 100644 --- a/debian/debian/changelog +++ b/debian/debian/changelog @@ -1,3 +1,9 @@ +jenkins (1.598) unstable; urgency=low + + * See http://jenkins-ci.org/changelog for more details. + + -- Kohsuke Kawaguchi Sun, 25 Jan 2015 20:01:45 -0800 + jenkins (1.597) unstable; urgency=low * See http://jenkins-ci.org/changelog for more details. From 1debf06fe6d61e03e0eec20cbf96221bea5fce52 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sun, 25 Jan 2015 20:53:49 -0800 Subject: [PATCH 216/701] creating an RC branch --- changelog.html | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/changelog.html b/changelog.html index af89c6d38b..27fc7b7849 100644 --- a/changelog.html +++ b/changelog.html @@ -54,6 +54,14 @@ Upcoming changes + + + - - -

                  What's new in 1.598 (2015/01/25)

                    From a66c06fedb36541555430324b71ccba47ea15b21 Mon Sep 17 00:00:00 2001 From: Kohsuke Kawaguchi Date: Sun, 25 Jan 2015 20:53:53 -0800 Subject: [PATCH 217/701] the trunk is toward 1.600-SNAPSHOT --- cli/pom.xml | 2 +- core/pom.xml | 2 +- plugins/pom.xml | 8 ++++---- pom.xml | 2 +- test/pom.xml | 2 +- war/pom.xml | 2 +- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/cli/pom.xml b/cli/pom.xml index 67da3a05cd..d335089f9f 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main pom - 1.599-SNAPSHOT + 1.600-SNAPSHOT cli diff --git a/core/pom.xml b/core/pom.xml index 66905e2196..14f5789d8b 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 1.599-SNAPSHOT + 1.600-SNAPSHOT jenkins-core diff --git a/plugins/pom.xml b/plugins/pom.xml index fbc82cb8bc..7715133721 100644 --- a/plugins/pom.xml +++ b/plugins/pom.xml @@ -12,7 +12,7 @@ org.jenkins-ci.plugins plugin Jenkins plugin POM - 1.599-SNAPSHOT + 1.600-SNAPSHOT pom diff --git a/pom.xml b/pom.xml index 964dab6c24..edbafbd81c 100644 --- a/pom.xml +++ b/pom.xml @@ -187,7 +187,7 @@ THE SOFTWARE. com.google.inject guice - 4.0-beta5 + 4.0-beta From bffb409b9ecd8dee8b68bd00b4abcc62195db185 Mon Sep 17 00:00:00 2001 From: James Nord Date: Wed, 28 Jan 2015 11:46:37 +0000 Subject: [PATCH 224/701] Add extra info if the slave can not restartc correctly. If the service can not reliably restart itself add link to the wiki with some information about how to fix it. --- .../java/jenkins/slaves/restarter/WinswSlaveRestarter.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/jenkins/slaves/restarter/WinswSlaveRestarter.java b/core/src/main/java/jenkins/slaves/restarter/WinswSlaveRestarter.java index 35c606cdcd..f9bd660a21 100644 --- a/core/src/main/java/jenkins/slaves/restarter/WinswSlaveRestarter.java +++ b/core/src/main/java/jenkins/slaves/restarter/WinswSlaveRestarter.java @@ -51,7 +51,9 @@ public class WinswSlaveRestarter extends SlaveRestarter { // so it's possible that we end up in the situation where jenkins-slave.exe doesn't support // this command. If that is the case, there's nothing we can do about it. int r = exec("restart!"); - throw new IOException("Restart failure. '"+exe+" restart' completed with "+r+" but I'm still alive"); + throw new IOException("Restart failure. '"+exe+" restart' completed with "+r+" but I'm still alive! " + + "See https://wiki.jenkins-ci.org/display/JENKINS/Distributed+builds#Distributedbuilds-Windowsslaveserviceupgrades" + + " for a possible explanation and solution"); } private static final Logger LOGGER = Logger.getLogger(WinswSlaveRestarter.class.getName()); From 75c8c31f2fdc98081a0446dd3ee03da7243304a1 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Wed, 28 Jan 2015 08:48:23 -0500 Subject: [PATCH 225/701] [JENKINS-26519] More diagnostics in case a numeric rename target already exists. --- .../java/jenkins/model/RunIdMigrator.java | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/core/src/main/java/jenkins/model/RunIdMigrator.java b/core/src/main/java/jenkins/model/RunIdMigrator.java index a8b97f16e5..a5be92c830 100644 --- a/core/src/main/java/jenkins/model/RunIdMigrator.java +++ b/core/src/main/java/jenkins/model/RunIdMigrator.java @@ -200,18 +200,30 @@ public final class RunIdMigrator { while (it.hasNext()) { File kid = it.next(); String name = kid.getName(); + boolean numeric = false; + try { + Integer.parseInt(name); + numeric = true; + } catch (NumberFormatException x) {} try { String link = Util.resolveSymlink(kid); - if (link == null && name.matches("\\d+") && kid.isFile()) { // legacy Windows format + if (link == null && numeric && kid.isFile()) { // legacy Windows format link = FileUtils.readFileToString(kid); } else if (link == null) { + if (numeric) { + if (kid.isDirectory()) { + LOGGER.log(FINE, "skipping deletion of directory {0}", name); + } else { + LOGGER.log(WARNING, "need to delete non-symlink numeric directory entry {0}", name); + Util.deleteFile(kid); + } + } continue; } - try { - Integer.parseInt(name); + if (numeric) { LOGGER.log(FINE, "deleting build number symlink {0} → {1}", new Object[] {name, link}); Util.deleteFile(kid); - } catch (NumberFormatException x) { + } else { LOGGER.log(FINE, "skipping other symlink {0} → {1}", new Object[] {name, link}); } it.remove(); From 9dcd3c04972d5b21e91c892d21a3972e879f6b99 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Thu, 29 Jan 2015 11:20:25 -0500 Subject: [PATCH 226/701] Added envOverrideExpand to confirm that ${OTHERVAR} is expanded when needed. --- .../jenkins/tasks/SimpleBuildWrapperTest.java | 68 +++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/test/src/test/java/jenkins/tasks/SimpleBuildWrapperTest.java b/test/src/test/java/jenkins/tasks/SimpleBuildWrapperTest.java index 381586fba8..0aeaa56e27 100644 --- a/test/src/test/java/jenkins/tasks/SimpleBuildWrapperTest.java +++ b/test/src/test/java/jenkins/tasks/SimpleBuildWrapperTest.java @@ -26,18 +26,31 @@ package jenkins.tasks; import hudson.EnvVars; import hudson.FilePath; +import hudson.Functions; import hudson.Launcher; import hudson.model.AbstractProject; +import hudson.model.Computer; +import hudson.model.Descriptor; import hudson.model.FreeStyleBuild; import hudson.model.FreeStyleProject; +import hudson.model.JDK; import hudson.model.Run; +import hudson.model.Slave; import hudson.model.TaskListener; +import hudson.slaves.CommandLauncher; +import hudson.slaves.NodeProperty; +import hudson.slaves.RetentionStrategy; +import hudson.slaves.SlaveComputer; import hudson.tasks.BuildWrapperDescriptor; +import hudson.tasks.Shell; import java.io.File; import java.io.IOException; +import java.util.Collections; import org.junit.Test; import static org.junit.Assert.*; +import org.junit.Assume; import org.junit.Rule; +import org.junit.rules.TemporaryFolder; import org.jvnet.hudson.test.CaptureEnvironmentBuilder; import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.TestExtension; @@ -45,6 +58,7 @@ import org.jvnet.hudson.test.TestExtension; public class SimpleBuildWrapperTest { @Rule public JenkinsRule r = new JenkinsRule(); + @Rule public TemporaryFolder tmp = new TemporaryFolder(); @Test public void envOverride() throws Exception { FreeStyleProject p = r.createFreeStyleProject(); @@ -70,6 +84,60 @@ public class SimpleBuildWrapperTest { } } + @Test public void envOverrideExpand() throws Exception { + Assume.assumeFalse(Functions.isWindows()); + FreeStyleProject p = r.createFreeStyleProject(); + p.getBuildWrappersList().add(new WrapperWithEnvOverrideExpand()); + SpecialEnvSlave slave = new SpecialEnvSlave(tmp.getRoot(), r.createComputerLauncher(null)); + r.jenkins.addNode(slave); + p.setAssignedNode(slave); + JDK jdk = new JDK("test", "/opt/jdk"); + r.jenkins.getJDKs().add(jdk); + p.setJDK(jdk); + CaptureEnvironmentBuilder captureEnvironment = new CaptureEnvironmentBuilder(); + p.getBuildersList().add(captureEnvironment); + p.getBuildersList().add(new Shell("echo effective PATH=$PATH")); + FreeStyleBuild b = r.buildAndAssertSuccess(p); + String expected = "/home/jenkins/bin:/opt/jdk/bin:/usr/bin:/bin"; + assertEquals(expected, captureEnvironment.getEnvVars().get("PATH")); + // TODO why is /opt/jdk/bin added twice? In CommandInterpreter.perform, envVars right before Launcher.launch is correct, but this somehow sneaks in. + r.assertLogContains("effective PATH=/opt/jdk/bin:" + expected, b); + } + public static class WrapperWithEnvOverrideExpand extends SimpleBuildWrapper { + @Override public void setUp(Context context, Run build, FilePath workspace, Launcher launcher, TaskListener listener, EnvVars initialEnvironment) throws IOException, InterruptedException { + assertEquals("/opt/jdk/bin:/usr/bin:/bin", initialEnvironment.get("PATH")); + assertEquals("/home/jenkins", initialEnvironment.get("HOME")); + context.env("PATH+STUFF", "${HOME}/bin"); + } + @TestExtension("envOverrideExpand") public static class DescriptorImpl extends BuildWrapperDescriptor { + @Override public String getDisplayName() { + return "WrapperWithEnvOverrideExpand"; + } + @Override public boolean isApplicable(AbstractProject item) { + return true; + } + } + } + private static class SpecialEnvSlave extends Slave { + SpecialEnvSlave(File remoteFS, CommandLauncher launcher) throws Descriptor.FormException, IOException { + super("special", "SpecialEnvSlave", remoteFS.getAbsolutePath(), 1, Mode.NORMAL, "", launcher, RetentionStrategy.NOOP, Collections.>emptyList()); + } + @Override public Computer createComputer() { + return new SpecialEnvComputer(this); + } + } + private static class SpecialEnvComputer extends SlaveComputer { + SpecialEnvComputer(SpecialEnvSlave slave) { + super(slave); + } + @Override public EnvVars getEnvironment() throws IOException, InterruptedException { + EnvVars env = super.getEnvironment(); + env.put("PATH", "/usr/bin:/bin"); + env.put("HOME", "/home/jenkins"); + return env; + } + } + @Test public void disposer() throws Exception { FreeStyleProject p = r.createFreeStyleProject(); p.getBuildWrappersList().add(new WrapperWithDisposer()); From 7f827adac28d3e556247f63cadf28ca2114e2db4 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Thu, 29 Jan 2015 11:29:38 -0500 Subject: [PATCH 227/701] Verifying that even recursive expansion works, at least in simple cases. --- test/src/test/java/jenkins/tasks/SimpleBuildWrapperTest.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/test/src/test/java/jenkins/tasks/SimpleBuildWrapperTest.java b/test/src/test/java/jenkins/tasks/SimpleBuildWrapperTest.java index 0aeaa56e27..f65cf065c5 100644 --- a/test/src/test/java/jenkins/tasks/SimpleBuildWrapperTest.java +++ b/test/src/test/java/jenkins/tasks/SimpleBuildWrapperTest.java @@ -98,7 +98,7 @@ public class SimpleBuildWrapperTest { p.getBuildersList().add(captureEnvironment); p.getBuildersList().add(new Shell("echo effective PATH=$PATH")); FreeStyleBuild b = r.buildAndAssertSuccess(p); - String expected = "/home/jenkins/bin:/opt/jdk/bin:/usr/bin:/bin"; + String expected = "/home/jenkins/extra/bin:/opt/jdk/bin:/usr/bin:/bin"; assertEquals(expected, captureEnvironment.getEnvVars().get("PATH")); // TODO why is /opt/jdk/bin added twice? In CommandInterpreter.perform, envVars right before Launcher.launch is correct, but this somehow sneaks in. r.assertLogContains("effective PATH=/opt/jdk/bin:" + expected, b); @@ -107,7 +107,8 @@ public class SimpleBuildWrapperTest { @Override public void setUp(Context context, Run build, FilePath workspace, Launcher launcher, TaskListener listener, EnvVars initialEnvironment) throws IOException, InterruptedException { assertEquals("/opt/jdk/bin:/usr/bin:/bin", initialEnvironment.get("PATH")); assertEquals("/home/jenkins", initialEnvironment.get("HOME")); - context.env("PATH+STUFF", "${HOME}/bin"); + context.env("EXTRA", "${HOME}/extra"); + context.env("PATH+EXTRA", "${EXTRA}/bin"); } @TestExtension("envOverrideExpand") public static class DescriptorImpl extends BuildWrapperDescriptor { @Override public String getDisplayName() { From 388c4b5e6ba52037cae117c5c69f9f4156d41401 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Thu, 29 Jan 2015 14:57:32 -0500 Subject: [PATCH 228/701] [FIXED JENKINS-26519] Build record migration failed on Windows using Java 6. In this environment, Util.createSymlink and .isSymlink are implemented, but resolveSymlink is not. --- changelog.html | 6 ++-- .../java/jenkins/model/RunIdMigrator.java | 30 +++++++------------ .../java/jenkins/model/RunIdMigratorTest.java | 13 -------- 3 files changed, 13 insertions(+), 36 deletions(-) diff --git a/changelog.html b/changelog.html index 7e7da28791..951daff776 100644 --- a/changelog.html +++ b/changelog.html @@ -55,6 +55,9 @@ Upcoming changes

                    What's new in 1.598 (2015/01/25)

                      -
                    • - Build format change migrator in 1.597 did not work on some Windows systems. - (issue 26519)
                    • FutureImpl does not cancel its start future. (issue 25514) diff --git a/core/src/main/java/jenkins/model/RunIdMigrator.java b/core/src/main/java/jenkins/model/RunIdMigrator.java index a5be92c830..4666a5fb86 100644 --- a/core/src/main/java/jenkins/model/RunIdMigrator.java +++ b/core/src/main/java/jenkins/model/RunIdMigrator.java @@ -200,32 +200,22 @@ public final class RunIdMigrator { while (it.hasNext()) { File kid = it.next(); String name = kid.getName(); - boolean numeric = false; try { Integer.parseInt(name); - numeric = true; - } catch (NumberFormatException x) {} + } catch (NumberFormatException x) { + LOGGER.log(FINE, "ignoring nonnumeric entry {0}", name); + continue; + } try { - String link = Util.resolveSymlink(kid); - if (link == null && numeric && kid.isFile()) { // legacy Windows format - link = FileUtils.readFileToString(kid); - } else if (link == null) { - if (numeric) { - if (kid.isDirectory()) { - LOGGER.log(FINE, "skipping deletion of directory {0}", name); - } else { - LOGGER.log(WARNING, "need to delete non-symlink numeric directory entry {0}", name); - Util.deleteFile(kid); - } - } + if (Util.isSymlink(kid)) { + LOGGER.log(FINE, "deleting build number symlink {0} → {1}", new Object[] {name, Util.resolveSymlink(kid)}); + } else if (kid.isDirectory()) { + LOGGER.log(FINE, "ignoring build directory {0}", name); continue; - } - if (numeric) { - LOGGER.log(FINE, "deleting build number symlink {0} → {1}", new Object[] {name, link}); - Util.deleteFile(kid); } else { - LOGGER.log(FINE, "skipping other symlink {0} → {1}", new Object[] {name, link}); + LOGGER.log(WARNING, "need to delete anomalous file entry {0}", name); } + Util.deleteFile(kid); it.remove(); } catch (Exception x) { LOGGER.log(WARNING, "failed to process " + kid, x); diff --git a/core/src/test/java/jenkins/model/RunIdMigratorTest.java b/core/src/test/java/jenkins/model/RunIdMigratorTest.java index ce5c6d89e6..fb9805db77 100644 --- a/core/src/test/java/jenkins/model/RunIdMigratorTest.java +++ b/core/src/test/java/jenkins/model/RunIdMigratorTest.java @@ -42,7 +42,6 @@ import org.junit.Before; import org.junit.BeforeClass; import org.junit.Rule; import org.junit.rules.TemporaryFolder; -import org.jvnet.hudson.test.Issue; public class RunIdMigratorTest { @@ -129,18 +128,6 @@ public class RunIdMigratorTest { assertEquals("{1=→2014-01-02_03-04-05, 2014-01-02_03-04-05={build.xml='\n\n ok\n 1\n ok\n'}}", summarize()); } - @Issue("JENKINS-26519") - @Test public void windowsQuasiLinks() throws Exception { - write("2014-01-02_03-04-05/build.xml", "\n\n ok\n 99\n ok\n"); - write("99", "2014-01-02_03-04-05"); - write("lastFailedBuild", "-1"); - write("lastSuccessfulBuild", "99"); - assertEquals("{2014-01-02_03-04-05={build.xml='\n\n ok\n 99\n ok\n'}, 99='2014-01-02_03-04-05', lastFailedBuild='-1', lastSuccessfulBuild='99'}", summarize()); - assertTrue(migrator.migrate(dir, null)); - assertEquals("{99={build.xml='\n\n ok\n 2014-01-02_03-04-05\n 1388649845000\n ok\n'}, lastFailedBuild='-1', lastSuccessfulBuild='99', legacyIds='2014-01-02_03-04-05 99\n'}", summarize()); - assertEquals(99, migrator.findNumber("2014-01-02_03-04-05")); - } - // TODO test sane recovery from various error conditions private void write(String file, String text) throws Exception { From 62af87b67a1097376b9af554421e621d32f7013f Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Thu, 29 Jan 2015 17:57:47 -0500 Subject: [PATCH 229/701] [JENKINS-26698] Make sure BuildExecution.cleanUp always calls super, to release the workspace lease. Also stop closing the build log in Run.handleFatalBuildProblem; we want to see any subsequent messages too. --- core/src/main/java/hudson/model/Build.java | 8 ++- core/src/main/java/hudson/model/Run.java | 11 +-- .../java/hudson/model/BuildExecutionTest.java | 71 +++++++++++++++++++ 3 files changed, 78 insertions(+), 12 deletions(-) create mode 100644 test/src/test/java/hudson/model/BuildExecutionTest.java diff --git a/core/src/main/java/hudson/model/Build.java b/core/src/main/java/hudson/model/Build.java index 99073f1b73..5f012400ef 100644 --- a/core/src/main/java/hudson/model/Build.java +++ b/core/src/main/java/hudson/model/Build.java @@ -189,8 +189,12 @@ public abstract class Build

                      ,B extends Build> @Override public void cleanUp(@Nonnull BuildListener listener) throws Exception { // at this point it's too late to mark the build as a failure, so ignore return value. - performAllBuildSteps(listener, project.getPublishersList(), false); - performAllBuildSteps(listener, project.getProperties(), false); + try { + performAllBuildSteps(listener, project.getPublishersList(), false); + performAllBuildSteps(listener, project.getProperties(), false); + } catch (Exception x) { + x.printStackTrace(listener.error("Post-build steps failed")); + } super.cleanUp(listener); } diff --git a/core/src/main/java/hudson/model/Run.java b/core/src/main/java/hudson/model/Run.java index 8686716dce..3e6eba1b43 100644 --- a/core/src/main/java/hudson/model/Run.java +++ b/core/src/main/java/hudson/model/Run.java @@ -72,7 +72,6 @@ import java.io.OutputStream; import java.io.PrintWriter; import java.io.Reader; import java.io.StringWriter; -import java.io.Writer; import java.nio.charset.Charset; import java.text.DateFormat; import java.text.SimpleDateFormat; @@ -1832,15 +1831,7 @@ public abstract class Run ,RunT extends Run build, Launcher launcher, BuildListener listener) throws InterruptedException, IOException { + return true; + } + @Override public BuildStepMonitor getRequiredMonitorService() { + return BuildStepMonitor.NONE; + } + } + +} From a398cabd32786514d1c373f71c8d566dbc3b22f3 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Thu, 29 Jan 2015 18:07:07 -0500 Subject: [PATCH 230/701] Make WorkspaceList.Lease implement AutoCloseable for Java 7 callers, to make releasing the lease more convenient. --- .../main/java/hudson/slaves/WorkspaceList.java | 18 +++++++++++++++++- .../java/hudson/model/BuildExecutionTest.java | 2 +- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/hudson/slaves/WorkspaceList.java b/core/src/main/java/hudson/slaves/WorkspaceList.java index 5e335f23e2..d2495705a0 100644 --- a/core/src/main/java/hudson/slaves/WorkspaceList.java +++ b/core/src/main/java/hudson/slaves/WorkspaceList.java @@ -26,10 +26,12 @@ package hudson.slaves; import hudson.FilePath; import hudson.Functions; import hudson.model.Computer; +import java.io.Closeable; import java.util.Date; import java.util.HashMap; import java.util.Map; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.logging.Level; import java.util.logging.Logger; import javax.annotation.Nonnull; @@ -104,7 +106,7 @@ public final class WorkspaceList { /** * Represents a leased workspace that needs to be returned later. */ - public static abstract class Lease { + public static abstract class Lease implements /*Auto*/Closeable { public final @Nonnull FilePath path; protected Lease(@Nonnull FilePath path) { @@ -117,6 +119,14 @@ public final class WorkspaceList { */ public abstract void release(); + /** + * By default, calls {@link #release}, but should be idempotent. + * @since TODO + */ + @Override public void close() { + release(); + } + /** * Creates a dummy {@link Lease} object that does no-op in the release. */ @@ -261,9 +271,15 @@ public final class WorkspaceList { */ private Lease lease(@Nonnull FilePath p) { return new Lease(p) { + final AtomicBoolean released = new AtomicBoolean(); public void release() { _release(path); } + @Override public void close() { + if (released.compareAndSet(false, true)) { + release(); + } + } }; } diff --git a/test/src/test/java/hudson/model/BuildExecutionTest.java b/test/src/test/java/hudson/model/BuildExecutionTest.java index 8b3a534d70..7798633fe4 100644 --- a/test/src/test/java/hudson/model/BuildExecutionTest.java +++ b/test/src/test/java/hudson/model/BuildExecutionTest.java @@ -51,7 +51,7 @@ public class BuildExecutionTest { try { assertEquals(ws, lease.path); } finally { - lease.release(); + lease.close(); } } From f593e73e2b04eedf3bf58172650d50e2109aed9d Mon Sep 17 00:00:00 2001 From: Nicolas De Loof Date: Tue, 27 Jan 2015 17:30:14 +0100 Subject: [PATCH 231/701] JDK installer on OSX --- changelog.html | 2 + .../main/java/hudson/tools/JDKInstaller.java | 61 ++++++++++++++++++- 2 files changed, 61 insertions(+), 2 deletions(-) diff --git a/changelog.html b/changelog.html index 951daff776..f58914f1f9 100644 --- a/changelog.html +++ b/changelog.html @@ -55,6 +55,8 @@ Upcoming changes

                      What's new in 1.598 (2015/01/25)

                      From b579a53cfd8cda22691ffbf8afa0fdde5298eb0a Mon Sep 17 00:00:00 2001 From: James Nord Date: Wed, 4 Feb 2015 10:35:03 +0000 Subject: [PATCH 246/701] [SECURITY-167] update log message when prevention is disabled. add stack trace so the offending plugin/code can be identified --- core/src/main/java/jenkins/util/xml/XMLUtils.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/jenkins/util/xml/XMLUtils.java b/core/src/main/java/jenkins/util/xml/XMLUtils.java index ddfc60509b..5aab9b5567 100644 --- a/core/src/main/java/jenkins/util/xml/XMLUtils.java +++ b/core/src/main/java/jenkins/util/xml/XMLUtils.java @@ -5,6 +5,7 @@ import org.xml.sax.SAXException; import org.xml.sax.XMLReader; import org.xml.sax.helpers.XMLReaderFactory; +import java.util.logging.Level; import java.util.logging.LogManager; import java.util.logging.Logger; import javax.annotation.Nonnull; @@ -23,6 +24,7 @@ import javax.xml.transform.sax.SAXTransformerFactory; public final class XMLUtils { private final static Logger LOGGER = LogManager.getLogManager().getLogger(XMLUtils.class.getName()); + private final static String DISABLED_PROPERTY_NAME = XMLUtils.class.getName() + ".disableXXEPrevention"; /** * Transform the source to the output in a manner that is protected against XXE attacks. @@ -61,8 +63,12 @@ public final class XMLUtils { // for some reason we could not convert source // this applies to DOMSource and StAXSource - and possibly 3rd party implementations... // a DOMSource can already be compromised as it is parsed by the time it gets to us. - if (Boolean.getBoolean("disableXXEPrevention")) { - LOGGER.warning("Parsing XML with XXEPrevention disabled!"); + if (Boolean.getBoolean(DISABLED_PROPERTY_NAME)) { + LOGGER.log(Level.WARNING, "XML external entity (XXE) prevention has been disabled by the system " + + "property {0}=true Your system may be vulnerable to XXE attacks.", DISABLED_PROPERTY_NAME); + if (LOGGER.isLoggable(Level.FINE)) { + LOGGER.log(Level.FINE, "Caller stack trace: ", new Exception("XXE Prevention caller history")); + } _transform(source, out); } else { From 01a087d127d7a871eac02b03143464e2f4c6d48c Mon Sep 17 00:00:00 2001 From: Ryan Campbell Date: Thu, 29 Jan 2015 08:45:54 -0600 Subject: [PATCH 247/701] [SECURITY-166] Prevent the creation of anonymous, system or unknown users. These users can still be instantiated, as would happen if there is no security and an anonymous user triggers a build -- the anonymous user would correctly be created and added to the User list. This fix merely prevents the saving of that user, and therefore prevents them from logging in. There may be some plugins which trigger a build as the SYSTEM user, and that is not prohibited here. Also prevent full names of 'anonymous', 'system' or 'uknown'. As discussed on SECURITY-166 this may encumber auditing since full names are used in most places in the UI --- core/src/main/java/hudson/model/User.java | 38 +++++++- .../security/HudsonPrivateSecurityRealm.java | 8 ++ .../hudson/model/Messages.properties | 3 + .../HudsonPrivateSecurityRealm2Test.java | 93 +++++++++++++++++++ .../hudson/security/pages/SignupPage.java | 65 +++++++++++++ 5 files changed, 205 insertions(+), 2 deletions(-) create mode 100644 test/src/test/java/hudson/security/HudsonPrivateSecurityRealm2Test.java create mode 100644 test/src/test/java/hudson/security/pages/SignupPage.java diff --git a/core/src/main/java/hudson/model/User.java b/core/src/main/java/hudson/model/User.java index 3d9cdbb5b5..b09cf7ea49 100644 --- a/core/src/main/java/hudson/model/User.java +++ b/core/src/main/java/hudson/model/User.java @@ -34,6 +34,7 @@ import hudson.security.AccessControlled; import hudson.security.Permission; import hudson.security.SecurityRealm; import hudson.util.FormApply; +import hudson.util.FormValidation; import hudson.util.RunList; import hudson.util.XStream2; import jenkins.model.Jenkins; @@ -46,6 +47,8 @@ import org.acegisecurity.providers.UsernamePasswordAuthenticationToken; import org.acegisecurity.providers.anonymous.AnonymousAuthenticationToken; import org.acegisecurity.userdetails.UserDetails; import org.acegisecurity.userdetails.UsernameNotFoundException; +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.NoExternalUse; import org.springframework.dao.DataAccessException; import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerResponse; @@ -102,7 +105,12 @@ import javax.annotation.Nonnull; */ @ExportedBean public class User extends AbstractModelObject implements AccessControlled, DescriptorByNameOwner, Saveable, Comparable, ModelObjectWithContextMenu { - + + /** + * These usernames should not be used by real users logging into Jenkins. Therefore, we prevent + * users with these names from being saved. + */ + public static final String[] ILLEGAL_PERSISTED_USERNAMES = new String[]{"anonymous", "system", "unknown"}; private transient final String id; private volatile String fullName; @@ -500,10 +508,36 @@ public class User extends AbstractModelObject implements AccessControlled, Descr return new File(Jenkins.getInstance().getRootDir(), "users"); } + /** + * Is the ID allowed? Some are prohibited for security reasons. See SECURITY-166. + *

                      + * Note that this is only enforced when saving. These users are often created + * via the constructor (and even listed on /asynchPeople), but our goal is to + * prevent anyone from logging in as these users. Therefore, we prevent + * saving a User with one of these ids. + * + * @return true if the username or fullname is valid + */ + //TODO: Remove Restricted and add @since when merging to stable-rc + @Restricted(NoExternalUse.class) + public static boolean isIdOrFullnameAllowed(String id) { + for (String invalidId : ILLEGAL_PERSISTED_USERNAMES) { + if (id.equalsIgnoreCase(invalidId)) + return false; + } + return true; + } + /** * Save the settings to a file. */ - public synchronized void save() throws IOException { + public synchronized void save() throws IOException, FormValidation { + if (! isIdOrFullnameAllowed(id)) { + throw FormValidation.error(Messages.User_IllegalUsername(id)); + } + if (! isIdOrFullnameAllowed(fullName)) { + throw FormValidation.error(Messages.User_IllegalFullname(fullName)); + } if(BulkChange.contains(this)) return; getConfigFile().write(this); SaveableListener.fireOnChange(this, getConfigFile()); diff --git a/core/src/main/java/hudson/security/HudsonPrivateSecurityRealm.java b/core/src/main/java/hudson/security/HudsonPrivateSecurityRealm.java index f132fc7c5e..42bd998305 100644 --- a/core/src/main/java/hudson/security/HudsonPrivateSecurityRealm.java +++ b/core/src/main/java/hudson/security/HudsonPrivateSecurityRealm.java @@ -329,6 +329,14 @@ public class HudsonPrivateSecurityRealm extends AbstractPasswordBasedSecurityRea if(si.email==null || !si.email.contains("@")) si.errorMessage = Messages.HudsonPrivateSecurityRealm_CreateAccount_InvalidEmailAddress(); + if (! User.isIdOrFullnameAllowed(si.username)) { + si.errorMessage = hudson.model.Messages.User_IllegalUsername(si.username); + } + + if (! User.isIdOrFullnameAllowed(si.fullname)) { + si.errorMessage = hudson.model.Messages.User_IllegalFullname(si.fullname); + } + if(si.errorMessage!=null) { // failed. ask the user to try again. req.setAttribute("data",si); diff --git a/core/src/main/resources/hudson/model/Messages.properties b/core/src/main/resources/hudson/model/Messages.properties index 83fd5f48d9..ad5711956e 100644 --- a/core/src/main/resources/hudson/model/Messages.properties +++ b/core/src/main/resources/hudson/model/Messages.properties @@ -357,3 +357,6 @@ Jenkins.CheckDisplayName.NameNotUniqueWarning=The display name, "{0}", is used a Jenkins.CheckDisplayName.DisplayNameNotUniqueWarning=The display name, "{0}", is already in use by another job and could cause confusion and delay. Jenkins.NotAllowedName="{0}" is not allowed name + +User.IllegalUsername="{0}" is prohibited as a username for security reasons. +User.IllegalFullname="{0}" is prohibited as a full name for security reasons. \ No newline at end of file diff --git a/test/src/test/java/hudson/security/HudsonPrivateSecurityRealm2Test.java b/test/src/test/java/hudson/security/HudsonPrivateSecurityRealm2Test.java new file mode 100644 index 0000000000..0d87c08f45 --- /dev/null +++ b/test/src/test/java/hudson/security/HudsonPrivateSecurityRealm2Test.java @@ -0,0 +1,93 @@ +package hudson.security; + +import com.gargoylesoftware.htmlunit.html.HtmlPage; +import hudson.model.User; +import hudson.security.pages.SignupPage; +import org.junit.Rule; +import org.junit.Test; +import org.jvnet.hudson.test.JenkinsRule; + +import java.util.Collections; + +import static org.hamcrest.Matchers.containsString; +import static org.junit.Assert.*; + +/** + * Tests the signup page of {@link hudson.security.HudsonPrivateSecurityRealm} + * TODO: Add to {@link hudson.security.HudsonPrivateSecurityRealmTest} going forward + */ +public class HudsonPrivateSecurityRealm2Test { + + + @Rule + public JenkinsRule rule = new JenkinsRule(); + + @Test + public void signup() throws Exception { + HudsonPrivateSecurityRealm securityRealm = new HudsonPrivateSecurityRealm(true, false, null); + rule.jenkins.setSecurityRealm(securityRealm); + JenkinsRule.WebClient wc = rule.createWebClient(); + SignupPage signup = new SignupPage(wc.goTo("signup")); + signup.enterUsername("alice"); + signup.enterPassword("alice"); + signup.enterFullName("Alice User"); + signup.enterEmail("alice@nowhere.com"); + HtmlPage success = signup.submit(rule); + assertThat(success.getElementById("main-panel").getTextContent(), containsString("Success")); + assertThat(success.getElementById("login-field").getTextContent(), containsString("Alice User")); + + assertEquals("Alice User", securityRealm.getUser("alice").getDisplayName()); + + } + + // @Issue("SECURITY-166") + @Test + public void anonymousCantSignup() throws Exception { + HudsonPrivateSecurityRealm securityRealm = new HudsonPrivateSecurityRealm(true, false, null); + rule.jenkins.setSecurityRealm(securityRealm); + JenkinsRule.WebClient wc = rule.createWebClient(); + SignupPage signup = new SignupPage(wc.goTo("signup")); + signup.enterUsername("anonymous"); + signup.enterFullName("Bob"); + signup.enterPassword("nothing"); + signup.enterEmail("noone@nowhere.com"); + signup = new SignupPage(signup.submit(rule)); + signup.assertErrorContains("prohibited as a username"); + assertNull(User.get("anonymous", false, Collections.emptyMap())); + } + + // @Issue("SECURITY-166") + @Test + public void systemCantSignup() throws Exception { + HudsonPrivateSecurityRealm securityRealm = new HudsonPrivateSecurityRealm(true, false, null); + rule.jenkins.setSecurityRealm(securityRealm); + JenkinsRule.WebClient wc = rule.createWebClient(); + SignupPage signup = new SignupPage(wc.goTo("signup")); + signup.enterUsername("system"); + signup.enterFullName("Bob"); + signup.enterPassword("nothing"); + signup.enterEmail("noone@nowhere.com"); + signup = new SignupPage(signup.submit(rule)); + signup.assertErrorContains("prohibited as a username"); + assertNull(User.get("system",false, Collections.emptyMap())); + } + + /** + * We don't allow prohibited fullnames since this may encumber auditing. + */ + // @Issue("SECURITY-166") + @Test + public void fullNameOfUnknownCantSignup() throws Exception { + HudsonPrivateSecurityRealm securityRealm = new HudsonPrivateSecurityRealm(true, false, null); + rule.jenkins.setSecurityRealm(securityRealm); + JenkinsRule.WebClient wc = rule.createWebClient(); + SignupPage signup = new SignupPage(wc.goTo("signup")); + signup.enterUsername("unknown2"); + signup.enterPassword("unknown2"); + signup.enterFullName("unknown"); + signup.enterEmail("noone@nowhere.com"); + signup = new SignupPage(signup.submit(rule)); + signup.assertErrorContains("prohibited as a full name"); + assertNull(User.get("unknown2",false, Collections.emptyMap())); + } +} diff --git a/test/src/test/java/hudson/security/pages/SignupPage.java b/test/src/test/java/hudson/security/pages/SignupPage.java new file mode 100644 index 0000000000..5007bce1b5 --- /dev/null +++ b/test/src/test/java/hudson/security/pages/SignupPage.java @@ -0,0 +1,65 @@ +package hudson.security.pages; + +import com.gargoylesoftware.htmlunit.html.HtmlForm; +import com.gargoylesoftware.htmlunit.html.HtmlPage; +import org.jvnet.hudson.test.JenkinsRule; + +import static org.hamcrest.Matchers.containsString; +import static org.junit.Assert.*; + +/** + * The the signup page for {@link hudson.security.HudsonPrivateSecurityRealm} + */ +public class SignupPage { + + public HtmlForm signupForm; + public final HtmlPage signupPage; + + public SignupPage(HtmlPage signupPage) { + this.signupPage = signupPage; + + assertNotNull("The sign up page has a username field.", this.signupPage.getElementById("username")); + for (HtmlForm signupForm : this.signupPage.getForms()) { + if (signupForm.getInputsByName("username").size() == 0) + continue; + this.signupForm = signupForm; + } + + } + + + + public void enterUsername(String username) { + signupForm.getInputByName("username").setValueAttribute(username); + } + + /** + * Enters the password in password1 and password2. + * You can then call {@link #enterPassword2(String)} if you want them to be different. + * @param password + */ + public void enterPassword(String password) { + signupForm.getInputByName("password1").setValueAttribute(password); + signupForm.getInputByName("password2").setValueAttribute(password); + } + + public void enterPassword2(String password2) { + signupForm.getInputByName("password2").setValueAttribute(password2); + } + + public void enterFullName(String fullName) { + signupForm.getInputByName("fullname").setValueAttribute(fullName); + } + + public void enterEmail(String email) { + signupForm.getInputByName("email").setValueAttribute(email); + } + + public HtmlPage submit(JenkinsRule rule) throws Exception { + return rule.submit(signupForm); + } + + public void assertErrorContains(String msg) { + assertThat(signupForm.getElementById("main-panel").getTextContent(),containsString(msg)); + } +} From fac3c21367d16b6296850145e6116df762173310 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20Gond=C5=BEa?= Date: Wed, 4 Feb 2015 13:54:11 +0100 Subject: [PATCH 248/701] Do not fail HudsonTestCase test when TestEnvironment.dispose fails JenkinsRule does the same for years. --- .../main/java/org/jvnet/hudson/test/HudsonTestCase.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/test/src/main/java/org/jvnet/hudson/test/HudsonTestCase.java b/test/src/main/java/org/jvnet/hudson/test/HudsonTestCase.java index 7c62154b98..42fe5eb83d 100644 --- a/test/src/main/java/org/jvnet/hudson/test/HudsonTestCase.java +++ b/test/src/main/java/org/jvnet/hudson/test/HudsonTestCase.java @@ -411,10 +411,15 @@ public abstract class HudsonTestCase extends TestCase implements RootAction { if (jenkins!=null) jenkins.cleanUp(); - env.dispose(); ExtensionList.clearLegacyInstances(); DescriptorExtensionList.clearLegacyInstances(); + try { + env.dispose(); + } catch (Exception x) { + x.printStackTrace(); + } + // Jenkins creates ClassLoaders for plugins that hold on to file descriptors of its jar files, // but because there's no explicit dispose method on ClassLoader, they won't get GC-ed until // at some later point, leading to possible file descriptor overflow. So encourage GC now. From 09c04e3b666ef0832201d4433326b35b4bf84991 Mon Sep 17 00:00:00 2001 From: Ryan Campbell Date: Wed, 4 Feb 2015 09:05:03 -0600 Subject: [PATCH 249/701] Resolve feedback on SECURITY-165 --- core/src/main/java/hudson/model/User.java | 2 +- .../HudsonPrivateSecurityRealm2Test.java | 23 +++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/hudson/model/User.java b/core/src/main/java/hudson/model/User.java index b09cf7ea49..e61c3b76bf 100644 --- a/core/src/main/java/hudson/model/User.java +++ b/core/src/main/java/hudson/model/User.java @@ -110,7 +110,7 @@ public class User extends AbstractModelObject implements AccessControlled, Descr * These usernames should not be used by real users logging into Jenkins. Therefore, we prevent * users with these names from being saved. */ - public static final String[] ILLEGAL_PERSISTED_USERNAMES = new String[]{"anonymous", "system", "unknown"}; + private static final String[] ILLEGAL_PERSISTED_USERNAMES = new String[]{"anonymous", "system", "unknown"}; private transient final String id; private volatile String fullName; diff --git a/test/src/test/java/hudson/security/HudsonPrivateSecurityRealm2Test.java b/test/src/test/java/hudson/security/HudsonPrivateSecurityRealm2Test.java index 0d87c08f45..887626f321 100644 --- a/test/src/test/java/hudson/security/HudsonPrivateSecurityRealm2Test.java +++ b/test/src/test/java/hudson/security/HudsonPrivateSecurityRealm2Test.java @@ -1,3 +1,26 @@ +/* + * The MIT License + * + * Copyright (c) 2015, CloudBees, Inc + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ package hudson.security; import com.gargoylesoftware.htmlunit.html.HtmlPage; From b31bb1cc1c5a61a3e984e45e33cafa6130517938 Mon Sep 17 00:00:00 2001 From: tfennelly Date: Mon, 26 Jan 2015 09:23:11 +0000 Subject: [PATCH 250/701] [FIXED JENKINS-26406] Build history text field wrap fails when containing markup --- war/src/main/webapp/css/style.css | 1 - .../main/webapp/scripts/hudson-behavior.js | 63 +++++++++++++++---- 2 files changed, 52 insertions(+), 12 deletions(-) diff --git a/war/src/main/webapp/css/style.css b/war/src/main/webapp/css/style.css index b7dcd0ac80..dd467d7cc0 100644 --- a/war/src/main/webapp/css/style.css +++ b/war/src/main/webapp/css/style.css @@ -956,7 +956,6 @@ table.parameters > tbody:hover { margin-top: 5px; white-space: normal; opacity: 0.6; - font-style: italic; } #buildHistory .build-row-cell { diff --git a/war/src/main/webapp/scripts/hudson-behavior.js b/war/src/main/webapp/scripts/hudson-behavior.js index 23759a3e1c..270ab19cbc 100644 --- a/war/src/main/webapp/scripts/hudson-behavior.js +++ b/war/src/main/webapp/scripts/hudson-behavior.js @@ -1681,9 +1681,9 @@ function updateBuildHistory(ajaxUrl,nBuild) { resetCellOverflows(); // Insert zero-width spaces so as to allow text to wrap, allowing us to get the true clientWidth. - insertZeroWidthSpaces(displayName, 2); + insertZeroWidthSpacesInElementText(displayName, 2); if (desc) { - insertZeroWidthSpaces(desc, 30); + insertZeroWidthSpacesInElementText(desc, 30); markMultiline(); } @@ -1701,7 +1701,7 @@ function updateBuildHistory(ajaxUrl,nBuild) { // If the name is overflowed, lets remove the zero-width spaces we added above and // re-add zero-width spaces with a bigger max word sizes. removeZeroWidthSpaces(displayName); - insertZeroWidthSpaces(displayName, 20); + insertZeroWidthSpacesInElementText(displayName, 20); } function fitToControlsHeight(element) { @@ -1871,11 +1871,11 @@ function updateBuildHistory(ajaxUrl,nBuild) { // Insert zero-width spaces in text that may cause overflow distortions. var displayNames = $(bh).getElementsBySelector('.display-name'); for (var i = 0; i < displayNames.length; i++) { - insertZeroWidthSpaces(displayNames[i], 2); + insertZeroWidthSpacesInElementText(displayNames[i], 2); } var descriptions = $(bh).getElementsBySelector('.desc'); for (var i = 0; i < descriptions.length; i++) { - insertZeroWidthSpaces(descriptions[i], 30); + insertZeroWidthSpacesInElementText(descriptions[i], 30); } for (var i = 0; i < rows.length; i++) { @@ -1968,13 +1968,17 @@ function getElementOverflowParams(element) { } var zeroWidthSpace = String.fromCharCode(8203); -function insertZeroWidthSpaces(element, maxWordSize) { - if (Element.hasClassName(element, 'zws-inserted')) { - // already done. +var ELEMENT_NODE = 1; +var TEXT_NODE = 3; +function insertZeroWidthSpacesInText(textNode, maxWordSize) { + if (textNode.textContent.length < maxWordSize) { return; } - var words = element.textContent.split(/\s+/); + // capture the original text + textNode.preZWSText = textNode.textContent; + + var words = textNode.textContent.split(/\s+/); var newTextContent = ''; var splitRegex = new RegExp('.{1,' + maxWordSize + '}', 'g'); @@ -1995,12 +1999,49 @@ function insertZeroWidthSpaces(element, maxWordSize) { newTextContent += ' '; } - element.textContent = newTextContent; + textNode.textContent = newTextContent; +} +function insertZeroWidthSpacesInElementText(element, maxWordSize) { + if (Element.hasClassName(element, 'zws-inserted')) { + // already done. + return; + } + if (!element.hasChildNodes()) { + return; + } + + var children = element.childNodes; + for (var i = 0; i < children.length; i++) { + var child = children[i]; + if (child.nodeType === TEXT_NODE) { + insertZeroWidthSpacesInText(child, maxWordSize); + } else if (child.nodeType === ELEMENT_NODE) { + insertZeroWidthSpacesInElementText(child, maxWordSize); + } + } + Element.addClassName(element, 'zws-inserted'); } function removeZeroWidthSpaces(element) { if (element) { - element.textContent = element.textContent.replace(zeroWidthSpace, ''); + if (!Element.hasClassName(element, 'zws-inserted')) { + // Doesn't have ZWSed text. + return; + } + if (!element.hasChildNodes()) { + return; + } + + var children = element.childNodes; + for (var i = 0; i < children.length; i++) { + var child = children[i]; + if (child.nodeType === TEXT_NODE && child.preZWSText) { + child.textContent = child.preZWSText; + } else if (child.nodeType === ELEMENT_NODE) { + removeZeroWidthSpaces(child); + } + } + Element.removeClassName(element, 'zws-inserted'); } } From 71f9d5ebf4a46ceb5c906df3bf693cc5cc05f1c7 Mon Sep 17 00:00:00 2001 From: Ryan Campbell Date: Wed, 4 Feb 2015 10:24:17 -0600 Subject: [PATCH 251/701] [SECURITY-165] Add constants for system-wide usernames --- core/src/main/java/hudson/model/User.java | 10 ++++++++-- core/src/main/java/hudson/security/ACL.java | 17 +++++++++++++++-- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/core/src/main/java/hudson/model/User.java b/core/src/main/java/hudson/model/User.java index e61c3b76bf..9367181741 100644 --- a/core/src/main/java/hudson/model/User.java +++ b/core/src/main/java/hudson/model/User.java @@ -106,11 +106,17 @@ import javax.annotation.Nonnull; @ExportedBean public class User extends AbstractModelObject implements AccessControlled, DescriptorByNameOwner, Saveable, Comparable, ModelObjectWithContextMenu { + /** + * The username of the 'unknown' user used to avoid null user references. + */ + private static final String UKNOWN_USERNAME = "unknown"; + /** * These usernames should not be used by real users logging into Jenkins. Therefore, we prevent * users with these names from being saved. */ - private static final String[] ILLEGAL_PERSISTED_USERNAMES = new String[]{"anonymous", "system", "unknown"}; + private static final String[] ILLEGAL_PERSISTED_USERNAMES = new String[]{ACL.ANONYMOUS_USERNAME, + ACL.SYSTEM_USERNAME, UKNOWN_USERNAME}; private transient final String id; private volatile String fullName; @@ -291,7 +297,7 @@ public class User extends AbstractModelObject implements AccessControlled, Descr * This is used to avoid null {@link User} instance. */ public static @Nonnull User getUnknown() { - return get("unknown"); + return get(UKNOWN_USERNAME); } /** diff --git a/core/src/main/java/hudson/security/ACL.java b/core/src/main/java/hudson/security/ACL.java index 132344fc52..1ad915a456 100644 --- a/core/src/main/java/hudson/security/ACL.java +++ b/core/src/main/java/hudson/security/ACL.java @@ -32,6 +32,8 @@ import org.acegisecurity.context.SecurityContextHolder; import org.acegisecurity.providers.UsernamePasswordAuthenticationToken; import org.acegisecurity.acls.sid.PrincipalSid; import org.acegisecurity.acls.sid.Sid; +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.NoExternalUse; /** * Gate-keeper that controls access to Hudson's model objects. @@ -92,23 +94,34 @@ public abstract class ACL { } }; + /** + * The username for the anonymous user + */ + @Restricted(NoExternalUse.class) + public static final String ANONYMOUS_USERNAME = "anonymous"; /** * {@link Sid} that represents the anonymous unauthenticated users. *

                      * {@link HudsonFilter} sets this up, so this sid remains the same * regardless of the current {@link SecurityRealm} in use. */ - public static final Sid ANONYMOUS = new PrincipalSid("anonymous"); + public static final Sid ANONYMOUS = new PrincipalSid(ANONYMOUS_USERNAME); protected static final Sid[] AUTOMATIC_SIDS = new Sid[]{EVERYONE,ANONYMOUS}; + /** + * The username for the system user + */ + @Restricted(NoExternalUse.class) + public static final String SYSTEM_USERNAME = "SYSTEM"; + /** * {@link Sid} that represents the Hudson itself. *

                      * This is used when Hudson is performing computation for itself, instead * of acting on behalf of an user, such as doing builds. */ - public static final Authentication SYSTEM = new UsernamePasswordAuthenticationToken("SYSTEM","SYSTEM"); + public static final Authentication SYSTEM = new UsernamePasswordAuthenticationToken(SYSTEM_USERNAME,"SYSTEM"); /** * Changes the {@link Authentication} associated with the current thread From 7d926f720ea2d86ad60556a56ae1c7241b5392b7 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Mon, 14 Apr 2014 19:03:29 -0400 Subject: [PATCH 252/701] Removing hudson.matrix classes and associated resources as a first pass. (cherry picked from commit 4aad749cbe282ef33134ea924a4e547c4767ca07) Conflicts: core/src/main/java/hudson/matrix/MatrixBuild.java core/src/main/java/hudson/matrix/MatrixConfiguration.java core/src/main/java/hudson/matrix/MatrixProject.java core/src/main/resources/hudson/matrix/MatrixProject/configure-entries.jelly --- core/src/main/java/hudson/matrix/Axis.java | 265 ----- .../java/hudson/matrix/AxisDescriptor.java | 67 -- .../src/main/java/hudson/matrix/AxisList.java | 108 -- .../main/java/hudson/matrix/Combination.java | 265 ----- .../hudson/matrix/DefaultAxisDescriptor.java | 48 - .../DefaultMatrixExecutionStrategyImpl.java | 300 ------ .../main/java/hudson/matrix/FilterScript.java | 136 --- core/src/main/java/hudson/matrix/JDKAxis.java | 72 -- .../main/java/hudson/matrix/LabelAxis.java | 85 -- .../main/java/hudson/matrix/LabelExpAxis.java | 97 -- .../src/main/java/hudson/matrix/Layouter.java | 225 ----- .../java/hudson/matrix/LinkedLogRotator.java | 77 -- .../hudson/matrix/MatrixAggregatable.java | 69 -- .../java/hudson/matrix/MatrixAggregator.java | 105 -- .../main/java/hudson/matrix/MatrixBuild.java | 406 -------- .../java/hudson/matrix/MatrixChildAction.java | 39 - .../hudson/matrix/MatrixConfiguration.java | 432 -------- .../matrix/MatrixConfigurationSorter.java | 36 - .../MatrixConfigurationSorterDescriptor.java | 27 - .../matrix/MatrixExecutionStrategy.java | 60 -- .../MatrixExecutionStrategyDescriptor.java | 48 - .../java/hudson/matrix/MatrixProject.java | 951 ------------------ .../main/java/hudson/matrix/MatrixRun.java | 186 ---- .../matrix/NoopMatrixConfigurationSorter.java | 33 - .../src/main/java/hudson/matrix/TextAxis.java | 34 - .../matrix/listeners/MatrixBuildListener.java | 84 -- core/src/main/java/hudson/matrix/package.html | 27 - .../config.groovy | 28 - .../config.properties | 24 - .../config_da.properties | 29 - .../config_de.properties | 30 - .../config_ja.properties | 31 - .../config_pt_BR.properties | 29 - .../config_zh_TW.properties | 31 - .../help-hasTouchStoneCombinationFilter.html | 5 - ...elp-hasTouchStoneCombinationFilter_de.html | 10 - ...elp-hasTouchStoneCombinationFilter_ja.html | 5 - ...-hasTouchStoneCombinationFilter_zh_TW.html | 5 - .../help-runSequentially.html | 5 - .../help-runSequentially_de.html | 6 - .../help-runSequentially_ja.html | 4 - .../help-runSequentially_zh_TW.html | 4 - .../hudson/matrix/JDKAxis/config.jelly | 33 - .../hudson/matrix/LabelAxis/config.jelly | 66 -- .../matrix/LabelAxis/config_da.properties | 26 - .../matrix/LabelAxis/config_de.properties | 26 - .../matrix/LabelAxis/config_es.properties | 26 - .../matrix/LabelAxis/config_ja.properties | 26 - .../matrix/LabelAxis/config_pt.properties | 27 - .../matrix/LabelAxis/config_zh_TW.properties | 26 - .../hudson/matrix/LabelAxis/help-labels.html | 27 - .../matrix/LabelAxis/help-labels_de.html | 30 - .../matrix/LabelAxis/help-labels_fr.html | 34 - .../matrix/LabelAxis/help-labels_ja.html | 23 - .../matrix/LabelAxis/help-labels_nl.html | 15 - .../matrix/LabelAxis/help-labels_pt_BR.html | 27 - .../matrix/LabelAxis/help-labels_ru.html | 28 - .../matrix/LabelAxis/help-labels_tr.html | 26 - .../matrix/LabelAxis/help-labels_zh_TW.html | 21 - .../hudson/matrix/LabelAxis/help.html | 5 - .../hudson/matrix/LabelAxis/help_zh_TW.html | 4 - .../hudson/matrix/LabelExpAxis/config.jelly | 32 - .../matrix/LabelExpAxis/config_es.properties | 24 - .../matrix/LabelExpAxis/config_ja.properties | 25 - .../matrix/LabelExpAxis/config_pt.properties | 25 - .../LabelExpAxis/config_zh_TW.properties | 24 - .../matrix/LabelExpAxis/help-labelExpr.html | 4 - .../LabelExpAxis/help-labelExpr_ja.html | 4 - .../LabelExpAxis/help-labelExpr_zh_TW.html | 4 - .../hudson/matrix/LabelExpAxis/help.html | 4 - .../hudson/matrix/LabelExpAxis/help_ja.html | 4 - .../matrix/LabelExpAxis/help_zh_TW.html | 4 - .../matrix/MatrixBuild/ajaxMatrix.jelly | 48 - .../MatrixBuild/ajaxMatrix_da.properties | 23 - .../MatrixBuild/ajaxMatrix_de.properties | 1 - .../MatrixBuild/ajaxMatrix_es.properties | 23 - .../MatrixBuild/ajaxMatrix_fr.properties | 23 - .../MatrixBuild/ajaxMatrix_it.properties | 23 - .../MatrixBuild/ajaxMatrix_ja.properties | 23 - .../MatrixBuild/ajaxMatrix_nl.properties | 3 - .../MatrixBuild/ajaxMatrix_pt.properties | 23 - .../MatrixBuild/ajaxMatrix_pt_BR.properties | 23 - .../MatrixBuild/ajaxMatrix_ru.properties | 4 - .../MatrixBuild/ajaxMatrix_zh_TW.properties | 23 - .../matrix/MatrixBuild/confirmDeleteAll.jelly | 43 - .../MatrixBuild/confirmDeleteAll.properties | 23 - .../confirmDeleteAll_de.properties | 25 - .../confirmDeleteAll_es.properties | 26 - .../confirmDeleteAll_ja.properties | 27 - .../confirmDeleteAll_pt.properties | 27 - .../confirmDeleteAll_ru.properties | 4 - .../confirmDeleteAll_zh_TW.properties | 25 - .../hudson/matrix/MatrixBuild/delete.jelly | 34 - .../matrix/MatrixBuild/delete_ca.properties | 3 - .../matrix/MatrixBuild/delete_cs.properties | 4 - .../matrix/MatrixBuild/delete_de.properties | 24 - .../matrix/MatrixBuild/delete_es.properties | 24 - .../matrix/MatrixBuild/delete_ja.properties | 25 - .../matrix/MatrixBuild/delete_ko.properties | 4 - .../matrix/MatrixBuild/delete_pl.properties | 4 - .../matrix/MatrixBuild/delete_pt.properties | 25 - .../MatrixBuild/delete_pt_BR.properties | 5 - .../matrix/MatrixBuild/delete_ru.properties | 4 - .../MatrixBuild/delete_zh_CN.properties | 4 - .../MatrixBuild/delete_zh_TW.properties | 24 - .../hudson/matrix/MatrixBuild/main.jelly | 28 - .../MatrixConfigurationSorter/config.groovy | 1 - .../matrix/MatrixProject/ajaxMatrix.jelly | 47 - .../MatrixProject/ajaxMatrix_da.properties | 23 - .../MatrixProject/ajaxMatrix_de.properties | 1 - .../MatrixProject/ajaxMatrix_es.properties | 23 - .../MatrixProject/ajaxMatrix_fi.properties | 23 - .../MatrixProject/ajaxMatrix_fr.properties | 23 - .../MatrixProject/ajaxMatrix_it.properties | 23 - .../MatrixProject/ajaxMatrix_ja.properties | 23 - .../MatrixProject/ajaxMatrix_pl.properties | 23 - .../MatrixProject/ajaxMatrix_pt.properties | 24 - .../MatrixProject/ajaxMatrix_pt_BR.properties | 23 - .../MatrixProject/ajaxMatrix_ro.properties | 3 - .../MatrixProject/ajaxMatrix_ru.properties | 3 - .../MatrixProject/ajaxMatrix_sv_SE.properties | 3 - .../MatrixProject/ajaxMatrix_zh_CN.properties | 23 - .../MatrixProject/ajaxMatrix_zh_TW.properties | 23 - .../MatrixProject/configure-entries.jelly | 99 -- .../configure-entries_da.properties | 27 - .../configure-entries_de.properties | 30 - .../configure-entries_es.properties | 32 - .../configure-entries_fr.properties | 35 - .../configure-entries_ja.properties | 33 - .../configure-entries_ko.properties | 6 - .../configure-entries_nl.properties | 31 - .../configure-entries_pt.properties | 33 - .../configure-entries_pt_BR.properties | 38 - .../configure-entries_ru.properties | 33 - .../configure-entries_sk.properties | 5 - .../configure-entries_sv_SE.properties | 5 - .../configure-entries_tr.properties | 35 - .../configure-entries_zh_TW.properties | 32 - .../help-childCustomWorkspace.html | 28 - .../help-childCustomWorkspace_zh_TW.html | 24 - .../MatrixProject/help-slaveAffinity.html | 9 - .../hudson/matrix/MatrixProject/index.jelly | 62 -- .../matrix/MatrixProject/index_ar.properties | 3 - .../matrix/MatrixProject/index_cs.properties | 23 - .../matrix/MatrixProject/index_da.properties | 23 - .../matrix/MatrixProject/index_de.properties | 24 - .../matrix/MatrixProject/index_es.properties | 25 - .../matrix/MatrixProject/index_fi.properties | 23 - .../matrix/MatrixProject/index_fr.properties | 24 - .../matrix/MatrixProject/index_he.properties | 4 - .../matrix/MatrixProject/index_hu.properties | 3 - .../matrix/MatrixProject/index_it.properties | 23 - .../matrix/MatrixProject/index_ja.properties | 25 - .../matrix/MatrixProject/index_ko.properties | 4 - .../matrix/MatrixProject/index_nl.properties | 23 - .../matrix/MatrixProject/index_pl.properties | 23 - .../matrix/MatrixProject/index_pt.properties | 26 - .../MatrixProject/index_pt_BR.properties | 25 - .../matrix/MatrixProject/index_ro.properties | 4 - .../matrix/MatrixProject/index_ru.properties | 24 - .../MatrixProject/index_sv_SE.properties | 4 - .../matrix/MatrixProject/index_tr.properties | 23 - .../matrix/MatrixProject/index_uk.properties | 4 - .../MatrixProject/index_zh_CN.properties | 23 - .../MatrixProject/index_zh_TW.properties | 26 - .../matrix/MatrixProject/newJobDetail.jelly | 28 - .../MatrixProject/newJobDetail.properties | 25 - .../MatrixProject/newJobDetail_ar.properties | 3 - .../MatrixProject/newJobDetail_da.properties | 23 - .../MatrixProject/newJobDetail_de.properties | 27 - .../MatrixProject/newJobDetail_es.properties | 26 - .../MatrixProject/newJobDetail_et.properties | 3 - .../MatrixProject/newJobDetail_fi.properties | 3 - .../MatrixProject/newJobDetail_fr.properties | 26 - .../newJobDetail_hi_IN.properties | 3 - .../MatrixProject/newJobDetail_it.properties | 23 - .../MatrixProject/newJobDetail_ja.properties | 24 - .../MatrixProject/newJobDetail_ko.properties | 23 - .../newJobDetail_nb_NO.properties | 23 - .../MatrixProject/newJobDetail_nl.properties | 23 - .../MatrixProject/newJobDetail_pl.properties | 23 - .../MatrixProject/newJobDetail_pt.properties | 26 - .../newJobDetail_pt_BR.properties | 23 - .../MatrixProject/newJobDetail_ru.properties | 23 - .../newJobDetail_sv_SE.properties | 23 - .../MatrixProject/newJobDetail_tr.properties | 23 - .../MatrixProject/newJobDetail_uk.properties | 3 - .../newJobDetail_zh_CN.properties | 23 - .../newJobDetail_zh_TW.properties | 24 - .../hudson/matrix/Messages.properties | 41 - .../hudson/matrix/Messages_da.properties | 33 - .../hudson/matrix/Messages_de.properties | 40 - .../hudson/matrix/Messages_es.properties | 39 - .../hudson/matrix/Messages_fr.properties | 30 - .../hudson/matrix/Messages_ja.properties | 40 - .../hudson/matrix/Messages_nl.properties | 31 - .../hudson/matrix/Messages_pt.properties | 40 - .../hudson/matrix/Messages_pt_BR.properties | 42 - .../hudson/matrix/Messages_ru.properties | 30 - .../hudson/matrix/Messages_tr.properties | 31 - .../hudson/matrix/Messages_zh_CN.properties | 37 - .../hudson/matrix/Messages_zh_TW.properties | 39 - .../hudson/matrix/TextAxis/config.jelly | 32 - .../matrix/TextAxis/config_da.properties | 24 - .../matrix/TextAxis/config_de.properties | 24 - .../matrix/TextAxis/config_es.properties | 24 - .../matrix/TextAxis/config_ja.properties | 24 - .../matrix/TextAxis/config_pt.properties | 24 - .../matrix/TextAxis/config_zh_TW.properties | 24 - .../matrix/TextAxis/help-valueString.html | 4 - .../matrix/TextAxis/help-valueString_de.html | 5 - .../matrix/TextAxis/help-valueString_fr.html | 4 - .../matrix/TextAxis/help-valueString_ja.html | 4 - .../matrix/TextAxis/help-valueString_nl.html | 3 - .../TextAxis/help-valueString_pt_BR.html | 3 - .../matrix/TextAxis/help-valueString_ru.html | 3 - .../matrix/TextAxis/help-valueString_tr.html | 3 - .../TextAxis/help-valueString_zh_TW.html | 4 - .../resources/lib/hudson/project/matrix.jelly | 103 -- .../lib/hudson/project/matrix_ar.properties | 3 - .../lib/hudson/project/matrix_cs.properties | 23 - .../lib/hudson/project/matrix_da.properties | 24 - .../lib/hudson/project/matrix_de.properties | 24 - .../lib/hudson/project/matrix_es.properties | 24 - .../lib/hudson/project/matrix_fi.properties | 23 - .../lib/hudson/project/matrix_fr.properties | 24 - .../lib/hudson/project/matrix_he.properties | 3 - .../lib/hudson/project/matrix_it.properties | 23 - .../lib/hudson/project/matrix_ja.properties | 24 - .../lib/hudson/project/matrix_ko.properties | 3 - .../lib/hudson/project/matrix_nl.properties | 24 - .../lib/hudson/project/matrix_pl.properties | 24 - .../hudson/project/matrix_pt_BR.properties | 24 - .../hudson/project/matrix_pt_PT.properties | 23 - .../lib/hudson/project/matrix_ro.properties | 3 - .../lib/hudson/project/matrix_ru.properties | 24 - .../hudson/project/matrix_sv_SE.properties | 4 - .../lib/hudson/project/matrix_tr.properties | 24 - .../lib/hudson/project/matrix_uk.properties | 3 - .../hudson/project/matrix_zh_CN.properties | 23 - .../hudson/project/matrix_zh_TW.properties | 24 - ...CombinationFilterUsingBuildParamsTest.java | 304 ------ .../java/hudson/matrix/CombinationTest.java | 62 -- .../MatrixProjectCustomWorkspaceTest.groovy | 147 --- .../hudson/matrix/MatrixProjectTest.groovy | 522 ---------- .../matrix/MatrixConfigurationSorterTest.java | 48 - .../matrix/MatrixProjectDependencyTest.java | 41 - .../test/java/hudson/matrix/MatrixTest.java | 76 -- .../MatrixProjectTest/testUpgrade/config.xml | 1 - .../testUpgrade/jobs/x/config.xml | 19 - .../resources/hudson/matrix/echo-property.pom | 70 -- war/src/main/webapp/help/matrix/axes.html | 22 - war/src/main/webapp/help/matrix/axes_de.html | 24 - war/src/main/webapp/help/matrix/axes_fr.html | 30 - war/src/main/webapp/help/matrix/axes_ja.html | 21 - war/src/main/webapp/help/matrix/axes_nl.html | 15 - .../main/webapp/help/matrix/axes_pt_BR.html | 22 - war/src/main/webapp/help/matrix/axes_ru.html | 24 - war/src/main/webapp/help/matrix/axes_tr.html | 20 - .../main/webapp/help/matrix/axes_zh_TW.html | 21 - .../webapp/help/matrix/combinationfilter.html | 54 - .../help/matrix/combinationfilter_de.html | 55 - .../help/matrix/combinationfilter_fr.html | 54 - .../help/matrix/combinationfilter_ja.html | 49 - .../help/matrix/combinationfilter_zh_TW.html | 47 - war/src/main/webapp/help/matrix/jdk.html | 12 - war/src/main/webapp/help/matrix/jdk_de.html | 15 - war/src/main/webapp/help/matrix/jdk_fr.html | 15 - war/src/main/webapp/help/matrix/jdk_ja.html | 10 - war/src/main/webapp/help/matrix/jdk_nl.html | 8 - .../main/webapp/help/matrix/jdk_pt_BR.html | 12 - war/src/main/webapp/help/matrix/jdk_ru.html | 13 - war/src/main/webapp/help/matrix/jdk_tr.html | 11 - .../main/webapp/help/matrix/jdk_zh_TW.html | 10 - 274 files changed, 10659 deletions(-) delete mode 100644 core/src/main/java/hudson/matrix/Axis.java delete mode 100644 core/src/main/java/hudson/matrix/AxisDescriptor.java delete mode 100644 core/src/main/java/hudson/matrix/AxisList.java delete mode 100644 core/src/main/java/hudson/matrix/Combination.java delete mode 100644 core/src/main/java/hudson/matrix/DefaultAxisDescriptor.java delete mode 100644 core/src/main/java/hudson/matrix/DefaultMatrixExecutionStrategyImpl.java delete mode 100644 core/src/main/java/hudson/matrix/FilterScript.java delete mode 100644 core/src/main/java/hudson/matrix/JDKAxis.java delete mode 100644 core/src/main/java/hudson/matrix/LabelAxis.java delete mode 100644 core/src/main/java/hudson/matrix/LabelExpAxis.java delete mode 100644 core/src/main/java/hudson/matrix/Layouter.java delete mode 100644 core/src/main/java/hudson/matrix/LinkedLogRotator.java delete mode 100644 core/src/main/java/hudson/matrix/MatrixAggregatable.java delete mode 100644 core/src/main/java/hudson/matrix/MatrixAggregator.java delete mode 100644 core/src/main/java/hudson/matrix/MatrixBuild.java delete mode 100644 core/src/main/java/hudson/matrix/MatrixChildAction.java delete mode 100644 core/src/main/java/hudson/matrix/MatrixConfiguration.java delete mode 100644 core/src/main/java/hudson/matrix/MatrixConfigurationSorter.java delete mode 100644 core/src/main/java/hudson/matrix/MatrixConfigurationSorterDescriptor.java delete mode 100644 core/src/main/java/hudson/matrix/MatrixExecutionStrategy.java delete mode 100644 core/src/main/java/hudson/matrix/MatrixExecutionStrategyDescriptor.java delete mode 100644 core/src/main/java/hudson/matrix/MatrixProject.java delete mode 100644 core/src/main/java/hudson/matrix/MatrixRun.java delete mode 100644 core/src/main/java/hudson/matrix/NoopMatrixConfigurationSorter.java delete mode 100644 core/src/main/java/hudson/matrix/TextAxis.java delete mode 100644 core/src/main/java/hudson/matrix/listeners/MatrixBuildListener.java delete mode 100644 core/src/main/java/hudson/matrix/package.html delete mode 100644 core/src/main/resources/hudson/matrix/DefaultMatrixExecutionStrategyImpl/config.groovy delete mode 100644 core/src/main/resources/hudson/matrix/DefaultMatrixExecutionStrategyImpl/config.properties delete mode 100644 core/src/main/resources/hudson/matrix/DefaultMatrixExecutionStrategyImpl/config_da.properties delete mode 100644 core/src/main/resources/hudson/matrix/DefaultMatrixExecutionStrategyImpl/config_de.properties delete mode 100644 core/src/main/resources/hudson/matrix/DefaultMatrixExecutionStrategyImpl/config_ja.properties delete mode 100644 core/src/main/resources/hudson/matrix/DefaultMatrixExecutionStrategyImpl/config_pt_BR.properties delete mode 100644 core/src/main/resources/hudson/matrix/DefaultMatrixExecutionStrategyImpl/config_zh_TW.properties delete mode 100644 core/src/main/resources/hudson/matrix/DefaultMatrixExecutionStrategyImpl/help-hasTouchStoneCombinationFilter.html delete mode 100644 core/src/main/resources/hudson/matrix/DefaultMatrixExecutionStrategyImpl/help-hasTouchStoneCombinationFilter_de.html delete mode 100644 core/src/main/resources/hudson/matrix/DefaultMatrixExecutionStrategyImpl/help-hasTouchStoneCombinationFilter_ja.html delete mode 100644 core/src/main/resources/hudson/matrix/DefaultMatrixExecutionStrategyImpl/help-hasTouchStoneCombinationFilter_zh_TW.html delete mode 100644 core/src/main/resources/hudson/matrix/DefaultMatrixExecutionStrategyImpl/help-runSequentially.html delete mode 100644 core/src/main/resources/hudson/matrix/DefaultMatrixExecutionStrategyImpl/help-runSequentially_de.html delete mode 100644 core/src/main/resources/hudson/matrix/DefaultMatrixExecutionStrategyImpl/help-runSequentially_ja.html delete mode 100644 core/src/main/resources/hudson/matrix/DefaultMatrixExecutionStrategyImpl/help-runSequentially_zh_TW.html delete mode 100644 core/src/main/resources/hudson/matrix/JDKAxis/config.jelly delete mode 100644 core/src/main/resources/hudson/matrix/LabelAxis/config.jelly delete mode 100644 core/src/main/resources/hudson/matrix/LabelAxis/config_da.properties delete mode 100644 core/src/main/resources/hudson/matrix/LabelAxis/config_de.properties delete mode 100644 core/src/main/resources/hudson/matrix/LabelAxis/config_es.properties delete mode 100644 core/src/main/resources/hudson/matrix/LabelAxis/config_ja.properties delete mode 100644 core/src/main/resources/hudson/matrix/LabelAxis/config_pt.properties delete mode 100644 core/src/main/resources/hudson/matrix/LabelAxis/config_zh_TW.properties delete mode 100644 core/src/main/resources/hudson/matrix/LabelAxis/help-labels.html delete mode 100644 core/src/main/resources/hudson/matrix/LabelAxis/help-labels_de.html delete mode 100644 core/src/main/resources/hudson/matrix/LabelAxis/help-labels_fr.html delete mode 100644 core/src/main/resources/hudson/matrix/LabelAxis/help-labels_ja.html delete mode 100644 core/src/main/resources/hudson/matrix/LabelAxis/help-labels_nl.html delete mode 100644 core/src/main/resources/hudson/matrix/LabelAxis/help-labels_pt_BR.html delete mode 100644 core/src/main/resources/hudson/matrix/LabelAxis/help-labels_ru.html delete mode 100644 core/src/main/resources/hudson/matrix/LabelAxis/help-labels_tr.html delete mode 100644 core/src/main/resources/hudson/matrix/LabelAxis/help-labels_zh_TW.html delete mode 100644 core/src/main/resources/hudson/matrix/LabelAxis/help.html delete mode 100644 core/src/main/resources/hudson/matrix/LabelAxis/help_zh_TW.html delete mode 100644 core/src/main/resources/hudson/matrix/LabelExpAxis/config.jelly delete mode 100644 core/src/main/resources/hudson/matrix/LabelExpAxis/config_es.properties delete mode 100644 core/src/main/resources/hudson/matrix/LabelExpAxis/config_ja.properties delete mode 100644 core/src/main/resources/hudson/matrix/LabelExpAxis/config_pt.properties delete mode 100644 core/src/main/resources/hudson/matrix/LabelExpAxis/config_zh_TW.properties delete mode 100644 core/src/main/resources/hudson/matrix/LabelExpAxis/help-labelExpr.html delete mode 100644 core/src/main/resources/hudson/matrix/LabelExpAxis/help-labelExpr_ja.html delete mode 100644 core/src/main/resources/hudson/matrix/LabelExpAxis/help-labelExpr_zh_TW.html delete mode 100644 core/src/main/resources/hudson/matrix/LabelExpAxis/help.html delete mode 100644 core/src/main/resources/hudson/matrix/LabelExpAxis/help_ja.html delete mode 100644 core/src/main/resources/hudson/matrix/LabelExpAxis/help_zh_TW.html delete mode 100644 core/src/main/resources/hudson/matrix/MatrixBuild/ajaxMatrix.jelly delete mode 100644 core/src/main/resources/hudson/matrix/MatrixBuild/ajaxMatrix_da.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixBuild/ajaxMatrix_de.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixBuild/ajaxMatrix_es.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixBuild/ajaxMatrix_fr.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixBuild/ajaxMatrix_it.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixBuild/ajaxMatrix_ja.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixBuild/ajaxMatrix_nl.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixBuild/ajaxMatrix_pt.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixBuild/ajaxMatrix_pt_BR.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixBuild/ajaxMatrix_ru.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixBuild/ajaxMatrix_zh_TW.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixBuild/confirmDeleteAll.jelly delete mode 100644 core/src/main/resources/hudson/matrix/MatrixBuild/confirmDeleteAll.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixBuild/confirmDeleteAll_de.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixBuild/confirmDeleteAll_es.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixBuild/confirmDeleteAll_ja.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixBuild/confirmDeleteAll_pt.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixBuild/confirmDeleteAll_ru.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixBuild/confirmDeleteAll_zh_TW.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixBuild/delete.jelly delete mode 100644 core/src/main/resources/hudson/matrix/MatrixBuild/delete_ca.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixBuild/delete_cs.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixBuild/delete_de.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixBuild/delete_es.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixBuild/delete_ja.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixBuild/delete_ko.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixBuild/delete_pl.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixBuild/delete_pt.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixBuild/delete_pt_BR.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixBuild/delete_ru.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixBuild/delete_zh_CN.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixBuild/delete_zh_TW.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixBuild/main.jelly delete mode 100644 core/src/main/resources/hudson/matrix/MatrixConfigurationSorter/config.groovy delete mode 100644 core/src/main/resources/hudson/matrix/MatrixProject/ajaxMatrix.jelly delete mode 100644 core/src/main/resources/hudson/matrix/MatrixProject/ajaxMatrix_da.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixProject/ajaxMatrix_de.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixProject/ajaxMatrix_es.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixProject/ajaxMatrix_fi.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixProject/ajaxMatrix_fr.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixProject/ajaxMatrix_it.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixProject/ajaxMatrix_ja.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixProject/ajaxMatrix_pl.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixProject/ajaxMatrix_pt.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixProject/ajaxMatrix_pt_BR.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixProject/ajaxMatrix_ro.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixProject/ajaxMatrix_ru.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixProject/ajaxMatrix_sv_SE.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixProject/ajaxMatrix_zh_CN.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixProject/ajaxMatrix_zh_TW.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixProject/configure-entries.jelly delete mode 100644 core/src/main/resources/hudson/matrix/MatrixProject/configure-entries_da.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixProject/configure-entries_de.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixProject/configure-entries_es.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixProject/configure-entries_fr.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixProject/configure-entries_ja.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixProject/configure-entries_ko.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixProject/configure-entries_nl.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixProject/configure-entries_pt.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixProject/configure-entries_pt_BR.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixProject/configure-entries_ru.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixProject/configure-entries_sk.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixProject/configure-entries_sv_SE.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixProject/configure-entries_tr.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixProject/configure-entries_zh_TW.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixProject/help-childCustomWorkspace.html delete mode 100644 core/src/main/resources/hudson/matrix/MatrixProject/help-childCustomWorkspace_zh_TW.html delete mode 100644 core/src/main/resources/hudson/matrix/MatrixProject/help-slaveAffinity.html delete mode 100644 core/src/main/resources/hudson/matrix/MatrixProject/index.jelly delete mode 100644 core/src/main/resources/hudson/matrix/MatrixProject/index_ar.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixProject/index_cs.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixProject/index_da.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixProject/index_de.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixProject/index_es.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixProject/index_fi.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixProject/index_fr.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixProject/index_he.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixProject/index_hu.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixProject/index_it.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixProject/index_ja.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixProject/index_ko.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixProject/index_nl.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixProject/index_pl.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixProject/index_pt.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixProject/index_pt_BR.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixProject/index_ro.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixProject/index_ru.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixProject/index_sv_SE.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixProject/index_tr.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixProject/index_uk.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixProject/index_zh_CN.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixProject/index_zh_TW.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail.jelly delete mode 100644 core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_ar.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_da.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_de.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_es.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_et.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_fi.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_fr.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_hi_IN.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_it.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_ja.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_ko.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_nb_NO.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_nl.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_pl.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_pt.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_pt_BR.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_ru.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_sv_SE.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_tr.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_uk.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_zh_CN.properties delete mode 100644 core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_zh_TW.properties delete mode 100644 core/src/main/resources/hudson/matrix/Messages.properties delete mode 100644 core/src/main/resources/hudson/matrix/Messages_da.properties delete mode 100644 core/src/main/resources/hudson/matrix/Messages_de.properties delete mode 100644 core/src/main/resources/hudson/matrix/Messages_es.properties delete mode 100644 core/src/main/resources/hudson/matrix/Messages_fr.properties delete mode 100644 core/src/main/resources/hudson/matrix/Messages_ja.properties delete mode 100644 core/src/main/resources/hudson/matrix/Messages_nl.properties delete mode 100644 core/src/main/resources/hudson/matrix/Messages_pt.properties delete mode 100644 core/src/main/resources/hudson/matrix/Messages_pt_BR.properties delete mode 100644 core/src/main/resources/hudson/matrix/Messages_ru.properties delete mode 100644 core/src/main/resources/hudson/matrix/Messages_tr.properties delete mode 100644 core/src/main/resources/hudson/matrix/Messages_zh_CN.properties delete mode 100644 core/src/main/resources/hudson/matrix/Messages_zh_TW.properties delete mode 100644 core/src/main/resources/hudson/matrix/TextAxis/config.jelly delete mode 100644 core/src/main/resources/hudson/matrix/TextAxis/config_da.properties delete mode 100644 core/src/main/resources/hudson/matrix/TextAxis/config_de.properties delete mode 100644 core/src/main/resources/hudson/matrix/TextAxis/config_es.properties delete mode 100644 core/src/main/resources/hudson/matrix/TextAxis/config_ja.properties delete mode 100644 core/src/main/resources/hudson/matrix/TextAxis/config_pt.properties delete mode 100644 core/src/main/resources/hudson/matrix/TextAxis/config_zh_TW.properties delete mode 100644 core/src/main/resources/hudson/matrix/TextAxis/help-valueString.html delete mode 100644 core/src/main/resources/hudson/matrix/TextAxis/help-valueString_de.html delete mode 100644 core/src/main/resources/hudson/matrix/TextAxis/help-valueString_fr.html delete mode 100644 core/src/main/resources/hudson/matrix/TextAxis/help-valueString_ja.html delete mode 100644 core/src/main/resources/hudson/matrix/TextAxis/help-valueString_nl.html delete mode 100644 core/src/main/resources/hudson/matrix/TextAxis/help-valueString_pt_BR.html delete mode 100644 core/src/main/resources/hudson/matrix/TextAxis/help-valueString_ru.html delete mode 100644 core/src/main/resources/hudson/matrix/TextAxis/help-valueString_tr.html delete mode 100644 core/src/main/resources/hudson/matrix/TextAxis/help-valueString_zh_TW.html delete mode 100644 core/src/main/resources/lib/hudson/project/matrix.jelly delete mode 100644 core/src/main/resources/lib/hudson/project/matrix_ar.properties delete mode 100644 core/src/main/resources/lib/hudson/project/matrix_cs.properties delete mode 100644 core/src/main/resources/lib/hudson/project/matrix_da.properties delete mode 100644 core/src/main/resources/lib/hudson/project/matrix_de.properties delete mode 100644 core/src/main/resources/lib/hudson/project/matrix_es.properties delete mode 100644 core/src/main/resources/lib/hudson/project/matrix_fi.properties delete mode 100644 core/src/main/resources/lib/hudson/project/matrix_fr.properties delete mode 100644 core/src/main/resources/lib/hudson/project/matrix_he.properties delete mode 100644 core/src/main/resources/lib/hudson/project/matrix_it.properties delete mode 100644 core/src/main/resources/lib/hudson/project/matrix_ja.properties delete mode 100644 core/src/main/resources/lib/hudson/project/matrix_ko.properties delete mode 100644 core/src/main/resources/lib/hudson/project/matrix_nl.properties delete mode 100644 core/src/main/resources/lib/hudson/project/matrix_pl.properties delete mode 100644 core/src/main/resources/lib/hudson/project/matrix_pt_BR.properties delete mode 100644 core/src/main/resources/lib/hudson/project/matrix_pt_PT.properties delete mode 100644 core/src/main/resources/lib/hudson/project/matrix_ro.properties delete mode 100644 core/src/main/resources/lib/hudson/project/matrix_ru.properties delete mode 100644 core/src/main/resources/lib/hudson/project/matrix_sv_SE.properties delete mode 100644 core/src/main/resources/lib/hudson/project/matrix_tr.properties delete mode 100644 core/src/main/resources/lib/hudson/project/matrix_uk.properties delete mode 100644 core/src/main/resources/lib/hudson/project/matrix_zh_CN.properties delete mode 100644 core/src/main/resources/lib/hudson/project/matrix_zh_TW.properties delete mode 100644 core/src/test/java/hudson/matrix/CombinationFilterUsingBuildParamsTest.java delete mode 100644 core/src/test/java/hudson/matrix/CombinationTest.java delete mode 100644 test/src/test/groovy/hudson/matrix/MatrixProjectCustomWorkspaceTest.groovy delete mode 100644 test/src/test/groovy/hudson/matrix/MatrixProjectTest.groovy delete mode 100644 test/src/test/java/hudson/matrix/MatrixConfigurationSorterTest.java delete mode 100644 test/src/test/java/hudson/matrix/MatrixProjectDependencyTest.java delete mode 100644 test/src/test/java/hudson/matrix/MatrixTest.java delete mode 100644 test/src/test/resources/hudson/matrix/MatrixProjectTest/testUpgrade/config.xml delete mode 100644 test/src/test/resources/hudson/matrix/MatrixProjectTest/testUpgrade/jobs/x/config.xml delete mode 100644 test/src/test/resources/hudson/matrix/echo-property.pom delete mode 100644 war/src/main/webapp/help/matrix/axes.html delete mode 100644 war/src/main/webapp/help/matrix/axes_de.html delete mode 100644 war/src/main/webapp/help/matrix/axes_fr.html delete mode 100644 war/src/main/webapp/help/matrix/axes_ja.html delete mode 100644 war/src/main/webapp/help/matrix/axes_nl.html delete mode 100644 war/src/main/webapp/help/matrix/axes_pt_BR.html delete mode 100644 war/src/main/webapp/help/matrix/axes_ru.html delete mode 100644 war/src/main/webapp/help/matrix/axes_tr.html delete mode 100644 war/src/main/webapp/help/matrix/axes_zh_TW.html delete mode 100644 war/src/main/webapp/help/matrix/combinationfilter.html delete mode 100644 war/src/main/webapp/help/matrix/combinationfilter_de.html delete mode 100644 war/src/main/webapp/help/matrix/combinationfilter_fr.html delete mode 100644 war/src/main/webapp/help/matrix/combinationfilter_ja.html delete mode 100644 war/src/main/webapp/help/matrix/combinationfilter_zh_TW.html delete mode 100644 war/src/main/webapp/help/matrix/jdk.html delete mode 100644 war/src/main/webapp/help/matrix/jdk_de.html delete mode 100644 war/src/main/webapp/help/matrix/jdk_fr.html delete mode 100644 war/src/main/webapp/help/matrix/jdk_ja.html delete mode 100644 war/src/main/webapp/help/matrix/jdk_nl.html delete mode 100644 war/src/main/webapp/help/matrix/jdk_pt_BR.html delete mode 100644 war/src/main/webapp/help/matrix/jdk_ru.html delete mode 100644 war/src/main/webapp/help/matrix/jdk_tr.html delete mode 100644 war/src/main/webapp/help/matrix/jdk_zh_TW.html diff --git a/core/src/main/java/hudson/matrix/Axis.java b/core/src/main/java/hudson/matrix/Axis.java deleted file mode 100644 index faec4501e1..0000000000 --- a/core/src/main/java/hudson/matrix/Axis.java +++ /dev/null @@ -1,265 +0,0 @@ -/* - * The MIT License - * - * Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package hudson.matrix; - -import hudson.DescriptorExtensionList; -import hudson.ExtensionPoint; -import hudson.RestrictedSince; -import hudson.Util; -import hudson.matrix.MatrixBuild.MatrixBuildExecution; -import hudson.model.AbstractDescribableImpl; -import jenkins.model.Jenkins; -import hudson.util.QuotedStringTokenizer; -import org.kohsuke.accmod.Restricted; -import org.kohsuke.accmod.restrictions.NoExternalUse; -import org.kohsuke.stapler.StaplerRequest; -import org.kohsuke.stapler.DataBoundConstructor; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.Enumeration; -import java.util.Iterator; -import java.util.List; -import java.util.Arrays; -import java.util.Map; - -/** - * Configuration axis. - * - *

                      - * This class represents a single dimension of the configuration matrix. - * For example, the JAX-WS RI test configuration might include - * one axis "container={glassfish,tomcat,jetty}" and another axis - * "stax={sjsxp,woodstox}", and so on. - * - * @author Kohsuke Kawaguchi - */ -public class Axis extends AbstractDescribableImpl implements Comparable, Iterable, ExtensionPoint { - /** - * Name of this axis. - * Used as a variable name. - * - * @deprecated as of 1.373 - * Use {@link #getName()} - */ - public final String name; - - /** - * Possible values for this axis. - * - * @deprecated as of 1.373 - * Use {@link #getValues()} - */ - @Restricted(NoExternalUse.class) - @RestrictedSince("1.463") - public final List values; - - public Axis(String name, List values) { - if (values == null || values.isEmpty()) { - values = Collections.emptyList(); - } - this.name = name; - this.values = new ArrayList(values); - } - - public Axis(String name, String... values) { - this(name,Arrays.asList(values)); - } - - /** - * Used to build {@link Axis} from form. - * - * Axis with empty values need to be removed later. - */ - @DataBoundConstructor - public Axis(String name, String valueString) { - this.name = name; - this.values = new ArrayList(Arrays.asList(Util.tokenize(valueString))); - } - - /** - * Returns true if this axis is a system-reserved axis - * that has used to have af special treatment. - * - * @deprecated as of 1.373 - * System vs user difference are generalized into extension point. - */ - public boolean isSystem() { - return false; - } - - public Iterator iterator() { - return getValues().iterator(); - } - - public int size() { - return getValues().size(); - } - - public String value(int index) { - return getValues().get(index); - } - - /** - * The inverse of {@link #value(int)}. - */ - public int indexOf(String value) { - return values.indexOf(value); - } - - /** - * Axis is fully ordered so that we can convert between a list of axis - * and a string unambiguously. - */ - public int compareTo(Axis that) { - return this.name.compareTo(that.name); - } - - /** - * Name of this axis. - * Used as a variable name. - */ - public String getName() { - return name; - } - - /** - * Possible values for this axis. - */ - public List getValues() { - return Collections.unmodifiableList(values); - } - - /** - * Called right at the beginning of {@link MatrixBuild} execution to allow {@link Axis} to update {@link #values} - * based on the current build. - * - *

                      - * Historically, axes values are considered static. They were assumed to reflect what the user has typed in, - * and their values are changed only when the project is reconfigured. So abstractions are built around this - * notion, and so for example {@link MatrixProject} has the current axes and their values, which it uses - * to render its UI. - * - *

                      - * So when the need was identified to change the values of axes per build, we decided that this be represented - * as a kind of project configuration update (where a project gets reconfigured every time a build runs), and - * this call back was added to allow {@link Axis} to update the next return value from the {@link #getValues()} - * (which is typically done by updating {@link #values}.) - * - *

                      - * While it is not strictly required, because of these historical reasons, UI will look better if - * Future calls to {@link Axis#getValues()} return the same values as what this method returns (until - * the next rebuild call). - * - * @param context - * The ongoing build. Never null. - * @return - * Never null. Returns the updated set of values. - * @since 1.471 - */ - public List rebuild(MatrixBuildExecution context) { - return getValues(); - } - - @Override - public AxisDescriptor getDescriptor() { - return (AxisDescriptor)super.getDescriptor(); - } - - @Override - public String toString() { - return new StringBuilder().append(name).append("={").append(Util.join(values,",")).append('}').toString(); - } - - /** - * Used for generating the config UI. - * If the axis is big and occupies a lot of space, use newline for separator - * to display multi-line text. - */ - public String getValueString() { - int len=0; - for (String value : values) - len += value.length(); - char delim = len>30 ? '\n' : ' '; - // Build string connected with delimiter, quoting as needed - StringBuilder buf = new StringBuilder(len+values.size()*3); - for (String value : values) - buf.append(delim).append(QuotedStringTokenizer.quote(value,"")); - return buf.substring(1); - } - - /** - * Parses the submitted form (where possible values are - * presented as a list of checkboxes) and creates an axis - */ - public static Axis parsePrefixed(StaplerRequest req, String name) { - List values = new ArrayList(); - String prefix = name+'.'; - - Enumeration e = req.getParameterNames(); - while (e.hasMoreElements()) { - String paramName = (String) e.nextElement(); - if(paramName.startsWith(prefix)) - values.add(paramName.substring(prefix.length())); - } - if(values.isEmpty()) - return null; - return new Axis(name,values); - } - - /** - * Previously we used to persist {@link Axis}, but now those are divided into subtypes. - * So upon deserialization, resolve to the proper type. - */ - public Object readResolve() { - if (getClass()!=Axis.class) return this; - - /* - This method is necessary only because earlier versions of Jenkins treated - axis names "label" and "jdk" differently, - plus Axis was a concrete class, and we need to be able to read that back. - So this measure is not needed for newly added Axes. - */ - if (getName().equals("jdk")) - return new JDKAxis(getValues()); - if (getName().equals("label")) - return new LabelAxis(getName(),getValues()); - return new TextAxis(getName(),getValues()); - } - - /** - * Returns all the registered {@link AxisDescriptor}s. - */ - public static DescriptorExtensionList all() { - return Jenkins.getInstance().getDescriptorList(Axis.class); - } - - /** - * Converts the selected value (which is among {@link #values}) and adds that to the given map, - * which serves as the build variables. - */ - public void addBuildVariable(String value, Map map) { - map.put(name,value); - } -} diff --git a/core/src/main/java/hudson/matrix/AxisDescriptor.java b/core/src/main/java/hudson/matrix/AxisDescriptor.java deleted file mode 100644 index 7d93505e4e..0000000000 --- a/core/src/main/java/hudson/matrix/AxisDescriptor.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * The MIT License - * - * Copyright (c) 2010, InfraDNA, Inc. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package hudson.matrix; - -import hudson.Util; -import hudson.model.Descriptor; -import hudson.model.Failure; -import jenkins.model.Jenkins; -import hudson.util.FormValidation; -import org.kohsuke.stapler.QueryParameter; - -/** - * {@link Descriptor} for {@link Axis} - * - * @author Kohsuke Kawaguchi - */ -public abstract class AxisDescriptor extends Descriptor { - protected AxisDescriptor(Class clazz) { - super(clazz); - } - - protected AxisDescriptor() { - } - - /** - * Return false if the user shouldn't be able to create thie axis from the UI. - */ - public boolean isInstantiable() { - return true; - } - - /** - * Makes sure that the given name is good as a axis name. - */ - public FormValidation doCheckName(@QueryParameter String value) { - if(Util.fixEmpty(value)==null) - return FormValidation.ok(); - - try { - Jenkins.checkGoodName(value); - return FormValidation.ok(); - } catch (Failure e) { - return FormValidation.error(e.getMessage()); - } - } -} diff --git a/core/src/main/java/hudson/matrix/AxisList.java b/core/src/main/java/hudson/matrix/AxisList.java deleted file mode 100644 index a93a16746b..0000000000 --- a/core/src/main/java/hudson/matrix/AxisList.java +++ /dev/null @@ -1,108 +0,0 @@ -/* - * The MIT License - * - * Copyright (c) 2004-2010, Sun Microsystems, Inc., Kohsuke Kawaguchi - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package hudson.matrix; - -import com.google.common.base.Function; -import com.google.common.collect.Iterables; -import com.google.common.collect.Lists; -import com.google.common.collect.Sets; -import com.thoughtworks.xstream.XStream; -import hudson.Util; -import hudson.util.RobustCollectionConverter; - -import javax.annotation.Nullable; -import java.util.*; - -/** - * List of {@link Axis}. - * - * @author Kohsuke Kawaguchi - */ -public class AxisList extends ArrayList { - public AxisList() { - } - - public AxisList(Collection c) { - super(c); - } - - public AxisList(Axis... c) { - this(Arrays.asList(c)); - } - - public Axis find(String name) { - for (Axis a : this) { - if(a.name.equals(name)) - return a; - } - return null; - } - - /** - * Creates a subset of the list that only contains the type assignable to the specified type. - */ - public AxisList subList(Class subType) { - return new AxisList(Util.filter(this,subType)); - } - - @Override - public boolean add(Axis axis) { - return axis!=null && super.add(axis); - } - - /** - * List up all the possible combinations of this list. - */ - public Iterable list() { - List> axesList = Lists.newArrayList(); - for (Axis axis : this) - axesList.add(new LinkedHashSet(axis.getValues())); - - return Iterables.transform(Sets.cartesianProduct(axesList), new Function, Combination>() { - public Combination apply(@Nullable List strings) { - assert strings != null; - return new Combination(AxisList.this, (String[]) strings.toArray(new String[0])); - } - }); - } - - /** - * {@link com.thoughtworks.xstream.converters.Converter} implementation for XStream. - */ - public static final class ConverterImpl extends RobustCollectionConverter { - public ConverterImpl(XStream xs) { - super(xs); - } - - @Override - public boolean canConvert(Class type) { - return type==AxisList.class; - } - - @Override - protected Object createCollection(Class type) { - return new AxisList(); - } - } -} diff --git a/core/src/main/java/hudson/matrix/Combination.java b/core/src/main/java/hudson/matrix/Combination.java deleted file mode 100644 index 9ce0a4dd62..0000000000 --- a/core/src/main/java/hudson/matrix/Combination.java +++ /dev/null @@ -1,265 +0,0 @@ -/* - * The MIT License - * - * Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package hudson.matrix; - -import groovy.lang.Binding; -import hudson.Util; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.StringTokenizer; -import java.util.TreeMap; - -/** - * A particular combination of {@link Axis} values. - * - * For example, when axes are "x={1,2},y={3,4}", then - * [x=1,y=3] is a combination (out of 4 possible combinations) - * - * @author Kohsuke Kawaguchi - */ -public final class Combination extends TreeMap implements Comparable { - - public Combination(AxisList axisList, List values) { - for(int i=0; i keyValuePairs) { - for (Map.Entry e : keyValuePairs.entrySet()) - super.put(e.getKey(),e.getValue()); - } - - public String get(Axis a) { - return get(a.getName()); - } - - /** - * Obtains the continuous unique index number of this {@link Combination} - * in the given {@link AxisList}. - */ - public int toIndex(AxisList axis) { - int r = 0; - for (Axis a : axis) { - r *= a.size(); - r += a.indexOf(get(a)); - } - return r; - } - - /** - * Evaluates the given Groovy expression with values bound from this combination. - * - *

                      - * For example, if this combination is a=X,b=Y, then expressions like a=="X" would evaluate to - * true. - */ - public boolean evalGroovyExpression(AxisList axes, String expression) { - return evalGroovyExpression(axes, expression, new Binding()); - } - - /** - * @see #evalGroovyExpression(AxisList, String) - * @since 1.515 - * @deprecated as of 1.528 - * Use {@link FilterScript#apply(hudson.matrix.MatrixBuild.MatrixBuildExecution, Combination)} - */ - public boolean evalGroovyExpression(AxisList axes, String expression, Binding binding) { - return FilterScript.parse(expression).apply(axes, this, binding); - } - - public int compareTo(Combination that) { - int d = this.size()-that.size(); - if(d!=0) return d; - - Iterator> itr = this.entrySet().iterator(); - Iterator> jtr = that.entrySet().iterator(); - while(itr.hasNext()) { - Map.Entry i = itr.next(); - Map.Entry j = jtr.next(); - - d = i.getKey().compareTo(j.getKey()); - if(d!=0) return d; - d = i.getValue().compareTo(j.getValue()); - if(d!=0) return d; - } - return 0; - } - - /** - * Works like {@link #toString()} but only include the given axes. - */ - public String toString(Collection subset) { - if(size()==1 && subset.size()==1) - return values().iterator().next(); - - StringBuilder buf = new StringBuilder(); - for (Axis a : subset) { - if(buf.length()>0) buf.append(','); - buf.append(a.getName()).append('=').append(get(a)); - } - if(buf.length()==0) buf.append("default"); // special case to avoid 0-length name. - return buf.toString(); - } - - /** - * Gets the values that correspond to the specified axes, in their order. - */ - public List values(Collection axes) { - List r = new ArrayList(axes.size()); - for (Axis a : axes) - r.add(get(a)); - return r; - } - - /** - * Converts to the ID string representation: - * axisName=value,axisName=value,... - * - * @param sep1 - * The separator between multiple axes. - * @param sep2 - * The separator between axis name and value. - */ - public String toString(char sep1, char sep2) { - StringBuilder buf = new StringBuilder(); - for (Map.Entry e : entrySet()) { - if(buf.length()>0) buf.append(sep1); - buf.append(e.getKey()).append(sep2).append(e.getValue()); - } - if(buf.length()==0) buf.append("default"); // special case to avoid 0-length name. - return buf.toString(); - } - - @Override - public String toString() { - return toString(',','='); - } - - /** - * Gets the 8 character-wide hash code for this combination - */ - public String digest() { - return Util.getDigestOf(toString()); - } - - /** - * Reverse operation of {@link #toString()}. - */ - public static Combination fromString(String id) { - if(id.equals("default")) - return new Combination(Collections.emptyMap()); - - Map m = new HashMap(); - StringTokenizer tokens = new StringTokenizer(id, ","); - while(tokens.hasMoreTokens()) { - String token = tokens.nextToken(); - int idx = token.indexOf('='); - if(idx<0) - throw new IllegalArgumentException("Can't parse "+id); - m.put(token.substring(0,idx),token.substring(idx+1)); - } - return new Combination(m); - } - - /** - * Creates compact string representation suitable for display purpose. - * - *

                      - * The string is made compact by looking for {@link Axis} whose values - * are unique, and omit the axis name. - */ - public String toCompactString(AxisList axes) { - Set nonUniqueAxes = new HashSet(); - Map axisByValue = new HashMap(); - - for (Axis a : axes) { - for (String v : a.getValues()) { - Axis old = axisByValue.put(v,a); - if(old!=null) { - // these two axes have colliding values - nonUniqueAxes.add(old.getName()); - nonUniqueAxes.add(a.getName()); - } - } - } - - StringBuilder buf = new StringBuilder(); - for (Map.Entry e : entrySet()) { - if(buf.length()>0) buf.append(','); - if(nonUniqueAxes.contains(e.getKey())) - buf.append(e.getKey()).append('='); - buf.append(e.getValue()); - } - if(buf.length()==0) buf.append("default"); // special case to avoid 0-length name. - return buf.toString(); - } - - // read-only - @Override - public void clear() { - throw new UnsupportedOperationException(); - } - - @Override - public void putAll(Map map) { - throw new UnsupportedOperationException(); - } - - @Override - public String put(String key, String value) { - throw new UnsupportedOperationException(); - } - - @Override - public String remove(Object key) { - throw new UnsupportedOperationException(); - } - - /** - * Duck-typing for boolean expressions. - * - * @see Combination#evalGroovyExpression(AxisList,String) - */ - public static final class BooleanCategory { - /** - * x -> y - */ - public static Boolean implies(Boolean lhs, Boolean rhs) { - return !lhs || rhs; - } - } -} diff --git a/core/src/main/java/hudson/matrix/DefaultAxisDescriptor.java b/core/src/main/java/hudson/matrix/DefaultAxisDescriptor.java deleted file mode 100644 index 96fb461499..0000000000 --- a/core/src/main/java/hudson/matrix/DefaultAxisDescriptor.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * The MIT License - * - * Copyright (c) 2010, InfraDNA, Inc. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package hudson.matrix; - -import hudson.Extension; - -/** - * {@link AxisDescriptor} for manually entered default axis. - * - * @author Kohsuke Kawaguchi - */ -@Extension -public class DefaultAxisDescriptor extends AxisDescriptor { - public DefaultAxisDescriptor() { - super(Axis.class); - } - - @Override - public String getDisplayName() { - return "Axis"; - } - - @Override - public boolean isInstantiable() { - return false; - } -} diff --git a/core/src/main/java/hudson/matrix/DefaultMatrixExecutionStrategyImpl.java b/core/src/main/java/hudson/matrix/DefaultMatrixExecutionStrategyImpl.java deleted file mode 100644 index c874a35963..0000000000 --- a/core/src/main/java/hudson/matrix/DefaultMatrixExecutionStrategyImpl.java +++ /dev/null @@ -1,300 +0,0 @@ -package hudson.matrix; - -import groovy.lang.GroovyRuntimeException; -import hudson.AbortException; -import hudson.Extension; -import hudson.console.ModelHyperlinkNote; -import hudson.matrix.MatrixBuild.MatrixBuildExecution; -import hudson.matrix.listeners.MatrixBuildListener; -import hudson.model.BuildListener; -import hudson.model.Cause.UpstreamCause; -import hudson.model.Queue; -import hudson.model.ResourceController; -import hudson.model.Result; -import hudson.model.Run; -import org.kohsuke.stapler.DataBoundConstructor; - -import javax.annotation.Nullable; -import java.io.IOException; -import java.io.PrintStream; -import java.util.Collection; -import java.util.Comparator; -import java.util.HashSet; -import java.util.List; -import java.util.TreeSet; - -/** - * {@link MatrixExecutionStrategy} that captures historical behavior. - * - *

                      - * This class is somewhat complex because historically this wasn't an extension point and so - * people tried to put various logics that cover different use cases into one place. - * Going forward, people are encouraged to create subtypes to implement a custom logic that suits their needs. - * - * @author Kohsuke Kawaguchi - * @since 1.456 - */ -public class DefaultMatrixExecutionStrategyImpl extends MatrixExecutionStrategy { - private volatile boolean runSequentially; - - /** - * Filter to select a number of combinations to build first - */ - private volatile String touchStoneCombinationFilter; - - /** - * Required result on the touchstone combinations, in order to - * continue with the rest - */ - private volatile Result touchStoneResultCondition; - - private volatile MatrixConfigurationSorter sorter; - - @DataBoundConstructor - public DefaultMatrixExecutionStrategyImpl(Boolean runSequentially, boolean hasTouchStoneCombinationFilter, String touchStoneCombinationFilter, Result touchStoneResultCondition, MatrixConfigurationSorter sorter) { - this(runSequentially!=null ? runSequentially : false, - hasTouchStoneCombinationFilter ? touchStoneCombinationFilter : null, - hasTouchStoneCombinationFilter ? touchStoneResultCondition : null, - sorter); - } - - public DefaultMatrixExecutionStrategyImpl(boolean runSequentially, String touchStoneCombinationFilter, Result touchStoneResultCondition, MatrixConfigurationSorter sorter) { - this.runSequentially = runSequentially; - this.touchStoneCombinationFilter = touchStoneCombinationFilter; - this.touchStoneResultCondition = touchStoneResultCondition; - this.sorter = sorter; - } - - public DefaultMatrixExecutionStrategyImpl() { - this(false,false,null,null,null); - } - - public boolean getHasTouchStoneCombinationFilter() { - return touchStoneCombinationFilter!=null; - } - - /** - * If true, {@link MatrixRun}s are run sequentially, instead of running in parallel. - * - * TODO: this should be subsumed by {@link ResourceController}. - */ - public boolean isRunSequentially() { - return runSequentially; - } - - public void setRunSequentially(boolean runSequentially) { - this.runSequentially = runSequentially; - } - - public String getTouchStoneCombinationFilter() { - return touchStoneCombinationFilter; - } - - public void setTouchStoneCombinationFilter(String touchStoneCombinationFilter) { - this.touchStoneCombinationFilter = touchStoneCombinationFilter; - } - - public Result getTouchStoneResultCondition() { - return touchStoneResultCondition; - } - - public void setTouchStoneResultCondition(Result touchStoneResultCondition) { - this.touchStoneResultCondition = touchStoneResultCondition; - } - - public MatrixConfigurationSorter getSorter() { - return sorter; - } - - public void setSorter(MatrixConfigurationSorter sorter) { - this.sorter = sorter; - } - - @Override - public Result run(MatrixBuildExecution execution) throws InterruptedException, IOException { - - Collection touchStoneConfigurations = new HashSet(); - Collection delayedConfigurations = new HashSet(); - - filterConfigurations( - execution, - touchStoneConfigurations, - delayedConfigurations - ); - - if (notifyStartBuild(execution.getAggregators())) return Result.FAILURE; - - if (sorter != null) { - touchStoneConfigurations = createTreeSet(touchStoneConfigurations, sorter); - delayedConfigurations = createTreeSet(delayedConfigurations, sorter); - } - - if(!runSequentially) - for(MatrixConfiguration c : touchStoneConfigurations) - scheduleConfigurationBuild(execution, c); - - Result r = Result.SUCCESS; - for (MatrixConfiguration c : touchStoneConfigurations) { - if(runSequentially) - scheduleConfigurationBuild(execution, c); - MatrixRun run = waitForCompletion(execution, c); - notifyEndBuild(run,execution.getAggregators()); - r = r.combine(getResult(run)); - } - - PrintStream logger = execution.getListener().getLogger(); - - if (touchStoneResultCondition != null && r.isWorseThan(touchStoneResultCondition)) { - logger.printf("Touchstone configurations resulted in %s, so aborting...%n", r); - return r; - } - - if(!runSequentially) - for(MatrixConfiguration c : delayedConfigurations) - scheduleConfigurationBuild(execution, c); - - for (MatrixConfiguration c : delayedConfigurations) { - if(runSequentially) - scheduleConfigurationBuild(execution, c); - MatrixRun run = waitForCompletion(execution, c); - notifyEndBuild(run,execution.getAggregators()); - logger.println(Messages.MatrixBuild_Completed(ModelHyperlinkNote.encodeTo(c), getResult(run))); - r = r.combine(getResult(run)); - } - - return r; - } - - private void filterConfigurations( - final MatrixBuildExecution execution, - final Collection touchStoneConfigurations, - final Collection delayedConfigurations - ) throws AbortException { - - final MatrixBuild build = execution.getBuild(); - - final FilterScript combinationFilter = FilterScript.parse(execution.getProject().getCombinationFilter(), FilterScript.ACCEPT_ALL); - final FilterScript touchStoneFilter = FilterScript.parse(getTouchStoneCombinationFilter(), FilterScript.REJECT_ALL); - - try { - - for (MatrixConfiguration c: execution.getActiveConfigurations()) { - - if (!MatrixBuildListener.buildConfiguration(build, c)) continue; // skip rebuild - - final Combination combination = c.getCombination(); - - if (touchStoneFilter != null && touchStoneFilter.apply(execution, combination)) { - touchStoneConfigurations.add(c); - } else if (combinationFilter.apply(execution, combination)) { - delayedConfigurations.add(c); - } - } - } catch (GroovyRuntimeException ex) { - - PrintStream logger = execution.getListener().getLogger(); - logger.println(ex.getMessage()); - ex.printStackTrace(logger); - throw new AbortException("Failed executing combination filter"); - } - } - - private Result getResult(@Nullable MatrixRun run) { - // null indicates that the run was cancelled before it even gets going - return run!=null ? run.getResult() : Result.ABORTED; - } - - private boolean notifyStartBuild(List aggregators) throws InterruptedException, IOException { - for (MatrixAggregator a : aggregators) - if(!a.startBuild()) - return true; - return false; - } - - private void notifyEndBuild(MatrixRun b, List aggregators) throws InterruptedException, IOException { - if (b==null) return; // can happen if the configuration run gets cancelled before it gets started. - for (MatrixAggregator a : aggregators) - if(!a.endRun(b)) - throw new AbortException(); - } - - private TreeSet createTreeSet(Collection items, Comparator sorter) { - TreeSet r = new TreeSet(sorter); - r.addAll(items); - return r; - } - - /** Function to start schedule a single configuration - * - * This function schedule a build of a configuration passing all of the Matrixchild actions - * that are present in the parent build. - * - * @param exec Matrix build that is the parent of the configuration - * @param c Configuration to schedule - */ - private void scheduleConfigurationBuild(MatrixBuildExecution exec, MatrixConfiguration c) { - MatrixBuild build = exec.getBuild(); - exec.getListener().getLogger().println(Messages.MatrixBuild_Triggering(ModelHyperlinkNote.encodeTo(c))); - - // filter the parent actions for those that can be passed to the individual jobs. - List childActions = build.getActions(MatrixChildAction.class); - c.scheduleBuild(childActions, new UpstreamCause((Run)build)); - } - - private MatrixRun waitForCompletion(MatrixBuildExecution exec, MatrixConfiguration c) throws InterruptedException, IOException { - BuildListener listener = exec.getListener(); - String whyInQueue = ""; - long startTime = System.currentTimeMillis(); - - // wait for the completion - int appearsCancelledCount = 0; - while(true) { - MatrixRun b = c.getBuildByNumber(exec.getBuild().getNumber()); - - // two ways to get beyond this. one is that the build starts and gets done, - // or the build gets cancelled before it even started. - if(b!=null && !b.isBuilding()) { - Result buildResult = b.getResult(); - if(buildResult!=null) - return b; - } - Queue.Item qi = c.getQueueItem(); - if(b==null && qi==null) - appearsCancelledCount++; - else - appearsCancelledCount = 0; - - if(appearsCancelledCount>=5) { - // there's conceivably a race condition in computating b and qi, as their computation - // are not synchronized. There are indeed several reports of Hudson incorrectly assuming - // builds being cancelled. See - // http://www.nabble.com/Master-slave-problem-tt14710987.html and also - // http://www.nabble.com/Anyone-using-AccuRev-plugin--tt21634577.html#a21671389 - // because of this, we really make sure that the build is cancelled by doing this 5 - // times over 5 seconds - listener.getLogger().println(Messages.MatrixBuild_AppearsCancelled(ModelHyperlinkNote.encodeTo(c))); - return null; - } - - if(qi!=null) { - // if the build seems to be stuck in the queue, display why - String why = qi.getWhy(); - if(why != null && !why.equals(whyInQueue) && System.currentTimeMillis()-startTime>5000) { - listener.getLogger().print("Configuration " + ModelHyperlinkNote.encodeTo(c)+" is still in the queue: "); - qi.getCauseOfBlockage().print(listener); //this is still shown on the same line - whyInQueue = why; - } - } - - Thread.sleep(1000); - } - } - - @Extension - public static class DescriptorImpl extends MatrixExecutionStrategyDescriptor { - @Override - public String getDisplayName() { - return "Classic"; - } - } -} diff --git a/core/src/main/java/hudson/matrix/FilterScript.java b/core/src/main/java/hudson/matrix/FilterScript.java deleted file mode 100644 index 875a06ddd7..0000000000 --- a/core/src/main/java/hudson/matrix/FilterScript.java +++ /dev/null @@ -1,136 +0,0 @@ -package hudson.matrix; - -import groovy.lang.Binding; -import groovy.lang.GroovyShell; -import groovy.lang.Script; -import hudson.Util; -import hudson.matrix.Combination.BooleanCategory; -import hudson.matrix.MatrixBuild.MatrixBuildExecution; -import hudson.model.ParameterValue; -import hudson.model.ParametersAction; - -import java.util.Map; - -import static java.lang.Boolean.*; - -/** - * Groovy filter script that accepts or rejects matrix {@link Combination}. - * - * Instances of this class is thread unsafe. - * - * @author Kohsuke Kawaguchi - */ -class FilterScript { - private final Script script; - - FilterScript(Script script) { - this.script = script; - } - - /** - * @param context - * Variables the script will see. - */ - boolean evaluate(Binding context) { - script.setBinding(context); - return TRUE.equals(script.run()); - } - - /** - * Obtains a number N such that "N%M==0" would create - * a reasonable sparse matrix for integer M. - * - *

                      - * This is bit like {@link Combination#toIndex(AxisList)}, but instead - * of creating a continuous number (which often maps different - * values of the same axis to the same index in modulo N residue ring, - * we use a prime number P as the base. I think this guarantees the uniform - * distribution in any N smaller than 2P (but proof, anyone?) - */ - private long toModuloIndex(AxisList axis, Combination c) { - long r = 0; - for (Axis a : axis) { - r += a.indexOf(c.get(a)); - r *= 31; - } - return r; - } - - /** - * Applies the filter to the specified combination in the context of {@code context}. - */ - public boolean apply(MatrixBuildExecution context, Combination combination) { - return apply(context.getProject().getAxes(), combination, getConfiguredBinding(context)); - } - - /*package*/ boolean apply(AxisList axes, Combination c, Binding binding) { - for (Map.Entry e : c.entrySet()) - binding.setVariable(e.getKey(),e.getValue()); - - binding.setVariable("index",toModuloIndex(axes,c)); - binding.setVariable("uniqueId", c.toIndex(axes)); - - return evaluate(binding); - } - - private Binding getConfiguredBinding(final MatrixBuildExecution execution) { - final Binding binding = new Binding(); - final ParametersAction parameters = execution.getBuild().getAction(ParametersAction.class); - - if (parameters == null) return binding; - - for (final ParameterValue pv: parameters) { - if (pv == null) continue; - final String name = pv.getName(); - final String value = pv.createVariableResolver(null).resolve(name); - binding.setVariable(name, value); - } - - return binding; - } - - public static FilterScript parse(String expression) { - return parse(expression, ACCEPT_ALL); - } - - /** - * @since 1.541 - */ - public static FilterScript parse(String expression, FilterScript defaultScript) { - if (Util.fixEmptyAndTrim(expression)==null) - return defaultScript; - - GroovyShell shell = new GroovyShell(); - - return new FilterScript(shell.parse("use("+BooleanCategory.class.getName().replace('$','.')+") {"+expression+"}")); - } - - private static final Script EMPTY = new Script() { - @Override - public Object run() { - return true; - } - }; - - /** - * Constant that always applies to any combination. - * @since 1.541 - */ - /*package*/ static final FilterScript ACCEPT_ALL = new FilterScript(EMPTY) { - @Override - public boolean apply(MatrixBuildExecution context, Combination combination) { - return true; - } - }; - - /** - * Constant that does not apply to any combination. - * @since 1.541 - */ - /*package*/ static final FilterScript REJECT_ALL = new FilterScript(EMPTY) { - @Override - public boolean apply(MatrixBuildExecution context, Combination combination) { - return false; - } - }; -} diff --git a/core/src/main/java/hudson/matrix/JDKAxis.java b/core/src/main/java/hudson/matrix/JDKAxis.java deleted file mode 100644 index fecd908dee..0000000000 --- a/core/src/main/java/hudson/matrix/JDKAxis.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * The MIT License - * - * Copyright (c) 2010, InfraDNA, Inc. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package hudson.matrix; - -import hudson.Extension; -import jenkins.model.Jenkins; -import org.kohsuke.stapler.DataBoundConstructor; - -import java.util.Arrays; -import java.util.List; - -/** - * {@link Axis} that selects available JDKs. - * - * @author Kohsuke Kawaguchi - */ -public class JDKAxis extends Axis { - /** - * JDK axis was used to be stored as a plain "Axis" with the name "jdk", - * so it cannot be configured by any other name. - */ - public JDKAxis(List values) { - super("jdk", values); - } - - @DataBoundConstructor - public JDKAxis(String[] values) { - super("jdk", Arrays.asList(values)); - } - - @Override - public boolean isSystem() { - return true; - } - - @Extension - public static class DescriptorImpl extends AxisDescriptor { - @Override - public String getDisplayName() { - return Messages.JDKAxis_DisplayName(); - } - - /** - * If there's no JDK configured, there's no point in this axis. - */ - @Override - public boolean isInstantiable() { - return !Jenkins.getInstance().getJDKs().isEmpty(); - } - } -} diff --git a/core/src/main/java/hudson/matrix/LabelAxis.java b/core/src/main/java/hudson/matrix/LabelAxis.java deleted file mode 100644 index bd32df0037..0000000000 --- a/core/src/main/java/hudson/matrix/LabelAxis.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * The MIT License - * - * Copyright (c) 2010, InfraDNA, Inc. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package hudson.matrix; - -import hudson.Extension; -import hudson.Functions; -import hudson.Util; -import jenkins.model.Jenkins; -import hudson.model.labels.LabelAtom; -import org.kohsuke.stapler.DataBoundConstructor; - -import java.util.List; - -/** - * {@link Axis} that selects label expressions. - * - * @author Kohsuke Kawaguchi - */ -public class LabelAxis extends Axis { - @DataBoundConstructor - public LabelAxis(String name, List values) { - super(name, values); - } - - @Override - public boolean isSystem() { - return true; - } - - @Override - public String getValueString() { - return Util.join(getValues(),"/"); - } - - @Extension - public static class DescriptorImpl extends AxisDescriptor { - @Override - public String getDisplayName() { - return Messages.LabelAxis_DisplayName(); - } - - /** - * If there's no distributed build set up, it's pointless to provide this axis. - */ - @Override - public boolean isInstantiable() { - Jenkins h = Jenkins.getInstance(); - return !h.getNodes().isEmpty() || !h.clouds.isEmpty(); - } - - private String jsstr(String body, Object... args) { - return '\"'+Functions.jsStringEscape(String.format(body,args))+'\"'; - } - - public String buildLabelCheckBox(LabelAtom la, LabelAxis instance) { - return jsstr("", - la.getName(),la.getDescription()); - // '${h.jsStringEscape('')}' - } - } -} diff --git a/core/src/main/java/hudson/matrix/LabelExpAxis.java b/core/src/main/java/hudson/matrix/LabelExpAxis.java deleted file mode 100644 index 281438d838..0000000000 --- a/core/src/main/java/hudson/matrix/LabelExpAxis.java +++ /dev/null @@ -1,97 +0,0 @@ -/* - * The MIT License - * - * Copyright (c) 2010, InfraDNA, Inc. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package hudson.matrix; - -import hudson.Extension; -import hudson.Util; -import jenkins.model.Jenkins; - -import java.util.LinkedList; -import java.util.List; - -import org.kohsuke.stapler.DataBoundConstructor; - -/** - * {@link Axis} that selects label expressions. - * - * @since 1.403 - */ -public class LabelExpAxis extends Axis { - - @DataBoundConstructor - public LabelExpAxis(String name, String values) { - super(name, getExprValues(values)); - } - - public LabelExpAxis(String name, List values) { - super(name, values); - } - - @Override - public boolean isSystem() { - return true; - } - - @Override - public DescriptorImpl getDescriptor() { - return (DescriptorImpl) Jenkins.getInstance().getDescriptorOrDie(getClass()); - } - - public String getValuesString(){ - StringBuffer sb = new StringBuffer(); - for(String item: this.getValues()){ - sb.append(item); - sb.append("\n"); - } - return sb.toString(); - } - - @Extension - public static class DescriptorImpl extends AxisDescriptor { - @Override - public String getDisplayName() { - return Messages.LabelExpAxis_DisplayName(); - } - - /** - * If there's no distributed build set up, it's pointless to provide this axis. - */ - @Override - public boolean isInstantiable() { - Jenkins h = Jenkins.getInstance(); - return !h.getNodes().isEmpty() || !h.clouds.isEmpty(); - } - } - - public static List getExprValues(String valuesString){ - List expressions = new LinkedList(); - String[] exprs = valuesString.split("\n"); - for(String expr: exprs){ - expressions.add(Util.fixEmptyAndTrim(expr)); - } - return expressions; - } - -} - diff --git a/core/src/main/java/hudson/matrix/Layouter.java b/core/src/main/java/hudson/matrix/Layouter.java deleted file mode 100644 index 051b8f6239..0000000000 --- a/core/src/main/java/hudson/matrix/Layouter.java +++ /dev/null @@ -1,225 +0,0 @@ -/* - * The MIT License - * - * Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package hudson.matrix; - -import java.util.List; -import java.util.ArrayList; -import java.util.AbstractList; -import java.util.Map; -import java.util.HashMap; - -/** - * Used to assist thegeneration of config table. - * - *

                      - * {@link Axis Axes} are split into four groups. - * {@link #x Ones that are displayed as columns}, - * {@link #y Ones that are displayed as rows}, - * {@link #z Ones that are listed as bullet items inside table cell}, - * and those which only have one value, and therefore doesn't show up - * in the table. - * - *

                      - * Because of object reuse inside {@link Layouter}, this class is not thread-safe. - * - * @author Kohsuke Kawaguchi - */ -public abstract class Layouter { - public final List x,y,z; - /** - * Axes that only have one value. - */ - private final List trivial = new ArrayList(); - /** - * Number of data columns and rows. - */ - private int xSize, ySize, zSize; - - - public Layouter(List x, List y, List z) { - this.x = x; - this.y = y; - this.z = z; - init(); - } - - /** - * Automatically split axes to x,y, and z. - */ - public Layouter(AxisList axisList) { - x = new ArrayList(); - y = new ArrayList(); - z = new ArrayList(); - - List nonTrivialAxes = new ArrayList(); - for (Axis a : axisList) { - if(a.size()>1) - nonTrivialAxes.add(a); - else - trivial.add(a); - } - - switch(nonTrivialAxes.size()) { - case 0: - break; - case 1: - z.add(nonTrivialAxes.get(0)); - break; - case 2: - // use the longer axis in Y - Axis a = nonTrivialAxes.get(0); - Axis b = nonTrivialAxes.get(1); - x.add(a.size() > b.size() ? b : a); - y.add(a.size() > b.size() ? a : b); - break; - default: - // for size > 3, use x and y, and try to pack y more - for( int i=0; i=0; n-- ) - w *= x.get(n).size(); - return w; - } - - /** - * Computes the width of n-th Y-axis. - */ - public int height(int n) { - return calc(y,n); - } - - private int calc(List l, int n) { - int w = 1; - for( n++ ; n getRows() { - return new AbstractList() { - final Row row = new Row(); - public Row get(int index) { - row.index = index; - return row; - } - - public int size() { - return ySize; - } - }; - } - - /** - * Represents a row, which is a collection of {@link Column}s. - */ - public final class Row extends AbstractList { - private int index; - final Column col = new Column(); - - @Override - public Column get(int index) { - col.xp = index; - col.yp = Row.this.index; - return col; - } - - @Override - public int size() { - return xSize; - } - - public String drawYHeader(int n) { - int base = calc(y,n); - if(index/base==(index-1)/base && index!=0) return null; // no need to draw a new value - - Axis axis = y.get(n); - return axis.value((index/base)%axis.getValues().size()); - } - } - - protected abstract T getT(Combination c); - - public final class Column extends AbstractList { - /** - * Cell position. - */ - private int xp,yp; - - private final Map m = new HashMap(); - - public T get(int zp) { - m.clear(); - buildMap(xp,x); - buildMap(yp,y); - buildMap(zp,z); - for (Axis a : trivial) { - if (a.size() > 0) { - m.put(a.name, a.value(0)); - } - } - return getT(new Combination(m)); - } - - private void buildMap(int p, List axes) { - int n = p; - for( int i= axes.size()-1; i>=0; i-- ) { - Axis a = axes.get(i); - m.put(a.name, a.value(n%a.size())); - n /= a.size(); - } - } - - public int size() { - return zSize; - } - } -} diff --git a/core/src/main/java/hudson/matrix/LinkedLogRotator.java b/core/src/main/java/hudson/matrix/LinkedLogRotator.java deleted file mode 100644 index c46870318e..0000000000 --- a/core/src/main/java/hudson/matrix/LinkedLogRotator.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * The MIT License - * - * Copyright (c) 2004-2010, Sun Microsystems, Inc., Kohsuke Kawaguchi - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package hudson.matrix; - -import hudson.model.Job; -import hudson.tasks.LogRotator; - -import java.io.IOException; -import java.util.logging.Logger; - -/** - * {@link LogRotator} for {@link MatrixConfiguration}, - * which discards the builds if and only if it's discarded - * in the parent. - * - *

                      - * Because of the serialization compatibility, we can't easily - * refactor {@link LogRotator} into a contract and an implementation. - * - * @author Kohsuke Kawaguchi - */ -final class LinkedLogRotator extends LogRotator { - LinkedLogRotator(int artifactDaysToKeep, int artifactNumToKeep) { - super(-1, -1, artifactDaysToKeep, artifactNumToKeep); - } - - /** - * @deprecated since 1.369 - * Use {@link #LinkedLogRotator(int, int)} - */ - LinkedLogRotator() { - super(-1, -1, -1, -1); - } - - @Override - public void perform(Job _job) throws IOException, InterruptedException { - // Let superclass handle clearing artifacts, if configured: - super.perform(_job); - MatrixConfiguration job = (MatrixConfiguration) _job; - - // copy it to the array because we'll be deleting builds as we go. - for( MatrixRun r : job.getBuilds().toArray(new MatrixRun[0]) ) { - if(job.getParent().getBuildByNumber(r.getNumber())==null) { - LOGGER.fine("Deleting "+r.getFullDisplayName()); - r.delete(); - } - } - - if(!job.isActiveConfiguration() && job.getLastBuild()==null) { - LOGGER.fine("Deleting "+job.getFullDisplayName()+" because the configuration is inactive and there's no builds"); - job.delete(); - } - } - - private static final Logger LOGGER = Logger.getLogger(LinkedLogRotator.class.getName()); -} diff --git a/core/src/main/java/hudson/matrix/MatrixAggregatable.java b/core/src/main/java/hudson/matrix/MatrixAggregatable.java deleted file mode 100644 index 5074988d83..0000000000 --- a/core/src/main/java/hudson/matrix/MatrixAggregatable.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * The MIT License - * - * Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package hudson.matrix; - -import hudson.model.JobProperty; -import hudson.tasks.BuildWrapper; -import hudson.tasks.Publisher; -import hudson.ExtensionPoint; -import hudson.Launcher; -import hudson.model.BuildListener; - -/** - * {@link Publisher}, {@link JobProperty}, {@link BuildWrapper} can optionally implement this interface - * to perform result aggregation across {@link MatrixRun}. - * - *

                      - * This is useful for example to aggregate all the test results - * in {@link MatrixRun} into a single table/graph. - * - * @author Kohsuke Kawaguchi - * @since 1.115 - */ -public interface MatrixAggregatable extends ExtensionPoint { - /** - * Creates a new instance of the aggregator. - * - *

                      - * This method is called during the build of - * {@link MatrixBuild} and the created aggregator - * will perform the aggregation. - * - * @param build - * The build for which the aggregation shall happen. Never null. - * @param launcher - * Can be used to launch processes during the build. - * @param listener - * Progress report and errors during the aggregation should - * be sent to this object. Never null. - * - * @return - * null if the implementation is not willing to contribute - * an aggregator. - * - * @see MatrixAggregator#build - * @see MatrixAggregator#listener - */ - MatrixAggregator createAggregator(MatrixBuild build, Launcher launcher, BuildListener listener); -} diff --git a/core/src/main/java/hudson/matrix/MatrixAggregator.java b/core/src/main/java/hudson/matrix/MatrixAggregator.java deleted file mode 100644 index dbdfcaffa7..0000000000 --- a/core/src/main/java/hudson/matrix/MatrixAggregator.java +++ /dev/null @@ -1,105 +0,0 @@ -/* - * The MIT License - * - * Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package hudson.matrix; - -import hudson.ExtensionPoint; -import hudson.Launcher; -import hudson.model.BuildListener; -import hudson.tasks.BuildStep; -import hudson.tasks.Publisher; - -import java.io.IOException; - -/** - * Performs the aggregation of {@link MatrixRun} results - * into {@link MatrixBuild}. - * - *

                      - * {@link MatrixAggregator} is a transitive stateful mutable object. - * Unlike {@link Publisher}, it is not persisted. Instead, a fresh - * instance is created for each {@link MatrixBuild}, and various - * methods on this class are invoked in the event callback style - * as the build progresses. - * - *

                      - * The end result of the aggregation should be - * {@link MatrixBuild#addAction(Action) contributed as actions}. - * - * @author Kohsuke Kawaguchi - * @since 1.115 - * @see MatrixAggregatable - */ -public abstract class MatrixAggregator implements ExtensionPoint { - /** - * The build in progress. Never null. - */ - protected final MatrixBuild build; - - protected final Launcher launcher; - /** - * The listener to send the output to. Never null. - */ - protected final BuildListener listener; - - protected MatrixAggregator(MatrixBuild build, Launcher launcher, BuildListener listener) { - this.build = build; - this.launcher = launcher; - this.listener = listener; - } - - /** - * Called before the build starts. - * - * @return - * true if the build can continue, false if there was an error - * and the build needs to be aborted. - * @see BuildStep#prebuild(AbstractBuild,BuildListener) - */ - public boolean startBuild() throws InterruptedException, IOException { - return true; - } - - /** - * Called whenever one run is completed. - * - * @param run - * The completed {@link MatrixRun} object. Always non-null. - * @return - * See {@link #startBuild()} for the return value semantics. - */ - public boolean endRun(MatrixRun run) throws InterruptedException, IOException { - return true; - } - - /** - * Called after all the {@link MatrixRun}s have been completed - * to indicate that the build is about to finish. - * - * @return - * See {@link #startBuild()} for the return value semantics. - */ - public boolean endBuild() throws InterruptedException, IOException { - return true; - } -} diff --git a/core/src/main/java/hudson/matrix/MatrixBuild.java b/core/src/main/java/hudson/matrix/MatrixBuild.java deleted file mode 100644 index 5675842311..0000000000 --- a/core/src/main/java/hudson/matrix/MatrixBuild.java +++ /dev/null @@ -1,406 +0,0 @@ -/* - * The MIT License - * - * Copyright (c) 2004-2011, Sun Microsystems, Inc., Kohsuke Kawaguchi, - * Red Hat, Inc., Tom Huybrechts - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package hudson.matrix; - -import hudson.AbortException; -import hudson.Functions; -import hudson.Util; -import hudson.console.ModelHyperlinkNote; -import hudson.matrix.MatrixConfiguration.ParentBuildAction; -import hudson.model.AbstractBuild; -import hudson.model.AbstractProject; -import hudson.model.BuildListener; -import hudson.model.Executor; -import hudson.model.Fingerprint; -import hudson.model.Queue; -import hudson.model.Queue.Item; -import hudson.model.Result; -import hudson.util.HttpResponses; -import jenkins.model.Jenkins; -import org.kohsuke.stapler.Stapler; -import org.kohsuke.stapler.StaplerRequest; -import org.kohsuke.stapler.StaplerResponse; -import org.kohsuke.stapler.export.Exported; -import org.kohsuke.stapler.interceptor.RequirePOST; - -import java.io.File; -import java.io.IOException; -import java.io.PrintStream; -import java.util.ArrayList; -import java.util.Calendar; -import java.util.Collection; -import java.util.List; -import java.util.Set; - -import javax.servlet.ServletException; - -/** - * Build of {@link MatrixProject}. - * - * @author Kohsuke Kawaguchi - */ -public class MatrixBuild extends AbstractBuild { - private AxisList axes; - - /** - * If non-null, the {@link MatrixBuild} originates from the given build number. - */ - private Integer baseBuild; - - public MatrixBuild(MatrixProject job) throws IOException { - super(job); - } - - public MatrixBuild(MatrixProject job, Calendar timestamp) { - super(job, timestamp); - } - - public MatrixBuild(MatrixProject project, File buildDir) throws IOException { - super(project, buildDir); - } - - public Object readResolve() { - // MatrixBuild.axes added in 1.285; default to parent axes for old data - if (axes==null) - axes = getParent().getAxes(); - return this; - } - - /** - * Deletes the build and all matrix configurations in this build when the button is pressed. - */ - @RequirePOST - public void doDoDeleteAll( StaplerRequest req, StaplerResponse rsp ) throws IOException, ServletException { - checkPermission(DELETE); - - // We should not simply delete the build if it has been explicitly - // marked to be preserved, or if the build should not be deleted - // due to dependencies! - String why = getWhyKeepLog(); - if (why!=null) { - sendError(hudson.model.Messages.Run_UnableToDelete(toString(),why),req,rsp); - return; - } - - List runs = getExactRuns(); - for(MatrixRun run : runs){ - why = run.getWhyKeepLog(); - if (why!=null) { - sendError(hudson.model.Messages.Run_UnableToDelete(toString(),why),req,rsp); - return; - } - run.delete(); - } - delete(); - rsp.sendRedirect2(req.getContextPath()+'/' + getParent().getUrl()); - } - - - /** - * Used by view to render a ball for {@link MatrixRun}. - */ - public final class RunPtr { - public final Combination combination; - private RunPtr(Combination c) { this.combination=c; } - - public MatrixRun getRun() { - return MatrixBuild.this.getRun(combination); - } - - /** - * Return the URL to the run that this pointer references. - * - * In the typical case, this creates {@linkplain #getShortUrl() a very short relative url}. - * If the referenced run is a nearest previous build, this method returns a longer URL to that exact build. - * {@link MatrixRun} which belongs to a given build {@link MatrixBuild}. - * If there is no run which belongs to the build, return url of run, which belongs to the nearest previous build. - */ - public String getNearestRunUrl() { - MatrixRun r = getRun(); - if (r==null) return null; - if (getNumber()==r.getNumber()) - return getShortUrl()+'/'; - else - return Stapler.getCurrentRequest().getContextPath()+'/'+r.getUrl(); - } - - public String getShortUrl() { - return Util.rawEncode(combination.toString()); - } - - public String getTooltip() { - MatrixRun r = getRun(); - if(r!=null) return r.getIconColor().getDescription(); - Queue.Item item = Jenkins.getInstance().getQueue().getItem(getParent().getItem(combination)); - if(item!=null) - return item.getWhy(); - return null; // fall back - } - } - - public Layouter getLayouter() { - // axes can be null if build page is access right when build starts - return axes == null ? null : new Layouter(axes) { - protected RunPtr getT(Combination c) { - return new RunPtr(c); - } - }; - } - - /** - * Sets the base build from which this build is derived. - * @since 1.416 - */ - public void setBaseBuild(MatrixBuild baseBuild) { - this.baseBuild = (baseBuild==null || baseBuild==getPreviousBuild()) ? null : baseBuild.getNumber(); - } - - /** - * Returns the base {@link MatrixBuild} that this build originates from. - *

                      - * If this build is a partial build, unexecuted {@link MatrixRun}s are delegated to this build number. - */ - public MatrixBuild getBaseBuild() { - return baseBuild==null ? getPreviousBuild() : getParent().getBuildByNumber(baseBuild); - } - - /** - * Gets the {@link MatrixRun} in this build that corresponds - * to the given combination. - */ - public MatrixRun getRun(Combination c) { - MatrixConfiguration config = getParent().getItem(c); - if(config==null) return null; - return getRunForConfiguration(config); - } - - /** - * Like {@link #getRun(Combination)}, but do not approximate the result by earlier execution - * of the given combination (which is done for partial rebuild of the matrix.) - */ - public MatrixRun getExactRun(Combination c) { - MatrixConfiguration config = getParent().getItem(c); - if(config==null) return null; - return config.getBuildByNumber(getNumber()); - } - - /** - * Returns all {@link MatrixRun}s for this {@link MatrixBuild}. - */ - @Exported - public List getRuns() { - List r = new ArrayList(); - for(MatrixConfiguration c : getParent().getItems()) { - MatrixRun b = getRunForConfiguration(c); - if (b != null) r.add(b); - } - return r; - } - - private MatrixRun getRunForConfiguration(MatrixConfiguration c) { - for (MatrixBuild b=this; b!=null; b=b.getBaseBuild()) { - MatrixRun r = c.getBuildByNumber(b.getNumber()); - if (r!=null) return r; - } - return null; - } - - /** - * Returns all {@link MatrixRun}s for exactly this {@link MatrixBuild}. - *

                      - * Unlike {@link #getRuns()}, this method excludes those runs - * that didn't run and got inherited. - * @since 1.413 - */ - public List getExactRuns() { - List r = new ArrayList(); - for(MatrixConfiguration c : getParent().getItems()) { - MatrixRun b = c.getBuildByNumber(getNumber()); - if (b != null) r.add(b); - } - return r; - } - - @Override - public String getWhyKeepLog() { - MatrixBuild b = getNextBuild(); - if (isLinkedBy(b)) - return Messages.MatrixBuild_depends_on_this(b.getDisplayName()); - return super.getWhyKeepLog(); - } - - /** - * @return True if another {@link MatrixBuild} build (passed as a parameter) depends on this build. - * @since 1.481 - */ - public boolean isLinkedBy(MatrixBuild b) { - if(null == b) - return false; - for(MatrixConfiguration c : b.getParent().getActiveConfigurations()) { - MatrixRun r = c.getNearestOldBuild(b.getNumber()); - if (r != null && r.getNumber()==getNumber()) - return true; - } - return false; - } - - /** - * True if this build didn't do a full build and it is depending on the result of the previous build. - */ - public boolean isPartial() { - for(MatrixConfiguration c : getParent().getActiveConfigurations()) { - MatrixRun b = c.getNearestOldBuild(getNumber()); - if (b != null && b.getNumber()!=getNumber()) - return true; - } - return false; - } - - @Override - public Object getDynamic(String token, StaplerRequest req, StaplerResponse rsp) { - try { - MatrixRun item = getRun(Combination.fromString(token)); - if(item!=null) { - if (item.getNumber()==this.getNumber()) - return item; - else { - // redirect the user to the correct URL - String url = Functions.joinPath(item.getUrl(), req.getRestOfPath()); - String qs = req.getQueryString(); - if (qs!=null) url+='?'+qs; - throw HttpResponses.redirectViaContextPath(url); - } - } - } catch (IllegalArgumentException _) { - // failed to parse the token as Combination. Must be something else - } - return super.getDynamic(token,req,rsp); - } - - @Override - public void run() { - execute(new MatrixBuildExecution()); - } - - @Override - public Fingerprint.RangeSet getDownstreamRelationship(AbstractProject that) { - Fingerprint.RangeSet rs = super.getDownstreamRelationship(that); - for(MatrixRun run : getRuns()) - rs.add(run.getDownstreamRelationship(that)); - return rs; - } - - /** - * Object that lives from the start of {@link MatrixBuild} execution to its end. - * - * Used to keep track of things that are needed only during the build. - */ - public class MatrixBuildExecution extends AbstractBuildExecution { - private final List aggregators = new ArrayList(); - private Set activeConfigurations; - - /** - * Snapshot of {@link MatrixProject#getActiveConfigurations()} to ensure - * that the build will use a consistent view of it. - */ - public Set getActiveConfigurations() { - return activeConfigurations; - } - - /** - * Aggregators attached to this build execution, that are notified - * of every start/end of {@link MatrixRun}. - */ - public List getAggregators() { - return aggregators; - } - - protected Result doRun(BuildListener listener) throws Exception { - MatrixProject p = getProject(); - PrintStream logger = listener.getLogger(); - - // give axes a chance to rebuild themselves - activeConfigurations = p.rebuildConfigurations(this); - - // list up aggregators - listUpAggregators(p.getPublishers().values()); - listUpAggregators(p.getProperties().values()); - listUpAggregators(p.getBuildWrappers().values()); - - axes = p.getAxes(); - - try { - return p.getExecutionStrategy().run(this); - } catch( InterruptedException e ) { - logger.println("Aborted"); - Executor x = Executor.currentExecutor(); - x.recordCauseOfInterruption(MatrixBuild.this, listener); - return x.abortResult(); - } catch (AbortException e) { - logger.println(e.getMessage()); - return Result.FAILURE; - } finally { - // if the build was aborted in the middle. Cancel all the configuration builds. - Queue q = Jenkins.getInstance().getQueue(); - synchronized(q) {// avoid micro-locking in q.cancel. - final int n = getNumber(); - for (MatrixConfiguration c : activeConfigurations) { - for (Item i : q.getItems(c)) { - ParentBuildAction a = i.getAction(ParentBuildAction.class); - if (a!=null && a.parent==getBuild()) { - q.cancel(i); - logger.println(Messages.MatrixBuild_Cancelled(ModelHyperlinkNote.encodeTo(c))); - } - } - MatrixRun b = c.getBuildByNumber(n); - if(b!=null && b.isBuilding()) {// executor can spend some time in post production state, so only cancel in-progress builds. - Executor exe = b.getExecutor(); - if(exe!=null) { - logger.println(Messages.MatrixBuild_Interrupting(ModelHyperlinkNote.encodeTo(b))); - exe.interrupt(); - } - } - } - } - } - } - - private void listUpAggregators(Collection values) { - for (Object v : values) { - if (v instanceof MatrixAggregatable) { - MatrixAggregatable ma = (MatrixAggregatable) v; - MatrixAggregator a = ma.createAggregator(MatrixBuild.this, launcher, listener); - if(a!=null) - aggregators.add(a); - } - } - } - - public void post2(BuildListener listener) throws Exception { - for (MatrixAggregator a : aggregators) - a.endBuild(); - } - } -} diff --git a/core/src/main/java/hudson/matrix/MatrixChildAction.java b/core/src/main/java/hudson/matrix/MatrixChildAction.java deleted file mode 100644 index a43e59d932..0000000000 --- a/core/src/main/java/hudson/matrix/MatrixChildAction.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * The MIT License - * - * Copyright (c) 2012, Chris Johnson - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package hudson.matrix; - -import hudson.model.Action; -import hudson.model.Queue; -import hudson.model.Queue.Task; - -/** - * Optional interface for {@link Action}s that are used as parameters - * to {@link Queue#schedule(Task, int, Action...)} to indicate that they - * want to be also passed to the {@link MatrixRun}s from its parent {@link MatrixBuild}. - * - * @author Chris Johnson - * @since 1.481 - */ -public interface MatrixChildAction extends Action { -} diff --git a/core/src/main/java/hudson/matrix/MatrixConfiguration.java b/core/src/main/java/hudson/matrix/MatrixConfiguration.java deleted file mode 100644 index f57fff9682..0000000000 --- a/core/src/main/java/hudson/matrix/MatrixConfiguration.java +++ /dev/null @@ -1,432 +0,0 @@ -/* - * The MIT License - * - * Copyright (c) 2004-2010, Sun Microsystems, Inc., Kohsuke Kawaguchi, Tom Huybrechts - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package hudson.matrix; - -import hudson.EnvVars; -import hudson.Util; -import hudson.model.Action; -import hudson.model.Executor; -import hudson.model.InvisibleAction; -import hudson.model.Node; -import hudson.model.Queue.QueueAction; -import hudson.model.TaskListener; -import hudson.util.AlternativeUiTextProvider; -import hudson.util.DescribableList; -import hudson.model.AbstractBuild; -import hudson.model.Cause; -import hudson.model.CauseAction; -import hudson.model.DependencyGraph; -import hudson.model.Descriptor; -import jenkins.model.BuildDiscarder; -import jenkins.model.Jenkins; -import hudson.model.Item; -import hudson.model.ItemGroup; -import hudson.model.JDK; -import hudson.model.Label; -import hudson.model.ParametersAction; -import hudson.model.Project; -import hudson.model.SCMedItem; -import hudson.model.Queue.NonBlockingTask; -import hudson.model.Cause.LegacyCodeCause; -import hudson.scm.SCM; -import jenkins.scm.SCMCheckoutStrategy; -import hudson.tasks.BuildWrapper; -import hudson.tasks.Builder; -import hudson.tasks.LogRotator; -import hudson.tasks.Publisher; - -import java.io.IOException; -import java.util.Collections; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -/** - * One configuration of {@link MatrixProject}. - * - * @author Kohsuke Kawaguchi - */ -public class MatrixConfiguration extends Project implements SCMedItem, NonBlockingTask { - /** - * The actual value combination. - */ - private transient /*final*/ Combination combination; - - /** - * Hash value of {@link #combination}. Cached for efficiency. - */ - private transient String digestName; - - public MatrixConfiguration(MatrixProject parent, Combination c) { - super(parent,c.toString()); - setCombination(c); - } - - @Override - public void onLoad(ItemGroup parent, String name) throws IOException { - // directory name is not a name for us --- it's taken from the combination name - super.onLoad(parent, combination.toString()); - } - - @Override - public EnvVars getEnvironment(Node node, TaskListener listener) throws IOException, InterruptedException { - EnvVars env = super.getEnvironment(node, listener); - - AxisList axes = getParent().getAxes(); - for (Map.Entry e : getCombination().entrySet()) { - Axis a = axes.find(e.getKey()); - if (a!=null) - a.addBuildVariable(e.getValue(),env); // TODO: hijacking addBuildVariable but perhaps we need addEnvVar? - else - env.put(e.getKey(), e.getValue()); - } - - return env; - } - - @Override - protected void updateTransientActions(){ - // This method is exactly the same as in {@link #AbstractProject}. - // Enabling to call this method from MatrixProject is the only reason for overriding. - super.updateTransientActions(); - } - - @Override - public boolean isConcurrentBuild() { - return getParent().isConcurrentBuild(); - } - - @Override - public void setConcurrentBuild(boolean b) throws IOException { - throw new UnsupportedOperationException("The setting can be only changed at MatrixProject"); - } - - /** - * Used during loading to set the combination back. - */ - /*package*/ void setCombination(Combination c) { - this.combination = c; - this.digestName = c.digest().substring(0,8); - } - - /** - * Build numbers are always synchronized with the parent. - * - *

                      - * Computing this is bit tricky. Several considerations: - * - *

                        - *
                      1. A new configuration build #N is started while the parent build #N is building, - * and when that happens we want to return N. - *
                      2. But the configuration build #N is done before the parent build #N finishes, - * and when that happens we want to return N+1 because that's going to be the next one. - *
                      3. Configuration builds might skip some numbers if the parent build is aborted - * before this configuration is built. - *
                      4. If nothing is building right now and the last build of the parent is #N, - * then we want to return N+1. - *
                      - */ - @Override - public int getNextBuildNumber() { - AbstractBuild lb = getParent().getLastBuild(); - - while (lb!=null && lb.isBuilding()) { - lb = lb.getPreviousBuild(); - } - if(lb==null) return 0; - - int n=lb.getNumber()+1; - - lb = getLastBuild(); - if(lb!=null) - n = Math.max(n,lb.getNumber()+1); - - return n; - } - - @Override - public int assignBuildNumber() throws IOException { - int nb = getNextBuildNumber(); - MatrixRun r = getLastBuild(); - if(r!=null && r.getNumber()>=nb) // make sure we don't schedule the same build twice - throw new IllegalStateException("Build #"+nb+" is already completed"); - return nb; - } - - @Override - public String getDisplayName() { - return combination.toCompactString(getParent().getAxes()); - } - - @Override - public MatrixProject getParent() { - return (MatrixProject)super.getParent(); - } - - /** - * Get the actual combination of the axes values for this {@link MatrixConfiguration} - */ - public Combination getCombination() { - return combination; - } - - /** - * Since {@link MatrixConfiguration} is always invoked from {@link MatrixRun} - * once and just once, there's no point in having a quiet period. - */ - @Override - public int getQuietPeriod() { - return 0; - } - - /** - * Inherit the value from the parent. - */ - @Override - public int getScmCheckoutRetryCount() { - return getParent().getScmCheckoutRetryCount(); - } - - /** - * Inherit the value from the parent. - */ - @Override - public SCMCheckoutStrategy getScmCheckoutStrategy() { - return getParent().getScmCheckoutStrategy(); - } - - @Override - public boolean isConfigurable() { - return false; - } - - @Override - protected Class getBuildClass() { - return MatrixRun.class; - } - - @Override - protected MatrixRun newBuild() throws IOException { - List actions = Executor.currentExecutor().getCurrentWorkUnit().context.actions; - MatrixBuild lb = getParent().getLastBuild(); - for (Action a : actions) { - if (a instanceof ParentBuildAction) { - MatrixBuild _lb = ((ParentBuildAction) a).parent; - if (_lb != null) { - lb = _lb; - } - } - } - - if (lb == null) { - throw new IOException("cannot start a build of " + getFullName() + " since its parent has no builds at all"); - } - - // for every MatrixRun there should be a parent MatrixBuild - MatrixRun lastBuild = new MatrixRun(this, lb.getTimestamp()); - - lastBuild.number = lb.getNumber(); - - builds.put(lastBuild); - return lastBuild; - } - - @Override - protected void buildDependencyGraph(DependencyGraph graph) { - } - - @Override - public MatrixConfiguration asProject() { - return this; - } - - @Override - public Label getAssignedLabel() { - // combine all the label axes by &&. - String expr; - String exprSlave = Util.join(combination.values(getParent().getAxes().subList(LabelAxis.class)), "&&"); - String exprLabel = Util.join(combination.values(getParent().getAxes().subList(LabelExpAxis.class)), "&&"); - if(!exprSlave.equals("") && !exprLabel.equals("")){ - expr = exprSlave + "&&" + exprLabel; - } else{ - expr = (exprSlave.equals("")) ? exprLabel : exprSlave; - } - return Jenkins.getInstance().getLabel(Util.fixEmpty(expr)); - } - - @Override - public String getPronoun() { - return AlternativeUiTextProvider.get(PRONOUN, this, Messages.MatrixConfiguration_Pronoun()); - } - - @Override - public JDK getJDK() { - return Jenkins.getInstance().getJDK(combination.get("jdk")); - } - -// -// inherit build setting from the parent project -// - @Override - public List getBuilders() { - return getParent().getBuilders(); - } - - @Override - public Map, Publisher> getPublishers() { - return getParent().getPublishers(); - } - - @Override - public DescribableList> getBuildersList() { - return getParent().getBuildersList(); - } - - @Override - public DescribableList> getPublishersList() { - return getParent().getPublishersList(); - } - - @Override - public Map, BuildWrapper> getBuildWrappers() { - return getParent().getBuildWrappers(); - } - - @Override - public DescribableList> getBuildWrappersList() { - return getParent().getBuildWrappersList(); - } - - @Override - public Publisher getPublisher(Descriptor descriptor) { - return getParent().getPublisher(descriptor); - } - - @Override - public BuildDiscarder getBuildDiscarder() { - // TODO: LinkedLogRotator doesn't work very well in the face of pluggable BuildDiscarder but I don't know what to do - BuildDiscarder bd = getParent().getBuildDiscarder(); - if (bd instanceof LogRotator) { - LogRotator lr = (LogRotator) bd; - return new LinkedLogRotator(lr.getArtifactDaysToKeep(),lr.getArtifactNumToKeep()); - } - return new LinkedLogRotator(); - } - - @Override - public SCM getScm() { - return getParent().getScm(); - } - - /*package*/ String getDigestName() { - return digestName; - } - - /** - * JDK cannot be set on {@link MatrixConfiguration} because - * it's controlled by {@link MatrixProject}. - * @deprecated - * Not supported. - */ - @Override - public void setJDK(JDK jdk) throws IOException { - throw new UnsupportedOperationException(); - } - - /** - * @deprecated - * Value is controlled by {@link MatrixProject}. - */ - @Override - public void setBuildDiscarder(BuildDiscarder logRotator) { - throw new UnsupportedOperationException(); - } - - /** - * Returns true if this configuration is a configuration - * currently in use today (as opposed to the ones that are - * there only to keep the past record.) - * - * @see MatrixProject#getActiveConfigurations() - */ - public boolean isActiveConfiguration() { - return getParent().getActiveConfigurations().contains(this); - } - - /** - * On Cygwin, path names cannot be longer than 256 chars. - * See http://cygwin.com/ml/cygwin/2005-04/msg00395.html and - * http://www.nabble.com/Windows-Filename-too-long-errors-t3161089.html for - * the background of this issue. Setting this flag to true would - * cause Jenkins to use cryptic but short path name, giving more room for - * jobs to use longer path names. - */ - public static boolean useShortWorkspaceName = Boolean.getBoolean(MatrixConfiguration.class.getName()+".useShortWorkspaceName"); - - /** - * @deprecated - * Use {@link #scheduleBuild(ParametersAction, Cause)}. Since 1.283 - */ - public boolean scheduleBuild(ParametersAction parameters) { - return scheduleBuild(parameters, new LegacyCodeCause()); - } - - /** Starts the build with the ParametersAction that are passed in. - * - * @param parameters - * Can be null. - * @deprecated - * Use {@link #scheduleBuild(List, Cause)}. Since 1.480 - */ - public boolean scheduleBuild(ParametersAction parameters, Cause c) { - return scheduleBuild(Collections.singletonList(parameters), c); - } - /** - * Starts the build with the actions that are passed in. - * - * @param actions Can be null. - * @param c Reason for starting the build - */ - public boolean scheduleBuild(List actions, Cause c) { - List allActions = new ArrayList(); - - if(actions != null) - allActions.addAll(actions); - - allActions.add(new ParentBuildAction()); - allActions.add(new CauseAction(c)); - - return Jenkins.getInstance().getQueue().schedule2(this, getQuietPeriod(), allActions ).isAccepted(); - } - - /** - * - */ - public static class ParentBuildAction extends InvisibleAction implements QueueAction { - public transient MatrixBuild parent = (MatrixBuild)Executor.currentExecutor().getCurrentExecutable(); - public boolean shouldSchedule(List actions) { - return true; - } - } -} diff --git a/core/src/main/java/hudson/matrix/MatrixConfigurationSorter.java b/core/src/main/java/hudson/matrix/MatrixConfigurationSorter.java deleted file mode 100644 index 5066b711e6..0000000000 --- a/core/src/main/java/hudson/matrix/MatrixConfigurationSorter.java +++ /dev/null @@ -1,36 +0,0 @@ -package hudson.matrix; - -import hudson.ExtensionPoint; -import hudson.model.AbstractDescribableImpl; -import hudson.util.FormValidation; - -import java.util.Comparator; - -/** - * Add sorting for configurations {@link MatrixConfiguration}s of matrix job {@link MatrixProject} - * - * @since 1.439 - * @author Lucie Votypkova - * @see MatrixConfigurationSorterDescriptor - */ -public abstract class MatrixConfigurationSorter extends AbstractDescribableImpl implements ExtensionPoint, Comparator { - - /** - * Checks if this sorter is properly configured and applicable for the given project. - * - *

                      - * This method is invoked when the configuration is submitted to ensure that the sorter is compatible - * with the current project configuration (most probably with its {@link Axis}.) - * - * @param p - * Project for which this sorter is being used for. - * @throws FormValidation - * If you need to report an error to the user and reject the form submission. - */ - public abstract void validate(MatrixProject p) throws FormValidation; - - @Override - public MatrixConfigurationSorterDescriptor getDescriptor() { - return (MatrixConfigurationSorterDescriptor)super.getDescriptor(); - } -} diff --git a/core/src/main/java/hudson/matrix/MatrixConfigurationSorterDescriptor.java b/core/src/main/java/hudson/matrix/MatrixConfigurationSorterDescriptor.java deleted file mode 100644 index e4c4726222..0000000000 --- a/core/src/main/java/hudson/matrix/MatrixConfigurationSorterDescriptor.java +++ /dev/null @@ -1,27 +0,0 @@ -package hudson.matrix; - -import hudson.DescriptorExtensionList; -import hudson.model.Descriptor; -import jenkins.model.Jenkins; - -/** - * Descriptor for {@link MatrixConfigurationSorter}. - * - * @author Kohsuke Kawaguchi - * @since 1.439 - */ -public abstract class MatrixConfigurationSorterDescriptor extends Descriptor { - protected MatrixConfigurationSorterDescriptor(Class clazz) { - super(clazz); - } - - protected MatrixConfigurationSorterDescriptor() { - } - - /** - * Returns all the registered {@link MatrixConfigurationSorterDescriptor}s. - */ - public static DescriptorExtensionList all() { - return Jenkins.getInstance().getDescriptorList(MatrixConfigurationSorter.class); - } -} diff --git a/core/src/main/java/hudson/matrix/MatrixExecutionStrategy.java b/core/src/main/java/hudson/matrix/MatrixExecutionStrategy.java deleted file mode 100644 index 33948422d7..0000000000 --- a/core/src/main/java/hudson/matrix/MatrixExecutionStrategy.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * The MIT License - * - * Copyright (c) 2012, CloudBees, Inc. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package hudson.matrix; - -import hudson.ExtensionPoint; -import hudson.matrix.MatrixBuild.MatrixBuildExecution; -import hudson.model.AbstractDescribableImpl; -import hudson.model.BuildListener; -import hudson.model.Result; - -import java.io.IOException; -import java.util.List; - -/** - * Controls the execution sequence of {@link MatrixConfiguration} when {@link MatrixProject} builds, - * including what degree it gets serialized/parallelled, how the whole build is abandoned when - * some fails, etc. - * - * @author Kohsuke Kawaguchi - * @since 1.456 - */ -public abstract class MatrixExecutionStrategy extends AbstractDescribableImpl implements ExtensionPoint { - public Result run(MatrixBuildExecution execution) throws InterruptedException, IOException { - return run(execution.getBuild(), execution.getAggregators(), execution.getListener()); - } - - /** - * @deprecated - * Override {@link #run(MatrixBuild.MatrixBuildExecution)} - */ - public Result run(MatrixBuild build, List aggregators, BuildListener listener) throws InterruptedException, IOException { - throw new UnsupportedOperationException(getClass()+" needs to override run(MatrixBuildExecution)"); - } - - @Override - public MatrixExecutionStrategyDescriptor getDescriptor() { - return (MatrixExecutionStrategyDescriptor)super.getDescriptor(); - } -} diff --git a/core/src/main/java/hudson/matrix/MatrixExecutionStrategyDescriptor.java b/core/src/main/java/hudson/matrix/MatrixExecutionStrategyDescriptor.java deleted file mode 100644 index b554e5df96..0000000000 --- a/core/src/main/java/hudson/matrix/MatrixExecutionStrategyDescriptor.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * The MIT License - * - * Copyright (c) 2012, CloudBees, Inc. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package hudson.matrix; - -import hudson.DescriptorExtensionList; -import hudson.model.Descriptor; -import jenkins.model.Jenkins; - -/** - * @author Kohsuke Kawaguchi - * @since 1.456 - */ -public abstract class MatrixExecutionStrategyDescriptor extends Descriptor { - protected MatrixExecutionStrategyDescriptor(Class clazz) { - super(clazz); - } - - protected MatrixExecutionStrategyDescriptor() { - } - - /** - * Returns all the registered {@link MatrixExecutionStrategyDescriptor}s. - */ - public static DescriptorExtensionList all() { - return Jenkins.getInstance().getDescriptorList(MatrixExecutionStrategy.class); - } -} diff --git a/core/src/main/java/hudson/matrix/MatrixProject.java b/core/src/main/java/hudson/matrix/MatrixProject.java deleted file mode 100644 index 6390db6839..0000000000 --- a/core/src/main/java/hudson/matrix/MatrixProject.java +++ /dev/null @@ -1,951 +0,0 @@ -/* - * The MIT License - * - * Copyright (c) 2004-2011, Sun Microsystems, Inc., Kohsuke Kawaguchi, - * Jorg Heymans, Red Hat, Inc., id:cactusman - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package hudson.matrix; - -import com.google.common.base.Function; -import com.google.common.collect.Iterables; -import com.google.common.collect.Lists; -import com.google.common.collect.Sets; -import hudson.CopyOnWrite; -import hudson.Extension; -import hudson.Util; -import hudson.XmlFile; -import hudson.matrix.MatrixBuild.MatrixBuildExecution; -import hudson.model.AbstractProject; -import hudson.model.Action; -import hudson.model.BuildableItemWithBuildWrappers; -import hudson.model.DependencyGraph; -import hudson.model.Descriptor; -import hudson.model.Descriptor.FormException; -import hudson.model.Node; -import hudson.slaves.WorkspaceList; -import hudson.util.AlternativeUiTextProvider; -import jenkins.model.Jenkins; -import hudson.model.Item; -import hudson.model.ItemGroup; -import hudson.model.Items; -import hudson.model.JDK; -import hudson.model.Job; -import hudson.model.Label; -import hudson.model.ParameterDefinition; -import hudson.model.ParametersDefinitionProperty; -import hudson.model.Queue.FlyweightTask; -import hudson.model.Result; -import hudson.model.SCMedItem; -import hudson.model.Saveable; -import hudson.model.TopLevelItem; -import hudson.tasks.BuildStep; -import hudson.tasks.BuildWrapper; -import hudson.tasks.BuildWrappers; -import hudson.tasks.Builder; -import hudson.tasks.Publisher; -import hudson.triggers.Trigger; -import hudson.util.CopyOnWriteMap; -import hudson.util.DescribableList; -import hudson.util.FormValidation; -import hudson.util.FormValidation.Kind; -import jenkins.scm.SCMCheckoutStrategyDescriptor; -import net.sf.json.JSONObject; -import org.kohsuke.accmod.Restricted; -import org.kohsuke.accmod.restrictions.NoExternalUse; -import org.kohsuke.stapler.HttpResponse; -import org.kohsuke.stapler.StaplerRequest; -import org.kohsuke.stapler.StaplerResponse; -import org.kohsuke.stapler.TokenList; -import org.kohsuke.stapler.export.Exported; - -import javax.annotation.Nullable; -import javax.servlet.ServletException; -import java.io.File; -import java.io.FileFilter; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; -import java.util.logging.Level; -import java.util.logging.Logger; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * {@link Job} that allows you to run multiple different configurations - * from a single setting. - * - * @author Kohsuke Kawaguchi - */ -public class MatrixProject extends AbstractProject implements TopLevelItem, SCMedItem, ItemGroup, Saveable, FlyweightTask, BuildableItemWithBuildWrappers { - /** - * Configuration axes. - */ - private volatile AxisList axes = new AxisList(); - - /** - * The filter that is applied to combinations. It is a Groovy if condition. - * This can be null, which means "true". - * - * @see #getCombinationFilter() - */ - private volatile String combinationFilter; - - /** - * List of active {@link Builder}s configured for this project. - */ - private DescribableList> builders = - new DescribableList>(this); - - /** - * List of active {@link Publisher}s configured for this project. - */ - private DescribableList> publishers = - new DescribableList>(this); - - /** - * List of active {@link BuildWrapper}s configured for this project. - */ - private DescribableList> buildWrappers = - new DescribableList>(this); - - /** - * All {@link MatrixConfiguration}s, keyed by their {@link MatrixConfiguration#getName() names}. - */ - private transient /*final*/ Map configurations = new CopyOnWriteMap.Tree(); - - /** - * @see #getActiveConfigurations() - */ - @CopyOnWrite - private transient /*final*/ Set activeConfigurations = new LinkedHashSet(); - - /** - * @deprecated as of 1.456 - * Moved to {@link DefaultMatrixExecutionStrategyImpl} - */ - private transient Boolean runSequentially; - - /** - * Filter to select a number of combinations to build first - * @deprecated as of 1.456 - * Moved to {@link DefaultMatrixExecutionStrategyImpl} - */ - private transient String touchStoneCombinationFilter; - - /** - * Required result on the touchstone combinations, in order to - * continue with the rest - * @deprecated as of 1.456 - * Moved to {@link DefaultMatrixExecutionStrategyImpl} - */ - private transient Result touchStoneResultCondition; - - /** - * @deprecated as of 1.456 - * Moved to {@link DefaultMatrixExecutionStrategyImpl} - */ - private transient MatrixConfigurationSorter sorter; - - private MatrixExecutionStrategy executionStrategy; - - /** - * Custom workspace location for {@link MatrixConfiguration}s. - * - *

                      - * (Historically, we used {@link AbstractProject#customWorkspace} + some unique suffix (see {@link MatrixConfiguration#useShortWorkspaceName}) - * for custom workspace, but we now separated that so that the user has more control. - * - *

                      - * If null, the historical semantics is assumed. - * - * @since 1.466 - */ - private String childCustomWorkspace; - - public MatrixProject(String name) { - this(Jenkins.getInstance(), name); - } - - public MatrixProject(ItemGroup parent, String name) { - super(parent, name); - } - - @Override - public String getPronoun() { - return AlternativeUiTextProvider.get(PRONOUN, this, Messages.MatrixProject_Pronoun()); - } - - /** - * Gets the workspace location that {@link MatrixConfiguration} uses. - * - * @see MatrixRun.MatrixRunExecution#decideWorkspace(Node, WorkspaceList) - * - * @return never null - * even when {@link MatrixProject} uses no custom workspace, this method still - * returns something like "${PARENT_WORKSPACE}/${COMBINATION}" that controls - * how the workspace should be laid out. - * - * The return value can be absolute or relative. If relative, it is resolved - * against the working directory of the overarching {@link MatrixBuild}. - */ - public String getChildCustomWorkspace() { - String ws = childCustomWorkspace; - if (ws==null) { - ws = MatrixConfiguration.useShortWorkspaceName?"${SHORT_COMBINATION}":"${COMBINATION}"; - } - return ws; - } - - /** - * Do we have an explicit child custom workspace setting (true)? Or just using the default value (false)? - */ - public boolean hasChildCustomWorkspace() { - return childCustomWorkspace!=null; - } - - public void setChildCustomWorkspace(String childCustomWorkspace) throws IOException { - this.childCustomWorkspace = Util.fixEmptyAndTrim(childCustomWorkspace); - save(); - } - - /** - * {@link MatrixProject} is relevant with all the labels its configurations are relevant. - */ - @Override - public Set

                      - * By default, a {@link MatrixConfiguration} is created for every possible combination of axes exhaustively. - * But by specifying a Groovy expression as a combination filter, one can trim down the # of combinations built. - * - *

                      - * Namely, this expression is evaluated for each axis value combination, and only when it evaluates to true, - * a corresponding {@link MatrixConfiguration} will be created and built. - * - * @return can be null. - * @since 1.279 - */ - public String getCombinationFilter() { - return combinationFilter; - } - - /** - * @return can be null (to indicate that the configurations should be left to their natural order.) - * @deprecated as of 1.456 - * Use {@link DefaultMatrixExecutionStrategyImpl#getTouchStoneCombinationFilter()}. - * This method tries to emulate the previous behavior the best it can, but will return null - * if the current {@link MatrixExecutionStrategy} is not the default one. - */ - public String getTouchStoneCombinationFilter() { - MatrixExecutionStrategy e = executionStrategy; - if (e instanceof DefaultMatrixExecutionStrategyImpl) { - DefaultMatrixExecutionStrategyImpl dm = (DefaultMatrixExecutionStrategyImpl) e; - return dm.getTouchStoneCombinationFilter(); - } - return null; - } - - /** - * @deprecated as of 1.456 - * Use {@link DefaultMatrixExecutionStrategyImpl#setTouchStoneCombinationFilter(String)}. - * This method tries to emulate the previous behavior the best it can, but will fall back - * to no-op if the current {@link MatrixExecutionStrategy} is not the default one. - */ - public void setTouchStoneCombinationFilter(String touchStoneCombinationFilter) throws IOException { - MatrixExecutionStrategy e = executionStrategy; - if (e instanceof DefaultMatrixExecutionStrategyImpl) { - DefaultMatrixExecutionStrategyImpl dm = (DefaultMatrixExecutionStrategyImpl) e; - dm.setTouchStoneCombinationFilter(touchStoneCombinationFilter); - save(); - } - } - - /** - * @return can be null (to indicate that the configurations should be left to their natural order.) - * @deprecated as of 1.456 - * Use {@link DefaultMatrixExecutionStrategyImpl#getTouchStoneResultCondition()}. - * This method tries to emulate the previous behavior the best it can, but will return null - * if the current {@link MatrixExecutionStrategy} is not the default one. - */ - public Result getTouchStoneResultCondition() { - MatrixExecutionStrategy e = executionStrategy; - if (e instanceof DefaultMatrixExecutionStrategyImpl) { - DefaultMatrixExecutionStrategyImpl dm = (DefaultMatrixExecutionStrategyImpl) e; - return dm.getTouchStoneResultCondition(); - } - return null; - } - - /** - * @deprecated as of 1.456 - * Use {@link DefaultMatrixExecutionStrategyImpl#setTouchStoneResultCondition(Result)}. - * This method tries to emulate the previous behavior the best it can, but will fall back - * to no-op if the current {@link MatrixExecutionStrategy} is not the default one. - */ - public void setTouchStoneResultCondition(Result touchStoneResultCondition) throws IOException { - MatrixExecutionStrategy e = executionStrategy; - if (e instanceof DefaultMatrixExecutionStrategyImpl) { - DefaultMatrixExecutionStrategyImpl dm = (DefaultMatrixExecutionStrategyImpl) e; - dm.setTouchStoneResultCondition(touchStoneResultCondition); - save(); - } - } - - @Override - protected List createTransientActions() { - List r = super.createTransientActions(); - - for (BuildStep step : builders) - r.addAll(step.getProjectActions(this)); - for (BuildStep step : publishers) - r.addAll(step.getProjectActions(this)); - for (BuildWrapper step : buildWrappers) - r.addAll(step.getProjectActions(this)); - for (Trigger trigger : triggers()) - r.addAll(trigger.getProjectActions()); - - return r; - } - - @Override - protected void updateTransientActions(){ - super.updateTransientActions(); - if(getActiveConfigurations() !=null){ - // update all transient actions in configurations too. - for(MatrixConfiguration configuration: getActiveConfigurations()){ - configuration.updateTransientActions(); - } - } - } - - /** - * Gets the subset of {@link AxisList} that are not system axes. - * - * @deprecated as of 1.373 - * System vs user difference are generalized into extension point. - */ - public List getUserAxes() { - List r = new ArrayList(); - for (Axis a : axes) - if(!a.isSystem()) - r.add(a); - return r; - } - - public Layouter getLayouter() { - return new Layouter(axes) { - protected MatrixConfiguration getT(Combination c) { - return getItem(c); - } - }; - } - - @Override - public void onCreatedFromScratch() { - executionStrategy = new DefaultMatrixExecutionStrategyImpl(); - super.onCreatedFromScratch(); - } - - @Override - public void onLoad(ItemGroup parent, String name) throws IOException { - super.onLoad(parent,name); - builders.setOwner(this); - publishers.setOwner(this); - buildWrappers.setOwner(this); - - if (executionStrategy ==null) - executionStrategy = new DefaultMatrixExecutionStrategyImpl(runSequentially != null ? runSequentially : false, touchStoneCombinationFilter, touchStoneResultCondition, sorter); - - rebuildConfigurations(null); - } - - @Override - public void logRotate() throws IOException, InterruptedException { - super.logRotate(); - // perform the log rotation of inactive configurations to make sure - // their logs get eventually discarded - for (MatrixConfiguration config : configurations.values()) { - if(!config.isActiveConfiguration()) - config.logRotate(); - } - } - - /** - * Recursively search for configuration and put them to the map - * - *

                      - * The directory structure would be axis-a/b/axis-c/d/axis-e/f for - * combination [a=b,c=d,e=f]. Note that two combinations [a=b,c=d] and [a=b,c=d,e=f] - * can both co-exist (where one is an archived record and the other is live, for example) - * so search needs to be thorough. - * - * @param dir - * Directory to be searched. - * @param result - * Receives the loaded {@link MatrixConfiguration}s. - * @param combination - * Combination of key/values discovered so far while traversing the directories. - * Read-only. - */ - private void loadConfigurations( File dir, CopyOnWriteMap.Tree result, Map combination ) { - File[] axisDirs = dir.listFiles(new FileFilter() { - public boolean accept(File child) { - return child.isDirectory() && child.getName().startsWith("axis-"); - } - }); - if(axisDirs==null) return; - - for (File subdir : axisDirs) { - String axis = subdir.getName().substring(5); // axis name - - File[] valuesDir = subdir.listFiles(new FileFilter() { - public boolean accept(File child) { - return child.isDirectory(); - } - }); - if(valuesDir==null) continue; // no values here - - for (File v : valuesDir) { - Map c = new HashMap(combination); - c.put(axis,TokenList.decode(v.getName())); - - try { - XmlFile config = Items.getConfigFile(v); - if(config.exists()) { - Combination comb = new Combination(c); - // if we already have this in memory, just use it. - // otherwise load it - MatrixConfiguration item=null; - if(this.configurations!=null) - item = this.configurations.get(comb); - if(item==null) { - item = (MatrixConfiguration) config.read(); - item.setCombination(comb); - item.onLoad(this, v.getName()); - } - result.put(item.getCombination(), item); - } - } catch (IOException e) { - LOGGER.log(Level.WARNING, "Failed to load matrix configuration "+v,e); - } - loadConfigurations(v,result,c); - } - } - } - - /** - * Rebuilds the {@link #configurations} list and {@link #activeConfigurations}. - * - * @param context - * We rebuild configurations right before a build, to allow configurations to be adjusted for the build. - * (think of it as reconfiguring a project right before a build.) And when that happens, this value is the - * build in progress. Otherwise this value is null (for example, when Jenkins is booting up.) - */ - /*package*/ Set rebuildConfigurations(MatrixBuildExecution context) throws IOException { - { - // backward compatibility check to see if there's any data in the old structure - // if so, bring them to the newer structure. - File[] oldDirs = getConfigurationsDir().listFiles(new FileFilter() { - public boolean accept(File child) { - return child.isDirectory() && !child.getName().startsWith("axis-"); - } - }); - if(oldDirs!=null) { - // rename the old directory to the new one - for (File dir : oldDirs) { - try { - Combination c = Combination.fromString(dir.getName()); - dir.renameTo(getRootDirFor(c)); - } catch (IllegalArgumentException e) { - // it's not a configuration dir. Just ignore. - } - } - } - } - - CopyOnWriteMap.Tree configurations = - new CopyOnWriteMap.Tree(); - loadConfigurations(getConfigurationsDir(),configurations,Collections.emptyMap()); - this.configurations = configurations; - - Iterable activeCombinations; - if (context!=null) { - List> axesList = Lists.newArrayList(); - for (Axis axis : axes) - axesList.add(Sets.newLinkedHashSet(axis.rebuild(context))); - - activeCombinations = Iterables.transform(Sets.cartesianProduct(axesList), new Function, Combination>() { - public Combination apply(@Nullable List strings) { - assert strings != null; - return new Combination(axes, (String[]) strings.toArray(new String[0])); - } - }); - } else { - activeCombinations = axes.list(); - } - - // find all active configurations - final Set active = new LinkedHashSet(); - final boolean isDynamicFilter = isDynamicFilter(getCombinationFilter()); - - for (Combination c : activeCombinations) { - if(isDynamicFilter || c.evalGroovyExpression(axes,getCombinationFilter())) { - LOGGER.fine("Adding configuration: " + c); - MatrixConfiguration config = configurations.get(c); - if(config==null) { - config = new MatrixConfiguration(this,c); - config.onCreatedFromScratch(); - config.save(); - configurations.put(config.getCombination(), config); - } - active.add(config); - } - } - this.activeConfigurations = active; - - return active; - } - - private boolean isDynamicFilter(final String filter) { - - if (!isParameterized() || filter == null) return false; - - final ParametersDefinitionProperty paramDefProp = getProperty(ParametersDefinitionProperty.class); - - for (final ParameterDefinition definition : paramDefProp.getParameterDefinitions()) { - - final String name = definition.getName(); - - final Matcher matcher = Pattern - .compile("\\b" + name + "\\b") - .matcher(filter) - ; - - if (matcher.find()) return true; - } - - return false; - } - - private File getConfigurationsDir() { - return new File(getRootDir(),"configurations"); - } - - /** - * Gets all active configurations. - * - *

                      - * In contract, inactive configurations are those that are left for archival purpose - * and no longer built when a new {@link MatrixBuild} is executed. - * - *

                      - * During a build, {@link MatrixBuildExecution#getActiveConfigurations()} should be used - * to make sure that a build is using the consistent set of active configurations from - * the start to the end. - */ - @Exported - public Collection getActiveConfigurations() { - return activeConfigurations; - } - - public Collection getItems() { - return configurations.values(); - } - - @Override - public Collection getAllJobs() { - Set jobs = new HashSet(getItems()); - jobs.add(this); - return jobs; - } - - public String getUrlChildPrefix() { - return "."; - } - - public MatrixConfiguration getItem(String name) { - try { - return getItem(Combination.fromString(name)); - } catch (IllegalArgumentException e) { - return null; - } - } - - public MatrixConfiguration getItem(Combination c) { - if (configurations == null) { - return null; - } - return configurations.get(c); - } - - public File getRootDirFor(MatrixConfiguration child) { - return getRootDirFor(child.getCombination()); - } - - public void onRenamed(MatrixConfiguration item, String oldName, String newName) throws IOException { - throw new UnsupportedOperationException(); - } - - public void onDeleted(MatrixConfiguration item) throws IOException { - // noop - } - - public File getRootDirFor(Combination combination) { - File f = getConfigurationsDir(); - for (Entry e : combination.entrySet()) - f = new File(f,"axis-"+e.getKey()+'/'+Util.rawEncode(e.getValue())); - f.getParentFile().mkdirs(); - return f; - } - - /** - * @see #getJDKs() - */ - @Override @Deprecated - public JDK getJDK() { - return super.getJDK(); - } - - /** - * Gets the {@link JDK}s where the builds will be run. - * @return never null but can be empty - */ - public Set getJDKs() { - Axis a = axes.find("jdk"); - if(a==null) return Collections.emptySet(); - Set r = new HashSet(); - for (String j : a) { - JDK jdk = Jenkins.getInstance().getJDK(j); - if(jdk!=null) - r.add(jdk); - } - return r; - } - - /** - * Gets the {@link Label}s where the builds will be run. - * @return never null - */ - public Set

                      - * Plugins can implement this extension point to filter out the subset of matrix project to build. - * Most typically, such a plugin would add a custom {@link Action} to a build when it goes to the queue - * ({@link Queue#schedule2(Task, int, List)}, then access this from {@link MatrixBuild} to drive - * the filtering logic. - * - *

                      - * See the matrix reloaded plugin for an example. - * - * @author Christian Wolfgang - * @since 1.413 - */ -public abstract class MatrixBuildListener implements ExtensionPoint { - /** - * Determine whether to build a given configuration or not - * - * @param b - * Never null. The umbrella build. - * @param c - * The configuration whose build is being considered. If any of the {@link MatrixBuildListener} - * returns false, then the build for this configuration is skipped, and the previous build - * of this configuration will be taken as the default result. - * @return - * True to let the build happen, false to skip it. - */ - public abstract boolean doBuildConfiguration(MatrixBuild b, MatrixConfiguration c); - - public static boolean buildConfiguration(MatrixBuild b, MatrixConfiguration c) { - for (MatrixBuildListener l : all()) { - if(!l.doBuildConfiguration(b, c)) { - return false; - } - } - - return true; - } - - /** - * Returns all the registered {@link MatrixBuildListener} descriptors. - */ - public static ExtensionList all() { - return Jenkins.getInstance().getExtensionList(MatrixBuildListener.class); - } -} diff --git a/core/src/main/java/hudson/matrix/package.html b/core/src/main/java/hudson/matrix/package.html deleted file mode 100644 index 72e14d2dcb..0000000000 --- a/core/src/main/java/hudson/matrix/package.html +++ /dev/null @@ -1,27 +0,0 @@ - - - -Matrix project - \ No newline at end of file diff --git a/core/src/main/resources/hudson/matrix/DefaultMatrixExecutionStrategyImpl/config.groovy b/core/src/main/resources/hudson/matrix/DefaultMatrixExecutionStrategyImpl/config.groovy deleted file mode 100644 index fa6f924c5b..0000000000 --- a/core/src/main/resources/hudson/matrix/DefaultMatrixExecutionStrategyImpl/config.groovy +++ /dev/null @@ -1,28 +0,0 @@ -package hudson.matrix.DefaultMatrixExecutionStrategyImpl; - -import hudson.matrix.MatrixConfigurationSorterDescriptor -import hudson.model.Result; - -def f = namespace(lib.FormTagLib) - -f.optionalBlock (field:"runSequentially", title:_("Run each configuration sequentially"), inline:true) { - if (MatrixConfigurationSorterDescriptor.all().size()>1) { - f.dropdownDescriptorSelector(title:_("Execution order of builds"), field:"sorter") - } -} - -f.optionalBlock (field:"hasTouchStoneCombinationFilter", title:_("Execute touchstone builds first"), inline:true) { - // TODO: help="/help/matrix/touchstone.html"> - // TODO: move l10n from MatrixProject/configEntries.jelly - - f.entry(title:_("Filter"), field:"touchStoneCombinationFilter") { - f.textbox() - } - - f.entry(title:_("Required result"), field:"touchStoneResultCondition", description:_("required.result.description")) { - select(name:"touchStoneResultCondition") { - f.option(value:"SUCCESS", selected:my.touchStoneResultCondition==Result.SUCCESS, _("Stable")) - f.option(value:"UNSTABLE", selected:my.touchStoneResultCondition==Result.UNSTABLE, _("Unstable")) - } - } -} diff --git a/core/src/main/resources/hudson/matrix/DefaultMatrixExecutionStrategyImpl/config.properties b/core/src/main/resources/hudson/matrix/DefaultMatrixExecutionStrategyImpl/config.properties deleted file mode 100644 index 20f08d5509..0000000000 --- a/core/src/main/resources/hudson/matrix/DefaultMatrixExecutionStrategyImpl/config.properties +++ /dev/null @@ -1,24 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2010, Sun Microsystems, Inc., Seiji Sogabe -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -required.result.description=\ - Execute the rest of the combinations only if the touchstone builds has (at least) the selected result. diff --git a/core/src/main/resources/hudson/matrix/DefaultMatrixExecutionStrategyImpl/config_da.properties b/core/src/main/resources/hudson/matrix/DefaultMatrixExecutionStrategyImpl/config_da.properties deleted file mode 100644 index 35e0cfe69d..0000000000 --- a/core/src/main/resources/hudson/matrix/DefaultMatrixExecutionStrategyImpl/config_da.properties +++ /dev/null @@ -1,29 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2010, Sun Microsystems, Inc. Kohsuke Kawaguchi. Knud Poulsen. -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Execute\ touchstone\ builds\ first=K\u00f8r touchstone byg f\u00f8rst -Filter=Filter -Required\ result=N\u00f8dvendigt resultat -Run\ each\ configuration\ sequentially=K\u00f8r hver konfiguration sekventielt -Stable=Stabil -Unstable=Ustabil -required.result.description=Afvikl kun resten af kombinationerne hvis touchstone byggene har mindst det \u00f8nskede resultat. diff --git a/core/src/main/resources/hudson/matrix/DefaultMatrixExecutionStrategyImpl/config_de.properties b/core/src/main/resources/hudson/matrix/DefaultMatrixExecutionStrategyImpl/config_de.properties deleted file mode 100644 index ab5dd1d45a..0000000000 --- a/core/src/main/resources/hudson/matrix/DefaultMatrixExecutionStrategyImpl/config_de.properties +++ /dev/null @@ -1,30 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Simon Wiest -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Required\ result=Mindest-Resultat -Stable=Stabil -Unstable=Instabil -required.result.description=F\u00fchre verbleibende Kombinationen nur aus, wenn \ - die Touchstone-Builds mindestens das gew\u00e4hlte Resultat lieferten. -Execute\ touchstone\ builds\ first=Touchstone-Builds zuerst ausf\u00fchren -Run\ each\ configuration\ sequentially=Konfigurationen sequentiell ausf\u00fchren -Filter=Filter diff --git a/core/src/main/resources/hudson/matrix/DefaultMatrixExecutionStrategyImpl/config_ja.properties b/core/src/main/resources/hudson/matrix/DefaultMatrixExecutionStrategyImpl/config_ja.properties deleted file mode 100644 index 7ee8a79bde..0000000000 --- a/core/src/main/resources/hudson/matrix/DefaultMatrixExecutionStrategyImpl/config_ja.properties +++ /dev/null @@ -1,31 +0,0 @@ -# The MIT License -# -# Copyright 2012 sogabe. -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Run\ each\ configuration\ sequentially=\u5404\u8a2d\u5b9a\u3092\u9806\u6b21\u8d77\u52d5 -Execution\ order\ of\ builds=\u30d3\u30eb\u30c9\u306e\u5b9f\u884c\u9806\u5e8f -Execute\ touchstone\ builds\ first=\u6700\u521d\u306b\u7279\u5b9a\u306e\u30d3\u30eb\u30c9\u3092\u5b9f\u884c -Filter=\u30d5\u30a3\u30eb\u30bf\u30fc -Required\ result=\u30d3\u30eb\u30c9\u7d50\u679c -required.result.description=\ - \u6700\u521d\u306b\u5b9f\u884c\u3057\u305f\u30d3\u30eb\u30c9\u304c(\u5c11\u306a\u304f\u3068\u3082)\u9078\u629e\u3057\u305f\u7d50\u679c\u3067\u3042\u308b\u5834\u5408\u306e\u307f\u3001\u6b8b\u308a\u306e\u7d44\u307f\u5408\u308f\u305b\u3092\u5b9f\u884c\u3057\u307e\u3059\u3002 -Stable=\u5b89\u5b9a -Unstable=\u4e0d\u5b89\u5b9a \ No newline at end of file diff --git a/core/src/main/resources/hudson/matrix/DefaultMatrixExecutionStrategyImpl/config_pt_BR.properties b/core/src/main/resources/hudson/matrix/DefaultMatrixExecutionStrategyImpl/config_pt_BR.properties deleted file mode 100644 index 7e421cf1c7..0000000000 --- a/core/src/main/resources/hudson/matrix/DefaultMatrixExecutionStrategyImpl/config_pt_BR.properties +++ /dev/null @@ -1,29 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Reginaldo L. Russinholi, Cleiber Silva, Fernando Boaglio -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Execute\ touchstone\ builds\ first= Ordenar por builds -Unstable= Inst\u00e1vel -Run\ each\ configuration\ sequentially= Rodar cada configura\u00e7\u00e3o em sequ\u00eancia -Stable= Est\u00e1vel -Required\ result= Resultado -Filter= Filtro -required.result.description=Executar as demais combina\u00e7\u00f5es somente se os crit\u00e9rios de builds tiver (pelo menos) o resultado selecionado. diff --git a/core/src/main/resources/hudson/matrix/DefaultMatrixExecutionStrategyImpl/config_zh_TW.properties b/core/src/main/resources/hudson/matrix/DefaultMatrixExecutionStrategyImpl/config_zh_TW.properties deleted file mode 100644 index 76828773b5..0000000000 --- a/core/src/main/resources/hudson/matrix/DefaultMatrixExecutionStrategyImpl/config_zh_TW.properties +++ /dev/null @@ -1,31 +0,0 @@ -# The MIT License -# -# Copyright (c) 2013, Chunghwa Telecom Co., Ltd., Pei-Tang Huang -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Run\ each\ configuration\ sequentially=\u5faa\u5e8f\u57f7\u884c\u5404\u9805\u8a2d\u5b9a -Execution\ order\ of\ builds=\u5efa\u7f6e\u57f7\u884c\u9806\u5e8f -Execute\ touchstone\ builds\ first=\u512a\u5148\u5efa\u7f6e\u300c\u8a66\u91d1\u77f3\u300d -Filter=\u7be9\u9078\u689d\u4ef6 -Required\ result=\u5fc5\u8981\u7d50\u679c -required.result.description=\ - \u53ea\u6709\u5728\u300c\u8a66\u91d1\u77f3\u300d\u5efa\u7f6e\u7d50\u679c\u7b26\u5408\u9810\u671f\u6642\u624d\u57f7\u884c\u5176\u4ed6\u7d44\u5408\u3002 -Stable=\u7a69\u5b9a -Unstable=\u4e0d\u7a69\u5b9a \ No newline at end of file diff --git a/core/src/main/resources/hudson/matrix/DefaultMatrixExecutionStrategyImpl/help-hasTouchStoneCombinationFilter.html b/core/src/main/resources/hudson/matrix/DefaultMatrixExecutionStrategyImpl/help-hasTouchStoneCombinationFilter.html deleted file mode 100644 index 012833aacf..0000000000 --- a/core/src/main/resources/hudson/matrix/DefaultMatrixExecutionStrategyImpl/help-hasTouchStoneCombinationFilter.html +++ /dev/null @@ -1,5 +0,0 @@ -

                      - Use a touchstone build if you want to run a sanity check before building all the combinations. - You can select a number of combinations using a combination filter. These will be built first. - If the result satisfies the result condition, the rest of the combinations will be built. -
                      \ No newline at end of file diff --git a/core/src/main/resources/hudson/matrix/DefaultMatrixExecutionStrategyImpl/help-hasTouchStoneCombinationFilter_de.html b/core/src/main/resources/hudson/matrix/DefaultMatrixExecutionStrategyImpl/help-hasTouchStoneCombinationFilter_de.html deleted file mode 100644 index 419847dc31..0000000000 --- a/core/src/main/resources/hudson/matrix/DefaultMatrixExecutionStrategyImpl/help-hasTouchStoneCombinationFilter_de.html +++ /dev/null @@ -1,10 +0,0 @@ -
                      - Ein "Touchstone"-Build ist ein besonderer Build, der Sie besonders frühzeitig auf Probleme - in Ihrem Code hinweist, z.B. durch Ausführung essentieller Plausibilitätstests. - -

                      - Wenn angewählt, führt Jenkins zunächst die Touchstone-Builds aus, bevor dann alle weiteren - Kombinationen gebaut werden. Sie können über einen Kombinationsfilter auch mehrere Builds - als Touchstone-Build kennzeichnen. Nur wenn das Ergebnis der Touchstone-Builds die - Ergebnisbedingung erfüllt, werden alle weiteren Kombinationen gebaut. -

                      \ No newline at end of file diff --git a/core/src/main/resources/hudson/matrix/DefaultMatrixExecutionStrategyImpl/help-hasTouchStoneCombinationFilter_ja.html b/core/src/main/resources/hudson/matrix/DefaultMatrixExecutionStrategyImpl/help-hasTouchStoneCombinationFilter_ja.html deleted file mode 100644 index 620ec2a4f3..0000000000 --- a/core/src/main/resources/hudson/matrix/DefaultMatrixExecutionStrategyImpl/help-hasTouchStoneCombinationFilter_ja.html +++ /dev/null @@ -1,5 +0,0 @@ -
                      - すべての組み合わせをビルドする前に、正常かどうかチェックしたい場合に使用します。 - フィルターを使用して、最初に実行するビルドの組み合わせを選択できます。 - 結果が"ビルド結果"の条件を満たした場合、残りの組み合わせがビルドされます。 -
                      \ No newline at end of file diff --git a/core/src/main/resources/hudson/matrix/DefaultMatrixExecutionStrategyImpl/help-hasTouchStoneCombinationFilter_zh_TW.html b/core/src/main/resources/hudson/matrix/DefaultMatrixExecutionStrategyImpl/help-hasTouchStoneCombinationFilter_zh_TW.html deleted file mode 100644 index 9aa296d5cf..0000000000 --- a/core/src/main/resources/hudson/matrix/DefaultMatrixExecutionStrategyImpl/help-hasTouchStoneCombinationFilter_zh_TW.html +++ /dev/null @@ -1,5 +0,0 @@ -
                      - 如果您想在建置所有組合前先做些例行檢查,就可以使用「試金石」建置。 - 可以透過組合篩選條件選出一些組合,並優先建置它們。 - 只有在結果符合預期條件時,才會建置其他組合。 -
                      \ No newline at end of file diff --git a/core/src/main/resources/hudson/matrix/DefaultMatrixExecutionStrategyImpl/help-runSequentially.html b/core/src/main/resources/hudson/matrix/DefaultMatrixExecutionStrategyImpl/help-runSequentially.html deleted file mode 100644 index a6a92881cf..0000000000 --- a/core/src/main/resources/hudson/matrix/DefaultMatrixExecutionStrategyImpl/help-runSequentially.html +++ /dev/null @@ -1,5 +0,0 @@ -
                      - With this option checked, Jenkins builds each configuration in a sequence. - This can be useful if your configuration needs to access the shared resource - like database, as well as to avoid crowding out other jobs. -
                      diff --git a/core/src/main/resources/hudson/matrix/DefaultMatrixExecutionStrategyImpl/help-runSequentially_de.html b/core/src/main/resources/hudson/matrix/DefaultMatrixExecutionStrategyImpl/help-runSequentially_de.html deleted file mode 100644 index e0636e22cb..0000000000 --- a/core/src/main/resources/hudson/matrix/DefaultMatrixExecutionStrategyImpl/help-runSequentially_de.html +++ /dev/null @@ -1,6 +0,0 @@ -
                      - Wenn angewählt, baut Jenkins alle Konfigurationen sequentiell nacheinander. - Dies kann zum einen nützlich sein, wenn Konfigurationen eine gemeinsame Ressource - benötigen, z.B. eine Datenbank. Zum anderen vermeidet es die Verdrängung - anderer Jobs in der Build-Warteschlange. -
                      diff --git a/core/src/main/resources/hudson/matrix/DefaultMatrixExecutionStrategyImpl/help-runSequentially_ja.html b/core/src/main/resources/hudson/matrix/DefaultMatrixExecutionStrategyImpl/help-runSequentially_ja.html deleted file mode 100644 index 9304375819..0000000000 --- a/core/src/main/resources/hudson/matrix/DefaultMatrixExecutionStrategyImpl/help-runSequentially_ja.html +++ /dev/null @@ -1,4 +0,0 @@ -
                      - 各設定を順番にビルドします。これは、(複数ジョブが同時にビルドされることにより)他のジョブがビルドされないことを防ぐとともに、 - データベースのような共有リソースへのアクセスを必要とする場合に役に立ちます。 -
                      \ No newline at end of file diff --git a/core/src/main/resources/hudson/matrix/DefaultMatrixExecutionStrategyImpl/help-runSequentially_zh_TW.html b/core/src/main/resources/hudson/matrix/DefaultMatrixExecutionStrategyImpl/help-runSequentially_zh_TW.html deleted file mode 100644 index 3e92ef1b47..0000000000 --- a/core/src/main/resources/hudson/matrix/DefaultMatrixExecutionStrategyImpl/help-runSequentially_zh_TW.html +++ /dev/null @@ -1,4 +0,0 @@ -
                      - 選用本功能時,Jenkins 會依序建置各種不同的設定。 - 如果您的設定需要存取資料庫這類共用資料時就很好用,此外,也能避免排擠掉其他作業。 -
                      diff --git a/core/src/main/resources/hudson/matrix/JDKAxis/config.jelly b/core/src/main/resources/hudson/matrix/JDKAxis/config.jelly deleted file mode 100644 index 767862c290..0000000000 --- a/core/src/main/resources/hudson/matrix/JDKAxis/config.jelly +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - - diff --git a/core/src/main/resources/hudson/matrix/LabelAxis/config.jelly b/core/src/main/resources/hudson/matrix/LabelAxis/config.jelly deleted file mode 100644 index 28804d7f79..0000000000 --- a/core/src/main/resources/hudson/matrix/LabelAxis/config.jelly +++ /dev/null @@ -1,66 +0,0 @@ - - - - - - - -
                      - - - diff --git a/core/src/main/resources/hudson/matrix/LabelAxis/config_da.properties b/core/src/main/resources/hudson/matrix/LabelAxis/config_da.properties deleted file mode 100644 index bf0e83943c..0000000000 --- a/core/src/main/resources/hudson/matrix/LabelAxis/config_da.properties +++ /dev/null @@ -1,26 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2010, Sun Microsystems, Inc. Kohsuke Kawaguchi. Knud Poulsen. -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Node/Label=Node/Etiket -Labels=Etiketter -Individual\ nodes=Individuelle noder -Name=Navn diff --git a/core/src/main/resources/hudson/matrix/LabelAxis/config_de.properties b/core/src/main/resources/hudson/matrix/LabelAxis/config_de.properties deleted file mode 100644 index 4536049968..0000000000 --- a/core/src/main/resources/hudson/matrix/LabelAxis/config_de.properties +++ /dev/null @@ -1,26 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributers -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Node/Label=Knoten/Label -Labels=Labels -Individual\ nodes=Einzelne Knoten -Name=Name diff --git a/core/src/main/resources/hudson/matrix/LabelAxis/config_es.properties b/core/src/main/resources/hudson/matrix/LabelAxis/config_es.properties deleted file mode 100644 index e12d7ab16f..0000000000 --- a/core/src/main/resources/hudson/matrix/LabelAxis/config_es.properties +++ /dev/null @@ -1,26 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributers -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Node/Label=Nodo/Etiqueta -Labels=Etiquetas -Individual\ nodes=Nodos individuales -Name=Nombre diff --git a/core/src/main/resources/hudson/matrix/LabelAxis/config_ja.properties b/core/src/main/resources/hudson/matrix/LabelAxis/config_ja.properties deleted file mode 100644 index 7d3dc298e0..0000000000 --- a/core/src/main/resources/hudson/matrix/LabelAxis/config_ja.properties +++ /dev/null @@ -1,26 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2010, Sun Microsystems, Inc., Seiji Sogabe -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Name=\u540d\u524d -Node/Label=\u30ce\u30fc\u30c9/\u30e9\u30d9\u30eb -Labels=\u30e9\u30d9\u30eb -Individual\ nodes=\u500b\u5225\u306e\u30ce\u30fc\u30c9 \ No newline at end of file diff --git a/core/src/main/resources/hudson/matrix/LabelAxis/config_pt.properties b/core/src/main/resources/hudson/matrix/LabelAxis/config_pt.properties deleted file mode 100644 index 2f8a88768e..0000000000 --- a/core/src/main/resources/hudson/matrix/LabelAxis/config_pt.properties +++ /dev/null @@ -1,27 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributers -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Node/Label=N\u00f3 -Labels=Label -Individual\ nodes=N\u00f3s individuais -Name=Nome - diff --git a/core/src/main/resources/hudson/matrix/LabelAxis/config_zh_TW.properties b/core/src/main/resources/hudson/matrix/LabelAxis/config_zh_TW.properties deleted file mode 100644 index 074c7b5e0a..0000000000 --- a/core/src/main/resources/hudson/matrix/LabelAxis/config_zh_TW.properties +++ /dev/null @@ -1,26 +0,0 @@ -# The MIT License -# -# Copyright (c) 2013, Chunghwa Telecom Co., Ltd., Pei-Tang Huang -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Name=\u540d\u7a31 -Node/Label=\u7bc0\u9ede/\u6a19\u7c64 -Labels=\u6a19\u7c64 -Individual\ nodes=\u7368\u7acb\u7bc0\u9ede diff --git a/core/src/main/resources/hudson/matrix/LabelAxis/help-labels.html b/core/src/main/resources/hudson/matrix/LabelAxis/help-labels.html deleted file mode 100644 index 48c43aaa2d..0000000000 --- a/core/src/main/resources/hudson/matrix/LabelAxis/help-labels.html +++ /dev/null @@ -1,27 +0,0 @@ -
                      - Specify nodes where builds are performed. - -
                        -
                      • - If none is selected, Jenkins will choose - an available node to perform a build (this is the same behavior as the free-style - project when "tie this project to node" is not selected). This is useful - when the project doesn't have a dependency on any particular node, as - it allows Jenkins to utilize nodes in an optimal fashion. -
                      • - If one is selected, Jenkins will always run the build on the specified node - (if you select one from "individual nodes") - or one of the nodes that belongs to the label (if you select one from "labels"). - This is useful when the build is required to run on a specific computer, - or a subset of computers. For example, maybe your build requires MacOS X. -
                      • - If multiple values are selected, the configuration matrix will be expanded to include - all of them, and builds will be performed on all of the selected nodes/labels. - This is useful, for example, when you'd like to run tests on Windows, Linux, - and Solaris. -
                      - -
                      - During a build, the selected node name / label name for the given run is available as the "label" axis. - See the help of "axes" below for more information about how to access the axis value. -
                      diff --git a/core/src/main/resources/hudson/matrix/LabelAxis/help-labels_de.html b/core/src/main/resources/hudson/matrix/LabelAxis/help-labels_de.html deleted file mode 100644 index be40b813e0..0000000000 --- a/core/src/main/resources/hudson/matrix/LabelAxis/help-labels_de.html +++ /dev/null @@ -1,30 +0,0 @@ -
                      - Geben Sie die Knoten an, auf denen Ihre Builds ausgeführt werden sollen. -
                        -
                      • - Ist kein Knoten ausgewählt, wird Jenkins einen verfügbaren Knoten auswählen, - um den Build durchzuführen (dies ist das gleiche Verhalten wie beim - "Free-Style-Projekt", wenn "Projekt an Knoten binden" abgewählt ist). - Dies ist sinnvoll, wenn das Projekt keine Abhängigkeiten zu einem bestimmten - Knoten aufweist, da es Jenkins erlaubt, die Knoten optimal einzusetzen. -
                      • - Ist ein Knoten ausgewählt, wird Jenkins den Build immer auf dem gewählten Knoten - (wenn ein Knoten unter "Bestimmte Knoten" ausgewählt wurde) oder auf einem Knoten, - der zum gewählten Label gehört (wenn ein Knoten unter "Labels" ausgewählt wurde), ausführen. - Dies ist sinnvoll, wenn der Build auf einem bestimmten Rechner oder - Rechnergruppe ausgeführt werden soll. Beispielsweise könnte der Build ein - bestimmtes Betriebssystem wie MacOS X voraussetzen. -
                      • - Sind mehrere Knoten ausgewählt, wird die Konfigurationsmatrix so erweitert, - dass sie alle Werte beinhaltet. Builds werden dann auf allen gewählten Knoten/Labels - ausgeführt. - Dies ist sinnvoll, wenn Sie beispielsweise Tests unter Windows, Linux und - Solaris ausführen möchten. -
                      - -
                      - Während eines Builds ist der aktuelle Name des Knotens bzw. des Labels als Achse - label sichtbar. - Im Hilfetext zu "Achsen" finden Sie weitere Informationen, wie Sie auf die - Werte der Achsenvariablen zugreifen können. -
                      diff --git a/core/src/main/resources/hudson/matrix/LabelAxis/help-labels_fr.html b/core/src/main/resources/hudson/matrix/LabelAxis/help-labels_fr.html deleted file mode 100644 index c984516190..0000000000 --- a/core/src/main/resources/hudson/matrix/LabelAxis/help-labels_fr.html +++ /dev/null @@ -1,34 +0,0 @@ -
                      - Spécifiez ici les machines (noeuds) sur lesquelles les builds sont - exécutés. - -
                        -
                      • - Si aucune n'est sélectionnée, Jenkins choisira une des machines - disponibles pour l'exécution du build (ce comportement est le même - pour les projets free-style quand l'option "attacher ce projet au - noeud" n'est pas sélectionnée). C'est utile quand le projet n'a - pas de dépendance avec une machine particulière; Jenkins peut en effet - ainsi utiliser les noeuds de façon optimale. -
                      • - Si une machine est sélectionnée, Jenkins lancera toujours le build - dessus (si vous en sélectionnez une parmi les "noeuds spécifiques") - ou sur une des machines qui appartiennent à un libellé (si vous - en choisissez une dans "libellé"). - C'est pratique quand le build doit tourner sur un ordinateur - particulier ou sur un sous-ensemble d'ordinateurs. Par exemple, - si votre build nécessite MacOS X. -
                      • - Si de multiples valeurs sont sélectionnées, la matrice de - configuration sera étendue de façon à les inclure toutes et les - builds seront exécutés sur tous les noeuds ou libellés. - Cela est utile, par exemple, quand vous souhaitez lancer des tests - sur Windows, Linux et Solaris. -
                      - -
                      - Au cours d'un build, le nom du noeud ou du libellé sélectionné pour un - lancement donné est visible sous l'axe "libellé". - Référez-vous à l'aide sur les "axes" ci-dessous pour plus d'informations - sur l'accès à la valeur de l'axe. -
                      diff --git a/core/src/main/resources/hudson/matrix/LabelAxis/help-labels_ja.html b/core/src/main/resources/hudson/matrix/LabelAxis/help-labels_ja.html deleted file mode 100644 index 0c06b8a835..0000000000 --- a/core/src/main/resources/hudson/matrix/LabelAxis/help-labels_ja.html +++ /dev/null @@ -1,23 +0,0 @@ -
                      - ビルドを実行するノードを選択します。 - -
                        -
                      • - ノードを選択すると、Jenkinsはビルドを実行可能なノードを選択します(この動作は、 - "このビルドは指定のノード上でのみ実行"を選択していない場合のフリースタイルと同じです)。 - プロジェクトが特定のノードに依存していないとき、Jenkinsはノードを最適な方法で利用できるので、 - 便利です。 -
                      • - 1つだけ選択すると、Jenkinsはビルドを、指定されたノード("個別のノード"から1つ選択)か、 - ラベルに属する複数ノードのうちの1つのノード("ラベル"から1つ選択)で実行します。 - これは、ビルドを特定のコンピューターやコンピューターのセットで動かす必要がある場合に便利です。 - 例えば、ビルドにMacOS Xが必要な場合など。 -
                      • - 複数の値を選択すると、構成マトリックスはそれらを含むように拡張され、 - ビルドは選択したノードもしくはラベルで実行されます。例えば、Windows、LinuxおよびSolarisでテストをしたい場合に便利です。 -
                      - -
                      - 選択したノード名やラベル名は、ビルド実行中には、"label"という軸として利用可能です。 - 軸の値のアクセス方法の詳細については、"構成軸"のヘルプを参照してください。 -
                      diff --git a/core/src/main/resources/hudson/matrix/LabelAxis/help-labels_nl.html b/core/src/main/resources/hudson/matrix/LabelAxis/help-labels_nl.html deleted file mode 100644 index 72c5676226..0000000000 --- a/core/src/main/resources/hudson/matrix/LabelAxis/help-labels_nl.html +++ /dev/null @@ -1,15 +0,0 @@ -
                      - Geef de nodes, waar uw bouwpoging uitgevoerd wordt, op. -
                        -
                      • - Indien niet opgegeven, zal Jenkins een beschikbare node kiezen voor het uitvoeren van uw bouwpoging.(Dit is hetzelfde gedrag als voor een project vrije stijl, indien niet vast aan een welbepaalde node voor uitvoering toegewezen.) Dit is handig indien uw projecten geen specifieke afhankelijkheden naar een welbepaalde node hebben. Het stelt Jenkins in staat om zijn nodes op een optimale manier te benutten. -
                      • - Indien U wel een node selecteert, zal Jenkins uw bouwpogingen altijd op de opgegeven node uitvoeren. Op eenzelfde manier zal Jenkins ervoor zorgen dat uw pogingen altijd op ��n node van een groep nodes zal uitgevoerd worden, indien u een groepslabel gekozen hebt. Dit is natuurlijk hoogst nuttig indien bepaalde van uw projecten op een welbepaalde node of soort node uitgevoerd dienen te worden. Bvb. indien sommige van uw projecten op windows, Mac Os, linux,.... uitgevoerd moeten worden. -
                      • - Indien U meerdere waarden selecteert, wordt de configuratiematrix zo opgesteld, dat uw bouwpogingen op alle geselecteerde nodes en/of groepen uitgevoerd wordt. Dit is handig indien je projecten hebt die op meerdere platformen gebouwd moeten worden. Denk maar aan applicaties die ontwikkeld worden voor zowel Linux, Mac OS, Solaris als Windows. -
                      - -
                      - Tijdens een bouwpoging, is de naam van de node of nodegroep, waarop de bouwpoging plaatsvindt, beschikbaar onder de "label" dimensie. - Zie de beschikbare hulppaginas over dimensies indien U meer te weten wenst te komen over de dimensies van een matrixproject. -
                      diff --git a/core/src/main/resources/hudson/matrix/LabelAxis/help-labels_pt_BR.html b/core/src/main/resources/hudson/matrix/LabelAxis/help-labels_pt_BR.html deleted file mode 100644 index 148a6aa1ea..0000000000 --- a/core/src/main/resources/hudson/matrix/LabelAxis/help-labels_pt_BR.html +++ /dev/null @@ -1,27 +0,0 @@ -
                      - Especifica os nós onde as construções serão executadas. - -
                        -
                      • - Se nenhum for selecionado, Jenkins escolherá - um nó disponível para executar uma construção (este é o mesmo comportamento do projeto - estilo-livre quando "amarrar este projeto ao nó" não estiver selecionado). Isto é útil - quando o projeto não tem dependência em nenhum nó particular, assim - ele permite ao Jenkins utilizar nós em uma forma ótima. -
                      • - Se um for selecionado, Jenkins sempre executará a construção no nó especificado - (se você selecionar um de "nós específicos") - ou um dos nós que pertencem ao label (se você selecionar um de "label"). - Isto é útil quando for necessário que a construção execute em um computador específico, - ou em um subconjunto de computadores. Por exemplo, talvez sua construção necessite de um MacOS X. -
                      • - Se valores múltiplos forem selecionados, a matriz de configuração será expandida para incluir - todos eles, e as construçõs serão executadas em todos os nós/labels selecionandos. - Isto é últi, por exemplo, quando você quiser executar testes em Windows, Linux, - e Solaris. -
                      - -
                      - Durante uma construção, o nome do nó/label selecionado está disponível como o eixo "label". - Veja a ajuda de "eixos" abaixo para mais informações sobre como acessar o valor do eixo. -
                      diff --git a/core/src/main/resources/hudson/matrix/LabelAxis/help-labels_ru.html b/core/src/main/resources/hudson/matrix/LabelAxis/help-labels_ru.html deleted file mode 100644 index 7ff0fb70e4..0000000000 --- a/core/src/main/resources/hudson/matrix/LabelAxis/help-labels_ru.html +++ /dev/null @@ -1,28 +0,0 @@ -
                      - Выберите узлы, на которых будет производиться сборка. - -
                        -
                      • - Если ничего не выбрано, Jenkins сам выберет доступный узел для выполнения сборки - (такое же поведение как и в случае проекта в свободной форме (free-style), когда - опция "Привязать проект к узлу" не включена). Это полезно когда проект не имеет - зависимости от конкретного узла и позволяет системе использовать узлы оптимальным - образом. -
                      • - Если выбран один узел, то Jenkins всегда будет выполнять сборку только на указанном - узле (если вы выбрали один из конкретных узлов), либо один из узлов с указанной меткой - (если вы выбрали одну из "Меток"). - Это может быть полезно в случае, если сборка должна быть запущена на конкретном - узле или наборе узлов. Например, возможно, ваша сборка требует MacOS X. -
                      • - Если выбрано несколько значений, конфигурационная матрица будет расширена для - включения их всех и сборки будут производиться на всех выбранных узлах/метках. - Это может быть удобно, если ваш проект собирается либо тестируется на Windows, - Linux и Solaris. -
                      - -
                      - В процессе сборки выбранное имя узла/метки доступно как ось "labels". - Смотрите в подсказку к опции "Оси (axes)" ниже для получения более подробной информации о том как - получить значения по осям. -
                      diff --git a/core/src/main/resources/hudson/matrix/LabelAxis/help-labels_tr.html b/core/src/main/resources/hudson/matrix/LabelAxis/help-labels_tr.html deleted file mode 100644 index 67350cb5b9..0000000000 --- a/core/src/main/resources/hudson/matrix/LabelAxis/help-labels_tr.html +++ /dev/null @@ -1,26 +0,0 @@ -
                      - Yapılandırmaların çalıştırılacağı nodları belirleyiniz. - -
                        -
                      • - Herhangi bir seçim yapılmaz ise, Jenkins yapılandırma için uygun bir nod seçecektir - (Aynı serbest-stil projede "bu projeyi bir noda bağla" seçeneğinin seçilmediği durumdaki gibi) - Eğer projenizin herhangi bir noda bağımlılığı yoksa Jenkins - nodları uygun biçimde değerlendirerek size en uygun durumu sağlayacaktır. -
                      • - Eğer bir tane seçilirse, Jenkins yapılandırmayı daima seçilen nodda - ("belirli nodlar"dan birisi seçilirse) - veya etikete dahil olan nodlardan bir tanesinde (eğer "etiket"ten bir tane seçilirse) çalıştıracaktır. - Bu seçenek, yapılandırma eğer belli bir bilgisayar veya bilgisayarlar kümesinde çalıştırılacak ise - faydalı olacaktır. Mesela, yapılandırmanızın MacOS X üzerinde çalışması gerekebilir. -
                      • - Eğer birden fazla değer seçilirse, konfigürasyon matrisi hepsini kapsayacak şekilde genişletilir, - ve yapılandırmalar seçilen tüm nodlar/etiketler üzerinde çalıştırılır. - Bu seçenek, mesela testlerinizi Windows, Linux ve Solaris üzerinde çalıştırmak istediğinizde - faydalı olacaktır. -
                      - -
                      - Yapılandırma esnasında, seçilen nod adı / etiket adı "etiket" ekseninde görüntülenecektir. - Eksen değerlerine nasıl erişileceğine dair daha fazla bilgi için, aşağıda "eksenler" ile ilgili yardım kısmına bakınız. -
                      diff --git a/core/src/main/resources/hudson/matrix/LabelAxis/help-labels_zh_TW.html b/core/src/main/resources/hudson/matrix/LabelAxis/help-labels_zh_TW.html deleted file mode 100644 index 0c8bcc3ccd..0000000000 --- a/core/src/main/resources/hudson/matrix/LabelAxis/help-labels_zh_TW.html +++ /dev/null @@ -1,21 +0,0 @@ -
                      - 指定建置用的節點。 - -
                        -
                      • - 如果沒有選取任何節點,Jenkins 會自動挑一個節點來建置 - (行為模式就像是沒有使用「限定建置節點」的 Free-Style 專案)。 - 如果專案不一定要在哪些節點上才能建置,使用這個方式可以讓 Jenkins 充分利用每個節點。 -
                      • - 如果選定某個節點,Jenkins 就只會在那個節點上建置 (假設您是在「獨立節點」中挑出來的), - 或是在指定標籤中的任何一個節點上建置 (假如您是由「標籤」中選的)。 - 這種設定方式很適合只能在特定電腦上執行的建置作業。例如,一定要 MacOS X 才能建置的東西。 -
                      • - 如果選取了一個以上的值,設定矩陣會將所有指定的項目納入展開,所有牽涉到的節點或標籤都會建置。 - 舉例來說,如果您想在 Windows, Linux 及 Solaris 上面都執行測試的話,這一招就很有用。 -
                      - -
                      - 建置時的節點或標籤名稱會顯示在「標籤」軸線上。 - 參考下方「座標軸」的說明,可以知道怎麼看座標值。 -
                      diff --git a/core/src/main/resources/hudson/matrix/LabelAxis/help.html b/core/src/main/resources/hudson/matrix/LabelAxis/help.html deleted file mode 100644 index ae767d7634..0000000000 --- a/core/src/main/resources/hudson/matrix/LabelAxis/help.html +++ /dev/null @@ -1,5 +0,0 @@ -
                      - This axis lets you run the same build on multiple slaves (by specifying those slaves either by their labels - or their individual names.) This is useful for example to cross-compile your C projects on multiple platforms, - testing your Java projects on different OSes, and so on. -
                      \ No newline at end of file diff --git a/core/src/main/resources/hudson/matrix/LabelAxis/help_zh_TW.html b/core/src/main/resources/hudson/matrix/LabelAxis/help_zh_TW.html deleted file mode 100644 index 0dfdde3c0d..0000000000 --- a/core/src/main/resources/hudson/matrix/LabelAxis/help_zh_TW.html +++ /dev/null @@ -1,4 +0,0 @@ -
                      - 可以在不同 Slave 上建置作業的軸線 (可以依照標籤或是獨立名稱指定 Slave)。 - 舉例來說,可以很方便的讓您在不同平台上編譯 C 專案,也可以在不同作業系統上測試 Java 專案。 -
                      \ No newline at end of file diff --git a/core/src/main/resources/hudson/matrix/LabelExpAxis/config.jelly b/core/src/main/resources/hudson/matrix/LabelExpAxis/config.jelly deleted file mode 100644 index 0d927b4300..0000000000 --- a/core/src/main/resources/hudson/matrix/LabelExpAxis/config.jelly +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - diff --git a/core/src/main/resources/hudson/matrix/LabelExpAxis/config_es.properties b/core/src/main/resources/hudson/matrix/LabelExpAxis/config_es.properties deleted file mode 100644 index 7331faddf9..0000000000 --- a/core/src/main/resources/hudson/matrix/LabelExpAxis/config_es.properties +++ /dev/null @@ -1,24 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributers -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Label\ Expressions=Expresiones -Name=Nombre diff --git a/core/src/main/resources/hudson/matrix/LabelExpAxis/config_ja.properties b/core/src/main/resources/hudson/matrix/LabelExpAxis/config_ja.properties deleted file mode 100644 index c4c53cd39c..0000000000 --- a/core/src/main/resources/hudson/matrix/LabelExpAxis/config_ja.properties +++ /dev/null @@ -1,25 +0,0 @@ -# The MIT License -# -# Copyright (c) 2011, Seiji Sogabe -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Name=\u540d\u524d -Label\ Expressions=\u30e9\u30d9\u30eb\u5f0f - diff --git a/core/src/main/resources/hudson/matrix/LabelExpAxis/config_pt.properties b/core/src/main/resources/hudson/matrix/LabelExpAxis/config_pt.properties deleted file mode 100644 index f29f1d0e15..0000000000 --- a/core/src/main/resources/hudson/matrix/LabelExpAxis/config_pt.properties +++ /dev/null @@ -1,25 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributers -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Label\ Expressions=Express\u00f5es -Name=Nome - diff --git a/core/src/main/resources/hudson/matrix/LabelExpAxis/config_zh_TW.properties b/core/src/main/resources/hudson/matrix/LabelExpAxis/config_zh_TW.properties deleted file mode 100644 index b4a9ecc9a0..0000000000 --- a/core/src/main/resources/hudson/matrix/LabelExpAxis/config_zh_TW.properties +++ /dev/null @@ -1,24 +0,0 @@ -# The MIT License -# -# Copyright (c) 2013, Chunghwa Telecom Co., Ltd., Pei-Tang Huang -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Name=\u540d\u7a31 -Label\ Expressions=\u6a19\u7c64\u8868\u793a\u5f0f diff --git a/core/src/main/resources/hudson/matrix/LabelExpAxis/help-labelExpr.html b/core/src/main/resources/hudson/matrix/LabelExpAxis/help-labelExpr.html deleted file mode 100644 index 140931ba74..0000000000 --- a/core/src/main/resources/hudson/matrix/LabelExpAxis/help-labelExpr.html +++ /dev/null @@ -1,4 +0,0 @@ -
                      -This is similar to "Slave" axis, but you can use label expressions, not just plain label names. -Each line represents one label expression (i.e. one value of this axis). -
                      \ No newline at end of file diff --git a/core/src/main/resources/hudson/matrix/LabelExpAxis/help-labelExpr_ja.html b/core/src/main/resources/hudson/matrix/LabelExpAxis/help-labelExpr_ja.html deleted file mode 100644 index fb599d39ad..0000000000 --- a/core/src/main/resources/hudson/matrix/LabelExpAxis/help-labelExpr_ja.html +++ /dev/null @@ -1,4 +0,0 @@ -
                      - "スレーブ"の軸と同様ですが、単なるラベル名だけでなくラベル式を使用することができます。 - 1行が1つのラベル式を表します(この軸の値)。 -
                      \ No newline at end of file diff --git a/core/src/main/resources/hudson/matrix/LabelExpAxis/help-labelExpr_zh_TW.html b/core/src/main/resources/hudson/matrix/LabelExpAxis/help-labelExpr_zh_TW.html deleted file mode 100644 index ae6aebdfde..0000000000 --- a/core/src/main/resources/hudson/matrix/LabelExpAxis/help-labelExpr_zh_TW.html +++ /dev/null @@ -1,4 +0,0 @@ -
                      -很像「Slave」軸,不過除了使用標籤名稱之外,您還可以用標籤表示式。 -一行代表一個表示式 (同時也是對應到軸線上的一個值)。 -
                      \ No newline at end of file diff --git a/core/src/main/resources/hudson/matrix/LabelExpAxis/help.html b/core/src/main/resources/hudson/matrix/LabelExpAxis/help.html deleted file mode 100644 index 3c6f14ff94..0000000000 --- a/core/src/main/resources/hudson/matrix/LabelExpAxis/help.html +++ /dev/null @@ -1,4 +0,0 @@ -
                      - This axis lets you run the same build on multiple slaves (much like the "slaves" axis), - but this is more advanced in that it lets you use boolean expressions (such as foo&&bar) -
                      \ No newline at end of file diff --git a/core/src/main/resources/hudson/matrix/LabelExpAxis/help_ja.html b/core/src/main/resources/hudson/matrix/LabelExpAxis/help_ja.html deleted file mode 100644 index 22bd530299..0000000000 --- a/core/src/main/resources/hudson/matrix/LabelExpAxis/help_ja.html +++ /dev/null @@ -1,4 +0,0 @@ -
                      - この軸は、同一のビルドを複数のスレーブで実行することができます("スレーブ"の軸と同様に)。 - しかし、論理式(例 foo&&bar)を使用できる点でより便利になっています。  -
                      \ No newline at end of file diff --git a/core/src/main/resources/hudson/matrix/LabelExpAxis/help_zh_TW.html b/core/src/main/resources/hudson/matrix/LabelExpAxis/help_zh_TW.html deleted file mode 100644 index fa2d523e59..0000000000 --- a/core/src/main/resources/hudson/matrix/LabelExpAxis/help_zh_TW.html +++ /dev/null @@ -1,4 +0,0 @@ -
                      - 可以在多個節點上面執行相同建置的軸線。 - 很像「Slave」軸,但更進階。您可以用布林表示式 (例如 foo&&bar)。 -
                      \ No newline at end of file diff --git a/core/src/main/resources/hudson/matrix/MatrixBuild/ajaxMatrix.jelly b/core/src/main/resources/hudson/matrix/MatrixBuild/ajaxMatrix.jelly deleted file mode 100644 index 42cb3e534d..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixBuild/ajaxMatrix.jelly +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - ${%Not run} - - - - ${p.tooltip} - - ${p.combination.toString(o.z)} - - - - - - - diff --git a/core/src/main/resources/hudson/matrix/MatrixBuild/ajaxMatrix_da.properties b/core/src/main/resources/hudson/matrix/MatrixBuild/ajaxMatrix_da.properties deleted file mode 100644 index 9d5c0d78b2..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixBuild/ajaxMatrix_da.properties +++ /dev/null @@ -1,23 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2010, Sun Microsystems, Inc. Kohsuke Kawaguchi. Knud Poulsen. -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Not\ run=Ikke k\u00f8rt diff --git a/core/src/main/resources/hudson/matrix/MatrixBuild/ajaxMatrix_de.properties b/core/src/main/resources/hudson/matrix/MatrixBuild/ajaxMatrix_de.properties deleted file mode 100644 index 0b34ad1f34..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixBuild/ajaxMatrix_de.properties +++ /dev/null @@ -1 +0,0 @@ -Not\ run=Nicht gelaufen diff --git a/core/src/main/resources/hudson/matrix/MatrixBuild/ajaxMatrix_es.properties b/core/src/main/resources/hudson/matrix/MatrixBuild/ajaxMatrix_es.properties deleted file mode 100644 index 5796368ce8..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixBuild/ajaxMatrix_es.properties +++ /dev/null @@ -1,23 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2010, Sun Microsystems, Inc. -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Not\ run=No ejecutar diff --git a/core/src/main/resources/hudson/matrix/MatrixBuild/ajaxMatrix_fr.properties b/core/src/main/resources/hudson/matrix/MatrixBuild/ajaxMatrix_fr.properties deleted file mode 100644 index c69d14d921..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixBuild/ajaxMatrix_fr.properties +++ /dev/null @@ -1,23 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Eric Lefevre-Ardant -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Not\ run=Non lanc\u00e9 diff --git a/core/src/main/resources/hudson/matrix/MatrixBuild/ajaxMatrix_it.properties b/core/src/main/resources/hudson/matrix/MatrixBuild/ajaxMatrix_it.properties deleted file mode 100644 index 6e9c3ea6d9..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixBuild/ajaxMatrix_it.properties +++ /dev/null @@ -1,23 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2010, Sun Microsystems, Inc. -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Not\ run=Non eseguito diff --git a/core/src/main/resources/hudson/matrix/MatrixBuild/ajaxMatrix_ja.properties b/core/src/main/resources/hudson/matrix/MatrixBuild/ajaxMatrix_ja.properties deleted file mode 100644 index 78f16d75f9..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixBuild/ajaxMatrix_ja.properties +++ /dev/null @@ -1,23 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2010, Sun Microsystems, Inc., Seiji Sogabe -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Not\ run=\u672A\u5B9F\u884C diff --git a/core/src/main/resources/hudson/matrix/MatrixBuild/ajaxMatrix_nl.properties b/core/src/main/resources/hudson/matrix/MatrixBuild/ajaxMatrix_nl.properties deleted file mode 100644 index b9da819d2a..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixBuild/ajaxMatrix_nl.properties +++ /dev/null @@ -1,3 +0,0 @@ -# This file is under the MIT License by authors - -Not\ run=Niet uitgevoerd diff --git a/core/src/main/resources/hudson/matrix/MatrixBuild/ajaxMatrix_pt.properties b/core/src/main/resources/hudson/matrix/MatrixBuild/ajaxMatrix_pt.properties deleted file mode 100644 index e55fc626b1..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixBuild/ajaxMatrix_pt.properties +++ /dev/null @@ -1,23 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributers -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Not\ run=N\u00e3o executado diff --git a/core/src/main/resources/hudson/matrix/MatrixBuild/ajaxMatrix_pt_BR.properties b/core/src/main/resources/hudson/matrix/MatrixBuild/ajaxMatrix_pt_BR.properties deleted file mode 100644 index 31b504904a..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixBuild/ajaxMatrix_pt_BR.properties +++ /dev/null @@ -1,23 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2010, Sun Microsystems, Inc., Cleiber Silva, Fernando Boaglio -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Not\ run= N\u00e3o executar diff --git a/core/src/main/resources/hudson/matrix/MatrixBuild/ajaxMatrix_ru.properties b/core/src/main/resources/hudson/matrix/MatrixBuild/ajaxMatrix_ru.properties deleted file mode 100644 index 7115bf1701..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixBuild/ajaxMatrix_ru.properties +++ /dev/null @@ -1,4 +0,0 @@ -# This file is under the MIT License by authors - -Not\ run=\u0417\u0430\u0434\u0430\u0447\u0430 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u043b\u0430\u0441\u044c - diff --git a/core/src/main/resources/hudson/matrix/MatrixBuild/ajaxMatrix_zh_TW.properties b/core/src/main/resources/hudson/matrix/MatrixBuild/ajaxMatrix_zh_TW.properties deleted file mode 100644 index 27e2b2f8a1..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixBuild/ajaxMatrix_zh_TW.properties +++ /dev/null @@ -1,23 +0,0 @@ -# The MIT License -# -# Copyright (c) 2013, Chunghwa Telecom Co., Ltd., Pei-Tang Huang -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Not\ run=\u672a\u57f7\u884c diff --git a/core/src/main/resources/hudson/matrix/MatrixBuild/confirmDeleteAll.jelly b/core/src/main/resources/hudson/matrix/MatrixBuild/confirmDeleteAll.jelly deleted file mode 100644 index 3ec6f07388..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixBuild/confirmDeleteAll.jelly +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - - - - ${%Warning}: ${%cannotMsg(msg)} - - -
                      - ${%Are you sure about deleting the build and all configurations in this build?} - - -
                      -
                      -
                      -
                      diff --git a/core/src/main/resources/hudson/matrix/MatrixBuild/confirmDeleteAll.properties b/core/src/main/resources/hudson/matrix/MatrixBuild/confirmDeleteAll.properties deleted file mode 100644 index 3b9ef2f58b..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixBuild/confirmDeleteAll.properties +++ /dev/null @@ -1,23 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -cannotMsg=Cannot delete this build: {0} diff --git a/core/src/main/resources/hudson/matrix/MatrixBuild/confirmDeleteAll_de.properties b/core/src/main/resources/hudson/matrix/MatrixBuild/confirmDeleteAll_de.properties deleted file mode 100644 index c5c0c8d516..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixBuild/confirmDeleteAll_de.properties +++ /dev/null @@ -1,25 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2012, Frederic Gurr -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Warning=Warnung -Are\ you\ sure\ about\ deleting\ the\ build\ and\ all\ configurations\ in\ this\ build?=Sollen dieses Build und alle Konfigurationen dieses Builds wirklich gelöscht werden? -Yes=Ja diff --git a/core/src/main/resources/hudson/matrix/MatrixBuild/confirmDeleteAll_es.properties b/core/src/main/resources/hudson/matrix/MatrixBuild/confirmDeleteAll_es.properties deleted file mode 100644 index fc5e5e1e2e..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixBuild/confirmDeleteAll_es.properties +++ /dev/null @@ -1,26 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributers -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Yes=Sí -cannotMsg=No se puede -Warning=Atención -Are\ you\ sure\ about\ deleting\ the\ build\ and\ all\ configurations\ in\ this\ build?=¿Estás seguro de querer borrar esta ejecución y toda su configuración? diff --git a/core/src/main/resources/hudson/matrix/MatrixBuild/confirmDeleteAll_ja.properties b/core/src/main/resources/hudson/matrix/MatrixBuild/confirmDeleteAll_ja.properties deleted file mode 100644 index d529392c2b..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixBuild/confirmDeleteAll_ja.properties +++ /dev/null @@ -1,27 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2013, Seiji Sogabe -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Warning=\u8b66\u544a -Are\ you\ sure\ about\ deleting\ the\ build\ and\ all\ configurations\ in\ this\ build?=\ - \u30d3\u30eb\u30c9\u3068\u3059\u3079\u3066\u306e\u8a2d\u5b9a\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -Yes=\u306f\u3044 -cannotMsg=\u3053\u306e\u30d3\u30eb\u30c9: {0} \u306f\u524a\u9664\u3067\u304d\u307e\u305b\u3093\u3002 \ No newline at end of file diff --git a/core/src/main/resources/hudson/matrix/MatrixBuild/confirmDeleteAll_pt.properties b/core/src/main/resources/hudson/matrix/MatrixBuild/confirmDeleteAll_pt.properties deleted file mode 100644 index b9c7673ac8..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixBuild/confirmDeleteAll_pt.properties +++ /dev/null @@ -1,27 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributers -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -cannotMsg=N\u00e3o foi poss\u00edvel remover esse build: {0} -Are\ you\ sure\ about\ deleting\ the\ build\ and\ all\ configurations\ in\ this\ build?=Tem certeza que deseja remover esse build e todas suas configura\u00e7\u00f5es ? -Yes=Sim -Warning=Aviso - diff --git a/core/src/main/resources/hudson/matrix/MatrixBuild/confirmDeleteAll_ru.properties b/core/src/main/resources/hudson/matrix/MatrixBuild/confirmDeleteAll_ru.properties deleted file mode 100644 index 6d3fcfc888..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixBuild/confirmDeleteAll_ru.properties +++ /dev/null @@ -1,4 +0,0 @@ -# This file is under the MIT License by authors - -Are\ you\ sure\ about\ deleting\ the\ build\ and\ all\ configurations\ in\ this\ build?=\u0412\u044B \u0443\u0432\u0435\u0440\u0435\u043D\u044B, \u0447\u0442\u043E \u0445\u043E\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043B\u0438\u0442\u044C \u0441\u0431\u043E\u0440\u043A\u0443 \u0438 \u0432\u0441\u0435 \u043A\u043E\u043D\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438? -Yes=\u0414\u0430 diff --git a/core/src/main/resources/hudson/matrix/MatrixBuild/confirmDeleteAll_zh_TW.properties b/core/src/main/resources/hudson/matrix/MatrixBuild/confirmDeleteAll_zh_TW.properties deleted file mode 100644 index 3eab311eb3..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixBuild/confirmDeleteAll_zh_TW.properties +++ /dev/null @@ -1,25 +0,0 @@ -# The MIT License -# -# Copyright (c) 2013, Chunghwa Telecom Co., Ltd., Pei-Tang Huang -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Warning=\u8b66\u544a -Are\ you\ sure\ about\ deleting\ the\ build\ and\ all\ configurations\ in\ this\ build?=\u60a8\u78ba\u5b9a\u8981\u522a\u9664\u5efa\u7f6e\u8ddf\u5b83\u6240\u6709\u7684\u8a2d\u5b9a\u55ce? -Yes=\u662f diff --git a/core/src/main/resources/hudson/matrix/MatrixBuild/delete.jelly b/core/src/main/resources/hudson/matrix/MatrixBuild/delete.jelly deleted file mode 100644 index 6d51d1fe1b..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixBuild/delete.jelly +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/core/src/main/resources/hudson/matrix/MatrixBuild/delete_ca.properties b/core/src/main/resources/hudson/matrix/MatrixBuild/delete_ca.properties deleted file mode 100644 index 0428685234..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixBuild/delete_ca.properties +++ /dev/null @@ -1,3 +0,0 @@ -# This file is under the MIT License by authors - -Delete\ Build=Eliminar Build diff --git a/core/src/main/resources/hudson/matrix/MatrixBuild/delete_cs.properties b/core/src/main/resources/hudson/matrix/MatrixBuild/delete_cs.properties deleted file mode 100644 index e90bb13cbc..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixBuild/delete_cs.properties +++ /dev/null @@ -1,4 +0,0 @@ -# This file is under the MIT License by authors - -Delete\ Build=Smazat sestaven\u00ED -Delete\ this\ build\ and\ all\ configurations\ in\ this\ build=Smazat sestaven\u00ED a v\u0161echna jeho nastaven\u00ED diff --git a/core/src/main/resources/hudson/matrix/MatrixBuild/delete_de.properties b/core/src/main/resources/hudson/matrix/MatrixBuild/delete_de.properties deleted file mode 100644 index d1a6bbe1bc..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixBuild/delete_de.properties +++ /dev/null @@ -1,24 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2012, Frederic Gurr -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Delete\ Build=Build löschen -Delete\ this\ build\ and\ all\ configurations\ in\ this\ build=Build und alle Konfigurationen dieses Builds löschen diff --git a/core/src/main/resources/hudson/matrix/MatrixBuild/delete_es.properties b/core/src/main/resources/hudson/matrix/MatrixBuild/delete_es.properties deleted file mode 100644 index c200f138e9..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixBuild/delete_es.properties +++ /dev/null @@ -1,24 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributers -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Delete\ Build=Borrar esta ejecución -Delete\ this\ build\ and\ all\ configurations\ in\ this\ build=Borrar esta ejecución y todas sus configuraciones diff --git a/core/src/main/resources/hudson/matrix/MatrixBuild/delete_ja.properties b/core/src/main/resources/hudson/matrix/MatrixBuild/delete_ja.properties deleted file mode 100644 index 10fefb6fc2..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixBuild/delete_ja.properties +++ /dev/null @@ -1,25 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2012, Seiji Sogabe -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Delete\ Build=\u30d3\u30eb\u30c9\u3092\u524a\u9664 -Delete\ this\ build\ and\ all\ configurations\ in\ this\ build=\ - \u30d3\u30eb\u30c9\u3068\u8a2d\u5b9a\u3092\u524a\u9664 diff --git a/core/src/main/resources/hudson/matrix/MatrixBuild/delete_ko.properties b/core/src/main/resources/hudson/matrix/MatrixBuild/delete_ko.properties deleted file mode 100644 index 3d074ebceb..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixBuild/delete_ko.properties +++ /dev/null @@ -1,4 +0,0 @@ -# This file is under the MIT License by authors - -Delete\ Build=\uBE4C\uB4DC \uC0AD\uC81C -Delete\ this\ build\ and\ all\ configurations\ in\ this\ build=\uC774 \uBE4C\uB4DC\uC640 \uBAA8\uB4E0 \uAD6C\uC131\uC758 \uBE4C\uB4DC\uB4E4\uC744 \uC0AD\uC81C diff --git a/core/src/main/resources/hudson/matrix/MatrixBuild/delete_pl.properties b/core/src/main/resources/hudson/matrix/MatrixBuild/delete_pl.properties deleted file mode 100644 index 61901505f9..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixBuild/delete_pl.properties +++ /dev/null @@ -1,4 +0,0 @@ -# This file is under the MIT License by authors - -Delete\ Build=Usu\u0144 build -Delete\ this\ build\ and\ all\ configurations\ in\ this\ build=Usu\u0144 ten build i wszystkie konfiguracje w nim diff --git a/core/src/main/resources/hudson/matrix/MatrixBuild/delete_pt.properties b/core/src/main/resources/hudson/matrix/MatrixBuild/delete_pt.properties deleted file mode 100644 index 82b53cf884..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixBuild/delete_pt.properties +++ /dev/null @@ -1,25 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributers -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Delete\ Build=Remover build -Delete\ this\ build\ and\ all\ configurations\ in\ this\ build=Remover esse build e todas suas configura\u00e7\u00f5es - diff --git a/core/src/main/resources/hudson/matrix/MatrixBuild/delete_pt_BR.properties b/core/src/main/resources/hudson/matrix/MatrixBuild/delete_pt_BR.properties deleted file mode 100644 index 8bf572dc91..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixBuild/delete_pt_BR.properties +++ /dev/null @@ -1,5 +0,0 @@ -# This file is under the MIT License by authors -# Translated by: Fernando Boaglio - -Delete\ Build=Remover este build -Delete\ this\ build\ and\ all\ configurations\ in\ this\ build=Remover este build e todas as suas configura\u00E7\u00F5es diff --git a/core/src/main/resources/hudson/matrix/MatrixBuild/delete_ru.properties b/core/src/main/resources/hudson/matrix/MatrixBuild/delete_ru.properties deleted file mode 100644 index 3e59e453d2..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixBuild/delete_ru.properties +++ /dev/null @@ -1,4 +0,0 @@ -# This file is under the MIT License by authors - -Delete\ Build=\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u0441\u0431\u043E\u0440\u043A\u0443 -Delete\ this\ build\ and\ all\ configurations\ in\ this\ build=\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u044D\u0442\u0443 \u0441\u0431\u043E\u0440\u043A\u0443 \u0432\u043C\u0435\u0441\u0442\u0435 \u0441\u043E \u0432\u0441\u0435\u043C\u0438 \u0435\u0435 \u043A\u043E\u043D\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044F\u043C\u0438 diff --git a/core/src/main/resources/hudson/matrix/MatrixBuild/delete_zh_CN.properties b/core/src/main/resources/hudson/matrix/MatrixBuild/delete_zh_CN.properties deleted file mode 100644 index d34035439c..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixBuild/delete_zh_CN.properties +++ /dev/null @@ -1,4 +0,0 @@ -# This file is under the MIT License by authors - -Delete\ Build=\u5220\u9664\u6784\u5EFA -Delete\ this\ build\ and\ all\ configurations\ in\ this\ build=\u5220\u9664\u6784\u5EFA\u53CA\u5176\u914D\u7F6E diff --git a/core/src/main/resources/hudson/matrix/MatrixBuild/delete_zh_TW.properties b/core/src/main/resources/hudson/matrix/MatrixBuild/delete_zh_TW.properties deleted file mode 100644 index 9bdbfba97f..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixBuild/delete_zh_TW.properties +++ /dev/null @@ -1,24 +0,0 @@ -# The MIT License -# -# Copyright (c) 2013, Chunghwa Telecom Co., Ltd., Pei-Tang Huang -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Delete\ Build=\u522a\u9664\u5efa\u7f6e -Delete\ this\ build\ and\ all\ configurations\ in\ this\ build=\u522a\u9664\u5efa\u7f6e\u8ddf\u5b83\u6240\u6709\u7684\u8a2d\u5b9a diff --git a/core/src/main/resources/hudson/matrix/MatrixBuild/main.jelly b/core/src/main/resources/hudson/matrix/MatrixBuild/main.jelly deleted file mode 100644 index 1701ef174d..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixBuild/main.jelly +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/core/src/main/resources/hudson/matrix/MatrixConfigurationSorter/config.groovy b/core/src/main/resources/hudson/matrix/MatrixConfigurationSorter/config.groovy deleted file mode 100644 index 39b2321cea..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixConfigurationSorter/config.groovy +++ /dev/null @@ -1 +0,0 @@ -// default is empty \ No newline at end of file diff --git a/core/src/main/resources/hudson/matrix/MatrixProject/ajaxMatrix.jelly b/core/src/main/resources/hudson/matrix/MatrixProject/ajaxMatrix.jelly deleted file mode 100644 index d2cfaf607a..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixProject/ajaxMatrix.jelly +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - - - - ${%Not configured} - - - - ${p.iconColor.description} - - ${p.combination.toString(o.z)} - - - - - - - diff --git a/core/src/main/resources/hudson/matrix/MatrixProject/ajaxMatrix_da.properties b/core/src/main/resources/hudson/matrix/MatrixProject/ajaxMatrix_da.properties deleted file mode 100644 index 9a6b92b5ae..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixProject/ajaxMatrix_da.properties +++ /dev/null @@ -1,23 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2010, Sun Microsystems, Inc. Kohsuke Kawaguchi. Knud Poulsen. -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Not\ configured=Ikke konfigureret diff --git a/core/src/main/resources/hudson/matrix/MatrixProject/ajaxMatrix_de.properties b/core/src/main/resources/hudson/matrix/MatrixProject/ajaxMatrix_de.properties deleted file mode 100644 index 0b7f459d48..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixProject/ajaxMatrix_de.properties +++ /dev/null @@ -1 +0,0 @@ -Not\ configured=Nicht konfiguriert diff --git a/core/src/main/resources/hudson/matrix/MatrixProject/ajaxMatrix_es.properties b/core/src/main/resources/hudson/matrix/MatrixProject/ajaxMatrix_es.properties deleted file mode 100644 index f8e08a24a2..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixProject/ajaxMatrix_es.properties +++ /dev/null @@ -1,23 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2010, Sun Microsystems, Inc. -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Not\ configured=Sin configurar diff --git a/core/src/main/resources/hudson/matrix/MatrixProject/ajaxMatrix_fi.properties b/core/src/main/resources/hudson/matrix/MatrixProject/ajaxMatrix_fi.properties deleted file mode 100644 index 7c70b59bdd..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixProject/ajaxMatrix_fi.properties +++ /dev/null @@ -1,23 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2010, Sun Microsystems, Inc. -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Not\ configured=Ei konfiguroitu diff --git a/core/src/main/resources/hudson/matrix/MatrixProject/ajaxMatrix_fr.properties b/core/src/main/resources/hudson/matrix/MatrixProject/ajaxMatrix_fr.properties deleted file mode 100644 index d973d5dab9..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixProject/ajaxMatrix_fr.properties +++ /dev/null @@ -1,23 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Eric Lefevre-Ardant -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Not\ configured=Non configur\u00E9e diff --git a/core/src/main/resources/hudson/matrix/MatrixProject/ajaxMatrix_it.properties b/core/src/main/resources/hudson/matrix/MatrixProject/ajaxMatrix_it.properties deleted file mode 100644 index 68bbeb093f..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixProject/ajaxMatrix_it.properties +++ /dev/null @@ -1,23 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2010, Sun Microsystems, Inc. -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Not\ configured=Non configurato diff --git a/core/src/main/resources/hudson/matrix/MatrixProject/ajaxMatrix_ja.properties b/core/src/main/resources/hudson/matrix/MatrixProject/ajaxMatrix_ja.properties deleted file mode 100644 index 0ec0e07631..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixProject/ajaxMatrix_ja.properties +++ /dev/null @@ -1,23 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2010, Sun Microsystems, Inc., Seiji Sogabe -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Not\ configured=\u672A\u8A2D\u5B9A diff --git a/core/src/main/resources/hudson/matrix/MatrixProject/ajaxMatrix_pl.properties b/core/src/main/resources/hudson/matrix/MatrixProject/ajaxMatrix_pl.properties deleted file mode 100644 index bf6ce23fbc..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixProject/ajaxMatrix_pl.properties +++ /dev/null @@ -1,23 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2010, Sun Microsystems, Inc. -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Not\ configured=Nie skonfigurowane diff --git a/core/src/main/resources/hudson/matrix/MatrixProject/ajaxMatrix_pt.properties b/core/src/main/resources/hudson/matrix/MatrixProject/ajaxMatrix_pt.properties deleted file mode 100644 index 46252b1ab6..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixProject/ajaxMatrix_pt.properties +++ /dev/null @@ -1,24 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributers -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Not\ configured=N\u00e3o configurado - diff --git a/core/src/main/resources/hudson/matrix/MatrixProject/ajaxMatrix_pt_BR.properties b/core/src/main/resources/hudson/matrix/MatrixProject/ajaxMatrix_pt_BR.properties deleted file mode 100644 index ceb7af3ea3..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixProject/ajaxMatrix_pt_BR.properties +++ /dev/null @@ -1,23 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2010, Sun Microsystems, Inc., Cleiber Silva -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Not\ configured= N\u00e3o configurado diff --git a/core/src/main/resources/hudson/matrix/MatrixProject/ajaxMatrix_ro.properties b/core/src/main/resources/hudson/matrix/MatrixProject/ajaxMatrix_ro.properties deleted file mode 100644 index bcdb4dc200..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixProject/ajaxMatrix_ro.properties +++ /dev/null @@ -1,3 +0,0 @@ -# This file is under the MIT License by authors - -Not\ configured=Neconfigurat diff --git a/core/src/main/resources/hudson/matrix/MatrixProject/ajaxMatrix_ru.properties b/core/src/main/resources/hudson/matrix/MatrixProject/ajaxMatrix_ru.properties deleted file mode 100644 index 8d06417a17..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixProject/ajaxMatrix_ru.properties +++ /dev/null @@ -1,3 +0,0 @@ -# This file is under the MIT License by authors - -Not\ configured=\u041D\u0435 \u0441\u043A\u043E\u043D\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043E\u0432\u0430\u043D\u043E diff --git a/core/src/main/resources/hudson/matrix/MatrixProject/ajaxMatrix_sv_SE.properties b/core/src/main/resources/hudson/matrix/MatrixProject/ajaxMatrix_sv_SE.properties deleted file mode 100644 index 4ad86bb7c0..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixProject/ajaxMatrix_sv_SE.properties +++ /dev/null @@ -1,3 +0,0 @@ -# This file is under the MIT License by authors - -Not\ configured=Ej konfigurerad diff --git a/core/src/main/resources/hudson/matrix/MatrixProject/ajaxMatrix_zh_CN.properties b/core/src/main/resources/hudson/matrix/MatrixProject/ajaxMatrix_zh_CN.properties deleted file mode 100644 index 67b0344fa3..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixProject/ajaxMatrix_zh_CN.properties +++ /dev/null @@ -1,23 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2010, Sun Microsystems, Inc. -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Not\ configured=\u5C1A\u672A\u914D\u7F6E diff --git a/core/src/main/resources/hudson/matrix/MatrixProject/ajaxMatrix_zh_TW.properties b/core/src/main/resources/hudson/matrix/MatrixProject/ajaxMatrix_zh_TW.properties deleted file mode 100644 index 7e5038dde9..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixProject/ajaxMatrix_zh_TW.properties +++ /dev/null @@ -1,23 +0,0 @@ -# The MIT License -# -# Copyright (c) 2013, Chunghwa Telecom Co., Ltd., Pei-Tang Huang -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Not\ configured=\u672a\u8a2d\u5b9a diff --git a/core/src/main/resources/hudson/matrix/MatrixProject/configure-entries.jelly b/core/src/main/resources/hudson/matrix/MatrixProject/configure-entries.jelly deleted file mode 100644 index 1c3d07b2b4..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixProject/configure-entries.jelly +++ /dev/null @@ -1,99 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/core/src/main/resources/hudson/matrix/MatrixProject/configure-entries_da.properties b/core/src/main/resources/hudson/matrix/MatrixProject/configure-entries_da.properties deleted file mode 100644 index 0c7cc664ff..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixProject/configure-entries_da.properties +++ /dev/null @@ -1,27 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2010, Sun Microsystems, Inc. Kohsuke Kawaguchi. Knud Poulsen. -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Combination\ Filter=Kombinationsfilter -Advanced\ Project\ Options=Avancerede Indstillinger -Configuration\ Matrix=\ -Afvikl kun resten af byggene hvis touchstone byggene har mindst det \u00f8nskede resultat. -Add\ axis=Tilf\u00f8j Akse diff --git a/core/src/main/resources/hudson/matrix/MatrixProject/configure-entries_de.properties b/core/src/main/resources/hudson/matrix/MatrixProject/configure-entries_de.properties deleted file mode 100644 index b5740753ea..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixProject/configure-entries_de.properties +++ /dev/null @@ -1,30 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Simon Wiest -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Advanced\ Project\ Options=Erweiterte Projekteinstellungen -Configuration\ Matrix=Konfigurationsmatrix -Combination\ Filter=Kombinationsfilter -Add\ axis=Achse hinzufügen -Directory=Verzeichnis -Directory\ for\ sub-builds=Verzeichnis f\u00FCr sub-builds -Display\ Name=Anzeigename -Use\ custom\ workspace=Eigenen Arbeitsbereich benutzen diff --git a/core/src/main/resources/hudson/matrix/MatrixProject/configure-entries_es.properties b/core/src/main/resources/hudson/matrix/MatrixProject/configure-entries_es.properties deleted file mode 100644 index 636b97fdd4..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixProject/configure-entries_es.properties +++ /dev/null @@ -1,32 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2010, Sun Microsystems, Inc. -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Advanced\ Project\ Options=Opciones avanzadas del proyecto -Configuration\ Matrix=Matriz de configuración -Combination\ Filter=Filtro de combinación -Filter=Filtro -Add\ axis=Añadir eje -Display\ Name=Nombre a mostrar -Execution\ Strategy=Estrategia de ejecución -Use\ custom\ workspace=Utilizar un directorio de trabajo personalizado -Directory=Directorio -Directory\ for\ sub-builds=Directorio para sub-tareas diff --git a/core/src/main/resources/hudson/matrix/MatrixProject/configure-entries_fr.properties b/core/src/main/resources/hudson/matrix/MatrixProject/configure-entries_fr.properties deleted file mode 100644 index 96ec555a7e..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixProject/configure-entries_fr.properties +++ /dev/null @@ -1,35 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Eric Lefevre-Ardant -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Advanced\ Project\ Options=Options Avancées du projet -Configuration\ Matrix=Matrice de configuration -Build\ on\ multiple\ nodes=Lancer les builds sur plusieurs noeuds -Node=Noeud -Name=Nom -Values=Valeurs -Add\ more\ axis=Ajouter des axes -Delete=Supprimer -Individual\ nodes=Les noeuds -Labels=Etiquettes -Axes= -Combination\ Filter=Filtre sur les combinaisons -Filter=Filtre diff --git a/core/src/main/resources/hudson/matrix/MatrixProject/configure-entries_ja.properties b/core/src/main/resources/hudson/matrix/MatrixProject/configure-entries_ja.properties deleted file mode 100644 index 1a3ef8d914..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixProject/configure-entries_ja.properties +++ /dev/null @@ -1,33 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2012, Sun Microsystems, Inc., Kohsuke Kawaguchi, Seiji Sogabe, -# Stephen Connolly, id:cactusman -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Advanced\ Project\ Options=\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u9ad8\u5ea6\u306a\u8a2d\u5b9a -Configuration\ Matrix=\u30de\u30c8\u30ea\u30c3\u30af\u30b9\u306e\u8a2d\u5b9a -Add\ axis=\u8ef8\u306e\u8ffd\u52a0 -Combination\ Filter=\u7d44\u307f\u5408\u308f\u305b\u30d5\u30a3\u30eb\u30bf\u30fc -Filter=\u30d5\u30a3\u30eb\u30bf\u30fc -Display\ Name=\u8868\u793a\u7528\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u540d -Execution\ Strategy=\u5b9f\u884c\u65b9\u6cd5 -Directory=\u30c7\u30a3\u30ec\u30af\u30c8\u30ea -Directory\ for\ sub-builds=\u5b50\u30d3\u30eb\u30c9\u306e\u30c7\u30a3\u30ec\u30af\u30c8\u30ea -Use\ custom\ workspace=\u30ab\u30b9\u30bf\u30e0\u30ef\u30fc\u30af\u30b9\u30da\u30fc\u30b9\u3092\u4f7f\u7528 \ No newline at end of file diff --git a/core/src/main/resources/hudson/matrix/MatrixProject/configure-entries_ko.properties b/core/src/main/resources/hudson/matrix/MatrixProject/configure-entries_ko.properties deleted file mode 100644 index 99575b6f77..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixProject/configure-entries_ko.properties +++ /dev/null @@ -1,6 +0,0 @@ -# This file is under the MIT License by authors - -Advanced\ Project\ Options=\uACE0\uAE09 \uD504\uB85C\uC81D\uD2B8 \uC635\uC158 -Directory=\uB514\uB809\uD130\uB9AC -Directory\ for\ sub-builds=\uC11C\uBE0C \uBE4C\uB4DC \uB514\uB809\uD130\uB9AC -Display\ Name=\uD45C\uC2DC \uC774\uB984 diff --git a/core/src/main/resources/hudson/matrix/MatrixProject/configure-entries_nl.properties b/core/src/main/resources/hudson/matrix/MatrixProject/configure-entries_nl.properties deleted file mode 100644 index 014476cf27..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixProject/configure-entries_nl.properties +++ /dev/null @@ -1,31 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, id:sorokh -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Advanced\ Project\ Options=Geavanceerde projectopties -Configuration\ Matrix=Configuratiematrix -Build\ on\ multiple\ nodes=Start een bouwpoging op meerder nodes. -Node=Node -Display\ Name=Weergegeven naam -Name=Naam -Values=Waarden -Add\ more\ axis=Voeg assen toe -Delete=Verwijder diff --git a/core/src/main/resources/hudson/matrix/MatrixProject/configure-entries_pt.properties b/core/src/main/resources/hudson/matrix/MatrixProject/configure-entries_pt.properties deleted file mode 100644 index 7b8c986cb5..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixProject/configure-entries_pt.properties +++ /dev/null @@ -1,33 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributers -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Advanced\ Project\ Options=Op\u00e7\u00f5es avan\u00e7adas de projeto -Directory=Diret\u00f3rio -Filter=Filtro -Directory\ for\ sub-builds=Diret\u00f3rio dos sub-builds -Display\ Name=Nome de exibi\u00e7\u00e3o -Use\ custom\ workspace=Usar workspace customizado -Combination\ Filter=Filtro combinado -Execution\ Strategy=Estrat\u00e9gia de execu\u00e7\u00e3o -Configuration\ Matrix=Configura\u00e7\u00e3o da matriz -Add\ axis=Adicionar eixo - diff --git a/core/src/main/resources/hudson/matrix/MatrixProject/configure-entries_pt_BR.properties b/core/src/main/resources/hudson/matrix/MatrixProject/configure-entries_pt_BR.properties deleted file mode 100644 index 440b136168..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixProject/configure-entries_pt_BR.properties +++ /dev/null @@ -1,38 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Reginaldo L. Russinholi, Cleiber Silva, Fernando Boaglio -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Advanced\ Project\ Options=Op\u00E7\u00F5es avan\u00E7adas de projeto -Configuration\ Matrix=Matriz de configura\u00E7\u00E3o -Build\ on\ multiple\ nodes=Construir em m\u00FAltiplos n\u00f3s -Node=N\u00f3 -Name=Nome -Use\ custom\ workspace=Usar workspace customizado -Values=Valor -Add\ more\ axis=Adicionar mais eixos -Delete=ApagarAxes= Remover eixos -Labels= R\u00f3tulo -Directory=Pasta -Directory\ for\ sub-builds=Pasta para sub-builds -Display\ Name=Nome a ser mostrado -Individual\ nodes= N\u00f3s individuais -Combination\ Filter= Filtro combinado -Axes= Eixos diff --git a/core/src/main/resources/hudson/matrix/MatrixProject/configure-entries_ru.properties b/core/src/main/resources/hudson/matrix/MatrixProject/configure-entries_ru.properties deleted file mode 100644 index 5cb73d38bf..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixProject/configure-entries_ru.properties +++ /dev/null @@ -1,33 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Mike Salnikov -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Advanced\ Project\ Options=\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 -Configuration\ Matrix=\u041c\u0430\u0442\u0440\u0438\u0446\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0439 -Build\ on\ multiple\ nodes=\u0421\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u043d\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0443\u0437\u043b\u0430\u0445 -Node=\u0423\u0437\u0435\u043b -Name=\u0418\u043c\u044f -Values=\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u044f -Add\ more\ axis=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0442\u0435\u043f\u0435\u043d\u0438 \u0441\u0432\u043e\u0431\u043e\u0434\u044b -Delete=\u0423\u0434\u0430\u043b\u0438\u0442\u044c -Individual\ nodes=\u041a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u0443\u0437\u043b\u044b -Labels=\u041c\u0435\u0442\u043a\u0438 -Axes=\u041e\u0441\u0438 diff --git a/core/src/main/resources/hudson/matrix/MatrixProject/configure-entries_sk.properties b/core/src/main/resources/hudson/matrix/MatrixProject/configure-entries_sk.properties deleted file mode 100644 index 2ce2359996..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixProject/configure-entries_sk.properties +++ /dev/null @@ -1,5 +0,0 @@ -# This file is under the MIT License by authors - -Advanced\ Project\ Options=Pokro\u010Dil\u00E9 nastavenia projektu -Directory=Adres\u00E1r -Use\ custom\ workspace=Pou\u017Ei vlastn\u00FD pracovn\u00FD priestor diff --git a/core/src/main/resources/hudson/matrix/MatrixProject/configure-entries_sv_SE.properties b/core/src/main/resources/hudson/matrix/MatrixProject/configure-entries_sv_SE.properties deleted file mode 100644 index a1494c0e2c..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixProject/configure-entries_sv_SE.properties +++ /dev/null @@ -1,5 +0,0 @@ -# This file is under the MIT License by authors - -Advanced\ Project\ Options=Avancerade projektinst\u00E4llningar -Directory=Katalog -Display\ Name=Visningsnamn diff --git a/core/src/main/resources/hudson/matrix/MatrixProject/configure-entries_tr.properties b/core/src/main/resources/hudson/matrix/MatrixProject/configure-entries_tr.properties deleted file mode 100644 index 15c7ebab5e..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixProject/configure-entries_tr.properties +++ /dev/null @@ -1,35 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Oguz Dag -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Advanced\ Project\ Options=Geli\u015fmi\u015f\ Proje\ Se\u00e7enekleri -Configuration\ Matrix=Konfig\u00fcrasyon\ Matrisi -Build\ on\ multiple\ nodes=\u00c7oklu nod \u00fczerinde yap\u0131land\u0131r -Node=Nod -Name=\u0130sim -Values=De\u011ferler -Add\ more\ axis=Eksen ekle -Delete=Sil -Individual\ nodes=Tek nodlar -Labels=Etiketler -Axes=Eksenler -Filter\ Combinations=Kombinasyonlari Filtrele -Filter=Filtre \ No newline at end of file diff --git a/core/src/main/resources/hudson/matrix/MatrixProject/configure-entries_zh_TW.properties b/core/src/main/resources/hudson/matrix/MatrixProject/configure-entries_zh_TW.properties deleted file mode 100644 index bbb25b8fb8..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixProject/configure-entries_zh_TW.properties +++ /dev/null @@ -1,32 +0,0 @@ -# The MIT License -# -# Copyright (c) 2013, Chunghwa Telecom Co., Ltd., Pei-Tang Huang -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Advanced\ Project\ Options=\u9032\u968e\u5c08\u6848\u9078\u9805 -Use\ custom\ workspace=\u4f7f\u7528\u81ea\u8a02\u5de5\u4f5c\u5340 -Directory=\u76ee\u9304 -Directory\ for\ sub-builds=\u5b50\u5efa\u7f6e\u76ee\u9304 -Display\ Name=\u986f\u793a\u540d\u7a31 -Configuration\ Matrix=\u8a2d\u5b9a\u77e9\u9663 -Add\ axis=\u589e\u52a0\u8ef8\u7dda -Combination\ Filter=\u7d44\u5408\u7be9\u9078\u689d\u4ef6 -Filter=\u7be9\u9078\u689d\u4ef6 -Execution\ Strategy=\u57f7\u884c\u7b56\u7565 diff --git a/core/src/main/resources/hudson/matrix/MatrixProject/help-childCustomWorkspace.html b/core/src/main/resources/hudson/matrix/MatrixProject/help-childCustomWorkspace.html deleted file mode 100644 index 634d472c98..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixProject/help-childCustomWorkspace.html +++ /dev/null @@ -1,28 +0,0 @@ -
                      - Override the workspace directory assigned to each configuration build. - -

                      - By default, Jenkins runs each configuration build in its own unique directory - (this happens by appending the name and the value of the axes to the workspace of the overall matrix execution, - for example, /path/to/slaveroot/job/someMatrixJob/axis1/value1/axis2/value2/). Specifying this value - allows you to override this behaviour. - -

                      - A common value used here is ".", indicating that all the configuration builds run on the same - directory as the overall matrix execution. - -

                      - The path specified here can be either absolute or relative. If relative, it is resolved against the workspace - of the overall matrix execution. The value can also contains environment variable references. Environment variables - include all the axis values, so for example if you specify $FOO when you define - two axes FOO=[a,b] and BAR=[x,y], then FOO=a,BAR=x and FOO=a,BAR=y will build in somewhere like - /slaveroot/job/someMatrixJob/a/ while FOO=b,BAR=x and FOO=b,BAR=y will build in - /slaveroot/job/someMatrixJob/b/. In this way, you can be selective about what subset - of configuration builds share the same workspace and what doesn't. - -

                      - Environment variables include special tokens - ${COMBINATION}, which expands to axis1/value1/axis2/value2/..., and - ${SHORT_COMBINATION}, which expands to 8 character string unique to each configuration. - -

                      \ No newline at end of file diff --git a/core/src/main/resources/hudson/matrix/MatrixProject/help-childCustomWorkspace_zh_TW.html b/core/src/main/resources/hudson/matrix/MatrixProject/help-childCustomWorkspace_zh_TW.html deleted file mode 100644 index 7d946bbaa9..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixProject/help-childCustomWorkspace_zh_TW.html +++ /dev/null @@ -1,24 +0,0 @@ -
                      - 重新指定每組設定的建置工作區目錄。 - -

                      - Jenkins 預設會給各種不同設定獨立的目錄 (在矩陣執行時將座標值加到工作區目錄中,例如 - /path/to/slaveroot/job/someMatrixJob/axis1/value1/axis2/value2/)。 - Specifying this value allows you to override this behaviour. - -

                      - 很多人會設定為 ".",讓矩陣裡的每一項設定都在同一個目錄裡建置。 - -

                      - 可以使用相對路徑或是絕對路徑。相對路徑是由整個矩陣的工作區起算。 - 環境變數包含所有軸線的值,假設您設定 FOO=[a,b] 跟 BAR=[x,y] 兩個軸,指定 $FOO 時, - FOO=a,BAR=x 及 FOO=a,BAR=y 會在 /slaveroot/job/someMatrixJob/a/ 這類的目錄中建置; - 而 FOO=b,BAR=x 及 FOO=b,BAR=y 則是在 /slaveroot/job/someMatrixJob/b/ 建置。 - 透過這個方式,您可以決定哪些設定要共用工作區,哪些設定又必需獨立開來。 - -

                      - 還有一些特殊環境變數可用,例如: - ${COMBINATION} 會被展開成 axis1/value1/axis2/value2/..., - 還有 ${SHORT_COMBINATION},會被展開成每組設定都不同的 8 字元字串。 - -

                      \ No newline at end of file diff --git a/core/src/main/resources/hudson/matrix/MatrixProject/help-slaveAffinity.html b/core/src/main/resources/hudson/matrix/MatrixProject/help-slaveAffinity.html deleted file mode 100644 index a3a25232ec..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixProject/help-slaveAffinity.html +++ /dev/null @@ -1,9 +0,0 @@ -
                      - A matrix project needs to first execute what we call the "parent build", which checks out - a copy of the source tree and capture its state to ensure all the individual builds will - check out the same state. - -

                      - If you need to control where this parent build runs, please use this option to specify - its label/slave. -

                      \ No newline at end of file diff --git a/core/src/main/resources/hudson/matrix/MatrixProject/index.jelly b/core/src/main/resources/hudson/matrix/MatrixProject/index.jelly deleted file mode 100644 index 10e44ced6c..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixProject/index.jelly +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - -

                      ${%Project}

                      - - ${%Project name}: ${it.fullName} - - - - - - - - - - - - - - ${%Latest Test Result} - - - -
                      - - - - - - - - - -
                      -
                      -
                      diff --git a/core/src/main/resources/hudson/matrix/MatrixProject/index_ar.properties b/core/src/main/resources/hudson/matrix/MatrixProject/index_ar.properties deleted file mode 100644 index e69ef43742..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixProject/index_ar.properties +++ /dev/null @@ -1,3 +0,0 @@ -# This file is under the MIT License by authors - -Project=\u0627\u0644\u0645\u0634\u0631\u0648\u0639 diff --git a/core/src/main/resources/hudson/matrix/MatrixProject/index_cs.properties b/core/src/main/resources/hudson/matrix/MatrixProject/index_cs.properties deleted file mode 100644 index 4573f3b5cb..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixProject/index_cs.properties +++ /dev/null @@ -1,23 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2010, Sun Microsystems, Inc. -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Project=Projekt diff --git a/core/src/main/resources/hudson/matrix/MatrixProject/index_da.properties b/core/src/main/resources/hudson/matrix/MatrixProject/index_da.properties deleted file mode 100644 index 9bfa608f1a..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixProject/index_da.properties +++ /dev/null @@ -1,23 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2010, Sun Microsystems, Inc. Kohsuke Kawaguchi. Knud Poulsen. -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Project=Projekt diff --git a/core/src/main/resources/hudson/matrix/MatrixProject/index_de.properties b/core/src/main/resources/hudson/matrix/MatrixProject/index_de.properties deleted file mode 100644 index 73239c6e6c..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixProject/index_de.properties +++ /dev/null @@ -1,24 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Simon Wiest -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Latest\ Test\ Result=Aktuelle Testergebnisse -Project=Projekt diff --git a/core/src/main/resources/hudson/matrix/MatrixProject/index_es.properties b/core/src/main/resources/hudson/matrix/MatrixProject/index_es.properties deleted file mode 100644 index 4d9b48e1ca..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixProject/index_es.properties +++ /dev/null @@ -1,25 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2010, Sun Microsystems, Inc. -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Project=Proyecto -Latest\ Test\ Result=Ultimo resultado de pruebas -Project\ name=Nombre de proyecto diff --git a/core/src/main/resources/hudson/matrix/MatrixProject/index_fi.properties b/core/src/main/resources/hudson/matrix/MatrixProject/index_fi.properties deleted file mode 100644 index 51ce9039c3..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixProject/index_fi.properties +++ /dev/null @@ -1,23 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2010, Sun Microsystems, Inc. -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Project=Projekti diff --git a/core/src/main/resources/hudson/matrix/MatrixProject/index_fr.properties b/core/src/main/resources/hudson/matrix/MatrixProject/index_fr.properties deleted file mode 100644 index d15386b6e4..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixProject/index_fr.properties +++ /dev/null @@ -1,24 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Eric Lefevre-Ardant -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Latest\ Test\ Result=Derniers r\u00e9sultats de test -Project=projet diff --git a/core/src/main/resources/hudson/matrix/MatrixProject/index_he.properties b/core/src/main/resources/hudson/matrix/MatrixProject/index_he.properties deleted file mode 100644 index e8760f2f5c..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixProject/index_he.properties +++ /dev/null @@ -1,4 +0,0 @@ -# This file is under the MIT License by authors - -Disable\ Project=\u05D7\u05E1\u05D5\u05DD \u05E4\u05E8\u05D5\u05D9\u05D9\u05E7\u05D8 -Project=\u05E4\u05E8\u05D5\u05D9\u05D9\u05E7\u05D8 diff --git a/core/src/main/resources/hudson/matrix/MatrixProject/index_hu.properties b/core/src/main/resources/hudson/matrix/MatrixProject/index_hu.properties deleted file mode 100644 index 80775e5f46..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixProject/index_hu.properties +++ /dev/null @@ -1,3 +0,0 @@ -# This file is under the MIT License by authors - -Latest\ Test\ Result=Legut\u00F3bbi teszteredm\u00E9nyek diff --git a/core/src/main/resources/hudson/matrix/MatrixProject/index_it.properties b/core/src/main/resources/hudson/matrix/MatrixProject/index_it.properties deleted file mode 100644 index 56dfbc4328..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixProject/index_it.properties +++ /dev/null @@ -1,23 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2010, Sun Microsystems, Inc. -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Project=Progetto diff --git a/core/src/main/resources/hudson/matrix/MatrixProject/index_ja.properties b/core/src/main/resources/hudson/matrix/MatrixProject/index_ja.properties deleted file mode 100644 index abeaad85da..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixProject/index_ja.properties +++ /dev/null @@ -1,25 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2012, Sun Microsystems, Inc., Kohsuke Kawaguchi, id:cactusman, Seiji Sogabe -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Project=\u30d7\u30ed\u30b8\u30a7\u30af\u30c8 -Project\ name=\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u540d -Latest\ Test\ Result=\u6700\u65b0\u306e\u30c6\u30b9\u30c8\u7d50\u679c \ No newline at end of file diff --git a/core/src/main/resources/hudson/matrix/MatrixProject/index_ko.properties b/core/src/main/resources/hudson/matrix/MatrixProject/index_ko.properties deleted file mode 100644 index 1bd658bb25..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixProject/index_ko.properties +++ /dev/null @@ -1,4 +0,0 @@ -# This file is under the MIT License by authors - -Disable\ Project=\uD504\uB85C\uC81D\uD2B8 \uBE44\uD65C\uC131\uD654 -Project=\uD504\uB85C\uC81D\uD2B8 diff --git a/core/src/main/resources/hudson/matrix/MatrixProject/index_nl.properties b/core/src/main/resources/hudson/matrix/MatrixProject/index_nl.properties deleted file mode 100644 index df583eb768..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixProject/index_nl.properties +++ /dev/null @@ -1,23 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, id:sorokh -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Project=Project diff --git a/core/src/main/resources/hudson/matrix/MatrixProject/index_pl.properties b/core/src/main/resources/hudson/matrix/MatrixProject/index_pl.properties deleted file mode 100644 index 4573f3b5cb..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixProject/index_pl.properties +++ /dev/null @@ -1,23 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2010, Sun Microsystems, Inc. -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Project=Projekt diff --git a/core/src/main/resources/hudson/matrix/MatrixProject/index_pt.properties b/core/src/main/resources/hudson/matrix/MatrixProject/index_pt.properties deleted file mode 100644 index 16e21312ed..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixProject/index_pt.properties +++ /dev/null @@ -1,26 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributers -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Project\ name=Nome do projeto -Latest\ Test\ Result=\u00daltimo resultado de teste -Project=Projeto - diff --git a/core/src/main/resources/hudson/matrix/MatrixProject/index_pt_BR.properties b/core/src/main/resources/hudson/matrix/MatrixProject/index_pt_BR.properties deleted file mode 100644 index 6c29f4ca51..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixProject/index_pt_BR.properties +++ /dev/null @@ -1,25 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Reginaldo L. Russinholi, Cleiber Silva, Fernando Boaglio -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Disable\ Project=Desabilitar projeto -Latest\ Test\ Result=\u00DAltimo resultado do teste -Project=Projeto diff --git a/core/src/main/resources/hudson/matrix/MatrixProject/index_ro.properties b/core/src/main/resources/hudson/matrix/MatrixProject/index_ro.properties deleted file mode 100644 index f6b94da0e3..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixProject/index_ro.properties +++ /dev/null @@ -1,4 +0,0 @@ -# This file is under the MIT License by authors - -Disable\ Project=Dezactiveaza Proiect -Project=Proiect diff --git a/core/src/main/resources/hudson/matrix/MatrixProject/index_ru.properties b/core/src/main/resources/hudson/matrix/MatrixProject/index_ru.properties deleted file mode 100644 index 408dd42d2c..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixProject/index_ru.properties +++ /dev/null @@ -1,24 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Mike Salnikov -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Project=\u041f\u0440\u043e\u0435\u043a\u0442 -Project\ name=\u0418\u043c\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430 diff --git a/core/src/main/resources/hudson/matrix/MatrixProject/index_sv_SE.properties b/core/src/main/resources/hudson/matrix/MatrixProject/index_sv_SE.properties deleted file mode 100644 index 95a1459625..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixProject/index_sv_SE.properties +++ /dev/null @@ -1,4 +0,0 @@ -# This file is under the MIT License by authors - -Disable\ Project=Deaktivera projekt -Project=Projekt diff --git a/core/src/main/resources/hudson/matrix/MatrixProject/index_tr.properties b/core/src/main/resources/hudson/matrix/MatrixProject/index_tr.properties deleted file mode 100644 index a5c94785d7..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixProject/index_tr.properties +++ /dev/null @@ -1,23 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Oguz Dag -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Project=Proje diff --git a/core/src/main/resources/hudson/matrix/MatrixProject/index_uk.properties b/core/src/main/resources/hudson/matrix/MatrixProject/index_uk.properties deleted file mode 100644 index d53fd7d9c5..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixProject/index_uk.properties +++ /dev/null @@ -1,4 +0,0 @@ -# This file is under the MIT License by authors - -Project=\u041F\u0440\u043E\u0435\u043A\u0442 -Project\ name=\u041D\u0430\u0437\u0432\u0430 \u043F\u0440\u043E\u0435\u043A\u0442\u0443 diff --git a/core/src/main/resources/hudson/matrix/MatrixProject/index_zh_CN.properties b/core/src/main/resources/hudson/matrix/MatrixProject/index_zh_CN.properties deleted file mode 100644 index bf6222e3ba..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixProject/index_zh_CN.properties +++ /dev/null @@ -1,23 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2010, Sun Microsystems, Inc. -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Project=\u9879\u76ee diff --git a/core/src/main/resources/hudson/matrix/MatrixProject/index_zh_TW.properties b/core/src/main/resources/hudson/matrix/MatrixProject/index_zh_TW.properties deleted file mode 100644 index 121a2226ef..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixProject/index_zh_TW.properties +++ /dev/null @@ -1,26 +0,0 @@ -# The MIT License -# -# Copyright (c) 2013, Chunghwa Telecom Co., Ltd., Pei-Tang Huang -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Project=\u5C08\u6848 -Project\ name=\u5c08\u6848\u540d\u7a31 -Disable\ Project=\u505C\u7528\u5C08\u6848 -Latest\ Test\ Result=\u6700\u65b0\u6e2c\u8a66\u7d50\u679c diff --git a/core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail.jelly b/core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail.jelly deleted file mode 100644 index 583f693ef4..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail.jelly +++ /dev/null @@ -1,28 +0,0 @@ - - - -
                      - ${%body} -
                      \ No newline at end of file diff --git a/core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail.properties b/core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail.properties deleted file mode 100644 index 57b4bab41a..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail.properties +++ /dev/null @@ -1,25 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, id:cactusman -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -body=\ - Suitable for projects that need a large number of different configurations, \ - such as testing on multiple environments, platform-specific builds, etc. diff --git a/core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_ar.properties b/core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_ar.properties deleted file mode 100644 index 64bed35af6..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_ar.properties +++ /dev/null @@ -1,3 +0,0 @@ -# This file is under the MIT License by authors - -body=\u0645\u0646\u0627\u0633\u0628\u0629 \u0644\u0644\u0645\u0634\u0627\u0631\u064A\u0639 \u0627\u0644\u062A\u064A \u062A\u062D\u062A\u0627\u062C \u0643\u0645\u064A\u0629 \u0643\u0628\u064A\u0631\u0629 \u0645\u0646 \u0625\u0639\u062F\u0627\u062F\u0627\u062A \u0645\u062E\u062A\u0644\u0641\u0629\u060C \u0645\u062B\u0644 \u0627\u062E\u062A\u0628\u0627\u0631 \u0645\u0634\u0631\u0648\u0639 \u0641\u064A \u0639\u062F\u0629 \u0628\u064A\u0626\u0627\u062A\u060C \u0645\u0634\u0627\u0631\u064A\u0639 \u0645\u062E\u0635\u0635\u0629 \u0644\u0645\u0646\u0635\u0627\u062A \u0645\u0639\u064A\u0646\u0629\u060C \u0625\u0644\u062E. diff --git a/core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_da.properties b/core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_da.properties deleted file mode 100644 index 31cd9aa20c..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_da.properties +++ /dev/null @@ -1,23 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2010, Sun Microsystems, Inc. Kohsuke Kawaguchi. Knud Poulsen. -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -body=Velegnet til projekter, der har behov for mange forskellige konfigurationer, s\u00E5som test p\u00E5 flere omgivelser, operativsystemer, platformspecifikke byg, osv. diff --git a/core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_de.properties b/core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_de.properties deleted file mode 100644 index 7063a7e238..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_de.properties +++ /dev/null @@ -1,27 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Simon Wiest -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -body=\ - Dieses Profil eignet sich sehr gut für Projekte mit zahlreichen \ - Konfigurationen, die etwa in unterschiedlichen Umgebungen getestet oder \ - plattformspezifisch gebaut werden müssen. - diff --git a/core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_es.properties b/core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_es.properties deleted file mode 100644 index 9b336d0754..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_es.properties +++ /dev/null @@ -1,26 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, id:cactusman -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -body=\ - Adecuado para proyectos que requieran un gran número de configuraciones diferentes, \ - como testear en multiples entornos, ejecutar sobre plataformas concretas, etc. - diff --git a/core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_et.properties b/core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_et.properties deleted file mode 100644 index 943a5be456..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_et.properties +++ /dev/null @@ -1,3 +0,0 @@ -# This file is under the MIT License by authors - -body=Sobib projektidele, mis n\u00F5uavad suurt hulka erinevaid konfiguratsioone. N\u00E4iteks paljudes platvormides testimine v\u00F5i platvormide jaoks ehitamine. diff --git a/core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_fi.properties b/core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_fi.properties deleted file mode 100644 index 4074cd6f5c..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_fi.properties +++ /dev/null @@ -1,3 +0,0 @@ -# This file is under the MIT License by authors - -body=Sopii projekteille, joissa on paljon erilaisia konfiguraatioita, kuten k\u00E4\u00E4nnt\u00E4mist\u00E4 tai testaamista useilla alustoilla. diff --git a/core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_fr.properties b/core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_fr.properties deleted file mode 100644 index f30acb34b7..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_fr.properties +++ /dev/null @@ -1,26 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Eric Lefevre-Ardant -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -body=\ - Adapté aux projets qui nécessitent un grand nombre de configurations différentes, \ - comme des environnements de test multiples, des binaires spécifiques à une plateforme, etc. - diff --git a/core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_hi_IN.properties b/core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_hi_IN.properties deleted file mode 100644 index a9b8946026..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_hi_IN.properties +++ /dev/null @@ -1,3 +0,0 @@ -# This file is under the MIT License by authors - -body=\u0905\u0928\u0947\u0915 \u0935\u093F\u092D\u093F\u0928\u094D\u0928 \u0935\u093F\u0928\u094D\u092F\u093E\u0938\u094B\u0902 \u0915\u0940 \u092C\u0921\u093C\u0940 \u092A\u0930\u093F\u092F\u094B\u091C\u0928\u093E\u0913\u0902 \u0915\u0947 \u0932\u093F\u090F \u0909\u092A\u092F\u0941\u0915\u094D\u0924 - \u091C\u0948\u0938\u0947 \u0915\u093F \u090F\u0915\u093E\u0927\u093F\u0915 \u0935\u093E\u0924\u093E\u0935\u0930\u0923 \u092A\u0930 \u092A\u0930\u093F\u0915\u094D\u0937\u0923, \u092E\u0902\u091A - \u0935\u093F\u0936\u093F\u0937\u094D\u091F \u0928\u093F\u0930\u094D\u092E\u093E\u0923 \u0906\u0926\u093F diff --git a/core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_it.properties b/core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_it.properties deleted file mode 100644 index d0caf427e6..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_it.properties +++ /dev/null @@ -1,23 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2010, Sun Microsystems, Inc. -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -body=Adatto a progetto che necessitano di un ampio numero di configurazioni diverse, come test su pi\u00F9 ambienti, build specifiche per piattaforma, ecc. diff --git a/core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_ja.properties b/core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_ja.properties deleted file mode 100644 index e017c51a4a..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_ja.properties +++ /dev/null @@ -1,24 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, id:cactusman -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -body=\ - \u8907\u6570\u306e\u74b0\u5883\u3067\u306e\u30c6\u30b9\u30c8\u3084\u3001\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u3054\u3068\u306e\u30d3\u30eb\u30c9\u306a\u3069\u3068\u3044\u3063\u305f\u3001\u591a\u6570\u306e\u7570\u306a\u308b\u69cb\u6210\u304c\u5fc5\u8981\u306a\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306b\u9069\u3057\u3066\u3044\u307e\u3059\u3002 \ No newline at end of file diff --git a/core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_ko.properties b/core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_ko.properties deleted file mode 100644 index 95b265ca54..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_ko.properties +++ /dev/null @@ -1,23 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2010, Sun Microsystems, Inc. -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -body=\uB2E4\uC591\uD55C \uD658\uACBD\uC5D0\uC11C\uC758 \uD14C\uC2A4\uD2B8, \uD50C\uB798\uD3FC \uD2B9\uC131 \uBE4C\uB4DC, \uAE30\uD0C0 \uB4F1\uB4F1 \uCC98\uB7FC \uB2E4\uC218\uC758 \uC11C\uB85C\uB2E4\uB978 \uD658\uACBD\uC124\uC815\uC774 \uD544\uC694\uD55C \uD504\uB85C\uC81D\uD2B8\uC5D0 \uC801\uD569\uD568. diff --git a/core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_nb_NO.properties b/core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_nb_NO.properties deleted file mode 100644 index c85c562933..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_nb_NO.properties +++ /dev/null @@ -1,23 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2010, Sun Microsystems, Inc. -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -body=Egner seg for prosjekter som trenger et stort antall forskjellige konfigurasjoner, som testing i forskjellige milj\u00F8er, plattformspesifikke bygg osv. diff --git a/core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_nl.properties b/core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_nl.properties deleted file mode 100644 index bf3d392da6..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_nl.properties +++ /dev/null @@ -1,23 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, id:sorokh -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -body=Geschikt voor projecten die een groot aantal verschillende configuraties nodig hebben,zoals testen op meerdere omgevingen, platformspecifieke bouwpogingen, etc. diff --git a/core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_pl.properties b/core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_pl.properties deleted file mode 100644 index 805f1cc328..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_pl.properties +++ /dev/null @@ -1,23 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2010, Sun Microsystems, Inc. -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -body=Przeznaczone dla projekt\u00F3w, kt\u00F3re potrzebuj\u0105 du\u017Cej liczby r\u00F3\u017Cnych konfiguracji, np. testuj\u0105cych na wielu \u015Brodowiskach, buduj\u0105cych oprogramowanie dla wybranych platform, itp. diff --git a/core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_pt.properties b/core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_pt.properties deleted file mode 100644 index 554f6047b6..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_pt.properties +++ /dev/null @@ -1,26 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributers -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -# \ -# Suitable for projects that need a large number of different configurations, \ -# such as testing on multiple environments, platform-specific builds, etc. -body= diff --git a/core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_pt_BR.properties b/core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_pt_BR.properties deleted file mode 100644 index cb3bfd5bc9..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_pt_BR.properties +++ /dev/null @@ -1,23 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Reginaldo L. Russinholi, Cleiber Silva, Fernando Boaglio -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -body=Apropriado para projetos que necessitam de grande n\u00famero de diferentes configura\u00e7\u00f5es, como teste em m\u00faltiplos ambientes, builds para plataformas espec\u00edficas, etc. diff --git a/core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_ru.properties b/core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_ru.properties deleted file mode 100644 index 79615eaca9..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_ru.properties +++ /dev/null @@ -1,23 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Mike Salnikov -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -body=\u041F\u043E\u0434\u0445\u043E\u0434\u0438\u0442 \u0434\u043B\u044F \u043F\u0440\u043E\u0435\u043A\u0442\u043E\u0432, \u0442\u0440\u0435\u0431\u0443\u044E\u0449\u0438\u0445 \u0431\u043E\u043B\u044C\u0448\u043E\u0435 \u043A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u0440\u0430\u0437\u043B\u0438\u0447\u043D\u044B\u0445 \u043A\u043E\u043D\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0439, \u0442\u0430\u043A\u0438\u0445 \u043A\u0430\u043A \u0442\u0435\u0441\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435 \u0432 \u0440\u0430\u0437\u043D\u043E\u043E\u0431\u0440\u0430\u0437\u043D\u044B\u0445 \u0441\u0440\u0435\u0434\u0430\u0445, \u043F\u043B\u0430\u0442\u0444\u043E\u0440\u043C\u043E\u0437\u0430\u0432\u0438\u0441\u0438\u043C\u044B\u0435 \u0441\u0431\u043E\u0440\u043A\u0438 \u0438 \u0442.\u0434. diff --git a/core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_sv_SE.properties b/core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_sv_SE.properties deleted file mode 100644 index d1b17ee8a2..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_sv_SE.properties +++ /dev/null @@ -1,23 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2010, Sun Microsystems, Inc. -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -body=L\u00E4mplig f\u00F6r projekt som beh\u00F6ver ett stort antal olika konfigurationer, s\u00E5som testning p\u00E5 flera milj\u00F6er, plattformsneutrala byggen, etc. diff --git a/core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_tr.properties b/core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_tr.properties deleted file mode 100644 index 35ff8806ec..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_tr.properties +++ /dev/null @@ -1,23 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Oguz Dag -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -body=Platforma \u00d6zg\u00fc yap\u0131land\u0131rmalara sahip veya \u00e7e\u015fitli ortamlarda test i\u015flemi yapan projeler gibi \u00e7ok fazla say\u0131da konfig\u00fcrasyona ihtiya\u00e7 duyan projeler i\u00e7in uygundur. diff --git a/core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_uk.properties b/core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_uk.properties deleted file mode 100644 index e6237b8360..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_uk.properties +++ /dev/null @@ -1,3 +0,0 @@ -# This file is under the MIT License by authors - -body=\u041F\u0456\u0434\u0445\u043E\u0434\u0438\u0442\u044C \u0434\u043B\u044F \u043F\u0440\u043E\u0435\u043A\u0442\u0456\u0432, \u044F\u043A\u0456 \u043F\u043E\u0442\u0440\u0435\u0431\u0443\u044E\u0442\u044C \u0432\u0435\u043B\u0438\u043A\u0443 \u043A\u0456\u043B\u044C\u043A\u0456\u0441\u0442\u044C \u0440\u0456\u0437\u043D\u043E\u043C\u0430\u043D\u0456\u0442\u043D\u0438\u0445 \u043A\u043E\u043D\u0444\u0456\u0433\u0443\u0440\u0430\u0446\u0456\u0439, \u0442\u0430\u043A\u0438\u0445 \u044F\u043A \u0442\u0435\u0441\u0442\u0443\u0432\u0430\u043D\u043D\u044F \u0443 \u0440\u0456\u0437\u043D\u0438\u0445 \u0441\u0435\u0440\u0435\u0434\u043E\u0432\u0438\u0449\u0430\u0445, \u043F\u043B\u0430\u0442\u0444\u043E\u0440\u043C\u043E\u0437\u0430\u043B\u0435\u0436\u043D\u0456 \u0437\u0431\u0456\u0440\u043A\u0438 \u0442\u0430 \u0456\u043D. diff --git a/core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_zh_CN.properties b/core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_zh_CN.properties deleted file mode 100644 index 7540ad5f3c..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_zh_CN.properties +++ /dev/null @@ -1,23 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, id:cactusman -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -body=\u9002\u7528\u4e8e\u591a\u914d\u7f6e\u9879\u76ee,\u4f8b\u5982\u591a\u73af\u5883\u6d4b\u8bd5,\u5e73\u53f0\u6307\u5b9a\u6784\u5efa,\u7b49\u7b49. diff --git a/core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_zh_TW.properties b/core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_zh_TW.properties deleted file mode 100644 index df7bf0e261..0000000000 --- a/core/src/main/resources/hudson/matrix/MatrixProject/newJobDetail_zh_TW.properties +++ /dev/null @@ -1,24 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2013, Sun Microsystems, Inc., Chunghwa Telecom Co., Ltd., -# and Pei-Tang Huang -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -body=\u9069\u5408\u9700\u8981\u6709\u5927\u91cf\u4e0d\u540c\u8a2d\u5b9a\u7684\u5c08\u6848\uff0c\u4f8b\u5982\u5728\u5404\u5f0f\u74b0\u5883\u4e0a\u9032\u884c\u6e2c\u8a66\u3001\u5e73\u53f0\u76f8\u4f9d\u7684\u5efa\u7f6e...\u7b49\u4f5c\u696d\u3002 diff --git a/core/src/main/resources/hudson/matrix/Messages.properties b/core/src/main/resources/hudson/matrix/Messages.properties deleted file mode 100644 index 325ece3185..0000000000 --- a/core/src/main/resources/hudson/matrix/Messages.properties +++ /dev/null @@ -1,41 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, id:cactusman -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -MatrixBuild.depends_on_this={0} depends on this. -MatrixProject.DisplayName=Build multi-configuration project -MatrixProject.Pronoun=Multi-configuration project -MatrixProject.DuplicateAxisName=Duplicate axis name - -MatrixBuild.Triggering=Triggering {0} -MatrixBuild.AppearsCancelled={0} appears to be cancelled -MatrixBuild.Cancelled=Cancelled {0} -MatrixBuild.Interrupting=Interrupting {0} -MatrixBuild.Completed={0} completed with result {1} - -MatrixConfiguration.Pronoun=Configuration - -MatrixRun.KeptBecauseOfParent=Kept because {0} is kept - -JDKAxis.DisplayName=JDK -LabelAxis.DisplayName=Slaves -LabelExpAxis.DisplayName=Label expression -TextArea.DisplayName=User-defined Axis diff --git a/core/src/main/resources/hudson/matrix/Messages_da.properties b/core/src/main/resources/hudson/matrix/Messages_da.properties deleted file mode 100644 index 3bda032a68..0000000000 --- a/core/src/main/resources/hudson/matrix/Messages_da.properties +++ /dev/null @@ -1,33 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2010, Sun Microsystems, Inc. Kohsuke Kawaguchi. Knud Poulsen. -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -MatrixRun.KeptBecauseOfParent=Gemt da {0} er gemt -TextArea.DisplayName=Brugerdefineret akse -MatrixProject.DuplicateAxisName=Dupliker akse navn -MatrixBuild.Triggering=Starter {0} -LabelAxis.DisplayName=Slaver -JDKAxis.DisplayName=JDK -MatrixBuild.AppearsCancelled={0} ser ud til at v\u00e6re aflyst -MatrixConfiguration.Pronoun=Konfiguration -MatrixProject.DisplayName=Byg multi-konfigurationsprojekt -MatrixBuild.Cancelled=Aflyst {0} -MatrixBuild.Interrupting=Afbryder {0} diff --git a/core/src/main/resources/hudson/matrix/Messages_de.properties b/core/src/main/resources/hudson/matrix/Messages_de.properties deleted file mode 100644 index d0bc67c412..0000000000 --- a/core/src/main/resources/hudson/matrix/Messages_de.properties +++ /dev/null @@ -1,40 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Simon Wiest -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -MatrixProject.DisplayName=Multikonfigurationsprojekt bauen -MatrixProject.Pronoun=Multikonfigurationsprojekt -MatrixProject.DuplicateAxisName=Name der Achse existiert bereits - -MatrixBuild.Triggering=Löse {0} aus -MatrixBuild.AppearsCancelled={0} scheint abgebrochen worden zu sein -MatrixBuild.Cancelled={0} abgebrochen -MatrixBuild.Interrupting=Unterbreche {0} -MatrixBuild.Completed={0} beendet mit Ergebnis {1} - -MatrixConfiguration.Pronoun=Einstellungen - -MatrixRun.KeptBecauseOfParent=Zurückbehalten, weil {0} zurückbehalten wurde. - - - -LabelExpAxis.DisplayName=Labelausdruck -TextArea.DisplayName=Benutzerdefinierte Achse diff --git a/core/src/main/resources/hudson/matrix/Messages_es.properties b/core/src/main/resources/hudson/matrix/Messages_es.properties deleted file mode 100644 index b3d3958a2f..0000000000 --- a/core/src/main/resources/hudson/matrix/Messages_es.properties +++ /dev/null @@ -1,39 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, id:cactusman -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -MatrixProject.DisplayName=Crear un proyecto multi-configuración -MatrixProject.DuplicateAxisName=Duplicar el nombre común - -MatrixBuild.Triggering=Lanzado {0} -MatrixBuild.AppearsCancelled={0} parece haber sido cancelado -MatrixBuild.Cancelled=Cancelado {0} -MatrixBuild.Interrupting=Abortando {0} - -MatrixConfiguration.Pronoun=Configuración - -MatrixRun.KeptBecauseOfParent=Guardado porque {0} está guardado -TextArea.DisplayName=Ejes definidos por el usuario -LabelAxis.DisplayName=Esclavos -JDKAxis.DisplayName= Jdk -# Label expression -LabelExpAxis.DisplayName=Etiqueta -MatrixBuild.Completed={0} se ha ejecutado con el resultado {1} diff --git a/core/src/main/resources/hudson/matrix/Messages_fr.properties b/core/src/main/resources/hudson/matrix/Messages_fr.properties deleted file mode 100644 index 73ff67c358..0000000000 --- a/core/src/main/resources/hudson/matrix/Messages_fr.properties +++ /dev/null @@ -1,30 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Eric Lefevre-Ardant -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -MatrixProject.DisplayName=Construire un projet multi-configuration - -MatrixBuild.Triggering=Lancement de {0} -MatrixBuild.AppearsCancelled={0} semble annulé -MatrixBuild.Cancelled={0} a été annulé -MatrixBuild.Interrupting={0} en cours d''interruption - -MatrixConfiguration.Pronoun=Configuration diff --git a/core/src/main/resources/hudson/matrix/Messages_ja.properties b/core/src/main/resources/hudson/matrix/Messages_ja.properties deleted file mode 100644 index 3dfe39be4b..0000000000 --- a/core/src/main/resources/hudson/matrix/Messages_ja.properties +++ /dev/null @@ -1,40 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2013, Sun Microsystems, Inc., Kohsuke Kawaguchi, Seiji Sogabe, id:cactusman -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -MatrixBuild.depends_on_this={0} depends on this. -MatrixProject.DisplayName=\u30de\u30eb\u30c1\u69cb\u6210\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u30d3\u30eb\u30c9 -MatrixProject.Pronoun=\u30de\u30eb\u30c1\u69cb\u6210\u30d7\u30ed\u30b8\u30a7\u30af\u30c8 -MatrixProject.DuplicateAxisName=\u69cb\u6210\u8ef8\u540d\u304c\u91cd\u8907\u3057\u3066\u3044\u307e\u3059 - -MatrixBuild.Triggering={0}\u306e\u8d77\u52d5 -MatrixBuild.AppearsCancelled={0}\u306f\u4e2d\u6b62\u3055\u308c\u305f\u3088\u3046\u3067\u3059 -MatrixBuild.Cancelled={0}\u306e\u4e2d\u6b62 -MatrixBuild.Interrupting={0}\u3078\u306e\u5272\u308a\u8fbc\u307f -MatrixBuild.Completed={0} \u304c\u5b8c\u4e86\u3057\u307e\u3057\u305f\u3002\u7d50\u679c: {1} - -MatrixConfiguration.Pronoun=\u8a2d\u5b9a -MatrixRun.KeptBecauseOfParent={0}\u304c\u4fdd\u7559\u4e2d\u306e\u305f\u3081\u4fdd\u7559\u3057\u307e\u3059 - -JDKAxis.DisplayName=JDK -LabelAxis.DisplayName=\u30b9\u30ec\u30fc\u30d6 -LabelExpAxis.DisplayName=\u30e9\u30d9\u30eb\u5f0f -TextArea.DisplayName=\u30e6\u30fc\u30b6\u5b9a\u7fa9 diff --git a/core/src/main/resources/hudson/matrix/Messages_nl.properties b/core/src/main/resources/hudson/matrix/Messages_nl.properties deleted file mode 100644 index 6f2854cf47..0000000000 --- a/core/src/main/resources/hudson/matrix/Messages_nl.properties +++ /dev/null @@ -1,31 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, id:sorokh -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -MatrixProject.DisplayName=Bouw een multi-configuratie project - -MatrixBuild.Triggering=Starten van {0} -MatrixBuild.AppearsCancelled={0} blijkt geannuleerd -MatrixBuild.Cancelled= {0} werd geannuleerd -MatrixBuild.Interrupting= {0} wordt onderbroken - -MatrixConfiguration.Pronoun=Configuratie -MatrixRun.KeptBecauseOfParent=Bijgehouden omdat {0} werd bijgehouden diff --git a/core/src/main/resources/hudson/matrix/Messages_pt.properties b/core/src/main/resources/hudson/matrix/Messages_pt.properties deleted file mode 100644 index a1b2e13cbb..0000000000 --- a/core/src/main/resources/hudson/matrix/Messages_pt.properties +++ /dev/null @@ -1,40 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributers -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - - -MatrixBuild.Completed={0} completado com resultado {1} -MatrixRun.KeptBecauseOfParent=Mantido porque {0} ser\u00e1 mantido -TextArea.DisplayName=Eixo definido pelo usu\u00e1rio -MatrixProject.DuplicateAxisName=Nome do eixo duplicado -MatrixBuild.Triggering=Disparando {0} -LabelAxis.DisplayName=Slaves -JDKAxis.DisplayName=JDK -MatrixBuild.Interrupting=Interrompendo {0} -MatrixBuild.depends_on_this={0} depended disso. -LabelExpAxis.DisplayName=Label -MatrixBuild.AppearsCancelled= {0} parece estar cancelado -MatrixConfiguration.Pronoun=Configura\u00e7\u00e3o -MatrixProject.Pronoun=Projeto com multi-configura\u00e7\u00f5es -MatrixProject.DisplayName=Construir Build projeto com multi-configura\u00e7\u00f5es -MatrixBuild.Cancelled={0} cancelado - - diff --git a/core/src/main/resources/hudson/matrix/Messages_pt_BR.properties b/core/src/main/resources/hudson/matrix/Messages_pt_BR.properties deleted file mode 100644 index 6cdf9d82b5..0000000000 --- a/core/src/main/resources/hudson/matrix/Messages_pt_BR.properties +++ /dev/null @@ -1,42 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Reginaldo L. Russinholi, Cleiber Silva, -# Bruno Meneguello -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -MatrixBuild.depends_on_this={0} depende deste. -MatrixProject.DisplayName=Construir projeto de m\u00faltiplas configura\u00e7\u00f5es -MatrixProject.Pronoun=Projeto de M\u00faltiplas Configura\u00e7\u00f5es - -MatrixBuild.Triggering=Disparando {0} -MatrixBuild.AppearsCancelled={0} parece estar cancelado -MatrixBuild.Cancelled=Cancelado {0} -MatrixBuild.Interrupting=Interrompendo {0} -MatrixBuild.Completed={0} completado com o resultado {1} - -MatrixConfiguration.Pronoun=Configura\u00e7\u00e3o -MatrixRun.KeptBecauseOfParent=Mantido porque {0} est\u00e1 mantido - -MatrixProject.DuplicateAxisName=Duplicar nome do eixo - -JDKAxis.DisplayName=JDK -LabelAxis.DisplayName=Slaves -LabelExpAxis.DisplayName=Express\u00e7o de R\u00f3tulo -TextArea.DisplayName=Eixo Definido pelo Usu\u00e1rio diff --git a/core/src/main/resources/hudson/matrix/Messages_ru.properties b/core/src/main/resources/hudson/matrix/Messages_ru.properties deleted file mode 100644 index 54753e19a3..0000000000 --- a/core/src/main/resources/hudson/matrix/Messages_ru.properties +++ /dev/null @@ -1,30 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Mike Salnikov -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -MatrixProject.DisplayName=\u041c\u0443\u043b\u044c\u0442\u0438\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 - -MatrixBuild.Triggering=\u0410\u043a\u0442\u0438\u0432\u0438\u0440\u0443\u044e {0} -MatrixBuild.AppearsCancelled={0} \u043f\u043e \u0432\u0441\u0435\u0439 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0440\u0435\u0440\u0432\u0430\u043d\u0430 -MatrixBuild.Cancelled=\u041f\u0440\u0435\u0440\u0432\u0430\u043d\u0430 {0} -MatrixBuild.Interrupting=\u041f\u0440\u0435\u0440\u044b\u0432\u0430\u044e {0} - -MatrixConfiguration.Pronoun=\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \ No newline at end of file diff --git a/core/src/main/resources/hudson/matrix/Messages_tr.properties b/core/src/main/resources/hudson/matrix/Messages_tr.properties deleted file mode 100644 index a63c95565a..0000000000 --- a/core/src/main/resources/hudson/matrix/Messages_tr.properties +++ /dev/null @@ -1,31 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Oguz Dag -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -MatrixProject.DisplayName=\u00c7oklu-konfig\u00fcrasyona sahip proje yap\u0131land\u0131r - -MatrixBuild.Triggering={0} tetikleniyor -MatrixBuild.AppearsCancelled={0} iptal edilmi\u015f gör\u00fcn\u00fcyor -MatrixBuild.Cancelled={0} iptal edildi -MatrixBuild.Interrupting={0} i\u015flemi kesiliyor - -MatrixConfiguration.Pronoun=Konfig\u00fcrasyon -MatrixRun.KeptBecauseOfParent={0} tutuldu\u011fu i\u00e7in tutulmu\u015ftur diff --git a/core/src/main/resources/hudson/matrix/Messages_zh_CN.properties b/core/src/main/resources/hudson/matrix/Messages_zh_CN.properties deleted file mode 100644 index 5af13aa446..0000000000 --- a/core/src/main/resources/hudson/matrix/Messages_zh_CN.properties +++ /dev/null @@ -1,37 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, id:cactusman -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -MatrixProject.DisplayName=\u6784\u5efa\u4e00\u4e2a\u591a\u914d\u7f6e\u9879\u76ee -MatrixProject.DuplicateAxisName=Duplicate axis name - -MatrixBuild.Triggering=Triggering {0} -MatrixBuild.AppearsCancelled={0} appears to be cancelled -MatrixBuild.Cancelled=Cancelled {0} -MatrixBuild.Interrupting=Interrupting {0} - -MatrixConfiguration.Pronoun=Configuration - -MatrixRun.KeptBecauseOfParent=Kept because {0} is kept - -JDKAxis.DisplayName=JDK -LabelAxis.DisplayName=Slaves -TextArea.DisplayName=User-defined Axis \ No newline at end of file diff --git a/core/src/main/resources/hudson/matrix/Messages_zh_TW.properties b/core/src/main/resources/hudson/matrix/Messages_zh_TW.properties deleted file mode 100644 index 6e20bba76c..0000000000 --- a/core/src/main/resources/hudson/matrix/Messages_zh_TW.properties +++ /dev/null @@ -1,39 +0,0 @@ -# The MIT License -# -# Copyright (c) 2013, Chunghwa Telecom Co., Ltd., Pei-Tang Huang -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -MatrixProject.DisplayName=\u5efa\u7acb\u591a\u91cd\u8a2d\u5b9a\u5c08\u6848 -MatrixProject.DuplicateAxisName=\u8ef8\u7dda\u540d\u7a31\u91cd\u8907 - -MatrixBuild.Triggering=\u89f8\u767c {0} \u4e2d -MatrixBuild.AppearsCancelled={0} \u6b63\u88ab\u53d6\u6d88 -MatrixBuild.Cancelled={0} \u5df2\u53d6\u6d88 -MatrixBuild.Interrupting=\u4e2d\u65b7 {0} \u4e2d -MatrixBuild.Completed={0} \u5df2\u5b8c\u6210\uff0c\u7d50\u679c\u70ba {1} - -MatrixConfiguration.Pronoun=\u8a2d\u5b9a - -MatrixRun.KeptBecauseOfParent=\u70ba\u4e86 {0} \u800c\u4fdd\u7559 - -JDKAxis.DisplayName=JDK -LabelAxis.DisplayName=Slave -LabelExpAxis.DisplayName=\u6a19\u7c64\u8868\u793a\u5f0f -TextArea.DisplayName=\u4f7f\u7528\u8005\u81ea\u8a02\u8ef8 diff --git a/core/src/main/resources/hudson/matrix/TextAxis/config.jelly b/core/src/main/resources/hudson/matrix/TextAxis/config.jelly deleted file mode 100644 index 14128b88e5..0000000000 --- a/core/src/main/resources/hudson/matrix/TextAxis/config.jelly +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - diff --git a/core/src/main/resources/hudson/matrix/TextAxis/config_da.properties b/core/src/main/resources/hudson/matrix/TextAxis/config_da.properties deleted file mode 100644 index 402f2e9f65..0000000000 --- a/core/src/main/resources/hudson/matrix/TextAxis/config_da.properties +++ /dev/null @@ -1,24 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2010, Sun Microsystems, Inc. Kohsuke Kawaguchi. Knud Poulsen. -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Values=V\u00e6rdier -Name=Navn diff --git a/core/src/main/resources/hudson/matrix/TextAxis/config_de.properties b/core/src/main/resources/hudson/matrix/TextAxis/config_de.properties deleted file mode 100644 index 52b1fb37d7..0000000000 --- a/core/src/main/resources/hudson/matrix/TextAxis/config_de.properties +++ /dev/null @@ -1,24 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributers -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Values=Werte -Name=Name diff --git a/core/src/main/resources/hudson/matrix/TextAxis/config_es.properties b/core/src/main/resources/hudson/matrix/TextAxis/config_es.properties deleted file mode 100644 index 5bcf3f473e..0000000000 --- a/core/src/main/resources/hudson/matrix/TextAxis/config_es.properties +++ /dev/null @@ -1,24 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributers -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Values=Valores -Name=Nombre diff --git a/core/src/main/resources/hudson/matrix/TextAxis/config_ja.properties b/core/src/main/resources/hudson/matrix/TextAxis/config_ja.properties deleted file mode 100644 index 27fe8f674a..0000000000 --- a/core/src/main/resources/hudson/matrix/TextAxis/config_ja.properties +++ /dev/null @@ -1,24 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2010, Sun Microsystems, Inc., Seiji Sogabe -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Name=\u540d\u524d -Values=\u5024 \ No newline at end of file diff --git a/core/src/main/resources/hudson/matrix/TextAxis/config_pt.properties b/core/src/main/resources/hudson/matrix/TextAxis/config_pt.properties deleted file mode 100644 index 5c750ded20..0000000000 --- a/core/src/main/resources/hudson/matrix/TextAxis/config_pt.properties +++ /dev/null @@ -1,24 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributers -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Values=Valores -Name=Nome diff --git a/core/src/main/resources/hudson/matrix/TextAxis/config_zh_TW.properties b/core/src/main/resources/hudson/matrix/TextAxis/config_zh_TW.properties deleted file mode 100644 index 38266d9a05..0000000000 --- a/core/src/main/resources/hudson/matrix/TextAxis/config_zh_TW.properties +++ /dev/null @@ -1,24 +0,0 @@ -# The MIT License -# -# Copyright (c) 2013, Chunghwa Telecom Co., Ltd., Pei-Tang Huang -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Name=\u540d\u7a31 -Values=\u503c diff --git a/core/src/main/resources/hudson/matrix/TextAxis/help-valueString.html b/core/src/main/resources/hudson/matrix/TextAxis/help-valueString.html deleted file mode 100644 index ab60f50853..0000000000 --- a/core/src/main/resources/hudson/matrix/TextAxis/help-valueString.html +++ /dev/null @@ -1,4 +0,0 @@ -
                      - Values assigned to variables. Multiple values are separated by whitespace or newlines. - Use shell quoting syntax for a value that contains whitespace. -
                      diff --git a/core/src/main/resources/hudson/matrix/TextAxis/help-valueString_de.html b/core/src/main/resources/hudson/matrix/TextAxis/help-valueString_de.html deleted file mode 100644 index b874856d76..0000000000 --- a/core/src/main/resources/hudson/matrix/TextAxis/help-valueString_de.html +++ /dev/null @@ -1,5 +0,0 @@ -
                      - Geben Sie hier die Werte an, welche die Variable annehmen kann. - Mehrere Werte werden durch Leerraum oder Zeilenumbrüche getrennt. - Verwenden Sie die Shell-Notation, um Werte mit Leerräumen anzugeben. -
                      \ No newline at end of file diff --git a/core/src/main/resources/hudson/matrix/TextAxis/help-valueString_fr.html b/core/src/main/resources/hudson/matrix/TextAxis/help-valueString_fr.html deleted file mode 100644 index 3bf5521714..0000000000 --- a/core/src/main/resources/hudson/matrix/TextAxis/help-valueString_fr.html +++ /dev/null @@ -1,4 +0,0 @@ -
                      - Valeurs à assigner aux variables. Les valeurs multiples sont - séparées par des espaces ou des retours à la ligne. -
                      diff --git a/core/src/main/resources/hudson/matrix/TextAxis/help-valueString_ja.html b/core/src/main/resources/hudson/matrix/TextAxis/help-valueString_ja.html deleted file mode 100644 index e399128d56..0000000000 --- a/core/src/main/resources/hudson/matrix/TextAxis/help-valueString_ja.html +++ /dev/null @@ -1,4 +0,0 @@ -
                      - 変数に割り当てる値です。複数の値を設定する場合は、スペースか改行で区切ります。 - 値がスペースを含む場合は、Shellと同様に引用符を使用してください。 -
                      \ No newline at end of file diff --git a/core/src/main/resources/hudson/matrix/TextAxis/help-valueString_nl.html b/core/src/main/resources/hudson/matrix/TextAxis/help-valueString_nl.html deleted file mode 100644 index f3447bd99b..0000000000 --- a/core/src/main/resources/hudson/matrix/TextAxis/help-valueString_nl.html +++ /dev/null @@ -1,3 +0,0 @@ -
                      - Waardenreeks voor uw dimensie. Waarden dienen gescheiden te worden door spaties of een nieuwe lijn character. -
                      \ No newline at end of file diff --git a/core/src/main/resources/hudson/matrix/TextAxis/help-valueString_pt_BR.html b/core/src/main/resources/hudson/matrix/TextAxis/help-valueString_pt_BR.html deleted file mode 100644 index 40cdeebf8f..0000000000 --- a/core/src/main/resources/hudson/matrix/TextAxis/help-valueString_pt_BR.html +++ /dev/null @@ -1,3 +0,0 @@ -
                      - Valores associados a variáveis. Valores múltiplos estão separados por espaço em branco ou nova linha. -
                      diff --git a/core/src/main/resources/hudson/matrix/TextAxis/help-valueString_ru.html b/core/src/main/resources/hudson/matrix/TextAxis/help-valueString_ru.html deleted file mode 100644 index 43fae7007a..0000000000 --- a/core/src/main/resources/hudson/matrix/TextAxis/help-valueString_ru.html +++ /dev/null @@ -1,3 +0,0 @@ -
                      - Значения присваиваются переменным. Множественные значения разделяются пробелами или переводами строк. -
                      \ No newline at end of file diff --git a/core/src/main/resources/hudson/matrix/TextAxis/help-valueString_tr.html b/core/src/main/resources/hudson/matrix/TextAxis/help-valueString_tr.html deleted file mode 100644 index 480593f92b..0000000000 --- a/core/src/main/resources/hudson/matrix/TextAxis/help-valueString_tr.html +++ /dev/null @@ -1,3 +0,0 @@ -
                      - Değerler, değişkenlere atanır. Birden fazla değer boşluk karakteri veya yeni satır seçeneği ile ayrılmalıdır. -
                      \ No newline at end of file diff --git a/core/src/main/resources/hudson/matrix/TextAxis/help-valueString_zh_TW.html b/core/src/main/resources/hudson/matrix/TextAxis/help-valueString_zh_TW.html deleted file mode 100644 index c2c36061a2..0000000000 --- a/core/src/main/resources/hudson/matrix/TextAxis/help-valueString_zh_TW.html +++ /dev/null @@ -1,4 +0,0 @@ -
                      - 指定給變數的值。不同值之間請用空白或是換行來隔開。 - 如果值當中有空白字元,請使用 Shell 的引號語法來處理。 -
                      diff --git a/core/src/main/resources/lib/hudson/project/matrix.jelly b/core/src/main/resources/lib/hudson/project/matrix.jelly deleted file mode 100644 index 720e6fab6b..0000000000 --- a/core/src/main/resources/lib/hudson/project/matrix.jelly +++ /dev/null @@ -1,103 +0,0 @@ - - - - - - - Generate configuration matrix and invoke body with 'p' as the instance of T - (of Layouter<T>) - - - If specified, the content of the matrix will be automatically updated via AJAX. - (This happens by requesting URL "./ajaxMatrix", so the caller needs "ajaxMatrix.jelly" - to serve this request.) - - - - -
                      - - - -

                      ${%Configurations}

                      - - - - -
                      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
                      ${%Configuration Matrix}${v}
                      ${r.drawYHeader(loop.index)} - - -
                      - -
                      -
                      -
                      -
                      -
                      -
                      - - - -
                      -
                      diff --git a/core/src/main/resources/lib/hudson/project/matrix_ar.properties b/core/src/main/resources/lib/hudson/project/matrix_ar.properties deleted file mode 100644 index 196c18b892..0000000000 --- a/core/src/main/resources/lib/hudson/project/matrix_ar.properties +++ /dev/null @@ -1,3 +0,0 @@ -# This file is under the MIT License by authors - -Configurations=\u0627\u0639\u062F\u0627\u062F\u0627\u062A diff --git a/core/src/main/resources/lib/hudson/project/matrix_cs.properties b/core/src/main/resources/lib/hudson/project/matrix_cs.properties deleted file mode 100644 index 04ad3a2878..0000000000 --- a/core/src/main/resources/lib/hudson/project/matrix_cs.properties +++ /dev/null @@ -1,23 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2010, Sun Microsystems, Inc. -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Configurations=Konfigurace diff --git a/core/src/main/resources/lib/hudson/project/matrix_da.properties b/core/src/main/resources/lib/hudson/project/matrix_da.properties deleted file mode 100644 index 4309fde13f..0000000000 --- a/core/src/main/resources/lib/hudson/project/matrix_da.properties +++ /dev/null @@ -1,24 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2010, Sun Microsystems, Inc. Kohsuke Kawaguchi. Knud Poulsen. -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Configurations=Konfigurationer -Configuration\ Matrix=Konfigurationsmatrice diff --git a/core/src/main/resources/lib/hudson/project/matrix_de.properties b/core/src/main/resources/lib/hudson/project/matrix_de.properties deleted file mode 100644 index e3aa83e6ce..0000000000 --- a/core/src/main/resources/lib/hudson/project/matrix_de.properties +++ /dev/null @@ -1,24 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Simon Wiest -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Configurations=Konfigurationen -Configuration\ Matrix=Konfigurationsmatrix diff --git a/core/src/main/resources/lib/hudson/project/matrix_es.properties b/core/src/main/resources/lib/hudson/project/matrix_es.properties deleted file mode 100644 index e532e7283e..0000000000 --- a/core/src/main/resources/lib/hudson/project/matrix_es.properties +++ /dev/null @@ -1,24 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2010, Sun Microsystems, Inc. -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Configurations=Configuraciones -Configuration\ Matrix=Matriz de configuración diff --git a/core/src/main/resources/lib/hudson/project/matrix_fi.properties b/core/src/main/resources/lib/hudson/project/matrix_fi.properties deleted file mode 100644 index 42c66e45f6..0000000000 --- a/core/src/main/resources/lib/hudson/project/matrix_fi.properties +++ /dev/null @@ -1,23 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2010, Sun Microsystems, Inc. -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Configurations=Konfiguraatiot diff --git a/core/src/main/resources/lib/hudson/project/matrix_fr.properties b/core/src/main/resources/lib/hudson/project/matrix_fr.properties deleted file mode 100644 index 953560a2a5..0000000000 --- a/core/src/main/resources/lib/hudson/project/matrix_fr.properties +++ /dev/null @@ -1,24 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Eric Lefevre-Ardant -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Configurations=Configurations -Configuration\ Matrix=Matrice de Configuration diff --git a/core/src/main/resources/lib/hudson/project/matrix_he.properties b/core/src/main/resources/lib/hudson/project/matrix_he.properties deleted file mode 100644 index 6bbb569345..0000000000 --- a/core/src/main/resources/lib/hudson/project/matrix_he.properties +++ /dev/null @@ -1,3 +0,0 @@ -# This file is under the MIT License by authors - -Configuration\ Matrix=\u05DE\u05D8\u05E8\u05D9\u05E6\u05EA \u05D4\u05D2\u05D3\u05E8\u05D5\u05EA diff --git a/core/src/main/resources/lib/hudson/project/matrix_it.properties b/core/src/main/resources/lib/hudson/project/matrix_it.properties deleted file mode 100644 index 94f696cd95..0000000000 --- a/core/src/main/resources/lib/hudson/project/matrix_it.properties +++ /dev/null @@ -1,23 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2010, Sun Microsystems, Inc. -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Configurations=Configurazioni diff --git a/core/src/main/resources/lib/hudson/project/matrix_ja.properties b/core/src/main/resources/lib/hudson/project/matrix_ja.properties deleted file mode 100644 index a13672471f..0000000000 --- a/core/src/main/resources/lib/hudson/project/matrix_ja.properties +++ /dev/null @@ -1,24 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Configurations=\u69cb\u6210 -Configuration\ Matrix=\u69cb\u6210\u30de\u30c8\u30ea\u30c3\u30af\u30b9 diff --git a/core/src/main/resources/lib/hudson/project/matrix_ko.properties b/core/src/main/resources/lib/hudson/project/matrix_ko.properties deleted file mode 100644 index 5c19c1c25c..0000000000 --- a/core/src/main/resources/lib/hudson/project/matrix_ko.properties +++ /dev/null @@ -1,3 +0,0 @@ -# This file is under the MIT License by authors - -Configurations=\uC124\uC815 diff --git a/core/src/main/resources/lib/hudson/project/matrix_nl.properties b/core/src/main/resources/lib/hudson/project/matrix_nl.properties deleted file mode 100644 index a1fea7e1c0..0000000000 --- a/core/src/main/resources/lib/hudson/project/matrix_nl.properties +++ /dev/null @@ -1,24 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, id:sorokh -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Configurations=Configuraties -Configuration\ Matrix=Configuratiematix diff --git a/core/src/main/resources/lib/hudson/project/matrix_pl.properties b/core/src/main/resources/lib/hudson/project/matrix_pl.properties deleted file mode 100644 index 5290fbdd4e..0000000000 --- a/core/src/main/resources/lib/hudson/project/matrix_pl.properties +++ /dev/null @@ -1,24 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2010, Sun Microsystems, Inc. -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Configuration\ Matrix=Macierz konfiguracji -Configurations=Konfiguracje diff --git a/core/src/main/resources/lib/hudson/project/matrix_pt_BR.properties b/core/src/main/resources/lib/hudson/project/matrix_pt_BR.properties deleted file mode 100644 index 30bce8c3f3..0000000000 --- a/core/src/main/resources/lib/hudson/project/matrix_pt_BR.properties +++ /dev/null @@ -1,24 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Reginaldo L. Russinholi, Cleiber Silva, Fernando Boaglio -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Configurations=Configura\u00e7\u00f5es -Configuration\ Matrix=Matriz de configura\u00e7\u00e3o diff --git a/core/src/main/resources/lib/hudson/project/matrix_pt_PT.properties b/core/src/main/resources/lib/hudson/project/matrix_pt_PT.properties deleted file mode 100644 index 47da6b2726..0000000000 --- a/core/src/main/resources/lib/hudson/project/matrix_pt_PT.properties +++ /dev/null @@ -1,23 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2010, Sun Microsystems, Inc. -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Configuration\ Matrix=Matrix de Configura\u00E7\u00F5es diff --git a/core/src/main/resources/lib/hudson/project/matrix_ro.properties b/core/src/main/resources/lib/hudson/project/matrix_ro.properties deleted file mode 100644 index ca9f67dae8..0000000000 --- a/core/src/main/resources/lib/hudson/project/matrix_ro.properties +++ /dev/null @@ -1,3 +0,0 @@ -# This file is under the MIT License by authors - -Configuration\ Matrix=Matricea de configurare diff --git a/core/src/main/resources/lib/hudson/project/matrix_ru.properties b/core/src/main/resources/lib/hudson/project/matrix_ru.properties deleted file mode 100644 index 5491cf120a..0000000000 --- a/core/src/main/resources/lib/hudson/project/matrix_ru.properties +++ /dev/null @@ -1,24 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Mike Salnikov -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Configurations=\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 -Configuration\ Matrix=\u041c\u0430\u0442\u0440\u0438\u0446\u0430 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0439 diff --git a/core/src/main/resources/lib/hudson/project/matrix_sv_SE.properties b/core/src/main/resources/lib/hudson/project/matrix_sv_SE.properties deleted file mode 100644 index 55f4c32249..0000000000 --- a/core/src/main/resources/lib/hudson/project/matrix_sv_SE.properties +++ /dev/null @@ -1,4 +0,0 @@ -# This file is under the MIT License by authors - -Configuration\ Matrix=Konfigurationsmatris -Configurations=Inst\u00E4llningar diff --git a/core/src/main/resources/lib/hudson/project/matrix_tr.properties b/core/src/main/resources/lib/hudson/project/matrix_tr.properties deleted file mode 100644 index 93237e6308..0000000000 --- a/core/src/main/resources/lib/hudson/project/matrix_tr.properties +++ /dev/null @@ -1,24 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Oguz Dag -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Configurations=Konfig\u00fcrasyonlar -Configuration\ Matrix=Konfig\u00fcrasyon Matrisi diff --git a/core/src/main/resources/lib/hudson/project/matrix_uk.properties b/core/src/main/resources/lib/hudson/project/matrix_uk.properties deleted file mode 100644 index 0367c63349..0000000000 --- a/core/src/main/resources/lib/hudson/project/matrix_uk.properties +++ /dev/null @@ -1,3 +0,0 @@ -# This file is under the MIT License by authors - -Configurations=\u041D\u0430\u043B\u0430\u0448\u0442\u0443\u0432\u0430\u043D\u043D\u044F diff --git a/core/src/main/resources/lib/hudson/project/matrix_zh_CN.properties b/core/src/main/resources/lib/hudson/project/matrix_zh_CN.properties deleted file mode 100644 index 000c9a45af..0000000000 --- a/core/src/main/resources/lib/hudson/project/matrix_zh_CN.properties +++ /dev/null @@ -1,23 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2010, Sun Microsystems, Inc. -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Configurations=\u914D\u7F6E diff --git a/core/src/main/resources/lib/hudson/project/matrix_zh_TW.properties b/core/src/main/resources/lib/hudson/project/matrix_zh_TW.properties deleted file mode 100644 index ffeb753191..0000000000 --- a/core/src/main/resources/lib/hudson/project/matrix_zh_TW.properties +++ /dev/null @@ -1,24 +0,0 @@ -# The MIT License -# -# Copyright (c) 2013, Chunghwa Telecom Co., Ltd., Pei-Tang Huang -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -Configurations=\u914D\u7F6E -Configuration\ Matrix=\u8a2d\u5b9a\u77e9\u9663 diff --git a/core/src/test/java/hudson/matrix/CombinationFilterUsingBuildParamsTest.java b/core/src/test/java/hudson/matrix/CombinationFilterUsingBuildParamsTest.java deleted file mode 100644 index a302c7e715..0000000000 --- a/core/src/test/java/hudson/matrix/CombinationFilterUsingBuildParamsTest.java +++ /dev/null @@ -1,304 +0,0 @@ -/* - * The MIT License - * - * Copyright (c) 2012, RedHat Inc. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package hudson.matrix; - -import static org.mockito.Matchers.anyInt; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; -import hudson.ExtensionList; -import hudson.matrix.MatrixBuild.MatrixBuildExecution; -import hudson.matrix.listeners.MatrixBuildListener; -import hudson.model.AbstractItem; -import hudson.model.BuildListener; -import hudson.model.Cause; -import hudson.model.Node; -import hudson.model.ParametersAction; -import hudson.model.Result; -import hudson.model.Run; -import hudson.model.StringParameterValue; - -import java.io.IOException; -import java.io.PrintStream; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; - -import jenkins.model.Jenkins; - -import org.apache.commons.io.output.ByteArrayOutputStream; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.jvnet.hudson.test.Bug; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; -import org.mockito.verification.VerificationMode; -import org.powermock.api.mockito.PowerMockito; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; - -/** - * Make sure that the combination filter schedules correct builds in correct order - * - * @author ogondza - */ -@RunWith(PowerMockRunner.class) -@PrepareForTest( {Jenkins.class, MatrixBuildListener.class, MatrixProject.class, AbstractItem.class}) -public class CombinationFilterUsingBuildParamsTest { - - /** - * Execute releases: experimental, stable, beta, devel - * - * x s b d - * 0.1 - * 0.9 * * * * - * 1 * * * - * 2 * * - * 3 * - */ - private static final String filter = - String.format( - "(%s) || (%s) || (%s)", - "RELEASE == 'stable' && VERSION == '1'", - "RELEASE == 'beta' && VERSION >= '1' && VERSION <= '2'", - "RELEASE == 'devel' && VERSION >= '1' && VERSION <= '3'" - ); - - private static final String touchstoneFilter = "VERSION == '0.9'"; - - private static final List releases = Arrays.asList( - "stable", "beta", "devel", "experimental" - ); - - private final Map confs = new HashMap(); - private final MatrixExecutionStrategy strategy = new DefaultMatrixExecutionStrategyImpl ( - true, touchstoneFilter, Result.SUCCESS, new NoopMatrixConfigurationSorter() - ); - - private MatrixProject project; - @Mock private MatrixBuildExecution execution; - @Mock private MatrixBuild build; - @Mock private MatrixRun run; - @Mock private BuildListener listener; - - @Mock private Jenkins jenkins; - @Mock private ExtensionList extensions; - - @Before - public void setUp() throws Exception { - - MockitoAnnotations.initMocks(this); - - usingDummyJenkins(); - usingNoListeners(); - usingDummyProject(); - usingDummyExecution(); - withReleaseAxis(releases); - } - - @Test - public void testCombinationFilterV01() throws InterruptedException, IOException { - - givenTheVersionIs("0.1"); - - strategy.run(execution); - - wasNotBuilt(confs.get("devel")); - wasNotBuilt(confs.get("beta")); - wasNotBuilt(confs.get("stable")); - wasNotBuilt(confs.get("experimental")); - } - - @Test - public void testCombinationFilterV09() throws InterruptedException, IOException { - - givenTheVersionIs("0.9"); - - strategy.run(execution); - - wasBuilt(confs.get("devel")); - wasBuilt(confs.get("beta")); - wasBuilt(confs.get("stable")); - wasBuilt(confs.get("experimental")); - } - - @Test - public void testCombinationFilterV1() throws InterruptedException, IOException { - - givenTheVersionIs("1"); - - strategy.run(execution); - - wasBuilt(confs.get("devel")); - wasBuilt(confs.get("beta")); - wasBuilt(confs.get("stable")); - wasNotBuilt(confs.get("experimental")); - } - - @Test - public void testCombinationFilterV2() throws InterruptedException, IOException { - - givenTheVersionIs("2"); - - strategy.run(execution); - - wasBuilt(confs.get("devel")); - wasBuilt(confs.get("beta")); - wasNotBuilt(confs.get("stable")); - wasNotBuilt(confs.get("experimental")); - } - - @Test - public void testCombinationFilterV3() throws InterruptedException, IOException { - - givenTheVersionIs("3"); - - strategy.run(execution); - - wasBuilt(confs.get("devel")); - wasNotBuilt(confs.get("beta")); - wasNotBuilt(confs.get("stable")); - wasNotBuilt(confs.get("experimental")); - } - - @Test - @Bug(7285) - public void reproduceTouchstoneRegression () throws InterruptedException, IOException { - - givenTheVersionIs("3"); - - // No touchstone - MatrixExecutionStrategy myStrategy = new DefaultMatrixExecutionStrategyImpl ( - true, null, Result.SUCCESS, new NoopMatrixConfigurationSorter() - ); - - myStrategy.run(execution); - - wasBuilt(confs.get("devel")); - wasNotBuilt(confs.get("beta")); - wasNotBuilt(confs.get("stable")); - wasNotBuilt(confs.get("experimental")); - } - - private void usingDummyProject() { - - project = PowerMockito.mock(MatrixProject.class); - - PowerMockito.when(build.getParent()).thenReturn(project); - PowerMockito.when(project.getUrl()).thenReturn("/my/project/"); - - when(project.getAxes()).thenReturn(new AxisList(new Axis("RELEASE", releases))); - when(project.getCombinationFilter()).thenReturn(filter); - } - - private void usingDummyExecution() { - - when(execution.getProject()).thenReturn(project); - when(execution.getBuild()).thenReturn(build); - when(execution.getListener()).thenReturn(listener); - - // throw away logs - when(listener.getLogger()).thenReturn(new PrintStream( - new ByteArrayOutputStream() - )); - - // Succeed immediately - when(run.isBuilding()).thenReturn(false); - when(run.getResult()).thenReturn(Result.SUCCESS); - } - - private void usingDummyJenkins() { - - PowerMockito.mockStatic(Jenkins.class); - when(Jenkins.getInstance()).thenReturn(jenkins); - when(jenkins.getNodes()).thenReturn(new ArrayList()); - } - - private void usingNoListeners() { - - when(extensions.iterator()).thenReturn(new ArrayList().iterator()); - when(MatrixBuildListener.all()).thenReturn(extensions); - } - - private void withReleaseAxis(final List releases) { - - for(final String release: releases) { - - confs.put(release, getConfiguration("RELEASE=" + release)); - } - - when(execution.getActiveConfigurations()).thenReturn( - new HashSet(confs.values()) - ); - } - - private MatrixConfiguration getConfiguration (final String axis) { - - final MatrixConfiguration conf = mock(MatrixConfiguration.class); - when(conf.getParent()).thenReturn(project); - when(conf.getCombination()).thenReturn(Combination.fromString(axis)); - when(conf.getDisplayName()).thenReturn(axis); - when(conf.getUrl()).thenReturn(axis); - when(conf.getBuildByNumber(anyInt())).thenReturn(run); - - return conf; - } - - private void givenTheVersionIs(final String version) { - - final ParametersAction parametersAction = new ParametersAction( - new StringParameterValue("VERSION", version) - ); - - when(build.getAction(ParametersAction.class)) - .thenReturn(parametersAction) - ; - } - - private void wasBuilt(final MatrixConfiguration conf) { - - wasBuildTimes(conf, times(1)); - } - - private void wasNotBuilt(final MatrixConfiguration conf) { - - wasBuildTimes(conf, never()); - } - - private void wasBuildTimes( - final MatrixConfiguration conf, final VerificationMode mode - ) { - - verify(conf, mode).scheduleBuild( - new ArrayList(), - new Cause.UpstreamCause((Run) build) - ); - } -} diff --git a/core/src/test/java/hudson/matrix/CombinationTest.java b/core/src/test/java/hudson/matrix/CombinationTest.java deleted file mode 100644 index 9ee7c601fb..0000000000 --- a/core/src/test/java/hudson/matrix/CombinationTest.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * The MIT License - * - * Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package hudson.matrix; - -import junit.framework.TestCase; - -import java.util.Map; -import java.util.HashMap; - -/** - * @author Kohsuke Kawaguchi - */ -public class CombinationTest extends TestCase { - AxisList axes = new AxisList( - new Axis("a","X","x"), - new Axis("b","Y","y")); - - @SuppressWarnings({"RedundantStringConstructorCall"}) - public void testEval() { - Map r = new HashMap(); - r.put("a","X"); - r.put("b",new String("Y")); // make sure this 'Y' is not the same object as literal "Y". - Combination c = new Combination(r); - - r.put("a","x"); - Combination d = new Combination(r); - - assertTrue(eval(c, null)); - assertTrue(eval(c," ")); - assertTrue(eval(c,"true")); - assertTrue(eval(c,"a=='X'")); - assertTrue(eval(c,"b=='Y'")); - assertTrue(eval(c,"(a=='something').implies(b=='other')")); - assertTrue(eval(c,"index%2==0")^eval(d,"index%2==0")); - assertTrue(eval(c,"index%2==1")^eval(d,"index%2==1")); - } - - private boolean eval(Combination c, String exp) { - return c.evalGroovyExpression(axes, exp); - } -} diff --git a/test/src/test/groovy/hudson/matrix/MatrixProjectCustomWorkspaceTest.groovy b/test/src/test/groovy/hudson/matrix/MatrixProjectCustomWorkspaceTest.groovy deleted file mode 100644 index 436a0c0210..0000000000 --- a/test/src/test/groovy/hudson/matrix/MatrixProjectCustomWorkspaceTest.groovy +++ /dev/null @@ -1,147 +0,0 @@ -package hudson.matrix - -import java.util.concurrent.CountDownLatch -import org.jvnet.hudson.test.TestBuilder -import hudson.model.AbstractBuild -import hudson.Launcher -import hudson.model.BuildListener -import org.jvnet.hudson.test.HudsonTestCase - -/** - * Tests the custom workspace support in {@link MatrixProject}. - * - * To validate the lease behaviour, use concurrent builds to run two builds and make sure they get - * same/different workspaces. - * - * @author Kohsuke Kawaguchi - */ -class MatrixProjectCustomWorkspaceTest extends HudsonTestCase { - /** - * Test the case where both the parent and the child has custom workspace specified. - */ - void testCustomWorkspace1() { - def p = createMatrixProject() - def dir = env.temporaryDirectoryAllocator.allocate() - p.customWorkspace = dir - p.childCustomWorkspace = "xyz" - - configRoundtrip(p) - configureCustomWorkspaceConcurrentBuild(p) - - // all concurrent builds should build on the same one workspace - runTwoConcurrentBuilds(p).each { b -> - assertEquals(dir.path, b.workspace.getRemote()) - b.runs.each { r -> assertEquals(new File(dir,"xyz").path, r.workspace.getRemote()) } - } - } - - /** - * Test the case where only the parent has a custom workspace. - */ - void testCustomWorkspace2() { - def p = createMatrixProject() - def dir = env.temporaryDirectoryAllocator.allocate() - p.customWorkspace = dir - p.childCustomWorkspace = null - - configRoundtrip(p) - configureCustomWorkspaceConcurrentBuild(p) - - def bs = runTwoConcurrentBuilds(p) - - // all parent builds share the same workspace - bs.each { b -> - assertEquals(dir.path, b.workspace.getRemote()) - } - // foo=1 #1 and foo=1 #2 shares the same workspace, - (0..<2).each { i -> - assertTrue bs[0].runs[i].workspace == bs[1].runs[i].workspace - } - // but foo=1 #1 and foo=2 #1 shouldn't. - (0..<2).each { i -> - assertTrue bs[i].runs[0].workspace != bs[i].runs[1].workspace - } - } - - /** - * Test the case where only the child has a custom workspace. - */ - void testCustomWorkspace3() { - def p = createMatrixProject() - p.customWorkspace = null - p.childCustomWorkspace = "." - - configRoundtrip(p) - configureCustomWorkspaceConcurrentBuild(p) - - def bs = runTwoConcurrentBuilds(p) - - // each parent gets different directory - assertTrue bs[0].workspace != bs[1].workspace - // but all #1 builds should get the same workspace - bs.each { b -> - (0..<2).each { i-> assertTrue b.workspace == b.runs[i].workspace } - } - } - - /** - * Test the case where neither has custom workspace - */ - void testCustomWorkspace4() { - def p = createMatrixProject() - p.customWorkspace = null - p.childCustomWorkspace = null - - configRoundtrip(p) - configureCustomWorkspaceConcurrentBuild(p) - - def bs = runTwoConcurrentBuilds(p) - - // each parent gets different directory - assertTrue bs[0].workspace != bs[1].workspace - // and every sub-build gets a different directory - bs.each { b -> - def x = b.runs[0].workspace - def y = b.runs[1].workspace - def z = b.workspace - - assertTrue x!=y - assertTrue y!=z - assertTrue z!=x - } - } - - /** - * Configures MatrixProject such that two builds run concurrently. - */ - def configureCustomWorkspaceConcurrentBuild(MatrixProject p) { - // needs sufficient parallel execution capability - jenkins.numExecutors = 10 - jenkins.updateComputerList() - - p.axes = new AxisList(new TextAxis("foo", "1", "2")) - p.concurrentBuild = true; - def latch = new CountDownLatch(4) - - p.buildersList.add(new TestBuilder() { - boolean perform(AbstractBuild build, Launcher launcher, BuildListener listener) { - latch.countDown() - latch.await() - return true - } - }) - } - - /** - * Runs two concurrent builds and return their results. - */ - List runTwoConcurrentBuilds(MatrixProject p) { - def f1 = p.scheduleBuild2(0) - // get one going - f1.waitForStart() - def f2 = p.scheduleBuild2(0) - - def bs = [f1, f2]*.get().each { assertBuildStatusSuccess(it) } - return bs - } -} diff --git a/test/src/test/groovy/hudson/matrix/MatrixProjectTest.groovy b/test/src/test/groovy/hudson/matrix/MatrixProjectTest.groovy deleted file mode 100644 index 118f0bbe33..0000000000 --- a/test/src/test/groovy/hudson/matrix/MatrixProjectTest.groovy +++ /dev/null @@ -1,522 +0,0 @@ -/* - * The MIT License - * - * Copyright (c) 2004-2011, Sun Microsystems, Inc., CloudBees, Inc. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package hudson.matrix - -import hudson.model.Cause -import hudson.model.Result -import hudson.slaves.DumbSlave -import hudson.slaves.RetentionStrategy -import hudson.tasks.Ant -import hudson.tasks.ArtifactArchiver -import hudson.tasks.Fingerprinter -import hudson.tasks.Maven -import hudson.tasks.Shell -import hudson.tasks.BatchFile -import org.jvnet.hudson.test.Email -import org.jvnet.hudson.test.SingleFileSCM -import org.jvnet.hudson.test.UnstableBuilder -import org.jvnet.hudson.test.recipes.LocalData; -import com.gargoylesoftware.htmlunit.html.HtmlTable -import org.jvnet.hudson.test.Bug -import org.jvnet.hudson.test.TestBuilder -import hudson.model.AbstractBuild -import hudson.Launcher -import hudson.model.BuildListener -import hudson.util.OneShotEvent -import java.util.concurrent.Future -import java.util.concurrent.TimeUnit -import java.util.concurrent.TimeoutException -import hudson.model.JDK -import hudson.model.Slave -import hudson.Functions -import hudson.model.ParametersDefinitionProperty -import hudson.model.FileParameterDefinition -import hudson.model.Cause.LegacyCodeCause -import hudson.model.ParametersAction -import hudson.model.FileParameterValue -import hudson.model.StringParameterDefinition -import hudson.model.StringParameterValue -import hudson.scm.SubversionSCM.SvnInfo; -import hudson.scm.RevisionParameterAction; -import java.util.List; -import java.util.ArrayList; -import hudson.model.Action; - -import java.util.concurrent.CountDownLatch - -import static hudson.model.Node.Mode.EXCLUSIVE -import static org.junit.Assert.* -import org.junit.Rule -import org.junit.Test -import org.jvnet.hudson.test.JenkinsRule -import org.jvnet.hudson.test.RandomlyFails -import org.junit.rules.TemporaryFolder - -/** - * - * - * @author Kohsuke Kawaguchi - */ -public class MatrixProjectTest { - - @Rule public JenkinsRule j = new JenkinsRule(); - @Rule public TemporaryFolder tmp = new TemporaryFolder(); - - /** - * Tests that axes are available as build variables in the Ant builds. - */ - @Test - public void testBuildAxisInAnt() throws Exception { - MatrixProject p = createMatrixProject(); - Ant.AntInstallation ant = j.configureDefaultAnt(); - p.getBuildersList().add(new Ant('-Dprop=${db} test',ant.getName(),null,null,null)); - - // we need a dummy build script that echos back our property - p.setScm(new SingleFileSCM("build.xml",'assertion ${prop}=${db}')); - - MatrixBuild build = p.scheduleBuild2(0, new Cause.UserCause()).get(); - List runs = build.getRuns(); - assertEquals(4,runs.size()); - for (MatrixRun run : runs) { - j.assertBuildStatus(Result.SUCCESS, run); - String expectedDb = run.getParent().getCombination().get("db"); - j.assertLogContains("assertion "+expectedDb+"="+expectedDb, run); - } - } - - /** - * Tests that axes are available as build variables in the Maven builds. - */ - @RandomlyFails("Not a v4.0.0 POM. for project org.jvnet.maven-antrun-extended-plugin:maven-antrun-extended-plugin at /home/jenkins/.m2/repository/org/jvnet/maven-antrun-extended-plugin/maven-antrun-extended-plugin/1.40/maven-antrun-extended-plugin-1.40.pom") - @Test - public void testBuildAxisInMaven() throws Exception { - MatrixProject p = createMatrixProject(); - Maven.MavenInstallation maven = j.configureDefaultMaven(); - p.getBuildersList().add(new Maven('-Dprop=${db} validate',maven.getName())); - - // we need a dummy build script that echos back our property - p.setScm(new SingleFileSCM("pom.xml",getClass().getResource("echo-property.pom"))); - - MatrixBuild build = p.scheduleBuild2(0).get(); - List runs = build.getRuns(); - assertEquals(4,runs.size()); - for (MatrixRun run : runs) { - j.assertBuildStatus(Result.SUCCESS, run); - String expectedDb = run.getParent().getCombination().get("db"); - System.out.println(run.getLog()); - j.assertLogContains("assertion "+expectedDb+"="+expectedDb, run); - // also make sure that the variables are expanded at the command line level. - assertFalse(run.getLog().contains('-Dprop=${db}')); - } - } - - /** - * Test that configuration filters work - */ - @Test - public void testConfigurationFilter() throws Exception { - MatrixProject p = createMatrixProject(); - p.setCombinationFilter("db==\"mysql\""); - MatrixBuild build = p.scheduleBuild2(0).get(); - assertEquals(2, build.getRuns().size()); - } - - /** - * Test that touch stone builds work - */ - @Test - public void testTouchStone() throws Exception { - MatrixProject p = createMatrixProject(); - p.setTouchStoneCombinationFilter("db==\"mysql\""); - p.setTouchStoneResultCondition(Result.SUCCESS); - MatrixBuild build = p.scheduleBuild2(0).get(); - assertEquals(4, build.getRuns().size()); - - p.getBuildersList().add(new UnstableBuilder()); - build = p.scheduleBuild2(0).get(); - assertEquals(2, build.exactRuns.size()); - } - - protected MatrixProject createMatrixProject() throws IOException { - MatrixProject p = j.createMatrixProject(); - - // set up 2x2 matrix - AxisList axes = new AxisList(); - axes.add(new TextAxis("db","mysql","oracle")); - axes.add(new TextAxis("direction","north","south")); - p.setAxes(axes); - - return p; - } - - /** - * Fingerprinter failed to work on the matrix project. - */ - @Email("http://www.nabble.com/1.286-version-and-fingerprints-option-broken-.-td22236618.html") - @Test - public void testFingerprinting() throws Exception { - MatrixProject p = createMatrixProject(); - if (Functions.isWindows()) - p.getBuildersList().add(new BatchFile("echo \"\" > p")); - else - p.getBuildersList().add(new Shell("touch p")); - - p.getPublishersList().add(new ArtifactArchiver("p",null,false, false)); - p.getPublishersList().add(new Fingerprinter("",true)); - j.buildAndAssertSuccess(p); - } - - void assertRectangleTable(MatrixProject p) { - def html = j.createWebClient().getPage(p); - HtmlTable table = html.selectSingleNode("id('matrix')/table") - - // remember cells that are extended from rows above. - def rowSpans = [:]; - def masterWidth = null - for (r in table.rows) { - int width = r.cells*.columnSpan.sum() + rowSpans.values().sum(0); - if (masterWidth==null) - masterWidth = width; - else - assertEquals(masterWidth,width); - - for (c in r.cells) - rowSpans[c.rowSpan] = (rowSpans[c.rowSpan]?:0)+c.columnSpan - // shift rowSpans by one - def nrs =[:] - rowSpans.each { k,v -> if(k>1) nrs[k-1]=v } - rowSpans = nrs - } - } - - @Bug(4245) - @Test - void testLayout1() { - // 5*5*5*5*5 matrix - def p = createMatrixProject(); - p.axes = new AxisList( - ['a','b','c','d','e'].collect { name -> new TextAxis(name, (1..4)*.toString() ) } - ); - assertRectangleTable(p) - } - - @Bug(4245) - @Test - void testLayout2() { - // 2*3*4*5*6 matrix - def p = createMatrixProject(); - p.axes = new AxisList( - (2..6).collect { n -> new TextAxis("axis${n}", (1..n)*.toString() ) } - ); - assertRectangleTable(p) - } - - /** - * Makes sure that the configuration correctly roundtrips. - */ - @Test - public void testConfigRoundtrip() { - j.jenkins.getJDKs().addAll([ - new JDK("jdk1.7","somewhere"), - new JDK("jdk1.6","here"), - new JDK("jdk1.5","there")]); - - List slaves = (0..2).collect { j.createSlave() } - - def p = createMatrixProject(); - p.axes.add(new JDKAxis(["jdk1.6","jdk1.5"])); - p.axes.add(new LabelAxis("label1",[slaves[0].nodeName, slaves[1].nodeName])); - p.axes.add(new LabelAxis("label2",[slaves[2].nodeName])); // make sure single value handling works OK - def o = new AxisList(p.axes); - j.configRoundtrip(p); - def n = p.axes; - - assertEquals(o.size(),n.size()); - (0 ..< (o.size())).each { i -> - def oi = o[i]; - def ni = n[i]; - assertSame(oi.class,ni.class); - assertEquals(oi.name,ni.name); - assertEquals(oi.values,ni.values); - } - - - def before = new DefaultMatrixExecutionStrategyImpl(true, "foo", Result.UNSTABLE, null) - p.executionStrategy = before; - j.configRoundtrip(p); - j.assertEqualDataBoundBeans(p.executionStrategy,before); - - before = new DefaultMatrixExecutionStrategyImpl(false, null, null, null) - p.executionStrategy = before; - j.configRoundtrip(p); - j.assertEqualDataBoundBeans(p.executionStrategy,before); - } - - @Test - public void testLabelAxes() { - def p = createMatrixProject(); - - List slaves = (0..<4).collect { j.createSlave() } - - p.axes.add(new LabelAxis("label1",[slaves[0].nodeName, slaves[1].nodeName])); - p.axes.add(new LabelAxis("label2",[slaves[2].nodeName, slaves[3].nodeName])); - - System.out.println(p.labels); - assertEquals(4,p.labels.size()); - assertTrue(p.labels.contains(j.jenkins.getLabel("slave0&&slave2"))); - assertTrue(p.labels.contains(j.jenkins.getLabel("slave1&&slave2"))); - assertTrue(p.labels.contains(j.jenkins.getLabel("slave0&&slave3"))); - assertTrue(p.labels.contains(j.jenkins.getLabel("slave1&&slave3"))); - } - - /** - * Quiettng down Hudson causes a dead lock if the parent is running but children is in the queue - */ - @Bug(4873) - @Test - void testQuietDownDeadlock() { - def p = createMatrixProject(); - p.axes = new AxisList(new TextAxis("foo","1","2")); - p.runSequentially = true; // so that we can put the 2nd one in the queue - - OneShotEvent firstStarted = new OneShotEvent(); - OneShotEvent buildCanProceed = new OneShotEvent(); - - p.getBuildersList().add( [perform:{ AbstractBuild build, Launcher launcher, BuildListener listener -> - firstStarted.signal(); - buildCanProceed.block(); - return true; - }] as TestBuilder ); - Future f = p.scheduleBuild2(0) - - // have foo=1 block to make sure the 2nd configuration is in the queue - firstStarted.block(); - // enter into the quiet down while foo=2 is still in the queue - j.jenkins.doQuietDown(); - buildCanProceed.signal(); - - // make sure foo=2 still completes. use time out to avoid hang - j.assertBuildStatusSuccess(f.get(10,TimeUnit.SECONDS)); - - // MatrixProject scheduled after the quiet down shouldn't start - try { - Future g = p.scheduleBuild2(0) - g.get(3,TimeUnit.SECONDS) - fail() - } catch (TimeoutException e) { - // expected - } - } - - @Bug(9009) - @Test - void testTrickyNodeName() { - def names = [ j.createSlave("Sean's Workstation",null), j.createSlave("John\"s Workstation",null) ]*.nodeName; - def p = createMatrixProject(); - p.setAxes(new AxisList([new LabelAxis("label",names)])); - j.configRoundtrip(p); - - LabelAxis a = p.axes.find("label"); - assertEquals(a.values as Set,names as Set); - } - - @Bug(10108) - @Test - void testTwoFileParams() { - def p = createMatrixProject(); - p.axes = new AxisList(new TextAxis("foo","1","2","3","4")); - p.addProperty(new ParametersDefinitionProperty( - new FileParameterDefinition("a.txt",""), - new FileParameterDefinition("b.txt",""), - )); - - def dir = tmp.getRoot() - def f = p.scheduleBuild2(0,new LegacyCodeCause(),new ParametersAction( - ["aaa","bbb"].collect { it -> - def v = new FileParameterValue(it+".txt",File.createTempFile(it,"", dir),it) - v.setLocation(it) - return v; - } - )) - - j.assertBuildStatusSuccess(f.get(10,TimeUnit.SECONDS)); - } - - /** - * Verifies that the concurrent build feature works, and makes sure - * that each gets its own unique workspace. - */ - @Test - void testConcurrentBuild() { - j.jenkins.numExecutors = 10 - j.jenkins.updateComputerList() - - def p = createMatrixProject() - p.axes = new AxisList(new TextAxis("foo","1","2")) - p.concurrentBuild = true; - def latch = new CountDownLatch(4) - def dirs = Collections.synchronizedSet(new HashSet()) - - p.buildersList.add(new TestBuilder() { - boolean perform(AbstractBuild build, Launcher launcher, BuildListener listener) { - dirs << build.workspace.getRemote() - def marker = build.workspace.child("file") - def name = build.fullDisplayName - marker.write(name,"UTF-8") - latch.countDown() - latch.await() - assertEquals(name,marker.readToString()) - return true - } - }) - - // should have gotten all unique names - def f1 = p.scheduleBuild2(0) - // get one going - f1.waitForStart() - def f2 = p.scheduleBuild2(0) - [f1,f2]*.get().each{ j.assertBuildStatusSuccess(it)} - - assertEquals 4, dirs.size() - } - - - /** - * Test that Actions are passed to configurations - */ - @Test - public void testParameterActions() throws Exception { - MatrixProject p = createMatrixProject(); - - ParametersDefinitionProperty pdp = new ParametersDefinitionProperty( - new StringParameterDefinition("PARAM_A","default_a"), - new StringParameterDefinition("PARAM_B","default_b"), - ); - - p.addProperty(pdp); - ParametersAction pa = new ParametersAction( pdp.getParameterDefinitions().collect { return it.getDefaultParameterValue() } ) - - MatrixBuild build = p.scheduleBuild2(0,new LegacyCodeCause(), pa).get(); - - assertEquals(4, build.getRuns().size()); - - for(MatrixRun run : build.getRuns()) { - ParametersAction pa1 = run.getAction(ParametersAction.class); - assertNotNull(pa1); - ["PARAM_A","PARAM_B"].each{ assertNotNull(pa1.getParameter(it)) } - } - } - - /** - * Test that other Actions are passed to configurations - * requires supported version of subversion plugin 1.43+ - */ - - //~ public void testMatrixChildActions() throws Exception { - //~ MatrixProject p = createMatrixProject(); - - //~ ParametersDefinitionProperty pdp = new ParametersDefinitionProperty( - //~ new StringParameterDefinition("PARAM_A","default_a"), - //~ new StringParameterDefinition("PARAM_B","default_b"), - //~ ); - - //~ p.addProperty(pdp); - - //~ List actions = new ArrayList(); - //~ actions.add(new RevisionParameterAction(new SvnInfo("http://example.com/svn/repo/",1234))); - //~ actions.add(new ParametersAction( pdp.getParameterDefinitions().collect { return it.getDefaultParameterValue() } )); - - //~ MatrixBuild build = p.scheduleBuild2(0,new LegacyCodeCause(), actions).get(); - - //~ assertEquals(4, build.getRuns().size()); - - //~ for(MatrixRun run : build.getRuns()) { - //~ ParametersAction pa1 = run.getAction(ParametersAction.class); - //~ assertNotNull(pa1); - //~ ["PARAM_A","PARAM_B"].each{ assertNotNull(pa1.getParameter(it)) }; - - //~ assertNotNull(run.getAction(RevisionParameterAction.class)); - //~ } - //~ } - - @Bug(15271) - @LocalData - @Test - public void testUpgrade() throws Exception { - MatrixProject p = j.jenkins.getItemByFullName("x", MatrixProject.class); - assertNotNull(p); - MatrixExecutionStrategy executionStrategy = p.getExecutionStrategy(); - assertEquals(DefaultMatrixExecutionStrategyImpl.class, executionStrategy.getClass()); - DefaultMatrixExecutionStrategyImpl defaultExecutionStrategy = (DefaultMatrixExecutionStrategyImpl) executionStrategy; - assertFalse(defaultExecutionStrategy.isRunSequentially()); - assertNull(defaultExecutionStrategy.getTouchStoneCombinationFilter()); - assertNull(defaultExecutionStrategy.getTouchStoneResultCondition()); - assertNull(defaultExecutionStrategy.getSorter()); - } - - @Bug(17337) - @Test public void reload() throws Exception { - MatrixProject p = j.createMatrixProject(); - AxisList axes = new AxisList(); - axes.add(new TextAxis("p", "only")); - p.setAxes(axes); - String n = p.getFullName(); - j.buildAndAssertSuccess(p); - j.jenkins.reload(); - p = j.jenkins.getItemByFullName(n, MatrixProject.class); - assertNotNull(p); - MatrixConfiguration c = p.getItem("p=only"); - assertNotNull(c); - assertNotNull(c.getBuildByNumber(1)); - } - - /** - * Given a small master and a big exclusive slave, the fair scheduling would prefer running the flyweight job - * in the slave. But if the scheduler honors the EXCLUSIVE flag, then we should see it built on the master. - * - * Since there's a chance that the fair scheduling just so happens to pick up the master by chance, - * we try multiple jobs to reduce the chance of that happening. - */ - @Bug(5076) - @Test - public void dontRunOnExclusiveSlave() { - def projects = (0..10).collect { - def m = j.createMatrixProject() - def axes = new AxisList(); - axes.add(new TextAxis("p", "only")); - m.axes = axes - return m; - } - - def s = new DumbSlave("big", "this is a big slave", j.createTmpDir().path, "20", EXCLUSIVE, "", j.createComputerLauncher(null), RetentionStrategy.NOOP); - j.jenkins.addNode(s); - - s.toComputer().connect(false).get(); // connect this guy - - projects.each { p -> - def b = j.assertBuildStatusSuccess(p.scheduleBuild2(2)) - assertSame(b.builtOn, j.jenkins) - } - } -} diff --git a/test/src/test/java/hudson/matrix/MatrixConfigurationSorterTest.java b/test/src/test/java/hudson/matrix/MatrixConfigurationSorterTest.java deleted file mode 100644 index ef78a581a1..0000000000 --- a/test/src/test/java/hudson/matrix/MatrixConfigurationSorterTest.java +++ /dev/null @@ -1,48 +0,0 @@ -package hudson.matrix; - -import hudson.model.Item; -import hudson.util.FormValidation; - -import org.jvnet.hudson.test.HudsonTestCase; -import org.jvnet.hudson.test.TestExtension; -import org.kohsuke.stapler.DataBoundConstructor; - -/** - * @author Kohsuke Kawaguchi - */ -public class MatrixConfigurationSorterTest extends HudsonTestCase { - public void testConfigRoundtrip() throws Exception { - MatrixProject p = createMatrixProject(); - configRoundtrip((Item)p); - assertEqualDataBoundBeans(new NoopMatrixConfigurationSorter(),p.getSorter()); - - SorterImpl before = new SorterImpl(); - p.setSorter(before); - p.setRunSequentially(true); - configRoundtrip((Item)p); - Object after = p.getSorter(); - assertNotSame(before,after); - assertSame(before.getClass(),after.getClass()); - } - - public static class SorterImpl extends MatrixConfigurationSorter { - @DataBoundConstructor - public SorterImpl() {} - - @Override - public void validate(MatrixProject p) throws FormValidation { - } - - public int compare(MatrixConfiguration o1, MatrixConfiguration o2) { - return o1.getDisplayName().compareTo(o2.getDisplayName()); - } - - @TestExtension - public static class DescriptorImpl extends MatrixConfigurationSorterDescriptor { - @Override - public String getDisplayName() { - return "Test Sorter"; - } - } - } -} diff --git a/test/src/test/java/hudson/matrix/MatrixProjectDependencyTest.java b/test/src/test/java/hudson/matrix/MatrixProjectDependencyTest.java deleted file mode 100644 index 750cff724e..0000000000 --- a/test/src/test/java/hudson/matrix/MatrixProjectDependencyTest.java +++ /dev/null @@ -1,41 +0,0 @@ -package hudson.matrix; - -import java.util.List; - -import org.jvnet.hudson.test.HudsonTestCase; - -import hudson.model.AbstractProject; -import hudson.model.FreeStyleBuild; -import hudson.model.FreeStyleProject; -import hudson.model.Result; -import hudson.tasks.BuildTrigger; -import hudson.util.RunList; - -/** - * @author Stefan Wolf - */ -public class MatrixProjectDependencyTest extends HudsonTestCase { - - /** - * Checks if the MatrixProject adds and Triggers downstream Projects via - * the DependencyGraph - */ - public void testMatrixProjectTriggersDependencies() throws Exception { - MatrixProject matrixProject = createMatrixProject(); - FreeStyleProject freestyleProject = createFreeStyleProject(); - matrixProject.getPublishersList().add(new BuildTrigger(freestyleProject.getName(), false)); - - jenkins.rebuildDependencyGraph(); - - buildAndAssertSuccess(matrixProject); - waitUntilNoActivity(); - - RunList builds = freestyleProject.getBuilds(); - assertEquals("There should only be one FreestyleBuild", 1, builds.size()); - FreeStyleBuild build = builds.iterator().next(); - assertEquals(Result.SUCCESS, build.getResult()); - List downstream = jenkins.getDependencyGraph().getDownstream(matrixProject); - assertTrue(downstream.contains(freestyleProject)); - } - -} diff --git a/test/src/test/java/hudson/matrix/MatrixTest.java b/test/src/test/java/hudson/matrix/MatrixTest.java deleted file mode 100644 index 369898c2c1..0000000000 --- a/test/src/test/java/hudson/matrix/MatrixTest.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * The MIT License - * - * Copyright (c) 2010-2011, Alan Harder - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package hudson.matrix; - -import hudson.model.Item; -import hudson.security.AuthorizationMatrixProperty; -import hudson.security.ProjectMatrixAuthorizationStrategy; -import java.util.Collections; -import org.acegisecurity.context.SecurityContextHolder; -import com.gargoylesoftware.htmlunit.xml.XmlPage; -import org.jvnet.hudson.test.HudsonTestCase; -import org.jvnet.hudson.test.Bug; - -/** - * @author Alan Harder - */ -public class MatrixTest extends HudsonTestCase { - - /** - * Test that spaces are encoded as %20 for project name, axis name and axis value. - */ - public void testSpaceInUrl() { - MatrixProject mp = new MatrixProject("matrix test"); - MatrixConfiguration mc = new MatrixConfiguration(mp, Combination.fromString("foo bar=baz bat")); - assertEquals("job/matrix%20test/", mp.getUrl()); - assertEquals("job/matrix%20test/foo%20bar=baz%20bat/", mc.getUrl()); - } - - /** - * Test that project level permissions apply to child configurations as well. - */ - @Bug(9293) - public void testConfigurationACL() throws Exception { - jenkins.setAuthorizationStrategy(new ProjectMatrixAuthorizationStrategy()); - MatrixProject mp = createMatrixProject(); - mp.setAxes(new AxisList(new Axis("foo", "a", "b"))); - MatrixConfiguration mc = mp.getItem("foo=a"); - assertNotNull(mc); - SecurityContextHolder.clearContext(); - assertFalse(mc.getACL().hasPermission(Item.READ)); - mp.addProperty(new AuthorizationMatrixProperty( - Collections.singletonMap(Item.READ, Collections.singleton("anonymous")))); - // Project-level permission should apply to single configuration too: - assertTrue(mc.getACL().hasPermission(Item.READ)); - } - - public void testApi() throws Exception { - MatrixProject project = createMatrixProject(); - project.setAxes(new AxisList( - new Axis("FOO", "abc", "def"), - new Axis("BAR", "uvw", "xyz"))); - XmlPage xml = new WebClient().goToXml(project.getUrl() + "api/xml"); - assertEquals(4, xml.getByXPath("//matrixProject/activeConfiguration").size()); - } -} diff --git a/test/src/test/resources/hudson/matrix/MatrixProjectTest/testUpgrade/config.xml b/test/src/test/resources/hudson/matrix/MatrixProjectTest/testUpgrade/config.xml deleted file mode 100644 index 5b53ede393..0000000000 --- a/test/src/test/resources/hudson/matrix/MatrixProjectTest/testUpgrade/config.xml +++ /dev/null @@ -1 +0,0 @@ - diff --git a/test/src/test/resources/hudson/matrix/MatrixProjectTest/testUpgrade/jobs/x/config.xml b/test/src/test/resources/hudson/matrix/MatrixProjectTest/testUpgrade/jobs/x/config.xml deleted file mode 100644 index 5a6966de9e..0000000000 --- a/test/src/test/resources/hudson/matrix/MatrixProjectTest/testUpgrade/jobs/x/config.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - false - - - true - false - false - false - - false - - - - - - \ No newline at end of file diff --git a/test/src/test/resources/hudson/matrix/echo-property.pom b/test/src/test/resources/hudson/matrix/echo-property.pom deleted file mode 100644 index a189489092..0000000000 --- a/test/src/test/resources/hudson/matrix/echo-property.pom +++ /dev/null @@ -1,70 +0,0 @@ - - - - - 4.0.0 - test - test - 0.1-SNAPSHOT - - - - - org.jvnet.maven-antrun-extended-plugin - maven-antrun-extended-plugin - 1.40 - - - validate - - - assertion ${prop}=${db} - - - - run - - - - - - - - - - m.g.o-public - http://maven.glassfish.org/content/groups/public/ - - true - - - false - - - - - \ No newline at end of file diff --git a/war/src/main/webapp/help/matrix/axes.html b/war/src/main/webapp/help/matrix/axes.html deleted file mode 100644 index 1cab051895..0000000000 --- a/war/src/main/webapp/help/matrix/axes.html +++ /dev/null @@ -1,22 +0,0 @@ -
                      - If your configuration matrix needs additional axes, you can specify them here. -

                      - For example, let's say you are trying to run a test for your database application, - and you need to test it with three databases: MySQL, PostgreSQL, and Oracle. Your - build script is designed so that you can test with a particular database by doing - ant -Ddatabase=mysql. -

                      - This is the concept of an axis. You can have a variable called "database", - which takes three values. When you configure it, Jenkins will run 3 builds, each with - different values assigned to the "database" variable to exhaustively cover - the configuration matrix. -

                      - Variables specified here are made available to the build as environment variables. - In addition, for Ant and Maven, variables are also exposed as properties, as if - -DvariableName=value are specified on the command line. -

                      - When multiple axes are specified, all of the possible combinations of axes are built - exhaustively. Multiple values in labels and JDKs are treated in the same way. So - if you specify jdk=[JDK5,JDK6], database=[mysql,postgresql,oracle], container=[jetty,tomcat], - then each build will consists of 2x3x2=12 different sub-builds. -

                      \ No newline at end of file diff --git a/war/src/main/webapp/help/matrix/axes_de.html b/war/src/main/webapp/help/matrix/axes_de.html deleted file mode 100644 index e2fb6448b6..0000000000 --- a/war/src/main/webapp/help/matrix/axes_de.html +++ /dev/null @@ -1,24 +0,0 @@ -
                      - Hier können Sie die Achsen Ihrer Konfigurationsmatrix angeben. -

                      - Beispiel: Sie haben eine Datenbankanwendung geschrieben und möchten diese mit - den drei Datenbanksystemen MySQL, PostgreSQL und Oracle testen. Ihr Build-Skript - ist so gestaltet, dass Sie ein bestimmtes Datenbanksystem testen können, indem - Sie Ant etwa folgendermaßen aufrufen: ant -Ddatabase=mysql. -

                      - Dies ist das Konzept einer "Achse". Sie definieren dazu eine Variable namens "database", - welche unterschiedliche Werte annehmen kann. Wenn Sie für diese Variable 3 Werte - konfigurieren, wird Jenkins 3 Unter-Builds ausführen - jeder mit einem anderen Wert - für die Variable "database", um die Konfigurationsmatrix erschöpfend abzudecken. -

                      - Variablen, die hier als Achse spezifiziert werden, stehen dem Build als Umgebungsvariablen - zur Verfügung. Für Ant und Maven sind die Variablen zusätzlich auch als Eigenschaften - (properties) sichtbar - genau so, als ob -DvariableName=value - in der Kommandozeile angegeben worden wäre. -

                      - Sind mehrere Achsen eingerichtet, so werden alle möglichen Kombinationen - erschöpfend in Unter-Builds ausgeführt. Mehrfache Auswahlen in Labels und JDKs - werden auf dieselbe Weise behandelt. Geben Sie beispielsweise - jdk=[JDK5,JDK6], database=[mysql,postgresql,oracle], container=[jetty,tomcat] - an, so besteht ein Build aus 2x3x2=12 unterschiedlichen Unter-Builds. -

                      \ No newline at end of file diff --git a/war/src/main/webapp/help/matrix/axes_fr.html b/war/src/main/webapp/help/matrix/axes_fr.html deleted file mode 100644 index f371aed1c6..0000000000 --- a/war/src/main/webapp/help/matrix/axes_fr.html +++ /dev/null @@ -1,30 +0,0 @@ -
                      - Si votre matrice de configuration a besoin d'axes supplémentaires, - vous pouvez les spécifiez ici. -

                      - Par exemple, supposons que vous voulez lancer un test pour une - application de base de données et que vous devez la tester avec trois - bases : MySQL, PostgreSQL et Oracle. - Votre script de build est conçu de façon à spécifier la base à tester - ainsi : - ant -Ddatabase=mysql. -

                      - Un axe, c'est ça. Vous pouvez avoir une variable "database", - qui prend trois valeurs possibles. Quand vous configurez l'axe, Jenkins - lancera 3 builds, avec les 3 valeurs possibles assignées à la variable - "database" afin de couvrir toutes combinaisons de configurations - possibles (la matrice des configurations). -

                      - Les variables spécifiées ici sont disponibles pour le build comme - variables d'environnement. - De plus, pour Ant et Maven, les variables sont également exposées en - tant que propriétés, comme si elles étaient passées avec - -DnomVariable=valeur en ligne de commande. -

                      - Quand plusieurs axes sont spécifiés, toutes les combinaisons d'axe - possibles sont construites de façon exhaustive. Les valeurs multiples - pour les labels et les JDKs sont traitées de la même façon. Par exemple, - si vous spécifiez jdk=[JDK5,JDK6], database=[mysql,postgresql,oracle], - container=[jetty,tomcat], alors chaque build exhaustif consistera en - 2x3x2=12 sous-builds différents. -

                      \ No newline at end of file diff --git a/war/src/main/webapp/help/matrix/axes_ja.html b/war/src/main/webapp/help/matrix/axes_ja.html deleted file mode 100644 index 99f2630700..0000000000 --- a/war/src/main/webapp/help/matrix/axes_ja.html +++ /dev/null @@ -1,21 +0,0 @@ -
                      - 構成軸を追加する必要があれば、ここで指定します。 -

                      - 例えば、データベースアプリケーションのテストを実行し、 - MySQL、PostgreSQLおよびOracleの3つのデータベースでテストする必要があるとしましょう。 - ant -Ddatabase=mysqlを実行して特定のデータベースでテストできるように、 - ビルドスクリプトがデザインされています。 -

                      - これが、構成軸のコンセプトです。"database"という変数を使用し、その変数は3つの値をとります。 - 構成軸を設定すると、Jenkinsは3つのビルドを起動します。それぞれのビルドは、構成マトリックスを全てカバーするように、 - "database"変数に異なる値が割り当てられます。 -

                      - ここで指定した変数は、環境変数としてビルドで利用できます。さらに、 - コマンドラインで-DvariableName=valueと指定したのと同様に、 - AntやMavenでプロパティでも利用できます。 -

                      - 複数の軸が指定されている場合、軸の取り得る全ての組み合わせが組み立てられます。 - ラベルやJDKに複数の値を設定した場合も同様に扱われます。つまり、jdk=[JDK5,JDK6]、 - database=[mysql,postgresql,oracle]およびcontainer=[jetty,tomcat]と指定した場合、 - 各ビルドは、2x3x2=12個の異なるサブビルドで構成されます。 -

                      \ No newline at end of file diff --git a/war/src/main/webapp/help/matrix/axes_nl.html b/war/src/main/webapp/help/matrix/axes_nl.html deleted file mode 100644 index fa3ad8516f..0000000000 --- a/war/src/main/webapp/help/matrix/axes_nl.html +++ /dev/null @@ -1,15 +0,0 @@ -
                      - Indien uw configuratiematrix extra dimensies benodigd, kunt U die hier opgeven. -

                      - Stel dat U uw databankapplicatie wenst te testen t.o.v. 3 databanken : MySQL, PostgreSQL, en Oracle. - U hebt uw bouwspecifcatie zo ontworpen dat U, door het opgeven van een optie, kunt kiezen t.o.v. welk systeem U wenst te testen, bvb. - ant -Ddatabank=mysql. -

                      - Dit is het concept van een matrixdimensie. U kunt een variabele "databank" hebben, met drie waarden. Zo geconfigureerd, zal Jenkins 3 bouwpogingen lanceren, elk met een andere waarde voor die parameter. Op die manier worden alle mogelijkheden in de matrix afgetoetst. -

                      -De hier gedefinieerde variabelen worden als omgevingsparameters beschikbaar gesteld aan uw bouwpogingen. - Meer nog, in het geval U Ant of Maven gebruikt, zullen de variabelen ook als parameters beschikbaar gesteld worden, alsof - -DparameterNaam=waarde op de commandolijn meegegeven werd. -

                      - Indien U meerdere dimensies opgeeft, zullen alle mogelijke combinaties afgetoetst worden. Meerdere waarden in labels en JDKs worden op dezelfde manier behandeld. Indien U dus jdk=[JDK5,JDK6], database=[mysql,postgresql,oracle], container=[jetty,tomcat] opgeeft, zal een bouwpoging feitelijk 2x3x2=12 verschillende bouwpogingen omvatten. -

                      \ No newline at end of file diff --git a/war/src/main/webapp/help/matrix/axes_pt_BR.html b/war/src/main/webapp/help/matrix/axes_pt_BR.html deleted file mode 100644 index 8a8e33793f..0000000000 --- a/war/src/main/webapp/help/matrix/axes_pt_BR.html +++ /dev/null @@ -1,22 +0,0 @@ -
                      - Se sua matriz de configuração precisa de eixos adicionais, você pode especificá-los aqui. -

                      - Por exemplo, vamos dizer que você está tentando executar um teste para sua aplicação de banco de dados, - e você precisa testá-la com três bancos de dados: MySQL, PostgreSQL, e Oracle. Seu - script de construção está projetado tal que você possa testar com um banco de dados particular usando - ant -Ddatabase=mysql. -

                      - Este é o conceito de um eixo. Você pode ter uma variável chamada "database", - que recebe três valores. Quando você configurá-la, Jenkins executará 3 construções, cada uma com - valores diferentes para a variável "database" para exaustivamente cobrir - a matriz de configuração. -

                      - Variáveis especificadas aqui se tornam disponíveis para a construção como variáveis de ambiente. - Em adição, para Ant e Maven, as variáveis também são expostas como propriedades, como se - -DnomeDaVariavel=valor fossem especificadas na linha de comando. -

                      - Quando múltiplos eixos são especificados, todas as possíveis combinações dos eixos são construídas - exaustivamente. Valores múltiplos em labels e JDKs são tratados da mesma maneira. Assim - se você especificar jdk=[JDK5,JDK6], database=[mysql,postgresql,oracle], container=[jetty,tomcat], - então cada construção consistirá de 2x3x2=12 diferentes sub-construções. -

                      diff --git a/war/src/main/webapp/help/matrix/axes_ru.html b/war/src/main/webapp/help/matrix/axes_ru.html deleted file mode 100644 index a2eee1a7a9..0000000000 --- a/war/src/main/webapp/help/matrix/axes_ru.html +++ /dev/null @@ -1,24 +0,0 @@ -
                      - Если ваша конфигурационная матрица нуждается в дополнительных осях (размерностях, степенях свободы), - вы можете настроить их здесь. -

                      - Например, скажем вы собираетесь запускать тесты для вашего приложения использующего СУБД - и вам необходимо проверить его с тремя СУБД: MySQL, PostgreSQL и Oracle. Ваш сборочный - скрипт разработан таким образом, что вы можете протестировать работу приложения с конкретной - СУБД с помощью команды ant -Ddatabase=mysql. -

                      - Это и есть концепция осей. Вы можете создать переменную с именем "database", которая - может принимать 3 значения. Когда вы её настроите, Jenkins будет запускать 3 сборки, каждую с - одним элементом из области значений переменной "database", чтобы полностью покрыть - конфигурационную матрицу. -

                      - Переменные, описанные здесь, доступны сборке как переменные окружения. Вдобавок, - для Ant и Maven, переменные также предоставляются как свойства, как будто - в командной строке было указано -DИмяПеременной=Значение. -

                      - В случае, когда определено несколько осей, все возможные комбинации будут использованы - при сборке. Множественные значения в метках и JDK интерпретируются таким же образом. - Так что если вы укажете jdk=[JDK5,JDK6], database=[mysql,postgresql,oracle], - container=[jetty,tomcat], тогда каждая сборка будет содержать 2x3x2=12 различных - подсборок. -

                      \ No newline at end of file diff --git a/war/src/main/webapp/help/matrix/axes_tr.html b/war/src/main/webapp/help/matrix/axes_tr.html deleted file mode 100644 index 0094c8a57e..0000000000 --- a/war/src/main/webapp/help/matrix/axes_tr.html +++ /dev/null @@ -1,20 +0,0 @@ -
                      - Konfigürasyon matrisinizin daha fazla eksene ihtiyacı varsa, burada belirleyebilirsiniz. -

                      - Diyelim ki veritabanı uygulamanız ile ilgili bir test çalıştırmanız gerekiyor ve - bunu da üç ayrı veritabanı ile yapmak istiyorsunuz: MySQL, PostgreSQL, ve Oracle. - Yapılandırma dosyalarınızı, ant -Ddatabase=mysql şeklinde çalışabilecek bir biçimde tasarlayabilirsiniz. -

                      - Eksenin devreye girdiği kısım burasıdır. "database" isimli bir değişkeniniz vardır ve üç değer alır. - Konfigürasyonu yaptığınızda, Jenkins konfigürasyon matrisini tamamlamak adına "database" - değişkenine atanan üç ayrı değişkenle yapılandırmayı 3 kere çalıştıracaktır. -

                      - Burada belirlenen değişkenler, yapılandırmaya ortam değişkeni olarak aktarılabilirler. - Ant ve Maven için buna ek olarak, değişkenler, komut satırında -DvariableName=value - şeklindeki gibi özellik olarak bulunabilirler. -

                      - Birden fazla eksen tanımı yapıldığında, eksenlerin mümkün tüm kombinasyonları ayrıntılı bir şekilde - yapılandırılır. Etiketlerde veya JDK'larda tanımlanan çoklu-değerler de aynı şekilde işlenir. - Yani, eğer jdk=[JDK5,JDK6],database=[mysql,postgresql,oracle] ve container=[jetty,tomcat] şeklinde - bir tanım yaparsanız, her yapılandırma için 2x3x2=12 adet alt-yapılandırma çalıştırılacaktır. -

                      \ No newline at end of file diff --git a/war/src/main/webapp/help/matrix/axes_zh_TW.html b/war/src/main/webapp/help/matrix/axes_zh_TW.html deleted file mode 100644 index e85e23fb9f..0000000000 --- a/war/src/main/webapp/help/matrix/axes_zh_TW.html +++ /dev/null @@ -1,21 +0,0 @@ -
                      - 您可以在這裡新增設定矩陣的軸線。 - -

                      - 假如想要在 MySQL, PostgreSQL 及 Oracle 上測試開發的資料庫應用程式, - 您的建置 Script 應該就要能指定要測試的資料庫,例如 ant -Ddatabase=mysql。 - -

                      - 這就是軸線的概念,您可以設計出帶三種值的 "database" 變數。 - 設定好後,Jenkins 會執行三次建置,每一次都套不同的 "database" 變數值,完整涵蓋整個設定矩陣。 - -

                      - 這裡定義的變數會變成建置過程中可以看到的環境變數。 - 對 Ant 及 Maven 而言,變數同時會以屬性方式帶入,就等同在命令列加上 - -DvariableName=value。 - -

                      - 如果設定多個軸線,軸線所有的排列組合都會被建置一次,標籤及 JDK 軸也一樣。 - 所以如果您設定 jdk=[JDK5,JDK6], database=[mysql,postgresql,oracle], container=[jetty,tomcat], - 那麼每次建置都會有 2 × 3 × 2 = 12 種不同的子建置。 -

                      \ No newline at end of file diff --git a/war/src/main/webapp/help/matrix/combinationfilter.html b/war/src/main/webapp/help/matrix/combinationfilter.html deleted file mode 100644 index 4449b3966b..0000000000 --- a/war/src/main/webapp/help/matrix/combinationfilter.html +++ /dev/null @@ -1,54 +0,0 @@ -
                      - By default, Jenkins builds all the possible combinations of axes exhaustively. But sometimes this is too many, - or may contain combinations that don't make sense. - In such a situation, you can make the matrix sparse by filtering out combinations that you don't want through - a Groovy expression that returns true or false. - -

                      - When you specify a Groovy expression here, only the combinations that result in true - will be built. In evaluating the expression, axes are exposed as variables (with their values set - to the current combination evaluated). - -

                      Filtering based on values

                      -

                      - For example, let's say you are building on different operating systems for - different compilers. Assume that your slave labels are label=[linux,solaris] and you have - created an axis as compiler=[gcc,cc]. - - Any of the following expressions will filter out cc builds on linux. Depending on - how you think about this constraint, you'll probably find some more intuitive than others. - -

                      - - - - - - - - - - - - - -
                      Read "if both linux and cc, it's invalid" -
                      !(label=="linux" && compiler=="cc")
                      -
                      Read "for a combination to be valid, it has to be either on solaris or on gcc." -
                      label=="solaris" || compiler=="gcc"
                      -
                      Read "if on Solaris, just do cc" -
                      (label=="solaris").implies(compiler=="cc")
                      -
                      -
                      - -

                      Sparsening of the matrix

                      -

                      - In addition to the specific filtering rules based on values, one can also use a special - variable "index", which can be used to sparsen the matrix. - -

                      - For example, index%2==0 would cut the matrix size in half by removing one - combination per every 2 combinations, in such a way that the coverage is still reasonable. - Similarly, index%3!=0 would cut the matrix size into 66% by throwing - away every 1 out of 3 combinations. -

                      \ No newline at end of file diff --git a/war/src/main/webapp/help/matrix/combinationfilter_de.html b/war/src/main/webapp/help/matrix/combinationfilter_de.html deleted file mode 100644 index 93bc8f07b9..0000000000 --- a/war/src/main/webapp/help/matrix/combinationfilter_de.html +++ /dev/null @@ -1,55 +0,0 @@ -
                      - Jenkins baut standardmäßig alle möglichen Kombinationen aller Achsen auf erschöpfende Weise. - Manchmal sind dies jedoch einfach zu viele Kombinationen oder es gibt Kombinationen, die - aus fachlicher Sicht nicht erwünscht sind. - - In diesen Situationen können Sie die Matrix ausdünnen, indem Sie über einen Groovy-Ausdruck - unerwünschte Kombinationen herausfiltern. - -

                      - Geben Sie hier einen Groovy-Ausdruck an, so werden nur diejenigen Kombinationen gebaut, für - die der Ausdruck true ergibt. Die momentanen Werte der Achsen stehen dem Ausdruck - dabei als initialisierte Variablen zur Verfügung. - -

                      Werte-basiertes Filtern

                      -

                      - Beispiel: Sie bauen auf unterschiedlichen Betriebssystemen mit unterschiedlichen Compilern. - Ihre Slave-Knoten sind mit den Labels label=[linux,solaris] gekennzeichnet und Sie haben - eine Achse compiler=[gcc,cc] angelegt. - - Jeder der folgenden Ausdrücke wird Builds mit cc auf linux herausfiltern. Je nach - persönlicher Herangehensweise werden Sie die Ausdrücke unterschiedlich intuitiv finden. - -

                      - - - - - - - - - - - - - -
                      Ansatz: "Wenn linux und cc gleichzeitig zutrifft, ist die Kombination ungültig." -
                      !(label=="linux" && compiler=="cc")
                      -
                      Ansatz: "Eine gültige Kombination verwendet entweder solaris oder gcc." -
                      label=="solaris" || compiler=="gcc"
                      -
                      Ansatz: "Wenn auf solaris, dann nur cc erlauben." -
                      (label=="solaris").implies(compiler=="cc")
                      -
                      -
                      - -

                      Ausdünnen der Matrix

                      -

                      - Zusätzlich zu den werte-basierten Filterregeln, können Sie die Variable "index" verwenden, - um die Matrix auszudünnen. - -

                      - Beispiel: index%2==0 halbiert die Größe der Matrix, in dem nur noch jede zweite Kombination - gebaut wird. Analog drittelt index%3!=0 die Größe der Matrix, in dem nur noch jede dritte - Kombination gebaut wird, usw. -

                      \ No newline at end of file diff --git a/war/src/main/webapp/help/matrix/combinationfilter_fr.html b/war/src/main/webapp/help/matrix/combinationfilter_fr.html deleted file mode 100644 index d89741b26a..0000000000 --- a/war/src/main/webapp/help/matrix/combinationfilter_fr.html +++ /dev/null @@ -1,54 +0,0 @@ -
                      - Par défaut, Jenkins builde toutes les combinaisons possibles de tous les axes, de façon exhaustive. Parfois, - cela fait trop de combinaisons ou certaines combinaisons n'ont pas de sens. - Dans ce cas, vous pouvez réduire la matrice en filtrant les combinaisons que vous ne voulez pas à l'aide - d'une expression Groovy qui retourne vrai ou faux. - -

                      - Quand vous spécifiez une expression Groovy ici, seules les combinaisons qui retournent true - seront construites. Lors de l'évaluation de l'expression, les axes sont exposés comme des variables - (avec leurs valeurs positionnées sur la combinaison courante). - -

                      Filtre basé sur les valeurs

                      -

                      - Par exemple, disons que vous buildez sur des systèmes d'exploitation différents, pour des compilateurs - différents. Supposons que les libellés de vos esclaves sont label=[linux,solaris] et que vous - avez un axe compiler=[gcc,cc]. - - Chacune des expressions suivantes filtreront (c-à-d retireront) les builds cc sur linux. - Selon la façon dont vous envisagez cette contrainte, vous trouverez certaines expressions plus claires - que d'autres. - -

                      - - - - - - - - - - - - - -
                      Lire "si simultanément linux et cc, alors c'est invalide" -
                      !(label=="linux" && compiler=="cc")
                      -
                      Lire "pour qu'une combinaison soit valide, elle doit être soit sur solaris, soit utiliser gcc." -
                      label=="solaris" || compiler=="gcc"
                      -
                      Lire "quand on est sur solaris, n'utiliser que cc" -
                      (label=="solaris").implies(compiler=="cc")
                      -
                      -
                      - -

                      Limitation de la matrice

                      -

                      - En plus des règles de filtrage basées sur les valeurs, on peut également utiliser une - variable spéciale "index" qui peut être utilisée pour diminuer la matrice. - -

                      - Par exemple, index%2==0 diminuerait la matrice de moitié en retirant 1 combinaison sur 2, - de façon à ce que la couverture reste raisonnable. - De même, index%3!=0 réduirait la matrice à 66% en supprimant 1 combinaison sur 3. -

                      \ No newline at end of file diff --git a/war/src/main/webapp/help/matrix/combinationfilter_ja.html b/war/src/main/webapp/help/matrix/combinationfilter_ja.html deleted file mode 100644 index 81d8a04b1e..0000000000 --- a/war/src/main/webapp/help/matrix/combinationfilter_ja.html +++ /dev/null @@ -1,49 +0,0 @@ -
                      - デフォルトで、Jenkinsは構成軸のすべての組み合わせをビルドします。しかし、場合によってはこれでは組み合わせが多すぎるか、 - 望ましくない組み合わせができてしまうことがあります。 - そのような場合、真偽値を返すGroovyの式で必要のない組み合わせをフィルタリングする事で、構成マトリックスをまばらにすることができます。 - -

                      - Groovyの式をここで指定すると、式の結果がtrueになる組み合わせのみビルドされます。 - 式の評価では、軸は変数として扱われます(評価中の組み合わせに値をセットします)。 - -

                      値によるフィルタリング

                      -

                      - 例えば、異なるOS上で複数のコンパイラを使用してビルドすることを考えてみましょう。 - スレーブのラベルはlabel=[linux,solaris]とし、compiler=[gcc,cc]という構成軸を作成したとします。 - - 次の式は、どれもlinux上でのccによるビルドを除去します。 - この制約をどう考えるかにもよって、どの式が望ましいと思うかは個人差があるでしょう。 - -

                      - - - - - - - - - - - - - -
                      "linuxとccの場合は無効" -
                      !(label=="linux" && compiler=="cc")
                      -
                      "solarisかgccの場合は有効" -
                      label=="solaris" || compiler=="gcc"
                      -
                      "solarisであればccのみ使用する" -
                      (label=="solaris").implies(compiler=="cc")
                      -
                      -
                      - -

                      まばらな行列を作る

                      -

                      - 特定の値の組み合わせの除去に加えて、予約されたindex変数を使って行列を一様にまばらにすることができます。 - -

                      - 例えば、index%2==0とすると、2つに1つの組み合わせを除去することで、ビルドする組み合わせのサイズを半分に - することができます。同様に、index%3!=0とすると、3つに1つの組み合わせが除去されサイズは66%になります。 - indexの値は、剰余計算においてビルドが特定の値に偏らないように計算されます。 -

                      diff --git a/war/src/main/webapp/help/matrix/combinationfilter_zh_TW.html b/war/src/main/webapp/help/matrix/combinationfilter_zh_TW.html deleted file mode 100644 index de9dd19301..0000000000 --- a/war/src/main/webapp/help/matrix/combinationfilter_zh_TW.html +++ /dev/null @@ -1,47 +0,0 @@ -
                      - Jenkins 預設會建置所有軸線可能的排列組合。不過有時候組合會過多,或是有些組合根本就不合理。 - 這種情況下,您可以使用 Groovy 表示式回傳值過濾掉不要的組合,讓矩陣稀疏點。 - -

                      - 設定了 Groovy 表示式後,只有回傳結果是 true 的組合才會建置。 - 表示式執行時,軸線值會被當做變數傳入 (變數值設成當下要判斷的組合)。 - -

                      依變數值篩選

                      -

                      - 假設您要在不同作業系統的不同編譯器上建置。 - 而您的 Slave 標籤有 label=[linux,solaris],並建了 compiler=[gcc,cc] 這個軸線。 - - 下列的每一個表式示都會過濾掉在 linux 上的 cc 建置。 - 差別在您怎麼看待這個限制,您可能會覺得某些方式就是比較直觀。 - -

                      - - - - - - - - - - - - - -
                      讀作「同時是 Linux 跟 cc 時,就不要做」。 -
                      !(label=="linux" && compiler=="cc")
                      -
                      讀作「一定要在 Solaris 上或是用 gcc 才算是有效的組合」。 -
                      label=="solaris" || compiler=="gcc"
                      -
                      讀作「在 Solaris 上,只用 cc」。 -
                      (label=="solaris").implies(compiler=="cc")
                      -
                      -
                      - -

                      矩陣稀疏化

                      -

                      - 除了設定變數值篩選規則外,您也可以使用 "index" 特別變數,將矩陣稀疏化。 - -

                      - 例如 index%2==0 可以跳過一種組合後再挑一種,讓矩陣大小減半,這種涵蓋率也很合常理。 - 同樣的,index%3!=0 會每三種組合就挑一個掉,讓矩陣縮小三分之一。 -

                      \ No newline at end of file diff --git a/war/src/main/webapp/help/matrix/jdk.html b/war/src/main/webapp/help/matrix/jdk.html deleted file mode 100644 index 398c3418ec..0000000000 --- a/war/src/main/webapp/help/matrix/jdk.html +++ /dev/null @@ -1,12 +0,0 @@ -
                      - Specify the JDK(s) with which builds are performed. If none is selected, - the default JDK is used (no explicit JAVA_HOME, and java command - is assumed to be in PATH.) If multiple JDKs are selected, - the configuration matrix will include all of the specified JDKs. -
                      - Selecting multiple values is typically useful when this job is running tests, - and you need to run tests on multiple different versions of JDKs. -
                      - During a build, the selected JDK value for the given run is available as the "jdk" axis. - See the help of "axes" below for more information about how to access the axis value. -
                      \ No newline at end of file diff --git a/war/src/main/webapp/help/matrix/jdk_de.html b/war/src/main/webapp/help/matrix/jdk_de.html deleted file mode 100644 index 9f2d94d4b2..0000000000 --- a/war/src/main/webapp/help/matrix/jdk_de.html +++ /dev/null @@ -1,15 +0,0 @@ -
                      - Geben Sie die JDK(s) an, mit denen die Unter-Builds durchgeführt werden sollen. - Wenn kein JDK ausgewählt ist, wird das Default-JDK verwendet (kein explizites - Setzen der Umgebungsvariable JAVA_HOME; es wird erwartet, dass die - Kommandozeilenanwendung java im Suchpfad PATH enthalten ist). - Wenn mehrere JDKs ausgewählt sind, deckt die Konfigurationsmatrix alle diese - JDKs ab. -

                      - Eine Mehrfachauswahl ist typischerweise dann nützlich, wenn dieser Job Tests - beinhaltet und Sie diese Tests mit unterschiedlichen JDKs ausführen möchten. -

                      - Während eines Builds ist das aktuelle JDK als Achse jdk sichtbar. - Im Hilfetext zu "Achsen" finden Sie weitere Informationen, wie Sie auf die - Werte der Achsenvariablen zugreifen können. -

                      \ No newline at end of file diff --git a/war/src/main/webapp/help/matrix/jdk_fr.html b/war/src/main/webapp/help/matrix/jdk_fr.html deleted file mode 100644 index 2073b49b0a..0000000000 --- a/war/src/main/webapp/help/matrix/jdk_fr.html +++ /dev/null @@ -1,15 +0,0 @@ -
                      - Spécifie le(s) JDK avec le(s)quel(s) les builds seront exécutés. Si aucun - n'est donné, le JDK par défaut est utilisé (pas de variable - JAVA_HOME explicite; on suppose que la commande java - est dans le PATH). Si de multiples JDK sont précisés, la - matrice de configuration incluera tous ces JDK. -
                      - Avoir de multiples valeurs est utile typiquement quand le job exécute des - tests et que vous devez les lancer sur plusieurs versions différentes - du JDK. -
                      - Au cours d'un build, le JDK sélectionné est visible dans l'axe 'jdk'. - Référez-vous à l'aide sur les 'axes' ci-dessous pour plus d'information - sur l'accès à la valeur d'un axe. -
                      \ No newline at end of file diff --git a/war/src/main/webapp/help/matrix/jdk_ja.html b/war/src/main/webapp/help/matrix/jdk_ja.html deleted file mode 100644 index cd0f1be3fa..0000000000 --- a/war/src/main/webapp/help/matrix/jdk_ja.html +++ /dev/null @@ -1,10 +0,0 @@ -
                      - ビルドを実行するJDKを指定します。指定しなければ、 - デフォルトのJDKを使用します(明示的にJAVA_HOMEはしませんし、javaコマンドはパスに設定されていると想定します)。 - 複数のJDKを指定した場合、構成軸は指定した全てのJDKを含みます。 -
                      - ジョブがテストを実行する場合や、異なるバージョンのJDKでテストする必要がある場合に、複数の値の選択は便利です。 -
                      - 指定されたJDKの値は、ビルド中は"jdk"という軸として利用可能です。 - 軸の値のアクセス方法の詳細については、"構成軸"のヘルプを参照してください。 -
                      \ No newline at end of file diff --git a/war/src/main/webapp/help/matrix/jdk_nl.html b/war/src/main/webapp/help/matrix/jdk_nl.html deleted file mode 100644 index 35f52cc4d8..0000000000 --- a/war/src/main/webapp/help/matrix/jdk_nl.html +++ /dev/null @@ -1,8 +0,0 @@ -
                      - Geef uw JDK(s) op waarmee U uw bouwpoging wenst te lanceren. Indien U ervoor kiest geen specifieke JDK(s) op te geven, zal de standaard JDK gebruikt worden. Hierbij wordt er vanuit gegaan dat er geen JAVA_HOME gedefinieerd werd en dat het java commando niet op uw PATH aanwezig is. Indien U meerdere JDKs selecteert, zal uw matrixconfiguratie al deze omvatten. -
                      - Meerdere waarden zijn typisch nuttig wanneer een job onder meerdere JDKs getest dient te worden. -
                      - Gedurende uw bouwpoging is de gekozen versie van de JDK beschikbaar als de "jdk"-dimensie. - Zie de hulpagina over dimensies voor meer informatie over het gebruik van dimensies. -
                      \ No newline at end of file diff --git a/war/src/main/webapp/help/matrix/jdk_pt_BR.html b/war/src/main/webapp/help/matrix/jdk_pt_BR.html deleted file mode 100644 index e4bea2f6c1..0000000000 --- a/war/src/main/webapp/help/matrix/jdk_pt_BR.html +++ /dev/null @@ -1,12 +0,0 @@ -
                      - Especifica a(s) JDK(s) com as quais as construções são executadas. Se nenhuma for selecionada, - a JDK padrão é usada (sem JAVA_HOME explícito, e o comando java - é assumido que está no PATH.) Se múltiploas JDKs forem selecionadas, - a matriz de configuração incluirá todos as JDKs especificadas. -
                      - Selecionar valores múltiplos é tipicamente útil quando a tarefa for executar teste, - e você precisar executar testes em múltiplas versões diferentes de JDKs. -
                      - Durante uma construção, o valor de JDK selecionado para a execução está disponível como o eixo "jdK". - Veja a ajuda de "eixos" abaixo para mais informações sobre como acessar o valor do eixo. -
                      diff --git a/war/src/main/webapp/help/matrix/jdk_ru.html b/war/src/main/webapp/help/matrix/jdk_ru.html deleted file mode 100644 index 35cbfcf51c..0000000000 --- a/war/src/main/webapp/help/matrix/jdk_ru.html +++ /dev/null @@ -1,13 +0,0 @@ -
                      - Выберите JDK с которым(и) будет выполняться сборка. Если ни одного не выбрано, - будет использован JDK по-умолчанию (без явного JAVA_HOME, и команды java - не будет указано в PATH). Если несколько JDK выбрано, - конфигурационная матрица будет содержать все выбранные JDK. -
                      - Выбор нескольких значений обычно полезен в случаях когда проект тестируется и вам нужно - запускать тесты на нескольких разных версиях JDK. -
                      - Во время сборки выбранное значение JDK доступно как ось "jdk". - Смотрите в подсказку к опции "Оси (axes)" ниже для получения более подробной информации о том как - получить значения по осям. -
                      \ No newline at end of file diff --git a/war/src/main/webapp/help/matrix/jdk_tr.html b/war/src/main/webapp/help/matrix/jdk_tr.html deleted file mode 100644 index d7aaa75537..0000000000 --- a/war/src/main/webapp/help/matrix/jdk_tr.html +++ /dev/null @@ -1,11 +0,0 @@ -
                      - Yapılandırmaların çalıştırılacağı JDK(ları) belirleyiniz. Eğer, herhangi biri seçilmez ise - varsayılan JDK kullanılacaktır (JAVA_HOME'un olmadığı, ve java komutunun - PATH içerisinde olduğu varsayılmaktadır.). Eğer birden fazla JDK seçilirse, konfigürasyon matrisi belirtilen - tüm JDK'ları içerecektir. -
                      - Eğer yapılmak istenen testin, farklı JDK'lar üzerinde çalıştırılması isteniyorsa, birden fazla değer seçmek kullanışlı olacaktır, -
                      - Yapılandırma esnasında, seçilen JDK değeri "jdK" ekseni olarak görülecektir. - Eksen değerlerine nasıl erişileceğine dair daha fazla bilgi için, aşağıda "eksenler" ile ilgili yardım kısmına bakınız. -
                      \ No newline at end of file diff --git a/war/src/main/webapp/help/matrix/jdk_zh_TW.html b/war/src/main/webapp/help/matrix/jdk_zh_TW.html deleted file mode 100644 index 66fe048d44..0000000000 --- a/war/src/main/webapp/help/matrix/jdk_zh_TW.html +++ /dev/null @@ -1,10 +0,0 @@ -
                      - 指定要用來執行建置的 JDK。如果沒有選取任何項目,會使用預設 JDK (如果沒有明確的 - JAVA_HOME 設定,會使用在 PATH 路徑裡的 java 指令)。 - 如果選了超過一個 JDK,設定陣矩會將它們全部納進來。 -
                      - 如果您的作業會執行測試,而且需要在不同版本的 JDK 上都跑過一次,您就可以將這些 JDK 都選進來。 -
                      - 建置時,選取的 JDK 值會在 "jdk" 軸上出現。 - 請參考下方的「軸線」,了解如何存取座標值的相關資料。 -
                      \ No newline at end of file From 17ba1dad1f8229b7650e8cbb6cc91ddf89aebe10 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Mon, 14 Apr 2014 19:05:55 -0400 Subject: [PATCH 253/701] Comment, but not critical for separation. (cherry picked from commit e405078e093dac71daeff8576ebccdcf27b718ba) --- core/src/main/resources/hudson/model/Job/index.jelly | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/resources/hudson/model/Job/index.jelly b/core/src/main/resources/hudson/model/Job/index.jelly index b272840da2..d538942b4f 100644 --- a/core/src/main/resources/hudson/model/Job/index.jelly +++ b/core/src/main/resources/hudson/model/Job/index.jelly @@ -28,7 +28,7 @@ THE SOFTWARE.

                      ${it.pronoun}

                      - + ${%Project name}: ${it.fullName} From bf2cd1a689e7e0e451fdaf17a217dcc6a1369f28 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Mon, 14 Apr 2014 19:08:43 -0400 Subject: [PATCH 254/701] isMatrixProject appears unused, but keep for compatibility. (cherry picked from commit d72fda46a6a5f521a986dc770afffc89e862c52b) --- core/src/main/java/hudson/Functions.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/core/src/main/java/hudson/Functions.java b/core/src/main/java/hudson/Functions.java index 4899606ae4..f6f9979afd 100644 --- a/core/src/main/java/hudson/Functions.java +++ b/core/src/main/java/hudson/Functions.java @@ -28,7 +28,6 @@ package hudson; import hudson.cli.CLICommand; import hudson.console.ConsoleAnnotationDescriptor; import hudson.console.ConsoleAnnotatorFactory; -import hudson.matrix.MatrixProject; import hudson.model.AbstractProject; import hudson.model.Action; import hudson.model.Describable; @@ -190,11 +189,9 @@ public class Functions { return o instanceof ModelObjectWithChildren; } - /** - * @since 1.524 - */ + @Deprecated public static boolean isMatrixProject(Object o) { - return o instanceof MatrixProject; + return o.getClass().getName().equals("hudson.matrix.MatrixProject"); } public static String xsDate(Calendar cal) { From 5a9b69d2fca6457b301d631744026659b70e782a Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Mon, 14 Apr 2014 19:10:20 -0400 Subject: [PATCH 255/701] XStream initializations moved to MatrixProject. (cherry picked from commit dbed3044070cb95fc3e7b5cabaddcf88cf65aaf2) Conflicts: core/src/main/java/hudson/model/Run.java --- core/src/main/java/hudson/model/Items.java | 6 ------ core/src/main/java/hudson/model/Run.java | 4 ---- 2 files changed, 10 deletions(-) diff --git a/core/src/main/java/hudson/model/Items.java b/core/src/main/java/hudson/model/Items.java index 9b0993dfb2..91e03b809f 100644 --- a/core/src/main/java/hudson/model/Items.java +++ b/core/src/main/java/hudson/model/Items.java @@ -26,10 +26,7 @@ package hudson.model; import com.thoughtworks.xstream.XStream; import hudson.DescriptorExtensionList; import hudson.Extension; -import hudson.matrix.MatrixProject; -import hudson.matrix.MatrixConfiguration; import hudson.XmlFile; -import hudson.matrix.Axis; import hudson.model.listeners.ItemListener; import hudson.remoting.Callable; import hudson.triggers.Trigger; @@ -404,8 +401,5 @@ public class Items { static { XSTREAM.alias("project",FreeStyleProject.class); - XSTREAM.alias("matrix-project",MatrixProject.class); - XSTREAM.alias("axis", Axis.class); - XSTREAM.alias("matrix-config",MatrixConfiguration.class); } } diff --git a/core/src/main/java/hudson/model/Run.java b/core/src/main/java/hudson/model/Run.java index b8540ebfea..8708fbdf25 100644 --- a/core/src/main/java/hudson/model/Run.java +++ b/core/src/main/java/hudson/model/Run.java @@ -39,8 +39,6 @@ import hudson.XmlFile; import hudson.cli.declarative.CLIMethod; import hudson.console.AnnotatedLargeText; import hudson.console.ConsoleNote; -import hudson.matrix.MatrixBuild; -import hudson.matrix.MatrixRun; import hudson.model.Descriptor.FormException; import hudson.model.listeners.RunListener; import hudson.model.listeners.SaveableListener; @@ -2263,8 +2261,6 @@ public abstract class Run ,RunT extends Run Date: Mon, 14 Apr 2014 19:13:24 -0400 Subject: [PATCH 256/701] Removing MatrixChildAction dependency. (cherry picked from commit 42195d83c44da53303d27b0759346747e4ac0857) --- core/src/main/java/hudson/model/ParametersAction.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/core/src/main/java/hudson/model/ParametersAction.java b/core/src/main/java/hudson/model/ParametersAction.java index 09aebf7ebf..41172acaab 100644 --- a/core/src/main/java/hudson/model/ParametersAction.java +++ b/core/src/main/java/hudson/model/ParametersAction.java @@ -26,7 +26,6 @@ package hudson.model; import hudson.Util; import hudson.EnvVars; import hudson.diagnosis.OldDataMonitor; -import hudson.matrix.MatrixChildAction; import hudson.model.Queue.QueueAction; import hudson.model.labels.LabelAssignmentAction; import hudson.model.queue.SubTask; @@ -56,7 +55,7 @@ import static com.google.common.collect.Sets.newHashSet; * that were specified when scheduling. */ @ExportedBean -public class ParametersAction implements Action, Iterable, QueueAction, EnvironmentContributingAction, LabelAssignmentAction, MatrixChildAction { +public class ParametersAction implements Action, Iterable, QueueAction, EnvironmentContributingAction, LabelAssignmentAction { private final List parameters; From 3ca23a111170ead21d61738130c518074bbb7390 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Mon, 14 Apr 2014 19:21:12 -0400 Subject: [PATCH 257/701] Unclear status of MatrixConfiguration when enableFingerprintsInDependencyGraph mode selected. (cherry picked from commit b9d8f554c6407da14ac3af68e1fa0ceb9af333fb) --- core/src/main/java/hudson/tasks/Fingerprinter.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/hudson/tasks/Fingerprinter.java b/core/src/main/java/hudson/tasks/Fingerprinter.java index ef01582c48..4c31ac750f 100644 --- a/core/src/main/java/hudson/tasks/Fingerprinter.java +++ b/core/src/main/java/hudson/tasks/Fingerprinter.java @@ -30,7 +30,6 @@ import hudson.FilePath; import hudson.FilePath.FileCallable; import hudson.Launcher; import hudson.Util; -import hudson.matrix.MatrixConfiguration; import hudson.model.AbstractBuild; import hudson.model.AbstractProject; import hudson.model.Action; @@ -169,7 +168,8 @@ public class Fingerprinter extends Recorder implements Serializable, DependencyD } AbstractProject p = key; - if (key instanceof MatrixConfiguration) { + // TODO is this harmful to call unconditionally, so it would apply also to MavenModule for example? + if (key.getClass().getName().equals("hudson.matrix.MatrixConfiguration")) { p = key.getRootProject(); } From 5361065437e8027f633bf70fa96899e7e62231e0 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Mon, 14 Apr 2014 19:26:47 -0400 Subject: [PATCH 258/701] Extracting MatrixAggregatable dependency. (cherry picked from commit 5d9e4d7b073c48bffc5c6179e375660c3ad0ad0a) --- .../tasks/junit/JUnitResultArchiver.java | 11 +-- .../hudson/tasks/test/MatrixTestResult.java | 69 ------------------- .../tasks/test/TestResultAggregator.java | 60 ---------------- 3 files changed, 1 insertion(+), 139 deletions(-) delete mode 100644 core/src/main/java/hudson/tasks/test/MatrixTestResult.java delete mode 100644 core/src/main/java/hudson/tasks/test/TestResultAggregator.java diff --git a/core/src/main/java/hudson/tasks/junit/JUnitResultArchiver.java b/core/src/main/java/hudson/tasks/junit/JUnitResultArchiver.java index 6dea15b9ed..d3804a9bdb 100644 --- a/core/src/main/java/hudson/tasks/junit/JUnitResultArchiver.java +++ b/core/src/main/java/hudson/tasks/junit/JUnitResultArchiver.java @@ -28,9 +28,6 @@ import hudson.AbortException; import hudson.Extension; import hudson.FilePath; import hudson.Launcher; -import hudson.matrix.MatrixAggregatable; -import hudson.matrix.MatrixAggregator; -import hudson.matrix.MatrixBuild; import hudson.model.AbstractBuild; import hudson.model.AbstractProject; import hudson.model.Action; @@ -44,7 +41,6 @@ import hudson.tasks.BuildStepMonitor; import hudson.tasks.Publisher; import hudson.tasks.Recorder; import hudson.tasks.junit.TestResultAction.Data; -import hudson.tasks.test.TestResultAggregator; import hudson.tasks.test.TestResultProjectAction; import hudson.util.DescribableList; import hudson.util.FormValidation; @@ -67,7 +63,7 @@ import java.util.List; * * @author Kohsuke Kawaguchi */ -public class JUnitResultArchiver extends Recorder implements MatrixAggregatable { +public class JUnitResultArchiver extends Recorder { /** * {@link FileSet} "includes" string, like "foo/bar/*.xml" @@ -213,11 +209,6 @@ public class JUnitResultArchiver extends Recorder implements MatrixAggregatable return Collections.singleton(new TestResultProjectAction(project)); } - public MatrixAggregator createAggregator(MatrixBuild build, - Launcher launcher, BuildListener listener) { - return new TestResultAggregator(build, launcher, listener); - } - /** * @return the keepLongStdio */ diff --git a/core/src/main/java/hudson/tasks/test/MatrixTestResult.java b/core/src/main/java/hudson/tasks/test/MatrixTestResult.java deleted file mode 100644 index 6d2122a3cd..0000000000 --- a/core/src/main/java/hudson/tasks/test/MatrixTestResult.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * The MIT License - * - * Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Yahoo!, Inc. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package hudson.tasks.test; - -import hudson.matrix.Combination; -import hudson.matrix.MatrixBuild; -import hudson.matrix.MatrixRun; -import hudson.model.AbstractBuild; -import hudson.model.Action; - -/** - * {@link Action} that aggregates all the test results from {@link MatrixRun}s. - * - *

                      - * This object is attached to {@link MatrixBuild}. - * - * @author Kohsuke Kawaguchi - */ -public class MatrixTestResult extends AggregatedTestResultAction { - - @Deprecated - public MatrixTestResult(MatrixBuild owner) { - super(owner); - } - - /** @since 1.545 */ - public MatrixTestResult() {} - - /** - * Use the configuration name. - */ - @Override - protected String getChildName(AbstractTestResultAction tr) { - return tr.owner.getProject().getName(); - } - - @Override - public AbstractBuild resolveChild(Child child) { - MatrixBuild b = (MatrixBuild)owner; - return b.getProject().getItem(Combination.fromString(child.name)).getBuildByNumber(child.build); - } - - @Override - public String getTestResultPath(TestResult it) { - // Prepend Configuration path - return it.getOwner().getParent().getShortUrl() + super.getTestResultPath(it); - } -} diff --git a/core/src/main/java/hudson/tasks/test/TestResultAggregator.java b/core/src/main/java/hudson/tasks/test/TestResultAggregator.java deleted file mode 100644 index 72b76fd708..0000000000 --- a/core/src/main/java/hudson/tasks/test/TestResultAggregator.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * The MIT License - * - * Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Yahoo!, Inc. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ -package hudson.tasks.test; - -import hudson.Launcher; -import hudson.matrix.MatrixAggregator; -import hudson.matrix.MatrixBuild; -import hudson.matrix.MatrixRun; -import hudson.model.BuildListener; - -import java.io.IOException; - -/** - * Aggregates {@link AbstractTestResultAction}s of {@link MatrixRun}s - * into {@link MatrixBuild}. - * - * @author Kohsuke Kawaguchi - */ -public class TestResultAggregator extends MatrixAggregator { - private MatrixTestResult result; - - public TestResultAggregator(MatrixBuild build, Launcher launcher, BuildListener listener) { - super(build, launcher, listener); - } - - @Override - public boolean startBuild() throws InterruptedException, IOException { - result = new MatrixTestResult(); - build.addAction(result); - return true; - } - - @Override - public boolean endRun(MatrixRun run) throws InterruptedException, IOException { - AbstractTestResultAction atr = run.getAction(AbstractTestResultAction.class); - if(atr!=null) result.add(atr); - return true; - } -} From a236b34364853ea1c69cbf190a6e362874730bf3 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Mon, 14 Apr 2014 19:28:55 -0400 Subject: [PATCH 259/701] DetachedPlugin entry. (cherry picked from commit e4ba41d5394e7c936a2b720e6b672da4f82af354) --- core/src/main/java/hudson/ClassicPluginStrategy.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/hudson/ClassicPluginStrategy.java b/core/src/main/java/hudson/ClassicPluginStrategy.java index 8279fb8ca1..a632983fc5 100644 --- a/core/src/main/java/hudson/ClassicPluginStrategy.java +++ b/core/src/main/java/hudson/ClassicPluginStrategy.java @@ -272,7 +272,8 @@ public class ClassicPluginStrategy implements PluginStrategy { new DetachedPlugin("mailer","1.493.*","1.2"), new DetachedPlugin("matrix-auth","1.535.*","1.0.2"), new DetachedPlugin("windows-slaves","1.547.*","1.0"), - new DetachedPlugin("antisamy-markup-formatter","1.553.*","1.0") + new DetachedPlugin("antisamy-markup-formatter","1.553.*","1.0"), + new DetachedPlugin("matrix-project","1.561.*","1.0") ); /** From 04681f6b843d7c1a6e4c4ccd30e652f408a3fd3f Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Mon, 14 Apr 2014 19:47:20 -0400 Subject: [PATCH 260/701] Extracting some miscellaneous usages from core/src. (cherry picked from commit 04aace98d196f6d6f5c1b9fcb5a356c46ed8d765) --- .../java/hudson/FileSystemProvisioner.java | 4 +- .../main/java/hudson/model/AbstractBuild.java | 3 +- .../main/java/hudson/model/TopLevelItem.java | 3 +- .../java/jenkins/scm/SCMCheckoutStrategy.java | 8 ++-- .../java/hudson/cli/ListJobsCommandTest.java | 16 +------- .../test/java/hudson/util/XStream2Test.java | 22 ----------- .../test/resources/hudson/util/runMatrix.xml | 39 ------------------- 7 files changed, 8 insertions(+), 87 deletions(-) delete mode 100644 core/src/test/resources/hudson/util/runMatrix.xml diff --git a/core/src/main/java/hudson/FileSystemProvisioner.java b/core/src/main/java/hudson/FileSystemProvisioner.java index 0ab7e44a1e..58680eb888 100644 --- a/core/src/main/java/hudson/FileSystemProvisioner.java +++ b/core/src/main/java/hudson/FileSystemProvisioner.java @@ -24,14 +24,12 @@ package hudson; import hudson.FilePath.TarCompression; -import hudson.matrix.MatrixBuild; import hudson.model.AbstractBuild; import hudson.model.AbstractProject; import hudson.model.Computer; import hudson.model.Describable; import hudson.model.Job; import hudson.model.TaskListener; -import hudson.util.DirScanner.Glob; import hudson.util.io.ArchiverFactory; import jenkins.model.Jenkins; import hudson.model.listeners.RunListener; @@ -158,7 +156,7 @@ public abstract class FileSystemProvisioner implements ExtensionPoint, Describab *

                      * The state of the build when this method is invoked depends on * the project type. Most would call this at the end of the build, - * but for example {@link MatrixBuild} would call this after + * but for example {@code MatrixBuild} would call this after * SCM check out so that the state of the fresh workspace * can be then propagated to elsewhere. * diff --git a/core/src/main/java/hudson/model/AbstractBuild.java b/core/src/main/java/hudson/model/AbstractBuild.java index eeeaf4e927..2b6f8633f4 100644 --- a/core/src/main/java/hudson/model/AbstractBuild.java +++ b/core/src/main/java/hudson/model/AbstractBuild.java @@ -33,7 +33,6 @@ import hudson.Launcher; import hudson.console.AnnotatedLargeText; import hudson.console.ExpandableDetailsNote; import hudson.console.ModelHyperlinkNote; -import hudson.matrix.MatrixConfiguration; import hudson.model.Fingerprint.BuildPtr; import hudson.model.Fingerprint.RangeSet; import hudson.model.labels.LabelAtom; @@ -1014,7 +1013,7 @@ public abstract class AbstractBuild

                      ,R extends Abs * Provides additional variables and their values to {@link Builder}s. * *

                      - * This mechanism is used by {@link MatrixConfiguration} to pass + * This mechanism is used by {@code MatrixConfiguration} to pass * the configuration values to the current build. It is up to * {@link Builder}s to decide whether they want to recognize the values * or how to use them. diff --git a/core/src/main/java/hudson/model/TopLevelItem.java b/core/src/main/java/hudson/model/TopLevelItem.java index 23343eb209..ce362a9b79 100644 --- a/core/src/main/java/hudson/model/TopLevelItem.java +++ b/core/src/main/java/hudson/model/TopLevelItem.java @@ -25,12 +25,11 @@ package hudson.model; import hudson.Extension; import hudson.ExtensionPoint; -import hudson.matrix.MatrixConfiguration; /** * {@link Item} that can be directly displayed under {@link jenkins.model.Jenkins} or other containers. * (A "container" would be any {@link ItemGroup}{@code }, such as a folder of projects.) - * Ones that don't need to be under specific parent (say, unlike {@link MatrixConfiguration}), + * Ones that don't need to be under specific parent (say, unlike {@code MatrixConfiguration}), * and thus can be freely moved, copied, etc. * *

                      diff --git a/core/src/main/java/jenkins/scm/SCMCheckoutStrategy.java b/core/src/main/java/jenkins/scm/SCMCheckoutStrategy.java index f90b61a6b0..7113084280 100644 --- a/core/src/main/java/jenkins/scm/SCMCheckoutStrategy.java +++ b/core/src/main/java/jenkins/scm/SCMCheckoutStrategy.java @@ -2,8 +2,6 @@ package jenkins.scm; import hudson.ExtensionPoint; import hudson.Launcher; -import hudson.matrix.MatrixBuild; -import hudson.matrix.MatrixRun; import hudson.model.AbstractBuild; import hudson.model.AbstractBuild.AbstractBuildExecution; import hudson.model.AbstractDescribableImpl; @@ -25,9 +23,9 @@ import java.io.IOException; * is to control the check out behaviour in matrix projects. The intended use cases include situations like: * *

                        - *
                      • Check out will only happen once in {@link MatrixBuild}, and its state will be then sent - * to {@link MatrixRun}s by other means such as rsync. - *
                      • {@link MatrixBuild} does no check out of its own, and check out is only done on {@link MatrixRun}s + *
                      • Check out will only happen once in {@code MatrixBuild}, and its state will be then sent + * to {@code MatrixRun}s by other means such as rsync. + *
                      • {@code MatrixBuild} does no check out of its own, and check out is only done on {@code MatrixRun}s *
                      * *

                      Hook Semantics

                      diff --git a/core/src/test/java/hudson/cli/ListJobsCommandTest.java b/core/src/test/java/hudson/cli/ListJobsCommandTest.java index 9e636015d2..f9ec5795e3 100644 --- a/core/src/test/java/hudson/cli/ListJobsCommandTest.java +++ b/core/src/test/java/hudson/cli/ListJobsCommandTest.java @@ -3,34 +3,23 @@ package hudson.cli; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.containsString; -import static org.hamcrest.CoreMatchers.not; import static org.hamcrest.MatcherAssert.assertThat; import static org.powermock.api.mockito.PowerMockito.mock; import static org.powermock.api.mockito.PowerMockito.mockStatic; import static org.powermock.api.mockito.PowerMockito.when; -import hudson.matrix.MatrixConfiguration; -import hudson.matrix.MatrixProject; -import hudson.model.AbstractProject; import hudson.model.Item; import hudson.model.ItemGroup; import hudson.model.TopLevelItem; -import hudson.model.TopLevelItemDescriptor; -import hudson.model.ViewGroup; import hudson.model.ViewTest.CompositeView; import hudson.model.View; import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; import java.io.PrintStream; import java.util.Arrays; import java.util.Collection; import java.util.HashSet; import java.util.List; -import javax.annotation.CheckForNull; -import javax.servlet.ServletException; import jenkins.model.Jenkins; import jenkins.model.ModifiableTopLevelItemGroup; @@ -40,9 +29,6 @@ import org.hamcrest.TypeSafeMatcher; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import org.jvnet.hudson.test.Bug; -import org.kohsuke.stapler.StaplerRequest; -import org.kohsuke.stapler.StaplerResponse; import org.mockito.Mockito; import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.core.classloader.annotations.SuppressStaticInitializationFor; @@ -80,6 +66,7 @@ public class ListJobsCommandTest { assertThat(stderr.toString(), containsString("No view or item group with the given name found")); } + /* @Test @Bug(18393) public void failForMatrixProject() throws Exception { @@ -95,6 +82,7 @@ public class ListJobsCommandTest { assertThat(stdout, is(empty())); assertThat(stderr.toString(), containsString("No view or item group with the given name found")); } + */ @Test public void getAllJobsFromFolders() throws Exception { diff --git a/core/src/test/java/hudson/util/XStream2Test.java b/core/src/test/java/hudson/util/XStream2Test.java index 4f818442e3..711e623e28 100644 --- a/core/src/test/java/hudson/util/XStream2Test.java +++ b/core/src/test/java/hudson/util/XStream2Test.java @@ -27,18 +27,14 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.thoughtworks.xstream.XStreamException; import hudson.XmlFile; -import hudson.matrix.MatrixRun; import hudson.model.Result; import hudson.model.Run; import java.io.File; -import java.io.InputStream; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.logging.Level; import java.util.logging.Logger; -import jenkins.model.CauseOfInterruption; -import jenkins.model.InterruptedBuildAction; import junit.framework.TestCase; import org.apache.commons.io.FileUtils; import org.jvnet.hudson.test.Bug; @@ -261,24 +257,6 @@ public class XStream2Test extends TestCase { public int x,y; } - /** - * Unmarshall a matrix build.xml result. - */ - @Bug(10903) - public void testUnMarshalRunMatrix() { - InputStream is = XStream2Test.class.getResourceAsStream("runMatrix.xml"); - MatrixRun result = (MatrixRun) Run.XSTREAM.fromXML(is); - assertNotNull(result); - assertNotNull(result.getPersistentActions()); - assertEquals(2, result.getPersistentActions().size()); - InterruptedBuildAction action = (InterruptedBuildAction) result.getPersistentActions().get(1); - assertNotNull(action.getCauses()); - assertEquals(1, action.getCauses().size()); - CauseOfInterruption.UserInterruption cause = - (CauseOfInterruption.UserInterruption) action.getCauses().get(0); - assertNotNull(cause); - } - public static class Foo2 { ConcurrentHashMap m = new ConcurrentHashMap(); } diff --git a/core/src/test/resources/hudson/util/runMatrix.xml b/core/src/test/resources/hudson/util/runMatrix.xml deleted file mode 100644 index 37513c87b5..0000000000 --- a/core/src/test/resources/hudson/util/runMatrix.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - MatrixProject - job/MatrixProject/ - 8 - - - auser - - - - - - - - - - auser - - - - - - 8 - ABORTED - 3253844 - windows-1252 - false - amachine - C:\jenkins\slave\workspace\MatrixProject\blah\blah\blah - 1.427 - - auser - - \ No newline at end of file From 9069428f0b45c0595d13296084ed9aa0f9c38fa5 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Mon, 14 Apr 2014 20:35:28 -0400 Subject: [PATCH 261/701] Test harness must depend on matrix-project. (cherry picked from commit b628b47285a1ef9631760c84ded3097c457a0250) --- test/pom.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/test/pom.xml b/test/pom.xml index 345d20029b..2397bc72ab 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -92,6 +92,11 @@ THE SOFTWARE. antisamy-markup-formatter 1.0 + + org.jenkins-ci.plugins + matrix-project + 1.0-SNAPSHOT + org.mortbay.jetty jetty From 92ca85339fce8b3f382592dd70dddced1a7345d9 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Mon, 14 Apr 2014 21:10:17 -0400 Subject: [PATCH 262/701] Preparing to include transitional release. (cherry picked from commit 071951e65898a308d331a510dc5a46b3e10cf373) --- core/src/main/java/hudson/ClassicPluginStrategy.java | 2 +- test/pom.xml | 2 +- war/pom.xml | 6 ++++++ 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/hudson/ClassicPluginStrategy.java b/core/src/main/java/hudson/ClassicPluginStrategy.java index a632983fc5..acf4f4a52a 100644 --- a/core/src/main/java/hudson/ClassicPluginStrategy.java +++ b/core/src/main/java/hudson/ClassicPluginStrategy.java @@ -273,7 +273,7 @@ public class ClassicPluginStrategy implements PluginStrategy { new DetachedPlugin("matrix-auth","1.535.*","1.0.2"), new DetachedPlugin("windows-slaves","1.547.*","1.0"), new DetachedPlugin("antisamy-markup-formatter","1.553.*","1.0"), - new DetachedPlugin("matrix-project","1.561.*","1.0") + new DetachedPlugin("matrix-project","1.561.*","1.0-beta-1") ); /** diff --git a/test/pom.xml b/test/pom.xml index 2397bc72ab..8462419701 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -95,7 +95,7 @@ THE SOFTWARE. org.jenkins-ci.plugins matrix-project - 1.0-SNAPSHOT + 1.0-beta-1-SNAPSHOT org.mortbay.jetty diff --git a/war/pom.xml b/war/pom.xml index 93aaa5b912..7df3440811 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -361,6 +361,12 @@ THE SOFTWARE. 1.0 hpi + + org.jenkins-ci.plugins + matrix-project + 1.0-beta-1-SNAPSHOT + hpi + ${project.build.directory}/${project.build.finalName}/WEB-INF/plugins true From 075bd9b5b3f5ba5470b79b5faed3ea9bf7b786e0 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Mon, 14 Apr 2014 21:51:12 -0400 Subject: [PATCH 263/701] matrix-project 1.0-beta-1 (cherry picked from commit 9259f8736ce9c022270eb44b4b318ee5c98f3601) --- test/pom.xml | 2 +- war/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/test/pom.xml b/test/pom.xml index 8462419701..679ad99c60 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -95,7 +95,7 @@ THE SOFTWARE. org.jenkins-ci.plugins matrix-project - 1.0-beta-1-SNAPSHOT + 1.0-beta-1 org.mortbay.jetty diff --git a/war/pom.xml b/war/pom.xml index 7df3440811..a44b97b7a2 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -364,7 +364,7 @@ THE SOFTWARE. org.jenkins-ci.plugins matrix-project - 1.0-beta-1-SNAPSHOT + 1.0-beta-1 hpi From da829b345df78c04384b2d373bb7b150a83dc2c2 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Mon, 14 Apr 2014 23:20:12 -0400 Subject: [PATCH 264/701] isMatrixProject ought to handle nulls, just in case. (cherry picked from commit 747d550c3caa3aa012f9906c22211cfe17114842) --- core/src/main/java/hudson/Functions.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/hudson/Functions.java b/core/src/main/java/hudson/Functions.java index f6f9979afd..b7a561aea2 100644 --- a/core/src/main/java/hudson/Functions.java +++ b/core/src/main/java/hudson/Functions.java @@ -191,7 +191,7 @@ public class Functions { @Deprecated public static boolean isMatrixProject(Object o) { - return o.getClass().getName().equals("hudson.matrix.MatrixProject"); + return o != null && o.getClass().getName().equals("hudson.matrix.MatrixProject"); } public static String xsDate(Calendar cal) { From 5d43fdf1e65a0589f728cdb022dce290246a18f6 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Mon, 28 Apr 2014 15:04:07 -0400 Subject: [PATCH 265/701] matrix-project 1.0 (cherry picked from commit 0bd831e2d9053b3e3cca2e711f77eb63815b1cb2) --- core/src/main/java/hudson/ClassicPluginStrategy.java | 2 +- war/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/hudson/ClassicPluginStrategy.java b/core/src/main/java/hudson/ClassicPluginStrategy.java index acf4f4a52a..a632983fc5 100644 --- a/core/src/main/java/hudson/ClassicPluginStrategy.java +++ b/core/src/main/java/hudson/ClassicPluginStrategy.java @@ -273,7 +273,7 @@ public class ClassicPluginStrategy implements PluginStrategy { new DetachedPlugin("matrix-auth","1.535.*","1.0.2"), new DetachedPlugin("windows-slaves","1.547.*","1.0"), new DetachedPlugin("antisamy-markup-formatter","1.553.*","1.0"), - new DetachedPlugin("matrix-project","1.561.*","1.0-beta-1") + new DetachedPlugin("matrix-project","1.561.*","1.0") ); /** diff --git a/war/pom.xml b/war/pom.xml index a44b97b7a2..af8291291a 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -364,7 +364,7 @@ THE SOFTWARE. org.jenkins-ci.plugins matrix-project - 1.0-beta-1 + 1.0 hpi From 5b93017568b7780ac7cee2ebb5968dfb6b24a256 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Wed, 4 Feb 2015 14:58:22 -0500 Subject: [PATCH 266/701] Integrating snapshot build of matrix-project. --- war/pom.xml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/war/pom.xml b/war/pom.xml index af8291291a..c0e22670e4 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -364,7 +364,13 @@ THE SOFTWARE. org.jenkins-ci.plugins matrix-project - 1.0 + 1.2.1-20150204.194845-1 + hpi + + + org.jenkins-ci.plugins + script-security + 1.13 hpi From f987f9ce89952c79e045f6125c08bfd7c6b9aa99 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Wed, 4 Feb 2015 15:52:56 -0500 Subject: [PATCH 267/701] Need to test against the same version of matrix-project we bundle. Otherwise FingerprinterTest.matrixDependency throws an AbstractMethodError. --- pom.xml | 1 + test/pom.xml | 2 +- war/pom.xml | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 346ed3450b..80e273fe07 100644 --- a/pom.xml +++ b/pom.xml @@ -95,6 +95,7 @@ THE SOFTWARE. 1.7.4 2.1 + 1.2.1-20150204.194845-1 ${skipTests} 6 diff --git a/test/pom.xml b/test/pom.xml index 679ad99c60..bc1663d238 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -95,7 +95,7 @@ THE SOFTWARE. org.jenkins-ci.plugins matrix-project - 1.0-beta-1 + ${matrix-project.version} org.mortbay.jetty diff --git a/war/pom.xml b/war/pom.xml index c0e22670e4..9df8d74706 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -364,7 +364,7 @@ THE SOFTWARE. org.jenkins-ci.plugins matrix-project - 1.2.1-20150204.194845-1 + ${matrix-project.version} hpi From 41786ad0195cc1221172f47f82b8662040557ea4 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Wed, 4 Feb 2015 16:45:53 -0500 Subject: [PATCH 268/701] =?UTF-8?q?Preventing=20cyclic=20dependencies=20am?= =?UTF-8?q?ong=20bundled=20plugins.=20Reproducible=20for=20example=20via?= =?UTF-8?q?=20HelpLinkTest.testMatrixConfig.=20Otherwise=20have:=20matrix-?= =?UTF-8?q?project=20=E2=86=92=20script-security=20=E2=86=92=20matrix-auth?= =?UTF-8?q?=20=E2=86=92=20windows-slaves=20=E2=86=92=20antisamy-markup-for?= =?UTF-8?q?matter=20=E2=86=92=20matrix-project=20Tried=20to=20come=20up=20?= =?UTF-8?q?with=20a=20generic=20way=20of=20doing=20this=20automatically,?= =?UTF-8?q?=20but=20failed.=20Just=20because=20we=20bundle=20a=20particula?= =?UTF-8?q?r=20build=20of=20some=20plugin=20does=20not=20mean=20it=20was?= =?UTF-8?q?=20built=20against=20anything=20recent,=20and=20for=20use=20on?= =?UTF-8?q?=20older=20cores=20it=20may=20well=20need=20some=20of=20those?= =?UTF-8?q?=20implicit=20dependencies.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/hudson/ClassicPluginStrategy.java | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/hudson/ClassicPluginStrategy.java b/core/src/main/java/hudson/ClassicPluginStrategy.java index a632983fc5..cc2eda6a65 100644 --- a/core/src/main/java/hudson/ClassicPluginStrategy.java +++ b/core/src/main/java/hudson/ClassicPluginStrategy.java @@ -64,6 +64,7 @@ import java.util.Collections; import java.util.Enumeration; import java.util.HashSet; import java.util.List; +import java.util.Set; import java.util.Vector; import java.util.jar.Attributes; import java.util.jar.Manifest; @@ -250,13 +251,19 @@ public class ClassicPluginStrategy implements PluginStrategy { // don't fix the dependency for yourself, or else we'll have a cycle String yourName = atts.getValue("Short-Name"); if (shortName.equals(yourName)) return; + if (BREAK_CYCLES.contains(yourName + '/' + shortName)) { + LOGGER.log(Level.FINE, "skipping implicit dependency {0} → {1}", new Object[] {yourName, shortName}); + return; + } // some earlier versions of maven-hpi-plugin apparently puts "null" as a literal in Hudson-Version. watch out for them. String jenkinsVersion = atts.getValue("Jenkins-Version"); if (jenkinsVersion==null) jenkinsVersion = atts.getValue("Hudson-Version"); - if (jenkinsVersion == null || jenkinsVersion.equals("null") || new VersionNumber(jenkinsVersion).compareTo(splitWhen) <= 0) - optionalDependencies.add(new PluginWrapper.Dependency(shortName+':'+requireVersion)); + if (jenkinsVersion == null || jenkinsVersion.equals("null") || new VersionNumber(jenkinsVersion).compareTo(splitWhen) <= 0) { + optionalDependencies.add(new PluginWrapper.Dependency(shortName + ':' + requireVersion)); + LOGGER.log(Level.FINE, "adding implicit dependency {0} → {1} because of {2}", new Object[] {yourName, shortName, jenkinsVersion}); + } } } @@ -276,6 +283,14 @@ public class ClassicPluginStrategy implements PluginStrategy { new DetachedPlugin("matrix-project","1.561.*","1.0") ); + /** Implicit dependencies that are known to be unnecessary and which must be cut out to prevent a dependency cycle among bundled plugins. */ + private static final Set BREAK_CYCLES = new HashSet(Arrays.asList( + "script-security/matrix-auth", + "script-security/windows-slaves", + "script-security/antisamy-markup-formatter", + "script-security/matrix-project" + )); + /** * Computes the classloader that takes the class masking into account. * From 8881703f7c7351695c5d5b2662faefae60de68e8 Mon Sep 17 00:00:00 2001 From: Nicolas De Loof Date: Wed, 4 Feb 2015 18:14:01 +0100 Subject: [PATCH 269/701] [JENKINS-26781] lookup descriptor by ID, then by class if explicitly set to match some specific use cases. --- core/src/main/java/hudson/model/Descriptor.java | 15 ++++++++++----- .../src/main/resources/lib/form/class-entry.jelly | 7 +++---- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/core/src/main/java/hudson/model/Descriptor.java b/core/src/main/java/hudson/model/Descriptor.java index 2b5bcef0cf..28e4a95ecc 100644 --- a/core/src/main/java/hudson/model/Descriptor.java +++ b/core/src/main/java/hudson/model/Descriptor.java @@ -909,14 +909,19 @@ public abstract class Descriptor> implements Saveable { if (formData!=null) { for (Object o : JSONArray.fromObject(formData)) { JSONObject jo = (JSONObject)o; - String kind = jo.optString("$class", null); - if (kind == null) { - // Legacy: Remove once plugins have been staged onto $class - kind = jo.getString("kind"); + Descriptor d = null; + String kind = jo.optString("kind", null); + if (kind != null) { + d = find(descriptors, kind); + } + if (d == null) { + kind = jo.getString("$class"); + d = find(descriptors, kind); } - Descriptor d = find(descriptors, kind); if (d != null) { items.add(d.newInstance(req, jo)); + } else { + LOGGER.warning("Received unexpected formData for descriptor " + kind); } } } diff --git a/core/src/main/resources/lib/form/class-entry.jelly b/core/src/main/resources/lib/form/class-entry.jelly index e03af3a754..371f5137d8 100644 --- a/core/src/main/resources/lib/form/class-entry.jelly +++ b/core/src/main/resources/lib/form/class-entry.jelly @@ -36,12 +36,11 @@ THE SOFTWARE. - - - + + - \ No newline at end of file + From c78d1519a12bc6e6dfd393926402f5083ddba0c2 Mon Sep 17 00:00:00 2001 From: tfennelly Date: Thu, 5 Feb 2015 09:46:43 +0000 Subject: [PATCH 270/701] Noting JENKINS-26406 --- changelog.html | 3 +++ 1 file changed, 3 insertions(+) diff --git a/changelog.html b/changelog.html index a98566a19d..b475a1e506 100644 --- a/changelog.html +++ b/changelog.html @@ -63,6 +63,9 @@ Upcoming changes
                    • Cache node environment to prevent unnecessary channel usage (issue 26755) +
                    • + Build history text field wrap fails when containing markup + (issue 26406)
                    From 76ff1034a902f08cd30b69a086cd3fdb7bdc2159 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Thu, 5 Feb 2015 09:05:06 -0500 Subject: [PATCH 271/701] Avoid duplicate class conflict with core/src/test/java/hudson/model/AbstractItemTest.java. --- .../{AbstractItemTest.java => AbstractItemSecurityTest.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename test/src/test/java/hudson/model/{AbstractItemTest.java => AbstractItemSecurityTest.java} (99%) diff --git a/test/src/test/java/hudson/model/AbstractItemTest.java b/test/src/test/java/hudson/model/AbstractItemSecurityTest.java similarity index 99% rename from test/src/test/java/hudson/model/AbstractItemTest.java rename to test/src/test/java/hudson/model/AbstractItemSecurityTest.java index 6c186fd939..d9d26d363c 100644 --- a/test/src/test/java/hudson/model/AbstractItemTest.java +++ b/test/src/test/java/hudson/model/AbstractItemSecurityTest.java @@ -49,7 +49,7 @@ import static org.hamcrest.text.IsEmptyString.isEmptyOrNullString; import static org.junit.Assert.assertThat; import static org.junit.Assert.fail; -public class AbstractItemTest { +public class AbstractItemSecurityTest { @Rule public JenkinsRule jenkinsRule = new JenkinsRule(); From 1786daa514465b54918d0719f7e338b1a2929080 Mon Sep 17 00:00:00 2001 From: James Nord Date: Thu, 5 Feb 2015 14:36:29 +0000 Subject: [PATCH 272/701] [SECURITY-167] Followup tweaks to address review comments. Addresses some comments received after the original fix was merged. --- .../util/xml/RestrictiveEntityResolver.java | 3 +++ .../main/java/jenkins/util/xml/XMLUtils.java | 4 ++++ .../model/AbstractItemSecurityTest.java | 20 ++----------------- 3 files changed, 9 insertions(+), 18 deletions(-) diff --git a/core/src/main/java/jenkins/util/xml/RestrictiveEntityResolver.java b/core/src/main/java/jenkins/util/xml/RestrictiveEntityResolver.java index 87079b551e..c4b231dd71 100644 --- a/core/src/main/java/jenkins/util/xml/RestrictiveEntityResolver.java +++ b/core/src/main/java/jenkins/util/xml/RestrictiveEntityResolver.java @@ -1,5 +1,7 @@ package jenkins.util.xml; +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.NoExternalUse; import org.xml.sax.EntityResolver; import org.xml.sax.InputSource; import org.xml.sax.SAXException; @@ -12,6 +14,7 @@ import java.io.IOException; * * @since TODO */ +@Restricted(NoExternalUse.class) public final class RestrictiveEntityResolver implements EntityResolver { public final static RestrictiveEntityResolver INSTANCE = new RestrictiveEntityResolver(); diff --git a/core/src/main/java/jenkins/util/xml/XMLUtils.java b/core/src/main/java/jenkins/util/xml/XMLUtils.java index 5aab9b5567..5abe7ba6a5 100644 --- a/core/src/main/java/jenkins/util/xml/XMLUtils.java +++ b/core/src/main/java/jenkins/util/xml/XMLUtils.java @@ -1,5 +1,7 @@ package jenkins.util.xml; +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.NoExternalUse; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.XMLReader; @@ -20,7 +22,9 @@ import javax.xml.transform.sax.SAXTransformerFactory; /** * Utilities useful when working with various XML types. + * @since TODO */ +@Restricted(NoExternalUse.class) public final class XMLUtils { private final static Logger LOGGER = LogManager.getLogManager().getLogger(XMLUtils.class.getName()); diff --git a/test/src/test/java/hudson/model/AbstractItemSecurityTest.java b/test/src/test/java/hudson/model/AbstractItemSecurityTest.java index d9d26d363c..3054ad3b4f 100644 --- a/test/src/test/java/hudson/model/AbstractItemSecurityTest.java +++ b/test/src/test/java/hudson/model/AbstractItemSecurityTest.java @@ -56,22 +56,14 @@ public class AbstractItemSecurityTest { @Test() // SECURITY-167 - public void testUpdateByXmlIDoesNotProcessForeignResources() throws Exception { + public void testUpdateByXmlDoesNotProcessForeignResources() throws Exception { final String xml = "\n" + "\n" + "]>\n" + "\n" + - " \n" + " &foo;\n" + - " false\n" + - " \n" + " \n" + - " true\n" + - " \n" + - " \n" + - " \n" + - " \n" + ""; FreeStyleProject project = jenkinsRule.createFreeStyleProject("security-167"); @@ -90,19 +82,11 @@ public class AbstractItemSecurityTest { @Test() // SECURITY-167 - public void testhamyXmlIDoesNotFail() throws Exception { + public void testUpdateByXmlDoesNotFail() throws Exception { final String xml = "\n" + "\n" + - " \n" + " &\n" + - " false\n" + - " \n" + " \n" + - " true\n" + - " \n" + - " \n" + - " \n" + - " \n" + ""; FreeStyleProject project = jenkinsRule.createFreeStyleProject("security-167"); From fe5077e53418b9a195ff0fa06c8f8a414aac0726 Mon Sep 17 00:00:00 2001 From: James Nord Date: Thu, 5 Feb 2015 14:44:12 +0000 Subject: [PATCH 273/701] remove uneeded "@since TODO" --- .../main/java/jenkins/util/xml/RestrictiveEntityResolver.java | 2 -- core/src/main/java/jenkins/util/xml/XMLUtils.java | 1 - 2 files changed, 3 deletions(-) diff --git a/core/src/main/java/jenkins/util/xml/RestrictiveEntityResolver.java b/core/src/main/java/jenkins/util/xml/RestrictiveEntityResolver.java index c4b231dd71..1cf37c9bd5 100644 --- a/core/src/main/java/jenkins/util/xml/RestrictiveEntityResolver.java +++ b/core/src/main/java/jenkins/util/xml/RestrictiveEntityResolver.java @@ -11,8 +11,6 @@ import java.io.IOException; /** * An EntityResolver that will fail to resolve any entities. * Useful in preventing External XML Entity injection attacks. - * - * @since TODO */ @Restricted(NoExternalUse.class) public final class RestrictiveEntityResolver implements EntityResolver { diff --git a/core/src/main/java/jenkins/util/xml/XMLUtils.java b/core/src/main/java/jenkins/util/xml/XMLUtils.java index 5abe7ba6a5..84e6f6151b 100644 --- a/core/src/main/java/jenkins/util/xml/XMLUtils.java +++ b/core/src/main/java/jenkins/util/xml/XMLUtils.java @@ -22,7 +22,6 @@ import javax.xml.transform.sax.SAXTransformerFactory; /** * Utilities useful when working with various XML types. - * @since TODO */ @Restricted(NoExternalUse.class) public final class XMLUtils { From dff4beb6415b8f5e2f0efa85d83eac25a053510f Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Thu, 5 Feb 2015 10:09:08 -0500 Subject: [PATCH 274/701] @RandomlyFails --- test/src/test/java/hudson/tasks/BuildTriggerTest.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/src/test/java/hudson/tasks/BuildTriggerTest.java b/test/src/test/java/hudson/tasks/BuildTriggerTest.java index 2d4f5e5fcb..7d7610423a 100644 --- a/test/src/test/java/hudson/tasks/BuildTriggerTest.java +++ b/test/src/test/java/hudson/tasks/BuildTriggerTest.java @@ -46,6 +46,7 @@ import jenkins.model.Jenkins; import org.jvnet.hudson.test.ExtractResourceSCM; import org.jvnet.hudson.test.HudsonTestCase; import org.jvnet.hudson.test.MockBuilder; +import org.jvnet.hudson.test.RandomlyFails; /** * Tests for hudson.tasks.BuildTrigger @@ -144,6 +145,7 @@ public class BuildTriggerTest extends HudsonTestCase { doMavenTriggerTest(true); } + @RandomlyFails("ClassCastException: net.sf.json.JSONArray cannot be cast to java.lang.Boolean from AuthorizationMatrixProperty$DescriptorImpl.newInstance") public void testConfigureDownstreamProjectSecurity() throws Exception { jenkins.setSecurityRealm(new LegacySecurityRealm()); ProjectMatrixAuthorizationStrategy auth = new ProjectMatrixAuthorizationStrategy(); From 10fbe7f1cb4aa82020aae394677765065d4d8cad Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Thu, 5 Feb 2015 10:29:05 -0500 Subject: [PATCH 275/701] Miscellaneous updates in preparation for merge to trunk. --- core/src/main/java/hudson/model/User.java | 5 +---- core/src/test/java/jenkins/xml/XMLUtilsTest.java | 7 +++---- .../hudson/model/AbstractItemSecurityTest.java | 16 +++------------- .../java/hudson/model/DownloadService2Test.java | 3 ++- .../HudsonPrivateSecurityRealm2Test.java | 7 ++++--- 5 files changed, 13 insertions(+), 25 deletions(-) diff --git a/core/src/main/java/hudson/model/User.java b/core/src/main/java/hudson/model/User.java index 52ca6005fb..12146b6016 100644 --- a/core/src/main/java/hudson/model/User.java +++ b/core/src/main/java/hudson/model/User.java @@ -51,8 +51,6 @@ import org.acegisecurity.providers.UsernamePasswordAuthenticationToken; import org.acegisecurity.providers.anonymous.AnonymousAuthenticationToken; import org.acegisecurity.userdetails.UserDetails; import org.acegisecurity.userdetails.UsernameNotFoundException; -import org.kohsuke.accmod.Restricted; -import org.kohsuke.accmod.restrictions.NoExternalUse; import org.springframework.dao.DataAccessException; import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerResponse; @@ -659,9 +657,8 @@ public class User extends AbstractModelObject implements AccessControlled, Descr * saving a User with one of these ids. * * @return true if the username or fullname is valid + * @since TODO */ - //TODO: Remove Restricted and add @since when merging to stable-rc - @Restricted(NoExternalUse.class) public static boolean isIdOrFullnameAllowed(String id) { for (String invalidId : ILLEGAL_PERSISTED_USERNAMES) { if (id.equalsIgnoreCase(invalidId)) diff --git a/core/src/test/java/jenkins/xml/XMLUtilsTest.java b/core/src/test/java/jenkins/xml/XMLUtilsTest.java index 18bd0052b3..b71700ba0d 100644 --- a/core/src/test/java/jenkins/xml/XMLUtilsTest.java +++ b/core/src/test/java/jenkins/xml/XMLUtilsTest.java @@ -26,7 +26,6 @@ package jenkins.xml; import jenkins.util.xml.XMLUtils; -import org.apache.commons.io.output.NullOutputStream; import org.junit.Test; import java.io.StringReader; @@ -37,12 +36,12 @@ import javax.xml.transform.stream.StreamSource; import static org.hamcrest.core.StringContains.containsString; import static org.junit.Assert.assertThat; -import static org.junit.Assert.fail; +import org.jvnet.hudson.test.Issue; public class XMLUtilsTest { + @Issue("SECURITY-167") @Test() - // SECURITY-167 public void testSafeTransformDoesNotProcessForeignResources() throws Exception { final String xml = "\n" + "\n" + "\n" + diff --git a/test/src/test/java/hudson/model/AbstractItemSecurityTest.java b/test/src/test/java/hudson/model/AbstractItemSecurityTest.java index d9d26d363c..bb711daf52 100644 --- a/test/src/test/java/hudson/model/AbstractItemSecurityTest.java +++ b/test/src/test/java/hudson/model/AbstractItemSecurityTest.java @@ -24,20 +24,10 @@ package hudson.model; -import hudson.model.FreeStyleProject; import org.junit.Rule; import org.junit.Test; import org.jvnet.hudson.test.JenkinsRule; -import org.w3c.dom.Document; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; -import org.w3c.dom.Text; - -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamSource; -import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.StringReader; @@ -47,15 +37,15 @@ import static org.hamcrest.core.IsNull.nullValue; import static org.hamcrest.core.StringContains.containsString; import static org.hamcrest.text.IsEmptyString.isEmptyOrNullString; import static org.junit.Assert.assertThat; -import static org.junit.Assert.fail; +import org.jvnet.hudson.test.Issue; public class AbstractItemSecurityTest { @Rule public JenkinsRule jenkinsRule = new JenkinsRule(); + @Issue("SECURITY-167") @Test() - // SECURITY-167 public void testUpdateByXmlIDoesNotProcessForeignResources() throws Exception { final String xml = "\n" + "\n" + "\n" + diff --git a/test/src/test/java/hudson/model/DownloadService2Test.java b/test/src/test/java/hudson/model/DownloadService2Test.java index 02f917cb07..b388b131fa 100644 --- a/test/src/test/java/hudson/model/DownloadService2Test.java +++ b/test/src/test/java/hudson/model/DownloadService2Test.java @@ -32,10 +32,11 @@ import net.sf.json.JSONObject; import org.junit.Test; import static org.junit.Assert.*; import org.junit.Rule; +import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.WithoutJenkins; -//@Issue("SECURITY-163") +@Issue("SECURITY-163") public class DownloadService2Test { @Rule public JenkinsRule r = new JenkinsRule(); diff --git a/test/src/test/java/hudson/security/HudsonPrivateSecurityRealm2Test.java b/test/src/test/java/hudson/security/HudsonPrivateSecurityRealm2Test.java index 0d87c08f45..5f49694154 100644 --- a/test/src/test/java/hudson/security/HudsonPrivateSecurityRealm2Test.java +++ b/test/src/test/java/hudson/security/HudsonPrivateSecurityRealm2Test.java @@ -11,6 +11,7 @@ import java.util.Collections; import static org.hamcrest.Matchers.containsString; import static org.junit.Assert.*; +import org.jvnet.hudson.test.Issue; /** * Tests the signup page of {@link hudson.security.HudsonPrivateSecurityRealm} @@ -40,7 +41,7 @@ public class HudsonPrivateSecurityRealm2Test { } - // @Issue("SECURITY-166") + @Issue("SECURITY-166") @Test public void anonymousCantSignup() throws Exception { HudsonPrivateSecurityRealm securityRealm = new HudsonPrivateSecurityRealm(true, false, null); @@ -56,7 +57,7 @@ public class HudsonPrivateSecurityRealm2Test { assertNull(User.get("anonymous", false, Collections.emptyMap())); } - // @Issue("SECURITY-166") + @Issue("SECURITY-166") @Test public void systemCantSignup() throws Exception { HudsonPrivateSecurityRealm securityRealm = new HudsonPrivateSecurityRealm(true, false, null); @@ -75,7 +76,7 @@ public class HudsonPrivateSecurityRealm2Test { /** * We don't allow prohibited fullnames since this may encumber auditing. */ - // @Issue("SECURITY-166") + @Issue("SECURITY-166") @Test public void fullNameOfUnknownCantSignup() throws Exception { HudsonPrivateSecurityRealm securityRealm = new HudsonPrivateSecurityRealm(true, false, null); From d44f2aee665f04b47a5da934a103515003b09672 Mon Sep 17 00:00:00 2001 From: Imran Hayder Date: Thu, 5 Feb 2015 10:13:37 -0800 Subject: [PATCH 276/701] Update README with minor grammatical fix Removed an extra 'of' in line#5 to fix the sentence structure. BEFORE: 'and a number of other "of" contributors PROPOSED: and a number of other contributors --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f021c54d33..4a7b6d2048 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ Jenkins CI ========== -Copyright © 2004–, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributors. Licensed under [MIT License]. +Copyright © 2004–, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other contributors. Licensed under [MIT License]. About ----- From de4414cbf355451cb87f14185f295c985ada914d Mon Sep 17 00:00:00 2001 From: Robert Sandell Date: Thu, 5 Feb 2015 15:34:48 +0100 Subject: [PATCH 277/701] [SECURITY-165] blacklist the document xpath function for use in Api --- core/src/main/java/hudson/model/Api.java | 12 +++-- .../dom4j/FilteredFunctionContext.java | 49 +++++++++++++++++++ test/src/test/java/hudson/model/ApiTest.java | 26 ++++++++++ 3 files changed, 84 insertions(+), 3 deletions(-) create mode 100644 core/src/main/java/jenkins/dom4j/FilteredFunctionContext.java diff --git a/core/src/main/java/hudson/model/Api.java b/core/src/main/java/hudson/model/Api.java index 71b617e46f..c96066d2ad 100644 --- a/core/src/main/java/hudson/model/Api.java +++ b/core/src/main/java/hudson/model/Api.java @@ -23,6 +23,7 @@ */ package hudson.model; +import jenkins.dom4j.FilteredFunctionContext; import jenkins.model.Jenkins; import jenkins.security.SecureRequester; @@ -31,6 +32,7 @@ import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.DocumentFactory; import org.dom4j.Element; +import org.dom4j.XPath; import org.dom4j.io.SAXReader; import org.dom4j.io.XMLWriter; import org.kohsuke.stapler.QueryParameter; @@ -106,14 +108,16 @@ public class Api extends AbstractModelObject { p.writeTo(bean,pruner,Flavor.XML.createDataWriter(bean,sw)); // apply XPath + FilteredFunctionContext functionContext = new FilteredFunctionContext(); Object result; try { Document dom = new SAXReader().read(new StringReader(sw.toString())); - // apply exclusions if (excludes!=null) { for (String exclude : excludes) { - List list = (List)dom.selectNodes(exclude); + XPath xExclude = dom.createXPath(exclude); + xExclude.setFunctionContext(functionContext); + List list = (List)xExclude.selectNodes(dom); for (org.dom4j.Node n : list) { Element parent = n.getParent(); if(parent!=null) @@ -125,7 +129,9 @@ public class Api extends AbstractModelObject { if(xpath==null) { result = dom; } else { - List list = dom.selectNodes(xpath); + XPath comp = dom.createXPath(xpath); + comp.setFunctionContext(functionContext); + List list = comp.selectNodes(dom); if (wrapper!=null) { Element root = DocumentFactory.getInstance().createElement(wrapper); for (Object o : list) { diff --git a/core/src/main/java/jenkins/dom4j/FilteredFunctionContext.java b/core/src/main/java/jenkins/dom4j/FilteredFunctionContext.java new file mode 100644 index 0000000000..9307d9fa0e --- /dev/null +++ b/core/src/main/java/jenkins/dom4j/FilteredFunctionContext.java @@ -0,0 +1,49 @@ +package jenkins.dom4j; + +import org.jaxen.Function; +import org.jaxen.FunctionContext; +import org.jaxen.UnresolvableException; +import org.jaxen.XPathFunctionContext; + +import java.util.Arrays; +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; + +/** + * {@link org.jaxen.FunctionContext} that removes some {@link org.dom4j.XPath} + * function names that are deemed bad as user input. + * + * @author Robert Sandell <rsandell@cloudbees.com>. + * @see org.jaxen.FunctionContext + * @see org.dom4j.XPath + * @see hudson.model.Api + */ +public class FilteredFunctionContext implements FunctionContext { + + /** + * Default set of "bad" function names. + */ + private static final Set DEFAULT_ILLEGAL_FUNCTIONS = Collections.unmodifiableSet(new HashSet( + Arrays.asList("document") + )); + private final FunctionContext base; + private final Set illegalFunctions; + + public FilteredFunctionContext(Set illegalFunctions) { + this.illegalFunctions = illegalFunctions; + base = XPathFunctionContext.getInstance(); + } + + public FilteredFunctionContext() { + this(DEFAULT_ILLEGAL_FUNCTIONS); + } + + @Override + public Function getFunction(String namespaceURI, String prefix, String localName) throws UnresolvableException { + if (localName != null && illegalFunctions.contains(localName.toLowerCase())) { + throw new UnresolvableException("Illegal function: " + localName); + } + return base.getFunction(namespaceURI, prefix, localName); + } +} diff --git a/test/src/test/java/hudson/model/ApiTest.java b/test/src/test/java/hudson/model/ApiTest.java index 3b2d82f5fd..e9c2d836a6 100644 --- a/test/src/test/java/hudson/model/ApiTest.java +++ b/test/src/test/java/hudson/model/ApiTest.java @@ -24,9 +24,13 @@ package hudson.model; import com.gargoylesoftware.htmlunit.Page; + +import java.io.File; +import java.io.IOException; import java.net.HttpURLConnection; import org.jvnet.hudson.test.HudsonTestCase; import org.jvnet.hudson.test.Bug; +import org.xml.sax.SAXException; /** * @author Kohsuke Kawaguchi @@ -38,6 +42,28 @@ public class ApiTest extends HudsonTestCase { new WebClient().goTo("api/xml?xpath=/*[1]","application/xml"); } + /** + * Test that calling the xml API with the xpath document function fails. + * + * See SECURITY-165 + * @throws IOException if so + * @throws SAXException if so + */ + public void testXPathDocumentFunction() throws IOException, SAXException { + File f = new File(jenkins.getRootDir(), "queue.xml"); + WebClient client = createWebClient(); + + try { + client.goTo("api/xml?xpath=document(\"" + f.getAbsolutePath() + "\")", "application/xml"); + fail("Should become 500 error"); + } catch (com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException e) { + String contentAsString = e.getResponse().getContentAsString(); + assertStringContains( + contentAsString, + "Illegal function: document"); + } + } + @Bug(3267) public void testWrappedZeroItems() throws Exception { Page page = new WebClient().goTo("api/xml?wrapper=root&xpath=/hudson/nonexistent", "application/xml"); From 29f59e42ae35693756573e324d0f5bbeefa749bc Mon Sep 17 00:00:00 2001 From: Ryan Campbell Date: Thu, 5 Feb 2015 13:45:33 -0600 Subject: [PATCH 278/701] [SECURITY-166] Make UI tests work across Jenkins versions --- .../java/hudson/security/HudsonPrivateSecurityRealm2Test.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/src/test/java/hudson/security/HudsonPrivateSecurityRealm2Test.java b/test/src/test/java/hudson/security/HudsonPrivateSecurityRealm2Test.java index 887626f321..7840763f34 100644 --- a/test/src/test/java/hudson/security/HudsonPrivateSecurityRealm2Test.java +++ b/test/src/test/java/hudson/security/HudsonPrivateSecurityRealm2Test.java @@ -57,7 +57,8 @@ public class HudsonPrivateSecurityRealm2Test { signup.enterEmail("alice@nowhere.com"); HtmlPage success = signup.submit(rule); assertThat(success.getElementById("main-panel").getTextContent(), containsString("Success")); - assertThat(success.getElementById("login-field").getTextContent(), containsString("Alice User")); + assertThat(success.getAnchorByHref("/jenkins/user/alice").getTextContent(), containsString("Alice User")); + assertEquals("Alice User", securityRealm.getUser("alice").getDisplayName()); From 07ecd9e1bf6f009a2440d0d46450f88e7c74a125 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20Gond=C5=BEa?= Date: Thu, 5 Feb 2015 14:11:17 +0100 Subject: [PATCH 279/701] Broken .bat script in LauncherTest#overwriteSystemEnvVars --- test/src/test/java/hudson/LauncherTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/src/test/java/hudson/LauncherTest.java b/test/src/test/java/hudson/LauncherTest.java index fdfd2fcea3..eba09f57c5 100644 --- a/test/src/test/java/hudson/LauncherTest.java +++ b/test/src/test/java/hudson/LauncherTest.java @@ -82,7 +82,7 @@ public class LauncherTest { FreeStyleProject project = rule.createFreeStyleProject(); project.addProperty(new ParametersDefinitionProperty(new StringParameterDefinition("jenkins_19926", "${jenkins_19926} and new value"))); final CommandInterpreter script = Functions.isWindows() - ? new BatchFile("echo %jenkins_19926") + ? new BatchFile("echo %jenkins_19926%") : new Shell("echo ${jenkins_19926}") ; project.getBuildersList().add(script); From cb5845db29bea10afd26c4425a44bc569ee75a7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20Gond=C5=BEa?= Date: Thu, 5 Feb 2015 20:53:29 +0100 Subject: [PATCH 280/701] Fix ProjectTest#testGetRelationship for Windows --- .../java/jenkins/model/WorkspaceWriter.java | 56 +++++++++++++++++++ .../test/java/hudson/model/ProjectTest.java | 21 +++++-- 2 files changed, 72 insertions(+), 5 deletions(-) create mode 100644 test/src/main/java/jenkins/model/WorkspaceWriter.java diff --git a/test/src/main/java/jenkins/model/WorkspaceWriter.java b/test/src/main/java/jenkins/model/WorkspaceWriter.java new file mode 100644 index 0000000000..5738f9ed8e --- /dev/null +++ b/test/src/main/java/jenkins/model/WorkspaceWriter.java @@ -0,0 +1,56 @@ +/* + * The MIT License + * + * Copyright (c) 2015 Red Hat, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package jenkins.model; + +import hudson.Launcher; +import hudson.model.BuildListener; +import hudson.model.AbstractBuild; + +import java.io.IOException; + +import org.jvnet.hudson.test.TestBuilder; + +/** + * Write text into file in workspace. + * + * @author ogondza + */ +public class WorkspaceWriter extends TestBuilder { + + private final String path; + private final String content; + + public WorkspaceWriter(String path, String content) { + this.path = path; + this.content = content; + } + + @Override + public boolean perform( + AbstractBuild build, Launcher launcher, BuildListener listener + ) throws InterruptedException, IOException { + build.getWorkspace().child(path).write(content, "UTF-8"); + return true; + } +} diff --git a/test/src/test/java/hudson/model/ProjectTest.java b/test/src/test/java/hudson/model/ProjectTest.java index 3bb2095ef8..9881129021 100644 --- a/test/src/test/java/hudson/model/ProjectTest.java +++ b/test/src/test/java/hudson/model/ProjectTest.java @@ -36,6 +36,7 @@ import hudson.scm.SCMRevisionState; import hudson.scm.PollingResult; import hudson.Launcher; import hudson.Launcher.RemoteLauncher; +import hudson.Util; import hudson.scm.NullSCM; import hudson.scm.SCM; import hudson.model.queue.SubTaskContributor; @@ -45,6 +46,7 @@ import hudson.model.Queue.Task; import hudson.model.queue.SubTask; import hudson.model.AbstractProject.BecauseOfUpstreamBuildInProgress; import hudson.model.AbstractProject.BecauseOfDownstreamBuildInProgress; +import jenkins.model.WorkspaceWriter; import jenkins.model.Jenkins; import hudson.model.AbstractProject.BecauseOfBuildInProgress; import antlr.ANTLRException; @@ -89,6 +91,7 @@ import java.util.logging.Logger; import org.junit.Ignore; import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.Issue; +import org.jvnet.hudson.test.TestBuilder; /** * @@ -484,22 +487,30 @@ public class ProjectTest { @Test public void testGetRelationship() throws Exception{ - FreeStyleProject project = j.createFreeStyleProject("project"); + final FreeStyleProject project = j.createFreeStyleProject("project"); FreeStyleProject project2 = j.createFreeStyleProject("project2"); j.buildAndAssertSuccess(project); j.buildAndAssertSuccess(project); j.buildAndAssertSuccess(project2); assertTrue("Project " + project.getDisplayName() + " should not have any relationship with " + project2.getDisplayName(), project.getRelationship(project2).isEmpty()); project.getPublishersList().add(new Fingerprinter("change.log", true)); - project.getBuildersList().add(new Shell("echo hello > change.log")); - project.getPublishersList().add(new ArtifactArchiver("change.log","",true)); + project.getBuildersList().add(new WorkspaceWriter("change.log", "hello")); + project.getPublishersList().add(new ArtifactArchiver("change.log")); project2.getPublishersList().add(new Fingerprinter("change.log", false)); - project2.getBuildersList().add(new Shell("cp " + project.getRootDir().getAbsolutePath() + "/builds/lastSuccessfulBuild/archive/change.log .")); + project2.getBuildersList().add(new TestBuilder() { + @Override public boolean perform(AbstractBuild build, Launcher launcher, BuildListener listener) throws InterruptedException, IOException { + for (Run.Artifact a: project.getLastBuild().getArtifacts()) { + Util.copyFile(a.getFile(), new File(build.getWorkspace().child(a.getFileName()).getRemote())); + } + return true; + } + }); + j.buildAndAssertSuccess(project); j.buildAndAssertSuccess(project2); j.buildAndAssertSuccess(project); j.buildAndAssertSuccess(project2); - project.getBuildersList().add(new Shell("echo helloWorld > change.log")); + project.getBuildersList().add(new WorkspaceWriter("change.log", "helloWorld")); j.buildAndAssertSuccess(project); j.buildAndAssertSuccess(project2); Map ralationship = project.getRelationship(project2); From c0bda983960e3c368e75fbc18bd97595fd3b0035 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20Gond=C5=BEa?= Date: Thu, 5 Feb 2015 21:32:44 +0100 Subject: [PATCH 281/701] Refactor ProjectTest#testGetRelationship --- .../test/java/hudson/model/ProjectTest.java | 56 ++++++++++--------- 1 file changed, 29 insertions(+), 27 deletions(-) diff --git a/test/src/test/java/hudson/model/ProjectTest.java b/test/src/test/java/hudson/model/ProjectTest.java index 9881129021..b7faf8bff9 100644 --- a/test/src/test/java/hudson/model/ProjectTest.java +++ b/test/src/test/java/hudson/model/ProjectTest.java @@ -487,40 +487,42 @@ public class ProjectTest { @Test public void testGetRelationship() throws Exception{ - final FreeStyleProject project = j.createFreeStyleProject("project"); - FreeStyleProject project2 = j.createFreeStyleProject("project2"); - j.buildAndAssertSuccess(project); - j.buildAndAssertSuccess(project); - j.buildAndAssertSuccess(project2); - assertTrue("Project " + project.getDisplayName() + " should not have any relationship with " + project2.getDisplayName(), project.getRelationship(project2).isEmpty()); - project.getPublishersList().add(new Fingerprinter("change.log", true)); - project.getBuildersList().add(new WorkspaceWriter("change.log", "hello")); - project.getPublishersList().add(new ArtifactArchiver("change.log")); - project2.getPublishersList().add(new Fingerprinter("change.log", false)); - project2.getBuildersList().add(new TestBuilder() { + final FreeStyleProject upstream = j.createFreeStyleProject("upstream"); + FreeStyleProject downstream = j.createFreeStyleProject("downstream"); + j.buildAndAssertSuccess(upstream); + j.buildAndAssertSuccess(upstream); + j.buildAndAssertSuccess(downstream); + assertTrue("Project upstream should not have any relationship with downstream", upstream.getRelationship(downstream).isEmpty()); + + upstream.getPublishersList().add(new Fingerprinter("change.log", true)); + upstream.getBuildersList().add(new WorkspaceWriter("change.log", "hello")); + upstream.getPublishersList().add(new ArtifactArchiver("change.log")); + downstream.getPublishersList().add(new Fingerprinter("change.log", false)); + downstream.getBuildersList().add(new TestBuilder() { @Override public boolean perform(AbstractBuild build, Launcher launcher, BuildListener listener) throws InterruptedException, IOException { - for (Run.Artifact a: project.getLastBuild().getArtifacts()) { + for (Run.Artifact a: upstream.getLastBuild().getArtifacts()) { Util.copyFile(a.getFile(), new File(build.getWorkspace().child(a.getFileName()).getRemote())); } return true; } }); - j.buildAndAssertSuccess(project); - j.buildAndAssertSuccess(project2); - j.buildAndAssertSuccess(project); - j.buildAndAssertSuccess(project2); - project.getBuildersList().add(new WorkspaceWriter("change.log", "helloWorld")); - j.buildAndAssertSuccess(project); - j.buildAndAssertSuccess(project2); - Map ralationship = project.getRelationship(project2); - assertFalse("Project " + project.getDisplayName() + " should have relationship with " + project2.getDisplayName(), ralationship.isEmpty()); - assertTrue("Relationship should contains build 3 of project " + project.getDisplayName(), ralationship.keySet().contains(3)); - assertFalse("Relationship should not contains build 4 of project " + project.getDisplayName() + " because previous fingerprinted file was not change since build 3", ralationship.keySet().contains(4)); - assertEquals("Build 2 of project " + project2.getDisplayName() + " should be the first build which depends on build 3 of project " + project.getDisplayName(), 2, ralationship.get(3).min()); - assertEquals("Build 3 of project " + project2.getDisplayName() + " should be the last build which depends on build 3 of project " + project.getDisplayName(), 3, ralationship.get(3).max()-1); - assertEquals("Build 4 of project " + project2.getDisplayName() + " should depend only on build 5 of project " + project.getDisplayName(), 4, ralationship.get(5).min()); - assertEquals("Build 4 of project " + project2.getDisplayName() + " should depend only on build 5 of project " + project.getDisplayName(), 4, ralationship.get(5).max()-1); + j.buildAndAssertSuccess(upstream); + j.buildAndAssertSuccess(downstream); + j.buildAndAssertSuccess(upstream); + j.buildAndAssertSuccess(downstream); + upstream.getBuildersList().add(new WorkspaceWriter("change.log", "helloWorld")); + j.buildAndAssertSuccess(upstream); + j.buildAndAssertSuccess(downstream); + + Map relationship = upstream.getRelationship(downstream); + assertFalse("Project upstream should have relationship with downstream", relationship.isEmpty()); + assertTrue("Relationship should contain upstream #3", relationship.keySet().contains(3)); + assertFalse("Relationship should not contain upstream #4 because previous fingerprinted file was not changed since #3", relationship.keySet().contains(4)); + assertEquals("downstream #2 should be the first build which depends on upstream #3", 2, relationship.get(3).min()); + assertEquals("downstream #3 should be the last build which depends on upstream #3", 3, relationship.get(3).max()-1); + assertEquals("downstream #4 should depend only on upstream #5", 4, relationship.get(5).min()); + assertEquals("downstream #4 should depend only on upstream #5", 4, relationship.get(5).max()-1); } @Test From b72246edb12a742f9e21895ecfde498f8ffe9509 Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Thu, 5 Feb 2015 18:30:16 -0500 Subject: [PATCH 282/701] outsideSymlinks --- .../hudson/tasks/ArtifactArchiverTest.java | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/test/src/test/java/hudson/tasks/ArtifactArchiverTest.java b/test/src/test/java/hudson/tasks/ArtifactArchiverTest.java index f5d7f4ac41..831cf8b076 100644 --- a/test/src/test/java/hudson/tasks/ArtifactArchiverTest.java +++ b/test/src/test/java/hudson/tasks/ArtifactArchiverTest.java @@ -44,6 +44,7 @@ import java.util.List; import jenkins.util.VirtualFile; import static org.junit.Assert.*; import static org.junit.Assume.*; +import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; import org.jvnet.hudson.test.Bug; @@ -202,6 +203,34 @@ public class ArtifactArchiverTest { assertEquals("lodge", kids[0].getName()); // do not check that it .exists() since its target has not been archived } + + @Ignore("TODO currently fails as expected") + //@Issue("SECURITY-162") + @Test public void outsideSymlinks() throws Exception { + final FreeStyleProject p = j.createFreeStyleProject(); + p.getBuildersList().add(new TestBuilder() { + @Override public boolean perform(AbstractBuild build, Launcher launcher, BuildListener listener) throws InterruptedException, IOException { + FilePath ws = build.getWorkspace(); + if (ws == null) { + return false; + } + ws.child("hack").symlinkTo(p.getConfigFile().getFile().getAbsolutePath(), listener); + return true; + } + }); + p.getPublishersList().add(new ArtifactArchiver("hack", "", false, true)); + FreeStyleBuild b = j.assertBuildStatusSuccess(p.scheduleBuild2(0)); + List artifacts = b.getArtifacts(); + assertEquals(1, artifacts.size()); + FreeStyleBuild.Artifact artifact = artifacts.get(0); + assertEquals("hack", artifact.relativePath); + VirtualFile[] kids = b.getArtifactManager().root().list(); + assertEquals(1, kids.length); + assertEquals("hack", kids[0].getName()); + assertFalse(kids[0].isDirectory()); + assertFalse(kids[0].isFile()); + assertFalse(kids[0].exists()); + } private void runNewBuildAndStartUnitlIsCreated(AbstractProject project) throws InterruptedException{ int buildNumber = project.getNextBuildNumber(); From b237a41af40d8e2d3f7f47603d7196bcbbbb890b Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Thu, 5 Feb 2015 18:42:54 -0500 Subject: [PATCH 283/701] Also checking DirectoryBrowserSupport behavior, as in DirectoryBrowserSupportTest. --- test/src/test/java/hudson/tasks/ArtifactArchiverTest.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/src/test/java/hudson/tasks/ArtifactArchiverTest.java b/test/src/test/java/hudson/tasks/ArtifactArchiverTest.java index 831cf8b076..20ccc96c95 100644 --- a/test/src/test/java/hudson/tasks/ArtifactArchiverTest.java +++ b/test/src/test/java/hudson/tasks/ArtifactArchiverTest.java @@ -37,6 +37,7 @@ import hudson.tasks.LogRotatorTest.TestsFail; import static hudson.tasks.LogRotatorTest.build; import java.io.File; import java.io.IOException; +import java.net.HttpURLConnection; import java.nio.charset.Charset; import java.util.Arrays; import java.util.Collections; @@ -230,6 +231,7 @@ public class ArtifactArchiverTest { assertFalse(kids[0].isDirectory()); assertFalse(kids[0].isFile()); assertFalse(kids[0].exists()); + j.createWebClient().assertFails(b.getUrl() + "artifact/hack", HttpURLConnection.HTTP_NOT_FOUND); } private void runNewBuildAndStartUnitlIsCreated(AbstractProject project) throws InterruptedException{ From 6a8ce6ca099cc9b51db6e1417e507973978a9271 Mon Sep 17 00:00:00 2001 From: Nicolas De Loof Date: Thu, 5 Feb 2015 17:00:49 +0100 Subject: [PATCH 284/701] deprecated find(string) and introduce explicit methods to lookup descriptor by id or by Describable class name --- .../main/java/hudson/model/Descriptor.java | 36 ++++++++++++++----- 1 file changed, 27 insertions(+), 9 deletions(-) diff --git a/core/src/main/java/hudson/model/Descriptor.java b/core/src/main/java/hudson/model/Descriptor.java index 28e4a95ecc..a043d6b2fa 100644 --- a/core/src/main/java/hudson/model/Descriptor.java +++ b/core/src/main/java/hudson/model/Descriptor.java @@ -912,11 +912,11 @@ public abstract class Descriptor> implements Saveable { Descriptor d = null; String kind = jo.optString("kind", null); if (kind != null) { - d = find(descriptors, kind); + d = findById(descriptors, kind); } if (d == null) { kind = jo.getString("$class"); - d = find(descriptors, kind); + d = findByClassName(descriptors, kind); } if (d != null) { items.add(d.newInstance(req, jo)); @@ -930,20 +930,38 @@ public abstract class Descriptor> implements Saveable { } /** - * Finds a descriptor from a collection by its class name. + * Finds a descriptor from a collection by its id. */ - public static @CheckForNull T find(Collection list, String className) { + public static @CheckForNull T findById(Collection list, String id) { + for (T d : list) { + if(d.getId().equals(id)) + return d; + } + return null; + } + + /** + * Finds a descriptor from a collection by its class name. + * @deprecated Since we introduced {@link Descriptor#getId()}, it is a preferred method of identifying descriptor by a string. + */ + public static @CheckForNull T findByClassName(Collection list, String className) { for (T d : list) { if(d.getClass().getName().equals(className)) return d; } - // Since we introduced Descriptor.getId(), it is a preferred method of identifying descriptor by a string. - // To make that migration easier without breaking compatibility, let's also match up with the id. - for (T d : list) { - if(d.getId().equals(className)) + return null; + } + + /** + * Finds a descriptor from a collection by its class name or ID. + * @deprecated choose between {@link #findById(java.util.Collection, String)} or {@link #findByClassName(java.util.Collection, String)} + */ + public static @CheckForNull T find(Collection list, String string) { + T d = findByClassName(list, string); + if (d != null) { return d; } - return null; + return findById(list, string); } public static @CheckForNull Descriptor find(String className) { From 1629a93fbce4dc8b5e59943fc9b97849349db73a Mon Sep 17 00:00:00 2001 From: Robert Sandell Date: Fri, 6 Feb 2015 10:34:41 +0100 Subject: [PATCH 285/701] Tidy up Review comments fixed: Added license header Reformat the issue comment Restricted NoExternalUse toLowerCase in English locale lesser resolution of declared exception from the test --- .../dom4j/FilteredFunctionContext.java | 30 ++++++++++++++++++- test/src/test/java/hudson/model/ApiTest.java | 9 +++--- 2 files changed, 33 insertions(+), 6 deletions(-) diff --git a/core/src/main/java/jenkins/dom4j/FilteredFunctionContext.java b/core/src/main/java/jenkins/dom4j/FilteredFunctionContext.java index 9307d9fa0e..302f320158 100644 --- a/core/src/main/java/jenkins/dom4j/FilteredFunctionContext.java +++ b/core/src/main/java/jenkins/dom4j/FilteredFunctionContext.java @@ -1,13 +1,40 @@ + +/* + * The MIT License + * + * Copyright (c) 2015, CloudBees, Inc. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ package jenkins.dom4j; import org.jaxen.Function; import org.jaxen.FunctionContext; import org.jaxen.UnresolvableException; import org.jaxen.XPathFunctionContext; +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.NoExternalUse; import java.util.Arrays; import java.util.Collections; import java.util.HashSet; +import java.util.Locale; import java.util.Set; /** @@ -19,6 +46,7 @@ import java.util.Set; * @see org.dom4j.XPath * @see hudson.model.Api */ +@Restricted(NoExternalUse.class) public class FilteredFunctionContext implements FunctionContext { /** @@ -41,7 +69,7 @@ public class FilteredFunctionContext implements FunctionContext { @Override public Function getFunction(String namespaceURI, String prefix, String localName) throws UnresolvableException { - if (localName != null && illegalFunctions.contains(localName.toLowerCase())) { + if (localName != null && illegalFunctions.contains(localName.toLowerCase(Locale.ENGLISH))) { throw new UnresolvableException("Illegal function: " + localName); } return base.getFunction(namespaceURI, prefix, localName); diff --git a/test/src/test/java/hudson/model/ApiTest.java b/test/src/test/java/hudson/model/ApiTest.java index e9c2d836a6..7d6883549f 100644 --- a/test/src/test/java/hudson/model/ApiTest.java +++ b/test/src/test/java/hudson/model/ApiTest.java @@ -43,13 +43,12 @@ public class ApiTest extends HudsonTestCase { } /** - * Test that calling the xml API with the xpath document function fails. + * Test that calling the XML API with the XPath document function fails. * - * See SECURITY-165 - * @throws IOException if so - * @throws SAXException if so + * @throws Exception if so */ - public void testXPathDocumentFunction() throws IOException, SAXException { + //Issue("SECURITY-165") + public void testXPathDocumentFunction() throws Exception { File f = new File(jenkins.getRootDir(), "queue.xml"); WebClient client = createWebClient(); From c03afbbd4fb9f98c1cb928d358c021bda2d60c97 Mon Sep 17 00:00:00 2001 From: Robert Sandell Date: Fri, 6 Feb 2015 14:52:20 +0100 Subject: [PATCH 286/701] Moved new class to other package --- core/src/main/java/hudson/model/Api.java | 2 +- .../jenkins/{dom4j => util/xml}/FilteredFunctionContext.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename core/src/main/java/jenkins/{dom4j => util/xml}/FilteredFunctionContext.java (99%) diff --git a/core/src/main/java/hudson/model/Api.java b/core/src/main/java/hudson/model/Api.java index c96066d2ad..35e56a6c09 100644 --- a/core/src/main/java/hudson/model/Api.java +++ b/core/src/main/java/hudson/model/Api.java @@ -23,7 +23,7 @@ */ package hudson.model; -import jenkins.dom4j.FilteredFunctionContext; +import jenkins.util.xml.FilteredFunctionContext; import jenkins.model.Jenkins; import jenkins.security.SecureRequester; diff --git a/core/src/main/java/jenkins/dom4j/FilteredFunctionContext.java b/core/src/main/java/jenkins/util/xml/FilteredFunctionContext.java similarity index 99% rename from core/src/main/java/jenkins/dom4j/FilteredFunctionContext.java rename to core/src/main/java/jenkins/util/xml/FilteredFunctionContext.java index 302f320158..81048283de 100644 --- a/core/src/main/java/jenkins/dom4j/FilteredFunctionContext.java +++ b/core/src/main/java/jenkins/util/xml/FilteredFunctionContext.java @@ -22,7 +22,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -package jenkins.dom4j; +package jenkins.util.xml; import org.jaxen.Function; import org.jaxen.FunctionContext; From 1bba1ac3c6e9ae96e605e3846b9c77e2baafdedd Mon Sep 17 00:00:00 2001 From: Jesse Glick Date: Fri, 6 Feb 2015 11:37:24 -0500 Subject: [PATCH 287/701] [SECURITY-162] Capture the root directory in VirtualFile.forFile and reject attempts to escape it. --- .../main/java/jenkins/util/VirtualFile.java | 54 +++++++++++++-- .../java/jenkins/util/VirtualFileTest.java | 66 +++++++++++++++++++ .../hudson/tasks/ArtifactArchiverTest.java | 2 - 3 files changed, 115 insertions(+), 7 deletions(-) create mode 100644 core/src/test/java/jenkins/util/VirtualFileTest.java diff --git a/core/src/main/java/jenkins/util/VirtualFile.java b/core/src/main/java/jenkins/util/VirtualFile.java index 1a54d08545..89ab6ebb79 100644 --- a/core/src/main/java/jenkins/util/VirtualFile.java +++ b/core/src/main/java/jenkins/util/VirtualFile.java @@ -33,12 +33,15 @@ import hudson.util.DirScanner; import hudson.util.FileVisitor; import java.io.File; import java.io.FileInputStream; +import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.Serializable; import java.net.URI; import java.util.ArrayList; import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; import javax.annotation.Nonnull; /** @@ -207,12 +210,14 @@ public abstract class VirtualFile implements Comparable, Serializab * @return a wrapper */ public static VirtualFile forFile(final File f) { - return new FileVF(f); + return new FileVF(f, f); } private static final class FileVF extends VirtualFile { private final File f; - FileVF(File f) { + private final File root; + FileVF(File f, File root) { this.f = f; + this.root = root; } @Override public String getName() { return f.getName(); @@ -221,46 +226,85 @@ public abstract class VirtualFile implements Comparable, Serializab return f.toURI(); } @Override public VirtualFile getParent() { - return forFile(f.getParentFile()); + return new FileVF(f.getParentFile(), root); } @Override public boolean isDirectory() throws IOException { + if (isIllegalSymlink()) { + return false; + } return f.isDirectory(); } @Override public boolean isFile() throws IOException { + if (isIllegalSymlink()) { + return false; + } return f.isFile(); } @Override public boolean exists() throws IOException { + if (isIllegalSymlink()) { + return false; + } return f.exists(); } @Override public VirtualFile[] list() throws IOException { + if (isIllegalSymlink()) { + return new VirtualFile[0]; + } File[] kids = f.listFiles(); if (kids == null) { return new VirtualFile[0]; } VirtualFile[] vfs = new VirtualFile[kids.length]; for (int i = 0; i < kids.length; i++) { - vfs[i] = forFile(kids[i]); + vfs[i] = new FileVF(kids[i], root); } return vfs; } @Override public String[] list(String glob) throws IOException { + if (isIllegalSymlink()) { + return new String[0]; + } return new Scanner(glob).invoke(f, null); } @Override public VirtualFile child(String name) { - return forFile(new File(f, name)); + return new FileVF(new File(f, name), root); } @Override public long length() throws IOException { + if (isIllegalSymlink()) { + return 0; + } return f.length(); } @Override public long lastModified() throws IOException { + if (isIllegalSymlink()) { + return 0; + } return f.lastModified(); } @Override public boolean canRead() throws IOException { + if (isIllegalSymlink()) { + return false; + } return f.canRead(); } @Override public InputStream open() throws IOException { + if (isIllegalSymlink()) { + throw new FileNotFoundException(f.getPath()); + } return new FileInputStream(f); } + private boolean isIllegalSymlink() { // TODO JENKINS-26838 + try { + String myPath = f.getCanonicalPath(); + String rootPath = root.getCanonicalPath(); + if (!myPath.equals(rootPath) && !myPath.startsWith(rootPath + File.separatorChar)) { + return true; + } + } catch (IOException x) { + Logger.getLogger(VirtualFile.class.getName()).log(Level.FINE, "could not determine symlink status of " + f, x); + } + return false; + } } /** diff --git a/core/src/test/java/jenkins/util/VirtualFileTest.java b/core/src/test/java/jenkins/util/VirtualFileTest.java new file mode 100644 index 0000000000..699f4b2f8e --- /dev/null +++ b/core/src/test/java/jenkins/util/VirtualFileTest.java @@ -0,0 +1,66 @@ +/* + * The MIT License + * + * Copyright 2015 Jesse Glick. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package jenkins.util; + +import hudson.Util; +import hudson.model.TaskListener; +import java.io.File; +import java.io.FileNotFoundException; +import org.apache.commons.io.FileUtils; +import org.apache.commons.io.IOUtils; +import org.junit.Test; +import static org.junit.Assert.*; +import org.junit.Rule; +import org.junit.rules.TemporaryFolder; + +public class VirtualFileTest { + + @Rule public TemporaryFolder tmp = new TemporaryFolder(); + + //@Issue("SECURITY-162") + @Test public void outsideSymlinks() throws Exception { + File ws = tmp.newFolder("ws"); + FileUtils.write(new File(ws, "safe"), "safe"); + Util.createSymlink(ws, "safe", "supported", TaskListener.NULL); + File other = tmp.newFolder("other"); + FileUtils.write(new File(other, "secret"), "s3cr3t"); + Util.createSymlink(ws, "../other/secret", "hack", TaskListener.NULL); + VirtualFile root = VirtualFile.forFile(ws); + VirtualFile supported = root.child("supported"); + assertTrue(supported.isFile()); + assertTrue(supported.exists()); + assertEquals("safe", IOUtils.toString(supported.open(), (String) null)); + VirtualFile hack = root.child("hack"); + assertFalse(hack.isFile()); + assertFalse(hack.exists()); + try { + hack.open(); + fail(); + } catch (FileNotFoundException x) { + // OK + } + } + +} \ No newline at end of file diff --git a/test/src/test/java/hudson/tasks/ArtifactArchiverTest.java b/test/src/test/java/hudson/tasks/ArtifactArchiverTest.java index 20ccc96c95..b3af46be66 100644 --- a/test/src/test/java/hudson/tasks/ArtifactArchiverTest.java +++ b/test/src/test/java/hudson/tasks/ArtifactArchiverTest.java @@ -45,7 +45,6 @@ import java.util.List; import jenkins.util.VirtualFile; import static org.junit.Assert.*; import static org.junit.Assume.*; -import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; import org.jvnet.hudson.test.Bug; @@ -205,7 +204,6 @@ public class ArtifactArchiverTest { // do not check that it .exists() since its target has not been archived } - @Ignore("TODO currently fails as expected") //@Issue("SECURITY-162") @Test public void outsideSymlinks() throws Exception { final FreeStyleProject p = j.createFreeStyleProject(); From 901194ae77358b49016a32e6c97e74a70cbbb261 Mon Sep 17 00:00:00 2001 From: Nicolas De Loof Date: Fri, 6 Feb 2015 17:09:12 +0100 Subject: [PATCH 288/701] make $class and kind mutually exclusive Use kind when descriptor.id != descriptor.clazz.name and $clazz otherwise. --- core/src/main/java/hudson/model/Descriptor.java | 14 +++++++++++++- .../hudson/tools/DownloadFromUrlInstaller.java | 6 +++--- .../main/resources/lib/form/class-entry.jelly | 16 ++++++++++------ 3 files changed, 26 insertions(+), 10 deletions(-) diff --git a/core/src/main/java/hudson/model/Descriptor.java b/core/src/main/java/hudson/model/Descriptor.java index a043d6b2fa..e68517ce74 100644 --- a/core/src/main/java/hudson/model/Descriptor.java +++ b/core/src/main/java/hudson/model/Descriptor.java @@ -916,7 +916,8 @@ public abstract class Descriptor> implements Saveable { } if (d == null) { kind = jo.getString("$class"); - d = findByClassName(descriptors, kind); + d = findByDescribableClassName(descriptors, kind); + if (d == null) d = findByClassName(descriptors, kind); } if (d != null) { items.add(d.newInstance(req, jo)); @@ -952,6 +953,17 @@ public abstract class Descriptor> implements Saveable { return null; } + /** + * Finds a descriptor from a collection by the class name of the Describable it describes. + */ + public static @CheckForNull T findByDescribableClassName(Collection list, String className) { + for (T d : list) { + if(d.clazz.getName().equals(className)) + return d; + } + return null; + } + /** * Finds a descriptor from a collection by its class name or ID. * @deprecated choose between {@link #findById(java.util.Collection, String)} or {@link #findByClassName(java.util.Collection, String)} diff --git a/core/src/main/java/hudson/tools/DownloadFromUrlInstaller.java b/core/src/main/java/hudson/tools/DownloadFromUrlInstaller.java index 938325f668..418f7fd1e7 100644 --- a/core/src/main/java/hudson/tools/DownloadFromUrlInstaller.java +++ b/core/src/main/java/hudson/tools/DownloadFromUrlInstaller.java @@ -122,7 +122,7 @@ public abstract class DownloadFromUrlInstaller extends ToolInstaller { } protected Downloadable createDownloadable() { - return new Downloadable(getId()); + return new Downloadable(getDownloadableId()); } /** @@ -130,7 +130,7 @@ public abstract class DownloadFromUrlInstaller extends ToolInstaller { *

                    * By default we use the fully-qualified class name of the {@link DownloadFromUrlInstaller} subtype. */ - public String getId() { + public String getDownloadableId() { return clazz.getName().replace('$','.'); } @@ -144,7 +144,7 @@ public abstract class DownloadFromUrlInstaller extends ToolInstaller { * @return never null. */ public List getInstallables() throws IOException { - JSONObject d = Downloadable.get(getId()).getData(); + JSONObject d = Downloadable.get(getDownloadableId()).getData(); if(d==null) return Collections.emptyList(); return Arrays.asList(((InstallableList)JSONObject.toBean(d,InstallableList.class)).list); } diff --git a/core/src/main/resources/lib/form/class-entry.jelly b/core/src/main/resources/lib/form/class-entry.jelly index 371f5137d8..89a1076798 100644 --- a/core/src/main/resources/lib/form/class-entry.jelly +++ b/core/src/main/resources/lib/form/class-entry.jelly @@ -36,11 +36,15 @@ THE SOFTWARE. - - - - - - + + + + + + + + + + From fae41b01c9c034ab98216c92ca6bd171b8d81d6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20Gond=C5=BEa?= Date: Tue, 27 Jan 2015 14:09:22 +0100 Subject: [PATCH 289/701] [JENKINS-26684] Reproduce in unittest. --- .../src/test/java/hudson/tasks/MavenTest.java | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/test/src/test/java/hudson/tasks/MavenTest.java b/test/src/test/java/hudson/tasks/MavenTest.java index 72cb2b973a..3d4d554ff0 100644 --- a/test/src/test/java/hudson/tasks/MavenTest.java +++ b/test/src/test/java/hudson/tasks/MavenTest.java @@ -268,4 +268,41 @@ public class MavenTest { assertEquals("{}", env.toString()); } + @Issue("JENKINS-26684") + @Test public void specialCharsInBuildVariablesPassedAsProperties() throws Exception { + j.configureDefaultMaven(); + + FreeStyleProject p = j.createFreeStyleProject(); + p.getBuildersList().add(new Maven("--help", null)); + p.addProperty(new ParametersDefinitionProperty( + new StringParameterDefinition("tilde", "~"), + new StringParameterDefinition("exclamation_mark", "!"), + new StringParameterDefinition("at_sign", "@"), + new StringParameterDefinition("sharp", "#"), + new StringParameterDefinition("dolar", "$"), + new StringParameterDefinition("percent", "%"), + new StringParameterDefinition("circumflex", "^"), + new StringParameterDefinition("ampersand", "&"), + new StringParameterDefinition("asterix", "*"), + new StringParameterDefinition("parentheses", "()"), + new StringParameterDefinition("underscore", "_"), + new StringParameterDefinition("plus", "+"), + new StringParameterDefinition("braces", "{}"), + new StringParameterDefinition("brackets", "[]"), + new StringParameterDefinition("colon", ":"), + new StringParameterDefinition("semicolon", ";"), + new StringParameterDefinition("quote", "\""), + new StringParameterDefinition("apostrophe", "'"), + new StringParameterDefinition("backslash", "\\"), + new StringParameterDefinition("pipe", "|"), + new StringParameterDefinition("angle_brackets", "<>"), + new StringParameterDefinition("comma", ","), + new StringParameterDefinition("period", "."), + new StringParameterDefinition("slash", "/"), + new StringParameterDefinition("question_mark", "?"), + new StringParameterDefinition("space", " ") + )); + + FreeStyleBuild build = j.buildAndAssertSuccess(p); + } } From 58a41bcb182290de681da01ba277b5e0d6211707 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20Gond=C5=BEa?= Date: Sun, 8 Feb 2015 12:48:12 +0100 Subject: [PATCH 290/701] [FIXED JENKINS-26684] Escape special chars in maven build step arguments --- core/src/main/java/hudson/tasks/Maven.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/core/src/main/java/hudson/tasks/Maven.java b/core/src/main/java/hudson/tasks/Maven.java index 44016c6d3d..9515219b04 100644 --- a/core/src/main/java/hudson/tasks/Maven.java +++ b/core/src/main/java/hudson/tasks/Maven.java @@ -322,6 +322,10 @@ public class Maven extends Builder { wrapUpArguments(args,normalizedTarget,build,launcher,listener); buildEnvVars(env, mi); + + if (!launcher.isUnix()) { + args = args.toWindowsCommand(); + } try { MavenConsoleAnnotator mca = new MavenConsoleAnnotator(listener.getLogger(),build.getCharset()); From 6c1db428303ba8dbda1536fe50133aa4ea34aa23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20Gond=C5=BEa?= Date: Wed, 11 Feb 2015 12:58:56 +0100 Subject: [PATCH 291/701] Noting #1567 --- changelog.html | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/changelog.html b/changelog.html index b475a1e506..2a63313c42 100644 --- a/changelog.html +++ b/changelog.html @@ -66,7 +66,9 @@ Upcoming changes

                  • Build history text field wrap fails when containing markup (issue 26406) - +
                  • + Maven build step fail to launch mvn process when special chars are present in build variables. + (issue 26684)
                  From 5f7629bb8b7d4dc853134a3d831ab4d4d411780a Mon Sep 17 00:00:00 2001 From: Nicolas De Loof Date: Thu, 12 Feb 2015 22:24:25 +0100 Subject: [PATCH 292/701] =?UTF-8?q?prevent=20removing=20artifact=20when=20?= =?UTF-8?q?build=20isn=E2=80=99t=20completed=20yet?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/src/main/java/hudson/tasks/LogRotator.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/core/src/main/java/hudson/tasks/LogRotator.java b/core/src/main/java/hudson/tasks/LogRotator.java index bc7a2d9738..8797a334db 100644 --- a/core/src/main/java/hudson/tasks/LogRotator.java +++ b/core/src/main/java/hudson/tasks/LogRotator.java @@ -187,6 +187,10 @@ public class LogRotator extends BuildDiscarder { LOGGER.log(FINER, "{0} is not to be removed or purged of artifacts because it’s the last stable build", r); return true; } + if (r.isBuilding()) { + LOGGER.log(FINER, "{0} is not to be removed or purged of artifacts because it’s still building", r); + return true; + } return false; } From d198bfa511c5e882b336a4c7392709867d76613b Mon Sep 17 00:00:00 2001 From: muhammedeminakbulut Date: Fri, 13 Feb 2015 16:42:38 +0100 Subject: [PATCH 293/701] some language issues fixed --- core/src/main/resources/hudson/model/Messages_nl.properties | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/src/main/resources/hudson/model/Messages_nl.properties b/core/src/main/resources/hudson/model/Messages_nl.properties index f4a178a28d..88b53d8f21 100644 --- a/core/src/main/resources/hudson/model/Messages_nl.properties +++ b/core/src/main/resources/hudson/model/Messages_nl.properties @@ -26,8 +26,8 @@ AbstractBuild.KeptBecause=Weerhouden omwille van {0} AbstractProject.NewBuildForWorkspace=Om een werkplaats te krijgen wordt een nieuwe bouwpoging gepland. AbstractProject.Pronoun=Project AbstractProject.Aborted=Afgebroken -AbstractProject.BuildInProgress=Bouwpoging #{0} is reeds actiev {1} -AbstractProject.Disabled=Bouwen gedesactiveerd +AbstractProject.BuildInProgress=Bouwpoging #{0} is reeds actief {1} +AbstractProject.Disabled=Bouwen gedeactiveerd AbstractProject.ETA= (einde voorzien op:{0}) AbstractProject.NoSCM=Geen versiebeheersysteem beschikbaar AbstractProject.NoWorkspace=Er is geen werkplaats beschikbaar. Ophalen van wijzigingen is dus onmogelijk. @@ -39,7 +39,7 @@ Api.MultipleMatch=XPath "{0}" komt overeen met {1} knopen. Cre\u00eber een XPath Api.NoXPathMatch=XPath {0} komt met geen enkele knoop overeen BallColor.Aborted=Afgebroken -BallColor.Disabled=Gedesactiveerd +BallColor.Disabled=Gedeactiveerd BallColor.Failed=Gefaald BallColor.InProgress=In verwerking BallColor.Pending=In afwachting From c4e5fbdbc9c644f1afcae031b3b4638ad5297238 Mon Sep 17 00:00:00 2001 From: ikedam Date: Sat, 14 Feb 2015 15:10:03 +0900 Subject: [PATCH 294/701] [FIXED JENKINS-4409] Disable URLConnection.useCache in tests on Windows. It prevents deleting temporary directories when tests finish. --- .../org/jvnet/hudson/test/HudsonTestCase.java | 21 +++++++++++++++++++ .../org/jvnet/hudson/test/JenkinsRule.java | 21 +++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/test/src/main/java/org/jvnet/hudson/test/HudsonTestCase.java b/test/src/main/java/org/jvnet/hudson/test/HudsonTestCase.java index 7c62154b98..bfd1d05ece 100644 --- a/test/src/main/java/org/jvnet/hudson/test/HudsonTestCase.java +++ b/test/src/main/java/org/jvnet/hudson/test/HudsonTestCase.java @@ -101,6 +101,7 @@ import java.net.MalformedURLException; import java.net.URISyntaxException; import java.net.URL; import java.net.URLClassLoader; +import java.net.URLConnection; import java.nio.charset.Charset; import java.util.ArrayList; import java.util.Arrays; @@ -276,6 +277,8 @@ public abstract class HudsonTestCase extends TestCase implements RootAction { */ protected File explodedWarDir; + private boolean origDefaultUseCache = true; + protected HudsonTestCase(String name) { super(name); } @@ -298,6 +301,18 @@ public abstract class HudsonTestCase extends TestCase implements RootAction { @Override protected void setUp() throws Exception { + if(Functions.isWindows()) { + // JENKINS-4409. + // URLConnection caches handles to jar files by default, + // and it prevents delete temporary directories on Windows. + // Disables caching here. + // Though defaultUseCache is a static field, + // its setter and getter are provided as instance methods. + URLConnection aConnection = new File(".").toURI().toURL().openConnection(); + origDefaultUseCache = aConnection.getDefaultUseCaches(); + aConnection.setDefaultUseCaches(false); + } + env.pin(); recipe(); for (Runner r : recipes) { @@ -420,6 +435,12 @@ public abstract class HudsonTestCase extends TestCase implements RootAction { // at some later point, leading to possible file descriptor overflow. So encourage GC now. // see http://bugs.sun.com/view_bug.do?bug_id=4950148 System.gc(); + + // restore defaultUseCache + if(Functions.isWindows()) { + URLConnection aConnection = new File(".").toURI().toURL().openConnection(); + aConnection.setDefaultUseCaches(origDefaultUseCache); + } } } diff --git a/test/src/main/java/org/jvnet/hudson/test/JenkinsRule.java b/test/src/main/java/org/jvnet/hudson/test/JenkinsRule.java index 3c2eb13150..b9707a2f63 100644 --- a/test/src/main/java/org/jvnet/hudson/test/JenkinsRule.java +++ b/test/src/main/java/org/jvnet/hudson/test/JenkinsRule.java @@ -128,6 +128,7 @@ import java.net.SocketTimeoutException; import java.net.URISyntaxException; import java.net.URL; import java.net.URLClassLoader; +import java.net.URLConnection; import java.nio.charset.Charset; import java.util.ArrayList; import java.util.Arrays; @@ -303,6 +304,8 @@ public class JenkinsRule implements TestRule, MethodRule, RootAction { public JenkinsComputerConnectorTester computerConnectorTester = new JenkinsComputerConnectorTester(this); + private boolean origDefaultUseCache = true; + public Jenkins getInstance() { return jenkins; } @@ -312,6 +315,18 @@ public class JenkinsRule implements TestRule, MethodRule, RootAction { * @throws Throwable if setup fails (which will disable {@code after} */ public void before() throws Throwable { + if(Functions.isWindows()) { + // JENKINS-4409. + // URLConnection caches handles to jar files by default, + // and it prevents delete temporary directories on Windows. + // Disables caching here. + // Though defaultUseCache is a static field, + // its setter and getter are provided as instance methods. + URLConnection aConnection = new File(".").toURI().toURL().openConnection(); + origDefaultUseCache = aConnection.getDefaultUseCaches(); + aConnection.setDefaultUseCaches(false); + } + // Not ideal (https://github.com/junit-team/junit/issues/116) but basically works. if (Boolean.getBoolean("ignore.random.failures")) { RandomlyFails rf = testDescription.getAnnotation(RandomlyFails.class); @@ -458,6 +473,12 @@ public class JenkinsRule implements TestRule, MethodRule, RootAction { // see http://bugs.sun.com/view_bug.do?bug_id=4950148 // TODO use URLClassLoader.close() in Java 7 System.gc(); + + // restore defaultUseCache + if(Functions.isWindows()) { + URLConnection aConnection = new File(".").toURI().toURL().openConnection(); + aConnection.setDefaultUseCaches(origDefaultUseCache); + } } } From 75b9b314ec4a50855580c3b245ef798ecc9d9760 Mon Sep 17 00:00:00 2001 From: Seiji Sogabe Date: Sun, 15 Feb 2015 15:24:15 +0900 Subject: [PATCH 295/701] added nowrap to avoid table layout being broken. --- war/src/main/webapp/css/style.css | 1 + 1 file changed, 1 insertion(+) diff --git a/war/src/main/webapp/css/style.css b/war/src/main/webapp/css/style.css index 0cb0caf1ee..534a2effc1 100644 --- a/war/src/main/webapp/css/style.css +++ b/war/src/main/webapp/css/style.css @@ -597,6 +597,7 @@ table.bigtable.pane > tbody > tr > td:last-child { border: none; background-color: #f0f0f0; padding: 6px 4px; + white-space: nowrap; } .bigtable td { From 7a2dc32cc3b309a4391ada820732a550d9d4badc Mon Sep 17 00:00:00 2001 From: christ66 Date: Sun, 15 Feb 2015 23:29:21 -0800 Subject: [PATCH 296/701] [JENKINS-26391] Prevent lazy loading operation when obtaining label information. --- core/src/main/java/hudson/model/Label.java | 4 +-- test/src/test/java/hudson/model/NodeTest.java | 25 +++++++++++++++++++ 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/hudson/model/Label.java b/core/src/main/java/hudson/model/Label.java index cdfcfb5e86..da779f845e 100644 --- a/core/src/main/java/hudson/model/Label.java +++ b/core/src/main/java/hudson/model/Label.java @@ -374,7 +374,7 @@ public abstract class Label extends Actionable implements Comparable