diff --git a/changelog.html b/changelog.html index e04568957c319e3d59fff058a718bcba074ac490..dc3af86882f33b2d805ba0e679598081d3f78925 100644 --- a/changelog.html +++ b/changelog.html @@ -55,8 +55,84 @@ Upcoming changes +

What's new in 2.1 (2016/05/01)

+ + +

What's new in 2.0 (2016/04/20)

More detailed information about the new features in Jenkins 2.0 on the overview page. diff --git a/cli/pom.xml b/cli/pom.xml index d8e6094ef60f727e217f5b9406a2890cdce61647..5b1f922317edb685ea90730db7ccc0d9be21b4ee 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main pom - 2.1-SNAPSHOT + 2.2-SNAPSHOT cli diff --git a/core/pom.xml b/core/pom.xml index bbda7215308cac433465e4b9ccf51e04e0b96782..b88578f152eb148d2ec1c90880730dd25365fa2b 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.1-SNAPSHOT + 2.2-SNAPSHOT jenkins-core @@ -39,7 +39,7 @@ THE SOFTWARE. true - 1.239 + 1.243 2.5.6.SEC03 2.4.6 diff --git a/core/src/main/java/hudson/ExtensionFinder.java b/core/src/main/java/hudson/ExtensionFinder.java index d262f6800162c65fc8f4a81cb923ddc18e9f4826..6208f6cec8322a0145f2fc4436519000d07e0ce6 100644 --- a/core/src/main/java/hudson/ExtensionFinder.java +++ b/core/src/main/java/hudson/ExtensionFinder.java @@ -431,7 +431,7 @@ public abstract class ExtensionFinder implements ExtensionPoint { if (verbose) { LOGGER.log(Level.WARNING, "Failed to instantiate " + key + "; skipping this component", x); } else { - LOGGER.log(Level.WARNING, "Failed to instantiate optional component {0}; skipping", key.getTypeLiteral()); + LOGGER.log(Level.INFO, "Failed to instantiate optional component {0}; skipping", key.getTypeLiteral()); LOGGER.log(Level.FINE, key.toString(), x); } } diff --git a/core/src/main/java/hudson/PluginManager.java b/core/src/main/java/hudson/PluginManager.java index a18c9fcac0aa4c7f17a3760d65069e4c78c1c604..b3974a5b74dd5882f9d38af31ca843f50752d299 100644 --- a/core/src/main/java/hudson/PluginManager.java +++ b/core/src/main/java/hudson/PluginManager.java @@ -109,6 +109,7 @@ import java.util.Enumeration; import java.util.HashMap; import java.util.HashSet; import java.util.Hashtable; +import java.util.Iterator; import java.util.LinkedHashSet; import java.util.List; import java.util.ListIterator; @@ -452,6 +453,14 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas session.addAll(g.discoverTasks(session)); } }); + + // All plugins are loaded. Now we can figure out who depends on who. + requires(PLUGINS_PREPARED).attains(COMPLETED).add("Resolving Dependant Plugins Graph", new Executable() { + @Override + public void run(Reactor reactor) throws Exception { + resolveDependantPlugins(); + } + }); }}); } @@ -660,6 +669,14 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas * TODO: revisit where/how to expose this. This is an experiment. */ public void dynamicLoad(File arc) throws IOException, InterruptedException, RestartRequiredException { + dynamicLoad(arc, false); + } + + /** + * Try the dynamicLoad, removeExisting to attempt to dynamic load disabled plugins + */ + @Restricted(NoExternalUse.class) + public void dynamicLoad(File arc, boolean removeExisting) throws IOException, InterruptedException, RestartRequiredException { LOGGER.info("Attempting to dynamic load "+arc); PluginWrapper p = null; String sn; @@ -670,9 +687,21 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas p = strategy.createPluginWrapper(arc); sn = p.getShortName(); } - if (getPlugin(sn)!=null) - throw new RestartRequiredException(Messages._PluginManager_PluginIsAlreadyInstalled_RestartRequired(sn)); - + PluginWrapper pw = getPlugin(sn); + if (pw!=null) { + if (removeExisting) { // try to load disabled plugins + for (Iterator i = plugins.iterator(); i.hasNext();) { + pw = i.next(); + if(sn.equals(pw.getShortName())) { + i.remove(); + pw = null; + break; + } + } + } else { + throw new RestartRequiredException(Messages._PluginManager_PluginIsAlreadyInstalled_RestartRequired(sn)); + } + } if (p == null) { p = strategy.createPluginWrapper(arc); } diff --git a/core/src/main/java/hudson/WebAppMain.java b/core/src/main/java/hudson/WebAppMain.java index fce3cafa1f5e322e948b9483e8b5caf013f679f2..a808088ae698b060f2109847d06cefa88849d7ac 100644 --- a/core/src/main/java/hudson/WebAppMain.java +++ b/core/src/main/java/hudson/WebAppMain.java @@ -224,6 +224,11 @@ public class WebAppMain implements ServletContextListener { boolean success = false; try { Jenkins instance = new Hudson(_home, context); + + // one last check to make sure everything is in order before we go live + if (Thread.interrupted()) + throw new InterruptedException(); + context.setAttribute(APP, instance); BootFailure.getBootFailureFile(_home).delete(); diff --git a/core/src/main/java/hudson/model/UpdateCenter.java b/core/src/main/java/hudson/model/UpdateCenter.java index e5e157dde70f3c5a363c04e4c6dc1e938c4230e4..d8aaa4d5245528e854cea731c03ea53d2d2c8a32 100644 --- a/core/src/main/java/hudson/model/UpdateCenter.java +++ b/core/src/main/java/hudson/model/UpdateCenter.java @@ -1405,7 +1405,52 @@ public class UpdateCenter extends AbstractModelObject implements Saveable, OnMas } - + + /** + * Enables a required plugin, provides feedback in the update center + */ + public class EnableJob extends InstallationJob { + public EnableJob(UpdateSite site, Authentication auth, @Nonnull Plugin plugin, boolean dynamicLoad) { + super(plugin, site, auth, dynamicLoad); + } + + public Plugin getPlugin() { + return plugin; + } + + @Override + public void run() { + try { + plugin.getInstalled().enable(); + } catch (IOException e) { + LOGGER.log(Level.SEVERE, "Failed to enable " + plugin.getDisplayName(), e); + error = e; + } + + if (dynamicLoad) { + try { + // remove the existing, disabled inactive plugin to force a new one to load + pm.dynamicLoad(getDestination(), true); + } catch (Exception e) { + LOGGER.log(Level.SEVERE, "Failed to dynamically load " + plugin.getDisplayName(), e); + error = e; + requiresRestart = true; + } + } else { + requiresRestart = true; + } + } + } + + /** + * A no-op, e.g. this plugin is already installed + */ + public class NoOpJob extends EnableJob { + public NoOpJob(UpdateSite site, Authentication auth, @Nonnull Plugin plugin) { + super(site, auth, plugin, false); + } + } + /** * Base class for a job that downloads a file from the Jenkins project. */ @@ -1575,6 +1620,15 @@ public class UpdateCenter extends AbstractModelObject implements Saveable, OnMas } } + /** + * Indicates that the plugin was successfully installed. + */ + public class Skipped extends InstallationStatus { + @Override public boolean isSuccess() { + return true; + } + } + /** * Indicates that the plugin is waiting for its turn for installation. */ @@ -1619,19 +1673,19 @@ public class UpdateCenter extends AbstractModelObject implements Saveable, OnMas /** * Represents the state of the installation activity of one plugin. */ - public final class InstallationJob extends DownloadJob { + public class InstallationJob extends DownloadJob { /** * What plugin are we trying to install? */ @Exported public final Plugin plugin; - private final PluginManager pm = Jenkins.getInstance().getPluginManager(); + protected final PluginManager pm = Jenkins.getInstance().getPluginManager(); /** * True to load the plugin into this Jenkins, false to wait until restart. */ - private final boolean dynamicLoad; + protected final boolean dynamicLoad; /** * @deprecated as of 1.442 @@ -1667,29 +1721,81 @@ public class UpdateCenter extends AbstractModelObject implements Saveable, OnMas @Override public void _run() throws IOException, InstallationStatus { - super._run(); + if (wasInstalled()) { + // Do this first so we can avoid duplicate downloads, too + // check to see if the plugin is already installed at the same version and skip it + LOGGER.info("Skipping duplicate install of: " + plugin.getDisplayName() + "@" + plugin.version); + //throw new Skipped(); // TODO set skipped once we have a status indicator for it + return; + } + try { + super._run(); + + // if this is a bundled plugin, make sure it won't get overwritten + PluginWrapper pw = plugin.getInstalled(); + if (pw!=null && pw.isBundled()) { + SecurityContext oldContext = ACL.impersonate(ACL.SYSTEM); + try { + pw.doPin(); + } finally { + SecurityContextHolder.setContext(oldContext); + } + } - // if this is a bundled plugin, make sure it won't get overwritten - PluginWrapper pw = plugin.getInstalled(); - if (pw!=null && pw.isBundled()) { - SecurityContext oldContext = ACL.impersonate(ACL.SYSTEM); - try { - pw.doPin(); - } finally { - SecurityContextHolder.setContext(oldContext); + if (dynamicLoad) { + try { + pm.dynamicLoad(getDestination()); + } catch (RestartRequiredException e) { + throw new SuccessButRequiresRestart(e.message); + } catch (Exception e) { + throw new IOException("Failed to dynamically deploy this plugin",e); + } + } else { + throw new SuccessButRequiresRestart(Messages._UpdateCenter_DownloadButNotActivated()); + } + } finally { + synchronized(this) { + // There may be other threads waiting on completion + LOGGER.fine("Install complete for: " + plugin.getDisplayName() + "@" + plugin.version); + // some status other than Installing or Downloading needs to be set here + // {@link #isAlreadyInstalling()}, it will be overwritten by {@link DownloadJob#run()} + status = new Skipped(); + notifyAll(); } } + } - if (dynamicLoad) { - try { - pm.dynamicLoad(getDestination()); - } catch (RestartRequiredException e) { - throw new SuccessButRequiresRestart(e.message); - } catch (Exception e) { - throw new IOException("Failed to dynamically deploy this plugin",e); + /** + * Indicates there is another installation job for this plugin + * @since TODO + */ + protected boolean wasInstalled() { + synchronized(UpdateCenter.this) { + for (UpdateCenterJob job : getJobs()) { + if (job == this) { + // oldest entries first, if we reach this instance, + // we need it to continue installing + return false; + } + if (job instanceof InstallationJob) { + InstallationJob ij = (InstallationJob)job; + if (ij.plugin.equals(plugin) && ij.plugin.version.equals(plugin.version)) { + // wait until other install is completed + synchronized(ij) { + if(ij.status instanceof Installing || ij.status instanceof Pending) { + try { + LOGGER.fine("Waiting for other plugin install of: " + plugin.getDisplayName() + "@" + plugin.version); + ij.wait(); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } + } + return true; + } + } } - } else { - throw new SuccessButRequiresRestart(Messages._UpdateCenter_DownloadButNotActivated()); + return false; } } diff --git a/core/src/main/java/hudson/model/UpdateSite.java b/core/src/main/java/hudson/model/UpdateSite.java index c8c8ff7c20a432907acb527489bc3cafd22c0945..53b3226f4e2d8abab544d9a137b09442978ab416 100644 --- a/core/src/main/java/hudson/model/UpdateSite.java +++ b/core/src/main/java/hudson/model/UpdateSite.java @@ -731,6 +731,10 @@ public class UpdateSite { else if (current.isOlderThan(requiredVersion)) { deps.add(depPlugin); } + // JENKINS-34494 - or if the plugin is disabled, this will allow us to enable it + else if (!current.isEnabled()) { + deps.add(depPlugin); + } } for(Map.Entry e : optionalDependencies.entrySet()) { @@ -847,10 +851,22 @@ public class UpdateSite { for (Plugin dep : getNeededDependencies()) { UpdateCenter.InstallationJob job = uc.getJob(dep); if (job == null || job.status instanceof UpdateCenter.DownloadJob.Failure) { - LOGGER.log(Level.WARNING, "Adding dependent install of " + dep.name + " for plugin " + name); + LOGGER.log(Level.INFO, "Adding dependent install of " + dep.name + " for plugin " + name); dep.deploy(dynamicLoad); } else { - LOGGER.log(Level.WARNING, "Dependent install of " + dep.name + " for plugin " + name + " already added, skipping"); + LOGGER.log(Level.INFO, "Dependent install of " + dep.name + " for plugin " + name + " already added, skipping"); + } + } + PluginWrapper pw = getInstalled(); + if(pw != null) { // JENKINS-34494 - check for this plugin being disabled + Future enableJob = null; + if(!pw.isEnabled()) { + UpdateCenter.EnableJob job = uc.new EnableJob(UpdateSite.this, null, this, dynamicLoad); + job.setCorrelationId(correlationId); + enableJob = uc.addJob(job); + } + if(pw.getVersionNumber().equals(new VersionNumber(version))) { + return enableJob != null ? enableJob : uc.addJob(uc.new NoOpJob(UpdateSite.this, null, this)); } } UpdateCenter.InstallationJob job = uc.new InstallationJob(this, UpdateSite.this, Jenkins.getAuthentication(), dynamicLoad); diff --git a/core/src/main/java/hudson/slaves/SlaveComputer.java b/core/src/main/java/hudson/slaves/SlaveComputer.java index ed846e66de563aae233b511719e499e8d8fb82ba..590eb07648987f29c1a0ce7c0430877d3cdf67c2 100644 --- a/core/src/main/java/hudson/slaves/SlaveComputer.java +++ b/core/src/main/java/hudson/slaves/SlaveComputer.java @@ -249,7 +249,7 @@ public class SlaveComputer extends Computer { try { for (ComputerListener cl : ComputerListener.all()) cl.preLaunch(SlaveComputer.this, taskListener); - + offlineCause = null; launcher.launch(SlaveComputer.this, taskListener); } catch (AbortException e) { taskListener.error(e.getMessage()); @@ -266,7 +266,7 @@ public class SlaveComputer extends Computer { throw e; } } finally { - if (channel==null) { + if (channel==null && offlineCause == null) { offlineCause = new OfflineCause.LaunchFailed(); for (ComputerListener cl : ComputerListener.all()) cl.onLaunchFailure(SlaveComputer.this, taskListener); diff --git a/core/src/main/java/jenkins/model/Jenkins.java b/core/src/main/java/jenkins/model/Jenkins.java index f884084700fcf852cc9529102b050cfd7cbaf58f..1517f82bfc10224bde07230e55fa71200b594c9b 100644 --- a/core/src/main/java/jenkins/model/Jenkins.java +++ b/core/src/main/java/jenkins/model/Jenkins.java @@ -923,9 +923,6 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve System.currentTimeMillis()-itemListenerStart,l.getClass().getName())); } - // All plugins are loaded. Now we can figure out who depends on who. - resolveDependantPlugins(); - if (LOG_STARTUP_PERFORMANCE) LOGGER.info(String.format("Took %dms for complete Jenkins startup", System.currentTimeMillis()-start)); @@ -934,19 +931,6 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve } } - private void resolveDependantPlugins() throws InterruptedException, ReactorException, IOException { - TaskGraphBuilder graphBuilder = new TaskGraphBuilder(); - - graphBuilder.add("Resolving Dependant Plugins Graph", new Executable() { - @Override - public void run(Reactor reactor) throws Exception { - pluginManager.resolveDependantPlugins(); - } - }); - - executeReactor(null, graphBuilder); - } - /** * Maintains backwards compatibility. Invoked by XStream when this object is de-serialized. */ diff --git a/core/src/main/resources/hudson/PluginManager/_table.js b/core/src/main/resources/hudson/PluginManager/_table.js index f7b8141069d4931a1c074182584db4fd74ee24e8..417694036293526252eafc48b68286e33f207404 100644 --- a/core/src/main/resources/hudson/PluginManager/_table.js +++ b/core/src/main/resources/hudson/PluginManager/_table.js @@ -173,6 +173,12 @@ Behaviour.specify("#filter-box", '_table', 0, function(e) { function setEnableWidgetStates() { for (var i = 0; i < pluginTRs.length; i++) { + var pluginMetadata = pluginTRs[i].jenkinsPluginMetadata; + if (pluginTRs[i].hasClassName('has-dependants-but-disabled')) { + if (pluginMetadata.enableInput.checked) { + pluginTRs[i].removeClassName('has-dependants-but-disabled'); + } + } markAllDependantsDisabled(pluginTRs[i]); markHasDisabledDependencies(pluginTRs[i]); } diff --git a/core/src/main/resources/hudson/PluginManager/installed.jelly b/core/src/main/resources/hudson/PluginManager/installed.jelly index 35b29471530480ad28bc83936c29a7e366e3c44b..22ff5f7419877e6c10edb7be60b5121c39a789f5 100644 --- a/core/src/main/resources/hudson/PluginManager/installed.jelly +++ b/core/src/main/resources/hudson/PluginManager/installed.jelly @@ -68,7 +68,7 @@ THE SOFTWARE. ${%Uninstall} - + sukurti nauj\u0105 darb\u0105, kad prad\u0117tum\u0117te. + +login=Prisijunkite, kad gal\u0117tumet kurti naujus darbus. + +signup=Jei dar neturite paskyros, galite dabar u\u017esiregistruoti. diff --git a/core/src/main/resources/hudson/model/Messages_lt.properties b/core/src/main/resources/hudson/model/Messages_lt.properties index f29e8e9d880997781e96046a6131bd83c07e512e..9dd82f067e7f97708c2a606d497c3e79dcf68616 100644 --- a/core/src/main/resources/hudson/model/Messages_lt.properties +++ b/core/src/main/resources/hudson/model/Messages_lt.properties @@ -1,3 +1,363 @@ -ParametersDefinitionProperty.DisplayName=\u0160is darbas yra parametrizuotas +AbstractBuild.BuildingRemotely=Nutol\u0119s vykdymas ma\u0161inoje {0} +AbstractBuild.BuildingOnMaster=Vykdoma pagrindin\u0117je ma\u0161inoje +AbstractBuild_Building=Vykdomas +AbstractBuild.BuildingInWorkspace=\ darbalaukyje {0} +AbstractBuild.KeptBecause=Vykdymas u\u017elaikytas d\u0117l {0}. -FreeStyleProject.Description=Pagrindin\u0117 Jenkins funkcija. Jenkins sukonstruos j\u016Bs\u0173 projekt\u0105, sujungdamas betkok\u012F SCM su betkokia konstravimo sistema. \u0160is darbo tipas gali b\u016Bt pritaikytas ne tik program\u0173 konstravimui. \ No newline at end of file +AbstractItem.NoSuchJobExists=N\u0117ra tokio darbo \u201e{0}\u201c. Gal tur\u0117jote omenyje \u201e{1}\u201c? +AbstractItem.NoSuchJobExistsWithoutSuggestion=N\u0117ra tokio darbo \u201e{0}\u201c. +AbstractItem.Pronoun=Elementas +AbstractProject.AssignedLabelString_NoMatch_DidYouMean=N\u0117ra agento/debesies, atitinkan\u010dio \u0161\u012f argument\u0105. Ar tur\u0117jote omenyje \u201e{1}\u201c, o ne \u201e{0}\u201c? +AbstractProject.NewBuildForWorkspace=Planuojamas naujas vykdymas, kad b\u016bt\u0173 gautas darbalaukis. +AbstractProject.AwaitingBuildForWorkspace=Laukiama, kol vykdymas gaus darbalauk\u012f. +AbstractProject.AwaitingWorkspaceToComeOnline=Mums reikia suplanuoti nauj\u0105 vykdym\u0105, kad gautume darbalauk\u012f, bet laukiame {0}ms, tik\u0117damiesi, kad kuris nors greitai atsilaisvins +AbstractProject.Pronoun=Projektas +AbstractProject.Aborted=Nutrauktas +AbstractProject.UpstreamBuildInProgress=Auk\u0161tesnis projektas {0} jau vykdomas. +AbstractProject.DownstreamBuildInProgress=\u017demesnis projektas {0} jau vykdomas. +AbstractProject.Disabled=Vykdymas i\u0161jungtas +AbstractProject.NoBuilds=N\u0117ra egzistuojan\u010dio vykdymo. Kuriamas naujas. +AbstractProject.NoSCM=Be SCM +AbstractProject.NoWorkspace=N\u0117ra prieinam\u0173 darbalauki\u0173, tai negalima patikrinti atnaujinim\u0173. +AbstractProject.WorkspaceTitle={0} darbalaukis +AbstractProject.WorkspaceTitleOnComputer={0} darbalaukis, esantis {1} +AbstractProject.PollingABorted=SCM traukimas nutrauktas +AbstractProject.ScmAborted=SCM i\u0161traukimas nutrauktas +AbstractProject.WorkspaceOffline=Darbalaukis atjungtas. +AbstractProject.BuildPermission.Description=\ + \u0160i teis\u0117 leid\u017eia prad\u0117ti nauj\u0105 vykdym\u0105. +AbstractProject.WorkspacePermission.Description=\ + \u0160i teis\u0117 leid\u017eia i\u0161traukti darbalaukio turin\u012f, kur\u012f \ + Jenkinsas i\u0161trauk\u0117 vykdymo metu. Jei nenorite kad naudotojas prieit\u0173 prie \ + darbalaukio fail\u0173 (pvz. prie i\u0161eities kodo paimto i\u0161 SCM arba tarpini\u0173 k\u016brimo \ + rezultat\u0173) per darbalaukio nar\u0161ykl\u0119, atimkite \u0161i\u0105 teis\u0119. +AbstractProject.ExtendedReadPermission.Description=\ + \u0160i teis\u0117 leid\u017eia tik-skaitymo pri\u0117jim\u0105 prie projekto konfig\u016bracijos. \u017dinokite, \ + kad jautri vykdymo informacija, tokia kaip slapta\u017eod\u017eiai, bus \ + matoma pla\u010diai auditorijai, jei suteiksite \u0161ias teises. +AbstractProject.DiscoverPermission.Description=\ + \u0160i teis\u0117 duoda darb\u0173 tyrimo galimyb\u0119. Ma\u017eiau nei skaitymo teis\u0117, ji leid\u017eia jums \ + persi\u0173sti anoniminius naudotojus \u012f prisijungimo puslap\u012f, kai jie bando jungtis prie darbo url. \ + Be jo, jie tiesiog gaut\u0173 404 klaid\u0105 ir negal\u0117t\u0173 su\u017einoti projekt\u0173 pavadinim\u0173. +# WipeOutPermission is only visible in the security configuration if the system property +# hudson.security.WipeOutPermission is set to true +AbstractProject.WipeOutPermission.Description=\ + \u0160i teis\u0117 leid\u017eia panaikinti darbalaukio turin\u012f. +AbstractProject.CancelPermission.Description=\ + \u0160i teis\u0117 leid\u017eia panaikinti suplanuot\u0105 arba nutraukti vykdom\u0105 darb\u0105. +AbstractProject.AssignedLabelString.InvalidBooleanExpression=\ + Netinkama login\u0117 i\u0161rai\u0161ka: {0} +AbstractProject.AssignedLabelString.NoMatch=\ + N\u0117ra \u0161io priskyrimo atitinkan\u010dio agento/debesies +AbstractProject.CustomWorkspaceEmpty=Savas darbalaukis tu\u0161\u010dias. +AbstractProject.LabelLink=Etiket\u0119 aptarnauja {2,choice,0#no nodes|1#1 node|1<{2} nodes}{3,choice,0#|1# and 1 cloud|1< and {3} clouds} + +Api.MultipleMatch=XPath "{0}" atitiko {1} mazgus. \ + Sukurkite XPath, kuris atitinka tik vien\u0105 mazg\u0105 arba naudokite \u201eapgaubiant\u012f\u201c u\u017eklausos parametr\u0105, kuris visus juos apgaubt\u0173 po \u0161akniniu elementu. +Api.NoXPathMatch=XPath {0} neatitiko + +BallColor.Aborted=Nutrauktas +BallColor.Disabled=I\u0161jungtas +BallColor.Failed=Nepavyko +BallColor.InProgress=Vykdomas +BallColor.NotBuilt=Nekurtas +BallColor.Pending=Laukia +BallColor.Success=S\u0117km\u0117 +BallColor.Unstable=Nestabilus + +Build.post_build_steps_failed=\u017dingsniai po k\u016brimo nepavyko +CLI.clear-queue.shortDescription=I\u0161valo vykdymo eil\u0119. +CLI.disable-job.shortDescription=I\u0161jungia darb\u0105. +CLI.enable-job.shortDescription=\u012ejungia darb\u0105. +CLI.disconnect-node.shortDescription=Atsijungia nuo mazgo. +CLI.connect-node.shortDescription=I\u0161 naujo prisijungti prie mazgo. +CLI.offline-node.shortDescription=Laikinai nebenaudoti mazgo darb\u0173 vykdymui, kol bus \u012fvykdyta kita \u201emazgas \u012fjungtas\u201c komanda. +CLI.wait-node-online.shortDescription=Laukti, kol mazgas prisijungs. +CLI.wait-node-offline.shortDescription=Laukti, kol mazgas atsijungs. + +Computer.Caption=Agentas {0} +Computer.NoSuchSlaveExists=N\u0117ra tokio agento \u201e{0}\u201c. Ar tur\u0117jote omeny \u201e{1}\u201c? +Computer.Permissions.Title=Agentas +Computer.ExtendedReadPermission.Description=\u0160i teis\u0117 leid\u017eia naudotojams skaityti agento konfig\u016bracij\u0105. +Computer.ConfigurePermission.Description=\u0160i teis\u0117 leid\u017eia naudotojams konfig\u016bruoti agentus. +Computer.DeletePermission.Description=\u0160i teis\u0117 leid\u017eia naudotojams trinti esamus agentus. +Computer.CreatePermission.Description=\u0160i teis\u0117 leid\u017eia naudotojams kurti agentus. +Computer.ConnectPermission.Description=\u0160i teis\u0117 leid\u017eia naudotojams prijungti agentus arba pa\u017eym\u0117ti juos prisijungusiais. +Computer.DisconnectPermission.Description=\u0160i teis\u0117 leid\u017eia naudotojams atjungti agentus arba pa\u017eym\u0117ti juos atsijungusiais. +Computer.BuildPermission.Description=\u0160i teis\u0117 leid\u017eia naudotojams paleisti darbus agentuose savo vardu. +Computer.BadChannel=Agento mazgas atsijuntg\u0119s arba n\u0117ra nutol\u0119s kanalas (pvz. valdantis mazgas). + +ComputerSet.NoSuchSlave=N\u0117ra tokio agento: {0} +ComputerSet.SlaveAlreadyExists=Agentas pavadintas \u201e{0}\u201c jau yra +ComputerSet.SpecifySlaveToCopy=Nurodykite, kur\u012f agent\u0105 kopijuoti +ComputerSet.DisplayName=Mazgai + +Descriptor.From=(i\u0161 {0}) + +Executor.NotAvailable=N\u0117ra + +FreeStyleProject.DisplayName=Laisvo stiliaus projektas +FreeStyleProject.Description=\ + Pagrindin\u0117 Jenkinso funkcija. Jenkinsas sukurs j\u016bs\u0173 projekt\u0105, kombinuojant bet koki\u0105 SCM su bet kokia k\u016brimo sistema, \ + ir visa tai galima naudoti neb\u016btinai program\u0173 k\u016brimui. + +HealthReport.EmptyString= + +Hudson.BadPortNumber=Blogas prievado numeris {0} +Hudson.Computer.Caption=\u0160eimininkas +Hudson.Computer.DisplayName=\u0161eimininkas +Hudson.ControlCodeNotAllowed=Kontrolinis kodas neleid\u017eiamas: {0} +Hudson.DisplayName=Jenkins +Hudson.JobAlreadyExists=Jau yra darbas pavadintas \u201e{0}\u201c +Hudson.NoJavaInPath=java nerasta j\u016bs\u0173 PATH. Gal jums reikia sukonfig\u016bruoti JDKs? +Hudson.NoName=Nenurodytas pavadinimas +Hudson.NoSuchDirectory=N\u0117ra tokio aplanko: {0} +Hudson.NodeBeingRemoved=Mazgas yra \u0161alinamas +Hudson.NotAPlugin={0} n\u0117ra Jenkinso priedas +Hudson.NotJDKDir={0} nepana\u0161us \u012f JDK aplank\u0105 +Hudson.Permissions.Title=Bendras +Hudson.USER_CONTENT_README=\u0160io aplanko failas bus pasiekiami nuoroda http://server/jenkins/userContent/ +Hudson.UnsafeChar=\u201e{0}\u201c yra nesaugus simbolis +Hudson.ViewAlreadyExists=Jau yra rodinys pavadinimu \u201e{0}\u201c +Hudson.ViewName=Visi +Hudson.NotANumber=Ne skai\u010dius +Hudson.NotAPositiveNumber=Ne teigiamas skai\u010dius +Hudson.NotANonNegativeNumber=Skai\u010dius negali b\u016bti neigiamas +Hudson.NotANegativeNumber=Ne neigiamas skai\u010dius +Hudson.NotUsesUTF8ToDecodeURL=\ + J\u016bs\u0173 konteineris nenaudoja UTF-8 nuorod\u0173 dekodavimui. Jei j\u016bs naudojate ne-ASCII simbolius darb\u0173 pavadinimams ir pan., \ + tai sukels problem\u0173. \ + Daugiau informacijos apie Konteinerius ir \ + Tomcat i18n. +Hudson.AdministerPermission.Description=\ + \u0160i teis\u0117 duoda galimyb\u0119 daryti sistemos lygio konfig\u016bracijos pakeitimus, \ + taip pat vykdyti labai jautrius veiksmus, \u012fskaitant piln\u0105 prieig\u0105 prie sistemos \ + (tiek, kiek leid\u017eia operacin\u0117 sistema.) +Hudson.ReadPermission.Description=\ + Skaitymo teis\u0117s yra b\u016btinos, norint \u017ei\u016br\u0117ti daugum\u0105 Jenkinso puslapi\u0173. \ + \u0160ios teis\u0117s naudingos, jei j\u016bs nenorite, kad neautentikuoti naudotojai matyt\u0173 \ + Jenkinso puslapius: atimkite \u0161ias teises i\u0161 anoniminio naudotojo, tada \ + prid\u0117kite pseaudo-naudotoj\u0105 \u201eauthenticated\u201c ir duokite jam skaitymo teises. +Hudson.RunScriptsPermission.Description=\ + Reikia skript\u0173 paleidim\u0173 Jenkinso procese, pavyzd\u017eiui per Groovy konsol\u0119 arba Groovy CLI komand\u0105. +Hudson.NodeDescription=Pagrindinis Jenkinso mazgas + +Item.Permissions.Title=Darbas +Item.CREATE.description=Kurti nauj\u0105 darb\u0105. +Item.DELETE.description=Trinti darb\u0105. +Item.CONFIGURE.description=Keisti darbo konfig\u016bracij\u0105. +Item.READ.description=Pa\u017ei\u016br\u0117ti darb\u0105. (Galite u\u017edrausti \u0161i\u0105 teis\u0119 bet leisti Tyrin\u0117jim\u0105, kad priverstum\u0117te anonimin\u012f naudotoj\u0105 prisijungti.) + +Job.AllRecentBuildFailed=Visi paskutiniai vykdymai nepavyko. +Job.BuildStability=Vykdymo stabilumas: {0} +Job.NOfMFailed={0} i\u0161 paskutini\u0173 {1} vykdym\u0173 nepavyko. +Job.NoRecentBuildFailed=Pavyko visi paskutiniai vykdymai. +Job.Pronoun=Projektas +Job.minutes=minut\u0117s + +Job.you_must_use_the_save_button_if_you_wish=J\u016bs privalote naudoti Save mygtuk\u0105, jei norite pervadinti darb\u0105. +Label.GroupOf=grup\u0117 i\u0161 {0} +Label.InvalidLabel=netinkama etiket\u0117 +Label.ProvisionedFrom=Apr\u016bpinta i\u0161 {0} +ManageJenkinsAction.DisplayName=Tvarkyti Jenkins\u0105 +MultiStageTimeSeries.EMPTY_STRING= +Queue.AllNodesOffline=Visi etiket\u0117s \u201e{0}\u201c mazgai yra atsijung\u0119 +Queue.LabelHasNoNodes=N\u0117ra mazg\u0173 su etikete \u201e{0}\u201c +Queue.BlockedBy=Blokuotojas: {0} +Queue.HudsonIsAboutToShutDown=Jenkinsas ruo\u0161iasi i\u0161sijungti +Queue.InProgress=Jau vyksta vykdymas +Queue.InQuietPeriod=Tyliame periode. Baigsis po {0} +Queue.NodeOffline={0} yra atsijung\u0119s +Queue.Unknown=??? +Queue.WaitingForNextAvailableExecutor=Laukiama kito prieinamo vykdytojo +Queue.WaitingForNextAvailableExecutorOn=Laukiama kito prieinamo vykdytojo, esan\u010dio {0} +Queue.init=Atstatoma vykdymo eil\u0117 + +ResultTrend.Aborted=Nutraukta +ResultTrend.Failure=Nes\u0117km\u0117 +ResultTrend.Fixed=Pataisyta +ResultTrend.NotBuilt=Nevykdyta +ResultTrend.NowUnstable=Dabar nestabilus +ResultTrend.StillFailing=Vis dar nepavyksta +ResultTrend.StillUnstable=Vis dar nestabilus +ResultTrend.Success=S\u0117km\u0117 +ResultTrend.Unstable=Nestabilus +Run._is_waiting_for_a_checkpoint_on_={0} laukia tikrinimom ta\u0161ko {1} +Run.BuildAborted=Vykdymas buvo nutrauktas +Run.MarkedExplicitly=\u0160is \u012fra\u0161as buvo konkre\u010diai pa\u017eym\u0117tas i\u0161saugojimui. +Run.Permissions.Title=Vykdyti +Run.running_as_=Vykdomas kaip {0} +Run.UnableToDelete=Nepavyksta i\u0161trinti {0}: {1} +Run.DeletePermission.Description=\ + \u0160i teis\u0117 leid\u017eia naudotojams rankiniu b\u016bdu i\u0161trinti konkre\u010dius vykdymus i\u0161 vykdym\u0173 istorijos. +Run.UpdatePermission.Description=\ + \u0160i teis\u0117 leid\u017eia naudotojams atnaujinti vykdymo apra\u0161ym\u0105 ir kitas savybes, \ + pavyzd\u017eiui palikti pastabas apie nes\u0117km\u0117s prie\u017eastis. +Run.ArtifactsPermission.Description=\ + \u0160i teis\u0117 duoda galimyb\u0119 i\u0161traukti rezultatus, sukurtus vykdymo metu. \ + Jei nenorite, kad naudotojas prieit\u0173 prie rezultat\u0173, galite t\u0105 padaryti \ + at\u0161aukdami \u0161i\u0105 teis\u0119. +Run.InProgressDuration={0} ir vis dar vyksta +Run.NotStartedYet=Dar neprad\u0117tas +Run.ArtifactsBrowserTitle=Rezultatai i\u0161 {0} {1} + +Run.Summary.Stable=stabilus +Run.Summary.Unstable=nestabilus +Run.Summary.Aborted=nutrauktas +Run.Summary.NotBuilt=nevykdytas +Run.Summary.BackToNormal=v\u0117l normalu +Run.Summary.BrokenForALongTime=sul\u016b\u017e\u0119s jau ilg\u0105 laik\u0105 +Run.Summary.BrokenSinceThisBuild=sul\u016b\u017e\u0119s nuo \u0161io vykdymo +Run.Summary.BrokenSince=sul\u016b\u017e\u0119s nuo vykdymo {0} +Run.Summary.Unknown=? + +Slave.InvalidConfig.Executors=Netinkama agento {0} konfig\u016bracija. Netinkamas vykdytoj\u0173 skai\u010dius. +Slave.InvalidConfig.NoName=Netinkama agento konfig\u016bracija. Tu\u0161\u010dias pavadinimas +Slave.InvalidConfig.NoRemoteDir=Netinkama agento {0} konfig\u016bracija. Nenurodytas nutol\u0119s aplankas +Slave.Launching={0} Paleid\u017eiamas agentas +Slave.Network.Mounted.File.System.Warning=Ar tikrai norite naudoti per tinkl\u0105 prijungt\u0105 fail\u0173 sistem\u0105 kaip FS \u0161ank\u012f? Pasteb\u0117tina, kad \u0161is aplankas neb\u016btinai turi b\u016bti matomas pagrindiniam mazgui. +Slave.Remote.Director.Mandatory=Nutol\u0119s aplankas yra privalomas +Slave.Terminated={0} agentas buvo nutrauktas +Slave.Remote.Relative.Path.Warning=Ar tikrai norite naudoti santykin\u012f keli\u0105, kaip FS \u0161akn\u012f? Pasteb\u0117tina, kad santykiniams \ + keliams reikia, kad j\u016bs u\u017etikrintum\u0117te, kad parinktas paleid\u0117jas u\u017etikrina pastov\u0173 einam\u0105j\u012f darbin\u012f aplank\u0105. Primygtinai \ + rekomenduojame naudoti absoliut\u0173 keli\u0105. +Slave.UnableToLaunch=Nepavyksta paleisti agento skirto {0}{1} +Slave.UnixSlave=Tai Unix agentas +Slave.WindowsSlave=Tai Windows agentas + +TopLevelItemDescriptor.NotApplicableIn={0} elementas nepritaikomi {1} r\u0117muose + +UpdateCenter.DownloadButNotActivated=S\u0117kmingai atsi\u0173stas. Bus aktyvuotas per kit\u0105 paleidim\u0105 +UpdateCenter.n_a=N\u0117ra +View.Permissions.Title=Rodinys +View.CreatePermission.Description=\ + \u0160i teis\u0117 leid\u017eia naudotojams kurti rodinius. +View.DeletePermission.Description=\ + \u0160i teis\u0117 leid\u017eia naudotojams trinti esamus rodinius. +View.ConfigurePermission.Description=\ + \u0160i teis\u0117 leid\u017eia naudotojams keisti rodini\u0173 konfig\u016bracij\u0105. +View.ReadPermission.Description=\ + \u0160i teis\u0117 leid\u017eia naudotojams \u017ei\u016br\u0117ti rodinius (rei\u0161kia bendr\u0105 skaitymo prieig\u0105). +View.MissingMode=Nenurodytas rodinio tipas + +UpdateCenter.Status.CheckingInternet=Tikrinamas prisijungimas prie interneto +UpdateCenter.Status.CheckingJavaNet=Tikrinamas prisijungimas prie atnaujinim\u0173 centro +UpdateCenter.Status.Success=S\u0117km\u0117 +UpdateCenter.Status.UnknownHostException=\ + Nepavyko i\u0161spr\u0119sti stoties pavadinimo {0}. \ + Gal jums reikia sukonfig\u016bruoti HTTP \u0161liuz\u0105? +UpdateCenter.Status.ConnectionFailed=\ + Nepavyko prisijungti prie {0}. \ + Gal jums reikia sukonfig\u016bruoti HTTP \u0161liuz\u0105? +UpdateCenter.init=Inicializuojamas atnaujinim\u0173 centras +UpdateCenter.PluginCategory.android=Android k\u016brimas +UpdateCenter.PluginCategory.builder=K\u016brimo \u012frankiai +UpdateCenter.PluginCategory.buildwrapper=K\u016brimo aplankas +UpdateCenter.PluginCategory.cli=Komandin\u0117s eilut\u0117s s\u0105saja +UpdateCenter.PluginCategory.cloud=Debes\u0173 tiek\u0117jai +UpdateCenter.PluginCategory.cluster=Klasterio valdymas ir paskirstytas vykdymas +UpdateCenter.PluginCategory.database=Duombaz\u0117 +UpdateCenter.PluginCategory.deployment=K\u016brimas +UpdateCenter.PluginCategory.devops=DevOps +UpdateCenter.PluginCategory.dotnet=.NET k\u016brimas +UpdateCenter.PluginCategory.external=I\u0161orin\u0117 svetain\u0117/\u012franki\u0173 integracija +UpdateCenter.PluginCategory.groovy-related=Groovy-susij\u0119s +UpdateCenter.PluginCategory.ios=iOS k\u016brimas +UpdateCenter.PluginCategory.library=Bibliotek\u0173 priedai (naudojami kit\u0173 pried\u0173) +UpdateCenter.PluginCategory.listview-column=Rodinio s\u0105ra\u0161o stulpeliai +UpdateCenter.PluginCategory.maven=Maven +UpdateCenter.PluginCategory.misc=\u012evair\u016bs +UpdateCenter.PluginCategory.notifier=Vykdymo prane\u0161ikliai +UpdateCenter.PluginCategory.page-decorator=Puslapi\u0173 dekoratoriai +UpdateCenter.PluginCategory.parameter=Vykdymo parametrai +UpdateCenter.PluginCategory.post-build=Kiti veiksmo po vykdymo +UpdateCenter.PluginCategory.python=Python k\u016brimas +UpdateCenter.PluginCategory.report=Vykdymo ataskaitos +UpdateCenter.PluginCategory.ruby=Ruby k\u016brimas +UpdateCenter.PluginCategory.runcondition=Vykdymo s\u0105lygos, kurias naudoja Vykdymo s\u0105lyg\u0173 priedas +UpdateCenter.PluginCategory.scala=Scala k\u016brimas +UpdateCenter.PluginCategory.scm=I\u0161eities kodo valdymas +UpdateCenter.PluginCategory.scm-related=Susij\u0119 su i\u0161eities kodo valdymu +UpdateCenter.PluginCategory.security=Saugumas +UpdateCenter.PluginCategory.slaves=Agent\u0173 paleid\u0117jai ir valdytojai +UpdateCenter.PluginCategory.test=Testavimas +UpdateCenter.PluginCategory.trigger=Vykdymo trigeriai +UpdateCenter.PluginCategory.ui=Naudotojo s\u0105saja +UpdateCenter.PluginCategory.upload=Rezultat\u0173 \u012fk\u0117l\u0117jai +UpdateCenter.PluginCategory.user=Autentikacija ir naudotoj\u0173 valdymas +UpdateCenter.PluginCategory.view=Rodiniai +UpdateCenter.PluginCategory.must-be-labeled=Nekategorizuoti +UpdateCenter.PluginCategory.unrecognized=\u012evair\u016bs ({0}) + +Permalink.LastBuild=Paskutinis vykdymas +Permalink.LastStableBuild=Paskutinis stabilus vykdymas +Permalink.LastUnstableBuild=Paskutinis nestabilus vykdymas +Permalink.LastUnsuccessfulBuild=Paskutinis nes\u0117kmingas vykdymas +Permalink.LastSuccessfulBuild=Paskutinis s\u0117kmingas vykdymas +Permalink.LastFailedBuild=Paskutinis nepavyk\u0119s vykdymas +Permalink.LastCompletedBuild=Paskutinis baigtas vykdymas + +ParameterAction.DisplayName=Parametrai +ParametersDefinitionProperty.DisplayName=\u0160is projektas yra parametrizuotas +StringParameterDefinition.DisplayName=Eilut\u0117s parametras +TextParameterDefinition.DisplayName=Keli\u0173 eilu\u010di\u0173 parametras +FileParameterDefinition.DisplayName=Failo parametras +BooleanParameterDefinition.DisplayName=Loginis parametras +ChoiceParameterDefinition.DisplayName=Pasirinkimo parametras +ChoiceParameterDefinition.MissingChoices=Reikalauja pasirinkim\u0173. +RunParameterDefinition.DisplayName=Paleidimo parametras +PasswordParameterDefinition.DisplayName=Slapta\u017eod\u017eio parametras + +Node.BecauseNodeIsReserved={0} yra rezervuotas darbams su atitinkan\u010dia etiket\u0117s i\u0161rai\u0161ka +Node.BecauseNodeIsNotAcceptingTasks={0} nepriima u\u017eduo\u010di\u0173 +Node.LabelMissing={0} neturi etiket\u0117s {1} +Node.LackingBuildPermission={0} neturi teis\u0117s b\u016bti paleistas {1} +Node.Mode.NORMAL=Naudoti \u0161\u012f mazg\u0105 kiek tik galima +Node.Mode.EXCLUSIVE=Vykdyti tik darbus su \u0161\u012f mazg\u0105 atitinkan\u010dia etikete + +ListView.DisplayName=S\u0105ra\u0161o rodinys + +MyView.DisplayName=Mano rodinys + +LoadStatistics.Legends.DefinedExecutors=Nurodyti vykdytojai +LoadStatistics.Legends.OnlineExecutors=Prisijung\u0119 vykdytojai +LoadStatistics.Legends.ConnectingExecutors=Prisijungiantys vykdytojai +LoadStatistics.Legends.TotalExecutors=Viso vykdytoj\u0173 +LoadStatistics.Legends.BusyExecutors=U\u017eimt\u0173 vykdytoj\u0173 +LoadStatistics.Legends.IdleExecutors=Neu\u017eimt\u0173 vykdytoj\u0173 +LoadStatistics.Legends.AvailableExecutors=Prieinam\u0173 vykdytoj\u0173 +LoadStatistics.Legends.QueueLength=Eil\u0117s ilgis + +Cause.LegacyCodeCause.ShortDescription=\u0160\u012f darb\u0105 prad\u0117jo senas kodas. N\u0117ra prie\u017easties informacijos +Cause.UpstreamCause.ShortDescription=Prad\u0117ta i\u0161 auk\u0161tesnio projekto \u201e{0}\u201c vykdymo numerio {1} +Cause.UpstreamCause.CausedBy=originali prie\u017eastis: +Cause.UserCause.ShortDescription=Prad\u0117jo naudotojas {0} +Cause.UserIdCause.ShortDescription=Prad\u0117jo naudotojas {0} +Cause.RemoteCause.ShortDescription=Prad\u0117jo nutol\u0119s mazgas {0} +Cause.RemoteCause.ShortDescriptionWithNote=Prad\u0117jo nutol\u0119s mazgas {0} su pastaba: {1} + +ProxyView.NoSuchViewExists=Neegzistuoja globalus rodinys {0} +ProxyView.DisplayName=\u012etraukti global\u0173 rodin\u012f + +MyViewsProperty.DisplayName=Mano rodiniai +MyViewsProperty.GlobalAction.DisplayName=Mano rodiniai +MyViewsProperty.ViewExistsCheck.NotExist=N\u0117ra rodinio pavadinimu {0} +MyViewsProperty.ViewExistsCheck.AlreadyExists=Rodinys pavadinimu {0} jau yra + +CLI.restart.shortDescription=I\u0161 naujo paleisti Jenkins\u0105 +CLI.safe-restart.shortDescription=Saugiai i\u0161 naujo paleisti Jenkins\u0105 +CLI.keep-build.shortDescription=Pa\u017eym\u0117ti vykdym\u0105 am\u017einam saugojimui. +CLI.quiet-down.shortDescription=Tyliai nuleisti Jenkins\u0105, pasiruo\u0161iant paleidimui i\u0161 naujo. Neprad\u0117ti joki\u0173 vykdym\u0173. +CLI.cancel-quiet-down.shortDescription=Nutraukti \u201etylaus i\u0161jungimo\u201c komandos efekt\u0105. +CLI.reload-configuration.shortDescription=I\u0161mesti vius \u012f atmint\u012f \u012fkeltus duomenis ir i\u0161 naujo visk\u0105 \u012fkelti i\u0161 fail\u0173 sistemos. Naudinga, jei pakeit\u0117te konfig\u016bracijos failus tiesiai diske. + +BuildAuthorizationToken.InvalidTokenProvided=Pateikta neteisinga \u017eyma. + +Jenkins.CheckDisplayName.NameNotUniqueWarning=Rodomas pavadinimas \u201e{0}\u201c naudojamas kaip darbo pavadinimas ir gali b\u016bti keist\u0173 paie\u0161kos rezultat\u0173 prie\u017eastis. +Jenkins.CheckDisplayName.DisplayNameNotUniqueWarning=Rodomas pavadinimas \u201e{0}\u201c jau naudojamas kitame darbe tod\u0117l gali sukelti u\u017edelsim\u0105 ir sumai\u0161t\u012f. + +Jenkins.NotAllowedName=\u201e{0}\u201c - neleid\u017eiamas pavadinimas +Jenkins.IsRestarting=Jenkinsas paleid\u017eiamas i\u0161 naujo + +User.IllegalUsername=\u201e{0}\u201c neleid\u017eiamas kaip naudotojo pavadinimas d\u0117l saugumo sumetim\u0173. +User.IllegalFullname=\u201e{0}\u201c neleid\u017eiamas kaip pilnas vardas d\u0117l saugumo sumetim\u0173. diff --git a/core/src/main/resources/hudson/model/UpdateCenter/EnableJob/row.jelly b/core/src/main/resources/hudson/model/UpdateCenter/EnableJob/row.jelly new file mode 100644 index 0000000000000000000000000000000000000000..f98ff8bc4a431b26986bc16500d3e43e6161596e --- /dev/null +++ b/core/src/main/resources/hudson/model/UpdateCenter/EnableJob/row.jelly @@ -0,0 +1,33 @@ + + + + + + ${it.plugin.displayName} + + ${%Enabled Dependency} + + + diff --git a/core/src/main/resources/hudson/model/UpdateCenter/NoOpJob/row.jelly b/core/src/main/resources/hudson/model/UpdateCenter/NoOpJob/row.jelly new file mode 100644 index 0000000000000000000000000000000000000000..c6a2e93587004569520b157ac92846dbb7bb199e --- /dev/null +++ b/core/src/main/resources/hudson/model/UpdateCenter/NoOpJob/row.jelly @@ -0,0 +1,33 @@ + + + + + + ${it.plugin.displayName} + + ${%Already Installed} + + + diff --git a/core/src/main/resources/jenkins/install/SetupWizard/authenticate-security-token_lt.properties b/core/src/main/resources/jenkins/install/SetupWizard/authenticate-security-token_lt.properties new file mode 100644 index 0000000000000000000000000000000000000000..04d18031fd7c24677da64409d3df7bc1e03e14c4 --- /dev/null +++ b/core/src/main/resources/jenkins/install/SetupWizard/authenticate-security-token_lt.properties @@ -0,0 +1,9 @@ +authenticate-security-token.getting.started=\u012evadas +authenticate-security-token.unlock.jenkins=Atrakinti Jenkins\u0105 +jenkins.install.findSecurityTokenMessage=Kad u\u017etikrintum\u0117me kad Jenkins\u0105 saugiai paruo\u0161\u0117 administratorius, \ +slapta\u017eodis buvo \u012fra\u0161ytas \u012f \u017eurnal\u0105 (ne\u017einote, kur j\u012f rasti?) ir \u0161\u012f fail\u0105 serveryje:

