Archiving of symlinks as artifacts did not work in some cases.
@@ -70,7 +91,6 @@ Upcoming changes
Slow rendering of directories with many entries in remote workspaces.
(issue 21780)
{
/**
* Set if we want the blame information to flow from upstream to downstream build.
@@ -156,22 +156,7 @@ public abstract class AbstractBuild
,R extends Abs
*/
protected transient List buildEnvironments;
- /**
- * Pointers to form bi-directional link between adjacent {@link AbstractBuild}s.
- *
- *
- * Unlike {@link Run}, {@link AbstractBuild}s do lazy-loading, so we don't use
- * {@link Run#previousBuild} and {@link Run#nextBuild}, and instead use these
- * fields and point to {@link #selfReference} (or {@link #none}) of adjacent builds.
- */
- private volatile transient BuildReference previousBuild, nextBuild;
-
- @SuppressWarnings({"unchecked", "rawtypes"}) private static final BuildReference NONE = new BuildReference("NONE", null);
- @SuppressWarnings("unchecked") private BuildReference none() {return NONE;}
-
- /*package*/ final transient BuildReference selfReference = new BuildReference(getId(),_this());
-
-
+ private transient LazyBuildMixIn.RunMixIn
runMixIn;
protected AbstractBuild(P job) throws IOException {
super(job);
@@ -189,80 +174,33 @@ public abstract class AbstractBuild
,R extends Abs
return getParent();
}
- @Override
- void dropLinks() {
- super.dropLinks();
+ @Override public final synchronized LazyBuildMixIn.RunMixIn
getRunMixIn() {
+ if (runMixIn == null) {
+ runMixIn = new LazyBuildMixIn.RunMixIn
() {
+ @Override protected R asRun() {
+ return _this();
+ }
+ };
+ }
+ return runMixIn;
+ }
- if(nextBuild!=null) {
- AbstractBuild nb = nextBuild.get();
- if (nb!=null) {
- nb.previousBuild = previousBuild;
- }
- }
- if(previousBuild!=null) {
- AbstractBuild pb = previousBuild.get();
- if (pb!=null) pb.nextBuild = nextBuild;
- }
+ @Override protected final BuildReference createReference() {
+ return getRunMixIn().createReference();
+ }
+
+ @Override protected final void dropLinks() {
+ getRunMixIn().dropLinks();
}
@Override
public R getPreviousBuild() {
- while (true) {
- BuildReference r = previousBuild; // capture the value once
-
- if (r==null) {
- // having two neighbors pointing to each other is important to make RunMap.removeValue work
- P _parent = getParent();
- if (_parent == null) {
- throw new IllegalStateException("no parent for " + number + " in " + workspace);
- }
- R pb = _parent._getRuns().search(number-1, Direction.DESC);
- if (pb!=null) {
- ((AbstractBuild)pb).nextBuild = selfReference; // establish bi-di link
- this.previousBuild = pb.selfReference;
- return pb;
- } else {
- this.previousBuild = none();
- return null;
- }
- }
- if (r==none())
- return null;
-
- R referent = r.get();
- if (referent!=null) return referent;
-
- // the reference points to a GC-ed object, drop the reference and do it again
- this.previousBuild = null;
- }
+ return getRunMixIn().getPreviousBuild();
}
@Override
public R getNextBuild() {
- while (true) {
- BuildReference r = nextBuild; // capture the value once
-
- if (r==null) {
- // having two neighbors pointing to each other is important to make RunMap.removeValue work
- R nb = getParent().builds.search(number+1, Direction.ASC);
- if (nb!=null) {
- ((AbstractBuild)nb).previousBuild = selfReference; // establish bi-di link
- this.nextBuild = nb.selfReference;
- return nb;
- } else {
- this.nextBuild = none();
- return null;
- }
- }
- if (r==none())
- return null;
-
- R referent = r.get();
- if (referent!=null) return referent;
-
- // the reference points to a GC-ed object, drop the reference and do it again
- this.nextBuild = null;
- }
+ return getRunMixIn().getNextBuild();
}
/**
diff --git a/core/src/main/java/hudson/model/AbstractItem.java b/core/src/main/java/hudson/model/AbstractItem.java
index 20f21850db..92f369b7f9 100644
--- a/core/src/main/java/hudson/model/AbstractItem.java
+++ b/core/src/main/java/hudson/model/AbstractItem.java
@@ -52,6 +52,8 @@ import org.kohsuke.stapler.export.ExportedBean;
import java.io.File;
import java.io.IOException;
import java.util.Collection;
+import java.util.List;
+import java.util.ListIterator;
import javax.annotation.Nonnull;
import org.kohsuke.stapler.StaplerRequest;
@@ -71,6 +73,7 @@ import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import static javax.servlet.http.HttpServletResponse.SC_BAD_REQUEST;
+import org.kohsuke.stapler.Ancestor;
/**
* Partial default implementation of {@link Item}.
@@ -487,8 +490,23 @@ public abstract class AbstractItem extends Actionable implements Item, HttpDelet
@RequirePOST
public void doDoDelete( StaplerRequest req, StaplerResponse rsp ) throws IOException, ServletException, InterruptedException {
delete();
- if (rsp != null) // null for CLI
- rsp.sendRedirect2(req.getContextPath()+"/"+getParent().getUrl());
+ if (req == null || rsp == null) { // CLI
+ return;
+ }
+ List ancestors = req.getAncestors();
+ ListIterator it = ancestors.listIterator(ancestors.size());
+ String url = getParent().getUrl(); // fallback but we ought to get to Jenkins.instance at the root
+ while (it.hasPrevious()) {
+ Object a = it.previous().getObject();
+ if (a instanceof View) {
+ url = ((View) a).getUrl();
+ break;
+ } else if (a instanceof ViewGroup) {
+ url = ((ViewGroup) a).getUrl();
+ break;
+ }
+ }
+ rsp.sendRedirect2(req.getContextPath() + '/' + url);
}
public void delete( StaplerRequest req, StaplerResponse rsp ) throws IOException, ServletException {
@@ -586,6 +604,7 @@ public abstract class AbstractItem extends Actionable implements Item, HttpDelet
}
// try to reflect the changes by reloading
+ doReload();
new XmlFile(Items.XSTREAM, out.getTemporaryFile()).unmarshal(this);
Items.whileUpdatingByXml(new Callable() {
@Override public Void call() throws IOException {
@@ -603,6 +622,34 @@ public abstract class AbstractItem extends Actionable implements Item, HttpDelet
}
}
+ /**
+ * Reloads this job from the disk.
+ *
+ * Exposed through CLI as well.
+ *
+ * TODO: think about exposing this to UI
+ *
+ * @since 1.556
+ */
+ @CLIMethod(name="reload-job")
+ @RequirePOST
+ public void doReload() throws IOException {
+ checkPermission(CONFIGURE);
+
+ // try to reflect the changes by reloading
+ getConfigFile().unmarshal(this);
+ Items.whileUpdatingByXml(new Callable() {
+ @Override
+ public Void call() throws IOException {
+ onLoad(getParent(), getRootDir().getName());
+ return null;
+ }
+ });
+ Jenkins.getInstance().rebuildDependencyGraphAsync();
+
+ SaveableListener.fireOnChange(this, getConfigFile());
+ }
+
/* (non-Javadoc)
* @see hudson.model.AbstractModelObject#getSearchName()
diff --git a/core/src/main/java/hudson/model/AbstractProject.java b/core/src/main/java/hudson/model/AbstractProject.java
index 7271a76e80..a34f874bf3 100644
--- a/core/src/main/java/hudson/model/AbstractProject.java
+++ b/core/src/main/java/hudson/model/AbstractProject.java
@@ -32,7 +32,6 @@ import com.infradna.tool.bridge_method_injector.WithBridgeMethods;
import hudson.AbortException;
import hudson.CopyOnWrite;
import hudson.EnvVars;
-import hudson.Extension;
import hudson.ExtensionPoint;
import hudson.FeedAdapter;
import hudson.FilePath;
@@ -42,21 +41,17 @@ import hudson.Util;
import hudson.cli.declarative.CLIMethod;
import hudson.cli.declarative.CLIResolver;
import hudson.model.Cause.LegacyCodeCause;
-import hudson.model.Cause.RemoteCause;
-import hudson.model.Cause.UserIdCause;
import hudson.model.Descriptor.FormException;
import hudson.model.Fingerprint.RangeSet;
import hudson.model.PermalinkProjectAction.Permalink;
import hudson.model.Queue.Executable;
import hudson.model.Queue.Task;
-import hudson.model.RunMap.Constructor;
import hudson.model.labels.LabelAtom;
import hudson.model.labels.LabelExpression;
import hudson.model.listeners.ItemListener;
import hudson.model.listeners.SCMPollListener;
import hudson.model.queue.CauseOfBlockage;
import hudson.model.queue.QueueTaskFuture;
-import hudson.model.queue.ScheduleResult;
import hudson.model.queue.SubTask;
import hudson.model.queue.SubTaskContributor;
import hudson.node_monitors.DiskSpaceMonitor;
@@ -86,11 +81,9 @@ import hudson.util.AlternativeUiTextProvider.Message;
import hudson.util.DescribableList;
import hudson.util.FormValidation;
import hudson.util.TimeUnit2;
-import hudson.widgets.BuildHistoryWidget;
import hudson.widgets.HistoryWidget;
import java.io.File;
import java.io.IOException;
-import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
@@ -100,7 +93,6 @@ import java.util.Comparator;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
-import java.util.ListIterator;
import java.util.Map;
import java.util.Set;
import java.util.SortedMap;
@@ -113,12 +105,12 @@ import java.util.logging.Logger;
import javax.annotation.CheckForNull;
import javax.annotation.Nonnull;
import javax.servlet.ServletException;
-import static javax.servlet.http.HttpServletResponse.*;
import jenkins.model.Jenkins;
import jenkins.model.JenkinsLocationConfiguration;
import jenkins.model.ModelObjectWithChildren;
+import jenkins.model.ParameterizedJobMixIn;
import jenkins.model.Uptime;
-import jenkins.model.lazy.AbstractLazyLoadRunMap.Direction;
+import jenkins.model.lazy.LazyBuildMixIn;
import jenkins.scm.DefaultSCMCheckoutStrategyImpl;
import jenkins.scm.SCMCheckoutStrategy;
import jenkins.scm.SCMCheckoutStrategyDescriptor;
@@ -129,16 +121,13 @@ import org.acegisecurity.context.SecurityContext;
import org.acegisecurity.context.SecurityContextHolder;
import org.jenkinsci.bytecode.AdaptField;
import org.kohsuke.accmod.Restricted;
-import org.kohsuke.accmod.restrictions.DoNotUse;
import org.kohsuke.accmod.restrictions.NoExternalUse;
import org.kohsuke.args4j.Argument;
import org.kohsuke.args4j.CmdLineException;
-import org.kohsuke.stapler.Ancestor;
import org.kohsuke.stapler.AncestorInPath;
import org.kohsuke.stapler.ForwardToView;
import org.kohsuke.stapler.HttpRedirect;
import org.kohsuke.stapler.HttpResponse;
-import org.kohsuke.stapler.HttpResponses;
import org.kohsuke.stapler.QueryParameter;
import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerResponse;
@@ -154,7 +143,7 @@ import org.kohsuke.stapler.interceptor.RequirePOST;
* @see AbstractBuild
*/
@SuppressWarnings("rawtypes")
-public abstract class AbstractProject
,R extends AbstractBuild
> extends Job
implements BuildableItem, ModelObjectWithChildren {
+public abstract class AbstractProject
buildMixIn;
+
/**
* All the builds keyed by their build number.
- *
+ * Kept here for binary compatibility only; otherwise use {@link #buildMixIn}.
* External code should use {@link #getBuildByNumber(int)} or {@link #getLastBuild()} and traverse via
* {@link Run#getPreviousBuild()}
*/
@Restricted(NoExternalUse.class)
- @SuppressWarnings("deprecation") // [JENKINS-15156] builds accessed before onLoad or onCreatedFromScratch called
- protected transient RunMap builds = new RunMap();
+ protected transient RunMap builds;
/**
* The quiet period. Null to delegate to the system default.
@@ -274,6 +264,8 @@ public abstract class AbstractProject
,R extends A
protected AbstractProject(ItemGroup parent, String name) {
super(parent,name);
+ buildMixIn = createBuildMixIn();
+ builds = buildMixIn.getRunMap();
if(Jenkins.getInstance()!=null && !Jenkins.getInstance().getNodes().isEmpty()) {
// if a new job is configured with Hudson that already has slave nodes
@@ -282,6 +274,31 @@ public abstract class AbstractProject
getParameterizedJobMixIn() {
+ return new ParameterizedJobMixIn
() {
+ @SuppressWarnings("unchecked") // untypable
+ @Override protected P asJob() {
+ return (P) AbstractProject.this;
+ }
+ };
+ }
+
@Override
public synchronized void save() throws IOException {
super.save();
@@ -291,7 +308,8 @@ public abstract class AbstractProject
,R extends A
@Override
public void onCreatedFromScratch() {
super.onCreatedFromScratch();
- builds = createBuildRunMap();
+ buildMixIn.onCreatedFromScratch();
+ builds = buildMixIn.getRunMap();
// solicit initial contributions, especially from TransientProjectActionFactory
updateTransientActions();
}
@@ -299,33 +317,11 @@ public abstract class AbstractProject
,R extends A
@Override
public void onLoad(ItemGroup extends Item> parent, String name) throws IOException {
super.onLoad(parent, name);
-
- RunMap builds = createBuildRunMap();
-
- RunMap currentBuilds = this.builds;
-
- if (currentBuilds==null && parent!=null) {
- // are we overwriting what currently exist?
- // this is primarily when Jenkins is getting reloaded
- Item current;
- try {
- current = parent.getItem(name);
- } catch (RuntimeException x) {
- LOGGER.log(Level.WARNING, "failed to look up " + name + " in " + parent, x);
- current = null;
- }
- if (current!=null && current.getClass()==getClass()) {
- currentBuilds = ((AbstractProject)current).builds;
- }
+ if (buildMixIn == null) {
+ buildMixIn = createBuildMixIn();
}
- if (currentBuilds !=null) {
- // if we are reloading, keep all those that are still building intact
- for (R r : currentBuilds.getLoadedBuilds().values()) {
- if (r.isBuilding())
- builds.put(r);
- }
- }
- this.builds = builds;
+ buildMixIn.onLoad(parent, name);
+ builds = buildMixIn.getRunMap();
triggers().setOwner(this);
for (Trigger t : triggers()) {
t.start(this, Items.currentlyUpdatingByXml());
@@ -338,14 +334,6 @@ public abstract class AbstractProject
,R extends A
updateTransientActions();
}
- private RunMap createBuildRunMap() {
- return new RunMap(getBuildDir(), new Constructor() {
- public R create(File dir) throws IOException {
- return loadBuild(dir);
- }
- });
- }
-
@WithBridgeMethods(List.class)
protected DescribableList,TriggerDescriptor> triggers() {
if (triggers == null) {
@@ -476,7 +464,7 @@ public abstract class AbstractProject
,R extends A
* @since 1.401
*/
public String getBuildNowText() {
- return AlternativeUiTextProvider.get(BUILD_NOW_TEXT, this, isParameterized() ? Messages.AbstractProject_build_with_parameters() : Messages.AbstractProject_BuildNow());
+ return AlternativeUiTextProvider.get(BUILD_NOW_TEXT, this, getParameterizedJobMixIn().getBuildNowText());
}
/**
@@ -866,7 +854,7 @@ public abstract class AbstractProject
,R extends A
* Use {@link #scheduleBuild(Cause)}. Since 1.283
*/
public boolean scheduleBuild() {
- return scheduleBuild(new LegacyCodeCause());
+ return getParameterizedJobMixIn().scheduleBuild();
}
/**
@@ -874,7 +862,7 @@ public abstract class AbstractProject
,R extends A
* Use {@link #scheduleBuild(int, Cause)}. Since 1.283
*/
public boolean scheduleBuild(int quietPeriod) {
- return scheduleBuild(quietPeriod, new LegacyCodeCause());
+ return getParameterizedJobMixIn().scheduleBuild(quietPeriod);
}
/**
@@ -885,11 +873,11 @@ public abstract class AbstractProject
,R extends A
* false if the task was rejected from the queue (such as when the system is being shut down.)
*/
public boolean scheduleBuild(Cause c) {
- return scheduleBuild(getQuietPeriod(), c);
+ return getParameterizedJobMixIn().scheduleBuild(c);
}
public boolean scheduleBuild(int quietPeriod, Cause c) {
- return scheduleBuild(quietPeriod, c, new Action[0]);
+ return getParameterizedJobMixIn().scheduleBuild(quietPeriod, c);
}
/**
@@ -931,44 +919,11 @@ public abstract class AbstractProject
,R extends A
@SuppressWarnings("unchecked")
@WithBridgeMethods(Future.class)
public QueueTaskFuture scheduleBuild2(int quietPeriod, Cause c, Collection extends Action> actions) {
- if (!isBuildable())
- return null;
-
List queueActions = new ArrayList(actions);
- if (isParameterized() && Util.filter(queueActions, ParametersAction.class).isEmpty()) {
- queueActions.add(new ParametersAction(getDefaultParametersValues()));
- }
-
if (c != null) {
queueActions.add(new CauseAction(c));
}
-
- ScheduleResult i = Jenkins.getInstance().getQueue().schedule2(this, quietPeriod, queueActions);
- if(i.isAccepted())
- return (QueueTaskFuture)i.getItem().getFuture();
- return null;
- }
-
- private List getDefaultParametersValues() {
- ParametersDefinitionProperty paramDefProp = getProperty(ParametersDefinitionProperty.class);
- ArrayList defValues = new ArrayList();
-
- /*
- * This check is made ONLY if someone will call this method even if isParametrized() is false.
- */
- if(paramDefProp == null)
- return defValues;
-
- /* Scan for all parameter with an associated default values */
- for(ParameterDefinition paramDefinition : paramDefProp.getParameterDefinitions())
- {
- ParameterValue defaultValue = paramDefinition.getDefaultParameterValue();
-
- if(defaultValue != null)
- defValues.add(defaultValue);
- }
-
- return defValues;
+ return getParameterizedJobMixIn().scheduleBuild2(quietPeriod, queueActions.toArray(new Action[queueActions.size()]));
}
/**
@@ -1039,18 +994,12 @@ public abstract class AbstractProject
,R extends A
@Override
public RunMap _getRuns() {
- if (builds == null) {
- throw new IllegalStateException("no run map created yet for " + this);
- }
- assert builds.baseDirInitialized() : "neither onCreatedFromScratch nor onLoad called on " + this + " yet";
- return builds;
+ return buildMixIn._getRuns();
}
@Override
public void removeRun(R run) {
- if (!this.builds.remove(run)) {
- LOGGER.log(Level.WARNING, "{0} did not contain {1} to begin with", new Object[] {this, run});
- }
+ buildMixIn.removeRun(run);
}
/**
@@ -1060,7 +1009,7 @@ public abstract class AbstractProject
,R extends A
*/
@Override
public R getBuild(String id) {
- return builds.getById(id);
+ return buildMixIn.getBuild(id);
}
/**
@@ -1070,7 +1019,7 @@ public abstract class AbstractProject
,R extends A
*/
@Override
public R getBuildByNumber(int n) {
- return builds.getByNumber(n);
+ return buildMixIn.getBuildByNumber(n);
}
/**
@@ -1080,22 +1029,22 @@ public abstract class AbstractProject
,R extends A
*/
@Override
public R getFirstBuild() {
- return builds.oldestBuild();
+ return buildMixIn.getFirstBuild();
}
@Override
public @CheckForNull R getLastBuild() {
- return builds.newestBuild();
+ return buildMixIn.getLastBuild();
}
@Override
public R getNearestBuild(int n) {
- return builds.search(n, Direction.ASC);
+ return buildMixIn.getNearestBuild(n);
}
@Override
public R getNearestOldBuild(int n) {
- return builds.search(n, Direction.DESC);
+ return buildMixIn.getNearestOldBuild(n);
}
/**
@@ -1106,61 +1055,18 @@ public abstract class AbstractProject
,R extends A
*/
protected abstract Class getBuildClass();
- // keep track of the previous time we started a build
- private transient long lastBuildStartTime;
-
/**
* Creates a new build of this project for immediate execution.
*/
protected synchronized R newBuild() throws IOException {
- // make sure we don't start two builds in the same second
- // so the build directories will be different too
- long timeSinceLast = System.currentTimeMillis() - lastBuildStartTime;
- if (timeSinceLast < 1000) {
- try {
- Thread.sleep(1000 - timeSinceLast);
- } catch (InterruptedException e) {
- }
- }
- lastBuildStartTime = System.currentTimeMillis();
- try {
- R lastBuild = getBuildClass().getConstructor(getClass()).newInstance(this);
- builds.put(lastBuild);
- return lastBuild;
- } catch (InstantiationException e) {
- throw new Error(e);
- } catch (IllegalAccessException e) {
- throw new Error(e);
- } catch (InvocationTargetException e) {
- throw handleInvocationTargetException(e);
- } catch (NoSuchMethodException e) {
- throw new Error(e);
- }
- }
-
- private IOException handleInvocationTargetException(InvocationTargetException e) {
- Throwable t = e.getTargetException();
- if(t instanceof Error) throw (Error)t;
- if(t instanceof RuntimeException) throw (RuntimeException)t;
- if(t instanceof IOException) return (IOException)t;
- throw new Error(t);
+ return buildMixIn.newBuild();
}
/**
* Loads an existing build record from disk.
*/
protected R loadBuild(File dir) throws IOException {
- try {
- return getBuildClass().getConstructor(getClass(),File.class).newInstance(this,dir);
- } catch (InstantiationException e) {
- throw new Error(e);
- } catch (IllegalAccessException e) {
- throw new Error(e);
- } catch (InvocationTargetException e) {
- throw handleInvocationTargetException(e);
- } catch (NoSuchMethodException e) {
- throw new Error(e);
- }
+ return buildMixIn.loadBuild(dir);
}
/**
@@ -1692,7 +1598,7 @@ public abstract class AbstractProject
,R extends A
}
@SuppressWarnings("unchecked")
- public Map> getTriggers() {
+ @Override public Map> getTriggers() {
return triggers().toMap();
}
@@ -1812,19 +1718,16 @@ public abstract class AbstractProject
,R extends A
* Schedules a new build command.
*/
public void doBuild( StaplerRequest req, StaplerResponse rsp, @QueryParameter TimeDuration delay ) throws IOException, ServletException {
- if (delay==null) delay=new TimeDuration(getQuietPeriod());
-
- // if a build is parameterized, let that take over
- ParametersDefinitionProperty pp = getProperty(ParametersDefinitionProperty.class);
- if (pp != null && !req.getMethod().equals("POST")) {
- // show the parameter entry form.
- req.getView(pp, "index.jelly").forward(req, rsp);
- return;
- }
-
- BuildAuthorizationToken.checkPermission(this, authToken, req, rsp);
-
- if (pp != null) {
- pp._doBuild(req,rsp,delay);
- return;
- }
-
- if (!isBuildable())
- throw HttpResponses.error(SC_INTERNAL_SERVER_ERROR,new IOException(getFullName()+" is not buildable"));
-
- ScheduleResult r = Jenkins.getInstance().getQueue().schedule2(this, delay.getTime(), getBuildCause(req));
- if (r.isAccepted()) {
- rsp.sendRedirect(SC_CREATED,req.getContextPath()+'/'+r.getItem().getUrl());
- } else
- rsp.sendRedirect(".");
+ getParameterizedJobMixIn().doBuild(req, rsp, delay);
}
/** @deprecated use {@link #doBuild(StaplerRequest, StaplerResponse, TimeDuration)} */
@@ -1869,21 +1748,6 @@ public abstract class AbstractProject
,R extends A
doBuild(req, rsp, TimeDuration.fromString(req.getParameter("delay")));
}
- /**
- * Computes the build cause, using RemoteCause or UserCause as appropriate.
- */
- /*package*/ CauseAction getBuildCause(StaplerRequest req) {
- Cause cause;
- if (authToken != null && authToken.getToken() != null && req.getParameter("token") != null) {
- // Optional additional cause text when starting via token
- String causeText = req.getParameter("cause");
- cause = new RemoteCause(req.getRemoteAddr(), causeText);
- } else {
- cause = new UserIdCause();
- }
- return new CauseAction(cause);
- }
-
/**
* Computes the delay by taking the default value and the override in the request parameter into the account.
*
@@ -1909,15 +1773,7 @@ public abstract class AbstractProject
,R extends A
* Currently only String parameters are supported.
*/
public void doBuildWithParameters(StaplerRequest req, StaplerResponse rsp, @QueryParameter TimeDuration delay) throws IOException, ServletException {
- BuildAuthorizationToken.checkPermission(this, authToken, req, rsp);
-
- ParametersDefinitionProperty pp = getProperty(ParametersDefinitionProperty.class);
- if (pp != null) {
- pp.buildWithParameters(req,rsp,delay);
- } else {
- throw new IllegalStateException("This build is not parameterized!");
- }
-
+ getParameterizedJobMixIn().doBuildWithParameters(req, rsp, delay);
}
/** @deprecated use {@link #doBuildWithParameters(StaplerRequest, StaplerResponse, TimeDuration)} */
@@ -1940,37 +1796,9 @@ public abstract class AbstractProject
,R extends A
*/
@RequirePOST
public void doCancelQueue( StaplerRequest req, StaplerResponse rsp ) throws IOException, ServletException {
- checkPermission(ABORT);
-
- Jenkins.getInstance().getQueue().cancel(this);
- rsp.forwardToPreviousPage(req);
+ getParameterizedJobMixIn().doCancelQueue(req, rsp);
}
- /**
- * Deletes this project.
- */
- @Override
- @RequirePOST
- public void doDoDelete(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException, InterruptedException {
- delete();
- if (req == null || rsp == null)
- return;
- List ancestors = req.getAncestors();
- ListIterator it = ancestors.listIterator(ancestors.size());
- String url = getParent().getUrl(); // fallback but we ought to get to Jenkins.instance at the root
- while (it.hasPrevious()) {
- Object a = it.previous().getObject();
- if (a instanceof View) {
- url = ((View) a).getUrl();
- break;
- } else if (a instanceof ViewGroup) {
- url = ((ViewGroup) a).getUrl();
- break;
- }
- }
- rsp.sendRedirect2(req.getContextPath() + '/' + url);
- }
-
@Override
protected void submit(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException, FormException {
super.submit(req,rsp);
@@ -2426,14 +2254,4 @@ public abstract class AbstractProject
,R extends A
public abstract FormValidation check(@Nonnull AbstractProject, ?> project, @Nonnull Label label);
}
- @Restricted(DoNotUse.class)
- @Extension public static final class ItemListenerImpl extends ItemListener {
- @Override public void onLocationChanged(Item item, String oldFullName, String newFullName) {
- if (item instanceof AbstractProject) {
- AbstractProject p = (AbstractProject) item;
- p.builds.updateBaseDir(p.getBuildDir());
- }
- }
- }
-
}
diff --git a/core/src/main/java/hudson/model/BooleanParameterValue.java b/core/src/main/java/hudson/model/BooleanParameterValue.java
index 3caac05813..0fd4e513f4 100644
--- a/core/src/main/java/hudson/model/BooleanParameterValue.java
+++ b/core/src/main/java/hudson/model/BooleanParameterValue.java
@@ -52,7 +52,7 @@ public class BooleanParameterValue extends ParameterValue {
* Exposes the name/value as an environment variable.
*/
@Override
- public void buildEnvVars(AbstractBuild,?> build, EnvVars env) {
+ public void buildEnvironment(Run,?> build, EnvVars env) {
env.put(name,Boolean.toString(value));
env.put(name.toUpperCase(Locale.ENGLISH),Boolean.toString(value)); // backward compatibility pre 1.345
}
diff --git a/core/src/main/java/hudson/model/BuildAuthorizationToken.java b/core/src/main/java/hudson/model/BuildAuthorizationToken.java
index 1fba190925..da08b0b17e 100644
--- a/core/src/main/java/hudson/model/BuildAuthorizationToken.java
+++ b/core/src/main/java/hudson/model/BuildAuthorizationToken.java
@@ -42,7 +42,7 @@ import org.kohsuke.stapler.HttpResponses;
* @author Kohsuke Kawaguchi
* @see BuildableItem
* @deprecated 2008-07-20
- * Use {@link ACL} and {@link AbstractProject#BUILD}. This code is only here
+ * Use {@link ACL} and {@link Item#BUILD}. This code is only here
* for the backward compatibility.
*/
public final class BuildAuthorizationToken {
@@ -62,7 +62,7 @@ public final class BuildAuthorizationToken {
return null;
}
- public static void checkPermission(AbstractProject project, BuildAuthorizationToken token, StaplerRequest req, StaplerResponse rsp) throws IOException {
+ public static void checkPermission(Job,?> project, BuildAuthorizationToken token, StaplerRequest req, StaplerResponse rsp) throws IOException {
if (!Jenkins.getInstance().isUseSecurity())
return; // everyone is authorized
diff --git a/core/src/main/java/hudson/model/FileParameterValue.java b/core/src/main/java/hudson/model/FileParameterValue.java
index e5bfda9881..08d2b7b11a 100644
--- a/core/src/main/java/hudson/model/FileParameterValue.java
+++ b/core/src/main/java/hudson/model/FileParameterValue.java
@@ -100,7 +100,7 @@ public class FileParameterValue extends ParameterValue {
* Exposes the originalFileName as an environment variable.
*/
@Override
- public void buildEnvVars(AbstractBuild,?> build, EnvVars env) {
+ public void buildEnvironment(Run,?> build, EnvVars env) {
env.put(name,originalFileName);
}
diff --git a/core/src/main/java/hudson/model/Fingerprint.java b/core/src/main/java/hudson/model/Fingerprint.java
index 4ada1f6c9c..9b792a8ee6 100644
--- a/core/src/main/java/hudson/model/Fingerprint.java
+++ b/core/src/main/java/hudson/model/Fingerprint.java
@@ -1075,6 +1075,17 @@ public class Fingerprint implements ModelObject, Saveable {
return r;
}
+ /**
+ * Finds a facet of the specific type (including subtypes.)
+ */
+ public T getFacet(Class type) {
+ for (FingerprintFacet f : getFacets()) {
+ if (type.isInstance(f))
+ return type.cast(f);
+ }
+ return null;
+ }
+
/**
* Returns the actions contributed from {@link #getFacets()}
*/
diff --git a/core/src/main/java/hudson/model/Job.java b/core/src/main/java/hudson/model/Job.java
index d73e1f6b68..56734c0e9f 100644
--- a/core/src/main/java/hudson/model/Job.java
+++ b/core/src/main/java/hudson/model/Job.java
@@ -98,6 +98,7 @@ import java.util.*;
import java.util.List;
import static javax.servlet.http.HttpServletResponse.*;
+import jenkins.model.lazy.LazyBuildMixIn;
/**
* A job is an runnable entity under the monitoring of Hudson.
@@ -570,11 +571,14 @@ public abstract class Job, RunT extends Run(this, getBuilds(), HISTORY_ADAPTER);
}
- protected static final HistoryWidget.Adapter HISTORY_ADAPTER = new Adapter() {
+ public static final HistoryWidget.Adapter HISTORY_ADAPTER = new Adapter() {
public int compare(Run record, String key) {
try {
int k = Integer.parseInt(key);
@@ -674,6 +678,7 @@ public abstract class Job, RunT extends Run, RunT extends Run, RunT extends Run m = _getRuns().headMap(n - 1); // the map should
@@ -738,6 +745,7 @@ public abstract class Job, RunT extends Run m = _getRuns().tailMap(n);
@@ -787,6 +795,7 @@ public abstract class Job, RunT extends Run _getRuns();
@@ -795,11 +804,13 @@ public abstract class Job, RunT extends Run, RunT extends Run build, EnvVars env) {
+ public void buildEnvironment(Run,?> build, EnvVars env) {
// TODO: check with Tom if this is really what he had in mind
env.put(name,job.toString());
env.put(name.toUpperCase(Locale.ENGLISH),job.toString()); // backward compatibility pre 1.345
diff --git a/core/src/main/java/hudson/model/ModelObject.java b/core/src/main/java/hudson/model/ModelObject.java
index d0087d37b1..f6368a13fa 100644
--- a/core/src/main/java/hudson/model/ModelObject.java
+++ b/core/src/main/java/hudson/model/ModelObject.java
@@ -24,8 +24,12 @@
package hudson.model;
/**
- * A model object has a URL.
- *
+ * A model object has a human readable name.
+ *
+ * And it normally has URL, but this interface doesn't define one.
+ * (Since there's so many classes that define the getUrl method
+ * we should have such one.)
+ *
* @author Kohsuke Kawaguchi
*/
public interface ModelObject {
diff --git a/core/src/main/java/hudson/model/ParameterValue.java b/core/src/main/java/hudson/model/ParameterValue.java
index 8489858132..d035241638 100644
--- a/core/src/main/java/hudson/model/ParameterValue.java
+++ b/core/src/main/java/hudson/model/ParameterValue.java
@@ -125,16 +125,31 @@ public abstract class ParameterValue implements Serializable {
* @param build
* The build for which this parameter is being used. Never null.
* @deprecated as of 1.344
- * Use {@link #buildEnvVars(AbstractBuild, EnvVars)} instead.
+ * Use {@link #buildEnvVars(Run, EnvVars)} instead.
*/
public void buildEnvVars(AbstractBuild,?> build, Map env) {
- if (env instanceof EnvVars && Util.isOverridden(ParameterValue.class,getClass(),"buildEnvVars", AbstractBuild.class,EnvVars.class))
- // if the subtype already derives buildEnvVars(AbstractBuild,Map), then delegate to it
- buildEnvVars(build,(EnvVars)env);
-
+ if (env instanceof EnvVars) {
+ if (Util.isOverridden(ParameterValue.class, getClass(), "buildEnvironment", Run.class, EnvVars.class)) {
+ // if the subtype already derives buildEnvironment, then delegate to it
+ buildEnvironment(build, (EnvVars) env);
+ } else if (Util.isOverridden(ParameterValue.class, getClass(), "buildEnvVars", AbstractBuild.class, EnvVars.class)) {
+ buildEnvVars(build, (EnvVars) env);
+ }
+ }
// otherwise no-op by default
}
+ /** @deprecated Use {@link #buildEnvVars(Run, EnvVars)} instead. */
+ @Deprecated
+ public void buildEnvVars(AbstractBuild,?> build, EnvVars env) {
+ if (Util.isOverridden(ParameterValue.class, getClass(), "buildEnvironment", Run.class, EnvVars.class)) {
+ buildEnvironment(build, env);
+ } else {
+ // for backward compatibility
+ buildEnvVars(build,(Map)env);
+ }
+ }
+
/**
* Adds environmental variables for the builds to the given map.
*
@@ -151,10 +166,13 @@ public abstract class ParameterValue implements Serializable {
* never null.
* @param build
* The build for which this parameter is being used. Never null.
+ * @since 1.556
*/
- public void buildEnvVars(AbstractBuild,?> build, EnvVars env) {
- // for backward compatibility
- buildEnvVars(build,(Map)env);
+ public void buildEnvironment(Run,?> build, EnvVars env) {
+ if (build instanceof AbstractBuild) {
+ buildEnvVars((AbstractBuild) build, env);
+ }
+ // else do not know how to do it
}
/**
@@ -193,6 +211,8 @@ public abstract class ParameterValue implements Serializable {
return VariableResolver.NONE;
}
+ // TODO should there be a Run overload of this?
+
/**
* Accessing {@link ParameterDefinition} is not a good idea.
*
diff --git a/core/src/main/java/hudson/model/ParametersAction.java b/core/src/main/java/hudson/model/ParametersAction.java
index 09aebf7ebf..396c796691 100644
--- a/core/src/main/java/hudson/model/ParametersAction.java
+++ b/core/src/main/java/hudson/model/ParametersAction.java
@@ -82,9 +82,11 @@ public class ParametersAction implements Action, Iterable, Queue
public void buildEnvVars(AbstractBuild,?> build, EnvVars env) {
for (ParameterValue p : parameters)
- p.buildEnvVars(build,env);
+ p.buildEnvironment(build, env);
}
+ // TODO do we need an EnvironmentContributingAction variant that takes Run so this can implement it?
+
/**
* Performs a variable substitution to the given text and return it.
*/
diff --git a/core/src/main/java/hudson/model/ParametersDefinitionProperty.java b/core/src/main/java/hudson/model/ParametersDefinitionProperty.java
index 1081078ec9..8cf4eed223 100644
--- a/core/src/main/java/hudson/model/ParametersDefinitionProperty.java
+++ b/core/src/main/java/hudson/model/ParametersDefinitionProperty.java
@@ -24,44 +24,44 @@
*/
package hudson.model;
+import hudson.Extension;
+import hudson.Util;
+import hudson.model.Queue.WaitingItem;
import java.io.IOException;
+import java.util.AbstractList;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
-import java.util.AbstractList;
-
+import javax.annotation.CheckForNull;
import javax.servlet.ServletException;
-
-import hudson.Util;
-import hudson.model.Queue.WaitingItem;
+import static javax.servlet.http.HttpServletResponse.SC_CREATED;
import jenkins.model.Jenkins;
+import jenkins.model.ParameterizedJobMixIn;
import jenkins.util.TimeDuration;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
-
+import org.kohsuke.accmod.Restricted;
+import org.kohsuke.accmod.restrictions.NoExternalUse;
import org.kohsuke.stapler.QueryParameter;
import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerResponse;
import org.kohsuke.stapler.export.Exported;
import org.kohsuke.stapler.export.ExportedBean;
-
-import hudson.Extension;
-import javax.annotation.CheckForNull;
import org.kohsuke.stapler.export.Flavor;
-import static javax.servlet.http.HttpServletResponse.SC_CREATED;
-
/**
* Keeps a list of the parameters defined for a project.
*
*
* This class also implements {@link Action} so that index.jelly provides
- * a form to enter build parameters.
+ * a form to enter build parameters.
+ *
The owning job needs a {@code sidepanel.jelly} and should have web methods delegating to {@link ParameterizedJobMixIn#doBuild} and {@link ParameterizedJobMixIn#doBuildWithParameters}.
+ * The builds also need a {@code sidepanel.jelly}.
*/
@ExportedBean(defaultVisibility=2)
-public class ParametersDefinitionProperty extends JobProperty>
+public class ParametersDefinitionProperty extends JobProperty>
implements Action {
private final List parameterDefinitions;
@@ -73,9 +73,15 @@ public class ParametersDefinitionProperty extends JobProperty getOwner() {
- return owner;
+ return (AbstractProject) owner;
+ }
+
+ @Restricted(NoExternalUse.class) // Jelly
+ public ParameterizedJobMixIn.ParameterizedJob getJob() {
+ return (ParameterizedJobMixIn.ParameterizedJob) owner;
}
@Exported
@@ -99,10 +105,16 @@ public class ParametersDefinitionProperty extends JobProperty getJobActions(AbstractProject, ?> job) {
+ public Collection getJobActions(Job, ?> job) {
return Collections.singleton(this);
}
+ @Deprecated
+ public Collection getJobActions(AbstractProject, ?> job) {
+ return getJobActions((Job) job);
+ }
+
+ @Deprecated
public AbstractProject, ?> getProject() {
return (AbstractProject, ?>) owner;
}
@@ -117,10 +129,10 @@ public class ParametersDefinitionProperty extends JobProperty
- * This method is supposed to be invoked from {@link AbstractProject#doBuild(StaplerRequest, StaplerResponse, TimeDuration)}.
+ * This method is supposed to be invoked from {@link ParameterizedJobMixIn#doBuild(StaplerRequest, StaplerResponse, TimeDuration)}.
*/
public void _doBuild(StaplerRequest req, StaplerResponse rsp, @QueryParameter TimeDuration delay) throws IOException, ServletException {
- if (delay==null) delay=new TimeDuration(owner.getQuietPeriod());
+ if (delay==null) delay=new TimeDuration(getJob().getQuietPeriod());
List values = new ArrayList();
@@ -140,7 +152,7 @@ public class ParametersDefinitionProperty extends JobProperty jobType) {
- return AbstractProject.class.isAssignableFrom(jobType);
+ return ParameterizedJobMixIn.ParameterizedJob.class.isAssignableFrom(jobType);
}
@Override
diff --git a/core/src/main/java/hudson/model/PasswordParameterValue.java b/core/src/main/java/hudson/model/PasswordParameterValue.java
index 8cbdda50a7..d7d917ee48 100644
--- a/core/src/main/java/hudson/model/PasswordParameterValue.java
+++ b/core/src/main/java/hudson/model/PasswordParameterValue.java
@@ -49,7 +49,7 @@ public class PasswordParameterValue extends ParameterValue {
}
@Override
- public void buildEnvVars(AbstractBuild,?> build, EnvVars env) {
+ public void buildEnvironment(Run,?> build, EnvVars env) {
String v = Secret.toString(value);
env.put(name, v);
env.put(name.toUpperCase(Locale.ENGLISH),v); // backward compatibility pre 1.345
diff --git a/core/src/main/java/hudson/model/Run.java b/core/src/main/java/hudson/model/Run.java
index b8540ebfea..8afa2bf8fc 100644
--- a/core/src/main/java/hudson/model/Run.java
+++ b/core/src/main/java/hudson/model/Run.java
@@ -27,29 +27,32 @@
*/
package hudson.model;
-import hudson.console.ConsoleLogFilter;
-import hudson.Functions;
+import com.jcraft.jzlib.GZIPInputStream;
+import com.thoughtworks.xstream.XStream;
import hudson.AbortException;
import hudson.BulkChange;
import hudson.EnvVars;
import hudson.ExtensionPoint;
import hudson.FeedAdapter;
+import hudson.Functions;
import hudson.Util;
import hudson.XmlFile;
import hudson.cli.declarative.CLIMethod;
import hudson.console.AnnotatedLargeText;
+import hudson.console.ConsoleLogFilter;
import hudson.console.ConsoleNote;
import hudson.matrix.MatrixBuild;
import hudson.matrix.MatrixRun;
import hudson.model.Descriptor.FormException;
+import hudson.model.Run.RunExecution;
import hudson.model.listeners.RunListener;
import hudson.model.listeners.SaveableListener;
-import hudson.security.PermissionScope;
import hudson.search.SearchIndexBuilder;
import hudson.security.ACL;
import hudson.security.AccessControlled;
import hudson.security.Permission;
import hudson.security.PermissionGroup;
+import hudson.security.PermissionScope;
import hudson.tasks.BuildWrapper;
import hudson.tasks.test.AbstractTestResultAction;
import hudson.util.FlushProofOutputStream;
@@ -57,15 +60,18 @@ import hudson.util.FormApply;
import hudson.util.LogTaskListener;
import hudson.util.ProcessTree;
import hudson.util.XStream2;
-
import java.io.BufferedReader;
+import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
+import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
+import java.io.OutputStream;
import java.io.PrintWriter;
import java.io.Reader;
+import java.io.StringWriter;
import java.io.Writer;
import java.nio.charset.Charset;
import java.text.DateFormat;
@@ -79,23 +85,31 @@ import java.util.Comparator;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
-import java.util.HashSet;
import java.util.logging.Level;
+import static java.util.logging.Level.*;
import java.util.logging.Logger;
-import com.jcraft.jzlib.GZIPInputStream;
-
+import javax.annotation.CheckForNull;
+import javax.annotation.Nonnull;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletResponse;
-
+import jenkins.model.ArtifactManager;
+import jenkins.model.ArtifactManagerConfiguration;
+import jenkins.model.ArtifactManagerFactory;
import jenkins.model.BuildDiscarder;
import jenkins.model.Jenkins;
import jenkins.model.JenkinsLocationConfiguration;
+import jenkins.model.PeepholePermalink;
+import jenkins.model.RunAction2;
+import jenkins.model.StandardArtifactManager;
+import jenkins.model.lazy.BuildReference;
+import jenkins.util.VirtualFile;
import jenkins.util.io.OnMaster;
import net.sf.json.JSONObject;
import org.apache.commons.io.IOUtils;
@@ -105,27 +119,8 @@ import org.kohsuke.accmod.restrictions.NoExternalUse;
import org.kohsuke.stapler.*;
import org.kohsuke.stapler.export.Exported;
import org.kohsuke.stapler.export.ExportedBean;
-
-import com.thoughtworks.xstream.XStream;
-import hudson.model.Run.RunExecution;
-import java.io.ByteArrayInputStream;
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;
-import jenkins.model.ArtifactManager;
-import jenkins.model.ArtifactManagerConfiguration;
-import jenkins.model.ArtifactManagerFactory;
-import jenkins.model.PeepholePermalink;
-import jenkins.model.StandardArtifactManager;
-import jenkins.model.RunAction2;
-import jenkins.util.VirtualFile;
-
/**
* A particular execution of {@link Job}.
*
@@ -154,7 +149,7 @@ public abstract class Run ,RunT extends Run,RunT extends Run createReference() {
+ return new BuildReference(getId(), _this());
+ }
+
/**
* Called by {@link RunMap} to drop bi-directional links in preparation for
* deleting a build.
+ * @see jenkins.model.lazy.LazyBuildMixIn.RunMixIn#dropLinks
+ * @since 1.556
*/
- /*package*/ void dropLinks() {
+ protected void dropLinks() {
if(nextBuild!=null)
nextBuild.previousBuild = previousBuild;
if(previousBuild!=null)
previousBuild.nextBuild = nextBuild;
}
+ /**
+ * @see jenkins.model.lazy.LazyBuildMixIn.RunMixIn#getPreviousBuild
+ */
public RunT getPreviousBuild() {
return previousBuild;
}
@@ -905,6 +914,9 @@ public abstract class Run ,RunT extends Run> extends AbstractLazyLoadRunMap implements Iterable {
/**
* Read-only view of this map.
@@ -185,8 +182,7 @@ public final class RunMap> extends AbstractLazyLoadRunMap
*/
@Override
protected BuildReference createReference(R r) {
- if (r instanceof AbstractBuild) return ((AbstractBuild)r).selfReference;
- else return super.createReference(r);
+ return r.createReference();
}
@Override
diff --git a/core/src/main/java/hudson/model/RunParameterValue.java b/core/src/main/java/hudson/model/RunParameterValue.java
index 6368a94277..caa3fa5987 100644
--- a/core/src/main/java/hudson/model/RunParameterValue.java
+++ b/core/src/main/java/hudson/model/RunParameterValue.java
@@ -68,7 +68,7 @@ public class RunParameterValue extends ParameterValue {
* Exposes the name/value as an environment variable.
*/
@Override
- public void buildEnvVars(AbstractBuild,?> build, EnvVars env) {
+ public void buildEnvironment(Run,?> build, EnvVars env) {
Run run = getRun();
String value = Jenkins.getInstance().getRootUrl() + run.getUrl();
diff --git a/core/src/main/java/hudson/model/StringParameterValue.java b/core/src/main/java/hudson/model/StringParameterValue.java
index a855d40988..74b2a525ac 100644
--- a/core/src/main/java/hudson/model/StringParameterValue.java
+++ b/core/src/main/java/hudson/model/StringParameterValue.java
@@ -52,7 +52,7 @@ public class StringParameterValue extends ParameterValue {
* Exposes the name/value as an environment variable.
*/
@Override
- public void buildEnvVars(AbstractBuild,?> build, EnvVars env) {
+ public void buildEnvironment(Run,?> build, EnvVars env) {
env.put(name,value);
env.put(name.toUpperCase(Locale.ENGLISH),value); // backward compatibility pre 1.345
}
diff --git a/core/src/main/java/hudson/model/User.java b/core/src/main/java/hudson/model/User.java
index 3d9cdbb5b5..a523b03917 100644
--- a/core/src/main/java/hudson/model/User.java
+++ b/core/src/main/java/hudson/model/User.java
@@ -33,11 +33,14 @@ import hudson.security.ACL;
import hudson.security.AccessControlled;
import hudson.security.Permission;
import hudson.security.SecurityRealm;
+import hudson.security.UserMayOrMayNotExistException;
import hudson.util.FormApply;
import hudson.util.RunList;
import hudson.util.XStream2;
import jenkins.model.Jenkins;
import jenkins.model.ModelObjectWithContextMenu;
+import jenkins.security.ImpersonatingUserDetailsService;
+import jenkins.security.LastGrantedAuthoritiesProperty;
import net.sf.json.JSONObject;
import org.acegisecurity.Authentication;
@@ -248,19 +251,31 @@ public class User extends AbstractModelObject implements AccessControlled, Descr
/**
* Creates an {@link Authentication} object that represents this user.
- *
+ *
+ * This method checks with {@link SecurityRealm} if the user is a valid user that can login to the security realm.
+ * If {@link SecurityRealm} is a kind that does not support querying information about other users, this will
+ * use {@link LastGrantedAuthoritiesProperty} to pick up the granted authorities as of the last time the user has
+ * logged in.
+ *
+ * @throws UsernameNotFoundException
+ * If this user is not a valid user in the backend {@link SecurityRealm}.
* @since 1.419
*/
- public Authentication impersonate() {
+ public Authentication impersonate() throws UsernameNotFoundException {
try {
- UserDetails u = Jenkins.getInstance().getSecurityRealm().loadUserByUsername(id);
+ UserDetails u = new ImpersonatingUserDetailsService(
+ Jenkins.getInstance().getSecurityRealm().getSecurityComponents().userDetails).loadUserByUsername(id);
return new UsernamePasswordAuthenticationToken(u.getUsername(), "", u.getAuthorities());
+ } catch (UserMayOrMayNotExistException e) {
+ // backend can't load information about other users. so use the stored information if available
} catch (UsernameNotFoundException e) {
- // ignore
+ // if the user no longer exists in the backend, we need to refuse impersonating this user
+ throw e;
} catch (DataAccessException e) {
- // ignore
+ // seems like it's in the same boat as UserMayOrMayNotExistException
}
- // TODO: use the stored GrantedAuthorities
+
+ // seems like a legitimate user we have no idea about. proceed with minimum access
return new UsernamePasswordAuthenticationToken(id, "",
new GrantedAuthority[]{SecurityRealm.AUTHENTICATED_AUTHORITY});
}
@@ -378,7 +393,10 @@ public class User extends AbstractModelObject implements AccessControlled, Descr
Authentication a = Jenkins.getAuthentication();
if(a instanceof AnonymousAuthenticationToken)
return null;
- return get(a.getName());
+
+ // Since we already know this is a name, we can just call getOrCreate with the name directly.
+ String id = a.getName();
+ return getOrCreate(id, id, true);
}
private static volatile long lastScanned;
diff --git a/core/src/main/java/hudson/search/CollectionSearchIndex.java b/core/src/main/java/hudson/search/CollectionSearchIndex.java
index 53be8a62db..26422553c4 100644
--- a/core/src/main/java/hudson/search/CollectionSearchIndex.java
+++ b/core/src/main/java/hudson/search/CollectionSearchIndex.java
@@ -52,13 +52,14 @@ public abstract class CollectionSearchIndex i
public void suggest(String token, List result) {
Collection items = all();
- if(UserSearchProperty.isCaseInsensitive()){
+ boolean isCaseSensitive = UserSearchProperty.isCaseInsensitive();
+ if(isCaseSensitive){
token = token.toLowerCase();
}
if(items==null) return;
for (SMT o : items) {
String name = getName(o);
- if(UserSearchProperty.isCaseInsensitive())
+ if(isCaseSensitive)
name=name.toLowerCase();
if(o!=null && name.contains(token))
result.add(o);
diff --git a/core/src/main/java/hudson/security/AbstractPasswordBasedSecurityRealm.java b/core/src/main/java/hudson/security/AbstractPasswordBasedSecurityRealm.java
index 7cc3fdf490..65ec05992c 100644
--- a/core/src/main/java/hudson/security/AbstractPasswordBasedSecurityRealm.java
+++ b/core/src/main/java/hudson/security/AbstractPasswordBasedSecurityRealm.java
@@ -8,6 +8,7 @@ import hudson.util.spring.BeanBuilder;
import java.io.Console;
import java.io.IOException;
import jenkins.model.Jenkins;
+import jenkins.security.ImpersonatingUserDetailsService;
import jenkins.security.SecurityListener;
import org.acegisecurity.Authentication;
import org.acegisecurity.AuthenticationException;
@@ -45,7 +46,8 @@ public abstract class AbstractPasswordBasedSecurityRealm extends SecurityRealm i
builder.parse(Jenkins.getInstance().servletContext.getResourceAsStream("/WEB-INF/security/AbstractPasswordBasedSecurityRealm.groovy"),binding);
WebApplicationContext context = builder.createApplicationContext();
return new SecurityComponents(
- findBean(AuthenticationManager.class, context),this);
+ findBean(AuthenticationManager.class, context),
+ new ImpersonatingUserDetailsService(this));
}
@Override
diff --git a/core/src/main/java/hudson/security/TokenBasedRememberMeServices2.java b/core/src/main/java/hudson/security/TokenBasedRememberMeServices2.java
index 7234f9a88a..1697c4645a 100644
--- a/core/src/main/java/hudson/security/TokenBasedRememberMeServices2.java
+++ b/core/src/main/java/hudson/security/TokenBasedRememberMeServices2.java
@@ -23,18 +23,21 @@
*/
package hudson.security;
-import java.util.Date;
+import hudson.Functions;
+import jenkins.model.Jenkins;
+import jenkins.security.HMACConfidentialKey;
+import jenkins.security.ImpersonatingUserDetailsService;
+import jenkins.security.LastGrantedAuthoritiesProperty;
+import org.acegisecurity.Authentication;
+import org.acegisecurity.ui.rememberme.TokenBasedRememberMeServices;
+import org.acegisecurity.userdetails.UserDetails;
+import org.acegisecurity.userdetails.UserDetailsService;
+import org.apache.commons.codec.binary.Base64;
+import org.springframework.util.Assert;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
-
-import jenkins.model.Jenkins;
-import jenkins.security.HMACConfidentialKey;
-import org.acegisecurity.ui.rememberme.TokenBasedRememberMeServices;
-import org.acegisecurity.userdetails.UserDetails;
-import org.acegisecurity.Authentication;
-import org.apache.commons.codec.binary.Base64;
-import org.springframework.util.Assert;
+import java.util.Date;
/**
* {@link TokenBasedRememberMeServices} with modification so as not to rely
@@ -47,6 +50,21 @@ import org.springframework.util.Assert;
* @author Kohsuke Kawaguchi
*/
public class TokenBasedRememberMeServices2 extends TokenBasedRememberMeServices {
+ /**
+ * Decorate {@link UserDetailsService} so that we can use information stored in
+ * {@link LastGrantedAuthoritiesProperty}.
+ *
+ * We wrap by {@link ImpersonatingUserDetailsService} in other places too,
+ * so this is possibly redundant, but there are many {@link AbstractPasswordBasedSecurityRealm#loadUserByUsername(String)}
+ * implementations that do not do it, so doing it helps retrofit old plugins to benefit from
+ * the user impersonation improvements. Plus multiple {@link ImpersonatingUserDetailsService}
+ * do not incur any real performance penalty.
+ */
+ @Override
+ public void setUserDetailsService(UserDetailsService userDetailsService) {
+ super.setUserDetailsService(new ImpersonatingUserDetailsService(userDetailsService));
+ }
+
@Override
protected String makeTokenSignature(long tokenExpiryTime, UserDetails userDetails) {
String expectedTokenSignature = MAC.mac(userDetails.getUsername() + ":" + tokenExpiryTime + ":"
@@ -100,6 +118,16 @@ public class TokenBasedRememberMeServices2 extends TokenBasedRememberMeServices
}
}
+ @Override
+ public Authentication autoLogin(HttpServletRequest request, HttpServletResponse response) {
+ try {
+ return super.autoLogin(request, response);
+ } catch (Exception e) {
+ cancelCookie(request, response, "Failed to handle remember-me cookie: "+Functions.printThrowable(e));
+ return null;
+ }
+ }
+
/**
* Used to compute the token signature securely.
*/
diff --git a/core/src/main/java/hudson/triggers/Trigger.java b/core/src/main/java/hudson/triggers/Trigger.java
index 51b7bffbe3..e75f70eec1 100644
--- a/core/src/main/java/hudson/triggers/Trigger.java
+++ b/core/src/main/java/hudson/triggers/Trigger.java
@@ -59,6 +59,7 @@ import antlr.ANTLRException;
import javax.annotation.CheckForNull;
import edu.umd.cs.findbugs.annotations.SuppressWarnings;
import hudson.model.Items;
+import jenkins.model.ParameterizedJobMixIn;
/**
* Triggers a {@link Build}.
@@ -246,7 +247,7 @@ public abstract class Trigger implements Describable>
}
// Process all triggers, except SCMTriggers when synchronousPolling is set
- for (AbstractProject,?> p : inst.getAllItems(AbstractProject.class)) {
+ for (ParameterizedJobMixIn.ParameterizedJob p : inst.getAllItems(ParameterizedJobMixIn.ParameterizedJob.class)) {
for (Trigger t : p.getTriggers().values()) {
if (! (t instanceof SCMTrigger && scmd.synchronousPolling)) {
LOGGER.fine("cron checking "+p.getName());
diff --git a/core/src/main/java/jenkins/model/ParameterizedJobMixIn.java b/core/src/main/java/jenkins/model/ParameterizedJobMixIn.java
new file mode 100644
index 0000000000..5fe9bdb588
--- /dev/null
+++ b/core/src/main/java/jenkins/model/ParameterizedJobMixIn.java
@@ -0,0 +1,274 @@
+/*
+ * The MIT License
+ *
+ * Copyright 2014 Jesse Glick.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+package jenkins.model;
+
+import hudson.Util;
+import static hudson.model.AbstractProject.ABORT;
+import hudson.model.Action;
+import hudson.model.BuildableItem;
+import hudson.model.Cause;
+import hudson.model.CauseAction;
+import hudson.model.Item;
+import hudson.model.Job;
+import hudson.model.ParameterDefinition;
+import hudson.model.ParameterValue;
+import hudson.model.ParametersAction;
+import hudson.model.ParametersDefinitionProperty;
+import hudson.model.Queue;
+import hudson.model.Run;
+import hudson.model.queue.QueueTaskFuture;
+import hudson.search.SearchIndexBuilder;
+import hudson.triggers.Trigger;
+import hudson.triggers.TriggerDescriptor;
+import hudson.views.BuildButtonColumn;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import javax.annotation.CheckForNull;
+import javax.servlet.ServletException;
+import static javax.servlet.http.HttpServletResponse.SC_CREATED;
+import static javax.servlet.http.HttpServletResponse.SC_INTERNAL_SERVER_ERROR;
+import jenkins.util.TimeDuration;
+import org.kohsuke.accmod.Restricted;
+import org.kohsuke.accmod.restrictions.NoExternalUse;
+import org.kohsuke.stapler.HttpResponses;
+import org.kohsuke.stapler.QueryParameter;
+import org.kohsuke.stapler.StaplerRequest;
+import org.kohsuke.stapler.StaplerResponse;
+import org.kohsuke.stapler.interceptor.RequirePOST;
+
+/**
+ * Allows a {@link Job} to make use of {@link ParametersDefinitionProperty} and be scheduled in various ways.
+ * Stateless so there is no need to keep an instance of it in a field.
+ * @since 1.556
+ */
+@SuppressWarnings("unchecked") // AbstractItem.getParent does not correctly override; scheduleBuild2 inherently untypable
+public abstract class ParameterizedJobMixIn & ParameterizedJobMixIn.ParameterizedJob & Queue.Task, RunT extends Run & Queue.Executable> {
+
+ protected abstract JobT asJob();
+
+ /** @see BuildableItem#scheduleBuild() */
+ @SuppressWarnings("deprecation")
+ public final boolean scheduleBuild() {
+ return scheduleBuild(Jenkins.getInstance().getQuietPeriod(), new Cause.LegacyCodeCause());
+ }
+
+ /** @see BuildableItem#scheduleBuild(Cause) */
+ public final boolean scheduleBuild(Cause c) {
+ return scheduleBuild(Jenkins.getInstance().getQuietPeriod(), c);
+ }
+
+ /** @see BuildableItem#scheduleBuild(int) */
+ @SuppressWarnings("deprecation")
+ public final boolean scheduleBuild(int quietPeriod) {
+ return scheduleBuild(quietPeriod, new Cause.LegacyCodeCause());
+ }
+
+ /** @see BuildableItem#scheduleBuild(int, Cause) */
+ public final boolean scheduleBuild(int quietPeriod, Cause c) {
+ return scheduleBuild2(quietPeriod, c != null ? Collections.singletonList(new CauseAction(c)) : Collections.emptyList()) != null;
+ }
+
+ /**
+ * Convenience method to schedule a build with the ability to wait for its result.
+ * Often used during functional tests ({@code JenkinsRule.assertBuildStatusSuccess}).
+ * @param quietPeriod seconds to wait before starting (normally 0)
+ * @param actions various actions to associate with the scheduling, such as {@link ParametersAction} or {@link CauseAction}
+ * @return a handle by which you may wait for the build to complete (or just start); or null if the build was not actually scheduled for some reason
+ */
+ public final @CheckForNull QueueTaskFuture scheduleBuild2(int quietPeriod, Action... actions) {
+ return scheduleBuild2(quietPeriod, Arrays.asList(actions));
+ }
+
+ private @CheckForNull QueueTaskFuture scheduleBuild2(int quietPeriod, List actions) {
+ if (!asJob().isBuildable())
+ return null;
+
+ List queueActions = new ArrayList(actions);
+ if (isParameterized() && Util.filter(queueActions, ParametersAction.class).isEmpty()) {
+ queueActions.add(new ParametersAction(getDefaultParametersValues()));
+ }
+ Queue.Item i = Jenkins.getInstance().getQueue().schedule2(asJob(), quietPeriod, queueActions).getItem();
+ return i != null ? (QueueTaskFuture) i.getFuture() : null;
+ }
+
+ private List getDefaultParametersValues() {
+ ParametersDefinitionProperty paramDefProp = asJob().getProperty(ParametersDefinitionProperty.class);
+ ArrayList defValues = new ArrayList();
+
+ /*
+ * This check is made ONLY if someone will call this method even if isParametrized() is false.
+ */
+ if(paramDefProp == null)
+ return defValues;
+
+ /* Scan for all parameter with an associated default values */
+ for(ParameterDefinition paramDefinition : paramDefProp.getParameterDefinitions())
+ {
+ ParameterValue defaultValue = paramDefinition.getDefaultParameterValue();
+
+ if(defaultValue != null)
+ defValues.add(defaultValue);
+ }
+
+ return defValues;
+ }
+
+ /**
+ * A job should define a method of the same signature for use from {@link BuildButtonColumn}.
+ */
+ public final boolean isParameterized() {
+ return asJob().getProperty(ParametersDefinitionProperty.class) != null;
+ }
+
+ /**
+ * Schedules a new build command.
+ * Create a method on your job with the same signature and delegate to this.
+ */
+ @SuppressWarnings("deprecation")
+ public final void doBuild(StaplerRequest req, StaplerResponse rsp, @QueryParameter TimeDuration delay) throws IOException, ServletException {
+ if (delay == null) {
+ delay = new TimeDuration(asJob().getQuietPeriod());
+ }
+
+ // if a build is parameterized, let that take over
+ ParametersDefinitionProperty pp = asJob().getProperty(ParametersDefinitionProperty.class);
+ if (pp != null && !req.getMethod().equals("POST")) {
+ // show the parameter entry form.
+ req.getView(pp, "index.jelly").forward(req, rsp);
+ return;
+ }
+
+ hudson.model.BuildAuthorizationToken.checkPermission(asJob(), asJob().getAuthToken(), req, rsp);
+
+ if (pp != null) {
+ pp._doBuild(req, rsp, delay);
+ return;
+ }
+
+ if (!asJob().isBuildable()) {
+ throw HttpResponses.error(SC_INTERNAL_SERVER_ERROR, new IOException(asJob().getFullName() + " is not buildable"));
+ }
+
+ Queue.Item item = Jenkins.getInstance().getQueue().schedule2(asJob(), delay.getTime(), getBuildCause(asJob(), req)).getItem();
+ if (item != null) {
+ rsp.sendRedirect(SC_CREATED, req.getContextPath() + '/' + item.getUrl());
+ } else {
+ rsp.sendRedirect(".");
+ }
+ }
+
+ /**
+ * Supports build trigger with parameters via an HTTP GET or POST.
+ * Currently only String parameters are supported.
+ * Create a method on your job with the same signature and delegate to this.
+ */
+ @SuppressWarnings("deprecation")
+ public final void doBuildWithParameters(StaplerRequest req, StaplerResponse rsp, @QueryParameter TimeDuration delay) throws IOException, ServletException {
+ hudson.model.BuildAuthorizationToken.checkPermission(asJob(), asJob().getAuthToken(), req, rsp);
+
+ ParametersDefinitionProperty pp = asJob().getProperty(ParametersDefinitionProperty.class);
+ if (pp != null) {
+ pp.buildWithParameters(req, rsp, delay);
+ } else {
+ throw new IllegalStateException("This build is not parameterized!");
+ }
+ }
+
+ /**
+ * Cancels a scheduled build.
+ * Create a method on your job marked {@link RequirePOST} but with the same signature and delegate to this.
+ */
+ @RequirePOST
+ public final void doCancelQueue( StaplerRequest req, StaplerResponse rsp ) throws IOException, ServletException {
+ asJob().checkPermission(ABORT);
+ Jenkins.getInstance().getQueue().cancel(asJob());
+ rsp.forwardToPreviousPage(req);
+ }
+
+ /**
+ * Use from a {@link Job#makeSearchIndex} override.
+ * @param sib the super value
+ * @return the value to return
+ */
+ public final SearchIndexBuilder extendSearchIndex(SearchIndexBuilder sib) {
+ if (asJob().isBuildable() && asJob().hasPermission(Item.BUILD)) {
+ sib.add("build", "build");
+ }
+ return sib;
+ }
+
+ /**
+ * Computes the build cause, using RemoteCause or UserCause as appropriate.
+ */
+ @Restricted(NoExternalUse.class)
+ public static final CauseAction getBuildCause(ParameterizedJob job, StaplerRequest req) {
+ Cause cause;
+ @SuppressWarnings("deprecation")
+ hudson.model.BuildAuthorizationToken authToken = job.getAuthToken();
+ if (authToken != null && authToken.getToken() != null && req.getParameter("token") != null) {
+ // Optional additional cause text when starting via token
+ String causeText = req.getParameter("cause");
+ cause = new Cause.RemoteCause(req.getRemoteAddr(), causeText);
+ } else {
+ cause = new Cause.UserIdCause();
+ }
+ return new CauseAction(cause);
+ }
+
+ /**
+ * Suggested implementation of {@link ParameterizedJob#getBuildNowText}.
+ */
+ public final String getBuildNowText() {
+ // TODO is it worthwhile to define a replacement for AbstractProject.BUILD_NOW_TEXT?
+ // TODO move these messages (& translations) to this package
+ return isParameterized() ? hudson.model.Messages.AbstractProject_build_with_parameters() : hudson.model.Messages.AbstractProject_BuildNow();
+ }
+
+ /**
+ * Marker for job using this mixin.
+ */
+ public interface ParameterizedJob extends hudson.model.Queue.Task, hudson.model.Item {
+
+ @SuppressWarnings("deprecation")
+ @CheckForNull hudson.model.BuildAuthorizationToken getAuthToken();
+
+ int getQuietPeriod();
+
+ String getBuildNowText();
+
+ /**
+ * Gets currently configured triggers.
+ * You may use {@code } to configure them.
+ * @return a map from trigger kind to instance
+ */
+ Map> getTriggers();
+
+ }
+
+}
diff --git a/core/src/main/java/jenkins/model/lazy/LazyBuildMixIn.java b/core/src/main/java/jenkins/model/lazy/LazyBuildMixIn.java
new file mode 100644
index 0000000000..4538ef6f9e
--- /dev/null
+++ b/core/src/main/java/jenkins/model/lazy/LazyBuildMixIn.java
@@ -0,0 +1,423 @@
+/*
+ * The MIT License
+ *
+ * Copyright 2014 Jesse Glick.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+package jenkins.model.lazy;
+
+import hudson.Extension;
+import hudson.model.AbstractItem;
+import hudson.model.Item;
+import hudson.model.ItemGroup;
+import hudson.model.Job;
+import hudson.model.Queue;
+import hudson.model.Run;
+import hudson.model.RunMap;
+import hudson.model.listeners.ItemListener;
+import hudson.model.queue.SubTask;
+import hudson.widgets.BuildHistoryWidget;
+import hudson.widgets.HistoryWidget;
+import java.io.File;
+import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import javax.annotation.CheckForNull;
+import javax.annotation.Nonnull;
+import org.kohsuke.accmod.Restricted;
+import org.kohsuke.accmod.restrictions.DoNotUse;
+
+/**
+ * Makes it easier to use a lazy {@link RunMap} from a {@link Job} implementation.
+ * Provides method implementations for some abstract {@link Job} methods,
+ * as well as some methods which are not abstract but which you should override.
+ *
Should be kept in a {@code transient} field in the job.
+ * @since 1.556
+ */
+@SuppressWarnings({"unchecked", "rawtypes"}) // BuildHistoryWidget, and AbstractItem.getParent
+public abstract class LazyBuildMixIn & Queue.Task & LazyBuildMixIn.LazyLoadingJob, RunT extends Run & LazyBuildMixIn.LazyLoadingRun> {
+
+ private static final Logger LOGGER = Logger.getLogger(LazyBuildMixIn.class.getName());
+
+ @SuppressWarnings("deprecation") // [JENKINS-15156] builds accessed before onLoad or onCreatedFromScratch called
+ private @Nonnull RunMap builds = new RunMap();
+
+ // keep track of the previous time we started a build
+ private long lastBuildStartTime;
+
+ /**
+ * Initializes this mixin.
+ * Call this from a constructor and {@link AbstractItem#onLoad} to make sure it is always initialized.
+ */
+ protected LazyBuildMixIn() {}
+
+ protected abstract JobT asJob();
+
+ /**
+ * Gets the raw model.
+ * Normally should not be called as such.
+ * Note that the initial value is replaced during {@link #onCreatedFromScratch} or {@link #onLoad}.
+ */
+ public final @Nonnull RunMap getRunMap() {
+ return builds;
+ }
+
+ /**
+ * Same as {@link #getRunMap} but suitable for {@link Job#_getRuns}.
+ */
+ public final RunMap _getRuns() {
+ assert builds.baseDirInitialized() : "neither onCreatedFromScratch nor onLoad called on " + asJob() + " yet";
+ return builds;
+ }
+
+ /**
+ * Something to be called from {@link AbstractItem#onCreatedFromScratch}.
+ */
+ public final void onCreatedFromScratch() {
+ builds = createBuildRunMap();
+ }
+
+ /**
+ * Something to be called from {@link AbstractItem#onLoad}.
+ */
+ @SuppressWarnings("unchecked")
+ public void onLoad(ItemGroup extends Item> parent, String name) throws IOException {
+ RunMap _builds = createBuildRunMap();
+ RunMap currentBuilds = this.builds;
+ if (parent != null) {
+ // are we overwriting what currently exist?
+ // this is primarily when Jenkins is getting reloaded
+ Item current;
+ try {
+ current = parent.getItem(name);
+ } catch (RuntimeException x) {
+ LOGGER.log(Level.WARNING, "failed to look up " + name + " in " + parent, x);
+ current = null;
+ }
+ if (current != null && current.getClass() == asJob().getClass()) {
+ currentBuilds = (RunMap) ((LazyLoadingJob) current).getLazyBuildMixIn().builds;
+ }
+ }
+ if (currentBuilds != null) {
+ // if we are reloading, keep all those that are still building intact
+ for (RunT r : currentBuilds.getLoadedBuilds().values()) {
+ if (r.isBuilding()) {
+ _builds.put(r);
+ }
+ }
+ }
+ this.builds = _builds;
+ }
+
+ private RunMap createBuildRunMap() {
+ return new RunMap(asJob().getBuildDir(), new RunMap.Constructor() {
+ @Override public RunT create(File dir) throws IOException {
+ return loadBuild(dir);
+ }
+ });
+ }
+
+ /**
+ * Type token for the build type.
+ * The build class must have two constructors:
+ * one taking the project type ({@code P});
+ * and one taking {@code P}, then {@link File}.
+ */
+ protected abstract Class getBuildClass();
+
+ /**
+ * Loads an existing build record from disk.
+ * The default implementation just calls the ({@link Job}, {@link File}) constructor of {@link #getBuildClass}.
+ */
+ public RunT loadBuild(File dir) throws IOException {
+ try {
+ return getBuildClass().getConstructor(asJob().getClass(), File.class).newInstance(asJob(), dir);
+ } catch (InstantiationException e) {
+ throw new Error(e);
+ } catch (IllegalAccessException e) {
+ throw new Error(e);
+ } catch (InvocationTargetException e) {
+ throw handleInvocationTargetException(e);
+ } catch (NoSuchMethodException e) {
+ throw new Error(e);
+ }
+ }
+
+ /**
+ * Creates a new build of this project for immediate execution.
+ * Calls the ({@link Job}) constructor of {@link #getBuildClass}.
+ * Suitable for {@link SubTask#createExecutable}.
+ */
+ @SuppressWarnings("SleepWhileHoldingLock")
+ @edu.umd.cs.findbugs.annotations.SuppressWarnings("SWL_SLEEP_WITH_LOCK_HELD")
+ public final synchronized RunT newBuild() throws IOException {
+ // make sure we don't start two builds in the same second
+ // so the build directories will be different too
+ long timeSinceLast = System.currentTimeMillis() - lastBuildStartTime;
+ if (timeSinceLast < 1000) {
+ try {
+ Thread.sleep(1000 - timeSinceLast);
+ } catch (InterruptedException e) {
+ }
+ }
+ lastBuildStartTime = System.currentTimeMillis();
+ try {
+ RunT lastBuild = getBuildClass().getConstructor(asJob().getClass()).newInstance(asJob());
+ builds.put(lastBuild);
+ return lastBuild;
+ } catch (InstantiationException e) {
+ throw new Error(e);
+ } catch (IllegalAccessException e) {
+ throw new Error(e);
+ } catch (InvocationTargetException e) {
+ throw handleInvocationTargetException(e);
+ } catch (NoSuchMethodException e) {
+ throw new Error(e);
+ }
+ }
+
+ private IOException handleInvocationTargetException(InvocationTargetException e) {
+ Throwable t = e.getTargetException();
+ if (t instanceof Error) {
+ throw (Error) t;
+ }
+ if (t instanceof RuntimeException) {
+ throw (RuntimeException) t;
+ }
+ if (t instanceof IOException) {
+ return (IOException) t;
+ }
+ throw new Error(t);
+ }
+
+ /**
+ * Suitable for {@link Job#removeRun}.
+ */
+ public final void removeRun(RunT run) {
+ if (!builds.remove(run)) {
+ LOGGER.log(Level.WARNING, "{0} did not contain {1} to begin with", new Object[] {asJob(), run});
+ }
+ }
+
+ /**
+ * Suitable for {@link Job#getBuild}.
+ */
+ public final RunT getBuild(String id) {
+ return builds.getById(id);
+ }
+
+ /**
+ * Suitable for {@link Job#getBuildByNumber}.
+ */
+ public final RunT getBuildByNumber(int n) {
+ return builds.getByNumber(n);
+ }
+
+ /**
+ * Suitable for {@link Job#getFirstBuild}.
+ */
+ public final RunT getFirstBuild() {
+ return builds.oldestBuild();
+ }
+
+ /**
+ * Suitable for {@link Job#getLastBuild}.
+ */
+ public final @CheckForNull RunT getLastBuild() {
+ return builds.newestBuild();
+ }
+
+ /**
+ * Suitable for {@link Job#getNearestBuild}.
+ */
+ public final RunT getNearestBuild(int n) {
+ return builds.search(n, AbstractLazyLoadRunMap.Direction.ASC);
+ }
+
+ /**
+ * Suitable for {@link Job#getNearestOldBuild}.
+ */
+ public final RunT getNearestOldBuild(int n) {
+ return builds.search(n, AbstractLazyLoadRunMap.Direction.DESC);
+ }
+
+ /**
+ * Suitable for {@link Job#createHistoryWidget}.
+ */
+ public final HistoryWidget createHistoryWidget() {
+ return new BuildHistoryWidget(asJob(), builds, Job.HISTORY_ADAPTER);
+ }
+
+ /**
+ * Marker for a {@link Job} which uses this mixin.
+ */
+ public interface LazyLoadingJob & Queue.Task & LazyBuildMixIn.LazyLoadingJob, RunT extends Run & LazyLoadingRun> {
+ LazyBuildMixIn getLazyBuildMixIn();
+ }
+
+ public interface LazyLoadingRun & Queue.Task & LazyBuildMixIn.LazyLoadingJob, RunT extends Run & LazyLoadingRun> {
+ RunMixIn getRunMixIn();
+ }
+
+ /**
+ * Accompanying helper for the run type.
+ * Stateful but should be held in a {@code transient} field.
+ */
+ public static abstract class RunMixIn & Queue.Task & LazyBuildMixIn.LazyLoadingJob, RunT extends Run & LazyLoadingRun> {
+
+ /**
+ * Pointers to form bi-directional link between adjacent runs using
+ * {@link LazyBuildMixIn}.
+ *
+ *
+ * Some {@link Run}s do lazy-loading, so we don't use
+ * {@link #previousBuild} and {@link #nextBuild}, and instead use these
+ * fields and point to {@link #selfReference} (or {@link #none}) of
+ * adjacent builds.
+ */
+ private volatile BuildReference previousBuildR, nextBuildR;
+
+ @SuppressWarnings({"unchecked", "rawtypes"})
+ private static final BuildReference NONE = new BuildReference("NONE", null);
+
+ @SuppressWarnings("unchecked")
+ private BuildReference none() {
+ return NONE;
+ }
+
+ private BuildReference selfReference;
+
+ protected RunMixIn() {}
+
+ protected abstract RunT asRun();
+
+ /**
+ * To implement {@link Run#createReference}.
+ */
+ public final synchronized BuildReference createReference() {
+ if (selfReference == null) {
+ selfReference = new BuildReference(asRun().getId(), asRun());
+ }
+ return selfReference;
+ }
+
+ /**
+ * To implement {@link Run#dropLinks}.
+ */
+ public final void dropLinks() {
+ if (nextBuildR != null) {
+ RunT nb = nextBuildR.get();
+ if (nb != null) {
+ nb.getRunMixIn().previousBuildR = previousBuildR;
+ }
+ }
+ if (previousBuildR != null) {
+ RunT pb = previousBuildR.get();
+ if (pb != null) {
+ pb.getRunMixIn().nextBuildR = nextBuildR;
+ }
+ }
+ }
+
+ /**
+ * To implement {@link Run#getPreviousBuild}.
+ */
+ public final RunT getPreviousBuild() {
+ while (true) {
+ BuildReference r = previousBuildR; // capture the value once
+
+ if (r == null) {
+ // having two neighbors pointing to each other is important to make RunMap.removeValue work
+ JobT _parent = asRun().getParent();
+ if (_parent == null) {
+ throw new IllegalStateException("no parent for " + asRun().number);
+ }
+ RunT pb = _parent.getLazyBuildMixIn()._getRuns().search(asRun().number - 1, AbstractLazyLoadRunMap.Direction.DESC);
+ if (pb != null) {
+ pb.getRunMixIn().nextBuildR = createReference(); // establish bi-di link
+ this.previousBuildR = pb.getRunMixIn().createReference();
+ return pb;
+ } else {
+ this.previousBuildR = none();
+ return null;
+ }
+ }
+ if (r == none()) {
+ return null;
+ }
+
+ RunT referent = r.get();
+ if (referent != null) {
+ return referent;
+ }
+
+ // the reference points to a GC-ed object, drop the reference and do it again
+ this.previousBuildR = null;
+ }
+ }
+
+ /**
+ * To implement {@link Run#getNextBuild}.
+ */
+ public final RunT getNextBuild() {
+ while (true) {
+ BuildReference r = nextBuildR; // capture the value once
+
+ if (r == null) {
+ // having two neighbors pointing to each other is important to make RunMap.removeValue work
+ RunT nb = asRun().getParent().getLazyBuildMixIn()._getRuns().search(asRun().number + 1, AbstractLazyLoadRunMap.Direction.ASC);
+ if (nb != null) {
+ nb.getRunMixIn().previousBuildR = createReference(); // establish bi-di link
+ this.nextBuildR = nb.getRunMixIn().createReference();
+ return nb;
+ } else {
+ this.nextBuildR = none();
+ return null;
+ }
+ }
+ if (r == none()) {
+ return null;
+ }
+
+ RunT referent = r.get();
+ if (referent != null) {
+ return referent;
+ }
+
+ // the reference points to a GC-ed object, drop the reference and do it again
+ this.nextBuildR = null;
+ }
+ }
+
+ }
+
+ @Restricted(DoNotUse.class)
+ @Extension public static final class ItemListenerImpl extends ItemListener {
+ @Override public void onLocationChanged(Item item, String oldFullName, String newFullName) {
+ if (item instanceof LazyLoadingJob) {
+ RunMap> builds = ((LazyLoadingJob) item).getLazyBuildMixIn().builds;
+ builds.updateBaseDir(((Job) item).getBuildDir());
+ }
+ }
+ }
+
+}
diff --git a/core/src/main/java/jenkins/security/ApiTokenFilter.java b/core/src/main/java/jenkins/security/ApiTokenFilter.java
index b1078e6240..88eb248a1c 100644
--- a/core/src/main/java/jenkins/security/ApiTokenFilter.java
+++ b/core/src/main/java/jenkins/security/ApiTokenFilter.java
@@ -2,9 +2,7 @@ package jenkins.security;
import hudson.model.User;
import hudson.security.ACL;
-import hudson.security.UserMayOrMayNotExistException;
import hudson.util.Scrambler;
-import jenkins.model.Jenkins;
import org.acegisecurity.context.SecurityContext;
import org.acegisecurity.context.SecurityContextHolder;
import org.acegisecurity.userdetails.UsernameNotFoundException;
@@ -45,32 +43,29 @@ public class ApiTokenFilter implements Filter {
int idx = uidpassword.indexOf(':');
if (idx >= 0) {
String username = uidpassword.substring(0, idx);
- try {
- Jenkins.getInstance().getSecurityRealm().loadUserByUsername(username);
- } catch (UserMayOrMayNotExistException x) {
- // OK, give them the benefit of the doubt.
- } catch (UsernameNotFoundException x) {
- // Not/no longer a user; deny the API token. (But do not leak the information that this happened.)
- chain.doFilter(request, response);
- return;
- } catch (DataAccessException x) {
- throw new ServletException(x);
- }
String password = uidpassword.substring(idx+1);
// attempt to authenticate as API token
User u = User.get(username);
ApiTokenProperty t = u.getProperty(ApiTokenProperty.class);
if (t!=null && t.matchesPassword(password)) {
- // even if we fail to match the password, we aren't rejecting it.
- // as the user might be passing in a real password.
- SecurityContext oldContext = ACL.impersonate(u.impersonate());
try {
- request.setAttribute(ApiTokenProperty.class.getName(), u);
- chain.doFilter(request,response);
+ // even if we fail to match the password, we aren't rejecting it.
+ // as the user might be passing in a real password.
+ SecurityContext oldContext = ACL.impersonate(u.impersonate());
+ try {
+ request.setAttribute(ApiTokenProperty.class.getName(), u);
+ chain.doFilter(request,response);
+ return;
+ } finally {
+ SecurityContextHolder.setContext(oldContext);
+ }
+ } catch (UsernameNotFoundException x) {
+ // Not/no longer a user; deny the API token. (But do not leak the information that this happened.)
+ chain.doFilter(request, response);
return;
- } finally {
- SecurityContextHolder.setContext(oldContext);
+ } catch (DataAccessException x) {
+ throw new ServletException(x);
}
}
}
diff --git a/core/src/main/java/jenkins/security/ExceptionTranslationFilter.java b/core/src/main/java/jenkins/security/ExceptionTranslationFilter.java
index 73c03e54a2..aaa7154176 100644
--- a/core/src/main/java/jenkins/security/ExceptionTranslationFilter.java
+++ b/core/src/main/java/jenkins/security/ExceptionTranslationFilter.java
@@ -28,8 +28,6 @@ import org.acegisecurity.ui.AuthenticationEntryPoint;
import org.acegisecurity.ui.savedrequest.SavedRequest;
import org.acegisecurity.util.PortResolver;
import org.acegisecurity.util.PortResolverImpl;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.util.Assert;
@@ -42,6 +40,8 @@ import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
+import java.util.logging.Level;
+import java.util.logging.Logger;
/**
* Handles any AccessDeniedException and AuthenticationException thrown within the
@@ -85,7 +85,7 @@ public class ExceptionTranslationFilter implements Filter, InitializingBean {
//~ Static fields/initializers =====================================================================================
- private static final Log logger = LogFactory.getLog(ExceptionTranslationFilter.class);
+ private static final Logger LOGGER = Logger.getLogger(ExceptionTranslationFilter.class.getName());
//~ Instance fields ================================================================================================
@@ -116,9 +116,7 @@ public class ExceptionTranslationFilter implements Filter, InitializingBean {
try {
chain.doFilter(request, response);
- if (logger.isDebugEnabled()) {
- logger.debug("Chain processed normally");
- }
+ LOGGER.finer("Chain processed normally");
}
catch (AuthenticationException ex) {
handleException(request, response, chain, ex);
@@ -155,27 +153,21 @@ public class ExceptionTranslationFilter implements Filter, InitializingBean {
private void handleException(ServletRequest request, ServletResponse response, FilterChain chain,
AcegiSecurityException exception) throws IOException, ServletException {
if (exception instanceof AuthenticationException) {
- if (logger.isDebugEnabled()) {
- logger.debug("Authentication exception occurred; redirecting to authentication entry point", exception);
- }
+ LOGGER.log(Level.FINER, "Authentication exception occurred; redirecting to authentication entry point", exception);
sendStartAuthentication(request, response, chain, (AuthenticationException) exception);
}
else if (exception instanceof AccessDeniedException) {
if (authenticationTrustResolver.isAnonymous(SecurityContextHolder.getContext().getAuthentication())) {
- if (logger.isDebugEnabled()) {
- logger.debug("Access is denied (user is anonymous); redirecting to authentication entry point",
- exception);
- }
+ LOGGER.log(Level.FINER, "Access is denied (user is anonymous); redirecting to authentication entry point",
+ exception);
sendStartAuthentication(request, response, chain, new InsufficientAuthenticationException(
"Full authentication is required to access this resource",exception));
}
else {
- if (logger.isDebugEnabled()) {
- logger.debug("Access is denied (user is not anonymous); delegating to AccessDeniedHandler",
- exception);
- }
+ LOGGER.log(Level.FINER, "Access is denied (user is not anonymous); delegating to AccessDeniedHandler",
+ exception);
accessDeniedHandler.handle(request, response, (AccessDeniedException) exception);
}
@@ -205,9 +197,7 @@ public class ExceptionTranslationFilter implements Filter, InitializingBean {
SavedRequest savedRequest = new SavedRequest(httpRequest, portResolver);
- if (logger.isDebugEnabled()) {
- logger.debug("Authentication entry point being called; SavedRequest added to Session: " + savedRequest);
- }
+ LOGGER.finer("Authentication entry point being called; SavedRequest added to Session: " + savedRequest);
if (createSessionAllowed) {
// Store the HTTP request itself. Used by AbstractProcessingFilter
diff --git a/core/src/main/java/jenkins/security/ImpersonatingUserDetailsService.java b/core/src/main/java/jenkins/security/ImpersonatingUserDetailsService.java
new file mode 100644
index 0000000000..c1dbf8f69e
--- /dev/null
+++ b/core/src/main/java/jenkins/security/ImpersonatingUserDetailsService.java
@@ -0,0 +1,52 @@
+package jenkins.security;
+
+import hudson.model.User;
+import hudson.security.SecurityRealm;
+import hudson.security.UserMayOrMayNotExistException;
+import org.acegisecurity.userdetails.UserDetails;
+import org.acegisecurity.userdetails.UserDetailsService;
+import org.acegisecurity.userdetails.UsernameNotFoundException;
+import org.springframework.dao.DataAccessException;
+
+import static java.util.Collections.*;
+
+/**
+ * {@link UserDetailsService} for those {@link SecurityRealm}
+ * that doesn't allow query of other users.
+ *
+ * When the backend responds with {@link UserMayOrMayNotExistException}, we try to replace that with
+ * information stored in {@link LastGrantedAuthoritiesProperty}.
+ *
+ * @author Kohsuke Kawaguchi
+ */
+public class ImpersonatingUserDetailsService implements UserDetailsService {
+ private final UserDetailsService base;
+
+ public ImpersonatingUserDetailsService(UserDetailsService base) {
+ this.base = base;
+ }
+
+ @Override
+ public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException, DataAccessException {
+ try {
+ return base.loadUserByUsername(username);
+ } catch (UserMayOrMayNotExistException e) {
+ return attemptToImpersonate(username, e);
+ } catch (DataAccessException e) {
+ return attemptToImpersonate(username, e);
+ }
+ }
+
+ protected UserDetails attemptToImpersonate(String username, RuntimeException e) {
+ // this backend cannot tell if the user name exists or not. so substitute by what we know
+ User u = User.get(username, false, emptyMap());
+ if (u!=null) {
+ LastGrantedAuthoritiesProperty p = u.getProperty(LastGrantedAuthoritiesProperty.class);
+ if (p!=null)
+ return new org.acegisecurity.userdetails.User(username,"",true,true,true,true,
+ p.getAuthorities());
+ }
+
+ throw e;
+ }
+}
diff --git a/core/src/main/java/jenkins/security/LastGrantedAuthoritiesProperty.java b/core/src/main/java/jenkins/security/LastGrantedAuthoritiesProperty.java
new file mode 100644
index 0000000000..b13fbaac45
--- /dev/null
+++ b/core/src/main/java/jenkins/security/LastGrantedAuthoritiesProperty.java
@@ -0,0 +1,164 @@
+package jenkins.security;
+
+import hudson.Extension;
+import hudson.model.Descriptor.FormException;
+import hudson.model.User;
+import hudson.model.UserProperty;
+import hudson.model.UserPropertyDescriptor;
+import hudson.security.SecurityRealm;
+import jenkins.model.Jenkins;
+import net.sf.json.JSONObject;
+import org.acegisecurity.Authentication;
+import org.acegisecurity.GrantedAuthority;
+import org.acegisecurity.GrantedAuthorityImpl;
+import org.acegisecurity.userdetails.UserDetails;
+import org.kohsuke.stapler.StaplerRequest;
+
+import javax.annotation.Nonnull;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+/**
+ * Remembers the set of {@link GrantedAuthority}s that was obtained the last time the user has logged in.
+ *
+ * This allows us to implement {@link User#impersonate()} with proper set of groups.
+ *
+ * @author Kohsuke Kawaguchi
+ * @since 1.556
+ * @see ImpersonatingUserDetailsService
+ */
+public class LastGrantedAuthoritiesProperty extends UserProperty {
+ private volatile String[] roles;
+ private long timestamp;
+
+ /**
+ * Stick to the same object since there's no UI for this.
+ */
+ @Override
+ public UserProperty reconfigure(StaplerRequest req, JSONObject form) throws FormException {
+ req.bindJSON(this, form);
+ return this;
+ }
+
+ public GrantedAuthority[] getAuthorities() {
+ String[] roles = this.roles; // capture to a variable for immutability
+
+ GrantedAuthority[] r = new GrantedAuthority[roles==null ? 1 : roles.length+1];
+ r[0] = SecurityRealm.AUTHENTICATED_AUTHORITY;
+ for (int i = 1; i < r.length; i++) {
+ r[i] = new GrantedAuthorityImpl(roles[i-1]);
+ }
+ return r;
+ }
+
+ /**
+ * Persist the information with the new {@link UserDetails}.
+ */
+ public void update(Authentication auth) throws IOException {
+ List roles = new ArrayList();
+ for (GrantedAuthority ga : auth.getAuthorities()) {
+ roles.add(ga.getAuthority());
+ }
+ String[] a = roles.toArray(new String[roles.size()]);
+ if (!Arrays.equals(this.roles,a)) {
+ this.roles = a;
+ this.timestamp = System.currentTimeMillis();
+ user.save();
+ }
+ }
+
+ /**
+ * Removes the recorded information
+ */
+ public void invalidate() throws IOException {
+ if (roles!=null) {
+ roles = null;
+ timestamp = System.currentTimeMillis();
+ user.save();
+ }
+ }
+
+ /**
+ * Listen to the login success/failure event to persist {@link GrantedAuthority}s properly.
+ */
+ @Extension
+ public static class SecurityListenerImpl extends SecurityListener {
+ @Override
+ protected void authenticated(@Nonnull UserDetails details) {
+ }
+
+ @Override
+ protected void failedToAuthenticate(@Nonnull String username) {
+ }
+
+ @Override
+ protected void loggedIn(@Nonnull String username) {
+ try {
+ User u = User.get(username);
+ LastGrantedAuthoritiesProperty o = u.getProperty(LastGrantedAuthoritiesProperty.class);
+ if (o==null)
+ u.addProperty(o=new LastGrantedAuthoritiesProperty());
+ Authentication a = Jenkins.getAuthentication();
+ if (a!=null && a.getName().equals(username))
+ o.update(a); // just for defensive sanity checking
+ } catch (IOException e) {
+ LOGGER.log(Level.WARNING, "Failed to record granted authorities",e);
+ }
+ }
+
+ @Override
+ protected void failedToLogIn(@Nonnull String username) {
+ // while this initially seemed like a good idea to avoid allowing wrong impersonation for too long,
+ // doing this means a malicious user can break the impersonation capability
+ // just by failing to login. See ApiTokenFilter that does the following, which seems better:
+ /*
+ try {
+ Jenkins.getInstance().getSecurityRealm().loadUserByUsername(username);
+ } catch (UserMayOrMayNotExistException x) {
+ // OK, give them the benefit of the doubt.
+ } catch (UsernameNotFoundException x) {
+ // Not/no longer a user; deny the API token. (But do not leak the information that this happened.)
+ chain.doFilter(request, response);
+ return;
+ } catch (DataAccessException x) {
+ throw new ServletException(x);
+ }
+ */
+
+// try {
+// User u = User.get(username,false,Collections.emptyMap());
+// LastGrantedAuthoritiesProperty o = u.getProperty(LastGrantedAuthoritiesProperty.class);
+// if (o!=null)
+// o.invalidate();
+// } catch (IOException e) {
+// LOGGER.log(Level.WARNING, "Failed to record granted authorities",e);
+// }
+ }
+
+ @Override
+ protected void loggedOut(@Nonnull String username) {
+ }
+ }
+
+ @Extension
+ public static final class DescriptorImpl extends UserPropertyDescriptor {
+ public String getDisplayName() {
+ return null; // not visible
+ }
+
+ @Override
+ public LastGrantedAuthoritiesProperty newInstance(StaplerRequest req, JSONObject formData) throws FormException {
+ return new LastGrantedAuthoritiesProperty();
+ }
+
+ public UserProperty newInstance(User user) {
+ return null;
+ }
+ }
+
+ private static final Logger LOGGER = Logger.getLogger(LastGrantedAuthoritiesProperty.class.getName());
+}
diff --git a/core/src/main/resources/hudson/model/AbstractItem/configure-common.jelly b/core/src/main/resources/hudson/model/AbstractProject/configure-common.jelly
similarity index 100%
rename from core/src/main/resources/hudson/model/AbstractItem/configure-common.jelly
rename to core/src/main/resources/hudson/model/AbstractProject/configure-common.jelly
diff --git a/core/src/main/resources/hudson/model/AbstractItem/configure-common.properties b/core/src/main/resources/hudson/model/AbstractProject/configure-common.properties
similarity index 100%
rename from core/src/main/resources/hudson/model/AbstractItem/configure-common.properties
rename to core/src/main/resources/hudson/model/AbstractProject/configure-common.properties
diff --git a/core/src/main/resources/hudson/model/AbstractItem/configure-common_bg.properties b/core/src/main/resources/hudson/model/AbstractProject/configure-common_bg.properties
similarity index 100%
rename from core/src/main/resources/hudson/model/AbstractItem/configure-common_bg.properties
rename to core/src/main/resources/hudson/model/AbstractProject/configure-common_bg.properties
diff --git a/core/src/main/resources/hudson/model/AbstractItem/configure-common_ca.properties b/core/src/main/resources/hudson/model/AbstractProject/configure-common_ca.properties
similarity index 100%
rename from core/src/main/resources/hudson/model/AbstractItem/configure-common_ca.properties
rename to core/src/main/resources/hudson/model/AbstractProject/configure-common_ca.properties
diff --git a/core/src/main/resources/hudson/model/AbstractItem/configure-common_da.properties b/core/src/main/resources/hudson/model/AbstractProject/configure-common_da.properties
similarity index 100%
rename from core/src/main/resources/hudson/model/AbstractItem/configure-common_da.properties
rename to core/src/main/resources/hudson/model/AbstractProject/configure-common_da.properties
diff --git a/core/src/main/resources/hudson/model/AbstractItem/configure-common_de.properties b/core/src/main/resources/hudson/model/AbstractProject/configure-common_de.properties
similarity index 100%
rename from core/src/main/resources/hudson/model/AbstractItem/configure-common_de.properties
rename to core/src/main/resources/hudson/model/AbstractProject/configure-common_de.properties
diff --git a/core/src/main/resources/hudson/model/AbstractItem/configure-common_es.properties b/core/src/main/resources/hudson/model/AbstractProject/configure-common_es.properties
similarity index 100%
rename from core/src/main/resources/hudson/model/AbstractItem/configure-common_es.properties
rename to core/src/main/resources/hudson/model/AbstractProject/configure-common_es.properties
diff --git a/core/src/main/resources/hudson/model/AbstractItem/configure-common_fr.properties b/core/src/main/resources/hudson/model/AbstractProject/configure-common_fr.properties
similarity index 100%
rename from core/src/main/resources/hudson/model/AbstractItem/configure-common_fr.properties
rename to core/src/main/resources/hudson/model/AbstractProject/configure-common_fr.properties
diff --git a/core/src/main/resources/hudson/model/AbstractItem/configure-common_he.properties b/core/src/main/resources/hudson/model/AbstractProject/configure-common_he.properties
similarity index 100%
rename from core/src/main/resources/hudson/model/AbstractItem/configure-common_he.properties
rename to core/src/main/resources/hudson/model/AbstractProject/configure-common_he.properties
diff --git a/core/src/main/resources/hudson/model/AbstractItem/configure-common_hu.properties b/core/src/main/resources/hudson/model/AbstractProject/configure-common_hu.properties
similarity index 100%
rename from core/src/main/resources/hudson/model/AbstractItem/configure-common_hu.properties
rename to core/src/main/resources/hudson/model/AbstractProject/configure-common_hu.properties
diff --git a/core/src/main/resources/hudson/model/AbstractItem/configure-common_it.properties b/core/src/main/resources/hudson/model/AbstractProject/configure-common_it.properties
similarity index 100%
rename from core/src/main/resources/hudson/model/AbstractItem/configure-common_it.properties
rename to core/src/main/resources/hudson/model/AbstractProject/configure-common_it.properties
diff --git a/core/src/main/resources/hudson/model/AbstractItem/configure-common_ja.properties b/core/src/main/resources/hudson/model/AbstractProject/configure-common_ja.properties
similarity index 100%
rename from core/src/main/resources/hudson/model/AbstractItem/configure-common_ja.properties
rename to core/src/main/resources/hudson/model/AbstractProject/configure-common_ja.properties
diff --git a/core/src/main/resources/hudson/model/AbstractItem/configure-common_ko.properties b/core/src/main/resources/hudson/model/AbstractProject/configure-common_ko.properties
similarity index 100%
rename from core/src/main/resources/hudson/model/AbstractItem/configure-common_ko.properties
rename to core/src/main/resources/hudson/model/AbstractProject/configure-common_ko.properties
diff --git a/core/src/main/resources/hudson/model/AbstractItem/configure-common_lt.properties b/core/src/main/resources/hudson/model/AbstractProject/configure-common_lt.properties
similarity index 100%
rename from core/src/main/resources/hudson/model/AbstractItem/configure-common_lt.properties
rename to core/src/main/resources/hudson/model/AbstractProject/configure-common_lt.properties
diff --git a/core/src/main/resources/hudson/model/AbstractItem/configure-common_lv.properties b/core/src/main/resources/hudson/model/AbstractProject/configure-common_lv.properties
similarity index 100%
rename from core/src/main/resources/hudson/model/AbstractItem/configure-common_lv.properties
rename to core/src/main/resources/hudson/model/AbstractProject/configure-common_lv.properties
diff --git a/core/src/main/resources/hudson/model/AbstractItem/configure-common_nb_NO.properties b/core/src/main/resources/hudson/model/AbstractProject/configure-common_nb_NO.properties
similarity index 100%
rename from core/src/main/resources/hudson/model/AbstractItem/configure-common_nb_NO.properties
rename to core/src/main/resources/hudson/model/AbstractProject/configure-common_nb_NO.properties
diff --git a/core/src/main/resources/hudson/model/AbstractItem/configure-common_nl.properties b/core/src/main/resources/hudson/model/AbstractProject/configure-common_nl.properties
similarity index 100%
rename from core/src/main/resources/hudson/model/AbstractItem/configure-common_nl.properties
rename to core/src/main/resources/hudson/model/AbstractProject/configure-common_nl.properties
diff --git a/core/src/main/resources/hudson/model/AbstractItem/configure-common_pl.properties b/core/src/main/resources/hudson/model/AbstractProject/configure-common_pl.properties
similarity index 100%
rename from core/src/main/resources/hudson/model/AbstractItem/configure-common_pl.properties
rename to core/src/main/resources/hudson/model/AbstractProject/configure-common_pl.properties
diff --git a/core/src/main/resources/hudson/model/AbstractItem/configure-common_pt_BR.properties b/core/src/main/resources/hudson/model/AbstractProject/configure-common_pt_BR.properties
similarity index 100%
rename from core/src/main/resources/hudson/model/AbstractItem/configure-common_pt_BR.properties
rename to core/src/main/resources/hudson/model/AbstractProject/configure-common_pt_BR.properties
diff --git a/core/src/main/resources/hudson/model/AbstractItem/configure-common_ro.properties b/core/src/main/resources/hudson/model/AbstractProject/configure-common_ro.properties
similarity index 100%
rename from core/src/main/resources/hudson/model/AbstractItem/configure-common_ro.properties
rename to core/src/main/resources/hudson/model/AbstractProject/configure-common_ro.properties
diff --git a/core/src/main/resources/hudson/model/AbstractItem/configure-common_ru.properties b/core/src/main/resources/hudson/model/AbstractProject/configure-common_ru.properties
similarity index 100%
rename from core/src/main/resources/hudson/model/AbstractItem/configure-common_ru.properties
rename to core/src/main/resources/hudson/model/AbstractProject/configure-common_ru.properties
diff --git a/core/src/main/resources/hudson/model/AbstractItem/configure-common_sk.properties b/core/src/main/resources/hudson/model/AbstractProject/configure-common_sk.properties
similarity index 100%
rename from core/src/main/resources/hudson/model/AbstractItem/configure-common_sk.properties
rename to core/src/main/resources/hudson/model/AbstractProject/configure-common_sk.properties
diff --git a/core/src/main/resources/hudson/model/AbstractItem/configure-common_sv_SE.properties b/core/src/main/resources/hudson/model/AbstractProject/configure-common_sv_SE.properties
similarity index 100%
rename from core/src/main/resources/hudson/model/AbstractItem/configure-common_sv_SE.properties
rename to core/src/main/resources/hudson/model/AbstractProject/configure-common_sv_SE.properties
diff --git a/core/src/main/resources/hudson/model/AbstractItem/configure-common_tr.properties b/core/src/main/resources/hudson/model/AbstractProject/configure-common_tr.properties
similarity index 100%
rename from core/src/main/resources/hudson/model/AbstractItem/configure-common_tr.properties
rename to core/src/main/resources/hudson/model/AbstractProject/configure-common_tr.properties
diff --git a/core/src/main/resources/hudson/model/AbstractItem/configure-common_uk.properties b/core/src/main/resources/hudson/model/AbstractProject/configure-common_uk.properties
similarity index 100%
rename from core/src/main/resources/hudson/model/AbstractItem/configure-common_uk.properties
rename to core/src/main/resources/hudson/model/AbstractProject/configure-common_uk.properties
diff --git a/core/src/main/resources/hudson/model/AbstractItem/configure-common_zh_CN.properties b/core/src/main/resources/hudson/model/AbstractProject/configure-common_zh_CN.properties
similarity index 100%
rename from core/src/main/resources/hudson/model/AbstractItem/configure-common_zh_CN.properties
rename to core/src/main/resources/hudson/model/AbstractProject/configure-common_zh_CN.properties
diff --git a/core/src/main/resources/hudson/model/AbstractItem/configure-common_zh_TW.properties b/core/src/main/resources/hudson/model/AbstractProject/configure-common_zh_TW.properties
similarity index 100%
rename from core/src/main/resources/hudson/model/AbstractItem/configure-common_zh_TW.properties
rename to core/src/main/resources/hudson/model/AbstractProject/configure-common_zh_TW.properties
diff --git a/core/src/main/resources/hudson/model/AbstractItem/configure-scm.jellytag b/core/src/main/resources/hudson/model/AbstractProject/configure-scm.jellytag
similarity index 100%
rename from core/src/main/resources/hudson/model/AbstractItem/configure-scm.jellytag
rename to core/src/main/resources/hudson/model/AbstractProject/configure-scm.jellytag
diff --git a/core/src/main/resources/hudson/model/AbstractItem/help-concurrentBuild.html b/core/src/main/resources/hudson/model/AbstractProject/help-concurrentBuild.html
similarity index 100%
rename from core/src/main/resources/hudson/model/AbstractItem/help-concurrentBuild.html
rename to core/src/main/resources/hudson/model/AbstractProject/help-concurrentBuild.html
diff --git a/core/src/main/resources/hudson/model/AbstractItem/help-concurrentBuild_de.html b/core/src/main/resources/hudson/model/AbstractProject/help-concurrentBuild_de.html
similarity index 100%
rename from core/src/main/resources/hudson/model/AbstractItem/help-concurrentBuild_de.html
rename to core/src/main/resources/hudson/model/AbstractProject/help-concurrentBuild_de.html
diff --git a/core/src/main/resources/hudson/model/AbstractItem/help-concurrentBuild_ja.html b/core/src/main/resources/hudson/model/AbstractProject/help-concurrentBuild_ja.html
similarity index 100%
rename from core/src/main/resources/hudson/model/AbstractItem/help-concurrentBuild_ja.html
rename to core/src/main/resources/hudson/model/AbstractProject/help-concurrentBuild_ja.html
diff --git a/core/src/main/resources/hudson/model/AbstractItem/help-concurrentBuild_zh_TW.html b/core/src/main/resources/hudson/model/AbstractProject/help-concurrentBuild_zh_TW.html
similarity index 100%
rename from core/src/main/resources/hudson/model/AbstractItem/help-concurrentBuild_zh_TW.html
rename to core/src/main/resources/hudson/model/AbstractProject/help-concurrentBuild_zh_TW.html
diff --git a/core/src/main/resources/hudson/model/AbstractProject/sidepanel.jelly b/core/src/main/resources/hudson/model/AbstractProject/sidepanel.jelly
index 12c2879743..04b58ba053 100644
--- a/core/src/main/resources/hudson/model/AbstractProject/sidepanel.jelly
+++ b/core/src/main/resources/hudson/model/AbstractProject/sidepanel.jelly
@@ -28,7 +28,7 @@ THE SOFTWARE.
Side panel for the project view.
-->
-
+
@@ -42,7 +42,7 @@ THE SOFTWARE.
-
+
@@ -51,28 +51,7 @@ THE SOFTWARE.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
diff --git a/core/src/main/resources/hudson/model/AbstractProject/sidepanel.properties b/core/src/main/resources/hudson/model/AbstractProject/sidepanel.properties
index 2719924026..fd02d0d55f 100644
--- a/core/src/main/resources/hudson/model/AbstractProject/sidepanel.properties
+++ b/core/src/main/resources/hudson/model/AbstractProject/sidepanel.properties
@@ -20,7 +20,5 @@
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
-delete=Delete {0}
-delete.confirm=Are you sure about deleting the {0} \u2018{1}\u2019?
wipe.out.confirm=Are you sure about wiping out the workspace?
Wipe\ Out\ Workspace=Wipe Out Current Workspace
\ No newline at end of file
diff --git a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_ar.properties b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_ar.properties
index 78fd12a39d..a6b376a431 100644
--- a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_ar.properties
+++ b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_ar.properties
@@ -1,10 +1,7 @@
# This file is under the MIT License by authors
-Back\ to\ Dashboard=\u0627\u0644\u0639\u0648\u062F\u0647
-Build\ scheduled=\u0628\u0631\u0646\u0627\u0645\u062C \u0627\u0644\u0628\u0646\u0627\u0621
-Changes=\u0627\u0644\u062A\u063A\u064A\u0631\u0627\u062A
-Configure=\u063A\u064A\u0631 \u0627\u0644\u0625\u0639\u062F\u0627\u062F\u0627\u062A
-Status=\u0627\u0644\u062D\u0627\u0644\u0647
-Wipe\ Out\ Workspace=\u0645\u0633\u062D \u0627\u0644\u0645\u0644\u0641\u0627\u062A
-Workspace=\u0645\u0633\u0627\u062D\u0629 \u0627\u0644\u0639\u0645\u0644
-delete=\u062E\u0630\u0641
+Back\ to\ Dashboard=\u0627\u0644\u0639\u0648\u062f\u0647
+Changes=\u0627\u0644\u062a\u063a\u064a\u0631\u0627\u062a
+Status=\u0627\u0644\u062d\u0627\u0644\u0647
+Wipe\ Out\ Workspace=\u0645\u0633\u062d \u0627\u0644\u0645\u0644\u0641\u0627\u062a
+Workspace=\u0645\u0633\u0627\u062d\u0629 \u0627\u0644\u0639\u0645\u0644
diff --git a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_bg.properties b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_bg.properties
index c1bfa99dbe..9f36e0f690 100644
--- a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_bg.properties
+++ b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_bg.properties
@@ -20,13 +20,9 @@
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
-Back\ to\ Dashboard=\u043A\u044A\u043C \u0418\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u043E\u043D\u043D\u043E\u0442\u043E \u0422\u0430\u0431\u043B\u043E
-Build\ scheduled=\u041D\u0430\u0441\u0440\u043E\u0447\u0435\u043D \u0431\u0438\u043B\u0434
-Changes=\u041F\u0440\u043E\u043C\u0435\u043D\u0438
-Configure=\u041A\u043E\u043D\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0430\u0439
+Back\ to\ Dashboard=\u043a\u044a\u043c \u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0442\u043e \u0422\u0430\u0431\u043b\u043e
+Changes=\u041f\u0440\u043e\u043c\u0435\u043d\u0438
Status=\u0421\u0442\u0430\u0442\u0443\u0441
-Wipe\ Out\ Workspace=\u0418\u0437\u0442\u0440\u0438\u0439 \u0440\u0430\u0431\u043E\u0442\u043D\u043E\u0442\u043E \u043C\u044F\u0441\u0442\u043E
-Workspace=\u0420\u0430\u0431\u043E\u0442\u043D\u043E \u043C\u044F\u0441\u0442\u043E
-delete=\u0418\u0437\u0442\u0440\u0438\u0439 {0}
-delete.confirm=\u0421\u0438\u0433\u0443\u0440\u043D\u0438 \u043B\u0438 \u0441\u0442\u0435, \u0447\u0435 \u0438\u0441\u043A\u0430\u0442\u0435 \u0434\u0430 \u0438\u0437\u0442\u0440\u0438\u0435\u0442\u0435 {0} \u2018{1}\u2019?
-wipe.out.confirm=\u0421\u0438\u0433\u0443\u0440\u043D\u0438 \u043B\u0438 \u0441\u0442\u0435, \u0447\u0435 \u0438\u0441\u043A\u0430\u0442\u0435 \u0434\u0430 \u0438\u0437\u0442\u0440\u0438\u0435\u0442\u0435 \u0440\u0430\u0431\u043E\u0442\u043D\u043E\u0442\u043E \u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432\u043E?
+Wipe\ Out\ Workspace=\u0418\u0437\u0442\u0440\u0438\u0439 \u0440\u0430\u0431\u043e\u0442\u043d\u043e\u0442\u043e \u043c\u044f\u0441\u0442\u043e
+Workspace=\u0420\u0430\u0431\u043e\u0442\u043d\u043e \u043c\u044f\u0441\u0442\u043e
+wipe.out.confirm=\u0421\u0438\u0433\u0443\u0440\u043d\u0438 \u043b\u0438 \u0441\u0442\u0435, \u0447\u0435 \u0438\u0441\u043a\u0430\u0442\u0435 \u0434\u0430 \u0438\u0437\u0442\u0440\u0438\u0435\u0442\u0435 \u0440\u0430\u0431\u043e\u0442\u043d\u043e\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e?
diff --git a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_ca.properties b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_ca.properties
index 157b3d0335..afc4fd99e0 100644
--- a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_ca.properties
+++ b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_ca.properties
@@ -21,12 +21,8 @@
# THE SOFTWARE.
Back\ to\ Dashboard=Retornar al Panell de Control
-Build\ scheduled=Construcci\u00F3 programada
Changes=Canvis
-Configure=Configura
Status=Estat
Wipe\ Out\ Workspace=Neteja l''''''''espai de treball
Workspace=Espai de treball
-delete=Suprimeix {0}
-delete.confirm=Est\u00E0s segur que vols esborrar {0} \u2018{1}\u2019?
-wipe.out.confirm=Est\u00E0s segur que vols netejar l''espai de treball?
+wipe.out.confirm=Est\u00e0s segur que vols netejar l''espai de treball?
diff --git a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_cs.properties b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_cs.properties
index 63c5c41fd7..443bedcc5e 100644
--- a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_cs.properties
+++ b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_cs.properties
@@ -20,13 +20,9 @@
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
-Back\ to\ Dashboard=Zp\u011Bt na \u00FAvodn\u00ED stranu
-Build\ scheduled=Sestaven\u00ED napl\u00E1nov\u00E1no
-Changes=Zm\u011Bny
-Configure=Nastavit
+Back\ to\ Dashboard=Zp\u011bt na \u00favodn\u00ed stranu
+Changes=Zm\u011bny
Status=Stav
-Wipe\ Out\ Workspace=Smazat pracovn\u00ED prostor
-Workspace=Pracovn\u00ED prostor
-delete=Smazat {0}
-delete.confirm=Jste si jisti, \u017Ee chcete smazat {0} \u2018{1}\u2019?
-wipe.out.confirm=Jste si jisti, \u017Ee chcete vy\u010Distit pracovn\u00ED prostor?
+Wipe\ Out\ Workspace=Smazat pracovn\u00ed prostor
+Workspace=Pracovn\u00ed prostor
+wipe.out.confirm=Jste si jisti, \u017ee chcete vy\u010distit pracovn\u00ed prostor?
diff --git a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_da.properties b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_da.properties
index e3809d56ec..2a2e546aa3 100644
--- a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_da.properties
+++ b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_da.properties
@@ -21,13 +21,8 @@
# THE SOFTWARE.
Changes=\u00c6ndringer
-delete=Slet {0}
-Configure=Konfigurer
Back\ to\ Dashboard=Tilbage til oversigtssiden
Status=Status
Workspace=Arbejdsomr\u00e5de
-Build\ scheduled=Byg planlagt
-View\ Configuration=Vis konfiguration
Wipe\ Out\ Workspace=Slet arbejdsomr\u00e5det
-delete.confirm=Er du sikker p\u00E5 at du vil slette {0} ''{1}''?
wipe.out.confirm=Er du sikker p\u00e5 at du vil slette arbejdsomr\u00e5det?
diff --git a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_de.properties b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_de.properties
index 77b8af3cc0..5f890204af 100644
--- a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_de.properties
+++ b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_de.properties
@@ -21,15 +21,10 @@
# THE SOFTWARE.
Back\ to\ Dashboard=Zur\u00fcck zur \u00dcbersicht
-Up=Zur\u00FCck
+Up=Zur\u00fcck
Status=Status
Changes=\u00c4nderungen
Workspace=Arbeitsbereich
-delete={0} L\u00f6schen
-Configure=Konfigurieren
-View\ Configuration=Konfiguration anzeigen
-Build\ scheduled=Build geplant
Wipe\ Out\ Workspace=Arbeitsbereich l\u00f6schen
View\ Configuration=Konfiguration anzeigen
-delete.confirm=Sind Sie sicher, dass Sie das {0} \u2018{1}\u2019 l\u00F6schen m\u00F6chten?
wipe.out.confirm=Sind Sie sicher, dass Sie den Arbeitsbereich l\u00f6schen m\u00f6chten?
diff --git a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_el.properties b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_el.properties
index d2c11e0048..27c47c816a 100644
--- a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_el.properties
+++ b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_el.properties
@@ -20,11 +20,8 @@
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
-Back\ to\ Dashboard=\u0395\u03C0\u03B9\u03C3\u03C4\u03C1\u03BF\u03C6\u03AE \u03C3\u03C4\u03BF Dashboard
-Build\ scheduled=\u03A4\u03BF build \u03C0\u03C1\u03BF\u03B3\u03C1\u03B1\u03BC\u03BC\u03B1\u03C4\u03AF\u03C3\u03C4\u03B7\u03BA\u03B5
-Changes=\u0391\u03BB\u03BB\u03B1\u03B3\u03AD\u03C2
-Configure=\u03A1\u03C5\u03B8\u03BC\u03AF\u03C3\u03B5\u03B9\u03C2
-Status=\u039A\u03B1\u03C4\u03AC\u03C3\u03C4\u03B1\u03C3\u03B7
-Wipe\ Out\ Workspace=\u039A\u03B1\u03B8\u03B1\u03C1\u03B9\u03C3\u03BC\u03CC\u03C2 \u03A7\u03CE\u03C1\u03BF\u03C5 \u0395\u03C1\u03B3\u03B1\u03C3\u03AF\u03B1\u03C2
-Workspace=\u03A7\u03CE\u03C1\u03BF\u03C2 \u0395\u03C1\u03B3\u03B1\u03C3\u03AF\u03B1\u03C2
-delete=\u0394\u03B9\u03B1\u03B3\u03C1\u03B1\u03C6\u03AE
+Back\ to\ Dashboard=\u0395\u03c0\u03b9\u03c3\u03c4\u03c1\u03bf\u03c6\u03ae \u03c3\u03c4\u03bf Dashboard
+Changes=\u0391\u03bb\u03bb\u03b1\u03b3\u03ad\u03c2
+Status=\u039a\u03b1\u03c4\u03ac\u03c3\u03c4\u03b1\u03c3\u03b7
+Wipe\ Out\ Workspace=\u039a\u03b1\u03b8\u03b1\u03c1\u03b9\u03c3\u03bc\u03cc\u03c2 \u03a7\u03ce\u03c1\u03bf\u03c5 \u0395\u03c1\u03b3\u03b1\u03c3\u03af\u03b1\u03c2
+Workspace=\u03a7\u03ce\u03c1\u03bf\u03c2 \u0395\u03c1\u03b3\u03b1\u03c3\u03af\u03b1\u03c2
diff --git a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_es.properties b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_es.properties
index 5e1c56b952..553f7b4d39 100644
--- a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_es.properties
+++ b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_es.properties
@@ -20,14 +20,9 @@
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
-Build\ scheduled=Ejecuci\u00F3n planificada
Changes=Cambios
-Configure=Configurar
Status=Estado Actual
Wipe\ Out\ Workspace=Limpiar el espacio de trabajo
Workspace=Zona de Trabajo
-delete=Borrar {0}
-View\ Configuration=Ver Configuraci\u00F3n
Back\ to\ Dashboard=Volver al Panel de Control
-delete.confirm=Est\u00E1s seguro de querer borrar el {0} `{1}\u00B4
wipe.out.confirm=\u00bfEst\u00e1s seguro de que quieres limpiar el espacio de trabajo?
diff --git a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_es_AR.properties b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_es_AR.properties
index 6b9247db3a..b4adbb2b98 100644
--- a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_es_AR.properties
+++ b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_es_AR.properties
@@ -1,10 +1,7 @@
# This file is under the MIT License by authors
Back\ to\ Dashboard=Volver al Dashboard
-Build\ scheduled=Construcci\u00F3n agendada
Changes=Cambios
-Configure=Configurar
Status=Estado
Wipe\ Out\ Workspace=Limpiar espacio de trabajo
Workspace=Espacio de trabajo
-delete=Eliminar {0}
diff --git a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_et.properties b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_et.properties
index 1e50303ef0..b88e1b5f7d 100644
--- a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_et.properties
+++ b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_et.properties
@@ -1,12 +1,8 @@
# This file is under the MIT License by authors
Back\ to\ Dashboard=Tagasi pealehele
-Build\ scheduled=T\u00F6\u00F6 on tellitud
Changes=Muudatused
-Configure=Seadista
Status=Staatus
-Wipe\ Out\ Workspace=Tee t\u00F6\u00F6ruum t\u00FChjaks
-Workspace=T\u00F6\u00F6ruum
-delete=Kustuta {0}
-delete.confirm=Oled sa ikka kindel et soovid kustutada {0} \u2018{1}\u2019?
-wipe.out.confirm=Oled kindel et soovid t\u00F6\u00F6ala kustutada?
+Wipe\ Out\ Workspace=Tee t\u00f6\u00f6ruum t\u00fchjaks
+Workspace=T\u00f6\u00f6ruum
+wipe.out.confirm=Oled kindel et soovid t\u00f6\u00f6ala kustutada?
diff --git a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_eu.properties b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_eu.properties
index 3b00ec864c..8789cfe50a 100644
--- a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_eu.properties
+++ b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_eu.properties
@@ -2,7 +2,5 @@
Back\ to\ Dashboard=Taulara itzuli
Changes=Aldaketak
-Configure=Itxuratu
Status=Estatus
Wipe\ Out\ Workspace=Garbitu Workspace-a
-delete={0} Ezabatu
diff --git a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_fi.properties b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_fi.properties
index 8c8b5383fe..1e0e1bd7ab 100644
--- a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_fi.properties
+++ b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_fi.properties
@@ -21,12 +21,8 @@
# THE SOFTWARE.
Back\ to\ Dashboard=Takaisin kojetauluun
-Build\ scheduled=K\u00E4\u00E4nn\u00F6s on jonossa
Changes=Muutokset
-Configure=Muokkaa
Status=Tila
-Wipe\ Out\ Workspace=Tyhjenn\u00E4 ty\u00F6tila
-Workspace=Ty\u00F6hakemisto
-delete=Poista projekti
-delete.confirm=Oletko varmna ett\u00E4 {0} ''{1}'' poistetaan ?
-wipe.out.confirm=Oletko varma t\u00E4m\u00E4n ty\u00F6p\u00F6yd\u00E4n poistamisesta?
+Wipe\ Out\ Workspace=Tyhjenn\u00e4 ty\u00f6tila
+Workspace=Ty\u00f6hakemisto
+wipe.out.confirm=Oletko varma t\u00e4m\u00e4n ty\u00f6p\u00f6yd\u00e4n poistamisesta?
diff --git a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_fr.properties b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_fr.properties
index 6e69196e99..e453af67e8 100644
--- a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_fr.properties
+++ b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_fr.properties
@@ -23,11 +23,6 @@
Back\ to\ Dashboard=Retour au tableau de bord
Status=\u00c9tat
Changes=Modifications
-Workspace=R\u00E9pertoire de travail
-delete=Supprimer {0}
-Configure=Configurer
-Build\ scheduled=Build programm\u00E9
-View\ Configuration=Voir la configuration
+Workspace=R\u00e9pertoire de travail
Wipe\ Out\ Workspace=Effacer l''espace de travail
-delete.confirm=\u00CAtes-vous s\u00FBr de vouloir supprimer le {0} \u2018{1}\u2019?
-wipe.out.confirm=Voulez-vous vraiment effacer le r\u00E9pertoire de travail\u00A0?
+wipe.out.confirm=Voulez-vous vraiment effacer le r\u00e9pertoire de travail\u00a0?
diff --git a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_gl.properties b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_gl.properties
index 311e676640..44ee6042f4 100644
--- a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_gl.properties
+++ b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_gl.properties
@@ -1,8 +1,6 @@
# This file is under the MIT License by authors
Back\ to\ Dashboard=Volver ao Dashboard
-Build\ scheduled=Compilaci\u00F3n programada
Changes=Cambios
Status=Estado
Wipe\ Out\ Workspace=Borrar Workspace
-delete=Borrar {0}
diff --git a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_he.properties b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_he.properties
index 1a16059f31..6ae926b697 100644
--- a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_he.properties
+++ b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_he.properties
@@ -20,13 +20,9 @@
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
-Back\ to\ Dashboard=\u05D7\u05D6\u05E8\u05D4 \u05DC\u05E8\u05D0\u05E9\u05D9
-Build\ scheduled=\u05EA\u05D6\u05DE\u05D5\u05DF \u05D1\u05E0\u05D9\u05D9\u05D4
-Changes=\u05E9\u05D9\u05E0\u05D5\u05D9\u05D9\u05DD
-Configure=\u05D4\u05D2\u05D3\u05E8\u05D4
-Status=\u05DE\u05E6\u05D1
-Wipe\ Out\ Workspace=\u05DE\u05D7\u05E7 \u05D0\u05EA \u05E9\u05D8\u05D7 \u05D4\u05E2\u05D1\u05D5\u05D3\u05D4
-Workspace=\u05E9\u05D8\u05D7 \u05E2\u05D1\u05D5\u05D3\u05D4
-delete={0} \u05DE\u05D7\u05E7
-delete.confirm=\u05D4\u05D0\u05DD \u05D0\u05EA\u05D4 \u05D1\u05D8\u05D5\u05D7 \u05E9\u05D1\u05E8\u05E6\u05D5\u05E0\u05DA \u05DC\u05DE\u05D7\u05D5\u05E7 \u05D0\u05EA {0} ''{1}''?
-wipe.out.confirm=\u05D4\u05D0\u05DD \u05D0\u05EA\u05D4 \u05D1\u05D8\u05D5\u05D7 \u05E9\u05D1\u05E8\u05E6\u05D5\u05E0\u05DA \u05DC\u05DE\u05D7\u05D5\u05E7 \u05D0\u05EA \u05DE\u05E9\u05D8\u05D7 \u05D4\u05E2\u05D1\u05D5\u05D3\u05D4?
+Back\ to\ Dashboard=\u05d7\u05d6\u05e8\u05d4 \u05dc\u05e8\u05d0\u05e9\u05d9
+Changes=\u05e9\u05d9\u05e0\u05d5\u05d9\u05d9\u05dd
+Status=\u05de\u05e6\u05d1
+Wipe\ Out\ Workspace=\u05de\u05d7\u05e7 \u05d0\u05ea \u05e9\u05d8\u05d7 \u05d4\u05e2\u05d1\u05d5\u05d3\u05d4
+Workspace=\u05e9\u05d8\u05d7 \u05e2\u05d1\u05d5\u05d3\u05d4
+wipe.out.confirm=\u05d4\u05d0\u05dd \u05d0\u05ea\u05d4 \u05d1\u05d8\u05d5\u05d7 \u05e9\u05d1\u05e8\u05e6\u05d5\u05e0\u05da \u05dc\u05de\u05d7\u05d5\u05e7 \u05d0\u05ea \u05de\u05e9\u05d8\u05d7 \u05d4\u05e2\u05d1\u05d5\u05d3\u05d4?
diff --git a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_hi_IN.properties b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_hi_IN.properties
index cf851307e9..301650ffbf 100644
--- a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_hi_IN.properties
+++ b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_hi_IN.properties
@@ -1,9 +1,7 @@
# This file is under the MIT License by authors
-Back\ to\ Dashboard=\u0921\u0948\u0936\u092C\u094B\u0930\u094D\u0921 \u0935\u093E\u092A\u0938 \u0915\u0930\u0928\u0947 \u0915\u0947 \u0932\u093F\u090F
+Back\ to\ Dashboard=\u0921\u0948\u0936\u092c\u094b\u0930\u094d\u0921 \u0935\u093e\u092a\u0938 \u0915\u0930\u0928\u0947 \u0915\u0947 \u0932\u093f\u090f
Changes=Badlav
-Configure=\u0915\u0949\u0928\u094D\u092B\u093C\u093F\u0917\u0930
Status=Stithi
-Wipe\ Out\ Workspace=\u0915\u093E\u0930\u094D\u092F\u0915\u094D\u0937\u0947\u0924\u094D\u0930 \u0935\u093F\u0928\u093E\u0936
-Workspace=\u0915\u093E\u0930\u094D\u092F\u0915\u094D\u0937\u0947\u0924\u094D\u0930
-delete=\u0939\u091F\u093E\u0928\u093E
+Wipe\ Out\ Workspace=\u0915\u093e\u0930\u094d\u092f\u0915\u094d\u0937\u0947\u0924\u094d\u0930 \u0935\u093f\u0928\u093e\u0936
+Workspace=\u0915\u093e\u0930\u094d\u092f\u0915\u094d\u0937\u0947\u0924\u094d\u0930
diff --git a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_hu.properties b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_hu.properties
index 725fa0300d..c79140e908 100644
--- a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_hu.properties
+++ b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_hu.properties
@@ -20,14 +20,10 @@
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
-Back\ to\ Dashboard=Vissza a ir\u00E1ny\u00EDt\u00F3pultra
-Build\ scheduled=\u00C9p\u00EDt\u00E9s be\u00FCtemez\u00E9se
+Back\ to\ Dashboard=Vissza a ir\u00e1ny\u00edt\u00f3pultra
Changes=V\u00e1ltoz\u00e1sok
-Configure=Be\u00e1ll\u00edt\u00e1sok
-Status=St\u00E1tusz
-Wipe\ Out\ Workspace=Munkater\u00FClet kipucol\u00E1sa
-Workspace=Munkater\u00FClet
-delete={0} t\u00F6rl\u00E9se
-delete.confirm=Biztosan t\u00F6rli a {0} \u2018{1}\u2019?
+Status=St\u00e1tusz
+Wipe\ Out\ Workspace=Munkater\u00fclet kipucol\u00e1sa
+Workspace=Munkater\u00fclet
wipe.out.confirm=Biztosan t\u00f6r\u00f6lni akarja a munkater\u00fcletet?
diff --git a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_id.properties b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_id.properties
index a0c22419b0..e06bfd1b61 100644
--- a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_id.properties
+++ b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_id.properties
@@ -21,6 +21,5 @@
# THE SOFTWARE.
Back\ to\ Dashboard=Kembali ke Dashboard
-Build\ scheduled=Jadwal Pembangunan
Changes=Perubahan
Status=Status
diff --git a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_is.properties b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_is.properties
index 04db7a0b7f..46399c4a16 100644
--- a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_is.properties
+++ b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_is.properties
@@ -20,11 +20,8 @@
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
-Back\ to\ Dashboard=Aftur \u00E1 m\u00E6labor\u00F0
-Build\ scheduled=\u00C1\u00E6tla\u00F0ar keyrslur
+Back\ to\ Dashboard=Aftur \u00e1 m\u00e6labor\u00f0
Changes=Breytingar
-Configure=Breyta
-Status=Sta\u00F0a
-Wipe\ Out\ Workspace=Hreinsa vinnusv\u00E6\u00F0i
-Workspace=Vinnusv\u00E6\u00F0i
-delete=Ey\u00F0a {0}
+Status=Sta\u00f0a
+Wipe\ Out\ Workspace=Hreinsa vinnusv\u00e6\u00f0i
+Workspace=Vinnusv\u00e6\u00f0i
diff --git a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_it.properties b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_it.properties
index aef3cb3baf..d3c4fa6beb 100644
--- a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_it.properties
+++ b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_it.properties
@@ -21,13 +21,9 @@
# THE SOFTWARE.
Back\ to\ Dashboard=Ritorna al pannello di controllo
-Build\ scheduled=Lavoro pianificato
Changes=Modifiche
-Configure=Configura
Status=Stato
Wipe\ Out\ Workspace=Pulisci Workspace
Workspace=Area di lavoro
-delete=Elimina {0}
-delete.confirm=Si sicuro di voler cancellare {0} \u2018{1}\u2019?
wipe.out.confirm=Sei sicuro di voler pulire il workspace?
diff --git a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_ja.properties b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_ja.properties
index cbfe2d0a6f..4ec1e1eb7f 100644
--- a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_ja.properties
+++ b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_ja.properties
@@ -25,9 +25,4 @@ Status=\u72b6\u614b
Changes=\u5909\u66f4\u5c65\u6b74
Workspace=\u30ef\u30fc\u30af\u30b9\u30da\u30fc\u30b9
Wipe\ Out\ Workspace=\u30ef\u30fc\u30af\u30b9\u30da\u30fc\u30b9\u306e\u30af\u30ea\u30a2
-delete={0}\u306e\u524a\u9664
-Configure=\u8a2d\u5b9a
-Build\ scheduled=\u30d3\u30eb\u30c9\u304c\u30b9\u30b1\u30b8\u30e5\u30fc\u30eb\u3055\u308c\u307e\u3057\u305f
-View\ Configuration=\u8a2d\u5b9a\u306e\u53c2\u7167
-delete.confirm={0} "{1}"\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?
wipe.out.confirm=\u30ef\u30fc\u30af\u30b9\u30da\u30fc\u30b9\u3092\u30af\u30ea\u30a2\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?
diff --git a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_kn.properties b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_kn.properties
index 0573b46f91..92e62377aa 100644
--- a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_kn.properties
+++ b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_kn.properties
@@ -1,10 +1,7 @@
# This file is under the MIT License by authors
-Back\ to\ Dashboard=\u0CAA\u0CC1\u0CA8\u0C83 \u0CA6\u0CB7\u0CCD \u0CAC\u0CCB\u0CB0\u0CCD\u0CA1\u0CCD \u0C97\u0CC6 \u0CB9\u0CCB\u0C97\u0CC1
-Build\ scheduled=\u0CAC\u0CBF\u0CB2\u0CCD\u0CA1\u0CCD \u0C85\u0CA8\u0CC1\u0CB8\u0CC2\u0C9A\u0CBF
-Changes=\u0CAC\u0CA6\u0CB2\u0CBE\u0CB5\u0CA3\u0CC6
-Configure=\u0CB8\u0C82\u0CB0\u0C9A\u0CBF\u0CB8\u0CC1
-Status=\u0CB8\u0CCD\u0CA5\u0CBF\u0CA4\u0CBF
-Wipe\ Out\ Workspace=\u0C95\u0CBE\u0CB0\u0CCD\u0CAF\u0CB8\u0CCD\u0CA5\u0CB3\u0CA6\u0CBF\u0C82\u0CA6 \u0C92\u0CB0\u0CB8\u0CC1
-Workspace=\u0C95\u0CBE\u0CB0\u0CCD\u0CAF\u0CB8\u0CCD\u0CA5\u0CB3
-delete=\u0C85\u0CB3\u0CBF\u0CB8\u0CC1
+Back\ to\ Dashboard=\u0caa\u0cc1\u0ca8\u0c83 \u0ca6\u0cb7\u0ccd \u0cac\u0ccb\u0cb0\u0ccd\u0ca1\u0ccd \u0c97\u0cc6 \u0cb9\u0ccb\u0c97\u0cc1
+Changes=\u0cac\u0ca6\u0cb2\u0cbe\u0cb5\u0ca3\u0cc6
+Status=\u0cb8\u0ccd\u0ca5\u0cbf\u0ca4\u0cbf
+Wipe\ Out\ Workspace=\u0c95\u0cbe\u0cb0\u0ccd\u0caf\u0cb8\u0ccd\u0ca5\u0cb3\u0ca6\u0cbf\u0c82\u0ca6 \u0c92\u0cb0\u0cb8\u0cc1
+Workspace=\u0c95\u0cbe\u0cb0\u0ccd\u0caf\u0cb8\u0ccd\u0ca5\u0cb3
diff --git a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_ko.properties b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_ko.properties
index 179555e01b..12755400f2 100644
--- a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_ko.properties
+++ b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_ko.properties
@@ -20,13 +20,9 @@
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
-Back\ to\ Dashboard=\uB300\uC2DC\uBCF4\uB4DC\uB85C \uB3CC\uC544\uAC00\uAE30
-Build\ scheduled=\uACC4\uD68D\uB41C \uBE4C\uB4DC
-Changes=\uBCC0\uACBD\uC0AC\uD56D
-Configure=\uAD6C\uC131
-Status=\uC0C1\uD0DC
-Wipe\ Out\ Workspace=\uC791\uC5C5\uACF5\uAC04 \uCD08\uAE30\uD654
-Workspace=\uC791\uC5C5\uACF5\uAC04
-delete={0} \uC0AD\uC81C
-delete.confirm={0} \uC744 \uC0AD\uC81C\uD558\uB294\uAC70\uC5D0 \uB300\uD574 \uB3D9\uC758\uD558\uC2ED\uB2C8\uAE4C? ''{1}''
-wipe.out.confirm=\uC791\uC5C5\uACF5\uAC04\uC744 \uCD08\uAE30\uD654\uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?
+Back\ to\ Dashboard=\ub300\uc2dc\ubcf4\ub4dc\ub85c \ub3cc\uc544\uac00\uae30
+Changes=\ubcc0\uacbd\uc0ac\ud56d
+Status=\uc0c1\ud0dc
+Wipe\ Out\ Workspace=\uc791\uc5c5\uacf5\uac04 \ucd08\uae30\ud654
+Workspace=\uc791\uc5c5\uacf5\uac04
+wipe.out.confirm=\uc791\uc5c5\uacf5\uac04\uc744 \ucd08\uae30\ud654\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?
diff --git a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_lt.properties b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_lt.properties
index 543f60fae0..913bc959d1 100644
--- a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_lt.properties
+++ b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_lt.properties
@@ -20,13 +20,9 @@
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
-Back\ to\ Dashboard=Gr\u012F\u017Eti \u012F Prietais\u0173 skydel\u012Fsdfs
-Build\ scheduled=Konstrukcija suplanuota
+Back\ to\ Dashboard=Gr\u012f\u017eti \u012f Prietais\u0173 skydel\u012fsdfs
Changes=Pakeitimai
-Configure=Nustatyti
-Status=B\u016Bsena
-Wipe\ Out\ Workspace=I\u0161valyti vis\u0105 darbalauk\u012F
+Status=B\u016bsena
+Wipe\ Out\ Workspace=I\u0161valyti vis\u0105 darbalauk\u012f
Workspace=Darbalaukis
-delete=I\u0161trinti {0}
-delete.confirm=Ar j\u016Bs tikri, kad norite i\u0161trinti {0} "{1}"?
-wipe.out.confirm=Ar j\u016Bs tikri, kad norite i\u0161trinti visus duomenis darbalaukyje?
+wipe.out.confirm=Ar j\u016bs tikri, kad norite i\u0161trinti visus duomenis darbalaukyje?
diff --git a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_lv.properties b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_lv.properties
index 7f65c98e37..4feda737a6 100644
--- a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_lv.properties
+++ b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_lv.properties
@@ -20,13 +20,9 @@
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
-Back\ to\ Dashboard=Atpaka\u013C uz m\u0113rinstrumentu paneli
-Build\ scheduled=B\u016Bv\u0113jums iepl\u0101nots
+Back\ to\ Dashboard=Atpaka\u013c uz m\u0113rinstrumentu paneli
Changes=Izmai\u0146as
-Configure=Konfigur\u0113t
Status=Statuss
-Wipe\ Out\ Workspace=Izt\u012Br\u012Bt darbavirsmu
+Wipe\ Out\ Workspace=Izt\u012br\u012bt darbavirsmu
Workspace=Darbavirsma
-delete=Dz\u0113st {0}
-delete.confirm=Vai tie\u0161\u0101m dz\u0113st {0}, \u2018{1}\u2019?
-wipe.out.confirm=Vai esi p\u0101rliecin\u0101ts, ka v\u0113lies izt\u012Br\u012Bt darba mapi?
+wipe.out.confirm=Vai esi p\u0101rliecin\u0101ts, ka v\u0113lies izt\u012br\u012bt darba mapi?
diff --git a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_nb_NO.properties b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_nb_NO.properties
index 88e88c3957..b15503ed26 100644
--- a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_nb_NO.properties
+++ b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_nb_NO.properties
@@ -21,13 +21,8 @@
# THE SOFTWARE.
Back\ to\ Dashboard=Tilbake til oversikt
-Build\ scheduled=Versjonssteg lagt i k\u00F8
Changes=Endringer
-Configure=Konfigur\u00E9r
Status=Status
-View\ Configuration=Vis konfigurasjon
-Wipe\ Out\ Workspace=Nullstill arbeidsomr\u00E5de
-Workspace=Arbeidsomr\u00E5de
-delete=Slett {0}
-delete.confirm=Er du sikker p\u00E5 at du vil slette {0} \u2018{1}\u2019?
-wipe.out.confirm=Er du sikker p\u00E5 at du vil slette filene i arbeids omr\u00E5de
+Wipe\ Out\ Workspace=Nullstill arbeidsomr\u00e5de
+Workspace=Arbeidsomr\u00e5de
+wipe.out.confirm=Er du sikker p\u00e5 at du vil slette filene i arbeids omr\u00e5de
diff --git a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_nl.properties b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_nl.properties
index 0e4a786c58..8efc4dcfb5 100644
--- a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_nl.properties
+++ b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_nl.properties
@@ -22,11 +22,7 @@
Back\ to\ Dashboard=Terug naar dashboard
Status=Projectstatus
-Build\ scheduled=Bouw gepland
Changes=Wijzigingen
Wipe\ Out\ Workspace=Leeg Werkmap
Workspace=Werkmap
-delete={0} verwijderen
-Configure=Configureren
-delete.confirm=Ben je zeker van het verwijderen van de {0} {1}?
wipe.out.confirm=Ben je zeker van de werkplaats leegmaken?
diff --git a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_pl.properties b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_pl.properties
index 06ae13020a..5b8c205892 100644
--- a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_pl.properties
+++ b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_pl.properties
@@ -20,13 +20,8 @@
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
-Back\ to\ Dashboard=Powr\u00F3t do Dashboard''u
-Build\ scheduled=Kompilacja zaplanowana
+Back\ to\ Dashboard=Powr\u00f3t do Dashboard''u
Changes=Rejestr zmian
-Configure=Konfiguruj
-View\ Configuration=Podgl\u0105d konfiguracji
-Wipe\ Out\ Workspace=Wyczy\u015B\u0107 przestrze\u0144 robocz\u0105
+Wipe\ Out\ Workspace=Wyczy\u015b\u0107 przestrze\u0144 robocz\u0105
Workspace=Przestrze\u0144 robocza
-delete=Usu\u0144 {0}
-delete.confirm=Czy na pewno usun\u0105\u0107 {0} \u2018{1}\u2019?
-wipe.out.confirm=Czy na pewno wyczy\u015Bci\u0107 przestrze\u0144 robocz\u0105?
+wipe.out.confirm=Czy na pewno wyczy\u015bci\u0107 przestrze\u0144 robocz\u0105?
diff --git a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_pt_BR.properties b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_pt_BR.properties
index 5f5c8076a2..0c5243b19d 100644
--- a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_pt_BR.properties
+++ b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_pt_BR.properties
@@ -22,11 +22,6 @@
Back\ to\ Dashboard=Voltar para o Dashboard
Status=Situa\u00e7\u00e3o
-Build\ scheduled=build agendada
Changes=Altera\u00e7\u00f5es
Wipe\ Out\ Workspace=Limpar workspace
-delete=Excluir {0}
-Configure=Configurar
-View\ Configuration= Configurar a view
-delete.confirm=Quer mesmo remover {0} '{1}'?
wipe.out.confirm=Tem certeza que quer remover o workspace?
diff --git a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_pt_PT.properties b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_pt_PT.properties
index 59425a653f..2aa9f3f43a 100644
--- a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_pt_PT.properties
+++ b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_pt_PT.properties
@@ -21,11 +21,7 @@
# THE SOFTWARE.
Back\ to\ Dashboard=Voltar para o Dashboard
-Build\ scheduled=Build Agendado
-Changes=Altera\u00E7\u00F5es
-Configure=Configurar
+Changes=Altera\u00e7\u00f5es
Status=Estado
-Wipe\ Out\ Workspace=Limpe para fora o espa\u00E7o de trabalho atual
-delete=Eliminar {0}
-delete.confirm=Voc\u00EA tem certeza sobre a exclus\u00E3o do {0} {1} ''?
-wipe.out.confirm=Tem certeza acabando com o espa\u00E7o de trabalho?
+Wipe\ Out\ Workspace=Limpe para fora o espa\u00e7o de trabalho atual
+wipe.out.confirm=Tem certeza acabando com o espa\u00e7o de trabalho?
diff --git a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_ro.properties b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_ro.properties
index f2bfdcc1cb..a35313f314 100644
--- a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_ro.properties
+++ b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_ro.properties
@@ -21,12 +21,8 @@
# THE SOFTWARE.
Back\ to\ Dashboard=Inapoi la Dashboard
-Build\ scheduled=Build programat
Changes=Schimb\u0103ri
-Configure=Configureaz\u0103
Status=Stare
-Wipe\ Out\ Workspace=Cur\u0103\u021B\u0103 spa\u021Biul de lucru
-Workspace=Spa\u021Biul de lucru
-delete=\u0218terge {0}
-delete.confirm=E\u0219ti sigur c\u0103 vrei s\u0103 \u0219tergi {0} \u2018{1}\u2019?
-wipe.out.confirm=E\u0219ti sigur c\u0103 vrei s\u0103 cure\u021Bi spa\u021Biul de lucru?
+Wipe\ Out\ Workspace=Cur\u0103\u021b\u0103 spa\u021biul de lucru
+Workspace=Spa\u021biul de lucru
+wipe.out.confirm=E\u0219ti sigur c\u0103 vrei s\u0103 cure\u021bi spa\u021biul de lucru?
diff --git a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_ru.properties b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_ru.properties
index 63fc57f51b..cab30ebfd7 100644
--- a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_ru.properties
+++ b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_ru.properties
@@ -23,11 +23,6 @@
Back\ to\ Dashboard=\u041d\u0430 \u0433\u043b\u0430\u0432\u043d\u0443\u044e
Status=\u0421\u0442\u0430\u0442\u0443\u0441
Changes=\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f
-View\ Configuration=\u0421\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e
Wipe\ Out\ Workspace=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0432\u0441\u0435 \u0432 \u0441\u0431\u043e\u0440\u043e\u0447\u043d\u043e\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438
Workspace=\u0421\u0431\u043e\u0440\u043e\u0447\u043d\u0430\u044f \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f
-delete=\u0423\u0434\u0430\u043b\u0438\u0442\u044c {0}
-Configure=\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438
-Build\ scheduled=\u0421\u0431\u043e\u0440\u043a\u0430 \u0437\u0430\u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0430
-delete.confirm=\u0412\u044b \u0442\u043e\u0447\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c {0} \u2018{1}\u2019?
wipe.out.confirm=\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0432\u0441\u0435 \u0444\u0430\u0439\u043b\u044b \u0438\u0437 \u0440\u0430\u0431\u043e\u0447\u0435\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430?
diff --git a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_si.properties b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_si.properties
index 1e608e8652..871e1bdc86 100644
--- a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_si.properties
+++ b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_si.properties
@@ -1,7 +1,5 @@
# This file is under the MIT License by authors
-Back\ to\ Dashboard=\u0D86\u0DB4\u0DC3\u0DD4 \u0DB1\u0DD2\u0DBB\u0DD3\u0D9A\u0DCA\u0DC2\u0DAB \u0DB4\u0DD2\u0DA7\u0DD4\u0DC0\u0DA7
-Changes=\u0DC0\u0DD9\u0DB1\u0DC3\u0DCA\u0D9A\u0DB8\u0DCA
-Configure=\u0DC3\u0D9A\u0DC3\u0DB1\u0DCA\u0DB1
-Status=\u0DAD\u0DAD\u0DCA\u0DC0\u0DBA
-delete=\u0DB8\u0D9A\u0DB1\u0DCA\u0DB1 {0}
+Back\ to\ Dashboard=\u0d86\u0db4\u0dc3\u0dd4 \u0db1\u0dd2\u0dbb\u0dd3\u0d9a\u0dca\u0dc2\u0dab \u0db4\u0dd2\u0da7\u0dd4\u0dc0\u0da7
+Changes=\u0dc0\u0dd9\u0db1\u0dc3\u0dca\u0d9a\u0db8\u0dca
+Status=\u0dad\u0dad\u0dca\u0dc0\u0dba
diff --git a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_sk.properties b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_sk.properties
index 920c73c75a..a85399d897 100644
--- a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_sk.properties
+++ b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_sk.properties
@@ -20,13 +20,9 @@
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
-Back\ to\ Dashboard=Sp\u00E4\u0165 na Dashboard
-Build\ scheduled=Zostavenie napl\u00E1novan\u00E9
+Back\ to\ Dashboard=Sp\u00e4\u0165 na Dashboard
Changes=Zmeny
-Configure=Nastav
-Status=S\u00FAhrn
-Wipe\ Out\ Workspace=Vy\u010Disti\u0165 pracovn\u00FD priestor
-Workspace=Pracovn\u00FD priestor
-delete=Odstr\u00E1ni\u0165
-delete.confirm=Si si ist\u00FD vymazan\u00EDm {0} ''{1}''?
-wipe.out.confirm=Si si ist\u00FD vymazan\u00EDm pracovn\u00E9ho priestoru?
+Status=S\u00fahrn
+Wipe\ Out\ Workspace=Vy\u010disti\u0165 pracovn\u00fd priestor
+Workspace=Pracovn\u00fd priestor
+wipe.out.confirm=Si si ist\u00fd vymazan\u00edm pracovn\u00e9ho priestoru?
diff --git a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_sl.properties b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_sl.properties
index 84870f8eac..52226789c1 100644
--- a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_sl.properties
+++ b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_sl.properties
@@ -21,12 +21,8 @@
# THE SOFTWARE.
Back\ to\ Dashboard=Nazaj na Pregledni zapis
-Build\ scheduled=Buildaj po umiku
Changes=Spremembe
-Configure=Nastavitve
Status=Stanje
Wipe\ Out\ Workspace=Bri\u0161i delovno okolje
Workspace=Delovno okolje
-delete=Izbri\u0161i
-delete.confirm=Ali ste prepri\u010Dana o izbrisanju ?
-wipe.out.confirm=Ali ste prepri\u010Dani, da bi izbrisal delovno okolje?
+wipe.out.confirm=Ali ste prepri\u010dani, da bi izbrisal delovno okolje?
diff --git a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_sr.properties b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_sr.properties
index 650f18c0ea..2eebf4c981 100644
--- a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_sr.properties
+++ b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_sr.properties
@@ -1,10 +1,6 @@
# This file is under the MIT License by authors
Back\ to\ Dashboard=Nazad na Tablu
-Build\ scheduled=Build je zakazan
Changes=Izmene
-Configure=Podesavana
Wipe\ Out\ Workspace=Obrisi Workspace
-delete=Obrisi {0}
-delete.confirm=Da li \u017Eeli\u0161 da obri\u0161e\u0161 {0} \u2018{1}\u2019?
-wipe.out.confirm=Da li si siguran da \u017Eeli\u0161 da poni\u0161ti\u0161 radni prostor
+wipe.out.confirm=Da li si siguran da \u017eeli\u0161 da poni\u0161ti\u0161 radni prostor
diff --git a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_sv_SE.properties b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_sv_SE.properties
index 5088b3cfde..2eb380d534 100644
--- a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_sv_SE.properties
+++ b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_sv_SE.properties
@@ -20,13 +20,9 @@
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
-Back\ to\ Dashboard=Tillbaka till \u00D6versikten
-Build\ scheduled=Jobbet schemalagt
+Back\ to\ Dashboard=Tillbaka till \u00d6versikten
Changes=F\u00f6r\u00e4ndringar
-Configure=Konfigurera
Status=Status
Wipe\ Out\ Workspace=Ta bort arbetsyta
Workspace=Arbetsyta
-delete=Ta bort {0}
-delete.confirm=\u00C4r du s\u00E4ker p\u00E5 att du vill ta bort {0} \u2018{1}\u2019?
wipe.out.confirm=\u00c4r du s\u00e4ker p\u00e5 att du vill rensa arbetsytan?
diff --git a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_te.properties b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_te.properties
index 8c568c0013..bea0ddc980 100644
--- a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_te.properties
+++ b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_te.properties
@@ -1,9 +1,7 @@
# This file is under the MIT License by authors
-Back\ to\ Dashboard=\u0C24\u0C3F\u0C30\u0C3F\u0C17\u0C3F \u0C21\u0C3E\u0C37\u0C4D\u0C2C\u0C4B\u0C30\u0C4D\u0C21\u0C4D \u0C15\u0C41
-Build\ scheduled=\u0C37\u0C46\u0C21\u0C4D\u0C2F\u0C42\u0C32\u0C4D \u0C1A\u0C47\u0C2F\u0C2C\u0C21\u0C3F\u0C28 \u0C2C\u0C3F\u0C32\u0C4D\u0C21\u0C4D
-Changes=\u0C2E\u0C3E\u0C30\u0C4D\u0C2A\u0C41\u0C32\u0C41
-Status=\u0C38\u0C4D\u0C1F\u0C47\u0C1F\u0C38\u0C4D
-Wipe\ Out\ Workspace=\u0C35\u0C30\u0C4D\u0C15\u0C4D \u0C38\u0C4D\u0C2A\u0C47\u0C38\u0C4D \u0C24\u0C41\u0C21\u0C41\u0C35\u0C41
-Workspace=\u0C35\u0C30\u0C4D\u0C15\u0C4D \u0C38\u0C4D\u0C2A\u0C47\u0C38\u0C4D
-delete=\u0C24\u0C4A\u0C32\u0C17\u0C3F\u0C02\u0C1A\u0C41 {0}
+Back\ to\ Dashboard=\u0c24\u0c3f\u0c30\u0c3f\u0c17\u0c3f \u0c21\u0c3e\u0c37\u0c4d\u0c2c\u0c4b\u0c30\u0c4d\u0c21\u0c4d \u0c15\u0c41
+Changes=\u0c2e\u0c3e\u0c30\u0c4d\u0c2a\u0c41\u0c32\u0c41
+Status=\u0c38\u0c4d\u0c1f\u0c47\u0c1f\u0c38\u0c4d
+Wipe\ Out\ Workspace=\u0c35\u0c30\u0c4d\u0c15\u0c4d \u0c38\u0c4d\u0c2a\u0c47\u0c38\u0c4d \u0c24\u0c41\u0c21\u0c41\u0c35\u0c41
+Workspace=\u0c35\u0c30\u0c4d\u0c15\u0c4d \u0c38\u0c4d\u0c2a\u0c47\u0c38\u0c4d
diff --git a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_th.properties b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_th.properties
index 6ebfb0a0eb..a717f2a0fb 100644
--- a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_th.properties
+++ b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_th.properties
@@ -1,10 +1,7 @@
# This file is under the MIT License by authors
-Back\ to\ Dashboard=\u0E01\u0E25\u0E31\u0E1A\u0E44\u0E1B\u0E22\u0E31\u0E07\u0E41\u0E14\u0E0A\u0E1A\u0E2D\u0E23\u0E4C\u0E14
-Build\ scheduled=\u0E1A\u0E34\u0E25\u0E14\u0E4C\u0E44\u0E14\u0E49\u0E16\u0E39\u0E01\u0E01\u0E33\u0E2B\u0E19\u0E14\u0E40\u0E27\u0E25\u0E32\u0E2A\u0E23\u0E49\u0E32\u0E07\u0E41\u0E25\u0E49\u0E27
-Changes=\u0E04\u0E27\u0E32\u0E21\u0E40\u0E1B\u0E25\u0E35\u0E48\u0E22\u0E19\u0E41\u0E1B\u0E25\u0E07
-Status=\u0E2A\u0E16\u0E32\u0E19\u0E30
-View\ Configuration=\u0E14\u0E39\u0E01\u0E32\u0E23\u0E1B\u0E23\u0E31\u0E1A\u0E15\u0E31\u0E49\u0E07\u0E04\u0E48\u0E32
-Wipe\ Out\ Workspace=\u0E25\u0E49\u0E32\u0E07\u0E1E\u0E37\u0E49\u0E19\u0E17\u0E35\u0E48\u0E17\u0E33\u0E07\u0E32\u0E19
-Workspace=\u0E1E\u0E37\u0E49\u0E19\u0E17\u0E35\u0E48\u0E17\u0E33\u0E07\u0E32\u0E19
-delete=\u0E25\u0E1A {0}
+Back\ to\ Dashboard=\u0e01\u0e25\u0e31\u0e1a\u0e44\u0e1b\u0e22\u0e31\u0e07\u0e41\u0e14\u0e0a\u0e1a\u0e2d\u0e23\u0e4c\u0e14
+Changes=\u0e04\u0e27\u0e32\u0e21\u0e40\u0e1b\u0e25\u0e35\u0e48\u0e22\u0e19\u0e41\u0e1b\u0e25\u0e07
+Status=\u0e2a\u0e16\u0e32\u0e19\u0e30
+Wipe\ Out\ Workspace=\u0e25\u0e49\u0e32\u0e07\u0e1e\u0e37\u0e49\u0e19\u0e17\u0e35\u0e48\u0e17\u0e33\u0e07\u0e32\u0e19
+Workspace=\u0e1e\u0e37\u0e49\u0e19\u0e17\u0e35\u0e48\u0e17\u0e33\u0e07\u0e32\u0e19
diff --git a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_tr.properties b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_tr.properties
index bcc869676d..e093cae2c2 100644
--- a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_tr.properties
+++ b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_tr.properties
@@ -20,13 +20,9 @@
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
-delete={0} sil
-Back\ to\ Dashboard=Kontrol Merkezi''ne D\u00F6n
+Back\ to\ Dashboard=Kontrol Merkezi''ne D\u00f6n
Status=Durum
Changes=De\u011fi\u015fiklikler
-Wipe\ Out\ Workspace=\u00C7al\u0131\u015Fma alan\u0131n\u0131 sil
+Wipe\ Out\ Workspace=\u00c7al\u0131\u015fma alan\u0131n\u0131 sil
Workspace=\u00c7al\u0131\u015fma Alan\u0131
-Configure=Konfig\u00fcrasyonu D\u00fczenle
-Build\ scheduled=Yap\u0131land\u0131rma planland\u0131
-delete.confirm=Silmek istedi\u011Finizden emin misiniz: {0} ''{1}''?
-wipe.out.confirm=T\u00FCm alan\u0131 silmek istedi\u011Finize emin misiniz?
+wipe.out.confirm=T\u00fcm alan\u0131 silmek istedi\u011finize emin misiniz?
diff --git a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_uk.properties b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_uk.properties
index 304a9dc4c3..ab36cd129a 100644
--- a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_uk.properties
+++ b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_uk.properties
@@ -20,13 +20,9 @@
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
-Back\ to\ Dashboard=\u041D\u0430\u0437\u0430\u0434 \u0434\u043E \u041F\u0430\u043D\u0435\u043B\u0456
-Build\ scheduled=\u0417\u0430\u043F\u043B\u0430\u043D\u043E\u0432\u0430\u043D\u0456 \u0437\u0431\u0456\u0440\u043A\u0438
-Changes=\u0417\u043C\u0456\u043D\u0438
-Configure=\u041D\u0430\u043B\u0430\u0448\u0442\u0443\u0432\u0430\u043D\u043D\u044F
+Back\ to\ Dashboard=\u041d\u0430\u0437\u0430\u0434 \u0434\u043e \u041f\u0430\u043d\u0435\u043b\u0456
+Changes=\u0417\u043c\u0456\u043d\u0438
Status=\u0421\u0442\u0430\u0442\u0443\u0441
-Wipe\ Out\ Workspace=\u041E\u0447\u0438\u0441\u0442\u0438\u0442\u0438 \u0440\u043E\u0431\u043E\u0447\u0438\u0439 \u043F\u0440\u043E\u0441\u0442\u0456\u0440
-Workspace=\u0420\u043E\u0431\u043E\u0447\u0438\u0439 \u041F\u0440\u043E\u0441\u0442\u0456\u0440
-delete=\u0412\u0438\u0434\u0430\u043B\u0438\u0442\u0438 {0}
-delete.confirm=\u0412\u0438 \u0432\u043F\u0435\u0432\u043D\u0435\u043D\u0456, \u0449\u043E \u0445\u043E\u0447\u0435\u0442\u0435 \u0432\u0438\u0434\u0430\u043B\u0438\u0442\u0438 {0} \u2018{1}\u2019?
-wipe.out.confirm=\u0412\u0438 \u0432\u043F\u0435\u0432\u043D\u0435\u043D\u0456, \u0449\u043E \u0445\u043E\u0447\u0435\u0442\u0435 \u0432\u0438\u0434\u0430\u043B\u0438\u0442\u0438 \u0440\u043E\u0431\u043E\u0447\u0456 \u0444\u0430\u0439\u043B\u0438?
+Wipe\ Out\ Workspace=\u041e\u0447\u0438\u0441\u0442\u0438\u0442\u0438 \u0440\u043e\u0431\u043e\u0447\u0438\u0439 \u043f\u0440\u043e\u0441\u0442\u0456\u0440
+Workspace=\u0420\u043e\u0431\u043e\u0447\u0438\u0439 \u041f\u0440\u043e\u0441\u0442\u0456\u0440
+wipe.out.confirm=\u0412\u0438 \u0432\u043f\u0435\u0432\u043d\u0435\u043d\u0456, \u0449\u043e \u0445\u043e\u0447\u0435\u0442\u0435 \u0432\u0438\u0434\u0430\u043b\u0438\u0442\u0438 \u0440\u043e\u0431\u043e\u0447\u0456 \u0444\u0430\u0439\u043b\u0438?
diff --git a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_zh_CN.properties b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_zh_CN.properties
index 08f9a336e5..eb009ec925 100644
--- a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_zh_CN.properties
+++ b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_zh_CN.properties
@@ -20,14 +20,9 @@
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
-Back\ to\ Dashboard=\u8FD4\u56DE\u9762\u677F
-Build\ scheduled=\u6784\u5EFA\u8BA1\u5212
-Changes=\u4FEE\u6539\u8BB0\u5F55
-Configure=\u914d\u7f6e
+Back\ to\ Dashboard=\u8fd4\u56de\u9762\u677f
+Changes=\u4fee\u6539\u8bb0\u5f55
Status=\u72b6\u6001
-View\ Configuration=\u67e5\u770b\u914d\u7f6e
-Wipe\ Out\ Workspace=\u6E05\u7406\u5DE5\u4F5C\u7A7A\u95F4
-Workspace=\u5DE5\u4F5C\u7A7A\u95F4
-delete=\u5220\u9664 {0}
-delete.confirm=\u786E\u8BA4\u5220\u9664 {0} \u2018{1}\u2019?
-wipe.out.confirm=\u786E\u5B9A\u60F3\u8981\u6E05\u7A7A\u5DE5\u4F5C\u7A7A\u95F4\u5417\uFF1F
+Wipe\ Out\ Workspace=\u6e05\u7406\u5de5\u4f5c\u7a7a\u95f4
+Workspace=\u5de5\u4f5c\u7a7a\u95f4
+wipe.out.confirm=\u786e\u5b9a\u60f3\u8981\u6e05\u7a7a\u5de5\u4f5c\u7a7a\u95f4\u5417\uff1f
diff --git a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_zh_TW.properties b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_zh_TW.properties
index c64b997543..726ef4a234 100644
--- a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_zh_TW.properties
+++ b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_zh_TW.properties
@@ -24,13 +24,7 @@
Back\ to\ Dashboard=\u56de\u5230\u5100\u8868\u677f
Status=\u72c0\u614b
Changes=\u8b8a\u66f4
-Workspace=\u5DE5\u4F5C\u76EE\u9304
-Wipe\ Out\ Workspace=\u6E05\u9664\u5DE5\u4F5C\u76EE\u9304
+Workspace=\u5de5\u4f5c\u76ee\u9304
+Wipe\ Out\ Workspace=\u6e05\u9664\u5de5\u4f5c\u76ee\u9304
-Build\ scheduled=\u5df2\u6392\u5165\u5efa\u7f6e
-
-delete=\u522A\u9664{0}
-Configure=\u7D44\u614B
-View\ Configuration=\u6aa2\u8996\u8a2d\u5b9a
-delete.confirm=\u60A8\u78BA\u5B9A\u8981\u522A\u9664 {0} \u2018{1}\u2019 \u55CE\uFF1F
wipe.out.confirm=\u78ba\u5b9a\u8981\u6e05\u9664\u5de5\u4f5c\u5340?
diff --git a/core/src/main/resources/hudson/model/Cause/UpstreamCause/description.jelly b/core/src/main/resources/hudson/model/Cause/UpstreamCause/description.jelly
index da21e43253..f751d68745 100644
--- a/core/src/main/resources/hudson/model/Cause/UpstreamCause/description.jelly
+++ b/core/src/main/resources/hudson/model/Cause/UpstreamCause/description.jelly
@@ -24,11 +24,23 @@ THE SOFTWARE.
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/core/src/main/resources/hudson/model/Cause/UpstreamCause/description.properties b/core/src/main/resources/hudson/model/Cause/UpstreamCause/description.properties
index 1702cffa2d..6465016a40 100644
--- a/core/src/main/resources/hudson/model/Cause/UpstreamCause/description.properties
+++ b/core/src/main/resources/hudson/model/Cause/UpstreamCause/description.properties
@@ -20,5 +20,6 @@
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
-started_by_project=Started by upstream project {0} build number {1}
+started_by_project=Started by upstream project {0} build number {1}
+started_by_project_with_deleted_build=Started by upstream project {0} build number {1}
caused_by=originally caused by:
diff --git a/core/src/main/resources/hudson/model/Cause/UpstreamCause/description_cs.properties b/core/src/main/resources/hudson/model/Cause/UpstreamCause/description_cs.properties
index 765f77ec8e..6dadacc8d5 100644
--- a/core/src/main/resources/hudson/model/Cause/UpstreamCause/description_cs.properties
+++ b/core/src/main/resources/hudson/model/Cause/UpstreamCause/description_cs.properties
@@ -1,3 +1,4 @@
# This file is under the MIT License by authors
-started_by_project=Spu\u0161t\u011Bno nad\u0159azen\u00FDm projektem {0} build \u010D\u00EDslo {1}
+started_by_project=Spu\u0161t\u011Bno nad\u0159azen\u00FDm projektem {0} build \u010D\u00EDslo {1}
+started_by_project_with_deleted_build=Spu\u0161t\u011Bno nad\u0159azen\u00FDm projektem {0} build \u010D\u00EDslo {1}
diff --git a/core/src/main/resources/hudson/model/Cause/UpstreamCause/description_da.properties b/core/src/main/resources/hudson/model/Cause/UpstreamCause/description_da.properties
index 544ac6bad5..d5d6abbe7e 100644
--- a/core/src/main/resources/hudson/model/Cause/UpstreamCause/description_da.properties
+++ b/core/src/main/resources/hudson/model/Cause/UpstreamCause/description_da.properties
@@ -20,4 +20,5 @@
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
-started_by_project=Startet af upstream projekt {0} byg nummer {1}
+started_by_project=Startet af upstream projekt {0} byg nummer {1}
+started_by_project_with_deleted_build=Startet af upstream projekt {0} byg nummer {1}
diff --git a/core/src/main/resources/hudson/model/Cause/UpstreamCause/description_de.properties b/core/src/main/resources/hudson/model/Cause/UpstreamCause/description_de.properties
index 1bb4deba17..e06ec4c0fa 100644
--- a/core/src/main/resources/hudson/model/Cause/UpstreamCause/description_de.properties
+++ b/core/src/main/resources/hudson/model/Cause/UpstreamCause/description_de.properties
@@ -21,5 +21,6 @@
# THE SOFTWARE.
caused_by=urspr\u00FCnglich ausgel\u00F6st durch:
-started_by_project=Gestartet durch vorgelagertes Projekt {0}, Build {1}
+started_by_project=Gestartet durch vorgelagertes Projekt {0}, Build {1}
+started_by_project_with_deleted_build=Gestartet durch vorgelagertes Projekt {0}, Build {1}
diff --git a/core/src/main/resources/hudson/model/Cause/UpstreamCause/description_es.properties b/core/src/main/resources/hudson/model/Cause/UpstreamCause/description_es.properties
index b274651aa1..7dd9d5530e 100644
--- a/core/src/main/resources/hudson/model/Cause/UpstreamCause/description_es.properties
+++ b/core/src/main/resources/hudson/model/Cause/UpstreamCause/description_es.properties
@@ -21,4 +21,5 @@
# THE SOFTWARE.
-started_by_project=Lanzado por la ejecuci\u00F3n n\u00FAmero {1} del proyecto padre\: {0}
+started_by_project=Lanzado por la ejecuci\u00F3n n\u00FAmero {1} del proyecto padre\: {0}
+started_by_project_with_deleted_build=Lanzado por la ejecuci\u00F3n n\u00FAmero {1} del proyecto padre\: {0}
diff --git a/core/src/main/resources/hudson/model/Cause/UpstreamCause/description_fi.properties b/core/src/main/resources/hudson/model/Cause/UpstreamCause/description_fi.properties
index 8817486edb..9cff3e9b65 100644
--- a/core/src/main/resources/hudson/model/Cause/UpstreamCause/description_fi.properties
+++ b/core/src/main/resources/hudson/model/Cause/UpstreamCause/description_fi.properties
@@ -20,4 +20,5 @@
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
-started_by_project=K\u00E4ynnist\u00E4j\u00E4 yl\u00E4virran projekti {0} k\u00E4\u00E4nn\u00F6snumero {1}
+started_by_project=K\u00E4ynnist\u00E4j\u00E4 yl\u00E4virran projekti {0} k\u00E4\u00E4nn\u00F6snumero {1}
+started_by_project_with_deleted_build=K\u00E4ynnist\u00E4j\u00E4 yl\u00E4virran projekti {0} k\u00E4\u00E4nn\u00F6snumero {1}
diff --git a/core/src/main/resources/hudson/model/Cause/UpstreamCause/description_fr.properties b/core/src/main/resources/hudson/model/Cause/UpstreamCause/description_fr.properties
index 845ada15a1..7f46cd410c 100644
--- a/core/src/main/resources/hudson/model/Cause/UpstreamCause/description_fr.properties
+++ b/core/src/main/resources/hudson/model/Cause/UpstreamCause/description_fr.properties
@@ -21,5 +21,6 @@
# THE SOFTWARE.
caused_by=Originellement lanc\u00E9 par:
-started_by_project=Lanc\u00E9 par le projet amont {0} avec le num\u00E9ro de construction {1}
+started_by_project=Lanc\u00E9 par le projet amont {0} avec le num\u00E9ro de construction {1}
+started_by_project_with_deleted_build=Lanc\u00E9 par le projet amont {0} avec le num\u00E9ro de construction {1}
diff --git a/core/src/main/resources/hudson/model/Cause/UpstreamCause/description_ja.properties b/core/src/main/resources/hudson/model/Cause/UpstreamCause/description_ja.properties
index 8cddc292f2..7631f49ad6 100644
--- a/core/src/main/resources/hudson/model/Cause/UpstreamCause/description_ja.properties
+++ b/core/src/main/resources/hudson/model/Cause/UpstreamCause/description_ja.properties
@@ -20,5 +20,6 @@
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
-started_by_project=\u4e0a\u6d41\u30d7\u30ed\u30b8\u30a7\u30af\u30c8{0}\u306e#{1}\u304c\u5b9f\u884c
+started_by_project=\u4e0a\u6d41\u30d7\u30ed\u30b8\u30a7\u30af\u30c8{0}\u306e#{1}\u304c\u5b9f\u884c
+started_by_project_with_deleted_build=\u4e0a\u6d41\u30d7\u30ed\u30b8\u30a7\u30af\u30c8{0}\u306e#{1}\u304c\u5b9f\u884c
caused_by=\u5143\u306e\u539f\u56e0:
\ No newline at end of file
diff --git a/core/src/main/resources/hudson/model/Cause/UpstreamCause/description_lv.properties b/core/src/main/resources/hudson/model/Cause/UpstreamCause/description_lv.properties
index 84e30925ff..d6eb00c13e 100644
--- a/core/src/main/resources/hudson/model/Cause/UpstreamCause/description_lv.properties
+++ b/core/src/main/resources/hudson/model/Cause/UpstreamCause/description_lv.properties
@@ -1,4 +1,5 @@
# This file is under the MIT License by authors
caused_by=s\u0101kotn\u0113ji izrais\u012Bjis:
-started_by_project=S\u0101kts no aug\u0161upstraumes projekta {0} b\u016Bv\u0113juma {1}
+started_by_project=S\u0101kts no aug\u0161upstraumes projekta {0} b\u016Bv\u0113juma {1}
+started_by_project_with_deleted_build=S\u0101kts no aug\u0161upstraumes projekta {0} b\u016Bv\u0113juma {1}
diff --git a/core/src/main/resources/hudson/model/Cause/UpstreamCause/description_nl.properties b/core/src/main/resources/hudson/model/Cause/UpstreamCause/description_nl.properties
index 7790e9864f..8fffede350 100644
--- a/core/src/main/resources/hudson/model/Cause/UpstreamCause/description_nl.properties
+++ b/core/src/main/resources/hudson/model/Cause/UpstreamCause/description_nl.properties
@@ -1,4 +1,5 @@
# This file is under the MIT License by authors
caused_by=oorspronkelijk veroorzaakt door:
-started_by_project=Gestart door stroomopwaarts project {0}, bouwpoging {1}
+started_by_project=Gestart door stroomopwaarts project {0}, bouwpoging {1}
+started_by_project_with_deleted_build=Gestart door stroomopwaarts project {0}, bouwpoging {1}
diff --git a/core/src/main/resources/hudson/model/Cause/UpstreamCause/description_pl.properties b/core/src/main/resources/hudson/model/Cause/UpstreamCause/description_pl.properties
index 3f7e182c85..ca975f6e8e 100644
--- a/core/src/main/resources/hudson/model/Cause/UpstreamCause/description_pl.properties
+++ b/core/src/main/resources/hudson/model/Cause/UpstreamCause/description_pl.properties
@@ -20,5 +20,6 @@
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
-started_by_project=Wystartowany przez projekt nadrz\u0119dny {0} o numerze {1}
+started_by_project=Wystartowany przez projekt nadrz\u0119dny {0} o numerze {1}
+started_by_project_with_deleted_build=Wystartowany przez projekt nadrz\u0119dny {0} o numerze {1}
caused_by=Pierwotnie spowodowany przez:
diff --git a/core/src/main/resources/hudson/model/Cause/UpstreamCause/description_pt_BR.properties b/core/src/main/resources/hudson/model/Cause/UpstreamCause/description_pt_BR.properties
index 6a45a43d52..bcd1781af9 100644
--- a/core/src/main/resources/hudson/model/Cause/UpstreamCause/description_pt_BR.properties
+++ b/core/src/main/resources/hudson/model/Cause/UpstreamCause/description_pt_BR.properties
@@ -22,4 +22,5 @@
# Started by upstream project {0} build number {1}
caused_by=Criado por originalidade de:
-started_by_project=Iniciado pelo build {1} do projeto {0}
+started_by_project=Iniciado pelo build {1} do projeto {0}
+started_by_project_with_deleted_build=Iniciado pelo build {1} do projeto {0}
diff --git a/core/src/main/resources/hudson/model/Cause/UpstreamCause/description_ru.properties b/core/src/main/resources/hudson/model/Cause/UpstreamCause/description_ru.properties
index b780a5ccda..d3ebf3a40b 100644
--- a/core/src/main/resources/hudson/model/Cause/UpstreamCause/description_ru.properties
+++ b/core/src/main/resources/hudson/model/Cause/UpstreamCause/description_ru.properties
@@ -1,4 +1,5 @@
# This file is under the MIT License by authors
caused_by=\u043F\u0435\u0440\u0432\u043E\u043D\u0430\u0447\u0430\u043B\u044C\u043D\u043E \u0437\u0430\u043F\u0443\u0449\u0435\u043D\u0430:
-started_by_project=\u0412\u044B\u0437\u0432\u0430\u043D \u0432\u043E\u0441\u0445\u043E\u0434\u044F\u0449\u0438\u043C \u043F\u0440\u043E\u0435\u043A\u0442\u043E\u043C {0}, \u0441\u0431\u043E\u0440\u043A\u0430 \u043D\u043E\u043C\u0435\u0440 {1}
+started_by_project=\u0412\u044B\u0437\u0432\u0430\u043D \u0432\u043E\u0441\u0445\u043E\u0434\u044F\u0449\u0438\u043C \u043F\u0440\u043E\u0435\u043A\u0442\u043E\u043C {0}, \u0441\u0431\u043E\u0440\u043A\u0430 \u043D\u043E\u043C\u0435\u0440 {1}
+started_by_project_with_deleted_build=\u0412\u044B\u0437\u0432\u0430\u043D \u0432\u043E\u0441\u0445\u043E\u0434\u044F\u0449\u0438\u043C \u043F\u0440\u043E\u0435\u043A\u0442\u043E\u043C {0}, \u0441\u0431\u043E\u0440\u043A\u0430 \u043D\u043E\u043C\u0435\u0440 {1}
diff --git a/core/src/main/resources/hudson/model/Cause/UpstreamCause/description_sk.properties b/core/src/main/resources/hudson/model/Cause/UpstreamCause/description_sk.properties
index af1048289d..2027b4fb26 100644
--- a/core/src/main/resources/hudson/model/Cause/UpstreamCause/description_sk.properties
+++ b/core/src/main/resources/hudson/model/Cause/UpstreamCause/description_sk.properties
@@ -1,4 +1,5 @@
# This file is under the MIT License by authors
caused_by=p\u00F4vodn\u00E1 pr\u00ED\u010Dina:
-started_by_project=Na\u0161tartovan\u00E9 upstream projektom {0} \u010D\u00EDslo zostavenia {1}
+started_by_project=Na\u0161tartovan\u00E9 upstream projektom {0} \u010D\u00EDslo zostavenia {1}
+started_by_project_with_deleted_build=Na\u0161tartovan\u00E9 upstream projektom {0} \u010D\u00EDslo zostavenia {1}
diff --git a/core/src/main/resources/hudson/model/Cause/UpstreamCause/description_sv_SE.properties b/core/src/main/resources/hudson/model/Cause/UpstreamCause/description_sv_SE.properties
index 546f4647a6..19a14d946d 100644
--- a/core/src/main/resources/hudson/model/Cause/UpstreamCause/description_sv_SE.properties
+++ b/core/src/main/resources/hudson/model/Cause/UpstreamCause/description_sv_SE.properties
@@ -1,4 +1,5 @@
# This file is under the MIT License by authors
caused_by=ursprungligen p\u00E5 grund av:
-started_by_project=Startad av projekt uppstr\u00F6ms {0} byggnummer {1}
+started_by_project=Startad av projekt uppstr\u00F6ms {0} byggnummer {1}
+started_by_project_with_deleted_build=Startad av projekt uppstr\u00F6ms {0} byggnummer {1}
diff --git a/core/src/main/resources/hudson/model/Cause/UpstreamCause/description_uk.properties b/core/src/main/resources/hudson/model/Cause/UpstreamCause/description_uk.properties
index cfe86aa6af..a137decaa7 100644
--- a/core/src/main/resources/hudson/model/Cause/UpstreamCause/description_uk.properties
+++ b/core/src/main/resources/hudson/model/Cause/UpstreamCause/description_uk.properties
@@ -20,4 +20,5 @@
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
-started_by_project=\u0417\u0430\u043F\u0443\u0449\u0435\u043D\u043E \u043A\u0435\u0440\u0456\u0432\u043D\u0438\u043C \u043F\u0440\u043E\u0435\u043A\u0442\u043E\u043C {0}, \u043F\u043E\u0431\u0443\u0434\u043E\u0432\u0430 \u043D\u043E\u043C\u0435\u0440 {1}
+started_by_project=\u0417\u0430\u043F\u0443\u0449\u0435\u043D\u043E \u043A\u0435\u0440\u0456\u0432\u043D\u0438\u043C \u043F\u0440\u043E\u0435\u043A\u0442\u043E\u043C {0}, \u043F\u043E\u0431\u0443\u0434\u043E\u0432\u0430 \u043D\u043E\u043C\u0435\u0440 {1}
+started_by_project_with_deleted_build=\u0417\u0430\u043F\u0443\u0449\u0435\u043D\u043E \u043A\u0435\u0440\u0456\u0432\u043D\u0438\u043C \u043F\u0440\u043E\u0435\u043A\u0442\u043E\u043C {0}, \u043F\u043E\u0431\u0443\u0434\u043E\u0432\u0430 \u043D\u043E\u043C\u0435\u0440 {1}
diff --git a/core/src/main/resources/hudson/model/Cause/UpstreamCause/description_zh_CN.properties b/core/src/main/resources/hudson/model/Cause/UpstreamCause/description_zh_CN.properties
index b90ffb3fc5..3c316130de 100644
--- a/core/src/main/resources/hudson/model/Cause/UpstreamCause/description_zh_CN.properties
+++ b/core/src/main/resources/hudson/model/Cause/UpstreamCause/description_zh_CN.properties
@@ -1,4 +1,5 @@
# This file is under the MIT License by authors
caused_by=\u89E6\u53D1\u6784\u5EFA
-started_by_project=\u7531\u4E0A\u6E38\u9879\u76EE {0} \u6784\u5EFA\u53F7 {1}
+started_by_project=\u7531\u4E0A\u6E38\u9879\u76EE {0} \u6784\u5EFA\u53F7 {1}
+started_by_project_with_deleted_build=\u7531\u4E0A\u6E38\u9879\u76EE {0} \u6784\u5EFA\u53F7 {1}
diff --git a/core/src/main/resources/hudson/model/Cause/UpstreamCause/description_zh_TW.properties b/core/src/main/resources/hudson/model/Cause/UpstreamCause/description_zh_TW.properties
index d7861edc8f..c9e7e445a3 100644
--- a/core/src/main/resources/hudson/model/Cause/UpstreamCause/description_zh_TW.properties
+++ b/core/src/main/resources/hudson/model/Cause/UpstreamCause/description_zh_TW.properties
@@ -20,5 +20,6 @@
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
-started_by_project=\u7531\u4e0a\u6e38\u5c08\u6848 {0} \u7684\u7b2c {1} \u6b21\u5efa\u7f6e\u6240\u89f8\u767c
+started_by_project=\u7531\u4e0a\u6e38\u5c08\u6848 {0} \u7684\u7b2c {1} \u6b21\u5efa\u7f6e\u6240\u89f8\u767c
+started_by_project_with_deleted_build=\u7531\u4e0a\u6e38\u5c08\u6848 {0} \u7684\u7b2c {1} \u6b21\u5efa\u7f6e\u6240\u89f8\u767c
caused_by=\u8d77\u56e0:
diff --git a/core/src/main/resources/hudson/model/AbstractProject/requirePOST.jelly b/core/src/main/resources/hudson/model/Job/requirePOST.jelly
similarity index 100%
rename from core/src/main/resources/hudson/model/AbstractProject/requirePOST.jelly
rename to core/src/main/resources/hudson/model/Job/requirePOST.jelly
diff --git a/core/src/main/resources/hudson/model/AbstractProject/requirePOST.properties b/core/src/main/resources/hudson/model/Job/requirePOST.properties
similarity index 100%
rename from core/src/main/resources/hudson/model/AbstractProject/requirePOST.properties
rename to core/src/main/resources/hudson/model/Job/requirePOST.properties
diff --git a/core/src/main/resources/hudson/model/AbstractProject/requirePOST_de.properties b/core/src/main/resources/hudson/model/Job/requirePOST_de.properties
similarity index 100%
rename from core/src/main/resources/hudson/model/AbstractProject/requirePOST_de.properties
rename to core/src/main/resources/hudson/model/Job/requirePOST_de.properties
diff --git a/core/src/main/resources/hudson/model/AbstractProject/requirePOST_ja.properties b/core/src/main/resources/hudson/model/Job/requirePOST_ja.properties
similarity index 100%
rename from core/src/main/resources/hudson/model/AbstractProject/requirePOST_ja.properties
rename to core/src/main/resources/hudson/model/Job/requirePOST_ja.properties
diff --git a/core/src/main/resources/hudson/model/AbstractProject/requirePOST_pt_BR.properties b/core/src/main/resources/hudson/model/Job/requirePOST_pt_BR.properties
similarity index 100%
rename from core/src/main/resources/hudson/model/AbstractProject/requirePOST_pt_BR.properties
rename to core/src/main/resources/hudson/model/Job/requirePOST_pt_BR.properties
diff --git a/core/src/main/resources/hudson/model/AbstractProject/requirePOST_zh_TW.properties b/core/src/main/resources/hudson/model/Job/requirePOST_zh_TW.properties
similarity index 100%
rename from core/src/main/resources/hudson/model/AbstractProject/requirePOST_zh_TW.properties
rename to core/src/main/resources/hudson/model/Job/requirePOST_zh_TW.properties
diff --git a/core/src/main/resources/hudson/model/Messages.properties b/core/src/main/resources/hudson/model/Messages.properties
index 83fd5f48d9..9a99586380 100644
--- a/core/src/main/resources/hudson/model/Messages.properties
+++ b/core/src/main/resources/hudson/model/Messages.properties
@@ -91,6 +91,7 @@ BallColor.Unstable=Unstable
CLI.clear-queue.shortDescription=Clears the build queue.
CLI.delete-job.shortDescription=Deletes a job.
+CLI.reload-job.shortDescription=Reloads this job from disk.
CLI.disable-job.shortDescription=Disables a job.
CLI.enable-job.shortDescription=Enables a job.
CLI.delete-node.shortDescription=Deletes a node.
diff --git a/core/src/main/resources/hudson/model/Messages_de.properties b/core/src/main/resources/hudson/model/Messages_de.properties
index 047ed8f2a7..d4e314b22a 100644
--- a/core/src/main/resources/hudson/model/Messages_de.properties
+++ b/core/src/main/resources/hudson/model/Messages_de.properties
@@ -22,14 +22,20 @@
AbstractBuild.BuildingRemotely=Baue auf Slave {0}
AbstractBuild.BuildingOnMaster=Baue auf Master
+AbstractBuild_Building=Baue
+AbstractBuild.BuildingInWorkspace=\ in Arbeitsbereich {0}
AbstractBuild.KeptBecause=zur\u00fcckbehalten wegen {0}
AbstractItem.NoSuchJobExists=Job ''{0}'' existiert nicht. Meinten Sie vielleicht ''{1}''?
+AbstractItem.Pronoun=Element
AbstractProject.NewBuildForWorkspace=Plane einen neuen Build, um einen Arbeitsbereich anzulegen.
AbstractProject.Pronoun=Projekt
AbstractProject.Aborted=Abgebrochen
AbstractProject.BuildInProgress=Build #{0} ist bereits in Arbeit{1}
+AbstractProject.BuildNow=Jetzt bauen
+AbstractProject.build_with_parameters=Bauen mit Parametern
AbstractProject.UpstreamBuildInProgress=Vorgelagertes Projekt {0} ist bereits in Arbeit.
+AbstractProject.DownstreamBuildInProgress=Nachgelagertes Projekt {0} ist bereits in Arbeit.
AbstractProject.Disabled=Build deaktiviert
AbstractProject.ETA=\ (ETA:{0})
AbstractProject.NoSCM=Kein SCM
@@ -66,6 +72,7 @@ BallColor.Aborted=Abgebrochen
BallColor.Disabled=Deaktiviert
BallColor.Failed=Fehlgeschlagen
BallColor.InProgress=In Arbeit
+BallColor.NotBuilt=Nicht gebaut
BallColor.Pending=Bevorstehend
BallColor.Success=Erfolgreich
BallColor.Unstable=Instabil
@@ -308,5 +315,4 @@ Cause.UserIdCause.ShortDescription=Gestartet durch Benutzer {0}
Cause.RemoteCause.ShortDescription=Gestartet durch entfernten Rechner {0}
Cause.RemoteCause.ShortDescriptionWithNote=Gestartet durch entfernten Rechner {0} mit Hinweis: {1}
-AbstractProject.BuildNow=Jetzt bauen
ManageJenkinsAction.DisplayName=Jenkins verwalten
diff --git a/core/src/main/resources/hudson/model/ParametersAction/index.jelly b/core/src/main/resources/hudson/model/ParametersAction/index.jelly
index b163b8f3aa..2c25579adc 100644
--- a/core/src/main/resources/hudson/model/ParametersAction/index.jelly
+++ b/core/src/main/resources/hudson/model/ParametersAction/index.jelly
@@ -29,7 +29,7 @@ THE SOFTWARE.
-
+
diff --git a/core/src/main/resources/hudson/model/ParametersDefinitionProperty/index.jelly b/core/src/main/resources/hudson/model/ParametersDefinitionProperty/index.jelly
index ec2bd58aec..d91f088dcb 100644
--- a/core/src/main/resources/hudson/model/ParametersDefinitionProperty/index.jelly
+++ b/core/src/main/resources/hudson/model/ParametersDefinitionProperty/index.jelly
@@ -36,10 +36,10 @@ THE SOFTWARE.
-->
-
+
${%LOADING}
-
${it.owner.pronoun} ${it.owner.displayName}
+
${it.job.pronoun} ${it.job.displayName}
${%description}
+ ${instance} : ${instance!=null} : ${instance.class}
diff --git a/core/src/main/resources/hudson/tasks/BuildTrigger/config.jelly b/core/src/main/resources/hudson/tasks/BuildTrigger/config.jelly
index 3e0f31d68c..4ff3c11354 100644
--- a/core/src/main/resources/hudson/tasks/BuildTrigger/config.jelly
+++ b/core/src/main/resources/hudson/tasks/BuildTrigger/config.jelly
@@ -33,7 +33,7 @@ THE SOFTWARE.
+ title="${%Trigger only if build is stable}" value="SUCCESS"/>
diff --git a/core/src/main/resources/lib/hudson/project/configurable.jelly b/core/src/main/resources/lib/hudson/project/configurable.jelly
new file mode 100644
index 0000000000..66a41b1712
--- /dev/null
+++ b/core/src/main/resources/lib/hudson/project/configurable.jelly
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/core/src/main/resources/lib/hudson/project/configurable.properties b/core/src/main/resources/lib/hudson/project/configurable.properties
new file mode 100644
index 0000000000..a61ee48077
--- /dev/null
+++ b/core/src/main/resources/lib/hudson/project/configurable.properties
@@ -0,0 +1,24 @@
+# The MIT License
+#
+# Copyright 2014 Jesse Glick.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+
+delete=Delete {0}
+delete.confirm=Are you sure about deleting the {0} \u2018{1}\u2019?
diff --git a/core/src/main/resources/lib/hudson/project/configurable_ar.properties b/core/src/main/resources/lib/hudson/project/configurable_ar.properties
new file mode 100644
index 0000000000..ae43171b38
--- /dev/null
+++ b/core/src/main/resources/lib/hudson/project/configurable_ar.properties
@@ -0,0 +1,25 @@
+# The MIT License
+#
+# Copyright 2014 Jesse Glick.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+
+Build\ scheduled=\u0628\u0631\u0646\u0627\u0645\u062c \u0627\u0644\u0628\u0646\u0627\u0621
+Configure=\u063a\u064a\u0631 \u0627\u0644\u0625\u0639\u062f\u0627\u062f\u0627\u062a
+delete=\u062e\u0630\u0641
diff --git a/core/src/main/resources/lib/hudson/project/configurable_bg.properties b/core/src/main/resources/lib/hudson/project/configurable_bg.properties
new file mode 100644
index 0000000000..10ba94dfd7
--- /dev/null
+++ b/core/src/main/resources/lib/hudson/project/configurable_bg.properties
@@ -0,0 +1,26 @@
+# The MIT License
+#
+# Copyright 2014 Jesse Glick.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+
+Build\ scheduled=\u041d\u0430\u0441\u0440\u043e\u0447\u0435\u043d \u0431\u0438\u043b\u0434
+Configure=\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0430\u0439
+delete=\u0418\u0437\u0442\u0440\u0438\u0439 {0}
+delete.confirm=\u0421\u0438\u0433\u0443\u0440\u043d\u0438 \u043b\u0438 \u0441\u0442\u0435, \u0447\u0435 \u0438\u0441\u043a\u0430\u0442\u0435 \u0434\u0430 \u0438\u0437\u0442\u0440\u0438\u0435\u0442\u0435 {0} \u2018{1}\u2019?
diff --git a/core/src/main/resources/lib/hudson/project/configurable_ca.properties b/core/src/main/resources/lib/hudson/project/configurable_ca.properties
new file mode 100644
index 0000000000..c7e45e429b
--- /dev/null
+++ b/core/src/main/resources/lib/hudson/project/configurable_ca.properties
@@ -0,0 +1,26 @@
+# The MIT License
+#
+# Copyright 2014 Jesse Glick.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+
+Build\ scheduled=Construcci\u00f3 programada
+Configure=Configura
+delete=Suprimeix {0}
+delete.confirm=Est\u00e0s segur que vols esborrar {0} \u2018{1}\u2019?
diff --git a/core/src/main/resources/lib/hudson/project/configurable_cs.properties b/core/src/main/resources/lib/hudson/project/configurable_cs.properties
new file mode 100644
index 0000000000..0d23024288
--- /dev/null
+++ b/core/src/main/resources/lib/hudson/project/configurable_cs.properties
@@ -0,0 +1,26 @@
+# The MIT License
+#
+# Copyright 2014 Jesse Glick.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+
+Build\ scheduled=Sestaven\u00ed napl\u00e1nov\u00e1no
+Configure=Nastavit
+delete=Smazat {0}
+delete.confirm=Jste si jisti, \u017ee chcete smazat {0} \u2018{1}\u2019?
diff --git a/core/src/main/resources/lib/hudson/project/configurable_da.properties b/core/src/main/resources/lib/hudson/project/configurable_da.properties
new file mode 100644
index 0000000000..47bf0e6ac1
--- /dev/null
+++ b/core/src/main/resources/lib/hudson/project/configurable_da.properties
@@ -0,0 +1,27 @@
+# The MIT License
+#
+# Copyright 2014 Jesse Glick.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+
+delete=Slet {0}
+Configure=Konfigurer
+Build\ scheduled=Byg planlagt
+View\ Configuration=Vis konfiguration
+delete.confirm=Er du sikker p\u00e5 at du vil slette {0} ''{1}''?
diff --git a/core/src/main/resources/lib/hudson/project/configurable_de.properties b/core/src/main/resources/lib/hudson/project/configurable_de.properties
new file mode 100644
index 0000000000..a883c645d9
--- /dev/null
+++ b/core/src/main/resources/lib/hudson/project/configurable_de.properties
@@ -0,0 +1,27 @@
+# The MIT License
+#
+# Copyright 2014 Jesse Glick.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+
+delete={0} L\u00f6schen
+Configure=Konfigurieren
+View\ Configuration=Konfiguration anzeigen
+Build\ scheduled=Build geplant
+delete.confirm=Sind Sie sicher, dass Sie das {0} \u2018{1}\u2019 l\u00f6schen m\u00f6chten?
diff --git a/core/src/main/resources/lib/hudson/project/configurable_el.properties b/core/src/main/resources/lib/hudson/project/configurable_el.properties
new file mode 100644
index 0000000000..78e4ad51a4
--- /dev/null
+++ b/core/src/main/resources/lib/hudson/project/configurable_el.properties
@@ -0,0 +1,25 @@
+# The MIT License
+#
+# Copyright 2014 Jesse Glick.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+
+Build\ scheduled=\u03a4\u03bf build \u03c0\u03c1\u03bf\u03b3\u03c1\u03b1\u03bc\u03bc\u03b1\u03c4\u03af\u03c3\u03c4\u03b7\u03ba\u03b5
+Configure=\u03a1\u03c5\u03b8\u03bc\u03af\u03c3\u03b5\u03b9\u03c2
+delete=\u0394\u03b9\u03b1\u03b3\u03c1\u03b1\u03c6\u03ae
diff --git a/core/src/main/resources/lib/hudson/project/configurable_es.properties b/core/src/main/resources/lib/hudson/project/configurable_es.properties
new file mode 100644
index 0000000000..0270695a2d
--- /dev/null
+++ b/core/src/main/resources/lib/hudson/project/configurable_es.properties
@@ -0,0 +1,27 @@
+# The MIT License
+#
+# Copyright 2014 Jesse Glick.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+
+Build\ scheduled=Ejecuci\u00f3n planificada
+Configure=Configurar
+delete=Borrar {0}
+View\ Configuration=Ver Configuraci\u00f3n
+delete.confirm=Est\u00e1s seguro de querer borrar el {0} `{1}\u00b4
diff --git a/core/src/main/resources/lib/hudson/project/configurable_es_AR.properties b/core/src/main/resources/lib/hudson/project/configurable_es_AR.properties
new file mode 100644
index 0000000000..4d931e0c17
--- /dev/null
+++ b/core/src/main/resources/lib/hudson/project/configurable_es_AR.properties
@@ -0,0 +1,25 @@
+# The MIT License
+#
+# Copyright 2014 Jesse Glick.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+
+Build\ scheduled=Construcci\u00f3n agendada
+Configure=Configurar
+delete=Eliminar {0}
diff --git a/core/src/main/resources/lib/hudson/project/configurable_et.properties b/core/src/main/resources/lib/hudson/project/configurable_et.properties
new file mode 100644
index 0000000000..58f9930e2a
--- /dev/null
+++ b/core/src/main/resources/lib/hudson/project/configurable_et.properties
@@ -0,0 +1,26 @@
+# The MIT License
+#
+# Copyright 2014 Jesse Glick.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+
+Build\ scheduled=T\u00f6\u00f6 on tellitud
+Configure=Seadista
+delete=Kustuta {0}
+delete.confirm=Oled sa ikka kindel et soovid kustutada {0} \u2018{1}\u2019?
diff --git a/core/src/main/resources/lib/hudson/project/configurable_eu.properties b/core/src/main/resources/lib/hudson/project/configurable_eu.properties
new file mode 100644
index 0000000000..1b721b9c06
--- /dev/null
+++ b/core/src/main/resources/lib/hudson/project/configurable_eu.properties
@@ -0,0 +1,24 @@
+# The MIT License
+#
+# Copyright 2014 Jesse Glick.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+
+Configure=Itxuratu
+delete={0} Ezabatu
diff --git a/core/src/main/resources/lib/hudson/project/configurable_fi.properties b/core/src/main/resources/lib/hudson/project/configurable_fi.properties
new file mode 100644
index 0000000000..9201a690c6
--- /dev/null
+++ b/core/src/main/resources/lib/hudson/project/configurable_fi.properties
@@ -0,0 +1,26 @@
+# The MIT License
+#
+# Copyright 2014 Jesse Glick.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+
+Build\ scheduled=K\u00e4\u00e4nn\u00f6s on jonossa
+Configure=Muokkaa
+delete=Poista projekti
+delete.confirm=Oletko varmna ett\u00e4 {0} ''{1}'' poistetaan ?
diff --git a/core/src/main/resources/lib/hudson/project/configurable_fr.properties b/core/src/main/resources/lib/hudson/project/configurable_fr.properties
new file mode 100644
index 0000000000..2b90f0495b
--- /dev/null
+++ b/core/src/main/resources/lib/hudson/project/configurable_fr.properties
@@ -0,0 +1,27 @@
+# The MIT License
+#
+# Copyright 2014 Jesse Glick.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+
+delete=Supprimer {0}
+Configure=Configurer
+Build\ scheduled=Build programm\u00e9
+View\ Configuration=Voir la configuration
+delete.confirm=\u00cates-vous s\u00fbr de vouloir supprimer le {0} \u2018{1}\u2019?
diff --git a/core/src/main/resources/lib/hudson/project/configurable_gl.properties b/core/src/main/resources/lib/hudson/project/configurable_gl.properties
new file mode 100644
index 0000000000..a3d9d9314e
--- /dev/null
+++ b/core/src/main/resources/lib/hudson/project/configurable_gl.properties
@@ -0,0 +1,24 @@
+# The MIT License
+#
+# Copyright 2014 Jesse Glick.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+
+Build\ scheduled=Compilaci\u00f3n programada
+delete=Borrar {0}
diff --git a/core/src/main/resources/lib/hudson/project/configurable_he.properties b/core/src/main/resources/lib/hudson/project/configurable_he.properties
new file mode 100644
index 0000000000..4e6a524313
--- /dev/null
+++ b/core/src/main/resources/lib/hudson/project/configurable_he.properties
@@ -0,0 +1,26 @@
+# The MIT License
+#
+# Copyright 2014 Jesse Glick.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+
+Build\ scheduled=\u05ea\u05d6\u05de\u05d5\u05df \u05d1\u05e0\u05d9\u05d9\u05d4
+Configure=\u05d4\u05d2\u05d3\u05e8\u05d4
+delete={0} \u05de\u05d7\u05e7
+delete.confirm=\u05d4\u05d0\u05dd \u05d0\u05ea\u05d4 \u05d1\u05d8\u05d5\u05d7 \u05e9\u05d1\u05e8\u05e6\u05d5\u05e0\u05da \u05dc\u05de\u05d7\u05d5\u05e7 \u05d0\u05ea {0} ''{1}''?
diff --git a/core/src/main/resources/lib/hudson/project/configurable_hi_IN.properties b/core/src/main/resources/lib/hudson/project/configurable_hi_IN.properties
new file mode 100644
index 0000000000..28df56936b
--- /dev/null
+++ b/core/src/main/resources/lib/hudson/project/configurable_hi_IN.properties
@@ -0,0 +1,24 @@
+# The MIT License
+#
+# Copyright 2014 Jesse Glick.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+
+Configure=\u0915\u0949\u0928\u094d\u092b\u093c\u093f\u0917\u0930
+delete=\u0939\u091f\u093e\u0928\u093e
diff --git a/core/src/main/resources/lib/hudson/project/configurable_hu.properties b/core/src/main/resources/lib/hudson/project/configurable_hu.properties
new file mode 100644
index 0000000000..10dfd54360
--- /dev/null
+++ b/core/src/main/resources/lib/hudson/project/configurable_hu.properties
@@ -0,0 +1,26 @@
+# The MIT License
+#
+# Copyright 2014 Jesse Glick.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+
+Build\ scheduled=\u00c9p\u00edt\u00e9s be\u00fctemez\u00e9se
+Configure=Be\u00e1ll\u00edt\u00e1sok
+delete={0} t\u00f6rl\u00e9se
+delete.confirm=Biztosan t\u00f6rli a {0} \u2018{1}\u2019?
diff --git a/core/src/main/resources/lib/hudson/project/configurable_id.properties b/core/src/main/resources/lib/hudson/project/configurable_id.properties
new file mode 100644
index 0000000000..b100a17e59
--- /dev/null
+++ b/core/src/main/resources/lib/hudson/project/configurable_id.properties
@@ -0,0 +1,23 @@
+# The MIT License
+#
+# Copyright 2014 Jesse Glick.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+
+Build\ scheduled=Jadwal Pembangunan
diff --git a/core/src/main/resources/lib/hudson/project/configurable_is.properties b/core/src/main/resources/lib/hudson/project/configurable_is.properties
new file mode 100644
index 0000000000..678dce19d7
--- /dev/null
+++ b/core/src/main/resources/lib/hudson/project/configurable_is.properties
@@ -0,0 +1,25 @@
+# The MIT License
+#
+# Copyright 2014 Jesse Glick.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+
+Build\ scheduled=\u00c1\u00e6tla\u00f0ar keyrslur
+Configure=Breyta
+delete=Ey\u00f0a {0}
diff --git a/core/src/main/resources/lib/hudson/project/configurable_it.properties b/core/src/main/resources/lib/hudson/project/configurable_it.properties
new file mode 100644
index 0000000000..c4a2782261
--- /dev/null
+++ b/core/src/main/resources/lib/hudson/project/configurable_it.properties
@@ -0,0 +1,26 @@
+# The MIT License
+#
+# Copyright 2014 Jesse Glick.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+
+Build\ scheduled=Lavoro pianificato
+Configure=Configura
+delete=Elimina {0}
+delete.confirm=Si sicuro di voler cancellare {0} \u2018{1}\u2019?
diff --git a/core/src/main/resources/lib/hudson/project/configurable_ja.properties b/core/src/main/resources/lib/hudson/project/configurable_ja.properties
new file mode 100644
index 0000000000..14e2fb5d5d
--- /dev/null
+++ b/core/src/main/resources/lib/hudson/project/configurable_ja.properties
@@ -0,0 +1,27 @@
+# The MIT License
+#
+# Copyright 2014 Jesse Glick.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+
+delete={0}\u306e\u524a\u9664
+Configure=\u8a2d\u5b9a
+Build\ scheduled=\u30d3\u30eb\u30c9\u304c\u30b9\u30b1\u30b8\u30e5\u30fc\u30eb\u3055\u308c\u307e\u3057\u305f
+View\ Configuration=\u8a2d\u5b9a\u306e\u53c2\u7167
+delete.confirm={0} "{1}"\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?
diff --git a/core/src/main/resources/lib/hudson/project/configurable_kn.properties b/core/src/main/resources/lib/hudson/project/configurable_kn.properties
new file mode 100644
index 0000000000..f63ecd0f01
--- /dev/null
+++ b/core/src/main/resources/lib/hudson/project/configurable_kn.properties
@@ -0,0 +1,25 @@
+# The MIT License
+#
+# Copyright 2014 Jesse Glick.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+
+Build\ scheduled=\u0cac\u0cbf\u0cb2\u0ccd\u0ca1\u0ccd \u0c85\u0ca8\u0cc1\u0cb8\u0cc2\u0c9a\u0cbf
+Configure=\u0cb8\u0c82\u0cb0\u0c9a\u0cbf\u0cb8\u0cc1
+delete=\u0c85\u0cb3\u0cbf\u0cb8\u0cc1
diff --git a/core/src/main/resources/lib/hudson/project/configurable_ko.properties b/core/src/main/resources/lib/hudson/project/configurable_ko.properties
new file mode 100644
index 0000000000..23b90346c6
--- /dev/null
+++ b/core/src/main/resources/lib/hudson/project/configurable_ko.properties
@@ -0,0 +1,26 @@
+# The MIT License
+#
+# Copyright 2014 Jesse Glick.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+
+Build\ scheduled=\uacc4\ud68d\ub41c \ube4c\ub4dc
+Configure=\uad6c\uc131
+delete={0} \uc0ad\uc81c
+delete.confirm={0} \uc744 \uc0ad\uc81c\ud558\ub294\uac70\uc5d0 \ub300\ud574 \ub3d9\uc758\ud558\uc2ed\ub2c8\uae4c? ''{1}''
diff --git a/core/src/main/resources/lib/hudson/project/configurable_lt.properties b/core/src/main/resources/lib/hudson/project/configurable_lt.properties
new file mode 100644
index 0000000000..cf01c535e5
--- /dev/null
+++ b/core/src/main/resources/lib/hudson/project/configurable_lt.properties
@@ -0,0 +1,26 @@
+# The MIT License
+#
+# Copyright 2014 Jesse Glick.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+
+Build\ scheduled=Konstrukcija suplanuota
+Configure=Nustatyti
+delete=I\u0161trinti {0}
+delete.confirm=Ar j\u016bs tikri, kad norite i\u0161trinti {0} "{1}"?
diff --git a/core/src/main/resources/lib/hudson/project/configurable_lv.properties b/core/src/main/resources/lib/hudson/project/configurable_lv.properties
new file mode 100644
index 0000000000..f4c3deec4c
--- /dev/null
+++ b/core/src/main/resources/lib/hudson/project/configurable_lv.properties
@@ -0,0 +1,26 @@
+# The MIT License
+#
+# Copyright 2014 Jesse Glick.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+
+Build\ scheduled=B\u016bv\u0113jums iepl\u0101nots
+Configure=Konfigur\u0113t
+delete=Dz\u0113st {0}
+delete.confirm=Vai tie\u0161\u0101m dz\u0113st {0}, \u2018{1}\u2019?
diff --git a/core/src/main/resources/lib/hudson/project/configurable_nb_NO.properties b/core/src/main/resources/lib/hudson/project/configurable_nb_NO.properties
new file mode 100644
index 0000000000..f00f9588d9
--- /dev/null
+++ b/core/src/main/resources/lib/hudson/project/configurable_nb_NO.properties
@@ -0,0 +1,27 @@
+# The MIT License
+#
+# Copyright 2014 Jesse Glick.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+
+Build\ scheduled=Versjonssteg lagt i k\u00f8
+Configure=Konfigur\u00e9r
+View\ Configuration=Vis konfigurasjon
+delete=Slett {0}
+delete.confirm=Er du sikker p\u00e5 at du vil slette {0} \u2018{1}\u2019?
diff --git a/core/src/main/resources/lib/hudson/project/configurable_nl.properties b/core/src/main/resources/lib/hudson/project/configurable_nl.properties
new file mode 100644
index 0000000000..8bf8f3cb50
--- /dev/null
+++ b/core/src/main/resources/lib/hudson/project/configurable_nl.properties
@@ -0,0 +1,26 @@
+# The MIT License
+#
+# Copyright 2014 Jesse Glick.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+
+Build\ scheduled=Bouw gepland
+delete={0} verwijderen
+Configure=Configureren
+delete.confirm=Ben je zeker van het verwijderen van de {0} {1}?
diff --git a/core/src/main/resources/lib/hudson/project/configurable_pl.properties b/core/src/main/resources/lib/hudson/project/configurable_pl.properties
new file mode 100644
index 0000000000..e93f340c5d
--- /dev/null
+++ b/core/src/main/resources/lib/hudson/project/configurable_pl.properties
@@ -0,0 +1,27 @@
+# The MIT License
+#
+# Copyright 2014 Jesse Glick.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+
+Build\ scheduled=Kompilacja zaplanowana
+Configure=Konfiguruj
+View\ Configuration=Podgl\u0105d konfiguracji
+delete=Usu\u0144 {0}
+delete.confirm=Czy na pewno usun\u0105\u0107 {0} \u2018{1}\u2019?
diff --git a/core/src/main/resources/lib/hudson/project/configurable_pt_BR.properties b/core/src/main/resources/lib/hudson/project/configurable_pt_BR.properties
new file mode 100644
index 0000000000..d56206fcc2
--- /dev/null
+++ b/core/src/main/resources/lib/hudson/project/configurable_pt_BR.properties
@@ -0,0 +1,27 @@
+# The MIT License
+#
+# Copyright 2014 Jesse Glick.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+
+Build\ scheduled=build agendada
+delete=Excluir {0}
+Configure=Configurar
+View\ Configuration= Configurar a view
+delete.confirm=Quer mesmo remover {0} '{1}'?
diff --git a/core/src/main/resources/lib/hudson/project/configurable_pt_PT.properties b/core/src/main/resources/lib/hudson/project/configurable_pt_PT.properties
new file mode 100644
index 0000000000..fb39e8562b
--- /dev/null
+++ b/core/src/main/resources/lib/hudson/project/configurable_pt_PT.properties
@@ -0,0 +1,26 @@
+# The MIT License
+#
+# Copyright 2014 Jesse Glick.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+
+Build\ scheduled=Build Agendado
+Configure=Configurar
+delete=Eliminar {0}
+delete.confirm=Voc\u00ea tem certeza sobre a exclus\u00e3o do {0} {1} ''?
diff --git a/core/src/main/resources/lib/hudson/project/configurable_ro.properties b/core/src/main/resources/lib/hudson/project/configurable_ro.properties
new file mode 100644
index 0000000000..8f4d4dab6b
--- /dev/null
+++ b/core/src/main/resources/lib/hudson/project/configurable_ro.properties
@@ -0,0 +1,26 @@
+# The MIT License
+#
+# Copyright 2014 Jesse Glick.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+
+Build\ scheduled=Build programat
+Configure=Configureaz\u0103
+delete=\u0218terge {0}
+delete.confirm=E\u0219ti sigur c\u0103 vrei s\u0103 \u0219tergi {0} \u2018{1}\u2019?
diff --git a/core/src/main/resources/lib/hudson/project/configurable_ru.properties b/core/src/main/resources/lib/hudson/project/configurable_ru.properties
new file mode 100644
index 0000000000..9f9d1c1d12
--- /dev/null
+++ b/core/src/main/resources/lib/hudson/project/configurable_ru.properties
@@ -0,0 +1,27 @@
+# The MIT License
+#
+# Copyright 2014 Jesse Glick.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+
+View\ Configuration=\u0421\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e
+delete=\u0423\u0434\u0430\u043b\u0438\u0442\u044c {0}
+Configure=\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438
+Build\ scheduled=\u0421\u0431\u043e\u0440\u043a\u0430 \u0437\u0430\u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0430
+delete.confirm=\u0412\u044b \u0442\u043e\u0447\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c {0} \u2018{1}\u2019?
diff --git a/core/src/main/resources/lib/hudson/project/configurable_si.properties b/core/src/main/resources/lib/hudson/project/configurable_si.properties
new file mode 100644
index 0000000000..e7950da6d3
--- /dev/null
+++ b/core/src/main/resources/lib/hudson/project/configurable_si.properties
@@ -0,0 +1,24 @@
+# The MIT License
+#
+# Copyright 2014 Jesse Glick.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+
+Configure=\u0dc3\u0d9a\u0dc3\u0db1\u0dca\u0db1
+delete=\u0db8\u0d9a\u0db1\u0dca\u0db1 {0}
diff --git a/core/src/main/resources/lib/hudson/project/configurable_sk.properties b/core/src/main/resources/lib/hudson/project/configurable_sk.properties
new file mode 100644
index 0000000000..7f14c934cd
--- /dev/null
+++ b/core/src/main/resources/lib/hudson/project/configurable_sk.properties
@@ -0,0 +1,26 @@
+# The MIT License
+#
+# Copyright 2014 Jesse Glick.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+
+Build\ scheduled=Zostavenie napl\u00e1novan\u00e9
+Configure=Nastav
+delete=Odstr\u00e1ni\u0165
+delete.confirm=Si si ist\u00fd vymazan\u00edm {0} ''{1}''?
diff --git a/core/src/main/resources/lib/hudson/project/configurable_sl.properties b/core/src/main/resources/lib/hudson/project/configurable_sl.properties
new file mode 100644
index 0000000000..7ed175f8b0
--- /dev/null
+++ b/core/src/main/resources/lib/hudson/project/configurable_sl.properties
@@ -0,0 +1,26 @@
+# The MIT License
+#
+# Copyright 2014 Jesse Glick.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+
+Build\ scheduled=Buildaj po umiku
+Configure=Nastavitve
+delete=Izbri\u0161i
+delete.confirm=Ali ste prepri\u010dana o izbrisanju ?
diff --git a/core/src/main/resources/lib/hudson/project/configurable_sr.properties b/core/src/main/resources/lib/hudson/project/configurable_sr.properties
new file mode 100644
index 0000000000..2b7db5910f
--- /dev/null
+++ b/core/src/main/resources/lib/hudson/project/configurable_sr.properties
@@ -0,0 +1,26 @@
+# The MIT License
+#
+# Copyright 2014 Jesse Glick.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+
+Build\ scheduled=Build je zakazan
+Configure=Podesavana
+delete=Obrisi {0}
+delete.confirm=Da li \u017eeli\u0161 da obri\u0161e\u0161 {0} \u2018{1}\u2019?
diff --git a/core/src/main/resources/lib/hudson/project/configurable_sv_SE.properties b/core/src/main/resources/lib/hudson/project/configurable_sv_SE.properties
new file mode 100644
index 0000000000..ba0fcb2de5
--- /dev/null
+++ b/core/src/main/resources/lib/hudson/project/configurable_sv_SE.properties
@@ -0,0 +1,26 @@
+# The MIT License
+#
+# Copyright 2014 Jesse Glick.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+
+Build\ scheduled=Jobbet schemalagt
+Configure=Konfigurera
+delete=Ta bort {0}
+delete.confirm=\u00c4r du s\u00e4ker p\u00e5 att du vill ta bort {0} \u2018{1}\u2019?
diff --git a/core/src/main/resources/lib/hudson/project/configurable_te.properties b/core/src/main/resources/lib/hudson/project/configurable_te.properties
new file mode 100644
index 0000000000..af089b3159
--- /dev/null
+++ b/core/src/main/resources/lib/hudson/project/configurable_te.properties
@@ -0,0 +1,24 @@
+# The MIT License
+#
+# Copyright 2014 Jesse Glick.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+
+Build\ scheduled=\u0c37\u0c46\u0c21\u0c4d\u0c2f\u0c42\u0c32\u0c4d \u0c1a\u0c47\u0c2f\u0c2c\u0c21\u0c3f\u0c28 \u0c2c\u0c3f\u0c32\u0c4d\u0c21\u0c4d
+delete=\u0c24\u0c4a\u0c32\u0c17\u0c3f\u0c02\u0c1a\u0c41 {0}
diff --git a/core/src/main/resources/lib/hudson/project/configurable_th.properties b/core/src/main/resources/lib/hudson/project/configurable_th.properties
new file mode 100644
index 0000000000..f926fb928b
--- /dev/null
+++ b/core/src/main/resources/lib/hudson/project/configurable_th.properties
@@ -0,0 +1,25 @@
+# The MIT License
+#
+# Copyright 2014 Jesse Glick.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+
+Build\ scheduled=\u0e1a\u0e34\u0e25\u0e14\u0e4c\u0e44\u0e14\u0e49\u0e16\u0e39\u0e01\u0e01\u0e33\u0e2b\u0e19\u0e14\u0e40\u0e27\u0e25\u0e32\u0e2a\u0e23\u0e49\u0e32\u0e07\u0e41\u0e25\u0e49\u0e27
+View\ Configuration=\u0e14\u0e39\u0e01\u0e32\u0e23\u0e1b\u0e23\u0e31\u0e1a\u0e15\u0e31\u0e49\u0e07\u0e04\u0e48\u0e32
+delete=\u0e25\u0e1a {0}
diff --git a/core/src/main/resources/lib/hudson/project/configurable_tr.properties b/core/src/main/resources/lib/hudson/project/configurable_tr.properties
new file mode 100644
index 0000000000..f89453dcb6
--- /dev/null
+++ b/core/src/main/resources/lib/hudson/project/configurable_tr.properties
@@ -0,0 +1,26 @@
+# The MIT License
+#
+# Copyright 2014 Jesse Glick.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+
+delete={0} sil
+Configure=Konfig\u00fcrasyonu D\u00fczenle
+Build\ scheduled=Yap\u0131land\u0131rma planland\u0131
+delete.confirm=Silmek istedi\u011finizden emin misiniz: {0} ''{1}''?
diff --git a/core/src/main/resources/lib/hudson/project/configurable_uk.properties b/core/src/main/resources/lib/hudson/project/configurable_uk.properties
new file mode 100644
index 0000000000..7f51c3bde5
--- /dev/null
+++ b/core/src/main/resources/lib/hudson/project/configurable_uk.properties
@@ -0,0 +1,26 @@
+# The MIT License
+#
+# Copyright 2014 Jesse Glick.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+
+Build\ scheduled=\u0417\u0430\u043f\u043b\u0430\u043d\u043e\u0432\u0430\u043d\u0456 \u0437\u0431\u0456\u0440\u043a\u0438
+delete=\u0412\u0438\u0434\u0430\u043b\u0438\u0442\u0438 {0}
+delete.confirm=\u0412\u0438 \u0432\u043f\u0435\u0432\u043d\u0435\u043d\u0456, \u0449\u043e \u0445\u043e\u0447\u0435\u0442\u0435 \u0432\u0438\u0434\u0430\u043b\u0438\u0442\u0438 {0} \u2018{1}\u2019?
+Configure=\u041d\u0430\u043b\u0430\u0448\u0442\u0443\u0432\u0430\u043d\u043d\u044f
diff --git a/core/src/main/resources/lib/hudson/project/configurable_zh_CN.properties b/core/src/main/resources/lib/hudson/project/configurable_zh_CN.properties
new file mode 100644
index 0000000000..4f4ffcb66b
--- /dev/null
+++ b/core/src/main/resources/lib/hudson/project/configurable_zh_CN.properties
@@ -0,0 +1,27 @@
+# The MIT License
+#
+# Copyright 2014 Jesse Glick.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+
+delete=\u5220\u9664 {0}
+delete.confirm=\u786e\u8ba4\u5220\u9664 {0} \u2018{1}\u2019?
+Configure=\u914d\u7f6e
+View\ Configuration=\u67e5\u770b\u914d\u7f6e
+Build\ scheduled=\u6784\u5efa\u8ba1\u5212
diff --git a/core/src/main/resources/lib/hudson/project/configurable_zh_TW.properties b/core/src/main/resources/lib/hudson/project/configurable_zh_TW.properties
new file mode 100644
index 0000000000..00be1418e9
--- /dev/null
+++ b/core/src/main/resources/lib/hudson/project/configurable_zh_TW.properties
@@ -0,0 +1,27 @@
+# The MIT License
+#
+# Copyright 2014 Jesse Glick.
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+# THE SOFTWARE.
+
+delete=\u522a\u9664{0}
+delete.confirm=\u60a8\u78ba\u5b9a\u8981\u522a\u9664 {0} \u2018{1}\u2019 \u55ce\uff1f
+Build\ scheduled=\u5df2\u6392\u5165\u5efa\u7f6e
+Configure=\u7d44\u614b
+View\ Configuration=\u6aa2\u8996\u8a2d\u5b9a
diff --git a/core/src/test/java/hudson/util/io/ZipArchiverTest.java b/core/src/test/java/hudson/util/io/ZipArchiverTest.java
index d30adf9a23..650f1c9723 100644
--- a/core/src/test/java/hudson/util/io/ZipArchiverTest.java
+++ b/core/src/test/java/hudson/util/io/ZipArchiverTest.java
@@ -9,14 +9,14 @@ import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Enumeration;
+import java.util.logging.Level;
+import java.util.logging.Logger;
import java.util.zip.ZipFile;
import java.util.zip.ZipEntry;
-import org.apache.commons.logging.LogFactory;
-import org.apache.commons.logging.Log;
public class ZipArchiverTest extends TestCase {
- private final Log logger = LogFactory.getLog(getClass());
+ private static final Logger LOGGER = Logger.getLogger(ZipArchiverTest.class.getName());
private File tmpDir;
@@ -103,7 +103,7 @@ public class ZipArchiverTest extends TestCase {
* @param cause the root cause of the failure
*/
private final void fail(final String msg, final Throwable cause) {
- logger.error(msg, cause);
+ LOGGER.log(Level.SEVERE, msg, cause);
fail(msg);
}
diff --git a/debian/debian/changelog b/debian/debian/changelog
index e94e020934..8a93f93083 100644
--- a/debian/debian/changelog
+++ b/debian/debian/changelog
@@ -1,3 +1,15 @@
+jenkins (1.555) unstable; urgency=low
+
+ * See http://jenkins-ci.org/changelog for more details.
+
+ -- Kohsuke Kawaguchi Sun, 16 Mar 2014 22:43:02 -0700
+
+jenkins (1.554) unstable; urgency=low
+
+ * See http://jenkins-ci.org/changelog for more details.
+
+ -- Kohsuke Kawaguchi Mon, 10 Mar 2014 07:26:41 -0700
+
jenkins (1.553) unstable; urgency=low
* See http://jenkins-ci.org/changelog for more details.
diff --git a/plugins/pom.xml b/plugins/pom.xml
index bee7e510f4..eff68aacb3 100644
--- a/plugins/pom.xml
+++ b/plugins/pom.xml
@@ -11,7 +11,7 @@
org.jenkins-ci.pluginspluginJenkins plugin POM
- 1.555-SNAPSHOT
+ 1.557-SNAPSHOTpom