未验证 提交 a49f5805 编写于 作者: T Tim Van Holder 提交者: GitHub

[JENKINS-26097] Adjust label expression auto-completion and validation (#4774)

上级 842de77c
......@@ -1913,7 +1913,7 @@ public abstract class AbstractProject<P extends AbstractProject<P,R>,R extends A
public FormValidation doCheckLabel(@AncestorInPath AbstractProject<?,?> project,
@QueryParameter String value) {
return validateLabelExpression(value, project);
return LabelExpression.validate(value, project);
}
/**
......@@ -1921,39 +1921,11 @@ public abstract class AbstractProject<P extends AbstractProject<P,R>,R extends A
*
* @param project May be specified to perform project specific validation.
* @since 1.590
* @deprecated Use {@link LabelExpression#validate(String, Item)} instead.
*/
@Deprecated
public static @NonNull FormValidation validateLabelExpression(String value, @CheckForNull AbstractProject<?, ?> project) {
if (Util.fixEmpty(value)==null)
return FormValidation.ok(); // nothing typed yet
try {
Label.parseExpression(value);
} catch (ANTLRException e) {
return FormValidation.error(e,
Messages.AbstractProject_AssignedLabelString_InvalidBooleanExpression(e.getMessage()));
}
Jenkins j = Jenkins.get();
Label l = j.getLabel(value);
if (l.isEmpty()) {
for (LabelAtom a : l.listAtoms()) {
if (a.isEmpty()) {
LabelAtom nearest = LabelAtom.findNearest(a.getName());
return FormValidation.warning(Messages.AbstractProject_AssignedLabelString_NoMatch_DidYouMean(a.getName(),nearest.getDisplayName()));
}
}
return FormValidation.warning(Messages.AbstractProject_AssignedLabelString_NoMatch());
}
if (project != null) {
for (AbstractProject.LabelValidator v : j
.getExtensionList(AbstractProject.LabelValidator.class)) {
FormValidation result = v.check(project, l);
if (!FormValidation.Kind.OK.equals(result.kind)) {
return result;
}
}
}
return FormValidation.okWithMarkup(Messages.AbstractProject_LabelLink(
j.getRootUrl(), Util.escape(l.getName()), l.getUrl(), l.getNodes().size(), l.getClouds().size())
);
return LabelExpression.validate(value, project);
}
public FormValidation doCheckCustomWorkspace(@QueryParameter String customWorkspace){
......@@ -1985,64 +1957,12 @@ public abstract class AbstractProject<P extends AbstractProject<P,R>,R extends A
}
public AutoCompletionCandidates doAutoCompleteLabel(@QueryParameter String value) {
AutoCompletionCandidates c = new AutoCompletionCandidates();
Set<Label> labels = Jenkins.get().getLabels();
List<String> queries = new AutoCompleteSeeder(value).getSeeds();
for (String term : queries) {
for (Label l : labels) {
if (l.getName().startsWith(term)) {
c.add(l.getName());
}
}
}
return c;
return LabelExpression.autoComplete(value);
}
public List<SCMCheckoutStrategyDescriptor> getApplicableSCMCheckoutStrategyDescriptors(AbstractProject p) {
return SCMCheckoutStrategyDescriptor._for(p);
}
/**
* Utility class for taking the current input value and computing a list
* of potential terms to match against the list of defined labels.
*/
static class AutoCompleteSeeder {
private String source;
AutoCompleteSeeder(String source) {
this.source = source;
}
List<String> getSeeds() {
ArrayList<String> terms = new ArrayList<>();
boolean trailingQuote = source.endsWith("\"");
boolean leadingQuote = source.startsWith("\"");
boolean trailingSpace = source.endsWith(" ");
if (trailingQuote || (trailingSpace && !leadingQuote)) {
terms.add("");
} else {
if (leadingQuote) {
int quote = source.lastIndexOf('"');
if (quote == 0) {
terms.add(source.substring(1));
} else {
terms.add("");
}
} else {
int space = source.lastIndexOf(' ');
if (space > -1) {
terms.add(source.substring(space+1));
} else {
terms.add(source);
}
}
}
return terms;
}
}
}
/**
......@@ -2128,10 +2048,16 @@ public abstract class AbstractProject<P extends AbstractProject<P,R>,R extends A
* This extension point allows such restrictions.
*
* @since 1.540
* @deprecated Use {@link jenkins.model.labels.LabelValidator} instead.
*/
@Deprecated
public static abstract class LabelValidator implements ExtensionPoint {
/**
* Check the use of the label within the specified context.
* <p>
* Note that "OK" responses (and any text/markup that may be set on them) will be ignored. Only warnings and
* errors are taken into account, and aggregated across all validators.
*
* @param project the project that wants to restrict itself to the specified label.
* @param label the label that the project wants to restrict itself to.
......@@ -2139,6 +2065,31 @@ public abstract class AbstractProject<P extends AbstractProject<P,R>,R extends A
*/
@NonNull
public abstract FormValidation check(@NonNull AbstractProject<?, ?> project, @NonNull Label label);
/**
* Validates the use of a label within a particular context.
* <p>
* Note that "OK" responses (and any text/markup that may be set on them) will be ignored. Only warnings and
* errors are taken into account, and aggregated across all validators.
* <p>
* This method exists to allow plugins to implement an override for it, enabling checking in non-AbstractProject
* contexts without needing to update their Jenkins dependency (and using the new
* {@link jenkins.model.labels.LabelValidator} instead).
*
* @param item The context item to be restricted by the label.
* @param label The label that the job wants to restrict itself to.
* @return The validation result.
*
* @since TODO
*/
@NonNull
public FormValidation checkItem(@NonNull Item item, @NonNull Label label) {
if (item instanceof AbstractProject<?, ?>) {
return this.check((AbstractProject<?, ?>) item, label);
}
return FormValidation.ok();
}
}
}
......@@ -23,8 +23,24 @@
*/
package hudson.model.labels;
import antlr.ANTLRException;
import edu.umd.cs.findbugs.annotations.CheckForNull;
import edu.umd.cs.findbugs.annotations.NonNull;
import edu.umd.cs.findbugs.annotations.Nullable;
import hudson.Util;
import hudson.model.AbstractProject;
import hudson.model.AutoCompletionCandidates;
import hudson.model.Item;
import hudson.model.Label;
import hudson.model.Messages;
import hudson.util.FormValidation;
import hudson.util.VariableResolver;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import jenkins.model.Jenkins;
import jenkins.model.labels.LabelAutoCompleteSeeder;
import jenkins.model.labels.LabelValidator;
/**
* Boolean expression of labels.
......@@ -210,4 +226,103 @@ public abstract class LabelExpression extends Label {
return LabelOperatorPrecedence.IMPLIES;
}
}
//region Auto-Completion and Validation
/**
* Generates auto-completion candidates for a (partial) label.
*
* @param label The (partial) label for which auto-completion is being requested.
* @return A set of auto-completion candidates.
* @since TODO
*/
@NonNull
public static AutoCompletionCandidates autoComplete(@Nullable String label) {
AutoCompletionCandidates c = new AutoCompletionCandidates();
Set<Label> labels = Jenkins.get().getLabels();
List<String> queries = new LabelAutoCompleteSeeder(Util.fixNull(label)).getSeeds();
for (String term : queries) {
for (Label l : labels) {
if (l.getName().startsWith(term)) {
c.add(l.getName());
}
}
}
return c;
}
/**
* Validates a label expression.
*
* @param expression The expression to validate.
* @return The validation result.
* @since TODO
*/
@NonNull
public static FormValidation validate(@Nullable String expression) {
return LabelExpression.validate(expression, null);
}
/**
* Validates a label expression.
*
* @param expression The label expression to validate.
* @param item The context item (like a job or a folder), if applicable; used for potential additional
* restrictions via {@link LabelValidator} instances.
* @return The validation result.
* @since TODO
*/
// FIXME: Should the messages be moved, or kept where they are for backward compatibility?
@NonNull
public static FormValidation validate(@Nullable String expression, @CheckForNull Item item) {
if (Util.fixEmptyAndTrim(expression) == null) {
return FormValidation.ok();
}
try {
Label.parseExpression(expression);
} catch (ANTLRException e) {
return FormValidation.error(e, Messages.LabelExpression_InvalidBooleanExpression(e.getMessage()));
}
final Jenkins j = Jenkins.get();
Label l = j.getLabel(expression);
if (l.isEmpty()) {
for (LabelAtom a : l.listAtoms()) {
if (a.isEmpty()) {
LabelAtom nearest = LabelAtom.findNearest(a.getName());
return FormValidation.warning(Messages.LabelExpression_NoMatch_DidYouMean(a.getName(), nearest.getDisplayName()));
}
}
return FormValidation.warning(Messages.LabelExpression_NoMatch());
}
if (item != null) {
final List<FormValidation> problems = new ArrayList<>();
// Use the project-oriented validators too, so that validation from older plugins still gets applied.
for (AbstractProject.LabelValidator v : j.getExtensionList(AbstractProject.LabelValidator.class)) {
FormValidation result = v.checkItem(item, l);
if (FormValidation.Kind.OK.equals(result.kind)) {
continue;
}
problems.add(result);
}
// And then use the new validators.
for (LabelValidator v : j.getExtensionList(LabelValidator.class)) {
FormValidation result = v.check(item, l);
if (FormValidation.Kind.OK.equals(result.kind)) {
continue;
}
problems.add(result);
}
// If there were any problems, report them all.
if (!problems.isEmpty()) {
return FormValidation.aggregate(problems);
}
}
// All done. Report the results.
return FormValidation.okWithMarkup(Messages.LabelExpression_LabelLink(
j.getRootUrl(), Util.escape(l.getName()), l.getUrl(), l.getNodes().size(), l.getClouds().size())
);
}
//endregion
}
......@@ -25,11 +25,15 @@
package hudson.tools;
import hudson.DescriptorExtensionList;
import hudson.model.AutoCompletionCandidates;
import hudson.model.Descriptor;
import hudson.model.labels.LabelExpression;
import hudson.util.FormValidation;
import jenkins.model.Jenkins;
import java.util.List;
import java.util.ArrayList;
import org.kohsuke.stapler.QueryParameter;
/**
* Descriptor for a {@link ToolInstaller}.
......@@ -62,4 +66,14 @@ public abstract class ToolInstallerDescriptor<T extends ToolInstaller> extends D
return r;
}
@SuppressWarnings("unused")
public AutoCompletionCandidates doAutoCompleteLabel(@QueryParameter String value) {
return LabelExpression.autoComplete(value);
}
@SuppressWarnings("unused")
public FormValidation doCheckLabel(@QueryParameter String value) {
return LabelExpression.validate(value);
}
}
package jenkins.model.labels;
import edu.umd.cs.findbugs.annotations.NonNull;
import java.util.ArrayList;
import java.util.List;
import org.kohsuke.accmod.Restricted;
import org.kohsuke.accmod.restrictions.NoExternalUse;
/**
* Utility class for taking the current input value and computing a list of potential terms to match against the
* list of defined labels.
*/
@Restricted(NoExternalUse.class)
public class LabelAutoCompleteSeeder {
private final String source;
/**
* Creates a new auto-complete seeder for labels.
*
* @param source The (partial) label expression to use as the source..
*/
public LabelAutoCompleteSeeder(@NonNull String source) {
this.source = source;
}
/**
* Gets a list of seeds for label auto-completion.
*
* @return A list of seeds for label auto-completion.
*/
@NonNull
public List<String> getSeeds() {
final ArrayList<String> terms = new ArrayList<>();
boolean trailingQuote = source.endsWith("\"");
boolean leadingQuote = source.startsWith("\"");
boolean trailingSpace = source.endsWith(" ");
if (trailingQuote || (trailingSpace && !leadingQuote)) {
terms.add("");
} else {
if (leadingQuote) {
int quote = source.lastIndexOf('"');
if (quote == 0) {
terms.add(source.substring(1));
} else {
terms.add("");
}
} else {
int space = source.lastIndexOf(' ');
if (space > -1) {
terms.add(source.substring(space+1));
} else {
terms.add(source);
}
}
}
return terms;
}
}
package jenkins.model.labels;
import edu.umd.cs.findbugs.annotations.NonNull;
import hudson.ExtensionPoint;
import hudson.model.Item;
import hudson.model.Label;
import hudson.util.FormValidation;
/**
* Plugins may want to contribute additional restrictions on the use of specific labels for specific context items.
* This extension point allows such restrictions.
*
* @since TODO
*/
public interface LabelValidator extends ExtensionPoint {
/**
* Validates the use of a label within a particular context.
* <p>
* Note that "OK" responses (and any text/markup that may be set on them) will be ignored. Only warnings and errors
* are taken into account, and aggregated across all validators.
*
* @param item The context item to be restricted by the label.
* @param label The label that the job wants to restrict itself to.
* @return The validation result.
*/
@NonNull
FormValidation check(@NonNull Item item, @NonNull Label label);
}
......@@ -37,7 +37,6 @@ AbstractItem.FailureToStopBuilds=Failed to interrupt and stop {0,choice,1#{0,num
builds} of {1}
AbstractItem.NewNameInUse=The name \u201c{0}\u201d is already in use.
AbstractItem.NewNameUnchanged=The new name is the same as the current name.
AbstractProject.AssignedLabelString_NoMatch_DidYouMean=There\u2019s no agent/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.AwaitingWorkspaceToComeOnline=We need to schedule a new build to get a workspace, but deferring {0}ms in the hope that one will become available soon
......@@ -76,13 +75,7 @@ AbstractProject.WipeOutPermission.Description=\
This permission grants the ability to wipe out the contents of a workspace.
AbstractProject.CancelPermission.Description=\
This permission grants the ability to cancel a scheduled, or abort a running, build.
AbstractProject.AssignedLabelString.InvalidBooleanExpression=\
Invalid boolean expression: {0}
AbstractProject.AssignedLabelString.NoMatch=\
There''s no agent/cloud that matches this assignment
AbstractProject.CustomWorkspaceEmpty=Custom workspace is empty.
AbstractProject.LabelLink=<a href="{0}{2}">Label {1}</a> is serviced by {3,choice,0#no nodes|1#1 node|1<{3} nodes}{4,choice,0#|1# and 1 cloud|1< and {4} clouds}. \
Permissions or other restrictions provided by plugins may prevent this job from running on those nodes.
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.
......@@ -195,6 +188,11 @@ Job.you_must_use_the_save_button_if_you_wish=You must use the Save button if you
Label.GroupOf=group of {0}
Label.InvalidLabel=invalid label
Label.ProvisionedFrom=Provisioned from {0}
LabelExpression.InvalidBooleanExpression=Invalid boolean expression: {0}
LabelExpression.LabelLink=<a href="{0}{2}">Label {1}</a> matches {3,choice,0#no nodes|1#1 node|1<{3} nodes}{4,choice,0#|1# and 1 cloud|1< and {4} clouds}. \
Permissions or other restrictions provided by plugins may further reduce that list.
LabelExpression.NoMatch=No agent/cloud matches this label expression.
LabelExpression.NoMatch_DidYouMean=No agent/cloud matches this label expression. Did you mean \u2018{1}\u2019 instead of \u2018{0}\u2019?
ManageJenkinsAction.DisplayName=Manage Jenkins
MultiStageTimeSeries.EMPTY_STRING=
Queue.AllNodesOffline=All nodes of label \u2018{0}\u2019 are offline
......
......@@ -95,11 +95,11 @@ AbstractProject.WipeOutPermission.Description=\
\u0422\u043e\u0432\u0430 \u0434\u0430\u0432\u0430 \u043f\u0440\u0430\u0432\u043e \u0437\u0430 \u0438\u0437\u0442\u0440\u0438\u0432\u0430\u043d\u0435 \u043d\u0430 \u0446\u044f\u043b\u043e\u0442\u043e \u0441\u044a\u0434\u044a\u0440\u0436\u0430\u043d\u0438\u0435 \u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e.
AbstractProject.CancelPermission.Description=\
\u0422\u043e\u0432\u0430 \u0434\u0430\u0432\u0430 \u043f\u0440\u0430\u0432\u043e \u0437\u0430 \u043e\u0442\u043c\u044f\u043d\u0430 \u043d\u0430 \u0437\u0430\u043f\u043b\u0430\u043d\u0443\u0432\u0430\u043d\u043e \u0438 \u0441\u043f\u0438\u0440\u0430\u043d\u0435 \u043d\u0430 \u0438\u0437\u043f\u044a\u043b\u043d\u044f\u0432\u0430\u043d\u043e \u0438\u0437\u0433\u0440\u0430\u0436\u0434\u0430\u043d\u0435.
AbstractProject.AssignedLabelString.InvalidBooleanExpression=\
LabelExpression.InvalidBooleanExpression=\
\u041d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u0435\u043d \u0431\u0443\u043b\u0435\u0432 \u0438\u0437\u0440\u0430\u0437: {0}
AbstractProject.CustomWorkspaceEmpty=\
\u041f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u0441\u043a\u043e\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u0435 \u043f\u0440\u0430\u0437\u043d\u043e.
AbstractProject.LabelLink=\
LabelExpression.LabelLink=\
<a href="{0}{2}">\u0415\u0442\u0438\u043a\u0435\u0442\u044a\u0442 {1}</a> \u0441\u0435 \u043e\u0431\u0441\u043b\u0443\u0436\u0432\u0430 \u043e\u0442\
{3,choice,0#0 \u043c\u0430\u0448\u0438\u043d\u0438|1#1 \u043c\u0430\u0448\u0438\u043d\u0430|1<{3} \u043c\u0430\u0448\u0438\u043d\u0438}{4,choice,0#|1# \u0438 1 \u043e\u0431\u043b\u0430\u043a|1< \u0438 {4} \u043e\u0431\u043b\u0430\u043a\u0430}
......@@ -613,7 +613,7 @@ User.IllegalFullname=\
Computer.NoSuchSlaveExists=\
\u041d\u044f\u043c\u0430 \u0430\u0433\u0435\u043d\u0442 \u201e{0}\u201c. \u201e{1}\u201c \u043b\u0438 \u0438\u043c\u0430\u0445\u0442\u0435 \u043f\u0440\u0435\u0434\u0432\u0438\u0434?
# There\u2019s no agent/cloud that matches this assignment. Did you mean \u2018{1}\u2019 instead of \u2018{0}\u2019?
AbstractProject.AssignedLabelString_NoMatch_DidYouMean=\
LabelExpression.NoMatch_DidYouMean=\
\u041d\u044f\u043c\u0430 \u0442\u0430\u043a\u044a\u0432 \u0430\u0433\u0435\u043d\u0442/\u043e\u0431\u043b\u0430\u043a. \u201e{1}\u201c \u043b\u0438 \u0438\u043c\u0430\u0445\u0442\u0435 \u043f\u0440\u0435\u0434\u0432\u0438\u0434 \u0432\u043c\u0435\u0441\u0442\u043e \u201e{0}\u201c?
# Agent called \u2018{0}\u2019 already exists
ComputerSet.SlaveAlreadyExists=\
......@@ -655,7 +655,7 @@ Computer.Caption=\
\u0410\u0433\u0435\u043d\u0442 \u201e{0}\u201c
# \
# There's no agent/cloud that matches this assignment
AbstractProject.AssignedLabelString.NoMatch=\
LabelExpression.NoMatch=\
\u041d\u044f\u043c\u0430 \u0430\u0433\u0435\u043d\u0442, \u043e\u0442\u0433\u043e\u0432\u0430\u0440\u044f\u0449 \u043d\u0430 \u0437\u0430\u0434\u0430\u043d\u0438\u0435\u0442\u043e
# Invalid agent configuration. Name is empty
Slave.InvalidConfig.NoName=\
......
......@@ -30,13 +30,9 @@ AbstractItem.NoSuchJobExists=Element \u201E{0}\u201C existiert nicht. Meinten Si
AbstractItem.NoSuchJobExistsWithoutSuggestion=Es gibt kein Element \u201E{0}\u201C.
AbstractItem.Pronoun=Element
AbstractItem.NewNameInUse=Der Name {0} wird bereits verwendet.
AbstractProject.AssignedLabelString.InvalidBooleanExpression=Ung\u00FCltiger boolscher Ausdruck: \u201E{0}\u201C
AbstractProject.AssignedLabelString.NoMatch=Es gibt keine Agenten oder Clouds, die diesen Label-Ausdruck bedienen.
AbstractProject.AssignedLabelString_NoMatch_DidYouMean=Es gibt keine Knoten oder Clouds f\u00FCr diesen Ausdruck. Meinten Sie \u201E{1}\u201C statt \u201E{0}\u201C?
AbstractProject.AwaitingBuildForWorkspace=Warte auf den Start eines Builds, damit ein Arbeitsbereich erzeugt wird.
AbstractProject.AwaitingWorkspaceToComeOnline=Ein Build m\u00FCsste gestartet werden, um einen Arbeitsbereich anzulegen, aber warte noch {0}ms, falls doch noch ein Arbeitsbereich verf\u00FCgbar wird.
AbstractProject.CustomWorkspaceEmpty=Kein Pfad zum Verzeichnis des Arbeitsbereichs angegeben.
AbstractProject.LabelLink=Das <a href="{0}{2}">Label \u201E{1}\u201C</a> wird von {3,choice,0#keinen Knoten|1#einem Knoten|1<{3} Knoten}{4,choice,0#|1# und einer Cloud|1< und {4} Clouds} bedient.
AbstractProject.PollingVetoed=SCM-Polling wurde von \u201E{0}\u201C unterbunden
AbstractProject.WorkspaceTitle=Workspace von \u201E{0}\u201C
AbstractProject.WorkspaceTitleOnComputer=Workspace von \u201E{0}\u201C auf \u201E{1}\u201C
......@@ -186,6 +182,11 @@ Label.GroupOf={0} Gruppe
Label.InvalidLabel=Ung\u00FCltiges Label
Label.ProvisionedFrom=Bereitgestellt durch {0}
LabelExpression.InvalidBooleanExpression=Ung\u00FCltiger boolscher Ausdruck: \u201E{0}\u201C
LabelExpression.LabelLink=Das <a href="{0}{2}">Label \u201E{1}\u201C</a> wird von {3,choice,0#keinen Knoten|1#einem Knoten|1<{3} Knoten}{4,choice,0#|1# und einer Cloud|1< und {4} Clouds} bedient.
LabelExpression.NoMatch=Es gibt keine Agenten oder Clouds, die diesen Label-Ausdruck bedienen.
LabelExpression.NoMatch_DidYouMean=Es gibt keine Knoten oder Clouds f\u00FCr diesen Ausdruck. Meinten Sie \u201E{1}\u201C statt \u201E{0}\u201C?
LoadStatistics.Legends.AvailableExecutors=Freie Build-Prozessoren
LoadStatistics.Legends.ConnectingExecutors=Verbindende Build-Prozessoren
LoadStatistics.Legends.DefinedExecutors=Konfigurierte Build-Prozessoren
......
......@@ -262,13 +262,13 @@ Permalink.LastUnstableBuild=\u00daltima ejecuci\u00f3n inestable
Computer.BadChannel=El nodo est\u00e1 apagado o no existe el canal remoto (como puede ocurrir en un nodo principal)
MyViewsProperty.DisplayName=Mis vistas
BuildAuthorizationToken.InvalidTokenProvided=El Token incorrecto
AbstractProject.AssignedLabelString.NoMatch=No hay ning\u00fan nodo/nube que cumpla esta asignaci\u00f3n
LabelExpression.NoMatch=No hay ning\u00fan nodo/nube que cumpla esta asignaci\u00f3n
AbstractItem.Pronoun=Tarea
AbstractProject.DownstreamBuildInProgress=El projecto padre {0} todav\u00eda est\u00e1 en ejecuci\u00f3n
AbstractProject.AwaitingBuildForWorkspace=El trabajo est\u00e1 esperando para tener un ''espacio de trabajo''
Run.ArtifactsPermission.Description=\
Este permiso sirve para poder utilizar los artefactos producidos en los proyectos.
AbstractProject.AssignedLabelString.InvalidBooleanExpression=Expresi\u00f3n booleana incorrecta: {0}
LabelExpression.InvalidBooleanExpression=Expresi\u00f3n booleana incorrecta: {0}
ManageJenkinsAction.DisplayName=Administrar Jenkins
Computer.NoSuchSlaveExists=El nodo {0} no existe. \u00BFQuiz\u00E1s se est\u00E1 refiriendo a {1}?
ResultTrend.StillFailing=Todav\u00EDa falla
......@@ -281,7 +281,7 @@ ResultTrend.Failure=Fallo
UpdateCenter.PluginCategory.listview-column=Columnas de la lista
ResultTrend.Aborted=Cancelado
TextParameterDefinition.DisplayName=Par\u00E1metro de texto
AbstractProject.AssignedLabelString_NoMatch_DidYouMean=No hay ning\u00FAn nodo que cumpla esta asignaci\u00F3n. \u00BFQuiz\u00E1s se refiera a ''{1}'' en lugar de ''{0}''?
LabelExpression.NoMatch_DidYouMean=No hay ning\u00FAn nodo que cumpla esta asignaci\u00F3n. \u00BFQuiz\u00E1s se refiera a ''{1}'' en lugar de ''{0}''?
ResultTrend.Success=Correcto
AbstractProject.CancelPermission.Description=Este permiso permite que se pueda cancelar un trabajo.
Run.Summary.NotBuilt=no se ha ejecutado
......
......@@ -35,7 +35,6 @@ AbstractItem.BeingDeleted=Eliminazione di {0} in corso
AbstractItem.FailureToStopBuilds=Interruzione e arresto {0,choice,1#{0,number,integer} \
della compilazione|1<{0,number,integer} delle compilazioni} di {1} non riusciti
AbstractItem.NewNameInUse=Il nome {0} è già utilizzato.
AbstractProject.AssignedLabelString_NoMatch_DidYouMean=Non esiste alcun agente/cloud corrispondente a questo assegnamento. Forse si intendeva "{1}" anziché "{0}"?
AbstractProject.NewBuildForWorkspace=Pianificazione di una nuova compilazione per ottenere uno spazio di lavoro in corso.
AbstractProject.AwaitingBuildForWorkspace=In attesa della compilazione per ottenere uno spazio di lavoro.
AbstractProject.AwaitingWorkspaceToComeOnline=È necessario pianificare una nuova compilazione per ottenere uno spazio di lavoro, ma si sta rinviando tale operazione per {0} ms nella speranza che uno degli spazi diventi disponibile a breve
......@@ -78,12 +77,7 @@ AbstractProject.WipeOutPermission.Description=\
Questo permesso consente di cancellare i contenuti di uno spazio di lavoro.
AbstractProject.CancelPermission.Description=\
Questo permesso consente di annullare una compilazione pianificata o di interromperne una in esecuzione.
AbstractProject.AssignedLabelString.InvalidBooleanExpression=\
Espressione booleana {0} non valida
AbstractProject.AssignedLabelString.NoMatch=\
Non esistono agenti/cloud corrispondenti a quest''assegnamento
AbstractProject.CustomWorkspaceEmpty=Lo spazio di lavoro personalizzato è vuoto.
AbstractProject.LabelLink=<a href="{0}{2}">L''etichetta {1}</a> {3,choice,0#non è servita da alcun nodo|1#è servita da un nodo|1<è servita da {3} nodi}{4,choice,0#|1# e da un cloud|1< e da {4} cloud}
Api.MultipleMatch=L''espressione XPath "{0}" corrisponde a {1} nodi. \
Creare un''espressione XPath che corrisponda a un solo nodo o utilizzare il parametro query "wrapper" per eseguirne il wrapping entro un elemento radice.
......@@ -184,6 +178,12 @@ Job.you_must_use_the_save_button_if_you_wish=
Label.GroupOf=gruppo di {0}
Label.InvalidLabel=etichetta non valida
Label.ProvisionedFrom=Provisioning eseguito da {0}
LabelExpression.InvalidBooleanExpression=\
Espressione booleana {0} non valida
LabelExpression.LabelLink=<a href="{0}{2}">L''etichetta {1}</a> {3,choice,0#non è servita da alcun nodo|1#è servita da un nodo|1<è servita da {3} nodi}{4,choice,0#|1# e da un cloud|1< e da {4} cloud}
LabelExpression.NoMatch=\
Non esistono agenti/cloud corrispondenti a quest''assegnamento
LabelExpression.NoMatch_DidYouMean=Non esiste alcun agente/cloud corrispondente a questo assegnamento. Forse si intendeva "{1}" anziché "{0}"?
ManageJenkinsAction.DisplayName=Gestisci Jenkins
Queue.AllNodesOffline=Tutti i nodi dell''etichetta "{0}" non sono in linea
Queue.LabelHasNoNodes=Non esistono nodi con l''etichetta "{0}"
......
......@@ -57,9 +57,9 @@ AbstractProject.WipeOutPermission.Description=\
\u30ef\u30fc\u30af\u30b9\u30da\u30fc\u30b9\u306b\u3042\u308b\u30b3\u30f3\u30c6\u30f3\u30c4\u306e\u524a\u9664\u3092\u8a31\u53ef\u3057\u307e\u3059\u3002
AbstractProject.CancelPermission.Description=\
\u30d3\u30eb\u30c9\u306e\u30ad\u30e3\u30f3\u30bb\u30eb\u3092\u8a31\u53ef\u3057\u307e\u3059\u3002
AbstractProject.AssignedLabelString.InvalidBooleanExpression=\
LabelExpression.InvalidBooleanExpression=\
\u30e9\u30d9\u30eb\u5f0f\u306b\u9593\u9055\u3044\u304c\u3042\u308a\u307e\u3059\u3002: {0} \
\u8a72\u5f53\u3059\u308b\u30b9\u30ec\u30fc\u30d6\u3082\u3057\u304f\u306f\u30af\u30e9\u30a6\u30c9\u306f\u3042\u308a\u307e\u305b\u3093\u3002 \
\u8a72\u5f53\u3059\u308b\u30b9\u30ec\u30fc\u30d6\u3082\u3057\u304f\u306f\u30af\u30e9\u30a6\u30c9\u306f\u3042\u308a\u307e\u305b\u3093\u3002
AbstractProject.CustomWorkspaceEmpty=\u30ab\u30b9\u30bf\u30e0\u30ef\u30fc\u30af\u30b9\u30da\u30fc\u30b9\u304c\u5165\u529b\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002
Api.MultipleMatch=XPath "{0}" \u306f {1} \u500b\u306e\u30ce\u30fc\u30c9\u3068\u4e00\u81f4\u3057\u307e\u3057\u305f\u3002 \
......
......@@ -7,7 +7,6 @@ AbstractBuild.KeptBecause=Vykdymas u\u017elaikytas d\u0117l {0}.
AbstractItem.NoSuchJobExists=N\u0117ra tokio darbo \u201e{0}\u201c. Gal tur\u0117jote omenyje \u201e{1}\u201c?
AbstractItem.NoSuchJobExistsWithoutSuggestion=N\u0117ra tokio darbo \u201e{0}\u201c.
AbstractItem.Pronoun=Elementas
AbstractProject.AssignedLabelString_NoMatch_DidYouMean=N\u0117ra agento/debesies, atitinkan\u010dio \u0161\u012f argument\u0105. Ar tur\u0117jote omenyje \u201e{1}\u201c, o ne \u201e{0}\u201c?
AbstractProject.NewBuildForWorkspace=Planuojamas naujas vykdymas, kad b\u016bt\u0173 gautas darbalaukis.
AbstractProject.AwaitingBuildForWorkspace=Laukiama, kol vykdymas gaus darbalauk\u012f.
AbstractProject.AwaitingWorkspaceToComeOnline=Mums reikia suplanuoti nauj\u0105 vykdym\u0105, kad gautume darbalauk\u012f, bet laukiame {0}ms, tik\u0117damiesi, kad kuris nors greitai atsilaisvins
......@@ -45,12 +44,7 @@ AbstractProject.WipeOutPermission.Description=\
\u0160i teis\u0117 leid\u017eia panaikinti darbalaukio turin\u012f.
AbstractProject.CancelPermission.Description=\
\u0160i teis\u0117 leid\u017eia panaikinti suplanuot\u0105 arba nutraukti vykdom\u0105 darb\u0105.
AbstractProject.AssignedLabelString.InvalidBooleanExpression=\
Netinkama login\u0117 i\u0161rai\u0161ka: {0}
AbstractProject.AssignedLabelString.NoMatch=\
N\u0117ra \u0161io priskyrimo atitinkan\u010dio agento/debesies
AbstractProject.CustomWorkspaceEmpty=Savas darbalaukis tu\u0161\u010dias.
AbstractProject.LabelLink=<a href="{0}{2}">Etiket\u0119 {1}</a> aptarnauja {3,choice,0#no nodes|1#1 node|1<{3} nodes}{4,choice,0#|1# and 1 cloud|1< and {4} clouds}
Api.MultipleMatch=XPath "{0}" atitiko {1} mazgus. \
Sukurkite XPath, kuris atitinka tik vien\u0105 mazg\u0105 arba naudokite \u201eapgaubiant\u012f\u201c u\u017eklausos parametr\u0105, kuris visus juos apgaubt\u0173 po \u0161akniniu elementu.
......@@ -151,6 +145,12 @@ Job.you_must_use_the_save_button_if_you_wish=J\u016bs privalote naudoti Save myg
Label.GroupOf=grup\u0117 i\u0161 {0}
Label.InvalidLabel=netinkama etiket\u0117
Label.ProvisionedFrom=Apr\u016bpinta i\u0161 {0}
LabelExpression.InvalidBooleanExpression=\
Netinkama login\u0117 i\u0161rai\u0161ka: {0}
LabelExpression.LabelLink=<a href="{0}{2}">Etiket\u0119 {1}</a> aptarnauja {3,choice,0#no nodes|1#1 node|1<{3} nodes}{4,choice,0#|1# and 1 cloud|1< and {4} clouds}
LabelExpression.NoMatch=\
N\u0117ra \u0161io priskyrimo atitinkan\u010dio agento/debesies
LabelExpression.NoMatch_DidYouMean=N\u0117ra agento/debesies, atitinkan\u010dio \u0161\u012f argument\u0105. Ar tur\u0117jote omenyje \u201e{1}\u201c, o ne \u201e{0}\u201c?
ManageJenkinsAction.DisplayName=Tvarkyti Jenkins\u0105
MultiStageTimeSeries.EMPTY_STRING=
Queue.AllNodesOffline=Visi etiket\u0117s \u201e{0}\u201c mazgai yra atsijung\u0119
......
......@@ -371,7 +371,7 @@ Run.ArtifactsPermission.Description=Esta permiss\u00e3o permite a habilidade de
builds. Se voc\u00ea n\u00e3o quer que um usu\u00e1rio accesse os artefatos, voc\u00ea pode \
revogar esta permiss\u00e3o.
# Invalid boolean expression: {0}
AbstractProject.AssignedLabelString.InvalidBooleanExpression=Espress\u00e3o booleana inv\u00e1lida: {0}
LabelExpression.InvalidBooleanExpression=Espress\u00e3o booleana inv\u00e1lida: {0}
# originally caused by:
Cause.UpstreamCause.CausedBy=originalmente causado por:
# Invalid token provided.
......
......@@ -9,7 +9,6 @@ AbstractItem.NoSuchJobExists=\u041D\u0435 \u043F\u043E\u0441\u0442\u043E\u0458\u
AbstractItem.NoSuchJobExistsWithoutSuggestion=\u041D\u0435 \u043F\u043E\u0441\u0442\u043E\u0458\u0438 \u0437\u0430\u0434\u0430\u0442\u0430\u043A \u0441\u0430 \u0438\u043C\u0435\u043D\u043E\u043C "{0}".
AbstractItem.Pronoun=\u043E\u0431\u0458\u0435\u043A\u0430\u0442
AbstractItem.NewNameInUse=\u0418\u043C\u0435 {0} \u0458\u0435 \u0437\u0430\u0443\u0437\u0435\u0442\u043E.
AbstractProject.AssignedLabelString_NoMatch_DidYouMean=\u041D\u0435\u043C\u0430 \u0442\u0430\u043A\u0432\u043E\u0433 \u0430\u0433\u0435\u043D\u0442\u0430/cloud. \u0414\u0430 \u043B\u0438 \u0441\u0442\u0435 \u043C\u0438\u0441\u043B\u0438\u043B\u0438 "{1}" \u043D\u0430 \u0443\u043C\u0443 \u0443\u043C\u0435\u0441\u0442\u043E "{0}"?
AbstractProject.NewBuildForWorkspace=\u0417\u0430\u043A\u0430\u0437\u0438\u0432\u0430\u045A\u0435 \u043D\u043E\u0432\u0435 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 \u0434\u0430 \u0431\u0438 \u0441\u0435 \u0434\u043E\u0431\u0438\u043E \u043D\u043E\u0432\u0438 \u0440\u0430\u0434\u043D\u0438 \u043F\u0440\u043E\u0441\u0442\u043E\u0440.
AbstractProject.Pronoun=\u041F\u0440\u043E\u0458\u0435\u043A\u0430\u0442
AbstractProject.AwaitingWorkspaceToComeOnline=\u041F\u043E\u043A\u0440\u0435\u043D\u0438\u0442\u0435 \u043D\u043E\u0432\u0443 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0443 \u0434\u0430 \u0431\u0438 \u0441\u0442\u0435 \u0434\u043E\u0431\u0438\u043B\u0438 \u0440\u0430\u0434\u043D\u0438 \u043F\u0440\u043E\u0441\u0442\u043E\u0440. \u0427\u0435\u043A\u0430\u045A\u0435 {0}ms \u0441\u0430 \u043D\u0430\u0434\u043E\u043C \u0434\u0430 \u045B\u0435 \u0458\u0435\u043D\u0430\u043D \u0431\u0438\u0442\u0438 \u043E\u0441\u043B\u043E\u0431\u043E\u0452\u0435\u043D.
......@@ -57,10 +56,7 @@ AbstractProject.ExtendedReadPermission.Description=\u041E\u0432\u043E \u043F\u04
AbstractProject.DiscoverPermission.Description=\u041E\u0432\u043E \u0434\u0430\u0458\u0435 \u043F\u0440\u0430\u0432\u043E \u043D\u0430 \u043E\u0442\u043A\u0440\u0438\u0432\u0430\u045A\u0435 \u0437\u0430\u0434\u0430\u0442\u0430\u043A\u0430, \u043A\u043E\u0458\u0438 \u043E\u043C\u043E\u0433\u0443\u045B\u0430\u0432\u0430 \u043F\u0440\u0435\u0443\u0441\u043C\u0435\u0440\u0430\u0432\u0430\u045A\u0435 \u0430\u043D\u043E\u043D\u0438\u043C\u043D\u0435 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u043A\u0435 \u043D\u0430 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0443 \u0437\u0430 \u043F\u0440\u0438\u0458\u0430\u0432\u0443 \u043A\u0430\u0434\u0430 \u0431\u0443\u0434\u0443 \u043F\u043E\u043A\u0443\u0448\u0430\u0432\u0430\u043B\u0438 \u0434\u0430 \u043E\u0442\u0432\u043E\u0440\u0435 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0443 \u043E\u0434\u0440\u0435\u0452\u0435\u043D\u043E\u0433 \u0437\u0430\u0434\u0430\u0442\u043A\u0430. \u0410\u043A\u043E \u043D\u0435\u043C\u0430\u0458\u0443 \u0434\u043E\u0432\u043B\u0430\u045B\u0435\u045A\u0435 \u043E\u043D\u0438 \u045B\u0435 \u0431\u0438\u0442\u0438 \u043F\u0440\u0435\u0443\u0441\u043C\u0435\u0440\u0435\u043D\u0438 \u0433\u0440\u0435\u0448\u0446\u0438 404 \u0438 \u043D\u0435\u045B\u0435 \u043C\u043E\u045B\u0438 \u043F\u0440\u0438\u0441\u0442\u0443\u043F\u0438\u0442\u0438 \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u043E\u043C.
AbstractProject.WipeOutPermission.Description=\u041E\u0432\u043E \u0434\u0430\u0458\u0435 \u043F\u0440\u0430\u0432\u043E \u0434\u0430 \u0443\u043A\u043B\u043E\u043D\u0438\u0442\u0435 \u0441\u0430\u0432 \u0441\u0430\u0434\u0440\u0436\u0430\u0458 \u0440\u0430\u0434\u043D\u043E\u0433 \u043F\u0440\u043E\u0441\u0442\u043E\u0440\u0430.
AbstractProject.CancelPermission.Description=\u041E\u0432\u043E \u0434\u0430\u0458\u0435 \u043F\u0440\u0430\u0432\u043E \u0434\u0430 \u043E\u0442\u043A\u0430\u0436\u0435\u0442\u0435 \u043F\u043B\u0430\u043D\u0438\u0440\u0430\u043D\u0435 \u0438 \u0437\u0430\u0443\u0441\u0442\u0430\u0432\u0438\u0442\u0435 \u043F\u043E\u043A\u0440\u0435\u043D\u0443\u0442\u0435 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435.
AbstractProject.AssignedLabelString.NoMatch=\u041D\u0435\u043C\u0430 \u0430\u0433\u0435\u043D\u0442/cloud \u0437\u0430\u0434\u0443\u0436\u0435\u043D \u043E\u0432\u0438\u043C \u0437\u0430\u0434\u0430\u0442\u043A\u043E\u043C
AbstractProject.AssignedLabelString.InvalidBooleanExpression=\u041F\u043E\u0433\u0440\u0435\u0448\u043D\u0438 \u0431\u0443\u043B\u043E\u0432 \u0438\u0437\u0440\u0430\u0437: {0}
AbstractProject.CustomWorkspaceEmpty=\u041F\u0440\u0438\u043B\u0430\u0433\u043E\u0452\u0435\u043D\u0438 \u0440\u0430\u0434\u043D\u0438 \u043F\u0440\u043E\u0441\u0442\u043E\u0440 \u0458\u0435 \u043F\u0440\u0430\u0437\u0430\u043D.
AbstractProject.LabelLink=<a href="{0}{2}">\u041B\u0430\u0431\u0435\u043B\u0430 {1}</a> \u0458\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u0438\u0440\u0430\u043D\u0430 {3,choice,0#\u043D\u0435\u043C\u0430 \u043C\u0430\u0448\u0438\u043D\u0430|1#1 \u043C\u0430\u0448\u0438\u043D\u0430|1<{3} \u043C\u0430\u0448\u0438\u043D\u0430\u043C\u0430}{4,choice,0#|1# \u0438 1 cloud|1< \u0438 {4} clouds}
Api.MultipleMatch=\u0418\u0437\u0440\u0430\u0437 \u043A\u0440\u043E\u0437 XPath "{0}" \u043E\u0434\u0433\u043E\u0432\u0430\u0440\u0430 \u043C\u0430\u0448\u0438\u043D\u0438 {1}. \u0423\u043D\u0435\u0441\u0438\u0442\u0435 \u0438\u0437\u0440\u0430\u0437 \u0438\u043B\u0438 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0430\u0440 "wrapper", \u0434\u0430 \u0438\u0445 \u0441\u0432\u0435 \u043F\u043E\u043A\u0440\u0438\u0458\u0435 \u0433\u043B\u0430\u0432\u043D\u0438 \u0435\u043B\u0435\u043C\u0435\u043D\u0442.
Api.NoXPathMatch=\u0418\u0437\u0440\u0430\u0437 \u043A\u0440\u043E\u0437 XPath "{0}" \u043D\u0438\u0458\u0435 \u043D\u0430\u0448\u0430\u043E \u043D\u0438 \u0458\u0435\u0434\u043D\u0443 \u043C\u0430\u0448\u0438\u043D\u0443.
BallColor.Aborted=\u041E\u0442\u043A\u0430\u0437\u0430\u043D\u043E
......@@ -137,6 +133,10 @@ Job.you_must_use_the_save_button_if_you_wish=\u0414\u0430 \u043F\u0440\u0435\u04
Label.GroupOf=\u0433\u0440\u0443\u043F\u0430 {0}
Label.InvalidLabel=\u043D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u043D\u0430 \u043B\u0430\u0431\u0435\u043B\u0430
Label.ProvisionedFrom=\u041D\u0430\u0431\u0430\u0432\u0459\u0435\u043D\u043E \u043E\u0434 {0}
LabelExpression.InvalidBooleanExpression=\u041F\u043E\u0433\u0440\u0435\u0448\u043D\u0438 \u0431\u0443\u043B\u043E\u0432 \u0438\u0437\u0440\u0430\u0437: {0}
LabelExpression.LabelLink=<a href="{0}{2}">\u041B\u0430\u0431\u0435\u043B\u0430 {1}</a> \u0458\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u0438\u0440\u0430\u043D\u0430 {3,choice,0#\u043D\u0435\u043C\u0430 \u043C\u0430\u0448\u0438\u043D\u0430|1#1 \u043C\u0430\u0448\u0438\u043D\u0430|1<{3} \u043C\u0430\u0448\u0438\u043D\u0430\u043C\u0430}{4,choice,0#|1# \u0438 1 cloud|1< \u0438 {4} clouds}
LabelExpression.NoMatch=\u041D\u0435\u043C\u0430 \u0430\u0433\u0435\u043D\u0442/cloud \u0437\u0430\u0434\u0443\u0436\u0435\u043D \u043E\u0432\u0438\u043C \u0437\u0430\u0434\u0430\u0442\u043A\u043E\u043C
LabelExpression.NoMatch_DidYouMean=\u041D\u0435\u043C\u0430 \u0442\u0430\u043A\u0432\u043E\u0433 \u0430\u0433\u0435\u043D\u0442\u0430/cloud. \u0414\u0430 \u043B\u0438 \u0441\u0442\u0435 \u043C\u0438\u0441\u043B\u0438\u043B\u0438 "{1}" \u043D\u0430 \u0443\u043C\u0443 \u0443\u043C\u0435\u0441\u0442\u043E "{0}"?
ManageJenkinsAction.DisplayName=\u0423\u043F\u0440\u0430\u0432\u0459\u0430\u045A\u0435 Jenkins-\u043E\u043C
MultiStageTimeSeries.EMPTY_STRING=
Queue.AllNodesOffline=\u0421\u0432\u0435 \u043C\u0430\u0448\u0438\u043D\u0435 \u0441\u0430 \u043B\u0430\u0431\u0435\u043B\u043E\u043C \u2018{0}\u2019 \u0441\u0443 \u0432\u0430\u043D \u043C\u0440\u0435\u0436\u0435
......
......@@ -59,9 +59,6 @@ AbstractProject.WipeOutPermission.Description=\
\u6388\u8207\u6e05\u7a7a\u5de5\u4f5c\u5340\u7684\u6b0a\u9650\u3002
AbstractProject.CancelPermission.Description=\
\u6388\u8207\u53d6\u6d88\u5efa\u7f6e\u7684\u80fd\u529b\u3002
AbstractProject.AssignedLabelString.InvalidBooleanExpression=\
\u7121\u6548\u7684\u5e03\u6797\u8868\u793a\u5f0f: {0} \
\u6c92\u6709\u7b26\u5408\u7684\u7bc0\u9ede
AbstractProject.CustomWorkspaceEmpty=\u81ea\u8a02\u5de5\u4f5c\u5340\u662f\u7a7a\u7684\u3002
Api.MultipleMatch=XPath "{0}" \u6bd4\u5c0d\u51fa {1} \u500b\u7bc0\u9ede\u3002\
......@@ -145,6 +142,9 @@ Job.NoRenameWhileBuilding=\u4f5c\u696d\u5efa\u7f6e\u4e2d\uff0c\u7121\u6cd5\u6539
Label.GroupOf={0} \u7fa4\u7d44
Label.InvalidLabel=\u6a19\u7c64\u7121\u6548
Label.ProvisionedFrom=\u7531 {0} \u63d0\u4f9b
LabelExpression.InvalidBooleanExpression=\
\u7121\u6548\u7684\u5e03\u6797\u8868\u793a\u5f0f: {0} \
\u6c92\u6709\u7b26\u5408\u7684\u7bc0\u9ede
ManageJenkinsAction.DisplayName=\u7ba1\u7406 Jenkins
Node.BecauseNodeIsReserved={0} \u4fdd\u7559\u7d66\u9650\u5b9a\u7bc0\u9ede\u7684\u4f5c\u696d
Node.LabelMissing={0} \u6c92\u6709\u6a19\u7c64 {1}
......
......@@ -22,15 +22,15 @@
* THE SOFTWARE.
*/
package hudson.model;
package jenkins.model.labels;
import java.util.List;
import java.util.Arrays;
import java.util.Collection;
import org.junit.runners.Parameterized;
import org.junit.runner.RunWith;
import hudson.model.AbstractProject.AbstractProjectDescriptor.AutoCompleteSeeder;
import java.util.List;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import static org.junit.Assert.assertEquals;
/**
......@@ -38,11 +38,11 @@ import static org.junit.Assert.assertEquals;
* @author dty
*/
@RunWith(Parameterized.class)
public class AutoCompleteSeederTest {
public class LabelAutoCompleteSeederTest {
public static class TestData {
private String seed;
private List<String> expected;
private final String seed;
private final List<String> expected;
public TestData(String seed, String... expected) {
this.seed = seed;
......@@ -69,18 +69,18 @@ public class AutoCompleteSeederTest {
});
}
private String seed;
private List<String> expected;
private final String seed;
private final List<String> expected;
public AutoCompleteSeederTest(TestData dataSet) {
public LabelAutoCompleteSeederTest(TestData dataSet) {
this.seed = dataSet.seed;
this.expected = dataSet.expected;
}
@Test
public void testAutoCompleteSeeds() throws Exception {
AutoCompleteSeeder seeder = new AbstractProject.AbstractProjectDescriptor.AutoCompleteSeeder(seed);
LabelAutoCompleteSeeder seeder = new LabelAutoCompleteSeeder(seed);
assertEquals(expected, seeder.getSeeds());
}
}
\ No newline at end of file
......@@ -37,7 +37,6 @@ import hudson.model.AbstractProject;
import hudson.model.BuildListener;
import hudson.model.FreeStyleBuild;
import hudson.model.FreeStyleProject;
import hudson.model.FreeStyleProject.DescriptorImpl;
import hudson.model.Label;
import hudson.model.Node.Mode;
import hudson.slaves.DumbSlave;
......@@ -255,15 +254,13 @@ public class LabelExpressionTest {
public void formValidation() throws Exception {
j.executeOnServer(new Callable<Object>() {
public Object call() throws Exception {
DescriptorImpl d = j.jenkins.getDescriptorByType(DescriptorImpl.class);
Label l = j.jenkins.getLabel("foo");
DumbSlave s = j.createSlave(l);
String msg = d.doCheckLabel(null, "goo").renderHtml();
String msg = LabelExpression.validate("goo").renderHtml();
assertTrue(msg.contains("foo"));
assertTrue(msg.contains("goo"));
msg = d.doCheckLabel(null, "master && goo").renderHtml();
msg = LabelExpression.validate("master && goo").renderHtml();
assertTrue(msg.contains("foo"));
assertTrue(msg.contains("goo"));
return null;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册