{0}

+authenticate-security-token.copy.password=Pra\u0161ome nukopijuoti slapta\u017eiod\u012f i\u0161 bet kurios vietos \u012f \u017eemiau esant\u012f lauk\u0105. +authenticate-security-token.error=KLAIDA: +authenticate-security-token.password.incorrect=\u012evestas neteisingas slapta\u017eodis, pra\u0161ome patikrinti fail\u0105 ir rasti teising\u0105 slapta\u017eod\u012f +authenticate-security-token.password.administrator=Administratoriaus slapta\u017eodis +authenticate-security-token.continue=T\u0119sti diff --git a/core/src/main/resources/jenkins/install/SetupWizard/setupWizardFirstUser_lt.properties b/core/src/main/resources/jenkins/install/SetupWizard/setupWizardFirstUser_lt.properties new file mode 100644 index 0000000000000000000000000000000000000000..140b61fc0402671e3801586d0872d678b14bc939 --- /dev/null +++ b/core/src/main/resources/jenkins/install/SetupWizard/setupWizardFirstUser_lt.properties @@ -0,0 +1 @@ +Create\ First\ Admin\ User=Sukurti pirm\u0105 administratoriaus naudotoj\u0105 diff --git a/core/src/main/resources/jenkins/install/UpgradeWizard/footer_lt.properties b/core/src/main/resources/jenkins/install/UpgradeWizard/footer_lt.properties new file mode 100644 index 0000000000000000000000000000000000000000..f1147d3e4f671f97ecc024aa4b2301384308d262 --- /dev/null +++ b/core/src/main/resources/jenkins/install/UpgradeWizard/footer_lt.properties @@ -0,0 +1,3 @@ +msg.before=Jus sveikina Jenkins 2!\u0020 +msg.link=\u012ediegti naujas savybes +msg.after=\u0020kad baigtum\u0117te atnaujinim\u0105 diff --git a/core/src/main/resources/jenkins/install/pluginSetupWizard_lt.properties b/core/src/main/resources/jenkins/install/pluginSetupWizard_lt.properties new file mode 100644 index 0000000000000000000000000000000000000000..3ddc015a18ed0b0cec9b7941c5b5b6cd7c05b8c9 --- /dev/null +++ b/core/src/main/resources/jenkins/install/pluginSetupWizard_lt.properties @@ -0,0 +1,54 @@ +installWizard_welcomePanel_title=\u012evadas +installWizard_welcomePanel_banner=Jenkins pritaikymas +installWizard_welcomePanel_message=Priedai papildo Jenkins\u0105 naujomis galimyb\u0117mis. +installWizard_welcomePanel_recommendedActionTitle=\u012ediegti si\u016blomus priedus +installWizard_welcomePanel_recommendedActionDetails=\u012ediegti priedus, kuriuos Jenkinso bendruomen\u0117 labiausiai naudoja. +installWizard_welcomePanel_customizeActionTitle=Parinkite priedus \u012fdiegimui +installWizard_welcomePanel_customizeActionDetails=Parinkite ir \u012fdiekite priedus, labiausiai patenkinan\u010dius j\u016bs\u0173 poreikius. +installWizard_jenkinsVersionTitle=Jenkins +installWizard_offline_title=Atsijung\u0119s +installWizard_offline_message=Pana\u0161u, kad \u0161is Jenkinsas yra atsijung\u0119s. \ +

