提交 d7dc26ae 编写于 作者: K Kohsuke Kawaguchi

Merge remote-tracking branch 'origin/master'

......@@ -55,7 +55,18 @@ Upcoming changes</a>
<!-- Record your changes in the trunk here. -->
<div id="trunk" style="display:none"><!--=TRUNK-BEGIN=-->
<ul class=image>
<li class=>
<li class=rfe>
Report an user friendly error page if a deletion of a build fails.
(<a href="https://github.com/jenkinsci/jenkins/pull/827">pull request 827</a>)
<li class=bug>
Maven build failure wasn't describing errors like Maven CLI does.
(<a href="https://issues.jenkins-ci.org/browse/JENKINS-15025">issue 15025</a>)
<li class=bug>
Revisited fix to be compatible for plugins.
(<a href="https://issues.jenkins-ci.org/browse/JENKINS-18119">issue 18119</a>)
<li class=bug>
Ensuring <code>/log/all</code> shows only <code>INFO</code> and above messages, even if custom loggers display <code>FINE</code> or below.
(<a href="https://issues.jenkins-ci.org/browse/JENKINS-18959">issue 18959</a>)
</ul>
</div><!--=TRUNK-END=-->
......
......@@ -1235,8 +1235,11 @@ public final class FilePath implements Serializable {
}
Writer w = new FileWriter(f);
w.write(contents);
w.close();
try {
w.write(contents);
} finally {
w.close();
}
return f.getAbsolutePath();
}
......@@ -2450,4 +2453,16 @@ public final class FilePath implements Serializable {
throw new AssertionError(e);
}
}
/**
* Gets the {@link FilePath} representation of the "~" directory
* (User's home directory in the Unix sense) of the given channel.
*/
public static FilePath getHomeDirectory(VirtualChannel ch) throws InterruptedException, IOException {
return ch.call(new Callable<FilePath,IOException>() {
public FilePath call() throws IOException {
return new FilePath(new File(System.getProperty("user.home")));
}
});
}
}
......@@ -112,9 +112,9 @@ public class Util {
}
/**
* Pattern for capturing variables. Either $xyz or ${xyz}, while ignoring "$$"
* Pattern for capturing variables. Either $xyz, ${xyz} or ${a.b} but not $a.b, while ignoring "$$"
*/
private static final Pattern VARIABLE = Pattern.compile("\\$([A-Za-z0-9_]+|\\{[A-Za-z0-9_]+\\}|\\$)");
private static final Pattern VARIABLE = Pattern.compile("\\$([A-Za-z0-9_]+|\\{[A-Za-z0-9_.]+\\}|\\$)");
/**
* Replaces the occurrence of '$key' by <tt>properties.get('key')</tt>.
......
......@@ -59,6 +59,7 @@ import java.util.Locale;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.security.Security;
import java.util.logging.LogRecord;
/**
* Entry point when Hudson is used as a webapp.
......@@ -66,7 +67,13 @@ import java.security.Security;
* @author Kohsuke Kawaguchi
*/
public final class WebAppMain implements ServletContextListener {
private final RingBufferLogHandler handler = new RingBufferLogHandler();
private final RingBufferLogHandler handler = new RingBufferLogHandler() {
@Override public synchronized void publish(LogRecord record) {
if (record.getLevel().intValue() >= Level.INFO.intValue()) {
super.publish(record);
}
}
};
private static final String APP = "app";
private boolean terminated;
private Thread initThread;
......
......@@ -213,7 +213,7 @@ public class LogRecorder extends AbstractModelObject implements Saveable {
}
public String getSearchUrl() {
return name;
return Util.rawEncode(name);
}
public String getName() {
......
......@@ -116,8 +116,8 @@ public class LogRecorderManager extends AbstractModelObject implements ModelObje
public ContextMenu doChildrenContextMenu(StaplerRequest request, StaplerResponse response) throws Exception {
ContextMenu menu = new ContextMenu();
menu.add("all","All Jenkins Logs");
for (Entry<String, LogRecorder> e : logRecorders.entrySet()) {
menu.add(e.getKey(),e.getKey());
for (LogRecorder lr : logRecorders.values()) {
menu.add(lr.getSearchUrl(), lr.getDisplayName());
}
return menu;
}
......
......@@ -122,6 +122,7 @@ import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import java.util.Map;
......@@ -1646,15 +1647,8 @@ public abstract class AbstractProject<P extends AbstractProject<P,R>,R extends A
protected final synchronized <T extends Describable<T>>
void addToList( T item, List<T> collection ) throws IOException {
for( int i=0; i<collection.size(); i++ ) {
if(collection.get(i).getDescriptor()==item.getDescriptor()) {
// replace
collection.set(i,item);
save();
return;
}
}
// add
//No support to replace item in position, remove then add
removeFromList(item.getDescriptor(), collection);
collection.add(item);
save();
updateTransientActions();
......@@ -1662,10 +1656,12 @@ public abstract class AbstractProject<P extends AbstractProject<P,R>,R extends A
protected final synchronized <T extends Describable<T>>
void removeFromList(Descriptor<T> item, List<T> collection) throws IOException {
for( int i=0; i< collection.size(); i++ ) {
if(collection.get(i).getDescriptor()==item) {
final Iterator<T> iCollection = collection.iterator();
while(iCollection.hasNext()) {
final T next = iCollection.next();
if(next.getDescriptor()==item) {
// found it
collection.remove(i);
iCollection.remove();
save();
updateTransientActions();
return;
......
......@@ -976,6 +976,13 @@ public class Queue extends ResourceController implements Saveable {
if (offer != null && offer.workUnit != null) {
// we are already assigned a project, but now we can't handle it.
offer.workUnit.context.abort(new AbortException());
if(offer.workUnit.context.item!=null && pendings.contains(offer.workUnit.context.item)){
//we are already assigned a project and moved it into pendings, but something wrong had happened before an executor could take it.
pendings.remove(offer.workUnit.context.item);
//return it into queue, it does not have to cause this problem, it can be caused by another item.
buildables.add(offer.workUnit.context.item);
}
}
// since this executor might have been chosen for
......
......@@ -117,6 +117,7 @@ import org.kohsuke.stapler.interceptor.RequirePOST;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.io.StringWriter;
import static java.util.logging.Level.*;
import javax.annotation.CheckForNull;
import javax.annotation.Nonnull;
......@@ -1999,7 +2000,16 @@ public abstract class Run <JobT extends Job<JobT,RunT>,RunT extends Run<JobT,Run
return;
}
delete();
try{
delete();
}
catch(IOException ex){
StringWriter writer = new StringWriter();
ex.printStackTrace(new PrintWriter(writer));
req.setAttribute("stackTraces", writer);
req.getView(this, "delete-retry.jelly").forward(req, rsp);
return;
}
rsp.sendRedirect2(req.getContextPath()+'/' + getParent().getUrl());
}
......
......@@ -118,15 +118,15 @@ public class LogRotator extends BuildDiscarder {
List<? extends Run<?,?>> builds = job.getBuilds();
for (Run r : copy(builds.subList(Math.min(builds.size(), numToKeep), builds.size()))) {
if (r.isKeepLog()) {
LOGGER.log(FINER, "{0} is not GC-ed because it''s marked as a keeper", r);
LOGGER.log(FINER, "{0} is not GC-ed because its marked as a keeper", r);
continue;
}
if (r==lsb) {
LOGGER.log(FINER, "{0} is not GC-ed because it''s the last successful build", r);
LOGGER.log(FINER, "{0} is not GC-ed because its the last successful build", r);
continue;
}
if (r==lstb) {
LOGGER.log(FINER, "{0} is not GC-ed because it''s the last stable build", r);
LOGGER.log(FINER, "{0} is not GC-ed because its the last stable build", r);
continue;
}
LOGGER.log(FINE, "{0} is to be removed", r);
......@@ -139,19 +139,19 @@ public class LogRotator extends BuildDiscarder {
cal.add(Calendar.DAY_OF_YEAR,-daysToKeep);
for( Run r : copy(job.getBuilds()) ) {
if (r.isKeepLog()) {
LOGGER.log(FINER, "{0} is not GC-ed because it''s marked as a keeper", r);
LOGGER.log(FINER, "{0} is not GC-ed because its marked as a keeper", r);
continue;
}
if (r==lsb) {
LOGGER.log(FINER, "{0} is not GC-ed because it''s the last successful build", r);
LOGGER.log(FINER, "{0} is not GC-ed because its the last successful build", r);
continue;
}
if (r==lstb) {
LOGGER.log(FINER, "{0} is not GC-ed because it''s the last stable build", r);
LOGGER.log(FINER, "{0} is not GC-ed because its the last stable build", r);
continue;
}
if (!r.getTimestamp().before(cal)) {
LOGGER.log(FINER, "{0} is not GC-ed because it''s still new", r);
LOGGER.log(FINER, "{0} is not GC-ed because its still new", r);
continue;
}
LOGGER.log(FINE, "{0} is to be removed", r);
......@@ -163,15 +163,15 @@ public class LogRotator extends BuildDiscarder {
List<? extends Run<?,?>> builds = job.getBuilds();
for (Run r : copy(builds.subList(Math.min(builds.size(), artifactNumToKeep), builds.size()))) {
if (r.isKeepLog()) {
LOGGER.log(FINER, "{0} is not purged of artifacts because it''s marked as a keeper", r);
LOGGER.log(FINER, "{0} is not purged of artifacts because its marked as a keeper", r);
continue;
}
if (r==lsb) {
LOGGER.log(FINER, "{0} is not purged of artifacts because it''s the last successful build", r);
LOGGER.log(FINER, "{0} is not purged of artifacts because its the last successful build", r);
continue;
}
if (r==lstb) {
LOGGER.log(FINER, "{0} is not purged of artifacts because it''s the last stable build", r);
LOGGER.log(FINER, "{0} is not purged of artifacts because its the last stable build", r);
continue;
}
LOGGER.log(FINE, "{0} is to be purged of artifacts", r);
......@@ -184,19 +184,19 @@ public class LogRotator extends BuildDiscarder {
cal.add(Calendar.DAY_OF_YEAR,-artifactDaysToKeep);
for( Run r : copy(job.getBuilds())) {
if (r.isKeepLog()) {
LOGGER.log(FINER, "{0} is not purged of artifacts because it''s marked as a keeper", r);
LOGGER.log(FINER, "{0} is not purged of artifacts because its marked as a keeper", r);
continue;
}
if (r==lsb) {
LOGGER.log(FINER, "{0} is not purged of artifacts because it''s the last successful build", r);
LOGGER.log(FINER, "{0} is not purged of artifacts because its the last successful build", r);
continue;
}
if (r==lstb) {
LOGGER.log(FINER, "{0} is not purged of artifacts because it''s the last stable build", r);
LOGGER.log(FINER, "{0} is not purged of artifacts because its the last stable build", r);
continue;
}
if (!r.getTimestamp().before(cal)) {
LOGGER.log(FINER, "{0} is not purged of artifacts because it''s still new", r);
LOGGER.log(FINER, "{0} is not purged of artifacts because its still new", r);
continue;
}
LOGGER.log(FINE, "{0} is to be purged of artifacts", r);
......
......@@ -51,7 +51,7 @@ import static java.util.Collections.singletonList;
*
* @author Kohsuke Kawaguchi
*/
public final class CaseResult extends TestResult implements Comparable<CaseResult> {
public class CaseResult extends TestResult implements Comparable<CaseResult> {
private static final Logger LOGGER = Logger.getLogger(CaseResult.class.getName());
private final float duration;
/**
......@@ -202,7 +202,7 @@ public final class CaseResult extends TestResult implements Comparable<CaseResul
/**
* Used to create a fake failure, when Hudson fails to load data from XML files.
*/
CaseResult(SuiteResult parent, String testName, String errorStackTrace) {
public CaseResult(SuiteResult parent, String testName, String errorStackTrace) {
this.className = parent == null ? "unnamed" : parent.getName();
this.testName = testName;
this.errorStackTrace = errorStackTrace;
......
......@@ -24,6 +24,7 @@
*/
package hudson.util;
import hudson.FilePath;
import hudson.Launcher;
import hudson.Util;
......@@ -371,6 +372,10 @@ public class ArgumentListBuilder implements Serializable, Cloneable {
add(string, true);
}
public ArgumentListBuilder addMasked(Secret s) {
return add(Secret.toString(s),true);
}
/**
* Debug/error message friendly output.
*/
......
......@@ -44,7 +44,7 @@ import org.kohsuke.stapler.bind.JavaScriptMethod;
* (since it may be canceled if the user simply browses to another page while it is running).
* <ol>
* <li>Write a {@code <script>} section defining {@code function display(data)}.
* (Call {@code var t = document.getElementById('someid'); if (t.sortable != null) t.sortable.refresh()} if using a {@code sortable} table.)
* (Call {@code ts_refresh($('someid'))} if using a {@code sortable} table.)
* <li>Use {@code <l:progressiveRendering handler="${it.something()}" callback="display"/>} from your
* Jelly page to display a progress bar and initialize JavaScript infrastructure.
* (The callback attribute can take arbitrary JavaScript expression to be evaluated in the browser
......
......@@ -22,21 +22,21 @@
FilePath.did_not_manage_to_validate_may_be_too_sl=Did not manage to validate {0} (may be too slow)
FilePath.validateAntFileMask.whitespaceSeprator=\
Whitespace can no longer be used as the separator. Please Use '','' as the separator instead.
Whitespace can no longer be used as the separator. Please Use \u2018,\u2019 as the separator instead.
FilePath.validateAntFileMask.doesntMatchAndSuggest=\
''{0}'' doesn''t match anything, but ''{1}'' does. Perhaps that''s what you mean?
FilePath.validateAntFileMask.portionMatchAndSuggest=''{0}'' doesn''t match anything, although ''{1}'' exists
FilePath.validateAntFileMask.portionMatchButPreviousNotMatchAndSuggest=''{0}'' doesn''t match anything: ''{1}'' exists but not ''{2}''
FilePath.validateAntFileMask.doesntMatchAnything=''{0}'' doesn''t match anything
FilePath.validateAntFileMask.doesntMatchAnythingAndSuggest=''{0}'' doesn''t match anything: even ''{1}'' doesn''t exist
\u2018{0}\u2019 doesn\u2019t match anything, but \u2018{1}\u2019 does. Perhaps that\u2019s what you mean?
FilePath.validateAntFileMask.portionMatchAndSuggest=\u2018{0}\u2019 doesn\u2019t match anything, although \u2018{1}\u2019 exists
FilePath.validateAntFileMask.portionMatchButPreviousNotMatchAndSuggest=\u2018{0}\u2019 doesn\u2019t match anything: \u2018{1}\u2019 exists but not \u2018{2}\u2019
FilePath.validateAntFileMask.doesntMatchAnything=\u2018{0}\u2019 doesn\u2019t match anything
FilePath.validateAntFileMask.doesntMatchAnythingAndSuggest=\u2018{0}\u2019 doesn\u2019t match anything: even \u2018{1}\u2019 doesn\u2019t exist
FilePath.validateRelativePath.wildcardNotAllowed=Wildcard is not allowed here
FilePath.validateRelativePath.notFile=''{0}'' is not a file
FilePath.validateRelativePath.notDirectory=''{0}'' is not a directory
FilePath.validateRelativePath.noSuchFile=No such file: ''{0}''
FilePath.validateRelativePath.noSuchDirectory=No such directory: ''{0}''
FilePath.validateRelativePath.notFile=\u2018{0}\u2019 is not a file
FilePath.validateRelativePath.notDirectory=\u2018{0}\u2019 is not a directory
FilePath.validateRelativePath.noSuchFile=No such file: \u2018{0}\u2019
FilePath.validateRelativePath.noSuchDirectory=No such directory: \u2018{0}\u2019
PluginManager.PluginDoesntSupportDynamicLoad.RestartRequired={0} plugin doesn''t support dynamic loading. Jenkins needs to be restarted for the update to take effect
PluginManager.PluginDoesntSupportDynamicLoad.RestartRequired={0} plugin doesn\u2019t support dynamic loading. Jenkins needs to be restarted for the update to take effect
PluginManager.PluginIsAlreadyInstalled.RestartRequired={0} plugin is already installed. Jenkins needs to be restarted for the update to take effect
Util.millisecond={0} ms
Util.second={0} sec
......@@ -50,11 +50,11 @@ Util.year ={0} yr
# another implication of this is that where we use this,
# we often want to add "ago" there
Util.pastTime={0}
FilePath.TildaDoesntWork=''~'' is only supported in a Unix shell and nowhere else.
FilePath.TildaDoesntWork=\u2018~\u2019 is only supported in a Unix shell and nowhere else.
PluginManager.DisplayName=Plugin Manager
PluginManager.PortNotANumber=Port is not a number
PluginManager.PortNotInRange=Port does''t range from {0} to {1}
PluginManager.PortNotInRange=Port doesn\u2019t range from {0} to {1}
PluginManager.UploadPluginsPermission.Description=\
The "upload plugin" permission allows a user to upload arbitrary plugins.
PluginManager.ConfigureUpdateCenterPermission.Description=\
......
InstallPluginCommand.DidYouMean={0} looks like a short plugin name. Did you mean ''{1}''?
InstallPluginCommand.DidYouMean={0} looks like a short plugin name. Did you mean \u2018{1}\u2019?
InstallPluginCommand.InstallingFromUpdateCenter=Installing {0} from update center
InstallPluginCommand.InstallingPluginFromLocalFile=Installing a plugin from local file: {0}
InstallPluginCommand.InstallingPluginFromUrl=Installing a plugin from {0}
......
......@@ -20,11 +20,11 @@
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
WorkspaceSnapshotSCM.NoSuchJob=No such job ''{0}'' exists. Perhaps you meant ''{1}''?
WorkspaceSnapshotSCM.IncorrectJobType={0} isn''t a job that has a workspace.
WorkspaceSnapshotSCM.NoBuild=There''s no qualifying build for the {0} permalink in {1}
WorkspaceSnapshotSCM.NoSuchPermalink=No such permalink ''{0}'' exists for {1}
WorkspaceSnapshotSCM.NoSuchJob=No such job \u2018{0}\u2019 exists. Perhaps you meant \u2018{1}\u2019?
WorkspaceSnapshotSCM.IncorrectJobType={0} isn\u2019t a job that has a workspace.
WorkspaceSnapshotSCM.NoBuild=There\u2019s no qualifying build for the {0} permalink in {1}
WorkspaceSnapshotSCM.NoSuchPermalink=No such permalink \u2018{0}\u2019 exists for {1}
WorkspaceSnapshotSCM.NoWorkspace=\
{0} {1} doesn''t have a workspace snapshot attached,\n\
{0} {1} doesn\u2019t have a workspace snapshot attached,\n\
probably because when the build was done, no other jobs needed its workspace snapshot.\n\
Please run another build in {0} to get the workspace snapshot taken.
......@@ -25,4 +25,4 @@ WindowsInstallerLink.Description=Installs Jenkins as a Windows service to this s
WindowsSlaveInstaller.ConfirmInstallation=This will install a slave agent as a Windows service, so that a Jenkins slave starts automatically when the machine boots.
WindowsSlaveInstaller.DotNetRequired=.NET Framework 2.0 or later is required for this feature
WindowsSlaveInstaller.InstallationSuccessful=Installation was successful. Would you like to start the service now?
WindowsSlaveInstaller.RootFsDoesntExist=Slave root directory ''{0}'' doesn''t exist
\ No newline at end of file
WindowsSlaveInstaller.RootFsDoesntExist=Slave root directory \u2018{0}\u2019 doesn\u2019t exist
\ No newline at end of file
......@@ -57,8 +57,8 @@ THE SOFTWARE.
</tr>
<local:row href="all" name="${%All Jenkins Logs}" />
<j:forEach var="lr" items="${it.logRecorders.values()}">
<local:row name="${lr.name}" href="${lr.name}/">
<a href="${lr.name}/configure">
<local:row name="${lr.name}" href="${lr.searchUrl}/">
<a href="${lr.searchUrl}/configure">
<img src="${imagesURL}/32x32/setting.png" width="32" height="32" alt="[configure]" title="Configure"/>
</a>
</local:row>
......
blurb=Are you sure about deleting the {0} ''{1}''?
\ No newline at end of file
blurb=Are you sure about deleting the {0} \u2018{1}\u2019?
\ No newline at end of file
......@@ -20,7 +20,7 @@
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
explanation.introduction=While subversion allows you to specify the ''--password'' option explicitly in the command line, this is generally not desirable when you are using Jenkins, because:
explanation.introduction=While subversion allows you to specify the \u2018--password\u2019 option explicitly in the command line, this is generally not desirable when you are using Jenkins, because:
reason.1=People can read your password by using <tt>pargs</tt>.
reason.2=Password will be stored in a clear text in Jenkins.
alternative.introduction=A preferable approach is to do the following steps:
......@@ -28,4 +28,4 @@ step.1=Logon to the server that runs Jenkins, by using the same user account Jen
step.2=Manually run <tt>svn co ...</tt>
step.3=Subversion asks you the password interactively. Type in the password.
step.4=Subversion stores it in its authentication cache, and for successive <tt>svn co ...</tt> it will use the password stored in the cache.
final.words=Note that this approach still doesn''t really make your password secure, it just makes it a bit harder to read.
final.words=Note that this approach still doesn\u2019t really make your password secure, it just makes it a bit harder to read.
......@@ -24,4 +24,4 @@ newJob=Please <a href="newJob">create new jobs</a> to get started.
login=<a href="{0}/{1}?from={2}">Log in</a> to create new jobs.
signup=If you don''t already have an account, you can <a href="signup">sign-up</a> now.
signup=If you don\u2019t already have an account, you can <a href="signup">sign-up</a> now.
......@@ -51,7 +51,7 @@ THE SOFTWARE.
<j:set var="spanStyle" value="${it.recurse?'':'display:none'}"/>
</j:if>
<span class="${spanClass}" style="${spanStyle}">
<f:checkbox name="${job.getRelativeNameFromGroup(it.ownerItemGroup)}" checked="${it.jobNamesContains(job)}" title="${h.getRelativeDisplayNameFrom(job,it.ownerItemGroup)}" />
<f:checkbox name="${job.getRelativeNameFromGroup(it.ownerItemGroup)}" checked="${it.jobNamesContains(job)}" title="${h.getRelativeDisplayNameFrom(job,it.ownerItemGroup)}" tooltip="${job.fullName}" />
<br/>
</span>
</j:forEach>
......
......@@ -28,9 +28,9 @@ AbstractBuild_Building=Building
AbstractBuild.BuildingInWorkspace=\ in workspace {0}
AbstractBuild.KeptBecause=This build is kept because of {0}.
AbstractItem.NoSuchJobExists=No such job ''{0}'' exists. Perhaps you meant ''{1}''?
AbstractItem.NoSuchJobExists=No such job \u2018{0}\u2019 exists. Perhaps you meant \u2018{1}\u2019?
AbstractItem.Pronoun=Job
AbstractProject.AssignedLabelString_NoMatch_DidYouMean=There''s no slave/cloud that matches this assignment. Did you mean ''{1}'' instead of ''{0}''?
AbstractProject.AssignedLabelString_NoMatch_DidYouMean=There\u2019s no slave/cloud that matches this assignment. Did you mean \u2018{1}\u2019 instead of \u2018{0}\u2019?
AbstractProject.NewBuildForWorkspace=Scheduling a new build to get a workspace.
AbstractProject.AwaitingBuildForWorkspace=Awaiting build to get a workspace.
AbstractProject.Pronoun=Project
......@@ -44,7 +44,7 @@ AbstractProject.Disabled=Build disabled
AbstractProject.ETA=\ (ETA:{0})
AbstractProject.NoBuilds=No existing build. Scheduling a new one.
AbstractProject.NoSCM=No SCM
AbstractProject.NoWorkspace=No workspace is available, so can''t check for updates.
AbstractProject.NoWorkspace=No workspace is available, so can\u2019t check for updates.
AbstractProject.PollingABorted=SCM polling aborted
AbstractProject.ScmAborted=SCM check out aborted
AbstractProject.WorkspaceOffline=Workspace is offline.
......@@ -52,7 +52,7 @@ 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''t want an user to access \
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.
AbstractProject.ExtendedReadPermission.Description=\
This permission grants read-only access to project configurations. Please be \
......@@ -76,7 +76,7 @@ AbstractProject.CustomWorkspaceEmpty=Custom workspace is empty.
Api.MultipleMatch=XPath "{0}" matched {1} nodes. \
Create XPath that only matches one, or use the "wrapper" query parameter to wrap them all under a root element.
Api.NoXPathMatch=XPath {0} didn''t match
Api.NoXPathMatch=XPath {0} didn\u2019t match
BallColor.Aborted=Aborted
BallColor.Disabled=Disabled
......@@ -111,7 +111,7 @@ Computer.BuildPermission.Description=This permission allows users to run jobs as
Computer.BadChannel=Slave node offline or not a remote channel (such as master node).
ComputerSet.NoSuchSlave=No such slave: {0}
ComputerSet.SlaveAlreadyExists=Slave called ''{0}'' already exists
ComputerSet.SlaveAlreadyExists=Slave called \u2018{0}\u2019 already exists
ComputerSet.SpecifySlaveToCopy=Specify which slave to copy
ComputerSet.DisplayName=nodes
......@@ -131,17 +131,17 @@ Hudson.Computer.Caption=Master
Hudson.Computer.DisplayName=master
Hudson.ControlCodeNotAllowed=No control code is allowed: {0}
Hudson.DisplayName=Jenkins
Hudson.JobAlreadyExists=A job already exists with the name ''{0}''
Hudson.NoJavaInPath=java is not in your PATH. Maybe you need to <a href=''{0}/configure''>configure JDKs</a>?
Hudson.JobAlreadyExists=A job already exists with the name \u2018{0}\u2019
Hudson.NoJavaInPath=java is not in your PATH. Maybe you need to <a href="{0}/configure">configure JDKs</a>?
Hudson.NoName=No name is specified
Hudson.NoSuchDirectory=No such directory: {0}
Hudson.NodeBeingRemoved=Node is being removed
Hudson.NotADirectory={0} is not a directory
Hudson.NotAPlugin={0} is not a Jenkins plugin
Hudson.NotJDKDir={0} doesn''t look like a JDK directory
Hudson.NotJDKDir={0} doesn\u2019t look like a JDK directory
Hudson.Permissions.Title=Overall
Hudson.USER_CONTENT_README=Files in this directory will be served under your http://server/jenkins/userContent/
Hudson.UnsafeChar=''{0}'' is an unsafe character
Hudson.UnsafeChar=\u2018{0}\u2019 is an unsafe character
Hudson.ViewAlreadyExists=A view already exists with the name "{0}"
Hudson.ViewName=All
Hudson.NotANumber=Not a number
......@@ -149,17 +149,17 @@ Hudson.NotAPositiveNumber=Not a positive number
Hudson.NotANonNegativeNumber=Number may not be negative
Hudson.NotANegativeNumber=Not a negative number
Hudson.NotUsesUTF8ToDecodeURL=\
Your container doesn''t use UTF-8 to decode URLs. If you use non-ASCII characters as a job name etc, \
Your container doesn\u2019t use UTF-8 to decode URLs. If you use non-ASCII characters as a job name etc, \
this will cause problems. \
See <a href=''http://wiki.jenkins-ci.org/display/JENKINS/Containers''>Containers</a> and \
<a href=''http://wiki.jenkins-ci.org/display/JENKINS/Tomcat#Tomcat-i18n''>Tomcat i18n</a> for more details.
See <a href="http://wiki.jenkins-ci.org/display/JENKINS/Containers">Containers</a> and \
<a href="http://wiki.jenkins-ci.org/display/JENKINS/Tomcat#Tomcat-i18n">Tomcat i18n</a> for more details.
Hudson.AdministerPermission.Description=\
This permission grants the ability to make system-wide configuration changes, \
as well as perform highly sensitive operations that amounts to full local system access \
(within the scope granted by the underlying OS.)
Hudson.ReadPermission.Description=\
The read permission is necessary for viewing almost all pages of Jenkins. \
This permission is useful when you don''t want unauthenticated users to see \
This permission is useful when you don\u2019t want unauthenticated users to see \
Jenkins pages &mdash; revoke this permission from the anonymous user, then \
add "authenticated" pseudo-user and grant the read access.
Hudson.RunScriptsPermission.Description=\
......@@ -185,7 +185,7 @@ Label.InvalidLabel=invalid label
Label.ProvisionedFrom=Provisioned from {0}
ManageJenkinsAction.DisplayName=Manage Jenkins
MultiStageTimeSeries.EMPTY_STRING=
Queue.AllNodesOffline=All nodes of label ''{0}'' are offline
Queue.AllNodesOffline=All nodes of label \u2018{0}\u2019 are offline
Queue.BlockedBy=Blocked by {0}
Queue.HudsonIsAboutToShutDown=Jenkins is about to shut down
Queue.InProgress=A build is already in progress
......@@ -216,7 +216,7 @@ Run.UpdatePermission.Description=\
for example to leave notes about the cause of a build failure.
Run.ArtifactsPermission.Description=\
This permission grants the ability to retrieve the artifacts produced by \
builds. If you don''t want an user to access the artifacts, you can do so by \
builds. If you don\u2019t want an user to access the artifacts, you can do so by \
revoking this permission.
Run.InProgressDuration={0} and counting
......@@ -310,8 +310,8 @@ RunParameterDefinition.DisplayName=Run Parameter
PasswordParameterDefinition.DisplayName=Password Parameter
Node.BecauseNodeIsReserved={0} is reserved for jobs tied to it
Node.LabelMissing={0} doesn''t have label {1}
Node.LackingBuildPermission={0} doesn''t have a permission to run on {1}
Node.LabelMissing={0} doesn\u2019t have label {1}
Node.LackingBuildPermission={0} doesn\u2019t have a permission to run on {1}
Node.Mode.NORMAL=Utilize this slave as much as possible
Node.Mode.EXCLUSIVE=Leave this machine for tied jobs only
......@@ -342,7 +342,7 @@ MyViewsProperty.ViewExistsCheck.AlreadyExists=A view with name {0} already exist
CLI.restart.shortDescription=Restart Jenkins
CLI.safe-restart.shortDescription=Safely restart Jenkins
CLI.keep-build.shortDescription=Mark the build to keep the build forever.
CLI.quiet-down.shortDescription=Quiet down Jenkins, in preparation for a restart. Don''t start any builds.
CLI.quiet-down.shortDescription=Quiet down Jenkins, in preparation for a restart. Don\u2019t start any builds.
CLI.cancel-quiet-down.shortDescription=Cancel the effect of the "quiet-down" command.
CLI.reload-configuration.shortDescription=Discard all the loaded data in memory and reload everything from file system. Useful when you modified config files directly on disk.
......
......@@ -23,7 +23,7 @@
description=The fingerprint {0} did not match any of the recorded data.
cause.1=\
Perhaps the file was not created under Jenkins. \
Maybe it''s a version that someone built locally on his/her own machine.
Maybe it\u2019s a version that someone built locally on his/her own machine.
cause.2=\
Perhaps the projects are not set up correctly and not recording \
fingerprints. Check the project setting.
<?jelly escape-by-default='true'?>
<j:jelly xmlns:j="jelly:core" xmlns:st="jelly:stapler" xmlns:d="jelly:define" xmlns:l="/lib/layout" xmlns:t="/lib/hudson" xmlns:f="/lib/form" xmlns:i="jelly:fmt">
<l:layout title="${it.fullDisplayName}" norefresh="true">
<st:include page="sidepanel.jelly" />
<l:main-panel>
<table>
<tr><td>
<form method="post" action="doDelete">
<div class="error">
${%Not successful}
</div>
<f:submit name="now" value="${%Retry delete}" />
</form>
</td></tr>
<tr><td>
<a onclick="document.getElementById('delete-error').style.display='block';return false" href="">${%Show reason}</a>
</td></tr>
<tr><td>
<div id="delete-error" style="display: none">
<pre>
${request.getAttribute('stackTraces')}
</pre>
</div>
</td></tr>
</table>
</l:main-panel>
</l:layout>
</j:jelly>
\ No newline at end of file
# The MIT License
#
# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, 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.
Not\ successful = Deletion of the build failed
Retry\ delete = Retry delete
Show\ reason = Show reason
\ No newline at end of file
......@@ -20,4 +20,4 @@
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
title=User ''{0}'' Configuration
\ No newline at end of file
title=User \u2018{0}\u2019 Configuration
\ No newline at end of file
......@@ -93,9 +93,7 @@ THE SOFTWARE.
}
r.appendChild(d);
if (p.sortable != null) {
p.sortable.refresh();
}
ts_refresh(p);
}
}
</script>
......
......@@ -20,4 +20,4 @@
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
description=All nodes of label ''{0}'' are offline
\ No newline at end of file
description=All nodes of label \u2018{0}\u2019 are offline
\ No newline at end of file
......@@ -26,7 +26,7 @@ DiskSpaceMonitor.MarkedOffline=Making {0} offline temporarily due to the lack of
DiskSpaceMonitor.MarkedOnline=Putting {0} back online as there is enough disk space again
DiskSpaceMonitor.DisplayName=Free Disk Space
ResponseTimeMonitor.DisplayName=Response Time
ResponseTimeMonitor.MarkedOffline=Making {0} offline because it''s not responding
ResponseTimeMonitor.MarkedOffline=Making {0} offline because it\u2019s not responding
ResponseTimeMonitor.TimeOut=Time out for last {0} try
SwapSpaceMonitor.DisplayName=Free Swap Space
TemporarySpaceMonitor.DisplayName=Free Temp Space
......
blurb=Jenkins took some slaves offline because <a href="{0}/computer/">their key health metrics</a> went below a threshold. \
If you don''t want Jenkins to do this, \
If you don\u2019t want Jenkins to do this, \
<a href="{0}/computer/configure">change the setting</a>.
......@@ -27,7 +27,7 @@ GlobalMatrixAuthorizationStrategy.DisplayName=Matrix-based security
HudsonPrivateSecurityRealm.WouldYouLikeToSignUp=This {0} {1} is new to Jenkins. Would you like to sign up?
LegacyAuthorizationStrategy.DisplayName=Legacy mode
HudsonPrivateSecurityRealm.DisplayName=Jenkins''s own user database
HudsonPrivateSecurityRealm.DisplayName=Jenkins\u2019s own user database
HudsonPrivateSecurityRealm.Details.DisplayName=Password
HudsonPrivateSecurityRealm.Details.PasswordError=\
The confirmed password is not the same as the one entered. \
......@@ -62,9 +62,9 @@ PAMSecurityRealm.DisplayName=Unix user/group database
PAMSecurityRealm.ReadPermission=Jenkins needs to be able to read /etc/shadow
PAMSecurityRealm.BelongToGroup={0} needs to belong to group {1} to read /etc/shadow
PAMSecurityRealm.RunAsUserOrBelongToGroupAndChmod=\
Either Jenkins needs to run as {0} or {1} needs to belong to group {2} and ''chmod g+r /etc/shadow'' needs to be done to enable Jenkins to read /etc/shadow
Either Jenkins needs to run as {0} or {1} needs to belong to group {2} and \u2018chmod g+r /etc/shadow\u2019 needs to be done to enable Jenkins to read /etc/shadow
PAMSecurityRealm.Success=Success
PAMSecurityRealm.User=User ''{0}''
PAMSecurityRealm.User=User \u2018{0}\u2019
PAMSecurityRealm.CurrentUser=Current User
PAMSecurityRealm.Uid=uid: {0}
......
......@@ -21,7 +21,7 @@
# THE SOFTWARE.
detail=\
Adds a plain, dumb slave to Jenkins. This is called "dumb" because Jenkins doesn''t provide \
Adds a plain, dumb slave to Jenkins. This is called "dumb" because Jenkins doesn\u2019t provide \
higher level of integration with these slaves, such as dynamic provisioning. \
Select this type if no other slave types apply &mdash; for example such as when you are adding \
a physical computer, virtual machines managed outside Jenkins, etc.
......@@ -40,4 +40,4 @@ SlaveComputer.DisconnectedBy=Disconnected by {0}{1}
NodeDescripter.CheckName.Mandatory=Name is mandatory
ComputerLauncher.NoJavaFound=Java version {0} was found but 1.5 or later is needed.
ComputerLauncher.JavaVersionResult={0} -version returned {1}.
ComputerLauncher.UknownJavaVersion=Couldn''t figure out the Java version of {0}
ComputerLauncher.UknownJavaVersion=Couldn\u2019t figure out the Java version of {0}
......@@ -20,6 +20,6 @@
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
description=Can use wildcards like ''module/dist/**/*.zip''. \
description=Can use wildcards like \u2018module/dist/**/*.zip\u2019. \
See the <a href="{0}">@includes of Ant fileset</a> for the exact format. \
The base directory is <a href="ws/">the workspace</a>.
......@@ -25,7 +25,7 @@ Ant.ExecFailed=command execution failed.
Ant.ExecutableNotFound=Cannot find executable from the chosen Ant installation "{0}"
Ant.GlobalConfigNeeded= Maybe you need to configure where your Ant installations are?
Ant.NotADirectory={0} is not a directory
Ant.NotAntDirectory={0} doesn''t look like an Ant directory
Ant.NotAntDirectory={0} doesn\u2019t look like an Ant directory
Ant.ProjectConfigNeeded= Maybe you need to configure the job to choose one of your Ant installations?
ArtifactArchiver.ARCHIVING_ARTIFACTS=Archiving artifacts
......@@ -43,7 +43,7 @@ BatchFile.DisplayName=Execute Windows batch command
BuildTrigger.Disabled={0} is disabled. Triggering skipped
BuildTrigger.DisplayName=Build other projects
BuildTrigger.InQueue={0} is already in the queue
BuildTrigger.NoSuchProject=No such project ''{0}''. Did you mean ''{1}''?
BuildTrigger.NoSuchProject=No such project \u2018{0}\u2019. Did you mean \u2018{1}\u2019?
BuildTrigger.NoProjectSpecified=No project specified
BuildTrigger.NotBuildable={0} is not buildable
BuildTrigger.Triggering=Triggering a new build of {0}
......@@ -60,7 +60,7 @@ Fingerprinter.DisplayName=Record fingerprints of files to track usage
Fingerprinter.Failed=Failed to record fingerprints
Fingerprinter.FailedFor=failed to record fingerprint for {0}
Fingerprinter.NoArchiving=Build artifacts are supposed to be fingerprinted, but build artifact archiving is not configured
Fingerprinter.NoWorkspace=Unable to record fingerprints because there''s no workspace
Fingerprinter.NoWorkspace=Unable to record fingerprints because there\u2019s no workspace
Fingerprinter.Recording=Recording fingerprints
InstallFromApache=Install from Apache
......@@ -75,8 +75,8 @@ JavadocArchiver.UnableToCopy=Unable to copy Javadoc from {0} to {1}
Maven.DisplayName=Invoke top-level Maven targets
Maven.ExecFailed=command execution failed
Maven.NotMavenDirectory={0} doesn''t look like a Maven directory
Maven.NoExecutable=Couldn''t find any executable in {0}
Maven.NotMavenDirectory={0} doesn\u2019t look like a Maven directory
Maven.NoExecutable=Couldn\u2019t find any executable in {0}
Maven.NotADirectory={0} is not a directory
Shell.DisplayName=Execute shell
......@@ -21,7 +21,7 @@
# THE SOFTWARE.
description=\
<a href="{0}">Fileset ''includes''</a> \
<a href="{0}">Fileset \u2018includes\u2019</a> \
setting that specifies the generated raw XML report files, \
such as ''myproject/target/test-reports/*.xml''. \
such as \u2018myproject/target/test-reports/*.xml\u2019. \
Basedir of the fileset is <a href="ws/">the workspace root</a>.
......@@ -22,7 +22,7 @@
message=\
Jenkins detected that you appear to be running more than one \
instance of Jenkins that share the same home directory ''{0}''. \
instance of Jenkins that share the same home directory ''{0}\u2019. \
This greatly confuses Jenkins and you will likely experience \
strange behaviors, so please correct the situation.
label=Ignore this problem and keep using Jenkins anyway
......@@ -24,5 +24,5 @@ errorMessage=\
We detected that your servlet container is loading an older version of Ant by itself, \
thereby preventing Jenkins from loading its own newer copy. \
(Ant classes are loaded from {0}) <br> \
Perhaps can you override Ant in your container by copying one from Jenkins''s <tt>WEB-INF/lib</tt>, \
Perhaps can you override Ant in your container by copying one from Jenkins\u2019s <tt>WEB-INF/lib</tt>, \
or can you set up the classloader delegation to child-first so that Jenkins sees its own copy first?
......@@ -21,7 +21,7 @@
# THE SOFTWARE.
errorMessage.1=\
Unable to create the home directory ''{0}''. This is most likely a permission problem.
Unable to create the home directory \u2018{0}\u2019. This is most likely a permission problem.
errorMessage.2=\
To change the home directory, use <tt>JENKINS_HOME</tt> environment variable or set the \
<tt>JENKINS_HOME</tt> system property. \
......
......@@ -2055,9 +2055,9 @@ The configuration registry key could not be written
error1014= \
One of the files in the registry database had to be recovered by use of a log or alternate copy. The recovery was successful
error1015= \
The registry is corrupted. The structure of one of the files containing registry data is corrupted, or the system''s memory image of the file is corrupted, or the file could not be recovered because the alternate copy or log was absent or corrupted
The registry is corrupted. The structure of one of the files containing registry data is corrupted, or the system\u2019s memory image of the file is corrupted, or the file could not be recovered because the alternate copy or log was absent or corrupted
error1016= \
An I/O operation initiated by the registry failed unrecoverably. The registry could not read in, or write out, or flush, one of the files that contain the system''s image of the registry
An I/O operation initiated by the registry failed unrecoverably. The registry could not read in, or write out, or flush, one of the files that contain the system\u2019s image of the registry
error1017= \
The system has attempted to load or restore a file into the registry, but the specified file is not in a registry file format
error1018= \
......@@ -2069,6 +2069,6 @@ Cannot create a symbolic link in a registry key that already has subkeys or valu
error1021= \
Cannot create a stable subkey under a volatile parent key
error1022= \
A notify change request is being completed and the information is not being returned in the caller''s buffer. The caller now needs to enumerate the files to find the changes
A notify change request is being completed and the information is not being returned in the caller\u2019s buffer. The caller now needs to enumerate the files to find the changes
error1023= \
Unknown error (0x3ff)
......@@ -5,7 +5,7 @@ JOB_NAME.blurb=Name of the project of this build, such as "foo" or "foo/bar"
BUILD_TAG.blurb=String of "jenkins-<i>$'{'JOB_NAME}</i>-<i>$'{'BUILD_NUMBER}</i>". Convenient to put into a resource file, a jar file, etc for easier identification.
EXECUTOR_NUMBER.blurb=\
The unique number that identifies the current executor \
(among executors of the same machine) that''s \
(among executors of the same machine) that\u2019s \
carrying out this build. This is the number you see in \
the "build executor status", except that the number starts from 0, not 1.
NODE_NAME.blurb=Name of the slave if the build is on a slave, or "master" if run on master
......
......@@ -21,7 +21,7 @@
# THE SOFTWARE.
description=\
Got a jar file but don''t know which version it is? <br /> \
Got a jar file but don\u2019t know which version it is? <br /> \
Find that out by checking the fingerprint against \
the database in Jenkins
fingerprint.link=https://wiki.jenkins-ci.org/display/JENKINS/Fingerprint
......@@ -29,9 +29,9 @@ yellow=The last build was successful but unstable.\
yellow_anime=The last build was successful but unstable. A new build is in progress.
red=The last build fatally failed.
red_anime=The last build fatally failed. A new build is in progress.
health-81plus=Project health is over 80%. You can hover the mouse over the project''s icon for a more detailed explanation.
health-61to80=Project health is over 60% and up to 80%. You can hover the mouse over the project''s icon for a more detailed explanation.
health-41to60=Project health is over 40% and up to 60%. You can hover the mouse over the project''s icon for a more detailed explanation.
health-21to40=Project health is over 20% and up to 40%. You can hover the mouse over the project''s icon for a more detailed explanation.
health-00to20=Project health is 20% or less. You can hover the mouse over the project''s icon for a more detailed explanation.
health-81plus=Project health is over 80%. You can hover the mouse over the project\u2019s icon for a more detailed explanation.
health-61to80=Project health is over 60% and up to 80%. You can hover the mouse over the project\u2019s icon for a more detailed explanation.
health-41to60=Project health is over 40% and up to 60%. You can hover the mouse over the project\u2019s icon for a more detailed explanation.
health-21to40=Project health is over 20% and up to 40%. You can hover the mouse over the project\u2019s icon for a more detailed explanation.
health-00to20=Project health is 20% or less. You can hover the mouse over the project\u2019s icon for a more detailed explanation.
......@@ -20,7 +20,7 @@
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
Title=What''s "project relationship"?
Title=What\u2019s "project relationship"?
body=\
When you have projects that depend on each other, Jenkins can track which build of \
the upstream project is used by which build of the downstream project, by using \
......
......@@ -28,22 +28,22 @@ Hudson.Computer.Caption=Master
Hudson.Computer.DisplayName=master
Hudson.ControlCodeNotAllowed=No control code is allowed: {0}
Hudson.DisplayName=Jenkins
Hudson.JobAlreadyExists=A job already exists with the name ''{0}''
Hudson.NoJavaInPath=java is not in your PATH. Maybe you need to <a href=''{0}/configure''>configure JDKs</a>?
Hudson.JobAlreadyExists=A job already exists with the name \u2018{0}\u2019
Hudson.NoJavaInPath=java is not in your PATH. Maybe you need to <a href="{0}/configure">configure JDKs</a>?
Hudson.NoName=No name is specified
Hudson.NodeBeingRemoved=Node is being removed
Hudson.UnsafeChar=''{0}'' is an unsafe character
Hudson.JobNameConventionNotApplyed=''{0}'' does not match the job name convention pattern {1}
Hudson.UnsafeChar=\u2018{0}\u2019 is an unsafe character
Hudson.JobNameConventionNotApplyed=\u2018{0}\u2019 does not match the job name convention pattern {1}
Hudson.ViewAlreadyExists=A view already exists with the name "{0}"
Hudson.ViewName=All
Hudson.NotUsesUTF8ToDecodeURL=\
Your container doesn''t use UTF-8 to decode URLs. If you use non-ASCII characters as a job name etc, \
Your container doesn\u2019t use UTF-8 to decode URLs. If you use non-ASCII characters as a job name etc, \
this will cause problems. \
See <a href=''http://wiki.jenkins-ci.org/display/JENKINS/Containers''>Containers</a> and \
<a href=''http://wiki.jenkins-ci.org/display/JENKINS/Tomcat#Tomcat-i18n''>Tomcat i18n</a> for more details.
See <a href="http://wiki.jenkins-ci.org/display/JENKINS/Containers">Containers</a> and \
<a href="http://wiki.jenkins-ci.org/display/JENKINS/Tomcat#Tomcat-i18n">Tomcat i18n</a> for more details.
Hudson.ReadPermission.Description=\
The read permission is necessary for viewing almost all pages of Jenkins. \
This permission is useful when you don''t want unauthenticated users to see \
This permission is useful when you don\u2019t want unauthenticated users to see \
Jenkins pages &mdash; revoke this permission from the anonymous user, then \
add "authenticated" pseudo-user and grant the read access.
Hudson.NodeDescription=the master Jenkins node
......@@ -52,7 +52,7 @@ Hudson.NodeDescription=the master Jenkins node
CLI.restart.shortDescription=Restart Jenkins
CLI.safe-restart.shortDescription=Safely restart Jenkins
CLI.keep-build.shortDescription=Mark the build to keep the build forever.
CLI.quiet-down.shortDescription=Quiet down Jenkins, in preparation for a restart. Don''t start any builds.
CLI.quiet-down.shortDescription=Quiet down Jenkins, in preparation for a restart. Don\u2019t start any builds.
CLI.cancel-quiet-down.shortDescription=Cancel the effect of the "quiet-down" command.
CLI.reload-configuration.shortDescription=Discard all the loaded data in memory and reload everything from file system. Useful when you modified config files directly on disk.
CauseOfInterruption.ShortDescription=Aborted by {0}
......
......@@ -51,15 +51,20 @@ THE SOFTWARE.
If specified, this human readable text will follow the checkbox, and clicking this text also
toggles the checkbox.
</st:attribute>
<st:attribute name="tooltip">
Used as tooltip of the checkbox, and, if a title is specified, of the title
</st:attribute>
</st:documentation>
<f:prepareDatabinding />
<input type="checkbox"
name="${attrs.name?:'_.'+attrs.field}"
value="${attrs.value}"
title="${attrs.tooltip}"
onclick="${attrs.onclick}" id="${attrs.id}" class="${attrs.negative!=null ? 'negative' : null} ${attrs.checkUrl!=null?'validated':''}"
checkUrl="${attrs.checkUrl}" json="${attrs.json}"
checked="${(attrs.checked ?: instance[attrs.field] ?: attrs.default) ? 'true' : null}"/>
<j:if test="${attrs.title!=null}">
<label class="attach-previous">${attrs.title}</label>
<label class="attach-previous"
title="${attrs.tooltip}">${attrs.title}</label>
</j:if>
</j:jelly>
\ No newline at end of file
</j:jelly>
......@@ -23,8 +23,8 @@
description=\
Type in an arbitrary <a href="http://groovy.codehaus.org/Home">Groovy script</a> and \
execute it on the server. Useful for trouble-shooting and diagnostics. \
Use the ''println'' command to see the output (if you use <tt>System.out</tt>, \
it will go to the server''s stdout, which is harder to see.) Example:
Use the \u2018println\u2019 command to see the output (if you use <tt>System.out</tt>, \
it will go to the server\u2019s stdout, which is harder to see.) Example:
description2=\
All the classes from all the plugins are visible. <tt>jenkins.*</tt>, <tt>jenkins.model.*</tt>, <tt>hudson.*</tt>, and <tt>hudson.model.*</tt> are pre-imported.
\ No newline at end of file
......@@ -50,6 +50,7 @@ public class UtilTest {
public void testReplaceMacro() {
Map<String,String> m = new HashMap<String,String>();
m.put("A","a");
m.put("A.B","a-b");
m.put("AA","aa");
m.put("B","B");
m.put("DOLLAR", "$");
......@@ -68,6 +69,10 @@ public class UtilTest {
assertEquals("asd$${AA}dd", Util.replaceMacro("asd$$$${AA}dd",m));
assertEquals("$", Util.replaceMacro("$$",m));
assertEquals("$$", Util.replaceMacro("$$$$",m));
// dots
assertEquals("a.B", Util.replaceMacro("$A.B", m));
assertEquals("a-b", Util.replaceMacro("${A.B}", m));
// test that more complex scenarios work
assertEquals("/a/B/aa", Util.replaceMacro("/$A/$B/$AA",m));
......
......@@ -45,7 +45,7 @@ THE SOFTWARE.
<mavenVersion>3.1.0</mavenVersion>
<maven.version>${mavenVersion}</maven.version>
<aetherVersion>0.9.0.M2</aetherVersion>
<sisuInjectVersion>0.0.0.M4</sisuInjectVersion>
<sisuInjectVersion>0.0.0.M5</sisuInjectVersion>
<wagonVersion>2.4</wagonVersion>
</properties>
......
......@@ -122,7 +122,8 @@ public class Maven3Builder extends AbstractMavenBuilder implements DelegatingCal
registerSystemProperties();
listener.getLogger().println(formatArgs(goals));
PrintStream logger = listener.getLogger();
logger.println(formatArgs(goals));
Method launchMethod = maven3MainClass.getMethod( "launch", String[].class );
......@@ -144,7 +145,6 @@ public class Maven3Builder extends AbstractMavenBuilder implements DelegatingCal
if(profile) {
NumberFormat n = NumberFormat.getInstance();
PrintStream logger = listener.getLogger();
logger.println("Total overhead was "+format(n,mavenExecutionListener.overheadTime)+"ms");
Channel ch = Channel.current();
logger.println("Class loading " +format(n,ch.classLoadingTime.get()) +"ms, "+ch.classLoadingCount+" classes");
......@@ -157,30 +157,18 @@ public class Maven3Builder extends AbstractMavenBuilder implements DelegatingCal
//mavenExecutionResult = Maven3Launcher.getMavenExecutionResult();
PrintStream logger = listener.getLogger();
if(r==0 && mavenExecutionResult.getThrowables().isEmpty()) {
if(mavenExecutionListener.hasTestFailures()){
return Result.UNSTABLE;
}
return Result.SUCCESS;
}
if (!mavenExecutionResult.getThrowables().isEmpty()) {
logger.println( "mavenExecutionResult exceptions not empty");
for(Throwable throwable : mavenExecutionResult.getThrowables()) {
logger.println("message : " + throwable.getMessage());
if (throwable.getCause()!=null) {
logger.println("cause : " + throwable.getCause().getMessage());
}
logger.println("Stack trace : ");
throwable.printStackTrace( logger );
}
}
// manage of Maven error are moved to ExecutionEventLogger, they are
// threaded as in MavenCli
if(markAsSuccess) {
listener.getLogger().println(Messages.MavenBuilder_Failed());
logger.println(Messages.MavenBuilder_Failed());
if(mavenExecutionListener.hasTestFailures()){
return Result.UNSTABLE;
}
......@@ -328,7 +316,6 @@ public class Maven3Builder extends AbstractMavenBuilder implements DelegatingCal
// E.g. there's also the option to redirect logging to a file which is handled there, but not here.
this.eventLogger = new ExecutionEventLogger( logger );
}
......
......@@ -23,7 +23,13 @@ import hudson.tasks._maven.Maven3MojoNote;
import java.io.IOException;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.Map;
import org.apache.maven.InternalErrorException;
import org.apache.maven.exception.DefaultExceptionHandler;
import org.apache.maven.exception.ExceptionHandler;
import org.apache.maven.exception.ExceptionSummary;
import org.apache.maven.execution.AbstractExecutionListener;
import org.apache.maven.execution.BuildFailure;
import org.apache.maven.execution.BuildSuccess;
......@@ -34,6 +40,7 @@ import org.apache.maven.execution.MavenSession;
import org.apache.maven.plugin.MojoExecution;
import org.apache.maven.project.MavenProject;
import org.codehaus.plexus.logging.Logger;
import org.codehaus.plexus.util.StringUtils;
/**
* Logs execution events to a user-supplied logger.
......@@ -139,6 +146,8 @@ public class ExecutionEventLogger
logger.info( chars( '-', LINE_LENGTH ) );
}
logErrors( event.getSession() );
}
private void logReactorSummary( MavenSession session )
......@@ -187,6 +196,83 @@ public class ExecutionEventLogger
}
}
private void logErrors( MavenSession session )
{
MavenExecutionResult result = session.getResult();
// show all errors and them references as in MavenCli
if ( !result.getExceptions().isEmpty() )
{
ExceptionHandler handler = new DefaultExceptionHandler();
Map<String, String> references = new LinkedHashMap<String, String>();
for ( Throwable exception : result.getExceptions() )
{
ExceptionSummary summary = handler.handleException( exception );
logErrorSummary( summary, references, "", logger.isDebugEnabled() );
}
if ( !references.isEmpty() )
{
logger.error( "For more information about the errors and possible solutions"
+ ", please read the following articles:");
for ( Map.Entry<String, String> entry : references.entrySet() ) {
logger.error( entry.getValue() + " " + entry.getKey() );
}
}
}
}
private void logErrorSummary(ExceptionSummary summary, Map<String, String> references, String indent, boolean showErrors)
{
String referenceKey = "";
if ( StringUtils.isNotEmpty( summary.getReference() ) )
{
referenceKey = references.get( summary.getReference() );
if (referenceKey == null) {
referenceKey = "[Help " + ( references.size() + 1 ) + "]";
references.put( summary.getReference(), referenceKey );
}
}
String msg = summary.getMessage();
if (StringUtils.isNotEmpty( referenceKey ))
{
if (msg.indexOf('\n') < 0)
{
msg += " -> " + referenceKey;
}
else
{
msg += "\n-> " + referenceKey;
}
}
String[] lines = msg.split("(\r\n)|(\r)|(\n)");
for ( int i = 0; i < lines.length; i++ )
{
String line = indent + lines[i].trim();
if ( i == lines.length - 1 && ( showErrors || ( summary.getException() instanceof InternalErrorException ) ) ) {
logger.error( line, summary.getException() );
} else {
logger.error(line);
}
}
indent += " ";
for ( ExceptionSummary child : summary.getChildren() ) {
logErrorSummary( child, references, indent, showErrors );
}
}
private void logResult( MavenSession session )
{
logger.info( chars( '-', LINE_LENGTH ) );
......
......@@ -23,4 +23,4 @@
title=Project {0}
description=\
These modules are no longer a part of the project, but left for archival purpose.\
If you''d like to delete them permanently, choose "delete all disabled modules" from left.
\ No newline at end of file
If you\u2019d like to delete them permanently, choose "delete all disabled modules" from left.
\ No newline at end of file
......@@ -20,4 +20,4 @@
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
noRun=didn''t run
noRun=didn\u2019t run
......@@ -57,7 +57,7 @@ MavenProbeAction.DisplayName=Monitor Maven Process
MavenProcessFactory.ClassWorldsNotFound=No classworlds*.jar found in {0} -- Is this a valid maven2/3 directory?
MavenRedeployer.DisplayName=Deploy to Maven repository
MavenVersionCallable.MavenHomeDoesntExist=Maven Home {0} doesn''t exist
MavenVersionCallable.MavenHomeDoesntExist=Maven Home {0} doesn\u2019t exist
MavenVersionCallable.MavenHomeIsNotDirectory=Maven Home {0} is not a directory
ProcessCache.Reusing=Reusing existing maven process
......
......@@ -99,7 +99,7 @@ THE SOFTWARE.
<netbeans.compile.on.save>none</netbeans.compile.on.save> <!-- we rely on Maven source generation -->
<animal.sniffer.skip>${skipTests}</animal.sniffer.skip>
<java.level>1.6</java.level>
<java.level>6</java.level>
</properties>
<repositories>
......@@ -592,7 +592,7 @@ THE SOFTWARE.
<configuration>
<signature>
<groupId>org.codehaus.mojo.signature</groupId>
<!-- Currently held back to java15. After next (>1.509) LTS, switch to java16 ~ ${java.level}. -->
<!-- Currently held back to java15. After Sep 30 2013 (perhaps?), switch to java1${java.level}. -->
<artifactId>java15</artifactId>
<version>1.0</version>
</signature>
......@@ -602,8 +602,8 @@ THE SOFTWARE.
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>${java.level}</source>
<target>${java.level}</target>
<source>1.${java.level}</source>
<target>1.${java.level}</target>
<!-- default reuseCreated is more performant
feel free to uncomment if you have any issues on your platform
<compilerReuseStrategy>alwaysNew</compilerReuseStrategy>
......@@ -628,7 +628,7 @@ THE SOFTWARE.
<version>3.0</version>
</requireMavenVersion>
<enforceBytecodeVersion>
<maxJdkVersion>${java.level}</maxJdkVersion>
<maxJdkVersion>1.${java.level}</maxJdkVersion>
</enforceBytecodeVersion>
</rules>
</configuration>
......
......@@ -73,7 +73,11 @@ done
JAVA_CMD="$JENKINS_JAVA_CMD $JENKINS_JAVA_OPTIONS -DJENKINS_HOME=$JENKINS_HOME -jar $JENKINS_WAR"
PARAMS="--logfile=/var/log/jenkins/jenkins.log --webroot=/var/cache/jenkins/war --daemon"
[ -n "$JENKINS_PORT" ] && PARAMS="$PARAMS --httpPort=$JENKINS_PORT"
[ -n "$JENKINS_LISTEN_ADDRESS" ] && PARAMS="$PARAMS --httpListenAddress=$JENKINS_LISTEN_ADDRESS"
[ -n "$JENKINS_HTTPS_PORT" ] && PARAMS="$PARAMS --httpsPort=$JENKINS_HTTPS_PORT"
[ -n "$JENKINS_HTTPS_LISTEN_ADDRESS" ] && PARAMS="$PARAMS --httpsListenAddress=$JENKINS_HTTPS_LISTEN_ADDRESS"
[ -n "$JENKINS_AJP_PORT" ] && PARAMS="$PARAMS --ajp13Port=$JENKINS_AJP_PORT"
[ -n "$JENKINS_AJP_LISTEN_ADDRESS" ] && PARAMS="$PARAMS --ajp13ListenAddress=$JENKINS_AJP_LISTEN_ADDRESS"
[ -n "$JENKINS_DEBUG_LEVEL" ] && PARAMS="$PARAMS --debug=$JENKINS_DEBUG_LEVEL"
[ -n "$JENKINS_HANDLER_STARTUP" ] && PARAMS="$PARAMS --handlerCountStartup=$JENKINS_HANDLER_STARTUP"
[ -n "$JENKINS_HANDLER_MAX" ] && PARAMS="$PARAMS --handlerCountMax=$JENKINS_HANDLER_MAX"
......
......@@ -45,6 +45,33 @@ JENKINS_JAVA_OPTIONS="-Djava.awt.headless=true"
#
JENKINS_PORT="8080"
## Type: string
## Default: ""
## ServiceRestart: jenkins
#
# IP address Jenkins listens on for HTTP requests.
# Default is all interfaces (0.0.0.0).
#
JENKINS_LISTEN_ADDRESS=""
## Type: integer(0:65535)
## Default: ""
## ServiceRestart: jenkins
#
# HTTPS port Jenkins is listening on.
# Default is disabled.
#
JENKINS_HTTPS_PORT=""
## Type: string
## Default: ""
## ServiceRestart: jenkins
#
# IP address Jenkins listens on for HTTPS requests.
# Default is disabled.
#
JENKINS_HTTPS_LISTEN_ADDRESS=""
## Type: integer(0:65535)
## Default: 8009
## ServiceRestart: jenkins
......@@ -54,6 +81,15 @@ JENKINS_PORT="8080"
#
JENKINS_AJP_PORT="8009"
## Type: string
## Default: ""
## ServiceRestart: jenkins
#
# IP address Jenkins listens on for Ajp13 requests.
# Default is all interfaces (0.0.0.0).
#
JENKINS_AJP_LISTEN_ADDRESS=""
## Type: integer(1:9)
## Default: 5
## ServiceRestart: jenkins
......
......@@ -38,6 +38,8 @@ import hudson.Functions;
import hudson.Util;
import hudson.tasks.ArtifactArchiver
import hudson.triggers.SCMTrigger;
import hudson.triggers.TimerTrigger
import hudson.triggers.TriggerDescriptor;
import hudson.util.StreamTaskListener;
import hudson.util.OneShotEvent
import jenkins.model.Jenkins;
......@@ -447,4 +449,38 @@ public class AbstractProjectTest extends HudsonTestCase {
assert t.class==SCMTrigger.class;
assert t.spec=="*/10 * * * *"
}
@Bug(18813)
public void testRemoveTrigger() {
AbstractProject j = jenkins.createProjectFromXML("foo", getClass().getResourceAsStream("AbstractProjectTest/vectorTriggers.xml"))
TriggerDescriptor SCM_TRIGGER_DESCRIPTOR = Hudson.instance.getDescriptorOrDie(SCMTrigger.class)
j.removeTrigger(SCM_TRIGGER_DESCRIPTOR);
assert j.triggers().size()==0
}
@Bug(18813)
public void testAddTriggerSameType() {
AbstractProject j = jenkins.createProjectFromXML("foo", getClass().getResourceAsStream("AbstractProjectTest/vectorTriggers.xml"))
def newTrigger = new SCMTrigger("H/5 * * * *")
j.addTrigger(newTrigger);
assert j.triggers().size()==1
def t = j.triggers()[0]
assert t.class==SCMTrigger.class;
assert t.spec=="H/5 * * * *"
}
@Bug(18813)
public void testAddTriggerDifferentType() {
AbstractProject j = jenkins.createProjectFromXML("foo", getClass().getResourceAsStream("AbstractProjectTest/vectorTriggers.xml"))
def newTrigger = new TimerTrigger("20 * * * *")
j.addTrigger(newTrigger);
assert j.triggers().size()==2
def t = j.triggers()[1]
assert t == newTrigger
}
}
......@@ -81,9 +81,10 @@ public class ConsoleAnnotatorTest extends HudsonTestCase {
};
public static class DemoAnnotator extends ConsoleAnnotator<Object> {
private static final String ANNOTATE_TEXT = "ooo" + System.getProperty("line.separator");
@Override
public ConsoleAnnotator annotate(Object build, MarkupText text) {
if (text.getText().equals("ooo\n")) {
if (text.getText().equals(ANNOTATE_TEXT)) {
text.addMarkup(0,3,"<b class=demo>","</b>");
return null;
}
......
......@@ -79,6 +79,7 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
......@@ -282,7 +283,8 @@ public class QueueTest extends HudsonTestCase {
// View for build should group duplicates
WebClient wc = new WebClient();
String buildPage = wc.getPage(build, "").asText().replace('\n',' ');
String nl = System.getProperty("line.separator");
String buildPage = wc.getPage(build, "").asText().replace(nl," ");
assertTrue("Build page should combine duplicates and show counts: " + buildPage,
buildPage.contains("Started by user SYSTEM (2 times) "
+ "Started by an SCM change (3 times) "
......@@ -449,4 +451,60 @@ public class QueueTest extends HudsonTestCase {
assertNotSame(b3.getBuiltOnStr(), b1.getBuiltOnStr());
}
}
public void testPendingsConsistenceAfterErrorDuringMaintain() throws IOException, ExecutionException, InterruptedException{
FreeStyleProject project1 = createFreeStyleProject();
FreeStyleProject project2 = createFreeStyleProject();
TopLevelItemDescriptor descriptor = new TopLevelItemDescriptor(FreeStyleProject.class){
@Override
public FreeStyleProject newInstance(ItemGroup parent, String name) {
return (FreeStyleProject) new FreeStyleProject(parent,name){
@Override
public Label getAssignedLabel(){
throw new IllegalArgumentException("Test exception"); //cause dead of executor
}
@Override
public void save(){
//do not need save
}
};
}
@Override
public String getDisplayName() {
return "simulate-error";
}
};
FreeStyleProject projectError = (FreeStyleProject) jenkins.createProject(descriptor, "throw-error");
project1.setAssignedLabel(jenkins.getSelfLabel());
project2.setAssignedLabel(jenkins.getSelfLabel());
project1.getBuildersList().add(new Shell("sleep 2"));
project1.scheduleBuild2(0);
QueueTaskFuture<FreeStyleBuild> v = project2.scheduleBuild2(0);
projectError.scheduleBuild2(0);
Executor e = jenkins.toComputer().getExecutors().get(0);
Thread.sleep(2000);
while(project2.getLastBuild()==null){
if(!e.isAlive()){
break; // executor is dead due to exception
}
if(e.isIdle()){
assertTrue("Node went to idle before project had" + project2.getDisplayName() + " been started", v.isDone());
}
Thread.sleep(1000);
}
if(project2.getLastBuild()!=null)
return;
Queue.getInstance().cancel(projectError); // cancel job which cause dead of executor
e.doYank(); //restart executor
while(!e.isIdle()){ //executor should take project2 from queue
Thread.sleep(1000);
}
//project2 should not be in pendings
List<Queue.BuildableItem> items = Queue.getInstance().getPendingItems();
for(Queue.BuildableItem item : items){
assertFalse("Project " + project2.getDisplayName() + " stuck in pendings",item.task.getName().equals(project2.getName()));
}
}
}
......@@ -27,22 +27,86 @@ package hudson.model;
import hudson.model.UpdateSite.Data;
import hudson.util.FormValidation;
import hudson.util.PersistedList;
import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.Arrays;
import java.util.HashSet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import static org.junit.Assert.*;
import org.apache.commons.io.FileUtils;
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.jvnet.hudson.test.JenkinsRule;
import org.mortbay.jetty.HttpConnection;
import org.mortbay.jetty.Server;
import org.mortbay.jetty.bio.SocketConnector;
import org.mortbay.jetty.handler.AbstractHandler;
public class UpdateSiteTest {
@Rule public JenkinsRule j = new JenkinsRule();
private final String RELATIVE_BASE = "/_relative/";
private Server server;
private URL baseUrl;
private String getResource(String resourceName) throws IOException {
try {
URL url = UpdateSiteTest.class.getResource(resourceName);
return (url != null)?FileUtils.readFileToString(new File(url.toURI())):null;
} catch(URISyntaxException e) {
return null;
}
}
/**
* Startup a web server to access resources via HTTP.
* @throws Exception
*/
@Before
public void setUpWebServer() throws Exception {
server = new Server();
SocketConnector connector = new SocketConnector();
server.addConnector(connector);
server.setHandler(new AbstractHandler() {
public void handle(String target, HttpServletRequest request,
HttpServletResponse response, int dispatch) throws IOException,
ServletException {
if (target.startsWith(RELATIVE_BASE)) {
target = target.substring(RELATIVE_BASE.length());
}
String responseBody = getResource(target);
if (responseBody != null) {
HttpConnection.getCurrentConnection().getRequest().setHandled(true);
response.setContentType("text/plain; charset=utf-8");
response.setStatus(HttpServletResponse.SC_OK);
response.getOutputStream().write(responseBody.getBytes());
}
}
});
server.start();
baseUrl = new URL("http", "localhost", connector.getLocalPort(), RELATIVE_BASE);
}
@After
public void shutdownWebserver() throws Exception {
server.stop();
}
@Test public void relativeURLs() throws Exception {
PersistedList<UpdateSite> sites = j.jenkins.getUpdateCenter().getSites();
sites.clear();
URL url = UpdateSiteTest.class.getResource("/plugins/tasks-update-center.json");
URL url = new URL(baseUrl, "/plugins/tasks-update-center.json");
UpdateSite site = new UpdateSite(UpdateCenter.ID_DEFAULT, url.toString());
sites.add(site);
assertEquals(FormValidation.ok(), site.updateDirectly(false).get());
......@@ -55,14 +119,14 @@ public class UpdateSiteTest {
}
@Test public void updateDirectlyWithJson() throws Exception {
UpdateSite us = new UpdateSite("default", UpdateSiteTest.class.getResource("update-center.json").toExternalForm());
UpdateSite us = new UpdateSite("default", new URL(baseUrl, "update-center.json").toExternalForm());
assertNull(us.getPlugin("AdaptivePlugin"));
assertEquals(FormValidation.ok(), us.updateDirectly(true).get());
assertNotNull(us.getPlugin("AdaptivePlugin"));
}
@Test public void updateDirectlyWithHtml() throws Exception {
UpdateSite us = new UpdateSite("default", UpdateSiteTest.class.getResource("update-center.json.html").toExternalForm());
UpdateSite us = new UpdateSite("default", new URL(baseUrl, "update-center.json.html").toExternalForm());
assertNull(us.getPlugin("AdaptivePlugin"));
assertEquals(FormValidation.ok(), us.updateDirectly(true).get());
assertNotNull(us.getPlugin("AdaptivePlugin"));
......
......@@ -79,12 +79,8 @@ public class RekeySecretAdminMonitorTest extends HudsonTestCase {
FileUtils.readFileToString(xml).trim());
}
public void testBasicWorkflow() throws Exception {
if ("https://jenkins.ci.cloudbees.com/job/core/job/jenkins_main_trunk/".equals(System.getenv("JOB_URL"))) {
// JUnit 4: Assume.assumeFalse
// "Invalid request submission: {json=[Ljava.lang.String;@2c46358e, .crumb=[Ljava.lang.String;@35661457}"
return;
}
// TODO sometimes fails: "Invalid request submission: {json=[Ljava.lang.String;@2c46358e, .crumb=[Ljava.lang.String;@35661457}"
public void _testBasicWorkflow() throws Exception {
putSomeOldData(jenkins.getRootDir());
WebClient wc = createWebClient();
......
......@@ -11,7 +11,7 @@ blurb.breadcrumb=<p>Implementing <tt>ModelObjectWithContextMenu</tt> is sufficie
<p> \
In addition, implementing \
<a href="http://javadoc.jenkins-ci.org/byShortName/ModelObjectWithChildren"><tt>ModelObjectWithChildren</tt></a> \
enables you to show children of your model object in the breadcrumb when you click the ''>'' icon that separates \
enables you to show children of your model object in the breadcrumb when you click the \u2018>\u2019 icon that separates \
breadcrumb items.
blurb.modelLink=<p>By adding CSS class "model-link" to the &lt;a> tags pointing to model objects with context menu, \
......
......@@ -364,6 +364,10 @@ function ts_makeSortable(table) { // backward compatibility
return new Sortable.Sortable(table);
}
function ts_refresh(table) { // backward compatibility
return table.sortable.refresh();
/** Calls table.sortable.refresh() in case the sortable has been initialized; otherwise does nothing. */
function ts_refresh(table) {
var s = table.sortable;
if (s != null) {
s.refresh();
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册