提交 8457b50d 编写于 作者: D Daniel Beck

Merge https://github.com/jenkinsci/jenkins into dot-name-check

...@@ -55,9 +55,24 @@ Upcoming changes</a> ...@@ -55,9 +55,24 @@ Upcoming changes</a>
<!-- Record your changes in the trunk here. --> <!-- Record your changes in the trunk here. -->
<div id="trunk" style="display:none"><!--=TRUNK-BEGIN=--> <div id="trunk" style="display:none"><!--=TRUNK-BEGIN=-->
<ul class=image> <ul class=image>
<li class='major bug'>
Regression in Windows slaves since 1.547.
(<a href="https://issues.jenkins-ci.org/browse/JENKINS-21373">issue 21373</a>)
<li class=bug> <li class=bug>
Using <code>java -jar jenkins-core.jar folder/external-monitor-job cmd …</code> did not work. Using <code>java -jar jenkins-core.jar folder/external-monitor-job cmd …</code> did not work.
(<a href="https://issues.jenkins-ci.org/browse/JENKINS-21525">issue 21525</a>) (<a href="https://issues.jenkins-ci.org/browse/JENKINS-21525">issue 21525</a>)
<li class=bug>
Jenkins crash on startup after upgrade from 1.546 to 1.548.
(<a href="https://issues.jenkins-ci.org/browse/JENKINS-21474">issue 21474</a>)
<li class=bug>
f:combobox is narrow.
(<a href="https://issues.jenkins-ci.org/browse/JENKINS-21612">issue 21612</a>)
<li class=bug>
Fixed missing help items on "Configure Global Security" page
(<a href="https://issues.jenkins-ci.org/browse/JENKINS-19832">issue 19832</a>)
<li class=rfe>
Plugins implementing "AsyncPeriodicWork" can overwrite default logging level
(<a href="https://github.com/jenkinsci/jenkins/pull/1115">pull request #1115</a>)
</ul> </ul>
</div><!--=TRUNK-END=--> </div><!--=TRUNK-END=-->
...@@ -113,6 +128,8 @@ Upcoming changes</a> ...@@ -113,6 +128,8 @@ Upcoming changes</a>
</ul> </ul>
<h3><a name=v1.547>What's new in 1.547</a> (2014/01/12)</h3> <h3><a name=v1.547>What's new in 1.547</a> (2014/01/12)</h3>
<ul class=image> <ul class=image>
<li class=rfe>
Split Windows slave functionality into its own plugin.
<li class="major bug"> <li class="major bug">
NPE since 1.545 when using aggregated test result publisher without specifying downstream jobs explicitly. NPE since 1.545 when using aggregated test result publisher without specifying downstream jobs explicitly.
(<a href="https://issues.jenkins-ci.org/browse/JENKINS-18410">issue 18410</a>) (<a href="https://issues.jenkins-ci.org/browse/JENKINS-18410">issue 18410</a>)
......
...@@ -45,6 +45,7 @@ import java.util.jar.Manifest; ...@@ -45,6 +45,7 @@ import java.util.jar.Manifest;
import java.util.logging.Logger; import java.util.logging.Logger;
import static java.util.logging.Level.WARNING; import static java.util.logging.Level.WARNING;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.LogFactory;
import org.kohsuke.stapler.HttpResponse; import org.kohsuke.stapler.HttpResponse;
import org.kohsuke.stapler.HttpResponses; import org.kohsuke.stapler.HttpResponses;
...@@ -213,7 +214,7 @@ public class PluginWrapper implements Comparable<PluginWrapper>, ModelObject { ...@@ -213,7 +214,7 @@ public class PluginWrapper implements Comparable<PluginWrapper>, ModelObject {
} }
public String getDisplayName() { public String getDisplayName() {
return getLongName(); return StringUtils.removeStart(getLongName(), "Jenkins ");
} }
public Api getApi() { public Api getApi() {
......
...@@ -54,6 +54,7 @@ public abstract class AbstractCIBase extends Node implements ItemGroup<TopLevelI ...@@ -54,6 +54,7 @@ public abstract class AbstractCIBase extends Node implements ItemGroup<TopLevelI
* If you are calling this on Hudson something is wrong. * If you are calling this on Hudson something is wrong.
* *
* @deprecated * @deprecated
* Maybe you were trying to call {@link #getDisplayName()}.
*/ */
@Deprecated @Override @Deprecated @Override
public String getNodeName() { public String getNodeName() {
...@@ -63,6 +64,7 @@ public abstract class AbstractCIBase extends Node implements ItemGroup<TopLevelI ...@@ -63,6 +64,7 @@ public abstract class AbstractCIBase extends Node implements ItemGroup<TopLevelI
/** /**
* @deprecated * @deprecated
* Why are you calling a method that always returns ""? * Why are you calling a method that always returns ""?
* You probably want o call {@link Jenkins#getRootUrl()}
*/ */
public String getUrl() { public String getUrl() {
return ""; return "";
......
...@@ -401,7 +401,7 @@ public abstract class AbstractProject<P extends AbstractProject<P,R>,R extends A ...@@ -401,7 +401,7 @@ public abstract class AbstractProject<P extends AbstractProject<P,R>,R extends A
* If this project is configured to be always built on this node, * If this project is configured to be always built on this node,
* return that {@link Node}. Otherwise null. * return that {@link Node}. Otherwise null.
*/ */
public Label getAssignedLabel() { public @CheckForNull Label getAssignedLabel() {
if(canRoam) if(canRoam)
return null; return null;
......
...@@ -38,12 +38,12 @@ public abstract class AsyncPeriodicWork extends PeriodicWork { ...@@ -38,12 +38,12 @@ public abstract class AsyncPeriodicWork extends PeriodicWork {
public final void doRun() { public final void doRun() {
try { try {
if(thread!=null && thread.isAlive()) { if(thread!=null && thread.isAlive()) {
logger.log(Level.INFO, name+" thread is still running. Execution aborted."); logger.log(this.getNormalLoggingLevel(), name+" thread is still running. Execution aborted.");
return; return;
} }
thread = new Thread(new Runnable() { thread = new Thread(new Runnable() {
public void run() { public void run() {
logger.log(Level.INFO, "Started "+name); logger.log(getNormalLoggingLevel(), "Started "+name);
long startTime = System.currentTimeMillis(); long startTime = System.currentTimeMillis();
StreamTaskListener l = createListener(); StreamTaskListener l = createListener();
...@@ -59,13 +59,13 @@ public abstract class AsyncPeriodicWork extends PeriodicWork { ...@@ -59,13 +59,13 @@ public abstract class AsyncPeriodicWork extends PeriodicWork {
l.closeQuietly(); l.closeQuietly();
} }
logger.log(Level.INFO, "Finished "+name+". "+ logger.log(getNormalLoggingLevel(), "Finished "+name+". "+
(System.currentTimeMillis()-startTime)+" ms"); (System.currentTimeMillis()-startTime)+" ms");
} }
},name+" thread"); },name+" thread");
thread.start(); thread.start();
} catch (Throwable t) { } catch (Throwable t) {
logger.log(Level.SEVERE, name+" thread failed with error", t); logger.log(this.getErrorLoggingLevel(), name+" thread failed with error", t);
} }
} }
...@@ -83,7 +83,31 @@ public abstract class AsyncPeriodicWork extends PeriodicWork { ...@@ -83,7 +83,31 @@ public abstract class AsyncPeriodicWork extends PeriodicWork {
protected File getLogFile() { protected File getLogFile() {
return new File(Jenkins.getInstance().getRootDir(),name+".log"); return new File(Jenkins.getInstance().getRootDir(),name+".log");
} }
/**
* Returns the logging level at which normal messages are displayed.
*
* @return
* The logging level as @Level.
*
* @since 1.551
*/
protected Level getNormalLoggingLevel() {
return Level.INFO;
}
/**
* Returns the logging level at which error messages are displayed.
*
* @return
* The logging level as @Level.
*
* @since 1.551
*/
protected Level getErrorLoggingLevel() {
return Level.SEVERE;
}
/** /**
* Executes the task. * Executes the task.
* *
......
文件模式从 100755 更改为 100644
...@@ -2107,6 +2107,9 @@ public abstract class Run <JobT extends Job<JobT,RunT>,RunT extends Run<JobT,Run ...@@ -2107,6 +2107,9 @@ public abstract class Run <JobT extends Job<JobT,RunT>,RunT extends Run<JobT,Run
return; return;
} }
RunT nb = getNextBuild();
try{ try{
delete(); delete();
} }
...@@ -2116,8 +2119,8 @@ public abstract class Run <JobT extends Job<JobT,RunT>,RunT extends Run<JobT,Run ...@@ -2116,8 +2119,8 @@ public abstract class Run <JobT extends Job<JobT,RunT>,RunT extends Run<JobT,Run
req.setAttribute("stackTraces", writer); req.setAttribute("stackTraces", writer);
req.getView(this, "delete-retry.jelly").forward(req, rsp); req.getView(this, "delete-retry.jelly").forward(req, rsp);
return; return;
} }
rsp.sendRedirect2(req.getContextPath()+'/' + getParent().getUrl()); rsp.sendRedirect2(req.getContextPath()+'/' + (nb!=null ? nb.getUrl() : getParent().getUrl()));
} }
public void setDescription(String description) throws IOException { public void setDescription(String description) throws IOException {
......
...@@ -40,6 +40,7 @@ import jenkins.model.Jenkins; ...@@ -40,6 +40,7 @@ import jenkins.model.Jenkins;
import jenkins.util.JSONSignatureValidator; import jenkins.util.JSONSignatureValidator;
import net.sf.json.JSONException; import net.sf.json.JSONException;
import net.sf.json.JSONObject; import net.sf.json.JSONObject;
import org.apache.commons.lang.StringUtils;
import org.kohsuke.stapler.DataBoundConstructor; import org.kohsuke.stapler.DataBoundConstructor;
import org.kohsuke.stapler.HttpResponse; import org.kohsuke.stapler.HttpResponse;
import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerRequest;
...@@ -637,8 +638,12 @@ public class UpdateSite { ...@@ -637,8 +638,12 @@ public class UpdateSite {
} }
public String getDisplayName() { public String getDisplayName() {
if(title!=null) return title; String displayName;
return name; if(title!=null)
displayName = title;
else
displayName = name;
return StringUtils.removeStart(displayName, "Jenkins ");
} }
/** /**
......
...@@ -448,7 +448,7 @@ public abstract class View extends AbstractModelObject implements AccessControll ...@@ -448,7 +448,7 @@ public abstract class View extends AbstractModelObject implements AccessControll
if (labels.contains(null) && node.getMode() == Mode.NORMAL) return true; if (labels.contains(null) && node.getMode() == Mode.NORMAL) return true;
for (Label l : labels) for (Label l : labels)
if (l.contains(node)) if (l != null && l.contains(node))
return true; return true;
return false; return false;
} }
......
...@@ -92,7 +92,8 @@ public abstract class CauseOfBlockage { ...@@ -92,7 +92,8 @@ public abstract class CauseOfBlockage {
} }
public String getShortDescription() { public String getShortDescription() {
return Messages.Queue_NodeOffline(node.getDisplayName()); String name = (node.toComputer() != null) ? node.toComputer().getDisplayName() : node.getDisplayName();
return Messages.Queue_NodeOffline(name);
} }
@Override @Override
...@@ -128,7 +129,8 @@ public abstract class CauseOfBlockage { ...@@ -128,7 +129,8 @@ public abstract class CauseOfBlockage {
} }
public String getShortDescription() { public String getShortDescription() {
return Messages.Queue_WaitingForNextAvailableExecutorOn(node.getNodeName()); String name = (node.toComputer() != null) ? node.toComputer().getDisplayName() : node.getDisplayName();
return Messages.Queue_WaitingForNextAvailableExecutorOn(name);
} }
@Override @Override
......
文件模式从 100755 更改为 100644
文件模式从 100755 更改为 100644
...@@ -30,6 +30,7 @@ import hudson.Functions; ...@@ -30,6 +30,7 @@ import hudson.Functions;
import hudson.markup.MarkupFormatter; import hudson.markup.MarkupFormatter;
import hudson.model.Descriptor; import hudson.model.Descriptor;
import hudson.model.Descriptor.FormException; import hudson.model.Descriptor.FormException;
import hudson.model.Describable;
import hudson.model.ManagementLink; import hudson.model.ManagementLink;
import hudson.util.FormApply; import hudson.util.FormApply;
...@@ -55,7 +56,7 @@ import org.kohsuke.stapler.StaplerResponse; ...@@ -55,7 +56,7 @@ import org.kohsuke.stapler.StaplerResponse;
* @author Kohsuke Kawaguchi * @author Kohsuke Kawaguchi
*/ */
@Extension(ordinal = Integer.MAX_VALUE - 210) @Extension(ordinal = Integer.MAX_VALUE - 210)
public class GlobalSecurityConfiguration extends ManagementLink { public class GlobalSecurityConfiguration extends ManagementLink implements Describable<GlobalSecurityConfiguration> {
private static final Logger LOGGER = Logger.getLogger(GlobalSecurityConfiguration.class.getName()); private static final Logger LOGGER = Logger.getLogger(GlobalSecurityConfiguration.class.getName());
...@@ -126,7 +127,7 @@ public class GlobalSecurityConfiguration extends ManagementLink { ...@@ -126,7 +127,7 @@ public class GlobalSecurityConfiguration extends ManagementLink {
@Override @Override
public String getDisplayName() { public String getDisplayName() {
return Messages.GlobalSecurityConfiguration_DisplayName(); return getDescriptor().getDisplayName();
} }
@Override @Override
...@@ -154,4 +155,22 @@ public class GlobalSecurityConfiguration extends ManagementLink { ...@@ -154,4 +155,22 @@ public class GlobalSecurityConfiguration extends ManagementLink {
return input instanceof GlobalConfigurationCategory.Security; return input instanceof GlobalConfigurationCategory.Security;
} }
}; };
/**
* @return
* @see hudson.model.Describable#getDescriptor()
*/
@SuppressWarnings("unchecked")
@Override
public Descriptor<GlobalSecurityConfiguration> getDescriptor() {
return Jenkins.getInstance().getDescriptorOrDie(getClass());
}
@Extension
public static final class DescriptorImpl extends Descriptor<GlobalSecurityConfiguration> {
@Override
public String getDisplayName() {
return Messages.GlobalSecurityConfiguration_DisplayName();
}
}
} }
文件模式从 100755 更改为 100644
文件模式从 100755 更改为 100644
文件模式从 100755 更改为 100644
文件模式从 100755 更改为 100644
...@@ -63,7 +63,7 @@ THE SOFTWARE. ...@@ -63,7 +63,7 @@ THE SOFTWARE.
<td class="pane"> <td class="pane">
<div> <div>
<a href="${p.url}"> <a href="${p.url}">
${p.updateInfo.title?:p.longName} ${p.updateInfo.displayName?:p.displayName}
</a> </a>
</div> </div>
<div class="excerpt"> <div class="excerpt">
......
...@@ -21,7 +21,7 @@ ...@@ -21,7 +21,7 @@
# THE SOFTWARE. # THE SOFTWARE.
Check\ to\ install\ the\ plugin=Cocher pour installer le plugin Check\ to\ install\ the\ plugin=Cocher pour installer le plugin
Click\ this\ heading\ to\ sort\ by\ category=Cliquez sur l''''en-t\u00EAte pour classer par cat\u00E9gorie Click\ this\ heading\ to\ sort\ by\ category=Cliquez sur l''en-t\u00EAte pour classer par cat\u00E9gorie
Download\ now\ and\ install\ after\ restart=T\u00E9l\u00E9charger maintenant et installer apr\u00E8s red\u00E9marrage Download\ now\ and\ install\ after\ restart=T\u00E9l\u00E9charger maintenant et installer apr\u00E8s red\u00E9marrage
Filter=Filtre Filter=Filtre
Inactive=Inactif Inactive=Inactif
......
...@@ -22,4 +22,4 @@ ...@@ -22,4 +22,4 @@
Dismiss=Annuler Dismiss=Annuler
More\ Info=Plus d\u2019informations More\ Info=Plus d\u2019informations
blurb=La configuration de votre proxy inverse n''''est pas bonne blurb=La configuration de votre proxy inverse n''est pas bonne
...@@ -23,7 +23,7 @@ ...@@ -23,7 +23,7 @@
Error\:\ no\ workspace=Erreur: pas de workspace Error\:\ no\ workspace=Erreur: pas de workspace
A\ project\ won't\ have\ any\ workspace\ until\ at\ least\ one\ build\ is\ performed.=Un projet n'a pas de workspace avant un premier build. A\ project\ won't\ have\ any\ workspace\ until\ at\ least\ one\ build\ is\ performed.=Un projet n'a pas de workspace avant un premier build.
There's\ no\ workspace\ for\ this\ project.\ Possible\ reasons\ are\:=Il n'y a pas de workspace existant pour ce projet. Les raisons possibles sont: There's\ no\ workspace\ for\ this\ project.\ Possible\ reasons\ are\:=Il n'y a pas de workspace existant pour ce projet. Les raisons possibles sont:
The\ project\ was\ renamed\ recently\ and\ no\ build\ was\ done\ under\ the\ new\ name.=Le projet a \u00E9t\u00E9 renomm\u00E9 r\u00E9cemment et aucun build n''''a \u00E9t\u00E9 fait avec ce nouveau nom. The\ project\ was\ renamed\ recently\ and\ no\ build\ was\ done\ under\ the\ new\ name.=Le projet a \u00E9t\u00E9 renomm\u00E9 r\u00E9cemment et aucun build n''a \u00E9t\u00E9 fait avec ce nouveau nom.
The\ slave\ this\ project\ has\ run\ on\ for\ the\ last\ time\ was\ removed.=La machine esclave sur laquelle ce projet a été lancé pour la dernière fois a été retirée. The\ slave\ this\ project\ has\ run\ on\ for\ the\ last\ time\ was\ removed.=La machine esclave sur laquelle ce projet a été lancé pour la dernière fois a été retirée.
li3=Le r\u00E9pertoire de travail ({0}) a \u00E9t\u00E9 d\u00E9plac\u00E9 hors de Jenkins. li3=Le r\u00E9pertoire de travail ({0}) a \u00E9t\u00E9 d\u00E9plac\u00E9 hors de Jenkins.
text=Lancer un build afin de faire créer un workspace par Jenkins. text=Lancer un build afin de faire créer un workspace par Jenkins.
...@@ -20,5 +20,5 @@ ...@@ -20,5 +20,5 @@
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE. # THE SOFTWARE.
Error:\ Wipe\ Out\ Workspace\ blocked\ by\ SCM=Erreur : La suppression de l''''espace de travail a &eacute;t&eacute; bloqu&eacute;e par le SCM Error:\ Wipe\ Out\ Workspace\ blocked\ by\ SCM=Erreur : La suppression de l''espace de travail a &eacute;t&eacute; bloqu&eacute;e par le SCM
The\ SCM\ for\ this\ project\ has\ blocked\ this\ attempt\ to\ wipe\ out\ the\ project''s\ workspace.=Le SCM de ce projet a bloqu&eacute; la tentative de suppression de l''''espace de travail de ce projet The\ SCM\ for\ this\ project\ has\ blocked\ this\ attempt\ to\ wipe\ out\ the\ project''s\ workspace.=Le SCM de ce projet a bloqu&eacute; la tentative de suppression de l''espace de travail de ce projet
...@@ -89,7 +89,7 @@ THE SOFTWARE. ...@@ -89,7 +89,7 @@ THE SOFTWARE.
<j:if test="${it.node.assignedLabels.size() gt 1}"> <j:if test="${it.node.assignedLabels.size() gt 1}">
<div> <div>
${%Labels:} <h2>${%Labels}</h2>
<j:forEach var="entry" items="${it.node.labelCloud}"> <j:forEach var="entry" items="${it.node.labelCloud}">
<!-- Skip the label for this node --> <!-- Skip the label for this node -->
<j:if test="${entry.item!=it.node.selfLabel}"> <j:if test="${entry.item!=it.node.selfLabel}">
......
...@@ -22,5 +22,5 @@ ...@@ -22,5 +22,5 @@
Data\ obtained=Donn\u00E9es obtenues Data\ obtained=Donn\u00E9es obtenues
Name=Nom Name=Nom
Refresh\ status=Actualiser l''''\u00E9tat Refresh\ status=Actualiser l''\u00E9tat
Configure=Configurer Configure=Configurer
...@@ -20,4 +20,4 @@ ...@@ -20,4 +20,4 @@
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE. # THE SOFTWARE.
body=Ceci est la fonction principale de Jenkins qui sert \u00E0 builder (construire) votre projet. <br>Vous pouvez int\u00E9grer tous les outils de gestion de version avec tous les syst\u00E8mes de build. <br>Il est m\u00EAme possible d''''''''utiliser Jenkins pour tout autre chose qu''''''''un build logiciel. body=Ceci est la fonction principale de Jenkins qui sert \u00E0 builder (construire) votre projet. <br>Vous pouvez int\u00E9grer tous les outils de gestion de version avec tous les syst\u00E8mes de build. <br>Il est m\u00EAme possible d''utiliser Jenkins pour tout autre chose qu''un build logiciel.
...@@ -308,8 +308,8 @@ ParametersDefinitionProperty.DisplayName=Parameters ...@@ -308,8 +308,8 @@ ParametersDefinitionProperty.DisplayName=Parameters
StringParameterDefinition.DisplayName=String Parameter StringParameterDefinition.DisplayName=String Parameter
TextParameterDefinition.DisplayName=Text Parameter TextParameterDefinition.DisplayName=Text Parameter
FileParameterDefinition.DisplayName=File Parameter FileParameterDefinition.DisplayName=File Parameter
BooleanParameterDefinition.DisplayName=Boolean Value BooleanParameterDefinition.DisplayName=Boolean Parameter
ChoiceParameterDefinition.DisplayName=Choice ChoiceParameterDefinition.DisplayName=Choice Parameter
ChoiceParameterDefinition.MissingChoices=Requires Choices. ChoiceParameterDefinition.MissingChoices=Requires Choices.
RunParameterDefinition.DisplayName=Run Parameter RunParameterDefinition.DisplayName=Run Parameter
PasswordParameterDefinition.DisplayName=Password Parameter PasswordParameterDefinition.DisplayName=Password Parameter
......
...@@ -159,13 +159,21 @@ UpdateCenter.Status.ConnectionFailed=\ ...@@ -159,13 +159,21 @@ UpdateCenter.Status.ConnectionFailed=\
Permalink.LastBuild=Dernier build Permalink.LastBuild=Dernier build
Permalink.LastStableBuild=Dernier build stable Permalink.LastStableBuild=Dernier build stable
Permalink.LastUnstableBuild=Dernier build instable
Permalink.LastUnsuccessfulBuild=Dernier build non r\u00e9ussi
Permalink.LastSuccessfulBuild=Dernier build avec succ\u00e8s Permalink.LastSuccessfulBuild=Dernier build avec succ\u00e8s
Permalink.LastFailedBuild=Dernier build en \u00e9chec Permalink.LastFailedBuild=Dernier build en \u00e9chec
ParameterAction.DisplayName=Param\u00e8tres ParameterAction.DisplayName=Param\u00e8tres
ParametersDefinitionProperty.DisplayName=Param\u00e8tres ParametersDefinitionProperty.DisplayName=Param\u00e8tres
StringParameterDefinition.DisplayName=Param\u00e8tre String StringParameterDefinition.DisplayName=Param\u00e8tre String
TextParameterDefinition.DisplayName=Param\u00e8tre texte
FileParameterDefinition.DisplayName=Param\u00e8tre fichier FileParameterDefinition.DisplayName=Param\u00e8tre fichier
BooleanParameterDefinition.DisplayName=Param\u00e8tre bool\u00e9en
ChoiceParameterDefinition.DisplayName=Param\u00e8tre choix
ChoiceParameterDefinition.MissingChoices=Choix requis.
RunParameterDefinition.DisplayName=Param\u00e8tre d''ex\u00e9cution
PasswordParameterDefinition.DisplayName=Param\u00e8tre "Mot de passe"
Node.Mode.NORMAL=Utiliser cet esclave autant que possible Node.Mode.NORMAL=Utiliser cet esclave autant que possible
Node.Mode.EXCLUSIVE=R\u00e9server cette machine pour les jobs qui lui sont attach\u00e9s seulement Node.Mode.EXCLUSIVE=R\u00e9server cette machine pour les jobs qui lui sont attach\u00e9s seulement
......
...@@ -44,7 +44,7 @@ BallColor.Failed=\u041f\u0440\u043e\u0432\u0430\u043b\u0438\u043b\u043e\u0441\u0 ...@@ -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.InProgress=\u0412 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435
BallColor.Pending=\u041e\u0436\u0438\u0434\u0430\u0435\u0442 BallColor.Pending=\u041e\u0436\u0438\u0434\u0430\u0435\u0442
BallColor.Success=\u0423\u0441\u043f\u0435\u0448\u043d\u043e BallColor.Success=\u0423\u0441\u043f\u0435\u0448\u043d\u043e
BallColor.Unstable=\u041d\u0430\u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e BallColor.Unstable=\u041d\u0435\u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e
Computer.Caption=\u041f\u043e\u0434\u0447\u0438\u043d\u0435\u043d\u043d\u044b\u0439 \u0443\u0437\u0435\u043b {0} Computer.Caption=\u041f\u043e\u0434\u0447\u0438\u043d\u0435\u043d\u043d\u044b\u0439 \u0443\u0437\u0435\u043b {0}
......
...@@ -21,7 +21,7 @@ ...@@ -21,7 +21,7 @@
# THE SOFTWARE. # THE SOFTWARE.
Filter\ build\ executors=Filtrer les lanceurs de constructions Filter\ build\ executors=Filtrer les lanceurs de constructions
Filter\ build\ queue=Filtrer la file d''''attente de constructions Filter\ build\ queue=Filtrer la file d''attente de constructions
Name=Nom Name=Nom
Description=Description Description=Description
OK=Ok OK=Ok
...@@ -21,5 +21,5 @@ ...@@ -21,5 +21,5 @@
# THE SOFTWARE. # THE SOFTWARE.
Dismiss=Cacher Dismiss=Cacher
blurb=Jenkins a mis hors ligne des esclaves <a href="{0}/computer/">leur m\u00E9triques d''''\u00E9tat de sant\u00E9</a> \u00E9taient sous les exigences. Si vous ne voulez pas que Jenkins face cela, vous pouvez <a href="{0}/computer/configure">changer la configuration</a>. blurb=Jenkins a mis hors ligne des esclaves <a href="{0}/computer/">leur m\u00E9triques d''\u00E9tat de sant\u00E9</a> \u00E9taient sous les exigences. Si vous ne voulez pas que Jenkins face cela, vous pouvez <a href="{0}/computer/configure">changer la configuration</a>.
...@@ -22,6 +22,7 @@ l.layout(norefresh:true, permission:app.ADMINISTER, title:my.displayName) { ...@@ -22,6 +22,7 @@ l.layout(norefresh:true, permission:app.ADMINISTER, title:my.displayName) {
div(class:"behavior-loading", _("LOADING")) div(class:"behavior-loading", _("LOADING"))
f.form(method:"post",name:"config",action:"configure") { f.form(method:"post",name:"config",action:"configure") {
set("instance",my); set("instance",my);
set("descriptor", my.descriptor);
f.optionalBlock( field:"useSecurity", title:_("Enable security"), checked:app.useSecurity) { f.optionalBlock( field:"useSecurity", title:_("Enable security"), checked:app.useSecurity) {
f.entry (title:_("TCP port for JNLP slave agents"), field:"slaveAgentPort") { f.entry (title:_("TCP port for JNLP slave agents"), field:"slaveAgentPort") {
......
...@@ -21,5 +21,5 @@ ...@@ -21,5 +21,5 @@
# THE SOFTWARE. # THE SOFTWARE.
Users=Utilisateurs Users=Utilisateurs
blurb=Ces utilisateurs peuvent se logguer sur Jenkins. C''''est le groupe contenant <a href="../people">cette liste</a>, qui contient \u00E9galement les utilisateurs cr\u00E9\u00E9s automatiquement qui ont simplement fait des commits sur certains projets et n''''ont pas d''''acc\u00E8s direct \u00E0 Jenkins. blurb=Ces utilisateurs peuvent se logguer sur Jenkins. C''est le groupe contenant <a href="../people">cette liste</a>, qui contient \u00E9galement les utilisateurs cr\u00E9\u00E9s automatiquement qui ont simplement fait des commits sur certains projets et n''ont pas d''acc\u00E8s direct \u00E0 Jenkins.
Name=Nom Name=Nom
...@@ -28,7 +28,7 @@ THE SOFTWARE. ...@@ -28,7 +28,7 @@ THE SOFTWARE.
<j:when test="${app.slaveAgentPort==-1}"> <j:when test="${app.slaveAgentPort==-1}">
<div class="error"> <div class="error">
${%slaveAgentPort.disabled} ${%slaveAgentPort.disabled}
<l:isAdmin><a href="${rootURL}/configure">${%configure.link.text}</a>.</l:isAdmin> <l:isAdmin><a href="${rootURL}/configureSecurity">${%configure.link.text}</a>.</l:isAdmin>
</div> </div>
</j:when> </j:when>
<j:when test="${it.offline and !it.temporarilyOffline}"> <j:when test="${it.offline and !it.temporarilyOffline}">
......
...@@ -21,4 +21,4 @@ ...@@ -21,4 +21,4 @@
# THE SOFTWARE. # THE SOFTWARE.
slaveAgentPort.disabled=TCP port for JNLP slave agents is disabled. slaveAgentPort.disabled=TCP port for JNLP slave agents is disabled.
configure.link.text=Go to system config screen and change it configure.link.text=Go to security configuration screen and change it
...@@ -24,7 +24,6 @@ Connect\ slave\ to\ Jenkins\ one\ of\ these\ ways\:=Forbind Jenkins til slaver p ...@@ -24,7 +24,6 @@ Connect\ slave\ to\ Jenkins\ one\ of\ these\ ways\:=Forbind Jenkins til slaver p
launch\ agent=start agent launch\ agent=start agent
Connected\ via\ JNLP\ agent.=Forbundet via JNLP agent. Connected\ via\ JNLP\ agent.=Forbundet via JNLP agent.
Or\ if\ the\ slave\ is\ headless\:=Eller hvis slaven er hovedl\u00f8s: Or\ if\ the\ slave\ is\ headless\:=Eller hvis slaven er hovedl\u00f8s:
configure.link.text=G\u00e5 til system config siden for at \u00e6ndre det
Run\ from\ slave\ command\ line\:=K\u00f8r fra slavens kommandolinje: Run\ from\ slave\ command\ line\:=K\u00f8r fra slavens kommandolinje:
slaveAgentPort.disabled=TCP port for JNLP slave agent er sl\u00e5et fra. slaveAgentPort.disabled=TCP port for JNLP slave agent er sl\u00e5et fra.
Launch\ agent\ from\ browser\ on\ slave=Start agent fra browser p\u00e5 slaven Launch\ agent\ from\ browser\ on\ slave=Start agent fra browser p\u00e5 slaven
...@@ -21,7 +21,7 @@ ...@@ -21,7 +21,7 @@
# THE SOFTWARE. # THE SOFTWARE.
slaveAgentPort.disabled=TCP-Port für JNLP-Slaves ist deaktiviert. slaveAgentPort.disabled=TCP-Port für JNLP-Slaves ist deaktiviert.
configure.link.text=Zu Systemkonfiguration wechseln und konfigurieren configure.link.text=Zur globalen Sicherheitskonfiguration wechseln und ändern
Connect\ slave\ to\ Jenkins\ one\ of\ these\ ways\:=Der Slave kann eine Verbindung zum Jenkins-Master mit einer der folgenden Möglichkeiten aufbauen: Connect\ slave\ to\ Jenkins\ one\ of\ these\ ways\:=Der Slave kann eine Verbindung zum Jenkins-Master mit einer der folgenden Möglichkeiten aufbauen:
launch\ agent=Agent starten launch\ agent=Agent starten
Launch\ agent\ from\ browser\ on\ slave=Agent aus einem Webbrowser auf den Slave starten Launch\ agent\ from\ browser\ on\ slave=Agent aus einem Webbrowser auf den Slave starten
......
...@@ -21,7 +21,6 @@ ...@@ -21,7 +21,6 @@
# THE SOFTWARE. # THE SOFTWARE.
slaveAgentPort.disabled=El puerto TCP para los agentes esclavos via JNLP está deshabilitado. slaveAgentPort.disabled=El puerto TCP para los agentes esclavos via JNLP está deshabilitado.
configure.link.text=Utiliza la utilidad de configuración del sistema (system config) para cambiarlo.
launch\ agent=Lanzar agente launch\ agent=Lanzar agente
Or\ if\ the\ slave\ is\ headless\:=O si el esclavo no tiene pantalla Or\ if\ the\ slave\ is\ headless\:=O si el esclavo no tiene pantalla
Run\ from\ slave\ command\ line\:=Ejecutar desde la línea de comandos del esclavo Run\ from\ slave\ command\ line\:=Ejecutar desde la línea de comandos del esclavo
......
...@@ -23,7 +23,6 @@ ...@@ -23,7 +23,6 @@
slaveAgentPort.disabled=Le port TCP pour l''esclave JNLP est d\u00E9sactiv\u00E9. slaveAgentPort.disabled=Le port TCP pour l''esclave JNLP est d\u00E9sactiv\u00E9.
Launch\ agent\ from\ browser\ on\ slave=Lancer l''agent \u00E0 partir du navigateur sur l''esclave Launch\ agent\ from\ browser\ on\ slave=Lancer l''agent \u00E0 partir du navigateur sur l''esclave
Run\ from\ slave\ command\ line:=Ex\u00E9cuter l''esclave \u00E0 partir de l\u2019interpr\u00E8te de commandes Run\ from\ slave\ command\ line:=Ex\u00E9cuter l''esclave \u00E0 partir de l\u2019interpr\u00E8te de commandes
configure.link.text=Allez \u00E0 l''\u00E9cran de configuration du syst\u00E8me et changez-le
launch\ agent=lancer l''agent launch\ agent=lancer l''agent
Connect\ slave\ to\ Jenkins\ one\ of\ these\ ways:=Connecter l''esclave \u00E0 Jenkins avec l''une des mani\u00E8res suivantes: Connect\ slave\ to\ Jenkins\ one\ of\ these\ ways:=Connecter l''esclave \u00E0 Jenkins avec l''une des mani\u00E8res suivantes:
Connected\ via\ JNLP\ agent.=Connect\u00E9 via l\u2019agent JNLP. Connected\ via\ JNLP\ agent.=Connect\u00E9 via l\u2019agent JNLP.
...@@ -21,7 +21,6 @@ ...@@ -21,7 +21,6 @@
# THE SOFTWARE. # THE SOFTWARE.
slaveAgentPort.disabled=JNLP\u30B9\u30EC\u30FC\u30D6\u30A8\u30FC\u30B8\u30A7\u30F3\u30C8\u7528\u306ETCP\u30DD\u30FC\u30C8\u306F\u4F7F\u7528\u3067\u304D\u307E\u305B\u3093\u3002 slaveAgentPort.disabled=JNLP\u30B9\u30EC\u30FC\u30D6\u30A8\u30FC\u30B8\u30A7\u30F3\u30C8\u7528\u306ETCP\u30DD\u30FC\u30C8\u306F\u4F7F\u7528\u3067\u304D\u307E\u305B\u3093\u3002
configure.link.text=\u30B7\u30B9\u30C6\u30E0\u306E\u8A2D\u5B9A\u753B\u9762\u3067\u8A2D\u5B9A\u3092\u5909\u66F4\u3059\u308B\u3002
Connect\ slave\ to\ Jenkins\ one\ of\ these\ ways\:=\u6B21\u306E\u3044\u305A\u308C\u304B\u306E\u65B9\u6CD5\u3067\u30B9\u30EC\u30FC\u30D6\u3092Jenkins\u306B\u63A5\u7D9A\u3057\u307E\u3059\u3002 Connect\ slave\ to\ Jenkins\ one\ of\ these\ ways\:=\u6B21\u306E\u3044\u305A\u308C\u304B\u306E\u65B9\u6CD5\u3067\u30B9\u30EC\u30FC\u30D6\u3092Jenkins\u306B\u63A5\u7D9A\u3057\u307E\u3059\u3002
launch\ agent=\u30A8\u30FC\u30B8\u30A7\u30F3\u30C8\u306E\u8D77\u52D5 launch\ agent=\u30A8\u30FC\u30B8\u30A7\u30F3\u30C8\u306E\u8D77\u52D5
Launch\ agent\ from\ browser\ on\ slave=\u30B9\u30EC\u30FC\u30D6\u4E0A\u306E\u30D6\u30E9\u30A6\u30B6\u304B\u3089\u30A8\u30FC\u30B8\u30A7\u30F3\u30C8\u3092\u8D77\u52D5 Launch\ agent\ from\ browser\ on\ slave=\u30B9\u30EC\u30FC\u30D6\u4E0A\u306E\u30D6\u30E9\u30A6\u30B6\u304B\u3089\u30A8\u30FC\u30B8\u30A7\u30F3\u30C8\u3092\u8D77\u52D5
......
...@@ -21,8 +21,6 @@ ...@@ -21,8 +21,6 @@
# THE SOFTWARE. # THE SOFTWARE.
Or\ if\ the\ slave\ is\ headless\:=Ou, se o slave \u00e9 sem master Or\ if\ the\ slave\ is\ headless\:=Ou, se o slave \u00e9 sem master
# Go to system config screen and change it
configure.link.text=V\u00e1 at\u00e9 a tela de configura\u00e7\u00e3o do sistema e providencie a mudan\u00e7a
Connect\ slave\ to\ Jenkins\ one\ of\ these\ ways\:=Conecta slave ao Jenkins por uma dessas maneiras: Connect\ slave\ to\ Jenkins\ one\ of\ these\ ways\:=Conecta slave ao Jenkins por uma dessas maneiras:
Run\ from\ slave\ command\ line\:=Executar comando de linha pelo slave Run\ from\ slave\ command\ line\:=Executar comando de linha pelo slave
launch\ agent=Lan\u00e7ar agente launch\ agent=Lan\u00e7ar agente
......
...@@ -21,7 +21,6 @@ ...@@ -21,7 +21,6 @@
# THE SOFTWARE. # THE SOFTWARE.
slaveAgentPort.disabled=JNLP Slave \u4ee3\u7406\u7a0b\u5f0f\u7684 TCP \u9023\u63a5\u57e0\u5df2\u95dc\u9589\u3002 slaveAgentPort.disabled=JNLP Slave \u4ee3\u7406\u7a0b\u5f0f\u7684 TCP \u9023\u63a5\u57e0\u5df2\u95dc\u9589\u3002
configure.link.text=\u8acb\u5230\u7cfb\u7d71\u8a2d\u5b9a\u9801\u4fee\u6539
Connect\ slave\ to\ Jenkins\ one\ of\ these\ ways\:=\u53ef\u4ee5\u7528\u4e0b\u9762\u9019\u4e9b\u65b9\u6cd5\u5c07 Slave \u9023\u5230 Jenkins: Connect\ slave\ to\ Jenkins\ one\ of\ these\ ways\:=\u53ef\u4ee5\u7528\u4e0b\u9762\u9019\u4e9b\u65b9\u6cd5\u5c07 Slave \u9023\u5230 Jenkins:
launch\ agent=\u555f\u52d5\u4ee3\u7406\u7a0b\u5f0f launch\ agent=\u555f\u52d5\u4ee3\u7406\u7a0b\u5f0f
Launch\ agent\ from\ browser\ on\ slave=\u5728 Slave \u7684\u700f\u89bd\u5668\u4e0a\u555f\u52d5\u4ee3\u7406\u7a0b\u5f0f Launch\ agent\ from\ browser\ on\ slave=\u5728 Slave \u7684\u700f\u89bd\u5668\u4e0a\u555f\u52d5\u4ee3\u7406\u7a0b\u5f0f
......
...@@ -20,5 +20,5 @@ ...@@ -20,5 +20,5 @@
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE. # THE SOFTWARE.
I\ agree\ to\ the\ Java\ SE\ Development\ Kit\ License\ Agreement=J''''approuve l''''accord de licence Java SE Development Kit I\ agree\ to\ the\ Java\ SE\ Development\ Kit\ License\ Agreement=J''approuve l''accord de licence Java SE Development Kit
Version=Version Version=Version
...@@ -20,7 +20,7 @@ ...@@ -20,7 +20,7 @@
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE. # THE SOFTWARE.
description=Nombre d''''installations {0} sur ce syst\u00E8me description=Nombre d''installations {0} sur ce syst\u00E8me
label.add=Ajouter {0} label.add=Ajouter {0}
label.delete=Supprimer {0} label.delete=Supprimer {0}
title=Installations {0} title=Installations {0}
...@@ -22,7 +22,7 @@ ...@@ -22,7 +22,7 @@
Current\ SCM\ Polling\ Activities=Activités en cours de scrutation de la gestion de version Current\ SCM\ Polling\ Activities=Activités en cours de scrutation de la gestion de version
clogged=bouché clogged=bouché
No\ polling\ activity\ is\ in\ progress.=Pas d''''activit\u00E9 de scrutation en cours. No\ polling\ activity\ is\ in\ progress.=Pas d''activit\u00E9 de scrutation en cours.
The\ following\ polling\ activities\ are\ currently\ in\ progress\:=Les activités de scrutation suivantes sont en cours: The\ following\ polling\ activities\ are\ currently\ in\ progress\:=Les activités de scrutation suivantes sont en cours:
Project=Projet Project=Projet
Running\ for=En cours depuis Running\ for=En cours depuis
...@@ -49,7 +49,7 @@ THE SOFTWARE. ...@@ -49,7 +49,7 @@ THE SOFTWARE.
${descriptor.calcFillSettings(field,attrs)} <!-- this figures out the 'fillUrl' and 'fillDependsOn' attribute --> ${descriptor.calcFillSettings(field,attrs)} <!-- this figures out the 'fillUrl' and 'fillDependsOn' attribute -->
<m:input xmlns:m="jelly:hudson.util.jelly.MorphTagLibrary" ATTRIBUTES="${attrs}" EXCEPT="field items clazz" <m:input xmlns:m="jelly:hudson.util.jelly.MorphTagLibrary" ATTRIBUTES="${attrs}" EXCEPT="field items clazz"
autocomplete="off" class="combobox2 settings-input ${attrs.clazz}${attrs.checkUrl!=null ? ' validated' : ''}" autocomplete="off" class="combobox2 setting-input ${attrs.clazz}${attrs.checkUrl!=null ? ' validated' : ''}"
name="${attrs.name ?: '_.'+attrs.field}" name="${attrs.name ?: '_.'+attrs.field}"
value="${attrs.value ?: instance[attrs.field]}" /> value="${attrs.value ?: instance[attrs.field]}" />
<!-- TODO consider customizedFields --> <!-- TODO consider customizedFields -->
......
文件模式从 100755 更改为 100644
文件模式从 100755 更改为 100644
...@@ -23,6 +23,6 @@ ...@@ -23,6 +23,6 @@
Script\ Console=Console de script Script\ Console=Console de script
Result=Résultat Result=Résultat
Run=Exécuter Run=Exécuter
description=Vous pouvez saisir ici un <a href="http://groovy.codehaus.org/Home">script Groovy</a> quelconque pour l\u2019ex\u00E9cuter sur le serveur.<br>Utile pour diagnostiquer et r\u00E9soudre des probl\u00E8mes.<br>Utilisez la commande ''''''''println'''''''' pour voir la sortie (si vous utilisez <tt>System.out</tt>, cela ira vers la sortie standard du serveur, qui est plus complexe \u00E0 retrouver.) <br>Par exemple : description=Vous pouvez saisir ici un <a href="http://groovy.codehaus.org/Home">script Groovy</a> quelconque pour l\u2019ex\u00E9cuter sur le serveur.<br>Utile pour diagnostiquer et r\u00E9soudre des probl\u00E8mes.<br>Utilisez la commande "println" pour voir la sortie (si vous utilisez <tt>System.out</tt>, cela ira vers la sortie standard du serveur, qui est plus complexe \u00E0 retrouver.) <br>Par exemple :
description2=Toutes les classes de tous les plugins sont visibles. <tt>jenkins.*</tt>, <tt>jenkins.model.*</tt>, <tt>hudson.*</tt>, et <tt>hudson.model.*</tt> sont pr\u00E9-import\u00E9es. description2=Toutes les classes de tous les plugins sont visibles. <tt>jenkins.*</tt>, <tt>jenkins.model.*</tt>, <tt>hudson.*</tt>, et <tt>hudson.model.*</tt> sont pr\u00E9-import\u00E9es.
文件模式从 100755 更改为 100644
...@@ -215,6 +215,11 @@ THE SOFTWARE. ...@@ -215,6 +215,11 @@ THE SOFTWARE.
<artifactId>commons-logging</artifactId> <artifactId>commons-logging</artifactId>
<version>1.1.3</version> <version>1.1.3</version>
</dependency> </dependency>
<dependency>
<groupId>org.samba.jcifs</groupId>
<artifactId>jcifs</artifactId>
<version>1.3.17-kohsuke-1</version>
</dependency>
</dependencies> </dependencies>
</dependencyManagement> </dependencyManagement>
<dependencies> <dependencies>
......
...@@ -16,7 +16,7 @@ updateCenter.post( ...@@ -16,7 +16,7 @@ updateCenter.post(
"name": "tasks", "name": "tasks",
"requiredCore": "1.264", "requiredCore": "1.264",
"sha1": "wtzlciUKiMcg90H5CTYkGX6+r8Y=", "sha1": "wtzlciUKiMcg90H5CTYkGX6+r8Y=",
"title": "Hudson Task Scanner Plug-in", "title": "Jenkins Task Scanner Plug-in",
"url": "tasks.jpi", "url": "tasks.jpi",
"version": "2.23" "version": "2.23"
}, },
......
文件模式从 100755 更改为 100644
...@@ -116,6 +116,9 @@ public class UpdateSiteTest { ...@@ -116,6 +116,9 @@ public class UpdateSiteTest {
assertEquals(new HashSet<String>(Arrays.asList("tasks", "dummy")), data.plugins.keySet()); assertEquals(new HashSet<String>(Arrays.asList("tasks", "dummy")), data.plugins.keySet());
assertEquals(new URL(url, "tasks.jpi").toString(), data.plugins.get("tasks").url); assertEquals(new URL(url, "tasks.jpi").toString(), data.plugins.get("tasks").url);
assertEquals("http://nowhere.net/dummy.hpi", data.plugins.get("dummy").url); assertEquals("http://nowhere.net/dummy.hpi", data.plugins.get("dummy").url);
UpdateSite.Plugin tasksPlugin = data.plugins.get("tasks");
assertEquals("Wrong name of plugin found", "Task Scanner Plug-in", tasksPlugin.getDisplayName());
} }
@Test public void updateDirectlyWithJson() throws Exception { @Test public void updateDirectlyWithJson() throws Exception {
......
...@@ -38,11 +38,13 @@ import hudson.matrix.AxisList; ...@@ -38,11 +38,13 @@ import hudson.matrix.AxisList;
import hudson.matrix.LabelAxis; import hudson.matrix.LabelAxis;
import hudson.matrix.MatrixProject; import hudson.matrix.MatrixProject;
import hudson.model.Queue.Task; import hudson.model.Queue.Task;
import hudson.model.Node.Mode;
import org.jvnet.hudson.test.Email; import org.jvnet.hudson.test.Email;
import org.w3c.dom.Text; import org.w3c.dom.Text;
import static hudson.model.Messages.Hudson_ViewName; import static hudson.model.Messages.Hudson_ViewName;
import hudson.slaves.DumbSlave;
import hudson.util.HudsonIsLoading; import hudson.util.HudsonIsLoading;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
...@@ -301,6 +303,27 @@ public class ViewTest { ...@@ -301,6 +303,27 @@ public class ViewTest {
assertContainsNodes(view3, slave0, slave1, slave2, slave3, slave4); assertContainsNodes(view3, slave0, slave1, slave2, slave3, slave4);
} }
@Test
@Bug(21474)
public void testGetComputersNPE() throws Exception {
ListView view = listView("aView");
view.filterExecutors = true;
DumbSlave dedicatedSlave = j.createOnlineSlave();
dedicatedSlave.setMode(Mode.EXCLUSIVE);
view.add(j.createFreeStyleProject());
FreeStyleProject tiedJob = j.createFreeStyleProject();
tiedJob.setAssignedNode(dedicatedSlave);
view.add(tiedJob);
DumbSlave notIncludedSlave = j.createOnlineSlave();
notIncludedSlave.setMode(Mode.EXCLUSIVE);
assertContainsNodes(view, j.jenkins, dedicatedSlave);
assertNotContainsNodes(view, notIncludedSlave);
}
private void assertContainsNodes(View view, Node... slaves) { private void assertContainsNodes(View view, Node... slaves) {
for (Node slave: slaves) { for (Node slave: slaves) {
assertTrue( assertTrue(
......
...@@ -90,10 +90,26 @@ foreach (@files) { ...@@ -90,10 +90,26 @@ foreach (@files) {
## print statistics ## print statistics
my $tdone = $tkeys - $tmissing - $tunused - $tempty - $tsame - $tnojenkins; my $tdone = $tkeys - $tmissing - $tunused - $tempty - $tsame - $tnojenkins;
my $pdone = 100;
my $pmissing = 0;
my $punused = 0;
my $pempty = 0;
my $psame = 0;
my $pnojenkins = 0;
if ($tkeys != 0) {
$pdone = $tdone/$tkeys*100;
$pmissing = $tmissing/$tkeys*100;
$punused = $tunused/$tkeys*100;
$pempty = $tempty/$tkeys*100;
$psame = $tsame/$tkeys*100;
$pnojenkins = $tnojenkins/$tkeys*100;
}
printf ("\nTOTAL: Files: %d Keys: %d Done: %d(%.2f\%)\n Missing: %d(%.2f\%) Orphan: %d(%.2f\%) Empty: %d(%.2f\%) Same: %d(%.2f\%) NoJenkins: %d(%.2f\%)\n\n", printf ("\nTOTAL: Files: %d Keys: %d Done: %d(%.2f\%)\n Missing: %d(%.2f\%) Orphan: %d(%.2f\%) Empty: %d(%.2f\%) Same: %d(%.2f\%) NoJenkins: %d(%.2f\%)\n\n",
$tfiles, $tkeys, $tdone, $tfiles, $tkeys, $tdone, $pdone,
$tdone/$tkeys*100, $tmissing, $tmissing/$tkeys*100, $tunused, $tunused/$tkeys*100, $tmissing, $pmissing, $tunused, $punused,
$tempty, $tempty/$tkeys*100, $tsame, $tsame/$tkeys*100, $tnojenkins, $tnojenkins/$tkeys*100); $tempty, $pempty, $tsame, $psame, $tnojenkins, $pnojenkins);
## end ## end
exit(); exit();
...@@ -190,7 +206,7 @@ sub processFile { ...@@ -190,7 +206,7 @@ sub processFile {
removeUnusedKeys($ofile, %keys) if ($remove && $unused ne ""); removeUnusedKeys($ofile, %keys) if ($remove && $unused ne "");
# convert the language file to ISO or ACII which are # convert the language file to ISO or ACII which are
# the charsets which Hudson supports right now # the charsets which Jenkins supports right now
convert($ofile, $toiso, $toascii) if ( -f $ofile ); convert($ofile, $toiso, $toascii) if ( -f $ofile );
} }
...@@ -258,7 +274,7 @@ sub loadPropertiesFile { ...@@ -258,7 +274,7 @@ sub loadPropertiesFile {
s/[\r\n]+//; s/[\r\n]+//;
$ret{$key} .= " \n# $1" if ($cont && /\s*(.*)[\\\s]*$/); $ret{$key} .= " \n# $1" if ($cont && /\s*(.*)[\\\s]*$/);
if (/^([^#\s].*?[^\\])=(.*)[\s\\]*$/) { if (/^([^#\s].*?[^\\])=(.*)[\s\\]*$/) {
($key, $val) = ($1, $2); ($key, $val) = (trim($1), trim($2));
$ret{$key}=$val; $ret{$key}=$val;
} }
$cont = (/\\\s*$/) ? 1 : 0; $cont = (/\\\s*$/) ? 1 : 0;
...@@ -359,10 +375,19 @@ sub printLicense { ...@@ -359,10 +375,19 @@ sub printLicense {
} }
} }
# trim function to remove whitespace from the start and end of the string
sub trim($)
{
my $string = shift;
$string =~ s/^\s+//;
$string =~ s/\s+$//;
return $string;
}
### Usage ### Usage
sub usage { sub usage {
print " print "
Translation Tool for Hudson Translation Tool for Jenkins
Usage: $0 --lang=xx [options] [dir] Usage: $0 --lang=xx [options] [dir]
......
文件模式从 100755 更改为 100644
文件模式从 100755 更改为 100644
文件模式从 100755 更改为 100644
文件模式从 100755 更改为 100644
文件模式从 100755 更改为 100644
文件模式从 100755 更改为 100644
文件模式从 100755 更改为 100644
文件模式从 100755 更改为 100644
文件模式从 100755 更改为 100644
文件模式从 100755 更改为 100644
文件模式从 100755 更改为 100644
文件模式从 100755 更改为 100644
文件模式从 100755 更改为 100644
文件模式从 100755 更改为 100644
文件模式从 100755 更改为 100644
文件模式从 100755 更改为 100644
文件模式从 100755 更改为 100644
文件模式从 100755 更改为 100644
文件模式从 100755 更改为 100644
文件模式从 100755 更改为 100644
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册