\ +Daugiau informacijos apie tai, kaip diegti Jenkins\u0105 neprisijungus prie interneto, ie\u0161kokite \ +Neprijungto Jenkins diegimo dokumentacijoje.

\ +Galite nuspr\u0119sti t\u0119sti sukonfig\u016brav\u0119 \u0161liuz\u0105 arba praleisdami pried\u0173 diegim\u0105. \ +

+installWizard_error_header=\u012evyko klaida +installWizard_error_message=Diegiant \u012fvyko klaida: +installWizard_error_connection=Nepavyksta prisijungti prie Jenkinso +installWizard_installCustom_title=\u012evadas +installWizard_installCustom_selectAll=Viskas +installWizard_installCustom_selectNone=Nieko +installWizard_installCustom_selectRecommended=Rekomenduojami +installWizard_installCustom_selected=Pa\u017eym\u0117ti +installWizard_installCustom_dependenciesPrefix=Priklausomyb\u0117s +installWizard_installCustom_pluginListDesc=Pasteb\u0117tina, kad \u010dia nerodomas pilnas pried\u0173 s\u0105ra\u0161as. Papildomus priedus galite \u012fdiegti Pried\u0173 tvarkykl\u0117je, kai bus baigtas pradinis diegimas. Daugiau informacijos rasite vikyje. +installWizard_goBack=Atgal +installWizard_goInstall=\u012ediegti +installWizard_installing_title=\u012evadas +installWizard_installing_detailsLink=Detal\u0117s... +installWizard_installComplete_title=\u012evadas +installWizard_installComplete_banner=Jenkinsas paruo\u0161tas! +installWizard_pluginsInstalled_message=J\u016bs\u0173 pried\u0173 diegimas baigtas. +installWizard_installComplete_message=J\u016bs\u0173 Jenkinso nustatymas baigtas. +installWizard_installComplete_finishButtonLabel=Prad\u0117kite naudoti Jenkins\u0105 +installWizard_installComplete_restartRequiredMessage=Kai kuriems priedams reikia, kad Jenkinsas b\u016bt\u0173 i\u0161 naujo paleistas. +installWizard_installComplete_restartLabel=Paleisti i\u0161 naujo +installWizard_installIncomplete_title=T\u0119sti diegim\u0105 +installWizard_installIncomplete_banner=T\u0119sti diegim\u0105 +installWizard_installIncomplete_message=Jenkinsas buvo i\u0161 naujo paleistas diegimo metu ir pana\u0161u, kad kai kurie prieda ne\u012fsidieg\u0117. +installWizard_installIncomplete_resumeInstallationButtonLabel=T\u0119sti +installWizard_saveFirstUser=\u012era\u0161yti ir baigti +installWizard_skipFirstUser=T\u0119sti kaip administratoriumi +installWizard_firstUserSkippedMessage=
\ +J\u016bs praleidote administratoriaus naudotojo k\u016brim\u0105. Nor\u0117dami prisijungti, naudokite vard\u0105: \u201eadmin\u201c ir \ +administratoriaus slapta\u017eod\u012f, kur\u012f naudojote prisijungimui prie nustatymo vedlio.\ +
+installWizard_addFirstUser_title=\u012evadas +installWizard_configureProxy_label=Konfig\u016bruoti \u0161liuz\u0105 +installWizard_configureProxy_save=\u012era\u0161yti ir t\u0119sti +installWizard_skipPluginInstallations=Praleisti pried\u0173 diegim\u0105 +installWizard_installIncomplete_dependenciesLabel=Priklausomyb\u0117s +installWizard_installingConsole_dependencyIndicatorNote=** - privaloma priklausomyb\u0117 +installWizard_websiteLinkLabel=Svetain\u0117 +installWizard_retry=Kartoti diff --git a/pom.xml b/pom.xml index cd17f190343f040c4383d663c224eda247572d4e..314d8e08199479f4932d127abe5ab0aaf193e1fb 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.1-SNAPSHOT + 2.2-SNAPSHOT pom Jenkins main module diff --git a/test/pom.xml b/test/pom.xml index 66ba88b0adb512592c801a119c6cefc6ed34f2e5..23d90bdbcfdbc5b3af56c4e3c073ba923c810351 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.1-SNAPSHOT + 2.2-SNAPSHOT test diff --git a/test/src/test/java/hudson/model/ApiTest.java b/test/src/test/java/hudson/model/ApiTest.java index 8a9597da45487eb94edb25be650547f67448e385..44dd5878788f771c998cd3f7b02c3b3c922a90f5 100644 --- a/test/src/test/java/hudson/model/ApiTest.java +++ b/test/src/test/java/hudson/model/ApiTest.java @@ -23,18 +23,21 @@ */ package hudson.model; -import static org.junit.Assert.*; - import com.gargoylesoftware.htmlunit.Page; - -import java.io.File; -import java.net.HttpURLConnection; - +import com.gargoylesoftware.htmlunit.WebResponse; +import net.sf.json.JSONObject; import org.junit.Rule; import org.junit.Test; import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.JenkinsRule; +import java.io.File; +import java.net.HttpURLConnection; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + /** * @author Kohsuke Kawaguchi */ @@ -53,8 +56,15 @@ public class ApiTest { @Test public void json() throws Exception { FreeStyleProject p = j.createFreeStyleProject("p"); JenkinsRule.WebClient wc = j.createWebClient(); - assertEquals("{\"name\":\"p\"}", wc.goTo(p.getUrl() + "api/json?tree=name", "application/json").getWebResponse().getContentAsString()); - assertEquals("wrap({\"name\":\"p\"})", wc.goTo(p.getUrl() + "api/json?tree=name&jsonp=wrap", "application/javascript").getWebResponse().getContentAsString()); + WebResponse response = wc.goTo(p.getUrl() + "api/json?tree=name", "application/json").getWebResponse(); + JSONObject json = JSONObject.fromObject(response.getContentAsString()); + assertEquals("p", json.get("name")); + + String s = wc.goTo(p.getUrl() + "api/json?tree=name&jsonp=wrap", "application/javascript").getWebResponse().getContentAsString(); + assertTrue(s.startsWith("wrap(")); + assertEquals(')', s.charAt(s.length()-1)); + json = JSONObject.fromObject(s.substring("wrap(".length(), s.length() - 1)); + assertEquals("p", json.get("name")); } @Test diff --git a/test/src/test/java/hudson/model/QueueTest.java b/test/src/test/java/hudson/model/QueueTest.java index 1ec5623fefac6ede1252fde17a8711aa350b23de..a667e980b6f0758ed7f67175a34a668a00b7dca9 100644 --- a/test/src/test/java/hudson/model/QueueTest.java +++ b/test/src/test/java/hudson/model/QueueTest.java @@ -68,26 +68,6 @@ import hudson.triggers.SCMTrigger.SCMTriggerCause; import hudson.triggers.TimerTrigger.TimerTriggerCause; import hudson.util.OneShotEvent; import hudson.util.XStream2; -import java.io.File; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.CancellationException; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.Future; -import java.util.concurrent.ScheduledThreadPoolExecutor; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; -import java.util.concurrent.atomic.AtomicInteger; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; import jenkins.model.Jenkins; import jenkins.security.QueueItemAuthenticatorConfiguration; import jenkins.triggers.ReverseBuildTrigger; @@ -99,10 +79,6 @@ import org.apache.commons.fileupload.FileUploadException; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; import org.apache.commons.io.FileUtils; - -import static org.hamcrest.Matchers.nullValue; -import static org.junit.Assert.*; - import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.ServerConnector; import org.eclipse.jetty.servlet.ServletHandler; @@ -119,6 +95,30 @@ import org.jvnet.hudson.test.TestBuilder; import org.jvnet.hudson.test.TestExtension; import org.jvnet.hudson.test.recipes.LocalData; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.CancellationException; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Future; +import java.util.concurrent.ScheduledThreadPoolExecutor; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; +import java.util.concurrent.atomic.AtomicInteger; + +import static org.hamcrest.Matchers.nullValue; +import static org.junit.Assert.*; + /** * @author Kohsuke Kawaguchi */ @@ -937,15 +937,15 @@ public class QueueTest { webClient.login("alice"); XmlPage p2 = webClient.goToXml("queue/api/xml"); //alice does not have permission on the project and will not see it in the queue. - assertEquals("", p2.getContent()); - + assertTrue(p2.getByXPath("/queue/node()").isEmpty()); webClient = r.createWebClient(); webClient.login("james"); XmlPage p3 = webClient.goToXml("queue/api/xml"); - //james has DISCOVER permission on the project and will only be able to see the task name. - assertEquals("project", - p3.getContent()); + //james has DISCOVER permission on the project and will only be able to see the task name. + List projects = p3.getByXPath("/queue/discoverableItem/task/name/text()"); + assertEquals(1, projects.size()); + assertEquals("project", projects.get(0).toString()); } //we force the project not to be executed so that it stays in the queue diff --git a/test/src/test/java/hudson/security/csrf/DefaultCrumbIssuerTest.java b/test/src/test/java/hudson/security/csrf/DefaultCrumbIssuerTest.java index 70583b6363a78603ca6cc464ee19b28ace114d13..f3fddef1aff603fa85cec48593ac5fc650bf6da1 100644 --- a/test/src/test/java/hudson/security/csrf/DefaultCrumbIssuerTest.java +++ b/test/src/test/java/hudson/security/csrf/DefaultCrumbIssuerTest.java @@ -8,8 +8,7 @@ package hudson.security.csrf; import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException; import com.gargoylesoftware.htmlunit.html.HtmlPage; -import java.net.HttpURLConnection; -import static org.junit.Assert.*; +import net.sf.json.JSONObject; import org.junit.Before; import org.junit.Rule; import org.junit.Test; @@ -18,6 +17,10 @@ import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.JenkinsRule.WebClient; import org.jvnet.hudson.test.recipes.PresetData; +import java.net.HttpURLConnection; + +import static org.junit.Assert.*; + /** * * @author dty @@ -126,7 +129,9 @@ public class DefaultCrumbIssuerTest { @Test public void apiJson() throws Exception { WebClient wc = r.createWebClient(); String json = wc.goTo("crumbIssuer/api/json", "application/json").getWebResponse().getContentAsString(); - assertTrue(json, json.matches("\\Q{\"crumb\":\"\\E[0-9a-f]+\\Q\",\"crumbRequestField\":\"" + r.jenkins.getCrumbIssuer().getCrumbRequestField() + "\"}\\E")); + JSONObject jsonObject = JSONObject.fromObject(json); + assertEquals(r.jenkins.getCrumbIssuer().getCrumbRequestField(),jsonObject.getString("crumbRequestField")); + assertTrue(jsonObject.getString("crumb").matches("[0-9a-f]+")); wc.assertFails("crumbIssuer/api/json?jsonp=hack", HttpURLConnection.HTTP_FORBIDDEN); } diff --git a/war/pom.xml b/war/pom.xml index 03589ad0d19f85a05abb342b1b1648cbd5029c45..dfa405adb08ae0230b631e2ff3ee168993222666 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.1-SNAPSHOT + 2.2-SNAPSHOT jenkins-war diff --git a/war/src/main/js/pluginSetupWizardGui.js b/war/src/main/js/pluginSetupWizardGui.js index 7ab9a617fb01369103c3f9bf9a7beec29684adff..e782d5f5122dd85dc29c873c0287a21136c339d7 100644 --- a/war/src/main/js/pluginSetupWizardGui.js +++ b/war/src/main/js/pluginSetupWizardGui.js @@ -104,7 +104,7 @@ var createPluginSetupWizard = function(appendTarget) { return options.fn(); } }); - + // Include handlebars templates here - explicitly require them and they'll be available by hbsfy as part of the bundle process var errorPanel = require('./templates/errorPanel.hbs'); var loadingPanel = require('./templates/loadingPanel.hbs'); @@ -166,6 +166,19 @@ var createPluginSetupWizard = function(appendTarget) { title: text }).tooltip('show'); }); + + // handle clicking links that might not get highlighted due to position on the page + $wizard.on('click', '.nav>li>a', function(){ + var $li = $(this).parent(); + var activateClicked = function() { + if(!$li.is('.active')) { + $li.parent().find('>li').removeClass('active'); + $li.addClass('active'); + } + }; + setTimeout(activateClicked, 150); // this is the scroll time + setTimeout(activateClicked, 250); // this should combat timing issues + }); // localized messages var translations = {}; diff --git a/war/src/main/webapp/WEB-INF/web.xml b/war/src/main/webapp/WEB-INF/web.xml index f9b401b6084fb408605faa6e9c7df06f4b78a55b..27887e806c6fd6aaec1219efd6c65d77cf496030 100644 --- a/war/src/main/webapp/WEB-INF/web.xml +++ b/war/src/main/webapp/WEB-INF/web.xml @@ -42,6 +42,7 @@ THE SOFTWARE. diagnosticThreadName false + true @@ -57,26 +58,32 @@ THE SOFTWARE. diagnostic-name-filter org.kohsuke.stapler.DiagnosticThreadNameFilter + true encoding-filter hudson.util.CharacterEncodingFilter + true compression-filter org.kohsuke.stapler.compression.CompressionFilter + true authentication-filter hudson.security.HudsonFilter + true csrf-filter hudson.security.csrf.CrumbFilter + true plugins-filter hudson.util.PluginServletFilter + true +
+ Caso selecionado, apenas executores de build que podem executar jobs nessa view aparecerão. +
diff --git a/war/src/main/webapp/help/view-config/filter-queue_pt_BR.html b/war/src/main/webapp/help/view-config/filter-queue_pt_BR.html new file mode 100644 index 0000000000000000000000000000000000000000..e16ce5c8cc8b3846d6a3cebd403781c4ba27c375 --- /dev/null +++ b/war/src/main/webapp/help/view-config/filter-queue_pt_BR.html @@ -0,0 +1,26 @@ + +
+ Caso selecionado, apenas jobs nessa view aparecerão na fila. +