diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000000000000000000000000000000000000..71b25de5fede2f693026268b69839c15b95465dd --- /dev/null +++ b/.gitattributes @@ -0,0 +1,39 @@ +# Handle line endings automatically for files detected as text +# and leave all files detected as binary untouched. +* text=auto + +# +# The above will handle all files NOT found below +# +# These files are text and should be normalized (Convert crlf => lf) +*.css text +*.groovy text +*.htm text +*.html text +*.java text +*.js text +*.json text +*.jelly text +*.jellytag text +*.less text +*.properties text +*.rb text +*.sh text +*.txt text +*.xml text + +# These files are binary and should be left untouched +# (binary is a macro for -text -diff) +*.class binary +*.gz binary +*.tgz binary +*.ear binary +*.gif binary +*.hpi binary +*.ico binary +*.jar binary +*.jpg binary +*.jpeg binary +*.png binary +*.war binary +*.zip binary diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000000000000000000000000000000000000..44c7e2a1f11464b4f5550f6d74f1d6f4cee957fb --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,41 @@ +# Description + +See [JENKINS-XXXXX](https://issues.jenkins-ci.org/browse/JENKINS-XXXXX). + +Details: TODO + + + +### Changelog entries + +Proposed changelog entries: + +* Entry 1: Issue, Human-readable Text +* ... + + + +### Submitter checklist + +- [ ] JIRA issue is well described +- [ ] Link to JIRA ticket in description, if appropriate +- [ ] Appropriate autotests or explanation to why this change has no tests +- [ ] For new API and extension points: Link to the reference implementation in open-source (or example in Javadoc) + + + +### Desired reviewers + +@mention + + diff --git a/BUILDING.TXT b/BUILDING.TXT index 09766de355e22b3f2469dc88cc0a1ba35d8aa19c..bde5cadf353210259628baa34b1813f0acddc5b1 100644 --- a/BUILDING.TXT +++ b/BUILDING.TXT @@ -4,7 +4,6 @@ execution), run: mvn clean install -pl war -am -DskipTests The WAR file will be in war/target/jenkins.war (you can play with it) -You can deactivate test-harness execution with -Dskip-test-harness For more information on building Jenkins, visit https://wiki.jenkins-ci.org/display/JENKINS/Building+Jenkins diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 7a2d5e0c53ec6c9a1dcaaedf21fada835c68ea8c..f99fe77067ef6c25597bf54df9e0debdaff27fef 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,3 +1,3 @@ # Contributing to Jenkins -For information on contributing to Jenkins, check out the https://wiki.jenkins-ci.org/display/JENKINS/Beginners+Guide+to+Contributing and https://wiki.jenkins-ci.org/display/JENKINS/Extend+Jenkins wiki pages over at the official https://wiki.jenkins-ci.org . They will help you get started with contributing to Jenkins. +For information on contributing to Jenkins, check out https://jenkins.io/redirect/contribute/. That page will help you get started with contributing to Jenkins. diff --git a/Jenkinsfile b/Jenkinsfile index cc03884ab9354f1dac934257d8fcf566ded8fee6..5f960ab4b57c7654f9f875ecb3b854dd37971ba2 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -1,5 +1,7 @@ +#!/usr/bin/env groovy + /* - * This Jenkinsfile is intended to run on https://ci.jenkins-ci.org and may fail anywhere else. + * This Jenkinsfile is intended to run on https://ci.jenkins.io and may fail anywhere else. * It makes assumptions about plugins being installed, labels mapping to nodes that can build what is needed, etc. * * The required labels are "java" and "docker" - "java" would be any node that can run Java builds. It doesn't need @@ -9,152 +11,67 @@ // TEST FLAG - to make it easier to turn on/off unit tests for speeding up access to later stuff. def runTests = true +def failFast = false // Only keep the 10 most recent builds. properties([[$class: 'jenkins.model.BuildDiscarderProperty', strategy: [$class: 'LogRotator', numToKeepStr: '50', artifactNumToKeepStr: '20']]]) -String packagingBranch = (binding.hasVariable('packagingBranch')) ? packagingBranch : 'jenkins-2.0' - -timestampedNode('java') { - - // First stage is actually checking out the source. Since we're using Multibranch - // currently, we can use "checkout scm". - stage "Checkout source" - - checkout scm - - // Now run the actual build. - stage "Build and test" - - // We're wrapping this in a timeout - if it takes more than 180 minutes, kill it. - timeout(time: 180, unit: 'MINUTES') { - // See below for what this method does - we're passing an arbitrary environment - // variable to it so that JAVA_OPTS and MAVEN_OPTS are set correctly. - withMavenEnv(["JAVA_OPTS=-Xmx1536m -Xms512m -XX:MaxPermSize=1024m", - "MAVEN_OPTS=-Xmx1536m -Xms512m -XX:MaxPermSize=1024m"]) { - // Actually run Maven! - // The -Dmaven.repo.local=${pwd()}/.repository means that Maven will create a - // .repository directory at the root of the build (which it gets from the - // pwd() Workflow call) and use that for the local Maven repository. - sh "mvn -Pdebug -U clean install ${runTests ? '-Dmaven.test.failure.ignore=true -Dconcurrency=1' : '-DskipTests'} -V -B -Dmaven.repo.local=${pwd()}/.repository" - } - } - - // Once we've built, archive the artifacts and the test results. - stage "Archive artifacts and test results" - - step([$class: 'ArtifactArchiver', artifacts: '**/target/*.jar, **/target/*.war, **/target/*.hpi', fingerprint: true]) - if (runTests) { - step([$class: 'JUnitResultArchiver', healthScaleFactor: 20.0, testResults: '**/target/surefire-reports/*.xml']) - } -} - -def debFileName -def rpmFileName -def suseFileName - -// Run the packaging build on a node with the "docker" label. -timestampedNode('docker') { - // First stage here is getting prepped for packaging. - stage "packaging - docker prep" - - // Docker environment to build packagings - dir('packaging-docker') { - git branch: packagingBranch, url: 'https://github.com/jenkinsci/packaging.git' - sh 'docker build -t jenkins-packaging-builder:0.1 docker' - } - - stage "packaging - actually packaging" - // Working packaging code, separate branch with fixes - dir('packaging') { - deleteDir() - - docker.image("jenkins-packaging-builder:0.1").inside("-u root") { - git branch: packagingBranch, url: 'https://github.com/jenkinsci/packaging.git' - - try { - // Saw issues with unstashing inside a container, and not sure copy artifact plugin would work here. - // So, simple wget. - sh "wget -q ${currentBuild.absoluteUrl}/artifact/war/target/jenkins.war" - sh "make clean deb rpm suse BRAND=./branding/jenkins.mk BUILDENV=./env/test.mk CREDENTIAL=./credentials/test.mk WAR=jenkins.war" - } catch (Exception e) { - error "Packaging failed: ${e}" - } finally { - // Needed to make sure the output of the build can be deleted by later runs. - // Hackish, yes, but rpm builds as a numeric UID only user fail, so... - sh "chmod -R a+w target || true" - sh "chmod a+w jenkins.war || true" - } - dir("target/debian") { - def debFilesFound = findFiles(glob: "*.deb") - if (debFilesFound.size() > 0) { - debFileName = debFilesFound[0]?.name +// see https://github.com/jenkins-infra/documentation/blob/master/ci.adoc for information on what node types are available +def buildTypes = ['Linux', 'Windows'] + +def builds = [:] +for(i = 0; i < buildTypes.size(); i++) { + def buildType = buildTypes[i] + builds[buildType] = { + node(buildType.toLowerCase()) { + timestamps { + // First stage is actually checking out the source. Since we're using Multibranch + // currently, we can use "checkout scm". + stage('Checkout') { + checkout scm } - } - - dir("target/rpm") { - def rpmFilesFound = findFiles(glob: "*.rpm") - if (rpmFilesFound.size() > 0) { - rpmFileName = rpmFilesFound[0]?.name - } - } - dir("target/suse") { - def suseFilesFound = findFiles(glob: "*.rpm") - if (suseFilesFound.size() > 0) { - suseFileName = suseFilesFound[0]?.name + // Now run the actual build. + stage("${buildType} Build / Test") { + timeout(time: 180, unit: 'MINUTES') { + // See below for what this method does - we're passing an arbitrary environment + // variable to it so that JAVA_OPTS and MAVEN_OPTS are set correctly. + withMavenEnv(["JAVA_OPTS=-Xmx1536m -Xms512m -XX:MaxPermSize=1024m", + "MAVEN_OPTS=-Xmx1536m -Xms512m -XX:MaxPermSize=1024m"]) { + // Actually run Maven! + // The -Dmaven.repo.local=${pwd()}/.repository means that Maven will create a + // .repository directory at the root of the build (which it gets from the + // pwd() Workflow call) and use that for the local Maven repository. + def mvnCmd = "mvn -Pdebug -U clean install ${runTests ? '-Dmaven.test.failure.ignore=true' : '-DskipTests'} -V -B -Dmaven.repo.local=${pwd()}/.repository" + if(isUnix()) { + sh mvnCmd + } else { + bat "$mvnCmd -Duser.name=yay" // INFRA-1032 workaround + } + } + } } - } - - step([$class: 'ArtifactArchiver', artifacts: 'target/**/*', fingerprint: true]) - - // Fail the build if we didn't find at least one of the packages, meaning they weren't built but - // somehow make didn't error out. - if (debFileName == null || rpmFileName == null || suseFileName == null) { - error "At least one of Debian, RPM or SuSE packages are missing, so failing the build." - } - } - - } - -} -stage "Package testing" + // Once we've built, archive the artifacts and the test results. + stage("${buildType} Archive Artifacts / Test Results") { + def files = findFiles(glob: '**/target/*.jar, **/target/*.war, **/target/*.hpi') + renameFiles(files, buildType.toLowerCase()) -if (runTests) { - if (!env.BRANCH_NAME.startsWith("PR")) { - // NOTE: As of now, a lot of package tests will fail. See https://issues.jenkins-ci.org/issues/?filter=15257 for - // possible open JIRAs. - - // Basic parameters - String artifactName = (binding.hasVariable('artifactName')) ? artifactName : 'jenkins' - String jenkinsPort = (binding.hasVariable('jenkinsPort')) ? jenkinsPort : '8080' - - // Set up - String debfile = "artifact://${env.JOB_NAME}/${env.BUILD_NUMBER}#target/debian/${debFileName}" - String rpmfile = "artifact://${env.JOB_NAME}/${env.BUILD_NUMBER}#target/rpm/${rpmFileName}" - String susefile = "artifact://${env.JOB_NAME}/${env.BUILD_NUMBER}#target/suse/${suseFileName}" - - timestampedNode("docker") { - stage "Load Lib" - dir('workflowlib') { - deleteDir() - git branch: packagingBranch, url: 'https://github.com/jenkinsci/packaging.git' - flow = load 'workflow/installertest.groovy' + archiveArtifacts artifacts: '**/target/*.jar, **/target/*.war, **/target/*.hpi', + fingerprint: true + if (runTests) { + junit healthScaleFactor: 20.0, testResults: '**/target/surefire-reports/*.xml' + } + } } } - // Run the real tests within docker node label - flow.fetchAndRunJenkinsInstallerTest("docker", rpmfile, susefile, debfile, - packagingBranch, artifactName, jenkinsPort) - } else { - echo "Not running package testing against pull requests" } -} else { - echo "Skipping package tests" } +builds.failFast = failFast +parallel builds // This method sets up the Maven and JDK tools, puts them in the environment along // with whatever other arbitrary environment variables we passed in, and runs the @@ -164,8 +81,8 @@ void withMavenEnv(List envVars = [], def body) { // to be made more flexible. // Using the "tool" Workflow call automatically installs those tools on the // node. - String mvntool = tool name: "mvn3.3.3", type: 'hudson.tasks.Maven$MavenInstallation' - String jdktool = tool name: "jdk8_51", type: 'hudson.model.JDK' + String mvntool = tool name: "mvn", type: 'hudson.tasks.Maven$MavenInstallation' + String jdktool = tool name: "jdk8", type: 'hudson.model.JDK' // Set JAVA_HOME, MAVEN_HOME and special PATH variables for the tools we're // using. @@ -180,11 +97,16 @@ void withMavenEnv(List envVars = [], def body) { } } -// Runs the given body within a Timestamper wrapper on the given label. -def timestampedNode(String label, Closure body) { - node(label) { - wrap([$class: 'TimestamperBuildWrapper']) { - body.call() +// This hacky method is used because File is not whitelisted, +// so we can't use renameTo or friends +void renameFiles(def files, String prefix) { + for(i = 0; i < files.length; i++) { + def newPath = files[i].path.replace(files[i].name, "${prefix}-${files[i].name}") + def rename = "${files[i].path} ${newPath}" + if(isUnix()) { + sh "mv ${rename}" + } else { + bat "move ${rename}" } } } diff --git a/README.md b/README.md index 501778372da7f1ab5613f35365efdb50a89d5279..6dc6c47ecef715c771fcfdeb9ccd83cc45cf4962 100644 --- a/README.md +++ b/README.md @@ -59,6 +59,4 @@ Jenkins is **licensed** under the **[MIT License]**. The terms of the license ar [GitHub]: https://github.com/jenkinsci/jenkins [website]: https://jenkins.io/ [@jenkinsci]: https://twitter.com/jenkinsci -[Contributing]: https://wiki.jenkins-ci.org/display/JENKINS/contributing -[Extend Jenkins]: https://wiki.jenkins-ci.org/display/JENKINS/Extend+Jenkins [wiki]: https://wiki.jenkins-ci.org diff --git a/changelog.html b/changelog.html index cce063d3c8a78ea9b8b0cdc14b536c15f11644b8..20a2db735b6fd3d3a0c137d1d5484d76c354f8d4 100644 --- a/changelog.html +++ b/changelog.html @@ -1,2729 +1,15 @@ - - - - - Changelog - - - - - -
Legend: - - major RFEmajor enhancement RFEenhancement - major bugmajor bug fix bugbug fix - xxxxx -
- - - - - -Upcoming changes -Community ratings - - - -

What's new in 2.18 (2016/08/15)

- -

What's new in 2.17 (2016/08/05)

- -

What's new in 2.16 (2016/07/31)

- -

What's new in 2.15 (2016/07/24)

- -

What's new in 2.14 (2016/07/17)

- -

What's new in 2.13 (2016/07/10)

- -

What's new in 2.12 (2016/07/05)

- -

What's new in 2.11 (2016/06/26)

- -

What's new in 2.10 (2016/06/19)

- -

What's new in 2.9 (2016/06/13)

- -

What's new in 2.8 (2016/06/05)

- -

What's new in 2.7 (2016/05/29)

- -

What's new in 2.6 (2016/05/22)

- -

What's new in 2.5 (2016/05/16)

- -

What's new in 2.4 (2016/05/15)

- -

What's new in 2.3 (2016/05/11)

- -

What's new in 2.2 (2016/05/08)

- -

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. -
- - -

What's new in 1.656 (2016/04/03)

- -

What's new in 1.655 (2016/03/27)

- -

What's new in 1.654 (2016/03/21)

- -

What's new in 1.653 (2016/03/13)

- -

What's new in 1.652 (2016/03/06)

- -

What's new in 1.651 (2016/02/28)

- -

What's new in 1.650 (2016/02/24)

- -

What's new in 1.649 (2016/02/21)

- -

What's new in 1.648 (2016/02/17)

- -

What's new in 1.647 (2016/02/04)

- -

What's new in 1.646 (2016/01/25)

- -

What's new in 1.645 (2016/01/18)

- -

What's new in 1.644 (2016/01/10)

- -

What's new in 1.643 (2015/12/20)

- -

What's new in 1.642 (2015/12/13)

- -

What's new in 1.641 (2015/12/09)

- -

What's new in 1.640 (2015/12/07)

- -

What's new in 1.639 (2015/11/29)

- -

What's new in 1.638 (2015/11/11)

- -

What's new in 1.637 (2015/11/08)

- -

What's new in 1.636 (2015/11/01)

- -

What's new in 1.635 (2015/10/25)

- -

What's new in 1.634 (2015/10/18)

- -

What's new in 1.633 (2015/10/11)

- -

What's new in 1.632 (2015/10/05)

- -

What's new in 1.631 (2015/09/27)

- -

What's new in 1.630 (2015/09/20)

- -

What's new in 1.629 (2015/09/15)

- -

What's new in 1.628 (2015/09/06)

- -

What's new in 1.627 (2015/08/30)

- -

What's new in 1.626 (2015/08/23)

- -

What's new in 1.625 (2015/08/17)

- -

What's new in 1.624 (2015/08/09)

- -

What's new in 1.623 (2015/08/02)

-

No notable changes in this release.

-

What's new in 1.622 (2015/07/27)

- -

What's new in 1.621 (2015/07/19)

- -

What's new in 1.620 (2015/07/12)

- -

What's new in 1.619 (2015/07/05)

- -

What's new in 1.618 (2015/06/29)

- -

What's new in 1.617 (2015/06/07)

- -

What's new in 1.616 (2015/05/31)

- -

What's new in 1.615 (2015/05/25)

- -

What's new in 1.614 (2015/05/17)

- -

What's new in 1.613 (2015/05/10)

- -

What's new in 1.612 (2015/05/03)

- -

What's new in 1.611 (2015/04/26)

- -

What's new in 1.610 (2015/04/19)

- -

What's new in 1.609 (2015/04/12)

- -

What's new in 1.608 (2015/04/05)

- -

What's new in 1.607 (2015/03/30)

- -

What's new in 1.606 (2015/03/23)

- -

What's new in 1.605 (2015/03/16)

- -

What's new in 1.604 (2015/03/15)

- -

What's new in 1.602 (2015/03/08)

- -

What's new in 1.601 (2015/03/03)

- -

What's new in 1.600 (2015/02/28)

- -

What's new in 1.599 (2015/02/16)

- -

What's new in 1.598 (2015/01/25)

- -

What's new in 1.597 (2015/01/19)

- -

What's new in 1.596 (2015/01/04)

- -

What's new in 1.595 (2014/12/21)

- -

What's new in 1.594 (2014/12/14)

- -

What's new in 1.593 (2014/12/07)

- -

What's new in 1.592 (2014/11/30)

- -

What's new in 1.591 (2014/11/25)

- -

What's new in 1.590 (2014/11/16)

- -

What's new in 1.589 (2014/11/09)

- -

What's new in 1.588 (2014/11/02)

- -

What's new in 1.587 (2014/10/29)

- -

What's new in 1.586 (2014/10/26)

- -

What's new in 1.585 (2014/10/19)

- -

What's new in 1.584 (2014/10/12)

- -

What's new in 1.583 (2014/10/01)

- -

What's new in 1.582 (2014/09/28)

- -

What's new in 1.581 (2014/09/21)

- -

What's new in 1.580 (2014/09/14)

- -

What's new in 1.579 (2014/09/06)

- -

What's new in 1.578 (2014/08/31)

- -

What's new in 1.577 (2014/08/24)

- -

What's new in 1.576 (2014/08/18)

- -

What's new in 1.575 (2014/08/10)

- -

What's new in 1.574 (2014/07/27)

- -

What's new in 1.573 (2014/07/20)

- -

What's new in 1.572 (2014/07/13)

- -

What's new in 1.571 (2014/07/07)

- -

What's new in 1.570 (2014/06/29)

- -

What's new in 1.569 (2014/06/23)

- -

What's new in 1.568 (2014/06/15)

- -

What's new in 1.567 (2014/06/09)

- -

What's new in 1.566 (2014/06/01)

- -

What's new in 1.565 (2014/05/26)

- -

What's new in 1.564 (2014/05/19)

- -

What's new in 1.563 (2014/05/11)

- -

What's new in 1.562 (2014/05/03)

- -

What's new in 1.561 (2014/04/27)

- -

What's new in 1.560 (2014/04/20)

- -

What's new in 1.559 (2014/04/13)

- -

What's new in 1.558 (2014/04/06)

- -

What's new in 1.557 (2014/03/31)

- -

What's new in 1.556 (2014/03/23)

- -

What's new in 1.555 (2014/03/16)

- -

What's new in 1.554 (2014/03/09)

- -

What's new in 1.553 (2014/03/02)

- -

What's new in 1.552 (2014/02/24)

- -

What's new in 1.551 (2014/02/14)

- -

What's new in 1.550 (2014/02/09)

- -

What's new in 1.549 (2014/01/25)

- -

What's new in 1.548 (2014/01/20)

- -

What's new in 1.547 (2014/01/12)

- -

What's new in 1.546 (2014/01/06)

- - -

-Older changelogs can be found in a separate file - - - +--> \ No newline at end of file diff --git a/cli/pom.xml b/cli/pom.xml index 65ad4f7f204c6aeb5ea0381ae32150c922a7d648..cf52a39ab24f05a9a591f0cf5bb48c52ddbe7518 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main pom - 2.19-SNAPSHOT + 2.51-SNAPSHOT cli @@ -24,6 +24,11 @@ powermock-api-mockito test + + org.kohsuke + access-modifier-annotation + 1.7 + commons-codec commons-codec @@ -42,7 +47,7 @@ org.jvnet.localizer localizer - 1.23 + 1.24 org.jenkins-ci @@ -88,6 +93,7 @@ Messages.properties target/generated-sources/localizer + true diff --git a/cli/src/main/java/hudson/cli/CLI.java b/cli/src/main/java/hudson/cli/CLI.java index 525f66d65b1ab0c1d339c27936d3751910748329..4df7c421b6c9d81f8751a3cb716f09ed76d01bbe 100644 --- a/cli/src/main/java/hudson/cli/CLI.java +++ b/cli/src/main/java/hudson/cli/CLI.java @@ -25,6 +25,7 @@ package hudson.cli; import hudson.cli.client.Messages; import hudson.remoting.Channel; +import hudson.remoting.NamingThreadFactory; import hudson.remoting.PingThread; import hudson.remoting.Pipe; import hudson.remoting.RemoteInputStream; @@ -71,6 +72,8 @@ import java.util.Locale; import java.util.Properties; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import java.util.logging.ConsoleHandler; +import java.util.logging.Handler; import java.util.logging.Level; import java.util.logging.Logger; import static java.util.logging.Level.*; @@ -80,7 +83,7 @@ import static java.util.logging.Level.*; * * @author Kohsuke Kawaguchi */ -public class CLI { +public class CLI implements AutoCloseable { private final ExecutorService pool; private final Channel channel; private final CliEntryPoint entryPoint; @@ -121,7 +124,7 @@ public class CLI { if(!url.endsWith("/")) url+='/'; ownsPool = exec==null; - pool = exec!=null ? exec : Executors.newCachedThreadPool(); + pool = exec!=null ? exec : Executors.newCachedThreadPool(new NamingThreadFactory(Executors.defaultThreadFactory(), "CLI.pool")); Channel _channel; try { @@ -176,9 +179,10 @@ public class CLI { if (httpsProxyTunnel!=null) { String[] tokens = httpsProxyTunnel.split(":"); + LOGGER.log(Level.FINE, "Using HTTP proxy {0}:{1} to connect to CLI port", new Object[]{tokens[0], tokens[1]}); s.connect(new InetSocketAddress(tokens[0], Integer.parseInt(tokens[1]))); PrintStream o = new PrintStream(s.getOutputStream()); - o.print("CONNECT " + clip.endpoint.getHostName() + ":" + clip.endpoint.getPort() + " HTTP/1.0\r\n\r\n"); + o.print("CONNECT " + clip.endpoint.getHostString() + ":" + clip.endpoint.getPort() + " HTTP/1.0\r\n\r\n"); // read the response from the proxy ByteArrayOutputStream rsp = new ByteArrayOutputStream(); @@ -188,11 +192,15 @@ public class CLI { rsp.write(ch); } String head = new BufferedReader(new StringReader(rsp.toString("ISO-8859-1"))).readLine(); + if (head == null) { throw new IOException("Unexpected empty response"); } - if (!head.startsWith("HTTP/1.0 200 ")) - throw new IOException("Failed to establish a connection through HTTP proxy: "+rsp); + if (!(head.startsWith("HTTP/1.0 200 ") || head.startsWith("HTTP/1.1 200 "))) { + s.close(); + LOGGER.log(Level.SEVERE, "Failed to tunnel the CLI port through the HTTP proxy. Falling back to HTTP."); + throw new IOException("Failed to establish a connection through HTTP proxy: " + rsp); + } // HTTP proxies (at least the one I tried --- squid) doesn't seem to do half-close very well. // So instead of relying on it, we'll just send the close command and then let the server @@ -377,12 +385,12 @@ public class CLI { } public static void main(final String[] _args) throws Exception { -// Logger l = Logger.getLogger(Channel.class.getName()); -// l.setLevel(ALL); -// ConsoleHandler h = new ConsoleHandler(); -// h.setLevel(ALL); -// l.addHandler(h); -// + Logger l = Logger.getLogger(ROOT_LOGGER_NAME); + l.setLevel(SEVERE); + ConsoleHandler h = new ConsoleHandler(); + h.setLevel(SEVERE); + l.addHandler(h); + try { System.exit(_main(_args)); } catch (Throwable t) { @@ -417,7 +425,7 @@ public class CLI { continue; } if (head.equals("-noCertificateCheck")) { - System.out.println("Skipping HTTPS certificate checks altogether. Note that this is not secure at all."); + System.err.println("Skipping HTTPS certificate checks altogether. Note that this is not secure at all."); SSLContext context = SSLContext.getInstance("TLS"); context.init(null, new TrustManager[]{new NoCheckTrustManager()}, new SecureRandom()); HttpsURLConnection.setDefaultSSLSocketFactory(context.getSocketFactory()); @@ -453,6 +461,15 @@ public class CLI { args = args.subList(2,args.size()); continue; } + if(head.equals("-v")) { + args = args.subList(1,args.size()); + Logger l = Logger.getLogger(ROOT_LOGGER_NAME); + l.setLevel(FINEST); + for (Handler h : l.getHandlers()) { + h.setLevel(FINEST); + } + continue; + } break; } @@ -589,4 +606,5 @@ public class CLI { } private static final Logger LOGGER = Logger.getLogger(CLI.class.getName()); + private static final String ROOT_LOGGER_NAME = CLI.class.getPackage().getName(); } diff --git a/cli/src/main/java/hudson/cli/PrivateKeyProvider.java b/cli/src/main/java/hudson/cli/PrivateKeyProvider.java index 834bb7234250d7d7bac2bd424aba5aa670be0fda..5fe402afc69d3cc6b0b1ea21377b7ffe896baa63 100644 --- a/cli/src/main/java/hudson/cli/PrivateKeyProvider.java +++ b/cli/src/main/java/hudson/cli/PrivateKeyProvider.java @@ -127,15 +127,11 @@ public class PrivateKeyProvider { } private static String readPemFile(File f) throws IOException{ - FileInputStream is = new FileInputStream(f); - try { - DataInputStream dis = new DataInputStream(is); + try (FileInputStream is = new FileInputStream(f); + DataInputStream dis = new DataInputStream(is)) { byte[] bytes = new byte[(int) f.length()]; dis.readFully(bytes); - dis.close(); return new String(bytes); - } finally { - is.close(); } } diff --git a/cli/src/main/resources/hudson/cli/client/Messages.properties b/cli/src/main/resources/hudson/cli/client/Messages.properties index 699b4c47381227a92f7316331cbdbc3477759213..1c091fbfb0d20ce33432ee40dd0f356c40f236c1 100644 --- a/cli/src/main/resources/hudson/cli/client/Messages.properties +++ b/cli/src/main/resources/hudson/cli/client/Messages.properties @@ -3,9 +3,10 @@ CLI.Usage=Jenkins CLI\n\ Options:\n\ -s URL : the server URL (defaults to the JENKINS_URL env var)\n\ -i KEY : SSH private key file used for authentication\n\ - -p HOST:PORT : HTTP proxy host and port for HTTPS proxy tunneling. See http://jenkins-ci.org/https-proxy-tunnel\n\ + -p HOST:PORT : HTTP proxy host and port for HTTPS proxy tunneling. See https://jenkins.io/redirect/cli-https-proxy-tunnel\n\ -noCertificateCheck : bypass HTTPS certificate check entirely. Use with caution\n\ -noKeyAuth : don't try to load the SSH authentication private key. Conflicts with -i\n\ + -v : verbose output. Display logs on the console by setting j.u.l log level to FINEST\n\ \n\ The available commands depend on the server. Run the 'help' command to\n\ see the list. diff --git a/cli/src/main/resources/hudson/cli/client/Messages_bg.properties b/cli/src/main/resources/hudson/cli/client/Messages_bg.properties index 187d7208d6bea45ac5ed62fbac8dac35cc469937..acd0191d5c8bfbf854d5344b2d29f8463f3b55e9 100644 --- a/cli/src/main/resources/hudson/cli/client/Messages_bg.properties +++ b/cli/src/main/resources/hudson/cli/client/Messages_bg.properties @@ -28,7 +28,7 @@ CLI.Usage=\ \u0441\u0440\u0435\u0434\u0430\u0442\u0430 \u201eJENKINS_URL\u201c)\n\ -i \u041a\u041b\u042e\u0427 : \u0447\u0430\u0441\u0442\u0435\u043d \u043a\u043b\u044e\u0447 \u0437\u0430 SSH \u0437\u0430 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f\n\ -p \u0425\u041e\u0421\u0422:\u041f\u041e\u0420\u0422 : \u0445\u043e\u0441\u0442 \u0438 \u043f\u043e\u0440\u0442 \u0437\u0430 \u0441\u044a\u0440\u0432\u044a\u0440-\u043f\u043e\u0441\u0440\u0435\u0434\u043d\u0438\u043a \u043f\u043e HTTP \u0437\u0430 \u0442\u0443\u043d\u0435\u043b \u043f\u043e HTTPS.\n\ - \u0417\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f: http://jenkins-ci.org/https-proxy-tunnel\n\ + \u0417\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f: https://jenkins.io/redirect/cli-https-proxy-tunnel\n\ -noCertificateCheck : \u0431\u0435\u0437 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430 \u0437\u0430 HTTPS (\u0412\u041d\u0418\u041c\u0410\u041d\u0418\u0415!)\n\ -noKeyAuth : \u0431\u0435\u0437 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u0441 \u0447\u0430\u0441\u0442\u0435\u043d \u043a\u043b\u044e\u0447 \u0437\u0430 SSH, \u043e\u043f\u0446\u0438\u044f\u0442\u0430 \u0435\n\ \u043d\u0435\u0441\u044a\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u0430 \u0441 \u043e\u043f\u0446\u0438\u044f\u0442\u0430 \u201e-i\u201c\n\n\ diff --git a/cli/src/main/resources/hudson/cli/client/Messages_de.properties b/cli/src/main/resources/hudson/cli/client/Messages_de.properties index 55769d64ded51906132d5ff94ef67e36aa9c66d1..1fb09d2cb4089e8d08699729b2b05823f1767fee 100644 --- a/cli/src/main/resources/hudson/cli/client/Messages_de.properties +++ b/cli/src/main/resources/hudson/cli/client/Messages_de.properties @@ -4,7 +4,7 @@ CLI.Usage=Jenkins Kommandozeilenschnittstelle (Jenkins CLI)\n\ Optionen:\n\ -s URL : URL des Hudson-Servers (Wert der Umgebungsvariable JENKINS_URL ist der Vorgabewert)\n\ -i KEY : Datei mit privatem SSH-Schl\u00fcssel zur Authentisierung\n\ - -p HOST\:PORT : HTTP-Proxy-Host und -Port f\u00fcr HTTPS-Proxy-Tunnel. Siehe http://jenkins-ci.org/https-proxy-tunnel\n\ + -p HOST\:PORT : HTTP-Proxy-Host und -Port f\u00fcr HTTPS-Proxy-Tunnel. Siehe https://jenkins.io/redirect/cli-https-proxy-tunnel\n\ -noCertificateCheck : \u00dcberspringt die Zertifikatspr\u00fcfung bei HTTPS. Bitte mit Vorsicht einsetzen.\n\ -noKeyAuth : \u00dcberspringt die Authentifizierung mit einem privaten SSH-Schl\u00fcssel. Nicht kombinierbar mit -i\n\ \n\ diff --git a/cli/src/main/resources/hudson/cli/client/Messages_pt_BR.properties b/cli/src/main/resources/hudson/cli/client/Messages_pt_BR.properties index 61e1895c4dfb7d5dd96cf0dd4723671fb60c673a..779e88f1a6ecfe5230b2e29d84e4191a8c1de443 100644 --- a/cli/src/main/resources/hudson/cli/client/Messages_pt_BR.properties +++ b/cli/src/main/resources/hudson/cli/client/Messages_pt_BR.properties @@ -26,7 +26,7 @@ CLI.Usage=Jenkins CLI\n\ Op\u00e7\u00f5es:\n\ -s URL : a URL do servidor (por padr\u00e3o a vari\u00e1vel de ambiente JENKINS_URL \u00e9 usada)\n\ -i KEY : arquivo contendo a chave SSH privada usada para autentica\u00e7\u00e3o\n\ - -p HOST:PORT : host e porta do proxy HTTP para tunelamento de proxy HTTPS. Veja http://jenkins-ci.org/https-proxy-tunnel\n\ + -p HOST:PORT : host e porta do proxy HTTP para tunelamento de proxy HTTPS. Veja https://jenkins.io/redirect/cli-https-proxy-tunnel\n\ -noCertificateCheck : ignora completamente a valida\u00e7\u00e3o dos certificados HTTPS. Use com cautela\n\ -noKeyAuth : n\u00e3o tenta carregar a chave privada para autentica\u00e7\u00e3o SSH. Conflita com -i\n\ \n\ diff --git a/cli/src/main/resources/hudson/cli/client/Messages_zh_TW.properties b/cli/src/main/resources/hudson/cli/client/Messages_zh_TW.properties index af303db03487aba6d903487ef308bae13d859464..4a9068624434d8c2bd6ef77c3fefe778c5fea59e 100644 --- a/cli/src/main/resources/hudson/cli/client/Messages_zh_TW.properties +++ b/cli/src/main/resources/hudson/cli/client/Messages_zh_TW.properties @@ -28,7 +28,7 @@ CLI.Usage=Jenkins CLI\n\ \u9078\u9805:\n\ -s URL : \u4f3a\u670d\u5668 URL (\u9810\u8a2d\u503c\u70ba JENKINS_URL \u74b0\u5883\u8b8a\u6578)\n\ -i KEY : \u9a57\u8b49\u7528\u7684 SSH \u79c1\u9470\u6a94\n\ - -p HOST:PORT : \u5efa HTTPS Proxy Tunnel \u7684 HTTP \u4ee3\u7406\u4f3a\u670d\u5668\u4e3b\u6a5f\u53ca\u9023\u63a5\u57e0\u3002\u8acb\u53c3\u8003 http://jenkins-ci.org/https-proxy-tunnel\n\ + -p HOST:PORT : \u5efa HTTPS Proxy Tunnel \u7684 HTTP \u4ee3\u7406\u4f3a\u670d\u5668\u4e3b\u6a5f\u53ca\u9023\u63a5\u57e0\u3002\u8acb\u53c3\u8003 https://jenkins.io/redirect/cli-https-proxy-tunnel\n\ -noCertificateCheck : \u5b8c\u5168\u7565\u904e HTTPS \u6191\u8b49\u6aa2\u67e5\u3002\u8acb\u5c0f\u5fc3\u4f7f\u7528\n\ \n\ \u53ef\u7528\u7684\u6307\u4ee4\u53d6\u6c7a\u65bc\u4f3a\u670d\u5668\u3002\u57f7\u884c 'help' \u6307\u4ee4\u53ef\u4ee5\u67e5\u770b\u5b8c\u6574\u6e05\u55ae\u3002 diff --git a/core/pom.xml b/core/pom.xml index 28de7b936b0895fbd2da9aafdf565c18c943e6d3..dbfe9b7315240d582249bbfa7c004883c3fca10c 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.19-SNAPSHOT + 2.51-SNAPSHOT jenkins-core @@ -39,9 +39,9 @@ THE SOFTWARE. true - 1.243 + 1.250 2.5.6.SEC03 - 2.4.7 + 2.4.8 true @@ -65,7 +65,7 @@ THE SOFTWARE. org.jenkins-ci version-number - 1.1 + 1.3 org.jenkins-ci @@ -159,7 +159,7 @@ THE SOFTWARE. org.kohsuke.stapler stapler-adjunct-timeline - 1.4 + 1.5 org.kohsuke.stapler @@ -212,7 +212,7 @@ THE SOFTWARE. org.jvnet.localizer localizer - 1.23 + 1.24 antlr @@ -491,12 +491,12 @@ THE SOFTWARE. commons-collections commons-collections - 3.2.1 + 3.2.2 org.jvnet.winp winp - 1.22 + 1.24 org.jenkins-ci @@ -541,7 +541,7 @@ THE SOFTWARE. net.java.sezpoz sezpoz - 1.11 + 1.12 org.kohsuke.jinterop @@ -591,12 +591,6 @@ THE SOFTWARE. 1.3.1-jenkins-1 - - org.mindrot - jbcrypt - 0.3m - - - - com.google.guava - guava - + + com.google.guava + guava + + + com.google.guava + guava-testlib + test + com.jcraft @@ -647,6 +646,7 @@ THE SOFTWARE. generate-taglib-interface + record-core-location @@ -696,6 +696,7 @@ THE SOFTWARE. Messages.properties target/generated-sources/localizer + true @@ -754,7 +755,7 @@ THE SOFTWARE. com.sun.winsw winsw - 1.16 + 2.0.2 bin exe ${project.build.outputDirectory}/windows-service @@ -771,6 +772,7 @@ THE SOFTWARE. 0.5C true -XX:MaxPermSize=128m -noverify + false @@ -845,21 +847,9 @@ THE SOFTWARE. release - - org.codehaus.mojo - apt-maven-plugin - - - - - process - - - - diff --git a/core/src/filter/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_pl.properties b/core/src/filter/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_pl.properties index 6f5ff479b3092c96f38a93a2f6fb46a126fead29..18a2cbe3c311f03744e1c92f180bddd06a09461a 100644 --- a/core/src/filter/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_pl.properties +++ b/core/src/filter/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_pl.properties @@ -1,6 +1,25 @@ -# This file is under the MIT License by authors - +# The MIT License +# +# Copyright (c) 2013-2016, Kohsuke Kawaguchi, Damian Szczepanik +# +# 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. NewVersionAvailable=Nowa wersja Jenkinsa ({0}) jest dost\u0119pna do pobrania (historia zmian). -Or\ Upgrade\ Automatically=Albo uaktualnij automatycznie +Or\ Upgrade\ Automatically=Uaktualnij automatycznie UpgradeCompleteRestartNotSupported=Aktualizacja Jenkinsa do wersji {0} zako\u0144czy\u0142a si\u0119 pomy\u015Blnie, oczekiwanie na ponowne uruchomienie. UpgradeProgress=Aktualizacja Jenkinsa do wersji {0} trwa lub nie powiod\u0142a si\u0119. diff --git a/core/src/main/java/hudson/BulkChange.java b/core/src/main/java/hudson/BulkChange.java index 3c7da451f6384a6f516e7e2aa45851b5ea77f846..28b9fde4261074ca2e4828534139d16e18c8f464 100644 --- a/core/src/main/java/hudson/BulkChange.java +++ b/core/src/main/java/hudson/BulkChange.java @@ -54,7 +54,7 @@ import java.io.IOException; * *

    *
  1. - * Mutater methods should invoke {@code this.save()} so that if the method is called outside + * Mutator methods should invoke {@code this.save()} so that if the method is called outside * a {@link BulkChange}, the result will be saved immediately. * *
  2. @@ -78,7 +78,7 @@ public class BulkChange implements Closeable { public BulkChange(Saveable saveable) { this.parent = current(); this.saveable = saveable; - // rememeber who allocated this object in case + // remember who allocated this object in case // someone forgot to call save() at the end. allocator = new Exception(); diff --git a/core/src/main/java/hudson/ClassicPluginStrategy.java b/core/src/main/java/hudson/ClassicPluginStrategy.java index ff933347c3beda81f7dc0c9323bf41b2ac0771c0..792e02a0b73abb959f141bfd1f227d87a25996c0 100644 --- a/core/src/main/java/hudson/ClassicPluginStrategy.java +++ b/core/src/main/java/hudson/ClassicPluginStrategy.java @@ -107,11 +107,8 @@ public class ClassicPluginStrategy implements PluginStrategy { if (isLinked(archive)) { manifest = loadLinkedManifest(archive); } else { - JarFile jf = new JarFile(archive, false); - try { + try (JarFile jf = new JarFile(archive, false)) { manifest = jf.getManifest(); - } finally { - jf.close(); } } return PluginWrapper.computeShortName(manifest, archive.getName()); @@ -176,11 +173,8 @@ public class ClassicPluginStrategy implements PluginStrategy { "Plugin installation failed. No manifest at " + manifestFile); } - FileInputStream fin = new FileInputStream(manifestFile); - try { + try (FileInputStream fin = new FileInputStream(manifestFile)) { manifest = new Manifest(fin); - } finally { - fin.close(); } } @@ -646,14 +640,13 @@ public class ClassicPluginStrategy implements PluginStrategy { final long dirTime = archive.lastModified(); // this ZipOutputStream is reused and not created for each directory - final ZipOutputStream wrappedZOut = new ZipOutputStream(new NullOutputStream()) { + try (ZipOutputStream wrappedZOut = new ZipOutputStream(new NullOutputStream()) { @Override public void putNextEntry(ZipEntry ze) throws IOException { ze.setTime(dirTime+1999); // roundup super.putNextEntry(ze); } - }; - try { + }) { Zip z = new Zip() { /** * Forces the fixed timestamp for directories to make sure @@ -672,8 +665,6 @@ public class ClassicPluginStrategy implements PluginStrategy { z.setDestFile(classesJar); z.add(mapper); z.execute(); - } finally { - wrappedZOut.close(); } } diff --git a/core/src/main/java/hudson/DependencyRunner.java b/core/src/main/java/hudson/DependencyRunner.java index acf035676910ad3ac77f6e4b3164ed7358fc0f39..03efea55e4036a69b1b3297e083c8a3a86a351af 100644 --- a/core/src/main/java/hudson/DependencyRunner.java +++ b/core/src/main/java/hudson/DependencyRunner.java @@ -59,7 +59,7 @@ public class DependencyRunner implements Runnable { Set topLevelProjects = new HashSet(); // Get all top-level projects LOGGER.fine("assembling top level projects"); - for (AbstractProject p : Jenkins.getInstance().getAllItems(AbstractProject.class)) + for (AbstractProject p : Jenkins.getInstance().allItems(AbstractProject.class)) if (p.getUpstreamProjects().size() == 0) { LOGGER.fine("adding top level project " + p.getName()); topLevelProjects.add(p); diff --git a/core/src/main/java/hudson/Extension.java b/core/src/main/java/hudson/Extension.java index 5ad913ef6ad39a1e8f2c35168c0863e48ec31221..1ca863d2f4f5cbdf46c66ede57c9e59920e5781b 100644 --- a/core/src/main/java/hudson/Extension.java +++ b/core/src/main/java/hudson/Extension.java @@ -74,7 +74,8 @@ public @interface Extension { /** * Used for sorting extensions. * - * Extensions will be sorted in the descending order of the ordinal. + * Extensions will be sorted in the descending order of the ordinal. In other words, + * the extensions with the highest numbers will be chosen first. * This is a rather poor approach to the problem, so its use is generally discouraged. * * @since 1.306 diff --git a/core/src/main/java/hudson/ExtensionList.java b/core/src/main/java/hudson/ExtensionList.java index 397f57030dbb538a2a3f1ecb0d7712e572c6a7fa..f2fcab81d403e63588322b73ceacae33dce66617 100644 --- a/core/src/main/java/hudson/ExtensionList.java +++ b/core/src/main/java/hudson/ExtensionList.java @@ -46,6 +46,7 @@ import java.util.logging.Level; import java.util.logging.Logger; import javax.annotation.CheckForNull; import javax.annotation.Nonnull; +import jenkins.util.io.OnMaster; /** * Retains the known extension instances for the given type 'T'. @@ -68,7 +69,7 @@ import javax.annotation.Nonnull; * @see jenkins.model.Jenkins#getExtensionList(Class) * @see jenkins.model.Jenkins#getDescriptorList(Class) */ -public class ExtensionList extends AbstractList { +public class ExtensionList extends AbstractList implements OnMaster { /** * @deprecated as of 1.417 * Use {@link #jenkins} @@ -203,6 +204,21 @@ public class ExtensionList extends AbstractList { } } + @Override + public boolean removeAll(Collection c) { + boolean removed = false; + try { + for (Object o : c) { + removed |= removeSync(o); + } + return removed; + } finally { + if (extensions != null && removed) { + fireOnChangeListeners(); + } + } + } + private synchronized boolean removeSync(Object o) { boolean removed = removeComponent(legacyInstances, o); if(extensions!=null) { diff --git a/core/src/main/java/hudson/ExtensionPoint.java b/core/src/main/java/hudson/ExtensionPoint.java index f49a5a096cc7ba2b6671b3ec8a0dd5b23746f3a2..e544ed7576ad411694e868a149dbf2ee1a6971b2 100644 --- a/core/src/main/java/hudson/ExtensionPoint.java +++ b/core/src/main/java/hudson/ExtensionPoint.java @@ -29,6 +29,7 @@ import static java.lang.annotation.ElementType.TYPE; import java.lang.annotation.Retention; import static java.lang.annotation.RetentionPolicy.RUNTIME; import java.lang.annotation.Target; +import jenkins.util.io.OnMaster; /** * Marker interface that designates extensible components diff --git a/core/src/main/java/hudson/FilePath.java b/core/src/main/java/hudson/FilePath.java index 6b2529eabe6a7084cc45dce9c5e07ed0a6376731..bb68b4e067d31284f9cf61ff94c35b5866421f2a 100644 --- a/core/src/main/java/hudson/FilePath.java +++ b/core/src/main/java/hudson/FilePath.java @@ -389,11 +389,8 @@ public final class FilePath implements Serializable { } public void zip(FilePath dst) throws IOException, InterruptedException { - OutputStream os = dst.write(); - try { + try (OutputStream os = dst.write()) { zip(os); - } finally { - os.close(); } } @@ -555,7 +552,7 @@ public final class FilePath implements Serializable { * @see #unzip(FilePath) */ public void unzipFrom(InputStream _in) throws IOException, InterruptedException { - final InputStream in = new RemoteInputStream(_in); + final InputStream in = new RemoteInputStream(_in, Flag.GREEDY); act(new SecureFileCallable() { public Void invoke(File dir, VirtualChannel channel) throws IOException { unzip(dir, in); @@ -594,11 +591,8 @@ public final class FilePath implements Serializable { if (p != null) { mkdirs(p); } - InputStream input = zip.getInputStream(e); - try { + try (InputStream input = zip.getInputStream(e)) { IOUtils.copy(input, writing(f)); - } finally { - input.close(); } try { FilePath target = new FilePath(f); @@ -724,7 +718,7 @@ public final class FilePath implements Serializable { */ public void untarFrom(InputStream _in, final TarCompression compression) throws IOException, InterruptedException { try { - final InputStream in = new RemoteInputStream(_in); + final InputStream in = new RemoteInputStream(_in, Flag.GREEDY); act(new SecureFileCallable() { public Void invoke(File dir, VirtualChannel channel) throws IOException { readFromTar("input stream",dir, compression.extract(in)); @@ -837,7 +831,7 @@ public final class FilePath implements Serializable { return true; } catch (IOException x) { if (listener != null) { - x.printStackTrace(listener.error("Failed to download " + archive + " from agent; will retry from master")); + Functions.printStackTrace(x, listener.error("Failed to download " + archive + " from agent; will retry from master")); } } } @@ -868,8 +862,7 @@ public final class FilePath implements Serializable { this.archive = archive; } @Override public Void invoke(File dir, VirtualChannel channel) throws IOException, InterruptedException { - InputStream in = archive.openStream(); - try { + try (InputStream in = archive.openStream()) { CountingInputStream cis = new CountingInputStream(in); try { if (archive.toExternalForm().endsWith(".zip")) { @@ -880,8 +873,6 @@ public final class FilePath implements Serializable { } catch (IOException x) { throw new IOException(String.format("Failed to unpack %s (%d bytes read)", archive, cis.getByteCount()), x); } - } finally { - in.close(); } return null; } @@ -894,11 +885,8 @@ public final class FilePath implements Serializable { * @since 1.293 */ public void copyFrom(URL url) throws IOException, InterruptedException { - InputStream in = url.openStream(); - try { + try (InputStream in = url.openStream()) { copyFrom(in); - } finally { - in.close(); } } @@ -908,11 +896,8 @@ public final class FilePath implements Serializable { * @since 1.293 */ public void copyFrom(InputStream in) throws IOException, InterruptedException { - OutputStream os = write(); - try { + try (OutputStream os = write()) { org.apache.commons.io.IOUtils.copy(in, os); - } finally { - os.close(); } } @@ -938,16 +923,9 @@ public final class FilePath implements Serializable { throw new IOException(e); } } else { - InputStream i = file.getInputStream(); - OutputStream o = write(); - try { + try (InputStream i = file.getInputStream(); + OutputStream o = write()) { org.apache.commons.io.IOUtils.copy(i,o); - } finally { - try { - o.close(); - } finally { - i.close(); - } } } } @@ -1224,7 +1202,7 @@ public final class FilePath implements Serializable { deleteFile(deleting(dir)); } catch (IOException e) { // if some of the child directories are big, it might take long enough to delete that - // it allows others to create new files, causing problemsl ike JENKINS-10113 + // it allows others to create new files, causing problems like JENKINS-10113 // so give it one more attempt before we give up. if(!isSymlink(dir)) deleteContentsRecursive(dir); @@ -1396,11 +1374,8 @@ public final class FilePath implements Serializable { throw new IOException("Failed to create a temporary directory in "+dir,e); } - Writer w = new FileWriter(writing(f)); - try { + try (Writer w = new FileWriter(writing(f))) { w.write(contents); - } finally { - w.close(); } return f.getAbsolutePath(); @@ -1877,11 +1852,8 @@ public final class FilePath implements Serializable { * Reads this file into a string, by using the current system encoding. */ public String readToString() throws IOException, InterruptedException { - InputStream in = read(); - try { + try (InputStream in = read()) { return org.apache.commons.io.IOUtils.toString(in); - } finally { - in.close(); } } @@ -1931,11 +1903,8 @@ public final class FilePath implements Serializable { public Void invoke(File f, VirtualChannel channel) throws IOException { mkdirs(f.getParentFile()); FileOutputStream fos = new FileOutputStream(writing(f)); - Writer w = encoding != null ? new OutputStreamWriter(fos, encoding) : new OutputStreamWriter(fos); - try { + try (Writer w = encoding != null ? new OutputStreamWriter(fos, encoding) : new OutputStreamWriter(fos)) { w.write(content); - } finally { - w.close(); } return null; } @@ -2008,11 +1977,8 @@ public final class FilePath implements Serializable { */ public void copyTo(FilePath target) throws IOException, InterruptedException { try { - OutputStream out = target.write(); - try { + try (OutputStream out = target.write()) { copyTo(out); - } finally { - out.close(); } } catch (IOException e) { throw new IOException("Failed to copy "+this+" to "+target,e); @@ -2198,11 +2164,9 @@ public final class FilePath implements Serializable { Future future = target.actAsync(new SecureFileCallable() { private static final long serialVersionUID = 1L; public Void invoke(File f, VirtualChannel channel) throws IOException { - try { - readFromTar(remote + '/' + description, f,TarCompression.GZIP.extract(pipe.getIn())); + try (InputStream in = pipe.getIn()) { + readFromTar(remote + '/' + description, f,TarCompression.GZIP.extract(in)); return null; - } finally { - pipe.getIn().close(); } } }); @@ -2226,10 +2190,8 @@ public final class FilePath implements Serializable { Future future = actAsync(new SecureFileCallable() { private static final long serialVersionUID = 1L; public Integer invoke(File f, VirtualChannel channel) throws IOException { - try { - return writeToTar(f, scanner, TarCompression.GZIP.compress(pipe.getOut())); - } finally { - pipe.getOut().close(); + try (OutputStream out = pipe.getOut()) { + return writeToTar(f, scanner, TarCompression.GZIP.compress(out)); } } }); @@ -2295,17 +2257,16 @@ public final class FilePath implements Serializable { /** * Reads from a tar stream and stores obtained files to the base dir. - * @since TODO supports large files > 10 GB, migration to commons-compress + * Supports large files > 10 GB since 1.627 when this was migrated to use commons-compress. */ private void readFromTar(String name, File baseDir, InputStream in) throws IOException { - TarArchiveInputStream t = new TarArchiveInputStream(in); - + // TarInputStream t = new TarInputStream(in); - try { + try (TarArchiveInputStream t = new TarArchiveInputStream(in)) { TarArchiveEntry te; while ((te = t.getNextTarEntry()) != null) { - File f = new File(baseDir,te.getName()); - if(te.isDirectory()) { + File f = new File(baseDir, te.getName()); + if (te.isDirectory()) { mkdirs(f); } else { File parent = f.getParentFile(); @@ -2315,22 +2276,20 @@ public final class FilePath implements Serializable { if (te.isSymbolicLink()) { new FilePath(f).symlinkTo(te.getLinkName(), TaskListener.NULL); } else { - IOUtils.copy(t,f); + IOUtils.copy(t, f); f.setLastModified(te.getModTime().getTime()); - int mode = te.getMode()&0777; - if(mode!=0 && !Functions.isWindows()) // be defensive - _chmod(f,mode); + int mode = te.getMode() & 0777; + if (mode != 0 && !Functions.isWindows()) // be defensive + _chmod(f, mode); } } } - } catch(IOException e) { - throw new IOException("Failed to extract "+name,e); + } catch (IOException e) { + throw new IOException("Failed to extract " + name, e); } catch (InterruptedException e) { Thread.currentThread().interrupt(); // process this later - throw new IOException("Failed to extract "+name,e); - } finally { - t.close(); + throw new IOException("Failed to extract " + name, e); } } @@ -2424,7 +2383,7 @@ public final class FilePath implements Serializable { for (String token : Util.tokenize(fileMask)) matched &= hasMatch(dir,token,caseSensitive); if(matched) - return Messages.FilePath_validateAntFileMask_whitespaceSeprator(); + return Messages.FilePath_validateAntFileMask_whitespaceSeparator(); } // a common mistake is to assume the wrong base dir, and there are two variations diff --git a/core/src/main/java/hudson/FileSystemProvisioner.java b/core/src/main/java/hudson/FileSystemProvisioner.java index 60978a00482112d7a09d118e709051285d920751..8b9967e2bb63694dec3e5361c63a5cd5e08a204f 100644 --- a/core/src/main/java/hudson/FileSystemProvisioner.java +++ b/core/src/main/java/hudson/FileSystemProvisioner.java @@ -215,11 +215,8 @@ public abstract class FileSystemProvisioner implements ExtensionPoint, Describab */ public WorkspaceSnapshot snapshot(AbstractBuild build, FilePath ws, String glob, TaskListener listener) throws IOException, InterruptedException { File wss = new File(build.getRootDir(),"workspace.tgz"); - OutputStream os = new BufferedOutputStream(new FileOutputStream(wss)); - try { - ws.archive(ArchiverFactory.TARGZ,os,glob); - } finally { - os.close(); + try (OutputStream os = new BufferedOutputStream(new FileOutputStream(wss))) { + ws.archive(ArchiverFactory.TARGZ, os, glob); } return new WorkspaceSnapshotImpl(); } diff --git a/core/src/main/java/hudson/FileSystemProvisionerDescriptor.java b/core/src/main/java/hudson/FileSystemProvisionerDescriptor.java index ce0371ceec0ecf79d7c4d06061e5a558358dfa6f..1e02e11f7f4dfdbedf2f00b853535725c1d43f86 100644 --- a/core/src/main/java/hudson/FileSystemProvisionerDescriptor.java +++ b/core/src/main/java/hudson/FileSystemProvisionerDescriptor.java @@ -63,7 +63,7 @@ public abstract class FileSystemProvisionerDescriptor extends Descriptor()); + return s.toString(); + } + private static void doPrintStackTrace(@Nonnull StringBuilder s, @Nonnull Throwable t, @CheckForNull Throwable higher, @Nonnull String prefix, @Nonnull Set encountered) { + if (!encountered.add(t)) { + s.append("\n"); + return; + } + if (Util.isOverridden(Throwable.class, t.getClass(), "printStackTrace", PrintWriter.class)) { + StringWriter sw = new StringWriter(); + t.printStackTrace(new PrintWriter(sw)); + s.append(sw.toString()); + return; + } + Throwable lower = t.getCause(); + if (lower != null) { + doPrintStackTrace(s, lower, t, prefix, encountered); + } + for (Throwable suppressed : t.getSuppressed()) { + s.append(prefix).append("Also: "); + doPrintStackTrace(s, suppressed, t, prefix + "\t", encountered); + } + if (lower != null) { + s.append(prefix).append("Caused: "); + } + String summary = t.toString(); + if (lower != null) { + String suffix = ": " + lower; + if (summary.endsWith(suffix)) { + summary = summary.substring(0, summary.length() - suffix.length()); + } + } + s.append(summary).append(IOUtils.LINE_SEPARATOR); + StackTraceElement[] trace = t.getStackTrace(); + int end = trace.length; + if (higher != null) { + StackTraceElement[] higherTrace = higher.getStackTrace(); + while (end > 0) { + int higherEnd = end + higherTrace.length - trace.length; + if (higherEnd <= 0 || !higherTrace[higherEnd - 1].equals(trace[end - 1])) { + break; + } + end--; + } + } + for (int i = 0; i < end; i++) { + s.append(prefix).append("\tat ").append(trace[i]).append(IOUtils.LINE_SEPARATOR); + } + } + + /** + * Like {@link Throwable#printStackTrace(PrintWriter)} but using {@link #printThrowable} format. + * @param t an exception to print + * @param pw the log + * @since 2.43 + */ + public static void printStackTrace(@CheckForNull Throwable t, @Nonnull PrintWriter pw) { + pw.println(printThrowable(t).trim()); + } + + /** + * Like {@link Throwable#printStackTrace(PrintStream)} but using {@link #printThrowable} format. + * @param t an exception to print + * @param ps the log + * @since 2.43 + */ + public static void printStackTrace(@CheckForNull Throwable t, @Nonnull PrintStream ps) { + ps.println(printThrowable(t).trim()); } /** diff --git a/core/src/main/java/hudson/Launcher.java b/core/src/main/java/hudson/Launcher.java index 4a6ed74f850d6983901d402fcf0b0c32a1aa92e8..ade4ce93c8c4f1698e1352c9259a4beb181ec57d 100644 --- a/core/src/main/java/hudson/Launcher.java +++ b/core/src/main/java/hudson/Launcher.java @@ -42,6 +42,8 @@ import org.apache.commons.io.input.NullInputStream; import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.restrictions.NoExternalUse; +import javax.annotation.CheckForNull; +import javax.annotation.concurrent.GuardedBy; import java.io.BufferedOutputStream; import java.io.File; import java.io.IOException; @@ -57,6 +59,7 @@ import java.util.logging.Level; import java.util.logging.Logger; import static org.apache.commons.io.output.NullOutputStream.NULL_OUTPUT_STREAM; +import hudson.Proc.ProcWithJenkins23271Patch; /** * Starts a process. @@ -296,7 +299,7 @@ public abstract class Launcher { * Sets the environment variable overrides. * *

    - * In adition to what the current process + * In addition to what the current process * is inherited (if this is going to be launched from a agent agent, that * becomes the "current" process), these variables will be also set. */ @@ -383,9 +386,37 @@ public abstract class Launcher { /** * Starts the process and waits for its completion. + * @return Return code of the invoked process + * @throws IOException Operation error (e.g. remote call failure) + * @throws InterruptedException The process has been interrupted */ public int join() throws IOException, InterruptedException { - return start().join(); + // The logging around procHolderForJoin prevents the preliminary object deallocation we saw in JENKINS-23271 + final Proc procHolderForJoin = start(); + LOGGER.log(Level.FINER, "Started the process {0}", procHolderForJoin); + + if (procHolderForJoin instanceof ProcWithJenkins23271Patch) { + return procHolderForJoin.join(); + } else { + // Fallback to the internal handling logic + if (!(procHolderForJoin instanceof LocalProc)) { + // We consider that the process may be at risk of JENKINS-23271 + LOGGER.log(Level.FINE, "Process {0} of type {1} is neither {2} nor instance of {3}. " + + "If this process operates with Jenkins agents via remote invocation, you may get into JENKINS-23271", + new Object[] {procHolderForJoin, procHolderForJoin.getClass(), LocalProc.class, ProcWithJenkins23271Patch.class}); + } + try { + final int returnCode = procHolderForJoin.join(); + if (LOGGER.isLoggable(Level.FINER)) { + LOGGER.log(Level.FINER, "Process {0} has finished with the return code {1}", new Object[]{procHolderForJoin, returnCode}); + } + return returnCode; + } finally { + if (procHolderForJoin.isAlive()) { // Should never happen but this forces Proc to not be removed and early GC by escape analysis + LOGGER.log(Level.WARNING, "Process {0} has not finished after the join() method completion", procHolderForJoin); + } + } + } } /** @@ -972,7 +1003,7 @@ public abstract class Launcher { private static final long serialVersionUID = 1L; } - public static final class ProcImpl extends Proc { + public static final class ProcImpl extends Proc implements ProcWithJenkins23271Patch { private final RemoteProcess process; private final IOTriplet io; @@ -983,12 +1014,28 @@ public abstract class Launcher { @Override public void kill() throws IOException, InterruptedException { - process.kill(); + try { + process.kill(); + } finally { + if (this.isAlive()) { // Should never happen but this forces Proc to not be removed and early GC by escape analysis + LOGGER.log(Level.WARNING, "Process {0} has not really finished after the kill() method execution", this); + } + } } @Override public int join() throws IOException, InterruptedException { - return process.join(); + try { + final int returnCode = process.join(); + if (LOGGER.isLoggable(Level.FINER)) { + LOGGER.log(Level.FINER, "Process {0} has finished with the return code {1}", new Object[]{this, returnCode}); + } + return returnCode; + } finally { + if (this.isAlive()) { // Should never happen but this forces Proc to not be removed and early GC by escape analysis + LOGGER.log(Level.WARNING, "Process {0} has not really finished after the join() method completion", this); + } + } } @Override @@ -1017,7 +1064,7 @@ public abstract class Launcher { * A launcher which delegates to a provided inner launcher. * Allows subclasses to only implement methods they want to override. * Originally, this launcher has been implemented in - * + * * Custom Tools Plugin. * * @author rcampbell diff --git a/core/src/main/java/hudson/LocalPluginManager.java b/core/src/main/java/hudson/LocalPluginManager.java index 25e48c053d0bf2dc7ef897dd6db8f0261e979ce3..bde452ca7aa58713435fa70c8d09fd84d676bcc1 100644 --- a/core/src/main/java/hudson/LocalPluginManager.java +++ b/core/src/main/java/hudson/LocalPluginManager.java @@ -70,7 +70,7 @@ public class LocalPluginManager extends PluginManager { * If the war file has any "/WEB-INF/plugins/*.jpi", extract them into the plugin directory. * * @return - * File names of the bundled plugins. Like {"ssh-slaves.jpi","subvesrion.jpi"} + * File names of the bundled plugins. Like {"ssh-slaves.jpi","subversion.jpi"} */ @Override protected Collection loadBundledPlugins() { diff --git a/core/src/main/java/hudson/Main.java b/core/src/main/java/hudson/Main.java index 8e8ec46dd40adffefc2a88e11256d8b36b46a8db..66173630ac08d2afa47f64d3d22d01244830fac8 100644 --- a/core/src/main/java/hudson/Main.java +++ b/core/src/main/java/hudson/Main.java @@ -133,7 +133,7 @@ public class Main { } // write the output to a temporary file first. - File tmpFile = File.createTempFile("hudson","log"); + File tmpFile = File.createTempFile("jenkins","log"); try { FileOutputStream os = new FileOutputStream(tmpFile); diff --git a/core/src/main/java/hudson/Plugin.java b/core/src/main/java/hudson/Plugin.java index 75af4fda013ef329000e81e1bed297d63dc6ab6a..5406fb21cbf396eb9616f0885c06b21c3f514f5b 100644 --- a/core/src/main/java/hudson/Plugin.java +++ b/core/src/main/java/hudson/Plugin.java @@ -53,8 +53,8 @@ import org.kohsuke.stapler.HttpResponses; *

    * A plugin may {@linkplain #Plugin derive from this class}, or it may directly define extension * points annotated with {@link hudson.Extension}. For a list of extension - * points, see - * https://wiki.jenkins-ci.org/display/JENKINS/Extension+points. + * points, see + * https://jenkins.io/redirect/developer/extension-points. * *

    * One instance of a plugin is created by Hudson, and used as the entry point @@ -280,7 +280,7 @@ public abstract class Plugin implements Saveable { * Controls the file where {@link #load()} and {@link #save()} * persists data. * - * This method can be also overriden if the plugin wants to + * This method can be also overridden if the plugin wants to * use a custom {@link XStream} instance to persist data. * * @since 1.245 diff --git a/core/src/main/java/hudson/PluginManager.java b/core/src/main/java/hudson/PluginManager.java index f1a463a5ff43bd87d225d223b1f7cbecae7ab87f..25c1b78d983a965bdd98bfe077f34381aa4b606b 100644 --- a/core/src/main/java/hudson/PluginManager.java +++ b/core/src/main/java/hudson/PluginManager.java @@ -67,6 +67,7 @@ import net.sf.json.JSONObject; import org.acegisecurity.Authentication; import org.apache.commons.fileupload.FileItem; +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; @@ -116,7 +117,6 @@ import java.util.Collections; 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; @@ -141,6 +141,10 @@ import org.xml.sax.helpers.DefaultHandler; import static hudson.init.InitMilestone.*; import hudson.model.DownloadService; import hudson.util.FormValidation; +import java.io.ByteArrayInputStream; +import java.net.JarURLConnection; +import java.net.URLConnection; +import java.util.jar.JarEntry; import static java.util.logging.Level.FINE; import static java.util.logging.Level.INFO; @@ -814,100 +818,102 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas */ @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; - try { - sn = strategy.getShortName(arc); - } catch (AbstractMethodError x) { - LOGGER.log(WARNING, "JENKINS-12753 fix not active: {0}", x.getMessage()); - p = strategy.createPluginWrapper(arc); - sn = p.getShortName(); - } - 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; + try (ACLContext context = ACL.as(ACL.SYSTEM)) { + LOGGER.info("Attempting to dynamic load "+arc); + PluginWrapper p = null; + String sn; + try { + sn = strategy.getShortName(arc); + } catch (AbstractMethodError x) { + LOGGER.log(WARNING, "JENKINS-12753 fix not active: {0}", x.getMessage()); + p = strategy.createPluginWrapper(arc); + sn = p.getShortName(); + } + 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)); } - } else { - throw new RestartRequiredException(Messages._PluginManager_PluginIsAlreadyInstalled_RestartRequired(sn)); } - } - if (p == null) { - p = strategy.createPluginWrapper(arc); - } - if (p.supportsDynamicLoad()== YesNoMaybe.NO) - throw new RestartRequiredException(Messages._PluginManager_PluginDoesntSupportDynamicLoad_RestartRequired(sn)); + if (p == null) { + p = strategy.createPluginWrapper(arc); + } + if (p.supportsDynamicLoad()== YesNoMaybe.NO) + throw new RestartRequiredException(Messages._PluginManager_PluginDoesntSupportDynamicLoad_RestartRequired(sn)); - // there's no need to do cyclic dependency check, because we are deploying one at a time, - // so existing plugins can't be depending on this newly deployed one. + // there's no need to do cyclic dependency check, because we are deploying one at a time, + // so existing plugins can't be depending on this newly deployed one. - plugins.add(p); - if (p.isActive()) - activePlugins.add(p); - synchronized (((UberClassLoader) uberClassLoader).loaded) { - ((UberClassLoader) uberClassLoader).loaded.clear(); - } - - try { - p.resolvePluginDependencies(); - strategy.load(p); + plugins.add(p); + if (p.isActive()) + activePlugins.add(p); + synchronized (((UberClassLoader) uberClassLoader).loaded) { + ((UberClassLoader) uberClassLoader).loaded.clear(); + } - Jenkins.getInstance().refreshExtensions(); + try { + p.resolvePluginDependencies(); + strategy.load(p); - p.getPlugin().postInitialize(); - } catch (Exception e) { - failedPlugins.add(new FailedPlugin(sn, e)); - activePlugins.remove(p); - plugins.remove(p); - throw new IOException("Failed to install "+ sn +" plugin",e); - } + Jenkins.getInstance().refreshExtensions(); - // run initializers in the added plugin - Reactor r = new Reactor(InitMilestone.ordering()); - final ClassLoader loader = p.classLoader; - r.addAll(new InitializerFinder(loader) { - @Override - protected boolean filter(Method e) { - return e.getDeclaringClass().getClassLoader() != loader || super.filter(e); + p.getPlugin().postInitialize(); + } catch (Exception e) { + failedPlugins.add(new FailedPlugin(sn, e)); + activePlugins.remove(p); + plugins.remove(p); + throw new IOException("Failed to install "+ sn +" plugin",e); } - }.discoverTasks(r)); - try { - new InitReactorRunner().run(r); - } catch (ReactorException e) { - throw new IOException("Failed to initialize "+ sn +" plugin",e); - } - // recalculate dependencies of plugins optionally depending the newly deployed one. - for (PluginWrapper depender: plugins) { - if (depender.equals(p)) { - // skip itself. - continue; + // run initializers in the added plugin + Reactor r = new Reactor(InitMilestone.ordering()); + final ClassLoader loader = p.classLoader; + r.addAll(new InitializerFinder(loader) { + @Override + protected boolean filter(Method e) { + return e.getDeclaringClass().getClassLoader() != loader || super.filter(e); + } + }.discoverTasks(r)); + try { + new InitReactorRunner().run(r); + } catch (ReactorException e) { + throw new IOException("Failed to initialize "+ sn +" plugin",e); } - for (Dependency d: depender.getOptionalDependencies()) { - if (d.shortName.equals(p.getShortName())) { - // this plugin depends on the newly loaded one! - // recalculate dependencies! - try { - getPluginStrategy().updateDependency(depender, p); - } catch (AbstractMethodError x) { - LOGGER.log(WARNING, "{0} does not yet implement updateDependency", getPluginStrategy().getClass()); + + // recalculate dependencies of plugins optionally depending the newly deployed one. + for (PluginWrapper depender: plugins) { + if (depender.equals(p)) { + // skip itself. + continue; + } + for (Dependency d: depender.getOptionalDependencies()) { + if (d.shortName.equals(p.getShortName())) { + // this plugin depends on the newly loaded one! + // recalculate dependencies! + try { + getPluginStrategy().updateDependency(depender, p); + } catch (AbstractMethodError x) { + LOGGER.log(WARNING, "{0} does not yet implement updateDependency", getPluginStrategy().getClass()); + } + break; } - break; } } - } - // Redo who depends on who. - resolveDependantPlugins(); + // Redo who depends on who. + resolveDependantPlugins(); - LOGGER.info("Plugin " + p.getShortName()+":"+p.getVersion() + " dynamically installed"); + LOGGER.info("Plugin " + p.getShortName()+":"+p.getVersion() + " dynamically installed"); + } } @Restricted(NoExternalUse.class) @@ -935,7 +941,7 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas * If the war file has any "/WEB-INF/plugins/[*.jpi | *.hpi]", extract them into the plugin directory. * * @return - * File names of the bundled plugins. Like {"ssh-slaves.hpi","subvesrion.jpi"} + * File names of the bundled plugins. Like {"ssh-slaves.hpi","subversion.jpi"} * @throws Exception * Any exception will be reported and halt the startup. */ @@ -948,7 +954,7 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas protected void copyBundledPlugin(URL src, String fileName) throws IOException { fileName = fileName.replace(".hpi",".jpi"); // normalize fileNames to have the correct suffix String legacyName = fileName.replace(".jpi",".hpi"); - long lastModified = src.openConnection().getLastModified(); + long lastModified = getModificationDate(src); File file = new File(rootDir, fileName); // normalization first, if the old file exists. @@ -959,7 +965,7 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas // - bundled version and current version differs (by timestamp). if (!file.exists() || file.lastModified() != lastModified) { FileUtils.copyURLToFile(src, file); - file.setLastModified(src.openConnection().getLastModified()); + file.setLastModified(getModificationDate(src)); // lastModified is set for two reasons: // - to avoid unpacking as much as possible, but still do it on both upgrade and downgrade // - to make sure the value is not changed after each restart, so we can avoid @@ -970,19 +976,19 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas // See https://groups.google.com/d/msg/jenkinsci-dev/kRobm-cxFw8/6V66uhibAwAJ } - private static @CheckForNull Manifest parsePluginManifest(URL bundledJpi) { + /*package*/ static @CheckForNull Manifest parsePluginManifest(URL bundledJpi) { try { URLClassLoader cl = new URLClassLoader(new URL[]{bundledJpi}); InputStream in=null; try { URL res = cl.findResource(PluginWrapper.MANIFEST_FILENAME); if (res!=null) { - in = res.openStream(); + in = getBundledJpiManifestStream(res); Manifest manifest = new Manifest(in); return manifest; } } finally { - IOUtils.closeQuietly(in); + Util.closeAndLogFailures(in, LOGGER, PluginWrapper.MANIFEST_FILENAME, bundledJpi.toString()); if (cl instanceof Closeable) ((Closeable)cl).close(); } @@ -991,6 +997,81 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas } return null; } + + /** + * Retrieves input stream for the Manifest url. + * The method intelligently handles the case of {@link JarURLConnection} pointing to files within JAR. + * @param url Url of the manifest file + * @return Input stream, which allows to retrieve manifest. This stream must be closed outside + * @throws IOException Operation error + */ + @Nonnull + /*package*/ static InputStream getBundledJpiManifestStream(@Nonnull URL url) throws IOException { + URLConnection uc = url.openConnection(); + InputStream in = null; + // Magic, which allows to avoid using stream generated for JarURLConnection. + // It prevents getting into JENKINS-37332 due to the file descriptor leak + if (uc instanceof JarURLConnection) { + final JarURLConnection jarURLConnection = (JarURLConnection) uc; + final String entryName = jarURLConnection.getEntryName(); + + try(final JarFile jarFile = jarURLConnection.getJarFile()) { + final JarEntry entry = (entryName != null && jarFile != null) ? jarFile.getJarEntry(entryName) : null; + if (entry != null && jarFile != null) { + try(InputStream i = jarFile.getInputStream(entry)) { + byte[] manifestBytes = IOUtils.toByteArray(i); + in = new ByteArrayInputStream(manifestBytes); + } + } else { + LOGGER.log(Level.WARNING, "Failed to locate the JAR file for {0}" + + "The default URLConnection stream access will be used, file descriptor may be leaked.", + url); + } + } + } + + // If input stream is undefined, use the default implementation + if (in == null) { + in = url.openStream(); + } + + return in; + } + + /** + * Retrieves modification date of the specified file. + * The method intelligently handles the case of {@link JarURLConnection} pointing to files within JAR. + * @param url Url of the file + * @return Modification date + * @throws IOException Operation error + */ + @Nonnull + /*package*/ static long getModificationDate(@Nonnull URL url) throws IOException { + URLConnection uc = url.openConnection(); + + // It prevents file descriptor leak if the URL references a file within JAR + // See JENKINS-37332 for more info + // The code idea is taken from https://github.com/jknack/handlebars.java/pull/394 + if (uc instanceof JarURLConnection) { + final JarURLConnection connection = (JarURLConnection) uc; + final URL jarURL = connection.getJarFileURL(); + if (jarURL.getProtocol().equals("file")) { + uc = null; + String file = jarURL.getFile(); + return new File(file).lastModified(); + } else { + // We access the data without file protocol + if (connection.getEntryName() != null) { + LOGGER.log(WARNING, "Accessing modification date of {0} file, which is an entry in JAR file. " + + "The access protocol is not file:, falling back to the default logic (risk of file descriptor leak).", + url); + } + } + } + + // Fallbak to the default implementation + return uc.getLastModified(); + } /** * Rename a legacy file to a new name, with care to Windows where {@link File#renameTo(File)} @@ -1065,8 +1146,11 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas /** * Get the plugin instance with the given short name. * @param shortName the short name of the plugin - * @return The plugin singleton or null if a plugin with the given short name does not exist. + * @return The plugin singleton or {@code null} if a plugin with the given short name does not exist. + * The fact the plugin is loaded does not mean it is enabled and fully initialized for the current Jenkins session. + * Use {@link PluginWrapper#isActive()} to check it. */ + @CheckForNull public PluginWrapper getPlugin(String shortName) { for (PluginWrapper p : getPlugins()) { if(p.getShortName().equals(shortName)) @@ -1079,8 +1163,11 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas * Get the plugin instance that implements a specific class, use to find your plugin singleton. * Note: beware the classloader fun. * @param pluginClazz The class that your plugin implements. - * @return The plugin singleton or null if for some reason the plugin is not loaded. + * @return The plugin singleton or {@code null} if for some reason the plugin is not loaded. + * The fact the plugin is loaded does not mean it is enabled and fully initialized for the current Jenkins session. + * Use {@link Plugin#getWrapper()} and then {@link PluginWrapper#isActive()} to check it. */ + @CheckForNull public PluginWrapper getPlugin(Class pluginClazz) { for (PluginWrapper p : getPlugins()) { if(pluginClazz.isInstance(p.getPlugin())) @@ -1137,7 +1224,7 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas for (PluginWrapper p : activePlugins) { if (p.classLoader==cl) { if (oneAndOnly!=null) - return null; // ambigious + return null; // ambiguous oneAndOnly = p; } } @@ -1331,7 +1418,7 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas UpdateSite.Plugin plugin = getPlugin(pluginName, siteName); // There could be cases like: // 'plugin.ambiguous.updatesite' where both - // 'plugin' @ 'ambigiuous.updatesite' and 'plugin.ambiguous' @ 'updatesite' resolve to valid plugins + // 'plugin' @ 'ambiguous.updatesite' and 'plugin.ambiguous' @ 'updatesite' resolve to valid plugins if (plugin != null) { if (p != null) { throw new Failure("Ambiguous plugin: " + n); @@ -1445,10 +1532,9 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas } sites.add(new UpdateSite(UpdateCenter.ID_DEFAULT, site)); - return HttpResponses.redirectToContextRoot(); + return new HttpRedirect("advanced"); } - @RequirePOST public HttpResponse doProxyConfigure(StaplerRequest req) throws IOException, ServletException { Jenkins jenkins = Jenkins.getInstance(); @@ -1476,7 +1562,7 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas ServletFileUpload upload = new ServletFileUpload(new DiskFileItemFactory()); // Parse the request - FileItem fileItem = (FileItem) upload.parseRequest(req).get(0); + FileItem fileItem = upload.parseRequest(req).get(0); String fileName = Util.getFileName(fileItem.getName()); if("".equals(fileName)){ return new HttpRedirect("advanced"); @@ -1489,7 +1575,12 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas // first copy into a temporary file name File t = File.createTempFile("uploaded", ".jpi"); t.deleteOnExit(); - fileItem.write(t); + try { + fileItem.write(t); + } catch (Exception e) { + // Exception thrown is too generic so at least limit the scope where it can occur + throw new ServletException(e); + } fileItem.delete(); final String baseName = identifyPluginShortName(t); @@ -1525,9 +1616,7 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas element("dependencies", dependencies); new UpdateSite(UpdateCenter.ID_UPLOAD, null).new Plugin(UpdateCenter.ID_UPLOAD, cfg).deploy(true); return new HttpRedirect("../updateCenter"); - } catch (IOException e) { - throw e; - } catch (Exception e) {// grrr. fileItem.write throws this + } catch (FileUploadException e) { throw new ServletException(e); } } @@ -1862,7 +1951,7 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas * Stores {@link Plugin} instances. */ /*package*/ static final class PluginInstanceStore { - final Map store = new Hashtable(); + final Map store = new ConcurrentHashMap(); } /** @@ -1871,6 +1960,11 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas @Extension @Symbol("pluginCycleDependencies") public static final class PluginCycleDependenciesMonitor extends AdministrativeMonitor { + @Override + public String getDisplayName() { + return Messages.PluginManager_PluginCycleDependenciesMonitor_DisplayName(); + } + private transient volatile boolean isActive = false; private transient volatile List pluginsWithCycle; @@ -1930,6 +2024,11 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas return !pluginsToBeUpdated.isEmpty(); } + @Override + public String getDisplayName() { + return Messages.PluginManager_PluginUpdateMonitor_DisplayName(); + } + /** * adds a message about a plugin to the manage screen * @param pluginName the plugins name diff --git a/core/src/main/java/hudson/PluginWrapper.java b/core/src/main/java/hudson/PluginWrapper.java index b97e977ede356f90d2955a6db7e10ec1d77be7e3..5932f0777e84ffb801743192145a6c26afe77168 100644 --- a/core/src/main/java/hudson/PluginWrapper.java +++ b/core/src/main/java/hudson/PluginWrapper.java @@ -417,7 +417,7 @@ public class PluginWrapper implements Comparable, ModelObject { /** * Returns the required Jenkins core version of this plugin. * @return the required Jenkins core version of this plugin. - * @since XXX + * @since 2.16 */ @Exported public @CheckForNull String getRequiredCoreVersion() { @@ -576,7 +576,7 @@ public class PluginWrapper implements Comparable, ModelObject { if (dependency == null) { PluginWrapper failedDependency = NOTICE.getPlugin(d.shortName); if (failedDependency != null) { - dependencyErrors.add(Messages.PluginWrapper_failed_to_load_dependency(failedDependency.getLongName(), d.version)); + dependencyErrors.add(Messages.PluginWrapper_failed_to_load_dependency(failedDependency.getLongName(), failedDependency.getVersion())); break; } else { dependencyErrors.add(Messages.PluginWrapper_missing(d.shortName, d.version)); @@ -708,11 +708,8 @@ public class PluginWrapper implements Comparable, ModelObject { File backup = getBackupFile(); if (backup.exists()) { try { - JarFile backupPlugin = new JarFile(backup); - try { + try (JarFile backupPlugin = new JarFile(backup)) { return backupPlugin.getManifest().getMainAttributes().getValue("Plugin-Version"); - } finally { - backupPlugin.close(); } } catch (IOException e) { LOGGER.log(WARNING, "Failed to get backup version from " + backup, e); @@ -748,6 +745,11 @@ public class PluginWrapper implements Comparable, ModelObject { return !plugins.isEmpty(); } + @Override + public String getDisplayName() { + return Messages.PluginWrapper_PluginWrapperAdministrativeMonitor_DisplayName(); + } + public Collection getPlugins() { return plugins.values(); } diff --git a/core/src/main/java/hudson/Proc.java b/core/src/main/java/hudson/Proc.java index a2d17298272025d7416086606cd8d9fb8578bb3a..d5f82a6511c9b6df18d395e693585e3f1d174c90 100644 --- a/core/src/main/java/hudson/Proc.java +++ b/core/src/main/java/hudson/Proc.java @@ -49,6 +49,8 @@ import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import java.util.logging.Level; import java.util.logging.Logger; +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.NoExternalUse; /** * External process wrapper. @@ -157,7 +159,7 @@ public abstract class Proc { kill(); } } catch (InterruptedException | IOException | RuntimeException x) { - x.printStackTrace(listener.error("Failed to join a process")); + Functions.printStackTrace(x, listener.error("Failed to join a process")); } } }); @@ -316,7 +318,7 @@ public abstract class Proc { try { int r = proc.waitFor(); - // see http://wiki.jenkins-ci.org/display/JENKINS/Spawning+processes+from+build + // see https://jenkins.io/redirect/troubleshooting/process-leaked-file-descriptors // problems like that shows up as infinite wait in join(), which confuses great many users. // So let's do a timed wait here and try to diagnose the problem if (copier!=null) copier.join(10*1000); @@ -324,7 +326,7 @@ public abstract class Proc { if((copier!=null && copier.isAlive()) || (copier2!=null && copier2.isAlive())) { // looks like handles are leaking. // closing these handles should terminate the threads. - String msg = "Process leaked file descriptors. See http://wiki.jenkins-ci.org/display/JENKINS/Spawning+processes+from+build for more information"; + String msg = "Process leaked file descriptors. See https://jenkins.io/redirect/troubleshooting/process-leaked-file-descriptors for more information"; Throwable e = new Exception().fillInStackTrace(); LOGGER.log(Level.WARNING,msg,e); @@ -431,7 +433,7 @@ public abstract class Proc { * @deprecated as of 1.399. Replaced by {@link Launcher.RemoteLauncher.ProcImpl} */ @Deprecated - public static final class RemoteProc extends Proc { + public static final class RemoteProc extends Proc implements ProcWithJenkins23271Patch { private final Future process; public RemoteProc(Future process) { @@ -440,7 +442,14 @@ public abstract class Proc { @Override public void kill() throws IOException, InterruptedException { - process.cancel(true); + try { + process.cancel(true); + } finally { + if (this.isAlive()) { // Should never happen but this forces Proc to not be removed and early GC by escape analysis + // TODO: Report exceptions if they happen? + LOGGER.log(Level.WARNING, "Process {0} has not really finished after the kill() method execution", this); + } + } } @Override @@ -448,8 +457,8 @@ public abstract class Proc { try { return process.get(); } catch (InterruptedException e) { - // aborting. kill the process - process.cancel(true); + LOGGER.log(Level.FINE, String.format("Join operation has been interrupted for the process %s. Killing the process", this), e); + kill(); throw e; } catch (ExecutionException e) { if(e.getCause() instanceof IOException) @@ -457,6 +466,10 @@ public abstract class Proc { throw new IOException("Failed to join the process",e); } catch (CancellationException x) { return -1; + } finally { + if (this.isAlive()) { // Should never happen but this forces Proc to not be removed and early GC by escape analysis + LOGGER.log(Level.WARNING, "Process {0} has not really finished after the join() method completion", this); + } } } @@ -486,4 +499,15 @@ public abstract class Proc { * Debug switch to have the thread display the process it's waiting for. */ public static boolean SHOW_PID = false; + + /** + * An instance of {@link Proc}, which has an internal workaround for JENKINS-23271. + * It presumes that the instance of the object is guaranteed to be used after the {@link Proc#join()} call. + * See JENKINS-23271> + * @author Oleg Nenashev + */ + @Restricted(NoExternalUse.class) + public interface ProcWithJenkins23271Patch { + // Empty marker interface + } } diff --git a/core/src/main/java/hudson/ProxyConfiguration.java b/core/src/main/java/hudson/ProxyConfiguration.java index f7ce804f5e8e0c0ca3fbdbc39baf1da83035cc35..f1b7011f424bba53fb8d6712b3e21f54ff146680 100644 --- a/core/src/main/java/hudson/ProxyConfiguration.java +++ b/core/src/main/java/hudson/ProxyConfiguration.java @@ -205,7 +205,7 @@ public final class ProxyConfiguration extends AbstractDescribableImpl0) - str.append(buf,0,len); - } finally { - r.close(); + while ((len = r.read(buf, 0, buf.length)) > 0) + str.append(buf, 0, len); } return str.toString(); @@ -492,10 +489,19 @@ public class Util { */ //Taken from http://svn.apache.org/viewvc/maven/shared/trunk/file-management/src/main/java/org/apache/maven/shared/model/fileset/util/FileSetManager.java?view=markup public static boolean isSymlink(@Nonnull File file) throws IOException { - Boolean r = isSymlinkJava7(file); - if (r != null) { - return r; - } + /* + * Windows Directory Junctions are effectively the same as Linux symlinks to directories. + * Unfortunately, the Java 7 NIO2 API function isSymbolicLink does not treat them as such. + * It thinks of them as normal directories. To use the NIO2 API & treat it like a symlink, + * you have to go through BasicFileAttributes and do the following check: + * isSymbolicLink() || isOther() + * The isOther() call will include Windows reparse points, of which a directory junction is. + * + * Since we already have a function that detects Windows junctions or symlinks and treats them + * both as symlinks, let's use that function and always call it before calling down to the + * NIO2 API. + * + */ if (Functions.isWindows()) { try { return Kernel32Utils.isJunctionOrSymlink(file); @@ -503,6 +509,10 @@ public class Util { // fall through } } + Boolean r = isSymlinkJava7(file); + if (r != null) { + return r; + } String name = file.getName(); if (name.equals(".") || name.equals("..")) return false; @@ -517,7 +527,7 @@ public class Util { return !fileInCanonicalParent.getCanonicalFile().equals( fileInCanonicalParent.getAbsoluteFile() ); } - @SuppressWarnings("NP_BOOLEAN_RETURN_NULL") + @SuppressFBWarnings("NP_BOOLEAN_RETURN_NULL") private static Boolean isSymlinkJava7(@Nonnull File file) throws IOException { try { Path path = file.toPath(); @@ -555,7 +565,7 @@ public class Util { * Creates a new temporary directory. */ public static File createTempDir() throws IOException { - File tmp = File.createTempFile("hudson", "tmp"); + File tmp = File.createTempFile("jenkins", "tmp"); if(!tmp.delete()) throw new IOException("Failed to delete "+tmp); if(!tmp.mkdirs()) @@ -755,12 +765,9 @@ public class Util { MessageDigest md5 = MessageDigest.getInstance("MD5"); byte[] buffer = new byte[1024]; - DigestInputStream in =new DigestInputStream(source,md5); - try { - while(in.read(buffer)>=0) + try (DigestInputStream in = new DigestInputStream(source, md5)) { + while (in.read(buffer) >= 0) ; // simply discard the input - } finally { - in.close(); } return toHexString(md5.digest()); } catch (NoSuchAlgorithmException e) { @@ -793,11 +800,8 @@ public class Util { */ @Nonnull public static String getDigestOf(@Nonnull File file) throws IOException { - InputStream is = new FileInputStream(file); - try { + try (InputStream is = new FileInputStream(file)) { return getDigestOf(new BufferedInputStream(is)); - } finally { - is.close(); } } @@ -1363,7 +1367,7 @@ public class Util { PrintStream log = listener.getLogger(); log.printf("ln %s %s failed%n",targetPath, new File(baseDir, symlinkPath)); Util.displayIOException(e,listener); - e.printStackTrace( log ); + Functions.printStackTrace(e, log); } } @@ -1594,6 +1598,7 @@ public class Util { /** * Return true iff the parameter does not denote an absolute URI and not a scheme-relative URI. + * @since 2.3 / 1.651.2 */ public static boolean isSafeToRedirectTo(@Nonnull String uri) { return !isAbsoluteUri(uri) && !uri.startsWith("//"); @@ -1619,6 +1624,28 @@ public class Util { p.load(new StringReader(properties)); return p; } + + /** + * Closes the item and logs error to the log in the case of error. + * Logging will be performed on the {@code WARNING} level. + * @param toClose Item to close. Nothing will happen if it is {@code null} + * @param logger Logger, which receives the error + * @param closeableName Name of the closeable item + * @param closeableOwner String representation of the closeable holder + * @since 2.19, but TODO update once un-restricted + */ + @Restricted(NoExternalUse.class) + public static void closeAndLogFailures(@CheckForNull Closeable toClose, @Nonnull Logger logger, + @Nonnull String closeableName, @Nonnull String closeableOwner) { + if (toClose == null) { + return; + } + try { + toClose.close(); + } catch(IOException ex) { + logger.log(Level.WARNING, String.format("Failed to close %s of %s", closeableName, closeableOwner), ex); + } + } public static final FastDateFormat XS_DATETIME_FORMATTER = FastDateFormat.getInstance("yyyy-MM-dd'T'HH:mm:ss'Z'",new SimpleTimeZone(0,"GMT")); diff --git a/core/src/main/java/hudson/WebAppMain.java b/core/src/main/java/hudson/WebAppMain.java index de518fcb720ff0562e1d3076de7e5ac5a61d084b..2e087e0348844a34dad29148478aaa7daa6c3513 100644 --- a/core/src/main/java/hudson/WebAppMain.java +++ b/core/src/main/java/hudson/WebAppMain.java @@ -77,7 +77,11 @@ import static java.util.logging.Level.*; * @author Kohsuke Kawaguchi */ public class WebAppMain implements ServletContextListener { - private final RingBufferLogHandler handler = new RingBufferLogHandler() { + + // use RingBufferLogHandler class name to configure for backward compatibility + private static final int DEFAULT_RING_BUFFER_SIZE = SystemProperties.getInteger(RingBufferLogHandler.class.getName() + ".defaultSize", 256); + + private final RingBufferLogHandler handler = new RingBufferLogHandler(DEFAULT_RING_BUFFER_SIZE) { @Override public synchronized void publish(LogRecord record) { if (record.getLevel().intValue() >= Level.INFO.intValue()) { super.publish(record); @@ -287,7 +291,7 @@ public class WebAppMain implements ServletContextListener { /** * Installs log handler to monitor all Hudson logs. */ - @edu.umd.cs.findbugs.annotations.SuppressWarnings("LG_LOST_LOGGER_DUE_TO_WEAK_REFERENCE") + @edu.umd.cs.findbugs.annotations.SuppressFBWarnings("LG_LOST_LOGGER_DUE_TO_WEAK_REFERENCE") private void installLogger() { Jenkins.logRecords = handler.getView(); Logger.getLogger("").addHandler(handler); @@ -371,10 +375,16 @@ public class WebAppMain implements ServletContextListener { public void contextDestroyed(ServletContextEvent event) { try (ACLContext old = ACL.as(ACL.SYSTEM)) { - terminated = true; Jenkins instance = Jenkins.getInstanceOrNull(); - if (instance != null) - instance.cleanUp(); + try { + if (instance != null) { + instance.cleanUp(); + } + } catch (Exception e) { + LOGGER.log(Level.SEVERE, "Failed to clean up. Restart will continue.", e); + } + + terminated = true; Thread t = initThread; if (t != null && t.isAlive()) { LOGGER.log(Level.INFO, "Shutting down a Jenkins instance that was still starting up", new Throwable("reason")); @@ -382,7 +392,7 @@ public class WebAppMain implements ServletContextListener { } // Logger is in the system classloader, so if we don't do this - // the whole web app will never be undepoyed. + // the whole web app will never be undeployed. Logger.getLogger("").removeHandler(handler); } finally { JenkinsJVMAccess._setJenkinsJVM(false); diff --git a/core/src/main/java/hudson/XmlFile.java b/core/src/main/java/hudson/XmlFile.java index 00eae060e9f378a4631ab505bc3e9daedb39fad2..9f438eededb82797f92ae944386c8486be187b8b 100644 --- a/core/src/main/java/hudson/XmlFile.java +++ b/core/src/main/java/hudson/XmlFile.java @@ -28,7 +28,7 @@ import com.thoughtworks.xstream.XStreamException; import com.thoughtworks.xstream.converters.Converter; import com.thoughtworks.xstream.converters.UnmarshallingContext; import com.thoughtworks.xstream.io.StreamException; -import com.thoughtworks.xstream.io.xml.XppDriver; +import com.thoughtworks.xstream.io.xml.Xpp3Driver; import hudson.diagnosis.OldDataMonitor; import hudson.model.Descriptor; import hudson.util.AtomicFileWriter; @@ -51,6 +51,7 @@ import java.io.InputStreamReader; import java.io.Reader; import java.io.Writer; import java.io.StringWriter; +import java.io.UnsupportedEncodingException; import java.util.logging.Level; import java.util.logging.Logger; @@ -137,15 +138,10 @@ public final class XmlFile { if (LOGGER.isLoggable(Level.FINE)) { LOGGER.fine("Reading "+file); } - InputStream in = new BufferedInputStream(new FileInputStream(file)); - try { + try (InputStream in = new BufferedInputStream(new FileInputStream(file))) { return xs.fromXML(in); - } catch (XStreamException e) { - throw new IOException("Unable to read "+file,e); - } catch(Error e) {// mostly reflection errors + } catch (XStreamException | Error e) { throw new IOException("Unable to read "+file,e); - } finally { - in.close(); } } @@ -157,16 +153,12 @@ public final class XmlFile { * if the XML representation is completely new. */ public Object unmarshal( Object o ) throws IOException { - InputStream in = new BufferedInputStream(new FileInputStream(file)); - try { + + try (InputStream in = new BufferedInputStream(new FileInputStream(file))) { // TODO: expose XStream the driver from XStream return xs.unmarshal(DEFAULT_DRIVER.createReader(in), o); - } catch (XStreamException e) { - throw new IOException("Unable to read "+file,e); - } catch(Error e) {// mostly reflection errors + } catch (XStreamException | Error e) { throw new IOException("Unable to read "+file,e); - } finally { - in.close(); } } @@ -205,9 +197,19 @@ public final class XmlFile { * Opens a {@link Reader} that loads XML. * This method uses {@link #sniffEncoding() the right encoding}, * not just the system default encoding. + * @throws IOException Encoding issues + * @return Reader for the file. should be close externally once read. */ public Reader readRaw() throws IOException { - return new InputStreamReader(new FileInputStream(file),sniffEncoding()); + FileInputStream fileInputStream = new FileInputStream(file); + try { + return new InputStreamReader(fileInputStream, sniffEncoding()); + } catch(IOException ex) { + // Exception may happen if we fail to find encoding or if this encoding is unsupported. + // In such case we close the underlying stream and rethrow. + Util.closeAndLogFailures(fileInputStream, LOGGER, "FileInputStream", file.toString()); + throw ex; + } } /** @@ -224,11 +226,8 @@ public final class XmlFile { * Writer will not be closed by the implementation. */ public void writeRawTo(Writer w) throws IOException { - Reader r = readRaw(); - try { - Util.copyStream(r,w); - } finally { - r.close(); + try (Reader r = readRaw()) { + Util.copyStream(r, w); } } @@ -247,10 +246,10 @@ public final class XmlFile { this.encoding = encoding; } } - InputSource input = new InputSource(file.toURI().toASCIIString()); - input.setByteStream(new FileInputStream(file)); - try { + try (InputStream in = new FileInputStream(file)) { + InputSource input = new InputSource(file.toURI().toASCIIString()); + input.setByteStream(in); JAXP.newSAXParser().parse(input,new DefaultHandler() { private Locator loc; @Override @@ -292,9 +291,6 @@ public final class XmlFile { throw new IOException("Failed to detect encoding of "+file,e); } catch (ParserConfigurationException e) { throw new AssertionError(e); // impossible - } finally { - // some JAXP implementations appear to leak the file handle if we just call parse(File,DefaultHandler) - input.getByteStream().close(); } } @@ -307,7 +303,7 @@ public final class XmlFile { private static final SAXParserFactory JAXP = SAXParserFactory.newInstance(); - private static final XppDriver DEFAULT_DRIVER = new XppDriver(); + private static final Xpp3Driver DEFAULT_DRIVER = new Xpp3Driver(); static { JAXP.setNamespaceAware(true); diff --git a/core/src/main/java/hudson/cli/BuildCommand.java b/core/src/main/java/hudson/cli/BuildCommand.java index dbe330ec23270b0f3ea26975a0063fe00cf0a1bc..1b96e157330e99243fec70bc361de534fb0521ed 100644 --- a/core/src/main/java/hudson/cli/BuildCommand.java +++ b/core/src/main/java/hudson/cli/BuildCommand.java @@ -147,7 +147,7 @@ public class BuildCommand extends CLICommand { SCMTriggerItem item = SCMTriggerItem.SCMTriggerItems.asSCMTriggerItem(job); if (item == null) throw new AbortException(job.getFullDisplayName()+" has no SCM trigger, but checkSCM was specified"); - // pre-emtively check for a polling veto + // preemptively check for a polling veto if (SCMDecisionHandler.firstShouldPollVeto(job) != null) { return 0; } diff --git a/core/src/main/java/hudson/cli/CLIAction.java b/core/src/main/java/hudson/cli/CLIAction.java index 66eef745b86b2ffe6ad0247a6de5a78b82f4fc4f..0053c278bc3ab5333f81f55470c3f9592244e774 100644 --- a/core/src/main/java/hudson/cli/CLIAction.java +++ b/core/src/main/java/hudson/cli/CLIAction.java @@ -63,12 +63,11 @@ public class CLIAction implements UnprotectedRootAction, StaplerProxy { } public String getDisplayName() { - return "Jenkins CLI"; } public String getUrlName() { - return "cli"; + return jenkins.CLI.DISABLED ? null : "cli"; } public void doCommand(StaplerRequest req, StaplerResponse rsp) throws ServletException, IOException { diff --git a/core/src/main/java/hudson/cli/CLICommand.java b/core/src/main/java/hudson/cli/CLICommand.java index 2f846c2e8c393d1fbee3a5f2c67bedd78fe05813..bc5d2ea4c5d84de24b88239f4e4e9759569980e4 100644 --- a/core/src/main/java/hudson/cli/CLICommand.java +++ b/core/src/main/java/hudson/cli/CLICommand.java @@ -29,6 +29,7 @@ import hudson.ExtensionList; import hudson.ExtensionPoint; import hudson.cli.declarative.CLIMethod; import hudson.ExtensionPoint.LegacyInstancesAreScopedToHudson; +import hudson.Functions; import jenkins.util.SystemProperties; import hudson.cli.declarative.OptionHandlerExtension; import jenkins.model.Jenkins; @@ -124,6 +125,13 @@ public abstract class CLICommand implements ExtensionPoint, Cloneable { */ public transient PrintStream stdout,stderr; + /** + * Shared text, which is reported back to CLI if an error happens in commands + * taking lists of parameters. + * @since 2.26 + */ + static final String CLI_LISTPARAM_SUMMARY_ERROR_TEXT = "Error occurred while performing this command, see previous stderr output."; + /** * Connected to stdin of the CLI agent. * @@ -291,7 +299,7 @@ public abstract class CLICommand implements ExtensionPoint, Cloneable { stderr.println(""); stderr.println("ERROR: " + errorMsg); LOGGER.log(Level.WARNING, errorMsg, e); - e.printStackTrace(stderr); + Functions.printStackTrace(e, stderr); return 1; } finally { if(sc != null) @@ -311,7 +319,7 @@ public abstract class CLICommand implements ExtensionPoint, Cloneable { public Channel checkChannel() throws AbortException { if (channel==null) - throw new AbortException("This command can only run with Jenkins CLI. See https://wiki.jenkins-ci.org/display/JENKINS/Jenkins+CLI"); + throw new AbortException("This command can only run with Jenkins CLI. See https://jenkins.io/redirect/cli-command-requires-channel"); return channel; } @@ -325,7 +333,7 @@ public abstract class CLICommand implements ExtensionPoint, Cloneable { return new ClientAuthenticationCache(channel).get(); } catch (IOException e) { stderr.println("Failed to access the stored credential"); - e.printStackTrace(stderr); // recover + Functions.printStackTrace(e, stderr); // recover } return Jenkins.ANONYMOUS; } @@ -393,11 +401,11 @@ public abstract class CLICommand implements ExtensionPoint, Cloneable { * @throws IllegalArgumentException * If the execution can't continue due to wrong input parameter (job doesn't exist etc.) * @throws IllegalStateException - * If the execution can't continue due to an incorect state of Jenkins, job, build etc. + * If the execution can't continue due to an incorrect state of Jenkins, job, build etc. * @throws AbortException * If the execution can't continue due to an other (rare, but foreseeable) issue * @throws AccessDeniedException - * If the caller doesn't have sufficent rights for requested action + * If the caller doesn't have sufficient rights for requested action * @throws BadCredentialsException * If bad credentials were provided to CLI */ diff --git a/core/src/main/java/hudson/cli/CancelQuietDownCommand.java b/core/src/main/java/hudson/cli/CancelQuietDownCommand.java index d38a99edd1396a75fb4368cec281a2178c16396f..24b2ec301851fea81867b277c953d45ca1785097 100644 --- a/core/src/main/java/hudson/cli/CancelQuietDownCommand.java +++ b/core/src/main/java/hudson/cli/CancelQuietDownCommand.java @@ -33,7 +33,7 @@ import java.util.logging.Logger; * Cancel previous quiet down Jenkins - preparation for a restart * * @author pjanouse - * @since TODO + * @since 2.14 */ @Extension public class CancelQuietDownCommand extends CLICommand { diff --git a/core/src/main/java/hudson/cli/ClearQueueCommand.java b/core/src/main/java/hudson/cli/ClearQueueCommand.java index 909e49bff3a1430614921166c176a9b3764a57f2..8e76a477aa12af83cf315b4c35a0e7253401a223 100644 --- a/core/src/main/java/hudson/cli/ClearQueueCommand.java +++ b/core/src/main/java/hudson/cli/ClearQueueCommand.java @@ -34,7 +34,7 @@ import java.util.logging.Logger; * Clears the build queue * * @author pjanouse - * @since TODO + * @since 1.654 */ @Extension public class ClearQueueCommand extends CLICommand { diff --git a/core/src/main/java/hudson/cli/CliCrumbExclusion.java b/core/src/main/java/hudson/cli/CliCrumbExclusion.java new file mode 100644 index 0000000000000000000000000000000000000000..ac49349ccfcc91207325bd3933b75c2c8593ed77 --- /dev/null +++ b/core/src/main/java/hudson/cli/CliCrumbExclusion.java @@ -0,0 +1,52 @@ +/* + * The MIT License + * + * Copyright (c) 2016 CloudBees, Inc. + * + * 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 hudson.cli; + +import hudson.Extension; +import hudson.security.csrf.CrumbExclusion; +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.DoNotUse; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * Makes CLI HTTP fallback work with CSRF protection enabled (JENKINS-18114). + */ +@Extension +@Restricted(DoNotUse.class) +public class CliCrumbExclusion extends CrumbExclusion { + @Override + public boolean process(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException { + String pathInfo = request.getPathInfo(); + if (pathInfo != null && "/cli".equals(pathInfo)) { + chain.doFilter(request, response); + return true; + } + return false; + } +} diff --git a/core/src/main/java/hudson/cli/CliProtocol.java b/core/src/main/java/hudson/cli/CliProtocol.java index f2160fe31f6121ad399007d35330863def725781..d663957fe9debe8998bb698ece5067fa40b410bd 100644 --- a/core/src/main/java/hudson/cli/CliProtocol.java +++ b/core/src/main/java/hudson/cli/CliProtocol.java @@ -42,7 +42,7 @@ public class CliProtocol extends AgentProtocol { @Override public String getName() { - return "CLI-connect"; + return jenkins.CLI.DISABLED ? null : "CLI-connect"; } /** diff --git a/core/src/main/java/hudson/cli/CliProtocol2.java b/core/src/main/java/hudson/cli/CliProtocol2.java index cd7d8b04f64a9e51d7ce4f19bbc052c5a494d444..bb14599dbfea037d7d07517d828ffb9aa7f968b9 100644 --- a/core/src/main/java/hudson/cli/CliProtocol2.java +++ b/core/src/main/java/hudson/cli/CliProtocol2.java @@ -25,7 +25,7 @@ import java.security.Signature; public class CliProtocol2 extends CliProtocol { @Override public String getName() { - return "CLI2-connect"; + return jenkins.CLI.DISABLED ? null : "CLI2-connect"; } /** diff --git a/core/src/main/java/hudson/cli/ClientAuthenticationCache.java b/core/src/main/java/hudson/cli/ClientAuthenticationCache.java index 7c2127bc6d2eec668027c934414d90a4633af44b..fb754417861c61c3e17b3c45ae66572d4f25b1c9 100644 --- a/core/src/main/java/hudson/cli/ClientAuthenticationCache.java +++ b/core/src/main/java/hudson/cli/ClientAuthenticationCache.java @@ -51,11 +51,8 @@ public class ClientAuthenticationCache implements Serializable { } }); if (store.exists()) { - InputStream istream = store.read(); - try { + try (InputStream istream = store.read()) { props.load(istream); - } finally { - istream.close(); } } } @@ -109,11 +106,8 @@ public class ClientAuthenticationCache implements Serializable { } private void save() throws IOException, InterruptedException { - OutputStream os = store.write(); - try { - props.store(os,"Credential store"); - } finally { - os.close(); + try (OutputStream os = store.write()) { + props.store(os, "Credential store"); } // try to protect this file from other users, if we can. store.chmod(0600); diff --git a/core/src/main/java/hudson/cli/ConnectNodeCommand.java b/core/src/main/java/hudson/cli/ConnectNodeCommand.java index ff9017a76e2a74c4ebb8677966e201385534b897..ae20f5e60848507503cca9f3ff0d3a21cb9c53a5 100644 --- a/core/src/main/java/hudson/cli/ConnectNodeCommand.java +++ b/core/src/main/java/hudson/cli/ConnectNodeCommand.java @@ -37,13 +37,14 @@ import java.util.List; import java.util.logging.Logger; /** + * Reconnect to a node or nodes. * @author pjanouse - * @since TODO + * @since 2.6 */ @Extension public class ConnectNodeCommand extends CLICommand { - @Argument(metaVar="NAME", usage="Slave name, or empty string for master; comama-separated list is supported", required=true, multiValued=true) + @Argument(metaVar="NAME", usage="Slave name, or empty string for master; comma-separated list is supported", required=true, multiValued=true) private List nodes; @Option(name="-f", usage="Cancel any currently pending connect operation and retry from scratch") @@ -96,7 +97,7 @@ public class ConnectNodeCommand extends CLICommand { } if (errorOccurred) { - throw new AbortException("Error occured while performing this command, see previous stderr output."); + throw new AbortException(CLI_LISTPARAM_SUMMARY_ERROR_TEXT); } return 0; } diff --git a/core/src/main/java/hudson/cli/ConsoleCommand.java b/core/src/main/java/hudson/cli/ConsoleCommand.java index 92fd0e74c6b80160c49136e3f9efc2bd4d91abc7..f4c3f719b5fdb98d3548a7c572136a4458d6e849 100644 --- a/core/src/main/java/hudson/cli/ConsoleCommand.java +++ b/core/src/main/java/hudson/cli/ConsoleCommand.java @@ -78,12 +78,9 @@ public class ConsoleCommand extends CLICommand { pos = logText.writeLogTo(pos, w); } while (!logText.isComplete()); } else { - InputStream logInputStream = run.getLogInputStream(); - try { - IOUtils.skip(logInputStream,pos); - org.apache.commons.io.IOUtils.copy(new InputStreamReader(logInputStream,run.getCharset()),w); - } finally { - logInputStream.close(); + try (InputStream logInputStream = run.getLogInputStream()) { + IOUtils.skip(logInputStream, pos); + IOUtils.copy(new InputStreamReader(logInputStream, run.getCharset()), w); } } } finally { diff --git a/core/src/main/java/hudson/cli/DeleteJobCommand.java b/core/src/main/java/hudson/cli/DeleteJobCommand.java index 127ec43f6c59672859aa45f589290b9b3c15a28b..199296f87fc48d09a14d289ef4c36cea8f05901f 100644 --- a/core/src/main/java/hudson/cli/DeleteJobCommand.java +++ b/core/src/main/java/hudson/cli/DeleteJobCommand.java @@ -34,8 +34,9 @@ import java.util.HashSet; import java.util.logging.Logger; /** + * CLI command, which deletes a job or multiple jobs. * @author pjanouse - * @since TODO + * @since 1.618 */ @Extension public class DeleteJobCommand extends CLICommand { @@ -83,7 +84,7 @@ public class DeleteJobCommand extends CLICommand { } if (errorOccurred) { - throw new AbortException("Error occured while performing this command, see previous stderr output."); + throw new AbortException(CLI_LISTPARAM_SUMMARY_ERROR_TEXT); } return 0; } diff --git a/core/src/main/java/hudson/cli/DeleteNodeCommand.java b/core/src/main/java/hudson/cli/DeleteNodeCommand.java index 5fc70fc764aba7388f3a265e9f410bdcd2818ad0..03001fccc3a10886fb164632952e426d31862ba7 100644 --- a/core/src/main/java/hudson/cli/DeleteNodeCommand.java +++ b/core/src/main/java/hudson/cli/DeleteNodeCommand.java @@ -34,13 +34,14 @@ import java.util.List; import java.util.logging.Logger; /** + * CLI command, which deletes Jenkins nodes. * @author pjanouse - * @since TODO + * @since 1.618 */ @Extension public class DeleteNodeCommand extends CLICommand { - @Argument(usage="Nodes name to delete", required=true, multiValued=true) + @Argument(usage="Names of nodes to delete", required=true, multiValued=true) private List nodes; @Override @@ -82,7 +83,7 @@ public class DeleteNodeCommand extends CLICommand { } if (errorOccurred) { - throw new AbortException("Error occured while performing this command, see previous stderr output."); + throw new AbortException(CLI_LISTPARAM_SUMMARY_ERROR_TEXT); } return 0; } diff --git a/core/src/main/java/hudson/cli/DeleteViewCommand.java b/core/src/main/java/hudson/cli/DeleteViewCommand.java index 900e9cdc915b04028574cbbdd5300f79bee2bb69..894978e683fcac696a634fcad383c199e5dec840 100644 --- a/core/src/main/java/hudson/cli/DeleteViewCommand.java +++ b/core/src/main/java/hudson/cli/DeleteViewCommand.java @@ -95,7 +95,7 @@ public class DeleteViewCommand extends CLICommand { } if (errorOccurred) { - throw new AbortException("Error occured while performing this command, see previous stderr output."); + throw new AbortException(CLI_LISTPARAM_SUMMARY_ERROR_TEXT); } return 0; } diff --git a/core/src/main/java/hudson/cli/DisconnectNodeCommand.java b/core/src/main/java/hudson/cli/DisconnectNodeCommand.java index fdf9058050f2fe09445afdfb37d69fa586d5bcbb..65c95106eb5f8653007b8d62bf8aa5c8c5e987e0 100644 --- a/core/src/main/java/hudson/cli/DisconnectNodeCommand.java +++ b/core/src/main/java/hudson/cli/DisconnectNodeCommand.java @@ -37,12 +37,13 @@ import java.util.List; import java.util.logging.Logger; /** + * CLI Command, which disconnects nodes. * @author pjanouse - * @since TODO + * @since 2.4 */ @Extension public class DisconnectNodeCommand extends CLICommand { - @Argument(metaVar = "NAME", usage = "Slave name, or empty string for master; comama-separated list is supported", required = true, multiValued = true) + @Argument(metaVar = "NAME", usage = "Slave name, or empty string for master; comma-separated list is supported", required = true, multiValued = true) private List nodes; @Option(name = "-m", usage = "Record the reason about why you are disconnecting this node") @@ -94,7 +95,7 @@ public class DisconnectNodeCommand extends CLICommand { } if (errorOccurred) { - throw new AbortException("Error occured while performing this command, see previous stderr output."); + throw new AbortException(CLI_LISTPARAM_SUMMARY_ERROR_TEXT); } return 0; } diff --git a/core/src/main/java/hudson/cli/GroovyCommand.java b/core/src/main/java/hudson/cli/GroovyCommand.java index 144c2dfe0cfe9d846e73c54cc77b4ab350af95b2..e7b247951650711c23cffb22d1bc0273dc78e0f1 100644 --- a/core/src/main/java/hudson/cli/GroovyCommand.java +++ b/core/src/main/java/hudson/cli/GroovyCommand.java @@ -71,14 +71,17 @@ public class GroovyCommand extends CLICommand { binding.setProperty("stdout",stdout); binding.setProperty("stderr",stderr); binding.setProperty("channel",channel); - String j = getClientEnvironmentVariable("JOB_NAME"); - if (j!=null) { - Item job = Jenkins.getActiveInstance().getItemByFullName(j); - binding.setProperty("currentJob", job); - String b = getClientEnvironmentVariable("BUILD_NUMBER"); - if (b!=null && job instanceof AbstractProject) { - Run r = ((AbstractProject) job).getBuildByNumber(Integer.parseInt(b)); - binding.setProperty("currentBuild", r); + + if (channel != null) { + String j = getClientEnvironmentVariable("JOB_NAME"); + if (j != null) { + Item job = Jenkins.getActiveInstance().getItemByFullName(j); + binding.setProperty("currentJob", job); + String b = getClientEnvironmentVariable("BUILD_NUMBER"); + if (b != null && job instanceof AbstractProject) { + Run r = ((AbstractProject) job).getBuildByNumber(Integer.parseInt(b)); + binding.setProperty("currentBuild", r); + } } } diff --git a/core/src/main/java/hudson/cli/GroovyshCommand.java b/core/src/main/java/hudson/cli/GroovyshCommand.java index 2807d872d07ec721c8976a1427b12bf04a47f162..31f998d0aa5be777ef55f2d4c1bfbf3aab4fe459 100644 --- a/core/src/main/java/hudson/cli/GroovyshCommand.java +++ b/core/src/main/java/hudson/cli/GroovyshCommand.java @@ -96,7 +96,7 @@ public class GroovyshCommand extends CLICommand { private static final long serialVersionUID = 1L; @SuppressWarnings("unused") - @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="UMAC_UNCALLABLE_METHOD_OF_ANONYMOUS_CLASS",justification="Closure invokes this via reflection") + @edu.umd.cs.findbugs.annotations.SuppressFBWarnings(value="UMAC_UNCALLABLE_METHOD_OF_ANONYMOUS_CLASS",justification="Closure invokes this via reflection") public Object doCall(Object[] args) { assert(args.length == 1); assert(args[0] instanceof Shell); @@ -119,7 +119,7 @@ public class GroovyshCommand extends CLICommand { private static final long serialVersionUID = 1L; @SuppressWarnings("unused") - @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="UMAC_UNCALLABLE_METHOD_OF_ANONYMOUS_CLASS",justification="Closure invokes this via reflection") + @edu.umd.cs.findbugs.annotations.SuppressFBWarnings(value="UMAC_UNCALLABLE_METHOD_OF_ANONYMOUS_CLASS",justification="Closure invokes this via reflection") public Object doCall(Object[] args) throws ChannelClosedException { if (args.length == 1 && args[0] instanceof ChannelClosedException) { throw (ChannelClosedException)args[0]; diff --git a/core/src/main/java/hudson/cli/InstallPluginCommand.java b/core/src/main/java/hudson/cli/InstallPluginCommand.java index 21484e05bfe4333e77483f907903506ae7a05217..c21a96628d5f55fd7ac38145c2cde2938a12d30e 100644 --- a/core/src/main/java/hudson/cli/InstallPluginCommand.java +++ b/core/src/main/java/hudson/cli/InstallPluginCommand.java @@ -75,17 +75,20 @@ public class InstallPluginCommand extends CLICommand { h.checkPermission(PluginManager.UPLOAD_PLUGINS); PluginManager pm = h.getPluginManager(); + if (sources.size() > 1 && name != null) { + throw new IllegalArgumentException("-name is incompatible with multiple sources"); + } + for (String source : sources) { // is this a file? if (channel!=null) { FilePath f = new FilePath(channel, source); if (f.exists()) { stdout.println(Messages.InstallPluginCommand_InstallingPluginFromLocalFile(f)); - if (name==null) - name = f.getBaseName(); - f.copyTo(getTargetFilePath()); + String n = name != null ? name : f.getBaseName(); + f.copyTo(getTargetFilePath(n)); if (dynamicLoad) - pm.dynamicLoad(getTargetFile()); + pm.dynamicLoad(getTargetFile(n)); continue; } } @@ -94,16 +97,21 @@ public class InstallPluginCommand extends CLICommand { try { URL u = new URL(source); stdout.println(Messages.InstallPluginCommand_InstallingPluginFromUrl(u)); - if (name==null) { - name = u.getPath(); - name = name.substring(name.lastIndexOf('/')+1); - name = name.substring(name.lastIndexOf('\\')+1); - int idx = name.lastIndexOf('.'); - if (idx>0) name = name.substring(0,idx); + String n; + if (name != null) { + n = name; + } else { + n = u.getPath(); + n = n.substring(n.lastIndexOf('/') + 1); + n = n.substring(n.lastIndexOf('\\') + 1); + int idx = n.lastIndexOf('.'); + if (idx > 0) { + n = n.substring(0, idx); + } } - getTargetFilePath().copyFrom(u); + getTargetFilePath(n).copyFrom(u); if (dynamicLoad) - pm.dynamicLoad(getTargetFile()); + pm.dynamicLoad(getTargetFile(n)); continue; } catch (MalformedURLException e) { // not an URL @@ -149,11 +157,11 @@ public class InstallPluginCommand extends CLICommand { return 0; // all success } - private FilePath getTargetFilePath() { - return new FilePath(getTargetFile()); + private static FilePath getTargetFilePath(String name) { + return new FilePath(getTargetFile(name)); } - private File getTargetFile() { + private static File getTargetFile(String name) { return new File(Jenkins.getActiveInstance().getPluginManager().rootDir,name+".jpi"); } } diff --git a/core/src/main/java/hudson/cli/OfflineNodeCommand.java b/core/src/main/java/hudson/cli/OfflineNodeCommand.java index b92cee59cae8324283eca3cd7848cb4f709e6ff6..e003a633b28ce80895a5257e74973918c7ee9a2b 100644 --- a/core/src/main/java/hudson/cli/OfflineNodeCommand.java +++ b/core/src/main/java/hudson/cli/OfflineNodeCommand.java @@ -39,8 +39,9 @@ import java.util.HashSet; import java.util.List; /** + * CLI Command, which puts the Jenkins node offline. * @author pjanouse - * @since TODO + * @since 2.15 */ @Extension public class OfflineNodeCommand extends CLICommand { @@ -88,7 +89,7 @@ public class OfflineNodeCommand extends CLICommand { } if (errorOccurred) { - throw new AbortException("Error occured while performing this command, see previous stderr output."); + throw new AbortException(CLI_LISTPARAM_SUMMARY_ERROR_TEXT); } return 0; } diff --git a/core/src/main/java/hudson/cli/OnlineNodeCommand.java b/core/src/main/java/hudson/cli/OnlineNodeCommand.java index 5890ef72e07fd5eb7a2334a9b74850444860c925..5cb190fcd8ccf6bdb2c7f4e3e4c7e55888ad6505 100644 --- a/core/src/main/java/hudson/cli/OnlineNodeCommand.java +++ b/core/src/main/java/hudson/cli/OnlineNodeCommand.java @@ -37,8 +37,9 @@ import java.util.HashSet; import java.util.List; /** + * CLI Command, which moves the node to the online state. * @author pjanouse - * @since TODO + * @since 1.642 */ @Extension public class OnlineNodeCommand extends CLICommand { @@ -86,7 +87,7 @@ public class OnlineNodeCommand extends CLICommand { } if (errorOccurred){ - throw new AbortException("Error occured while performing this command, see previous stderr output."); + throw new AbortException(CLI_LISTPARAM_SUMMARY_ERROR_TEXT); } return 0; } diff --git a/core/src/main/java/hudson/cli/QuietDownCommand.java b/core/src/main/java/hudson/cli/QuietDownCommand.java index 76d4b78dd2618f819499fe6ff4b4a080151596d2..4d84055c8de21667dac56c35ef6397cb253e7574 100644 --- a/core/src/main/java/hudson/cli/QuietDownCommand.java +++ b/core/src/main/java/hudson/cli/QuietDownCommand.java @@ -34,7 +34,7 @@ import java.util.logging.Logger; * Quiet down Jenkins - preparation for a restart * * @author pjanouse - * @since TODO + * @since 2.14 */ @Extension public class QuietDownCommand extends CLICommand { diff --git a/core/src/main/java/hudson/cli/ReloadConfigurationCommand.java b/core/src/main/java/hudson/cli/ReloadConfigurationCommand.java index 35cdad086c92015c756a2537bc113c35c420a869..25199ec5bed80421701fdbb9bb94537563b754a8 100644 --- a/core/src/main/java/hudson/cli/ReloadConfigurationCommand.java +++ b/core/src/main/java/hudson/cli/ReloadConfigurationCommand.java @@ -28,10 +28,10 @@ import hudson.Extension; import jenkins.model.Jenkins; /** - * Reload everything from file system + * Reload everything from the file system. * * @author pjanouse - * @since TODO + * @since 2.4 */ @Extension public class ReloadConfigurationCommand extends CLICommand { diff --git a/core/src/main/java/hudson/cli/ReloadJobCommand.java b/core/src/main/java/hudson/cli/ReloadJobCommand.java index 800161b29be47ce3b4a7aa129eb8b64302a17efd..17b0379f731bee1c311c435789cfb9a2bb08e94d 100644 --- a/core/src/main/java/hudson/cli/ReloadJobCommand.java +++ b/core/src/main/java/hudson/cli/ReloadJobCommand.java @@ -38,8 +38,9 @@ import java.util.logging.Level; import java.util.logging.Logger; /** + * Reloads job from the disk. * @author pjanouse - * @since TODO + * @since 1.633 */ @Extension public class ReloadJobCommand extends CLICommand { @@ -100,7 +101,7 @@ public class ReloadJobCommand extends CLICommand { } if (errorOccurred) { - throw new AbortException("Error occured while performing this command, see previous stderr output."); + throw new AbortException(CLI_LISTPARAM_SUMMARY_ERROR_TEXT); } return 0; } diff --git a/core/src/main/java/hudson/cli/WaitNodeOfflineCommand.java b/core/src/main/java/hudson/cli/WaitNodeOfflineCommand.java index 161fe1879dd68776e06d25c97ed78547e97f5738..319e4424a9e44b8b95d1b00b19403f0a805dc994 100644 --- a/core/src/main/java/hudson/cli/WaitNodeOfflineCommand.java +++ b/core/src/main/java/hudson/cli/WaitNodeOfflineCommand.java @@ -28,8 +28,9 @@ import hudson.model.Node; import org.kohsuke.args4j.Argument; /** + * CLI command, which waits till the node switches to the offline state. * @author pjanouse - * @since TODO + * @since 2.16 */ @Extension public class WaitNodeOfflineCommand extends CLICommand { diff --git a/core/src/main/java/hudson/cli/WaitNodeOnlineCommand.java b/core/src/main/java/hudson/cli/WaitNodeOnlineCommand.java index fa33bdd17dcb242de0b05339f8862e5e972fc9df..2e9713ad6f4cd4e6034ca11f8e1ae9748d1315cf 100644 --- a/core/src/main/java/hudson/cli/WaitNodeOnlineCommand.java +++ b/core/src/main/java/hudson/cli/WaitNodeOnlineCommand.java @@ -28,8 +28,9 @@ import hudson.model.Node; import org.kohsuke.args4j.Argument; /** + * CLI command, which waits till the node switches to the online state. * @author pjanouse - * @since TODO + * @since 2.16 */ @Extension public class WaitNodeOnlineCommand extends CLICommand { diff --git a/core/src/main/java/hudson/cli/declarative/CLIRegisterer.java b/core/src/main/java/hudson/cli/declarative/CLIRegisterer.java index e063bb08cdd2996b08e0fa24e519ca051c093ca2..2d17d1b29b159b6b7971d0baf2ef8ace0246001b 100644 --- a/core/src/main/java/hudson/cli/declarative/CLIRegisterer.java +++ b/core/src/main/java/hudson/cli/declarative/CLIRegisterer.java @@ -27,6 +27,7 @@ import hudson.AbortException; import hudson.Extension; import hudson.ExtensionComponent; import hudson.ExtensionFinder; +import hudson.Functions; import hudson.Util; import hudson.cli.CLICommand; import hudson.cli.CloneableCLICommand; @@ -269,7 +270,7 @@ public class CLIRegisterer extends ExtensionFinder { stderr.println(""); stderr.println("ERROR: " + errorMsg); LOGGER.log(Level.WARNING, errorMsg, e); - e.printStackTrace(stderr); + Functions.printStackTrace(e, stderr); return 1; } } diff --git a/core/src/main/java/hudson/cli/handlers/ViewOptionHandler.java b/core/src/main/java/hudson/cli/handlers/ViewOptionHandler.java index 784aef7a70a5a20b0805a17d6259b068b8ce1468..729d6f571b2ed1cca2fd7707c14993577458764e 100644 --- a/core/src/main/java/hudson/cli/handlers/ViewOptionHandler.java +++ b/core/src/main/java/hudson/cli/handlers/ViewOptionHandler.java @@ -88,8 +88,8 @@ public class ViewOptionHandler extends OptionHandler { * @throws IllegalStateException * If cannot get active Jenkins instance or view can't contain a views * @throws AccessDeniedException - * If user doens't have a READ permission for the view - * @since TODO + * If user doesn't have a READ permission for the view + * @since 1.618 */ @CheckForNull public View getView(final String name) { diff --git a/core/src/main/java/hudson/cli/util/ScriptLoader.java b/core/src/main/java/hudson/cli/util/ScriptLoader.java index e2252efbd5f78f9670bd272e6fa130180e78b3ce..8484c1e95926e09ecb20876dda6d5a3bdf0962c9 100644 --- a/core/src/main/java/hudson/cli/util/ScriptLoader.java +++ b/core/src/main/java/hudson/cli/util/ScriptLoader.java @@ -35,11 +35,8 @@ public class ScriptLoader extends MasterToSlaveCallable { } catch (MalformedURLException e) { throw new AbortException("Unable to find a script "+script); } - InputStream s = url.openStream(); - try { + try (InputStream s = url.openStream()) { return IOUtils.toString(s); - } finally { - s.close(); } } } diff --git a/core/src/main/java/hudson/console/ConsoleNote.java b/core/src/main/java/hudson/console/ConsoleNote.java index c27fec63643527d8b9f775f6e1c6b6a739a47f62..c0b281c6ca9bce6cfda181c35b98aca9ae8dbe45 100644 --- a/core/src/main/java/hudson/console/ConsoleNote.java +++ b/core/src/main/java/hudson/console/ConsoleNote.java @@ -51,6 +51,9 @@ import java.util.Collection; import java.util.List; import com.jcraft.jzlib.GZIPInputStream; import com.jcraft.jzlib.GZIPOutputStream; +import hudson.remoting.ClassFilter; +import jenkins.security.HMACConfidentialKey; +import jenkins.util.SystemProperties; /** * Data that hangs off from a console output. @@ -94,8 +97,6 @@ import com.jcraft.jzlib.GZIPOutputStream; * {@link ConsoleNote} always sticks to a particular point in the console output. * *

    - * This design allows descendant processes of Hudson to emit {@link ConsoleNote}s. For example, Ant forked - * by a shell forked by Hudson can put an encoded note in its stdout, and Hudson will correctly understands that. * The preamble and postamble includes a certain ANSI escape sequence designed in such a way to minimize garbage * if this output is observed by a human being directly. * @@ -121,6 +122,15 @@ import com.jcraft.jzlib.GZIPOutputStream; * @since 1.349 */ public abstract class ConsoleNote implements Serializable, Describable>, ExtensionPoint { + + private static final HMACConfidentialKey MAC = new HMACConfidentialKey(ConsoleNote.class, "MAC"); + /** + * Allows historical build records with unsigned console notes to be displayed, at the expense of any security. + * Disables checking of {@link #MAC} so do not set this flag unless you completely trust all users capable of affecting build output, + * which in practice means that all SCM committers as well as all Jenkins users with any non-read-only access are consider administrators. + */ + static /* nonfinal for tests & script console */ boolean INSECURE = SystemProperties.getBoolean(ConsoleNote.class.getName() + ".INSECURE"); + /** * When the line of a console output that this annotation is attached is read by someone, * a new {@link ConsoleNote} is de-serialized and this method is invoked to annotate that line. @@ -170,11 +180,8 @@ public abstract class ConsoleNote implements Serializable, Describable implements Serializable, Describable implements Serializable, Describable 0) { // new format + mac = new byte[macSz]; + decoded.readFully(mac); + sz = decoded.readInt(); + } else { + mac = null; + sz = - macSz; + } byte[] buf = new byte[sz]; decoded.readFully(buf); @@ -223,12 +245,19 @@ public abstract class ConsoleNote implements Serializable, Describable implements Serializable, Describable 0) { // new format + IOUtils.skip(decoded, macSz); + int sz = decoded.readInt(); + IOUtils.skip(decoded, sz); + } else { // old format + int sz = -macSz; + IOUtils.skip(decoded, sz); + } byte[] postamble = new byte[POSTAMBLE.length]; in.readFully(postamble); diff --git a/core/src/main/java/hudson/diagnosis/HudsonHomeDiskUsageChecker.java b/core/src/main/java/hudson/diagnosis/HudsonHomeDiskUsageChecker.java index 4e16de8c99777110775a14af93c1af97a65d3f63..3d842e1d79c5b9bf9535339a4952abd5876c3ee2 100644 --- a/core/src/main/java/hudson/diagnosis/HudsonHomeDiskUsageChecker.java +++ b/core/src/main/java/hudson/diagnosis/HudsonHomeDiskUsageChecker.java @@ -64,10 +64,10 @@ public class HudsonHomeDiskUsageChecker extends PeriodicWork { private static final Logger LOGGER = Logger.getLogger(HudsonHomeDiskUsageChecker.class.getName()); /** - * Gets the minimum amount of space to check for, with a default of 1GB + * Gets the minimum amount of space to check for, with a default of 10GB */ public static long FREE_SPACE_THRESHOLD = Long.getLong( HudsonHomeDiskUsageChecker.class.getName() + ".freeSpaceThreshold", - 1024L*1024*1024); + 1024L*1024*1024*10); } diff --git a/core/src/main/java/hudson/diagnosis/HudsonHomeDiskUsageMonitor.java b/core/src/main/java/hudson/diagnosis/HudsonHomeDiskUsageMonitor.java index 20cd973989e3d386bef902beace1f97334e9069c..337f739dcb827d0d718d83208ff47cc909bf6b00 100644 --- a/core/src/main/java/hudson/diagnosis/HudsonHomeDiskUsageMonitor.java +++ b/core/src/main/java/hudson/diagnosis/HudsonHomeDiskUsageMonitor.java @@ -32,6 +32,7 @@ import org.jenkinsci.Symbol; import org.kohsuke.stapler.HttpResponse; import org.kohsuke.stapler.HttpResponses; import org.kohsuke.stapler.QueryParameter; +import org.kohsuke.stapler.interceptor.RequirePOST; import java.io.IOException; import java.util.List; @@ -64,6 +65,7 @@ public final class HudsonHomeDiskUsageMonitor extends AdministrativeMonitor { /** * Depending on whether the user said "yes" or "no", send him to the right place. */ + @RequirePOST public HttpResponse doAct(@QueryParameter String no) throws IOException { if(no!=null) { disable(true); diff --git a/core/src/main/java/hudson/diagnosis/NullIdDescriptorMonitor.java b/core/src/main/java/hudson/diagnosis/NullIdDescriptorMonitor.java index 7465b200e327c5deb34d539dc3d8c31346441440..8b3778262ef5650e2aa00f03e63f2fcb07c589c5 100644 --- a/core/src/main/java/hudson/diagnosis/NullIdDescriptorMonitor.java +++ b/core/src/main/java/hudson/diagnosis/NullIdDescriptorMonitor.java @@ -50,6 +50,11 @@ import static hudson.init.InitMilestone.EXTENSIONS_AUGMENTED; @Extension @Symbol("nullId") public class NullIdDescriptorMonitor extends AdministrativeMonitor { + @Override + public String getDisplayName() { + return Messages.NullIdDescriptorMonitor_DisplayName(); + } + private final List problems = new ArrayList(); @Override diff --git a/core/src/main/java/hudson/diagnosis/OldDataMonitor.java b/core/src/main/java/hudson/diagnosis/OldDataMonitor.java index 90324b67ca9196e6e7b259ab34f90e7b8d649f24..0feeb62c8e8665130ec581c3e748e4b02f941ce6 100644 --- a/core/src/main/java/hudson/diagnosis/OldDataMonitor.java +++ b/core/src/main/java/hudson/diagnosis/OldDataMonitor.java @@ -52,6 +52,7 @@ import java.util.concurrent.ConcurrentMap; import java.util.logging.Level; import java.util.logging.Logger; import javax.annotation.CheckForNull; + import jenkins.model.Jenkins; import org.acegisecurity.context.SecurityContext; import org.acegisecurity.context.SecurityContextHolder; diff --git a/core/src/main/java/hudson/diagnosis/ReverseProxySetupMonitor.java b/core/src/main/java/hudson/diagnosis/ReverseProxySetupMonitor.java index 61f6b0fe6ec17975b2796f1f3ad5244e4abac6ff..8f7dffa349d7a8fdc8c39f864ebfb75fdc35b40f 100644 --- a/core/src/main/java/hudson/diagnosis/ReverseProxySetupMonitor.java +++ b/core/src/main/java/hudson/diagnosis/ReverseProxySetupMonitor.java @@ -37,6 +37,7 @@ import java.util.logging.Level; import java.util.logging.Logger; import jenkins.model.Jenkins; import org.kohsuke.stapler.Stapler; +import org.kohsuke.stapler.interceptor.RequirePOST; /** * Looks out for a broken reverse proxy setup that doesn't rewrite the location header correctly. @@ -84,6 +85,7 @@ public class ReverseProxySetupMonitor extends AdministrativeMonitor { /** * Depending on whether the user said "yes" or "no", send him to the right place. */ + @RequirePOST public HttpResponse doAct(@QueryParameter String no) throws IOException { if(no!=null) { // dismiss disable(true); @@ -93,5 +95,10 @@ public class ReverseProxySetupMonitor extends AdministrativeMonitor { return new HttpRedirect("https://wiki.jenkins-ci.org/display/JENKINS/Jenkins+says+my+reverse+proxy+setup+is+broken"); } } + + @Override + public String getDisplayName() { + return Messages.ReverseProxySetupMonitor_DisplayName(); + } } diff --git a/core/src/main/java/hudson/diagnosis/TooManyJobsButNoView.java b/core/src/main/java/hudson/diagnosis/TooManyJobsButNoView.java index f4507ca8d13f272bc0ec37802ed055bf32f465f0..7f5c02c0e35d131e3fb92f854b16c16e1bd2a0e9 100644 --- a/core/src/main/java/hudson/diagnosis/TooManyJobsButNoView.java +++ b/core/src/main/java/hudson/diagnosis/TooManyJobsButNoView.java @@ -29,6 +29,7 @@ import hudson.Extension; import org.jenkinsci.Symbol; import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerResponse; +import org.kohsuke.stapler.interceptor.RequirePOST; import java.io.IOException; @@ -42,6 +43,12 @@ import java.io.IOException; */ @Extension @Symbol("tooManyJobsButNoView") public class TooManyJobsButNoView extends AdministrativeMonitor { + + @Override + public String getDisplayName() { + return Messages.TooManyJobsButNoView_DisplayName(); + } + public boolean isActivated() { Jenkins h = Jenkins.getInstance(); return h.getViews().size()==1 && h.getItemMap().size()> THRESHOLD; @@ -50,6 +57,7 @@ public class TooManyJobsButNoView extends AdministrativeMonitor { /** * Depending on whether the user said "yes" or "no", send him to the right place. */ + @RequirePOST public void doAct(StaplerRequest req, StaplerResponse rsp) throws IOException { if(req.hasParameter("no")) { disable(true); diff --git a/core/src/main/java/hudson/init/impl/InitialUserContent.java b/core/src/main/java/hudson/init/impl/InitialUserContent.java index 85a7d7bb7e3c2cc33fa687bde259b97613a4add5..0407dd8bb64eaa7ca7ba087ce4022c45ed5904e1 100644 --- a/core/src/main/java/hudson/init/impl/InitialUserContent.java +++ b/core/src/main/java/hudson/init/impl/InitialUserContent.java @@ -42,7 +42,7 @@ public class InitialUserContent { File userContentDir = new File(h.getRootDir(), "userContent"); if(!userContentDir.exists()) { userContentDir.mkdirs(); - FileUtils.writeStringToFile(new File(userContentDir,"readme.txt"), Messages.Hudson_USER_CONTENT_README()); + FileUtils.writeStringToFile(new File(userContentDir,"readme.txt"), Messages.Hudson_USER_CONTENT_README() + "\n"); } } } diff --git a/core/src/main/java/hudson/init/impl/InstallUncaughtExceptionHandler.java b/core/src/main/java/hudson/init/impl/InstallUncaughtExceptionHandler.java index 7a37561571fc2a8c419d748c72886c647453650b..be55c08ff4eb094724468d15ac4e0f69d4ed45d5 100644 --- a/core/src/main/java/hudson/init/impl/InstallUncaughtExceptionHandler.java +++ b/core/src/main/java/hudson/init/impl/InstallUncaughtExceptionHandler.java @@ -45,7 +45,7 @@ public class InstallUncaughtExceptionHandler { "Failed to set the default UncaughtExceptionHandler. " + "If any threads die due to unhandled coding errors then there will be no logging of this information. " + "The lack of this diagnostic information will make it harder to track down issues which will reduce the supportability of Jenkins. " + - "It is highly recomended that you consult the documentation that comes with you servlet container on how to allow the " + + "It is highly recommended that you consult the documentation that comes with you servlet container on how to allow the " + "`setDefaultUncaughtExceptionHandler` permission and enable it.", ex); } } diff --git a/core/src/main/java/hudson/init/package-info.java b/core/src/main/java/hudson/init/package-info.java index 065b64a85cb1c1ad201c936d29e564c9cacf941a..9833d2090ec5adc3f1444d1a8828a2a9f1f519c9 100644 --- a/core/src/main/java/hudson/init/package-info.java +++ b/core/src/main/java/hudson/init/package-info.java @@ -33,7 +33,7 @@ * *

    * Such micro-scopic dependencies are organized into a bigger directed acyclic graph, which is then executed - * via Session. During execution of the reactor, additional tasks can be discovred and added to + * via Session. During execution of the reactor, additional tasks can be discovered and added to * the DAG. We use this additional indirection to: * *

      diff --git a/core/src/main/java/hudson/lifecycle/SolarisSMFLifecycle.java b/core/src/main/java/hudson/lifecycle/SolarisSMFLifecycle.java index ca90fb83d42798b3a5e2da4b5b0db9f38669db13..54e3d6c7434e0838212f8f08fa64ef9cc6a470a9 100644 --- a/core/src/main/java/hudson/lifecycle/SolarisSMFLifecycle.java +++ b/core/src/main/java/hudson/lifecycle/SolarisSMFLifecycle.java @@ -26,6 +26,8 @@ package hudson.lifecycle; import jenkins.model.Jenkins; import java.io.IOException; +import java.util.logging.Level; +import java.util.logging.Logger; /** * {@link Lifecycle} for Hudson installed as SMF service. @@ -38,9 +40,16 @@ public class SolarisSMFLifecycle extends Lifecycle { */ @Override public void restart() throws IOException, InterruptedException { - Jenkins h = Jenkins.getInstanceOrNull(); // guard against repeated concurrent calls to restart - if (h != null) - h.cleanUp(); + Jenkins jenkins = Jenkins.getInstanceOrNull(); // guard against repeated concurrent calls to restart + try { + if (jenkins != null) { + jenkins.cleanUp(); + } + } catch (Exception e) { + LOGGER.log(Level.SEVERE, "Failed to clean up. Restart will continue.", e); + } System.exit(0); } + + private static final Logger LOGGER = Logger.getLogger(SolarisSMFLifecycle.class.getName()); } diff --git a/core/src/main/java/hudson/lifecycle/UnixLifecycle.java b/core/src/main/java/hudson/lifecycle/UnixLifecycle.java index 5d545a4fe4f528ca7934d90394fd65873c3e58c9..1af9c131558926666e3f2693d9ff14ae2311fa0f 100644 --- a/core/src/main/java/hudson/lifecycle/UnixLifecycle.java +++ b/core/src/main/java/hudson/lifecycle/UnixLifecycle.java @@ -28,6 +28,8 @@ import com.sun.jna.Native; import com.sun.jna.StringArray; import java.io.IOException; +import java.util.logging.Level; +import java.util.logging.Logger; import static hudson.util.jna.GNUCLibrary.*; @@ -65,9 +67,14 @@ public class UnixLifecycle extends Lifecycle { @Override public void restart() throws IOException, InterruptedException { - Jenkins h = Jenkins.getInstanceOrNull(); // guard against repeated concurrent calls to restart - if (h != null) - h.cleanUp(); + Jenkins jenkins = Jenkins.getInstanceOrNull(); // guard against repeated concurrent calls to restart + try { + if (jenkins != null) { + jenkins.cleanUp(); + } + } catch (Exception e) { + LOGGER.log(Level.SEVERE, "Failed to clean up. Restart will continue.", e); + } // close all files upon exec, except stdin, stdout, and stderr int sz = LIBC.getdtablesize(); @@ -96,4 +103,6 @@ public class UnixLifecycle extends Lifecycle { if (args==null) throw new RestartNotSupportedException("Failed to obtain the command line arguments of the process",failedToObtainArgs); } + + private static final Logger LOGGER = Logger.getLogger(UnixLifecycle.class.getName()); } diff --git a/core/src/main/java/hudson/lifecycle/WindowsInstallerLink.java b/core/src/main/java/hudson/lifecycle/WindowsInstallerLink.java index 978b3c79659546fcefff70c05a21aeb366a0b53c..a9142adbc67fdd4ad2d3fdc39f34bda3a0ea92f6 100644 --- a/core/src/main/java/hudson/lifecycle/WindowsInstallerLink.java +++ b/core/src/main/java/hudson/lifecycle/WindowsInstallerLink.java @@ -306,9 +306,9 @@ public class WindowsInstallerLink extends ManagementLink { try { return Kernel32Utils.waitForExitProcess(sei.hProcess); } finally { - FileInputStream fin = new FileInputStream(new File(pwd,"redirect.log")); - IOUtils.copy(fin, out.getLogger()); - fin.close(); + try (FileInputStream fin = new FileInputStream(new File(pwd,"redirect.log"))) { + IOUtils.copy(fin, out.getLogger()); + } } } diff --git a/core/src/main/java/hudson/lifecycle/WindowsServiceLifecycle.java b/core/src/main/java/hudson/lifecycle/WindowsServiceLifecycle.java index 11f364e953ba25fce29da0a4499aa567731cb219..94066417b0baf978edc37ae877a231869ffcd791 100644 --- a/core/src/main/java/hudson/lifecycle/WindowsServiceLifecycle.java +++ b/core/src/main/java/hudson/lifecycle/WindowsServiceLifecycle.java @@ -110,16 +110,22 @@ public class WindowsServiceLifecycle extends Lifecycle { File rootDir = Jenkins.getInstance().getRootDir(); File copyFiles = new File(rootDir,baseName+".copies"); - FileWriter w = new FileWriter(copyFiles, true); - try { - w.write(by.getAbsolutePath()+'>'+getHudsonWar().getAbsolutePath()+'\n'); - } finally { - w.close(); + try (FileWriter w = new FileWriter(copyFiles, true)) { + w.write(by.getAbsolutePath() + '>' + getHudsonWar().getAbsolutePath() + '\n'); } } @Override public void restart() throws IOException, InterruptedException { + Jenkins jenkins = Jenkins.getInstanceOrNull(); + try { + if (jenkins != null) { + jenkins.cleanUp(); + } + } catch (Exception e) { + LOGGER.log(Level.SEVERE, "Failed to clean up. Restart will continue.", e); + } + File me = getHudsonWar(); File home = me.getParentFile(); diff --git a/core/src/main/java/hudson/logging/LogRecorderManager.java b/core/src/main/java/hudson/logging/LogRecorderManager.java index e35a098d4bac0af2bc594e1d40f06c777d194ad4..698718634b2c12bbdcffc6f26339ec86e15b425b 100644 --- a/core/src/main/java/hudson/logging/LogRecorderManager.java +++ b/core/src/main/java/hudson/logging/LogRecorderManager.java @@ -129,7 +129,7 @@ public class LogRecorderManager extends AbstractModelObject implements ModelObje /** * Configure the logging level. */ - @edu.umd.cs.findbugs.annotations.SuppressWarnings("LG_LOST_LOGGER_DUE_TO_WEAK_REFERENCE") + @edu.umd.cs.findbugs.annotations.SuppressFBWarnings("LG_LOST_LOGGER_DUE_TO_WEAK_REFERENCE") public HttpResponse doConfigLogger(@QueryParameter String name, @QueryParameter String level) { Jenkins.getInstance().checkPermission(Jenkins.ADMINISTER); Level lv; diff --git a/core/src/main/java/hudson/model/AbstractBuild.java b/core/src/main/java/hudson/model/AbstractBuild.java index b723b9b5196176351913d2ad244d3f64bc02cf12..857934d6d8dbaf773b4397d064373a9263e37e08 100644 --- a/core/src/main/java/hudson/model/AbstractBuild.java +++ b/core/src/main/java/hudson/model/AbstractBuild.java @@ -633,7 +633,7 @@ public abstract class AbstractBuild

      ,R extends Abs throw (InterruptedException)new InterruptedException().initCause(e); } catch (IOException e) { // checkout error not yet reported - e.printStackTrace(listener.getLogger()); + Functions.printStackTrace(e, listener.getLogger()); } if (retryCount == 0) // all attempts failed @@ -749,7 +749,7 @@ public abstract class AbstractBuild

      ,R extends Abs listener.error("Step ‘" + buildStep + "’ failed: " + e.getMessage()); } else { String msg = "Step ‘" + buildStep + "’ aborted due to exception: "; - e.printStackTrace(listener.error(msg)); + Functions.printStackTrace(e, listener.error(msg)); LOGGER.log(WARNING, msg, e); } @@ -784,8 +784,7 @@ public abstract class AbstractBuild

      ,R extends Abs // Channel is closed, do not continue reportBrokenChannel(listener); } catch (RuntimeException ex) { - - ex.printStackTrace(listener.error("Build step failed with exception")); + Functions.printStackTrace(ex, listener.error("Build step failed with exception")); } for (BuildStepListener bsl : BuildStepListener.all()) { @@ -854,7 +853,7 @@ public abstract class AbstractBuild

      ,R extends Abs } /* - * No need to to lock the entire AbstractBuild on change set calculcation + * No need to lock the entire AbstractBuild on change set calculation */ private transient Object changeSetLock = new Object(); diff --git a/core/src/main/java/hudson/model/AbstractItem.java b/core/src/main/java/hudson/model/AbstractItem.java index 3dd2b326035f5afd10b1a8c63c575db3010dce61..5f9f6c84dbfb783dcb461664ad29887144a3db71 100644 --- a/core/src/main/java/hudson/model/AbstractItem.java +++ b/core/src/main/java/hudson/model/AbstractItem.java @@ -44,7 +44,6 @@ import hudson.util.Secret; import jenkins.model.DirectlyModifiableTopLevelItemGroup; import jenkins.model.Jenkins; import jenkins.security.NotReallyRoleSensitiveCallable; -import org.acegisecurity.Authentication; import jenkins.util.xml.XMLUtils; import org.apache.tools.ant.taskdefs.Copy; @@ -75,7 +74,6 @@ import org.kohsuke.stapler.interceptor.RequirePOST; import org.xml.sax.SAXException; import javax.servlet.ServletException; -import javax.servlet.ServletOutputStream; import javax.xml.transform.Source; import javax.xml.transform.TransformerException; import javax.xml.transform.stream.StreamResult; @@ -135,6 +133,15 @@ public abstract class AbstractItem extends Actionable implements Item, HttpDelet return AlternativeUiTextProvider.get(PRONOUN, this, Messages.AbstractItem_Pronoun()); } + /** + * Gets the term used in the UI to represent the kind of {@link Queue.Task} associated with this kind of + * {@link Item}. Must start with a capital letter. Defaults to "Build". + * @since2.50 + */ + public String getTaskNoun() { + return AlternativeUiTextProvider.get(TASK_NOUN, this, Messages.AbstractItem_TaskNoun()); + } + @Exported /** * @return The display name of this object, or if it is not set, the name @@ -235,27 +242,10 @@ public abstract class AbstractItem extends Actionable implements Item, HttpDelet if (this.name.equals(newName)) return; - // the test to see if the project already exists or not needs to be done in escalated privilege - // to avoid overwriting - ACL.impersonate(ACL.SYSTEM,new NotReallyRoleSensitiveCallable() { - final Authentication user = Jenkins.getAuthentication(); - @Override - public Void call() throws IOException { - Item existing = parent.getItem(newName); - if (existing != null && existing!=AbstractItem.this) { - if (existing.getACL().hasPermission(user,Item.DISCOVER)) - // the look up is case insensitive, so we need "existing!=this" - // to allow people to rename "Foo" to "foo", for example. - // see http://www.nabble.com/error-on-renaming-project-tt18061629.html - throw new IllegalArgumentException("Job " + newName + " already exists"); - else { - // can't think of any real way to hide this, but at least the error message could be vague. - throw new IOException("Unable to rename to " + newName); - } - } - return null; - } - }); + // the lookup is case insensitive, so we should not fail if this item was the “existing” one + // to allow people to rename "Foo" to "foo", for example. + // see http://www.nabble.com/error-on-renaming-project-tt18061629.html + Items.verifyItemDoesNotAlreadyExist(parent, newName, this); File oldRoot = this.getRootDir(); @@ -354,12 +344,14 @@ public abstract class AbstractItem extends Actionable implements Item, HttpDelet */ public abstract Collection getAllJobs(); + @Exported public final String getFullName() { String n = getParent().getFullName(); if(n.length()==0) return getName(); else return n+'/'+getName(); } + @Exported public final String getFullDisplayName() { String n = getParent().getFullDisplayName(); if(n.length()==0) return getDisplayName(); @@ -673,9 +665,7 @@ public abstract class AbstractItem extends Actionable implements Item, HttpDelet try { XMLUtils.safeTransform(source, new StreamResult(out)); out.close(); - } catch (TransformerException e) { - throw new IOException("Failed to persist config.xml", e); - } catch (SAXException e) { + } catch (TransformerException | SAXException e) { throw new IOException("Failed to persist config.xml", e); } @@ -768,4 +758,9 @@ public abstract class AbstractItem extends Actionable implements Item, HttpDelet */ public static final Message PRONOUN = new Message(); + /** + * Replaceable noun for describing the kind of task that this item represents. Defaults to "Build". + */ + public static final Message TASK_NOUN = new Message<>(); + } diff --git a/core/src/main/java/hudson/model/AbstractProject.java b/core/src/main/java/hudson/model/AbstractProject.java index 2c2fe31c765bb0ccc6b6965106a7fc53f87bc494..cdf98e5083f828e0263da8428c514090615f7e3c 100644 --- a/core/src/main/java/hudson/model/AbstractProject.java +++ b/core/src/main/java/hudson/model/AbstractProject.java @@ -1151,7 +1151,7 @@ public abstract class AbstractProject

      ,R extends A return new BlockedBecauseOfBuildInProgress(lastBuild); } else { // The build has been likely deleted after the isLogUpdated() call. - // Another cause may be an API implemetation glitсh in the implementation for AbstractProject. + // Another cause may be an API implementation glitсh in the implementation for AbstractProject. // Anyway, we should let the code go then. LOGGER.log(Level.FINE, "The last build has been deleted during the non-concurrent cause creation. The build is not blocked anymore"); } @@ -1370,11 +1370,11 @@ public abstract class AbstractProject

      ,R extends A SCMPollListener.firePollingFailed(this, listener,e); return NO_CHANGES; } catch (IOException e) { - e.printStackTrace(listener.fatalError(e.getMessage())); + Functions.printStackTrace(e, listener.fatalError(e.getMessage())); SCMPollListener.firePollingFailed(this, listener,e); return NO_CHANGES; } catch (InterruptedException e) { - e.printStackTrace(listener.fatalError(Messages.AbstractProject_PollingABorted())); + Functions.printStackTrace(e, listener.fatalError(Messages.AbstractProject_PollingABorted())); SCMPollListener.firePollingFailed(this, listener,e); return NO_CHANGES; } catch (RuntimeException e) { @@ -1618,7 +1618,7 @@ public abstract class AbstractProject

      ,R extends A } /** - * Gets the specific trigger, or null if the propert is not configured for this job. + * Gets the specific trigger, or null if the property is not configured for this job. */ public T getTrigger(Class clazz) { for (Trigger p : triggers()) { diff --git a/core/src/main/java/hudson/model/Action.java b/core/src/main/java/hudson/model/Action.java index 2e8d2e641ffba3a30094ce2c1875e548b418eff9..9e48742986de696c08afd2167701da1723d8a701 100644 --- a/core/src/main/java/hudson/model/Action.java +++ b/core/src/main/java/hudson/model/Action.java @@ -68,6 +68,11 @@ import javax.annotation.CheckForNull; * (for example with {@link Build}) via XStream. In some other cases, * {@link Action}s are transient and not persisted (such as * when it's used with {@link Job}). + *

      + * The {@link Actionable#replaceAction(Action)}, {@link Actionable#addOrReplaceAction(Action)}, and + * {@link Actionable#removeAction(Action)} methods use {@link Action#equals(Object)} to determine whether to update + * or replace or remove an {@link Action}. As such, {@link Action} subclasses that provide a deep + * {@link #equals(Object)} will assist in reducing the need for unnecessary persistence. * * @author Kohsuke Kawaguchi */ diff --git a/core/src/main/java/hudson/model/Actionable.java b/core/src/main/java/hudson/model/Actionable.java index 8285544821df9d98c258ea6ed0311128a2516587..10e894331e95764525c7265f6185b17e03b1315c 100644 --- a/core/src/main/java/hudson/model/Actionable.java +++ b/core/src/main/java/hudson/model/Actionable.java @@ -23,7 +23,7 @@ */ package hudson.model; -import hudson.ExtensionList; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import hudson.Util; import java.util.ArrayList; import java.util.Collection; @@ -32,7 +32,8 @@ import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; import java.util.logging.Level; import java.util.logging.Logger; - +import javax.annotation.Nonnull; +import javax.annotation.Nullable; import jenkins.model.ModelObjectWithContextMenu; import jenkins.model.TransientActionFactory; import org.kohsuke.stapler.StaplerRequest; @@ -65,23 +66,21 @@ public abstract class Actionable extends AbstractModelObject implements ModelObj * This method by default returns only persistent actions * (though some subclasses override it to return an extended unmodifiable list). * - * @return - * may be empty but never null. + * @return a possibly empty list * @deprecated Normally outside code should not call this method any more. * Use {@link #getAllActions}, or {@link #addAction}, or {@link #replaceAction}. * May still be called for compatibility reasons from subclasses predating {@link TransientActionFactory}. */ @Deprecated - public List getActions() { - if(actions == null) { - synchronized (this) { - if(actions == null) { - actions = new CopyOnWriteArrayList(); - } - } - } - return actions; - } + @Nonnull + public List getActions() { + synchronized (this) { + if(actions == null) { + actions = new CopyOnWriteArrayList(); + } + return actions; + } + } /** * Gets all actions, transient or persistent. @@ -90,61 +89,223 @@ public abstract class Actionable extends AbstractModelObject implements ModelObj * @since 1.548 */ @Exported(name="actions") + @Nonnull public final List getAllActions() { - List _actions = new ArrayList(getActions()); - for (TransientActionFactory taf : ExtensionList.lookup(TransientActionFactory.class)) { - if (taf.type().isInstance(this)) { - try { - _actions.addAll(createFor(taf)); - } catch (Exception e) { - LOGGER.log(Level.SEVERE, "Could not load actions from " + taf + " for " + this, e); + List _actions = getActions(); + boolean adding = false; + for (TransientActionFactory taf : TransientActionFactory.factoriesFor(getClass(), Action.class)) { + Collection additions = createFor(taf); + if (!additions.isEmpty()) { + if (!adding) { // need to make a copy + adding = true; + _actions = new ArrayList<>(_actions); } + _actions.addAll(additions); } } return Collections.unmodifiableList(_actions); } + private Collection createFor(TransientActionFactory taf) { - return taf.createFor(taf.type().cast(this)); + try { + Collection result = taf.createFor(taf.type().cast(this)); + for (Action a : result) { + if (!taf.actionType().isInstance(a)) { + LOGGER.log(Level.WARNING, "Actions from {0} for {1} included {2} not assignable to {3}", new Object[] {taf, this, a, taf.actionType()}); + return Collections.emptySet(); + } + } + return result; + } catch (Exception e) { + LOGGER.log(Level.WARNING, "Could not load actions from " + taf + " for " + this, e); + return Collections.emptySet(); + } } /** * Gets all actions of a specified type that contributed to this object. * * @param type The type of action to return. - * @return - * may be empty but never null. + * @return an unmodifiable, possible empty list * @see #getAction(Class) */ + @Nonnull public List getActions(Class type) { - return Util.filter(getAllActions(), type); + List _actions = Util.filter(getActions(), type); + for (TransientActionFactory taf : TransientActionFactory.factoriesFor(getClass(), type)) { + _actions.addAll(Util.filter(createFor(taf), type)); + } + return Collections.unmodifiableList(_actions); } /** * Adds a new action. - * - * The default implementation calls {@code getActions().add(a)}. + * Note: calls to {@link #getAllActions()} that happen before calls to this method may not see the update. + * Note: this method will always modify the actions */ - public void addAction(Action a) { - if(a==null) throw new IllegalArgumentException(); + @SuppressWarnings({"ConstantConditions","deprecation"}) + @SuppressFBWarnings("RCN_REDUNDANT_NULLCHECK_OF_NONNULL_VALUE") + public void addAction(@Nonnull Action a) { + if(a==null) { + throw new IllegalArgumentException("Action must be non-null"); + } getActions().add(a); } /** - * Add an action, replacing any existing action of the (exact) same class. + * Add an action, replacing any existing actions of the (exact) same class. + * Note: calls to {@link #getAllActions()} that happen before calls to this method may not see the update. + * Note: this method does not affect transient actions contributed by a {@link TransientActionFactory}. + * Note: this method cannot provide concurrency control due to the backing storage being a + * {@link CopyOnWriteArrayList} so concurrent calls to any of the mutation methods may produce surprising results + * though technically consistent from the concurrency contract of {@link CopyOnWriteArrayList} (we would need + * some form of transactions or a different backing type). + * * @param a an action to add/replace * @since 1.548 + * @see #addOrReplaceAction(Action) if you want to know whether the backing {@link #actions} was modified, for + * example in cases where the caller would need to persist the {@link Actionable} in order to persist the change + * and there is a desire to elide unnecessary persistence of unmodified objects. */ - public void replaceAction(Action a) { + @SuppressWarnings({"ConstantConditions", "deprecation"}) + @SuppressFBWarnings("RCN_REDUNDANT_NULLCHECK_OF_NONNULL_VALUE") + public void replaceAction(@Nonnull Action a) { + addOrReplaceAction(a); + } + + /** + * Add an action, replacing any existing actions of the (exact) same class. + * Note: calls to {@link #getAllActions()} that happen before calls to this method may not see the update. + * Note: this method does not affect transient actions contributed by a {@link TransientActionFactory} + * Note: this method cannot provide concurrency control due to the backing storage being a + * {@link CopyOnWriteArrayList} so concurrent calls to any of the mutation methods may produce surprising results + * though technically consistent from the concurrency contract of {@link CopyOnWriteArrayList} (we would need + * some form of transactions or a different backing type). + * + * @param a an action to add/replace + * @return {@code true} if this actions changed as a result of the call + * @since 2.29 + */ + @SuppressWarnings({"ConstantConditions", "deprecation"}) + @SuppressFBWarnings("RCN_REDUNDANT_NULLCHECK_OF_NONNULL_VALUE") + public boolean addOrReplaceAction(@Nonnull Action a) { + if (a == null) { + throw new IllegalArgumentException("Action must be non-null"); + } // CopyOnWriteArrayList does not support Iterator.remove, so need to do it this way: List old = new ArrayList(1); List current = getActions(); + boolean found = false; for (Action a2 : current) { - if (a2.getClass() == a.getClass()) { + if (!found && a.equals(a2)) { + found = true; + } else if (a2.getClass() == a.getClass()) { old.add(a2); } } current.removeAll(old); - addAction(a); + if (!found) { + addAction(a); + } + return !found || !old.isEmpty(); + } + + /** + * Remove an action. + * Note: calls to {@link #getAllActions()} that happen before calls to this method may not see the update. + * Note: this method does not affect transient actions contributed by a {@link TransientActionFactory} + * Note: this method cannot provide concurrency control due to the backing storage being a + * {@link CopyOnWriteArrayList} so concurrent calls to any of the mutation methods may produce surprising results + * though technically consistent from the concurrency contract of {@link CopyOnWriteArrayList} (we would need + * some form of transactions or a different backing type). + * + * @param a an action to remove (if {@code null} then this will be a no-op) + * @return {@code true} if this actions changed as a result of the call + * @since 2.29 + */ + @SuppressWarnings("deprecation") + public boolean removeAction(@Nullable Action a) { + if (a == null) { + return false; + } + // CopyOnWriteArrayList does not support Iterator.remove, so need to do it this way: + return getActions().removeAll(Collections.singleton(a)); + } + + /** + * Removes any actions of the specified type. + * Note: calls to {@link #getAllActions()} that happen before calls to this method may not see the update. + * Note: this method does not affect transient actions contributed by a {@link TransientActionFactory} + * Note: this method cannot provide concurrency control due to the backing storage being a + * {@link CopyOnWriteArrayList} so concurrent calls to any of the mutation methods may produce surprising results + * though technically consistent from the concurrency contract of {@link CopyOnWriteArrayList} (we would need + * some form of transactions or a different backing type). + * + * @param clazz the type of actions to remove + * @return {@code true} if this actions changed as a result of the call + * @since 2.29 + */ + @SuppressWarnings({"ConstantConditions","deprecation"}) + @SuppressFBWarnings("RCN_REDUNDANT_NULLCHECK_OF_NONNULL_VALUE") + public boolean removeActions(@Nonnull Class clazz) { + if (clazz == null) { + throw new IllegalArgumentException("Action type must be non-null"); + } + // CopyOnWriteArrayList does not support Iterator.remove, so need to do it this way: + List old = new ArrayList(); + List current = getActions(); + for (Action a : current) { + if (clazz.isInstance(a)) { + old.add(a); + } + } + return current.removeAll(old); + } + + /** + * Replaces any actions of the specified type by the supplied action. + * Note: calls to {@link #getAllActions()} that happen before calls to this method may not see the update. + * Note: this method does not affect transient actions contributed by a {@link TransientActionFactory} + * Note: this method cannot provide concurrency control due to the backing storage being a + * {@link CopyOnWriteArrayList} so concurrent calls to any of the mutation methods may produce surprising results + * though technically consistent from the concurrency contract of {@link CopyOnWriteArrayList} (we would need + * some form of transactions or a different backing type). + * + * @param clazz the type of actions to replace (note that the action you are replacing this with need not extend + * this class) + * @param a the action to replace with + * @return {@code true} if this actions changed as a result of the call + * @since 2.29 + */ + @SuppressWarnings({"ConstantConditions", "deprecation"}) + @SuppressFBWarnings("RCN_REDUNDANT_NULLCHECK_OF_NONNULL_VALUE") + public boolean replaceActions(@Nonnull Class clazz, @Nonnull Action a) { + if (clazz == null) { + throw new IllegalArgumentException("Action type must be non-null"); + } + if (a == null) { + throw new IllegalArgumentException("Action must be non-null"); + } + // CopyOnWriteArrayList does not support Iterator.remove, so need to do it this way: + List old = new ArrayList(); + List current = getActions(); + boolean found = false; + for (Action a1 : current) { + if (!found) { + if (a.equals(a1)) { + found = true; + } else if (clazz.isInstance(a1)) { + old.add(a1); + } + } else if (clazz.isInstance(a1) && !a.equals(a1)) { + old.add(a1); + } + } + current.removeAll(old); + if (!found) { + addAction(a); + } + return !(old.isEmpty() && found); } /** @deprecated No clear purpose, since subclasses may have overridden {@link #getActions}, and does not consider {@link TransientActionFactory}. */ @@ -162,9 +323,20 @@ public abstract class Actionable extends AbstractModelObject implements ModelObj * @see #getActions(Class) */ public T getAction(Class type) { - for (Action a : getAllActions()) - if (type.isInstance(a)) + // Shortcut: if the persisted list has one, return it. + for (Action a : getActions()) { + if (type.isInstance(a)) { return type.cast(a); + } + } + // Otherwise check transient factories. + for (TransientActionFactory taf : TransientActionFactory.factoriesFor(getClass(), type)) { + for (Action a : createFor(taf)) { + if (type.isInstance(a)) { + return type.cast(a); + } + } + } return null; } diff --git a/core/src/main/java/hudson/model/AdministrativeMonitor.java b/core/src/main/java/hudson/model/AdministrativeMonitor.java index 0bdc8a97bc18b9cab09dbca8e559273e67cf2ae4..8b2d39b6cb9eb78bd1e553f884cead2ffd13df40 100644 --- a/core/src/main/java/hudson/model/AdministrativeMonitor.java +++ b/core/src/main/java/hudson/model/AdministrativeMonitor.java @@ -33,8 +33,12 @@ import java.util.Set; import java.io.IOException; import jenkins.model.Jenkins; +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.NoExternalUse; +import org.kohsuke.stapler.StaplerProxy; import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerResponse; +import org.kohsuke.stapler.interceptor.RequirePOST; /** * Checks the health of a subsystem of Jenkins and if there's something @@ -74,7 +78,7 @@ import org.kohsuke.stapler.StaplerResponse; * @see Jenkins#administrativeMonitors */ @LegacyInstancesAreScopedToHudson -public abstract class AdministrativeMonitor extends AbstractModelObject implements ExtensionPoint { +public abstract class AdministrativeMonitor extends AbstractModelObject implements ExtensionPoint, StaplerProxy { /** * Human-readable ID of this monitor, which needs to be unique within the system. * @@ -142,12 +146,21 @@ public abstract class AdministrativeMonitor extends AbstractModelObject implemen /** * URL binding to disable this monitor. */ + @RequirePOST public void doDisable(StaplerRequest req, StaplerResponse rsp) throws IOException { - Jenkins.getInstance().checkPermission(Jenkins.ADMINISTER); disable(true); rsp.sendRedirect2(req.getContextPath()+"/manage"); } + /** + * Requires ADMINISTER permission for any operation in here. + */ + @Restricted(NoExternalUse.class) + public Object getTarget() { + Jenkins.getInstance().checkPermission(Jenkins.ADMINISTER); + return this; + } + /** * All registered {@link AdministrativeMonitor} instances. */ diff --git a/core/src/main/java/hudson/model/AllView.java b/core/src/main/java/hudson/model/AllView.java index 9398c307f0064fba9eaed494cee280ebcb95b74e..939c5fd2ebd8a0bbf474a0135e79ed029f558fab 100644 --- a/core/src/main/java/hudson/model/AllView.java +++ b/core/src/main/java/hudson/model/AllView.java @@ -23,9 +23,16 @@ */ package hudson.model; +import java.util.List; +import java.util.Locale; +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; +import jenkins.util.SystemProperties; +import org.apache.commons.lang.StringUtils; import org.jenkinsci.Symbol; import org.kohsuke.stapler.DataBoundConstructor; -import org.kohsuke.stapler.Stapler; import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerResponse; @@ -44,6 +51,21 @@ import org.kohsuke.stapler.interceptor.RequirePOST; * @since 1.269 */ public class AllView extends View { + + /** + * The name of the default {@link AllView}. An {@link AllView} with this name will get a localized display name. + * Other {@link AllView} instances will be assumed to have been created by the user and thus will use the + * name the user created them with. + * + * @since 2.37 + */ + public static final String DEFAULT_VIEW_NAME = "all"; + + /** + * Our logger. + */ + private static final Logger LOGGER = Logger.getLogger(AllView.class.getName()); + @DataBoundConstructor public AllView(String name) { super(name); @@ -64,6 +86,11 @@ public class AllView extends View { return true; } + @Override + public String getDisplayName() { + return DEFAULT_VIEW_NAME.equals(name) ? Messages.Hudson_ViewName() : name; + } + @RequirePOST @Override public Item doCreateItem(StaplerRequest req, StaplerResponse rsp) @@ -89,13 +116,73 @@ public class AllView extends View { // noop } + /** + * Corrects the name of the {@link AllView} if and only if the {@link AllView} is the primary view and + * its name is one of the localized forms of {@link Messages#_Hudson_ViewName()} and the user has not opted out of + * fixing the view name by setting the system property {@code hudson.mode.AllView.JENKINS-38606} to {@code false}. + * Use this method to round-trip the primary view name, e.g. + * {@code primaryView = applyJenkins38606Fixup(views, primaryView)} + *

      + * NOTE: we can only fix the localized name of an {@link AllView} if it is the primary view as otherwise urls + * would change, whereas the primary view is special and does not normally get accessed by the + * {@code /view/_name_} url. (Also note that there are some cases where the primary view will get accessed by + * its {@code /view/_name_} url which will then fall back to the primary view) + * + * @param views the list of views. + * @param primaryView the current primary view name. + * @return the primary view name - this will be the same as the provided primary view name unless a JENKINS-38606 + * matching name is detected, in which case this will be the new name of the primary view. + * @since 2.37 + */ + @Nonnull + public static String migrateLegacyPrimaryAllViewLocalizedName(@Nonnull List views, + @Nonnull String primaryView) { + if (DEFAULT_VIEW_NAME.equals(primaryView)) { + // modern name, we are safe + return primaryView; + } + if (SystemProperties.getBoolean(AllView.class.getName()+".JENKINS-38606", true)) { + AllView allView = null; + for (View v : views) { + if (DEFAULT_VIEW_NAME.equals(v.getViewName())) { + // name conflict, we cannot rename the all view anyway + return primaryView; + } + if (StringUtils.equals(v.getViewName(), primaryView)) { + if (v instanceof AllView) { + allView = (AllView) v; + } else { + // none of our business fixing as we can only safely fix the primary view + return primaryView; + } + } + } + if (allView != null) { + // the primary view is an AllView but using a non-default name + for (Locale l : Locale.getAvailableLocales()) { + if (primaryView.equals(Messages._Hudson_ViewName().toString(l))) { + // bingo JENKINS-38606 detected + LOGGER.log(Level.INFO, + "JENKINS-38606 detected for AllView in {0}; renaming view from {1} to {2}", + new Object[]{allView.owner.getUrl(), DEFAULT_VIEW_NAME}); + allView.name = DEFAULT_VIEW_NAME; + return DEFAULT_VIEW_NAME; + } + } + } + } + return primaryView; + } + @Extension @Symbol("all") public static final class DescriptorImpl extends ViewDescriptor { @Override - public boolean isInstantiable() { - for (View v : Stapler.getCurrentRequest().findAncestorObject(ViewGroup.class).getViews()) - if(v instanceof AllView) + public boolean isApplicableIn(ViewGroup owner) { + for (View v : owner.getViews()) { + if (v instanceof AllView) { return false; + } + } return true; } diff --git a/core/src/main/java/hudson/model/Api.java b/core/src/main/java/hudson/model/Api.java index 258f48ffea95f243d6d47b2f831e356d51286f9f..6878a4284a1d884c957e1c7aefa8307272f4f504 100644 --- a/core/src/main/java/hudson/model/Api.java +++ b/core/src/main/java/hudson/model/Api.java @@ -169,8 +169,7 @@ public class Api extends AbstractModelObject { } // switch to gzipped output - OutputStream o = rsp.getCompressedOutputStream(req); - try { + try (OutputStream o = rsp.getCompressedOutputStream(req)) { if (isSimpleOutput(result)) { // simple output allowed rsp.setContentType("text/plain;charset=UTF-8"); @@ -182,8 +181,6 @@ public class Api extends AbstractModelObject { // otherwise XML rsp.setContentType("application/xml;charset=UTF-8"); new XMLWriter(o).write(result); - } finally { - o.close(); } } diff --git a/core/src/main/java/hudson/model/AsyncAperiodicWork.java b/core/src/main/java/hudson/model/AsyncAperiodicWork.java index 069a4bb05f2f2818e14232fd6b07746efd051bba..1d295fa7161db0abcdaffbb957773954b2ec7307 100644 --- a/core/src/main/java/hudson/model/AsyncAperiodicWork.java +++ b/core/src/main/java/hudson/model/AsyncAperiodicWork.java @@ -23,6 +23,7 @@ */ package hudson.model; +import hudson.Functions; import hudson.security.ACL; import hudson.util.StreamTaskListener; import java.io.File; @@ -119,9 +120,9 @@ public abstract class AsyncAperiodicWork extends AperiodicWork { execute(l); } catch (IOException e) { - e.printStackTrace(l.fatalError(e.getMessage())); + Functions.printStackTrace(e, l.fatalError(e.getMessage())); } catch (InterruptedException e) { - e.printStackTrace(l.fatalError("aborted")); + Functions.printStackTrace(e, l.fatalError("aborted")); } finally { stopTime = System.currentTimeMillis(); try { diff --git a/core/src/main/java/hudson/model/AsyncPeriodicWork.java b/core/src/main/java/hudson/model/AsyncPeriodicWork.java index d88413f4127646d21972ec59884f4eac07541392..f3ffcc64976a4fa0cbe9892f8c19a3d21a364c1b 100644 --- a/core/src/main/java/hudson/model/AsyncPeriodicWork.java +++ b/core/src/main/java/hudson/model/AsyncPeriodicWork.java @@ -1,5 +1,6 @@ package hudson.model; +import hudson.Functions; import hudson.security.ACL; import hudson.util.StreamTaskListener; import java.io.File; @@ -99,9 +100,9 @@ public abstract class AsyncPeriodicWork extends PeriodicWork { execute(l); } catch (IOException e) { - e.printStackTrace(l.fatalError(e.getMessage())); + Functions.printStackTrace(e, l.fatalError(e.getMessage())); } catch (InterruptedException e) { - e.printStackTrace(l.fatalError("aborted")); + Functions.printStackTrace(e, l.fatalError("aborted")); } finally { stopTime = System.currentTimeMillis(); try { diff --git a/core/src/main/java/hudson/model/Build.java b/core/src/main/java/hudson/model/Build.java index a5dbcfcf1f1958afc9cdccb54d4074d326d84470..2b8b7649310e71250aa154dd81242833143dddb1 100644 --- a/core/src/main/java/hudson/model/Build.java +++ b/core/src/main/java/hudson/model/Build.java @@ -23,6 +23,7 @@ */ package hudson.model; +import hudson.Functions; import hudson.Launcher; import hudson.tasks.BuildStep; import hudson.tasks.BuildWrapper; @@ -195,7 +196,7 @@ public abstract class Build

      ,B extends Build> performAllBuildSteps(listener, project.getPublishersList(), false); performAllBuildSteps(listener, project.getProperties(), false); } catch (Exception x) { - x.printStackTrace(listener.error(Messages.Build_post_build_steps_failed())); + Functions.printStackTrace(x, listener.error(Messages.Build_post_build_steps_failed())); } super.cleanUp(listener); } diff --git a/core/src/main/java/hudson/model/ChoiceParameterDefinition.java b/core/src/main/java/hudson/model/ChoiceParameterDefinition.java index 964d05a214281871518eda61469d219787fb2bd1..f175bd001bd0fe08228eb0266fd764c3e4702f32 100644 --- a/core/src/main/java/hudson/model/ChoiceParameterDefinition.java +++ b/core/src/main/java/hudson/model/ChoiceParameterDefinition.java @@ -105,7 +105,7 @@ public class ChoiceParameterDefinition extends SimpleParameterDefinition { } /** - * Checks if parameterised build choices are valid. + * Checks if parameterized build choices are valid. */ public FormValidation doCheckChoices(@QueryParameter String value) { if (ChoiceParameterDefinition.areValidChoices(value)) { diff --git a/core/src/main/java/hudson/model/Computer.java b/core/src/main/java/hudson/model/Computer.java index 00f52e197c8b6cb80fe3b75b1fba8a4a4f202a13..3b87e42f239a1c0fff0f5c1799d6237645b5f751 100644 --- a/core/src/main/java/hudson/model/Computer.java +++ b/core/src/main/java/hudson/model/Computer.java @@ -25,8 +25,6 @@ */ package hudson.model; -import edu.umd.cs.findbugs.annotations.OverrideMustInvoke; -import edu.umd.cs.findbugs.annotations.When; import hudson.EnvVars; import hudson.Extension; import hudson.Launcher.ProcStarter; @@ -88,6 +86,7 @@ import org.kohsuke.stapler.export.ExportedBean; import org.kohsuke.args4j.Option; import org.kohsuke.stapler.interceptor.RequirePOST; +import javax.annotation.OverridingMethodsMustInvokeSuper; import javax.annotation.concurrent.GuardedBy; import javax.servlet.ServletException; @@ -191,7 +190,7 @@ public /*transient*/ abstract class Computer extends Actionable implements Acces protected final Object statusChangeLock = new Object(); /** - * Keeps track of stack traces to track the tremination requests for this computer. + * Keeps track of stack traces to track the termination requests for this computer. * * @since 1.607 * @see Executor#resetWorkUnit(String) @@ -269,13 +268,6 @@ public /*transient*/ abstract class Computer extends Actionable implements Acces return Collections.unmodifiableList(result); } - @SuppressWarnings("deprecation") - @Override - public void addAction(Action a) { - if(a==null) throw new IllegalArgumentException(); - super.getActions().add(a); - } - /** * This is where the log from the remote agent goes. * The method also creates a log directory if required. @@ -786,7 +778,7 @@ public /*transient*/ abstract class Computer extends Actionable implements Acces } public RunList getBuilds() { - return new RunList(Jenkins.getInstance().getAllItems(Job.class)).node(getNode()); + return RunList.fromJobs(Jenkins.getInstance().allItems(Job.class)).node(getNode()); } /** @@ -862,7 +854,20 @@ public /*transient*/ abstract class Computer extends Actionable implements Acces protected void onRemoved(){ } - private synchronized void setNumExecutors(int n) { + /** + * Calling path, *means protected by Queue.withLock + * + * Computer.doConfigSubmit -> Computer.replaceBy ->Jenkins.setNodes* ->Computer.setNode + * AbstractCIBase.updateComputerList->Computer.inflictMortalWound* + * AbstractCIBase.updateComputerList->AbstractCIBase.updateComputer* ->Computer.setNode + * AbstractCIBase.updateComputerList->AbstractCIBase.killComputer->Computer.kill + * Computer.constructor->Computer.setNode + * Computer.kill is called after numExecutors set to zero(Computer.inflictMortalWound) so not need the Queue.lock + * + * @param number of executors + */ + @GuardedBy("hudson.model.Queue.lock") + private void setNumExecutors(int n) { this.numExecutors = n; final int diff = executors.size()-n; @@ -1105,8 +1110,10 @@ public /*transient*/ abstract class Computer extends Actionable implements Acces @Exported(inline=true) public Map getMonitorData() { Map r = new HashMap(); - for (NodeMonitor monitor : NodeMonitor.getAll()) - r.put(monitor.getClass().getName(),monitor.data(this)); + if (hasPermission(CONNECT)) { + for (NodeMonitor monitor : NodeMonitor.getAll()) + r.put(monitor.getClass().getName(), monitor.data(this)); + } return r; } @@ -1267,7 +1274,7 @@ public /*transient*/ abstract class Computer extends Actionable implements Acces * and then it would need to be loaded, which pulls in {@link Jenkins} and loads that * and then that fails to load as you are not supposed to do that. Another option * would be to export the logger over remoting, with increased complexity as a result. - * Instead we just use a loger based on this class name and prevent any references to + * Instead we just use a logger based on this class name and prevent any references to * other classes from being transferred over remoting. */ private static final Logger LOGGER = Logger.getLogger(ListPossibleNames.class.getName()); @@ -1365,19 +1372,19 @@ public /*transient*/ abstract class Computer extends Actionable implements Acces checkPermission(Jenkins.ADMINISTER); rsp.setContentType("text/plain"); - PrintWriter w = new PrintWriter(rsp.getCompressedWriter(req)); - VirtualChannel vc = getChannel(); - if (vc instanceof Channel) { - w.println("Master to slave"); - ((Channel)vc).dumpExportTable(w); - w.flush(); // flush here once so that even if the dump from the agent fails, the client gets some useful info - - w.println("\n\n\nSlave to master"); - w.print(vc.call(new DumpExportTableTask())); - } else { - w.println(Messages.Computer_BadChannel()); + try (PrintWriter w = new PrintWriter(rsp.getCompressedWriter(req))) { + VirtualChannel vc = getChannel(); + if (vc instanceof Channel) { + w.println("Master to slave"); + ((Channel) vc).dumpExportTable(w); + w.flush(); // flush here once so that even if the dump from the agent fails, the client gets some useful info + + w.println("\n\n\nSlave to master"); + w.print(vc.call(new DumpExportTableTask())); + } else { + w.println(Messages.Computer_BadChannel()); + } } - w.close(); } private static final class DumpExportTableTask extends MasterToSlaveCallable { @@ -1534,7 +1541,7 @@ public /*transient*/ abstract class Computer extends Actionable implements Acces * @see hudson.slaves.RetentionStrategy#isAcceptingTasks(Computer) * @see hudson.model.Node#isAcceptingTasks() */ - @OverrideMustInvoke(When.ANYTIME) + @OverridingMethodsMustInvokeSuper public boolean isAcceptingTasks() { final Node node = getNode(); return getRetentionStrategy().isAcceptingTasks(this) && (node == null || node.isAcceptingTasks()); diff --git a/core/src/main/java/hudson/model/ComputerSet.java b/core/src/main/java/hudson/model/ComputerSet.java index 89ed31f289741f3993af35a3659c83c4b0d2e43b..b907420b5876a4ce5d34f930e228c7ea89585fab 100644 --- a/core/src/main/java/hudson/model/ComputerSet.java +++ b/core/src/main/java/hudson/model/ComputerSet.java @@ -413,7 +413,7 @@ public final class ComputerSet extends AbstractModelObject implements Describabl /** * @return The list of strings of computer names (excluding master) - * @since TODO + * @since 2.14 */ @Nonnull public static List getComputerNames() { diff --git a/core/src/main/java/hudson/model/DependencyGraph.java b/core/src/main/java/hudson/model/DependencyGraph.java index 41327d009d337140fc56d058ede288abc286aae7..237eba1b40f50ad180a722999aca36a9559b94f9 100644 --- a/core/src/main/java/hudson/model/DependencyGraph.java +++ b/core/src/main/java/hudson/model/DependencyGraph.java @@ -91,7 +91,7 @@ public class DependencyGraph implements Comparator { SecurityContext saveCtx = ACL.impersonate(ACL.SYSTEM); try { this.computationalData = new HashMap, Object>(); - for( AbstractProject p : getAllProjects() ) + for( AbstractProject p : Jenkins.getInstance().allItems(AbstractProject.class) ) p.buildDependencyGraph(this); forward = finalize(forward); @@ -147,10 +147,6 @@ public class DependencyGraph implements Comparator { topologicallySorted = Collections.unmodifiableList(topologicallySorted); } - Collection getAllProjects() { - return Jenkins.getInstance().getAllItems(AbstractProject.class); - } - /** * Special constructor for creating an empty graph */ diff --git a/core/src/main/java/hudson/model/Descriptor.java b/core/src/main/java/hudson/model/Descriptor.java index 9987613407a2be01e02e3f2454c762013170ab3c..2cccca37652a4c396fa60da5118fb055dc04beda 100644 --- a/core/src/main/java/hudson/model/Descriptor.java +++ b/core/src/main/java/hudson/model/Descriptor.java @@ -39,6 +39,7 @@ import hudson.views.ListViewColumn; import jenkins.model.GlobalConfiguration; import jenkins.model.GlobalConfigurationCategory; import jenkins.model.Jenkins; +import jenkins.util.io.OnMaster; import net.sf.json.JSONArray; import net.sf.json.JSONObject; import org.kohsuke.stapler.*; @@ -126,7 +127,7 @@ import javax.annotation.Nullable; * @author Kohsuke Kawaguchi * @see Describable */ -public abstract class Descriptor> implements Saveable { +public abstract class Descriptor> implements Saveable, OnMaster { /** * The class being described by this descriptor. */ @@ -200,11 +201,11 @@ public abstract class Descriptor> implements Saveable { public Descriptor getItemTypeDescriptorOrDie() { Class it = getItemType(); if (it == null) { - throw new AssertionError(clazz + " is not an array/collection type in " + displayName + ". See https://wiki.jenkins-ci.org/display/JENKINS/My+class+is+missing+descriptor"); + throw new AssertionError(clazz + " is not an array/collection type in " + displayName + ". See https://jenkins.io/redirect/developer/class-is-missing-descriptor"); } Descriptor d = Jenkins.getInstance().getDescriptor(it); if (d==null) - throw new AssertionError(it +" is missing its descriptor in "+displayName+". See https://wiki.jenkins-ci.org/display/JENKINS/My+class+is+missing+descriptor"); + throw new AssertionError(it +" is missing its descriptor in "+displayName+". See https://jenkins.io/redirect/developer/class-is-missing-descriptor"); return d; } @@ -456,7 +457,7 @@ public abstract class Descriptor> implements Saveable { } /** - * Used by Jelly to abstract away the handlign of global.jelly vs config.jelly databinding difference. + * Used by Jelly to abstract away the handling of global.jelly vs config.jelly databinding difference. */ public @CheckForNull PropertyType getPropertyType(@Nonnull Object instance, @Nonnull String field) { // in global.jelly, instance==descriptor @@ -639,7 +640,13 @@ public abstract class Descriptor> implements Saveable { if (isApplicable(actualType, json)) { LOGGER.log(Level.FINE, "switching to newInstance {0} {1}", new Object[] {actualType.getName(), json}); try { - return Jenkins.getActiveInstance().getDescriptor(actualType).newInstance(Stapler.getCurrentRequest(), json); + final Descriptor descriptor = Jenkins.getActiveInstance().getDescriptor(actualType); + if (descriptor != null) { + return descriptor.newInstance(Stapler.getCurrentRequest(), json); + } else { + LOGGER.log(Level.WARNING, "Descriptor not found. Falling back to default instantiation " + + actualType.getName() + " " + json); + } } catch (Exception x) { LOGGER.log(Level.WARNING, "falling back to default instantiation " + actualType.getName() + " " + json, x); // If nested objects are not using newInstance, bindJSON will wind up throwing the same exception anyway, @@ -786,7 +793,7 @@ public abstract class Descriptor> implements Saveable { /** * Invoked when the global configuration page is submitted. * - * Can be overriden to store descriptor-specific information. + * Can be overridden to store descriptor-specific information. * * @param json * The JSON object that captures the configuration data for this {@link Descriptor}. @@ -812,7 +819,7 @@ public abstract class Descriptor> implements Saveable { * * @return never null, always the same value for a given instance of {@link Descriptor}. * - * @since TODO, used to be in {@link GlobalConfiguration} before that. + * @since 2.0, used to be in {@link GlobalConfiguration} before that. */ public GlobalConfigurationCategory getCategory() { return GlobalConfigurationCategory.get(GlobalConfigurationCategory.Unclassified.class); @@ -1139,7 +1146,7 @@ public abstract class Descriptor> implements Saveable { .generateResponse(req, rsp, node); } else { // for now, we can't really use the field name that caused the problem. - new Failure(getMessage()).generateResponse(req,rsp,node); + new Failure(getMessage()).generateResponse(req,rsp,node,getCause()); } } } diff --git a/core/src/main/java/hudson/model/DirectoryBrowserSupport.java b/core/src/main/java/hudson/model/DirectoryBrowserSupport.java index bf7885030d9bfa4e2df45ecba8143ece0bc8c86a..418efca8793d95d37b2962283ba2fbfe8a610ab0 100644 --- a/core/src/main/java/hudson/model/DirectoryBrowserSupport.java +++ b/core/src/main/java/hudson/model/DirectoryBrowserSupport.java @@ -223,8 +223,7 @@ public final class DirectoryBrowserSupport implements HttpResponse { } if (plain) { rsp.setContentType("text/plain;charset=UTF-8"); - OutputStream os = rsp.getOutputStream(); - try { + try (OutputStream os = rsp.getOutputStream()) { for (VirtualFile kid : baseFile.list()) { os.write(kid.getName().getBytes("UTF-8")); if (kid.isDirectory()) { @@ -233,8 +232,6 @@ public final class DirectoryBrowserSupport implements HttpResponse { os.write('\n'); } os.flush(); - } finally { - os.close(); } return; } @@ -356,33 +353,33 @@ public final class DirectoryBrowserSupport implements HttpResponse { } private static void zip(OutputStream outputStream, VirtualFile dir, String glob) throws IOException { - ZipOutputStream zos = new ZipOutputStream(outputStream); - zos.setEncoding(System.getProperty("file.encoding")); // TODO JENKINS-20663 make this overridable via query parameter - for (String n : dir.list(glob.length() == 0 ? "**" : glob)) { - String relativePath; - if (glob.length() == 0) { - // JENKINS-19947: traditional behavior is to prepend the directory name - relativePath = dir.getName() + '/' + n; - } else { - relativePath = n; - } - // In ZIP archives "All slashes MUST be forward slashes" (http://pkware.com/documents/casestudies/APPNOTE.TXT) - // TODO On Linux file names can contain backslashes which should not treated as file separators. - // Unfortunately, only the file separator char of the master is known (File.separatorChar) - // but not the file separator char of the (maybe remote) "dir". - ZipEntry e = new ZipEntry(relativePath.replace('\\', '/')); - VirtualFile f = dir.child(n); - e.setTime(f.lastModified()); - zos.putNextEntry(e); - InputStream in = f.open(); - try { - Util.copyStream(in, zos); - } finally { - IOUtils.closeQuietly(in); + try (ZipOutputStream zos = new ZipOutputStream(outputStream)) { + zos.setEncoding(System.getProperty("file.encoding")); // TODO JENKINS-20663 make this overridable via query parameter + for (String n : dir.list(glob.length() == 0 ? "**" : glob)) { + String relativePath; + if (glob.length() == 0) { + // JENKINS-19947: traditional behavior is to prepend the directory name + relativePath = dir.getName() + '/' + n; + } else { + relativePath = n; + } + // In ZIP archives "All slashes MUST be forward slashes" (http://pkware.com/documents/casestudies/APPNOTE.TXT) + // TODO On Linux file names can contain backslashes which should not treated as file separators. + // Unfortunately, only the file separator char of the master is known (File.separatorChar) + // but not the file separator char of the (maybe remote) "dir". + ZipEntry e = new ZipEntry(relativePath.replace('\\', '/')); + VirtualFile f = dir.child(n); + e.setTime(f.lastModified()); + zos.putNextEntry(e); + InputStream in = f.open(); + try { + Util.copyStream(in, zos); + } finally { + IOUtils.closeQuietly(in); + } + zos.closeEntry(); } - zos.closeEntry(); } - zos.close(); } /** diff --git a/core/src/main/java/hudson/model/DownloadService.java b/core/src/main/java/hudson/model/DownloadService.java index 69e8dcbf9e0a3de5a4836caf13a32c2e2249caa3..d7fda884aa14fe32ec95debadd76c6bd2455f5a1 100644 --- a/core/src/main/java/hudson/model/DownloadService.java +++ b/core/src/main/java/hudson/model/DownloadService.java @@ -70,6 +70,11 @@ import org.kohsuke.stapler.StaplerResponse; */ @Extension public class DownloadService extends PageDecorator { + + /** + * the prefix for the signature validator name + */ + private static final String signatureValidatorPrefix = "downloadable"; /** * Builds up an HTML fragment that starts all the download jobs. */ @@ -163,8 +168,7 @@ public class DownloadService extends PageDecorator { */ @Restricted(NoExternalUse.class) public static String loadJSON(URL src) throws IOException { - InputStream is = ProxyConfiguration.open(src).getInputStream(); - try { + try (InputStream is = ProxyConfiguration.open(src).getInputStream()) { String jsonp = IOUtils.toString(is, "UTF-8"); int start = jsonp.indexOf('{'); int end = jsonp.lastIndexOf('}'); @@ -173,8 +177,6 @@ public class DownloadService extends PageDecorator { } else { throw new IOException("Could not find JSON in " + src); } - } finally { - is.close(); } } @@ -186,8 +188,7 @@ public class DownloadService extends PageDecorator { */ @Restricted(NoExternalUse.class) public static String loadJSONHTML(URL src) throws IOException { - InputStream is = ProxyConfiguration.open(src).getInputStream(); - try { + try (InputStream is = ProxyConfiguration.open(src).getInputStream()) { String jsonp = IOUtils.toString(is, "UTF-8"); String preamble = "window.parent.postMessage(JSON.stringify("; int start = jsonp.indexOf(preamble); @@ -197,8 +198,6 @@ public class DownloadService extends PageDecorator { } else { throw new IOException("Could not find JSON in " + src); } - } finally { - is.close(); } } @@ -397,7 +396,11 @@ public class DownloadService extends PageDecorator { public FormValidation updateNow() throws IOException { List jsonList = new ArrayList<>(); boolean toolInstallerMetadataExists = false; - for (String site : getUrls()) { + for (UpdateSite updatesite : Jenkins.getActiveInstance().getUpdateCenter().getSiteList()) { + String site = updatesite.getMetadataUrlForDownloadable(url); + if (site == null) { + return FormValidation.warning("The update site " + site + " does not look like an update center"); + } String jsonString; try { jsonString = loadJSONHTML(new URL(site + ".html?id=" + URLEncoder.encode(getId(), "UTF-8") + "&version=" + URLEncoder.encode(Jenkins.VERSION, "UTF-8"))); @@ -408,7 +411,7 @@ public class DownloadService extends PageDecorator { } JSONObject o = JSONObject.fromObject(jsonString); if (signatureCheck) { - FormValidation e = new JSONSignatureValidator("downloadable '"+id+"'").verifySignature(o); + FormValidation e = updatesite.getJsonSignatureValidator(signatureValidatorPrefix +" '"+id+"'").verifySignature(o); if (e.kind!= Kind.OK) { LOGGER.log(Level.WARNING, "signature check failed for " + site, e ); continue; diff --git a/core/src/main/java/hudson/model/Executor.java b/core/src/main/java/hudson/model/Executor.java index df27abaab76e34428ccd7a6acc93688e9708df8f..83345726be0ba8f4cb65f9702d73fbe2fecbc9da 100644 --- a/core/src/main/java/hudson/model/Executor.java +++ b/core/src/main/java/hudson/model/Executor.java @@ -24,6 +24,7 @@ package hudson.model; import hudson.FilePath; +import hudson.Functions; import hudson.Util; import hudson.model.Queue.Executable; import hudson.model.queue.Executables; @@ -282,19 +283,16 @@ public class Executor extends Thread implements ModelObject { */ private void resetWorkUnit(String reason) { StringWriter writer = new StringWriter(); - PrintWriter pw = new PrintWriter(writer); - try { + try (PrintWriter pw = new PrintWriter(writer)) { pw.printf("%s grabbed %s from queue but %s %s. ", getName(), workUnit, owner.getDisplayName(), reason); if (owner.getTerminatedBy().isEmpty()) { pw.print("No termination trace available."); } else { pw.println("Termination trace follows:"); - for (Computer.TerminationRequest request: owner.getTerminatedBy()) { - request.printStackTrace(pw); + for (Computer.TerminationRequest request : owner.getTerminatedBy()) { + Functions.printStackTrace(request, pw); } } - } finally { - pw.close(); } LOGGER.log(WARNING, writer.toString()); lock.writeLock().lock(); @@ -392,6 +390,9 @@ public class Executor extends Thread implements ModelObject { } if (executable instanceof Actionable) { + if (LOGGER.isLoggable(Level.FINER)) { + LOGGER.log(FINER, "when running {0} from {1} we are copying {2} actions whereas the item currently has {3}", new Object[] {executable, workUnit.context.item, workUnit.context.actions, workUnit.context.item.getAllActions()}); + } for (Action action: workUnit.context.actions) { ((Actionable) executable).addAction(action); } diff --git a/core/src/main/java/hudson/model/Failure.java b/core/src/main/java/hudson/model/Failure.java index fa948901997dc6930271206810b7ffa0da30d83f..37fc2696b54291acebf80ece0a18af4ddcd6d83f 100644 --- a/core/src/main/java/hudson/model/Failure.java +++ b/core/src/main/java/hudson/model/Failure.java @@ -28,6 +28,7 @@ import org.kohsuke.stapler.HttpResponse; import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerResponse; +import javax.annotation.CheckForNull; import javax.servlet.ServletException; import java.io.IOException; @@ -54,6 +55,13 @@ public class Failure extends RuntimeException implements HttpResponse { this.pre = pre; } + public void generateResponse(StaplerRequest req, StaplerResponse rsp, Object node, @CheckForNull Throwable throwable) throws IOException, ServletException { + if (throwable != null) { + req.setAttribute("exception", throwable); + } + generateResponse(req, rsp, node); + } + public void generateResponse(StaplerRequest req, StaplerResponse rsp, Object node) throws IOException, ServletException { req.setAttribute("message",getMessage()); if(pre) diff --git a/core/src/main/java/hudson/model/FileParameterValue.java b/core/src/main/java/hudson/model/FileParameterValue.java index 930eb41fd8ae4d7d0ca8c0c28ae9b6540cbad91b..16777ea6bed9c7d0c26b920f84596cb4e0f86f99 100644 --- a/core/src/main/java/hudson/model/FileParameterValue.java +++ b/core/src/main/java/hudson/model/FileParameterValue.java @@ -163,7 +163,7 @@ public class FileParameterValue extends ParameterValue { /** * Compares file parameters (existing files will be considered as different). - * @since 1.586 Function has been modified in order to avoid JENKINS-19017 issue (wrong merge of builds in the queue). + * @since 1.586 Function has been modified in order to avoid JENKINS-19017 issue (wrong merge of builds in the queue). */ @Override public boolean equals(Object obj) { @@ -266,11 +266,8 @@ public class FileParameterValue extends ParameterValue { public byte[] get() { try { - FileInputStream inputStream = new FileInputStream(file); - try { + try (FileInputStream inputStream = new FileInputStream(file)) { return IOUtils.toByteArray(inputStream); - } finally { - inputStream.close(); } } catch (IOException e) { throw new Error(e); diff --git a/core/src/main/java/hudson/model/FingerprintCleanupThread.java b/core/src/main/java/hudson/model/FingerprintCleanupThread.java index 10716d073f761bbd125be8ade55289a21d355908..59187a3a400630e63968c886541652f8c439e7b4 100644 --- a/core/src/main/java/hudson/model/FingerprintCleanupThread.java +++ b/core/src/main/java/hudson/model/FingerprintCleanupThread.java @@ -25,6 +25,7 @@ package hudson.model; import hudson.Extension; import hudson.ExtensionList; +import hudson.Functions; import jenkins.model.Jenkins; import org.jenkinsci.Symbol; @@ -113,7 +114,7 @@ public final class FingerprintCleanupThread extends AsyncPeriodicWork { return fp.trim(); } } catch (IOException e) { - e.printStackTrace(listener.error("Failed to process " + fingerprintFile)); + Functions.printStackTrace(e, listener.error("Failed to process " + fingerprintFile)); return false; } } diff --git a/core/src/main/java/hudson/model/FreeStyleProject.java b/core/src/main/java/hudson/model/FreeStyleProject.java index ed7b3252388147b4e880c7ac672693cfdf0899cb..aecfc5cba22d7e1451b0f50a106ecb4fbabf157f 100644 --- a/core/src/main/java/hudson/model/FreeStyleProject.java +++ b/core/src/main/java/hudson/model/FreeStyleProject.java @@ -25,6 +25,8 @@ package hudson.model; import hudson.Extension; import jenkins.model.Jenkins; +import org.jenkins.ui.icon.Icon; +import org.jenkins.ui.icon.IconSet; import org.jenkinsci.Symbol; import jenkins.model.item_category.StandaloneProjectsCategory; import org.kohsuke.accmod.Restricted; @@ -97,5 +99,16 @@ public class FreeStyleProject extends Project i return (Jenkins.RESOURCE_PATH + "/images/:size/freestyleproject.png").replaceFirst("^/", ""); } + @Override + public String getIconClassName() { + return "icon-freestyle-project"; + } + + static { + IconSet.icons.addIcon(new Icon("icon-freestyle-project icon-sm", "16x16/freestyleproject.png", Icon.ICON_SMALL_STYLE)); + IconSet.icons.addIcon(new Icon("icon-freestyle-project icon-md", "24x24/freestyleproject.png", Icon.ICON_MEDIUM_STYLE)); + IconSet.icons.addIcon(new Icon("icon-freestyle-project icon-lg", "32x32/freestyleproject.png", Icon.ICON_LARGE_STYLE)); + IconSet.icons.addIcon(new Icon("icon-freestyle-project icon-xlg", "48x48/freestyleproject.png", Icon.ICON_XLARGE_STYLE)); + } } } diff --git a/core/src/main/java/hudson/model/Item.java b/core/src/main/java/hudson/model/Item.java index 6706f2b492a372c87d91af73ccf38dc7faa4b639..b0e21af7908ab58bcc1b535ebd2eb9993a45e81c 100644 --- a/core/src/main/java/hudson/model/Item.java +++ b/core/src/main/java/hudson/model/Item.java @@ -27,6 +27,7 @@ package hudson.model; import hudson.Functions; import jenkins.util.SystemProperties; import hudson.security.PermissionScope; +import jenkins.util.io.OnMaster; import org.kohsuke.stapler.StaplerRequest; import java.io.IOException; @@ -67,7 +68,7 @@ import hudson.util.Secret; * @see Items * @see ItemVisitor */ -public interface Item extends PersistenceRoot, SearchableModelObject, AccessControlled { +public interface Item extends PersistenceRoot, SearchableModelObject, AccessControlled, OnMaster { /** * Gets the parent that contains this item. */ @@ -230,7 +231,7 @@ public interface Item extends PersistenceRoot, SearchableModelObject, AccessCont Permission DISCOVER = new Permission(PERMISSIONS, "Discover", Messages._AbstractProject_DiscoverPermission_Description(), READ, PermissionScope.ITEM); /** * Ability to view configuration details. - * If the user lacks {@link CONFIGURE} then any {@link Secret}s must be masked out, even in encrypted form. + * If the user lacks {@link #CONFIGURE} then any {@link Secret}s must be masked out, even in encrypted form. * @see Secret#ENCRYPTED_VALUE_PATTERN */ Permission EXTENDED_READ = new Permission(PERMISSIONS,"ExtendedRead", Messages._AbstractProject_ExtendedReadPermission_Description(), CONFIGURE, SystemProperties.getBoolean("hudson.security.ExtendedReadPermission"), new PermissionScope[]{PermissionScope.ITEM}); diff --git a/core/src/main/java/hudson/model/ItemGroupMixIn.java b/core/src/main/java/hudson/model/ItemGroupMixIn.java index 3ec7d8fa5cc24d902d290fc3494bc7238859f62c..59d5394f00d36d4a116bc84c91b4367aedec1151 100644 --- a/core/src/main/java/hudson/model/ItemGroupMixIn.java +++ b/core/src/main/java/hudson/model/ItemGroupMixIn.java @@ -234,6 +234,7 @@ public abstract class ItemGroupMixIn { } src.getDescriptor().checkApplicableIn(parent); acl.getACL().checkCreatePermission(parent, src.getDescriptor()); + ItemListener.checkBeforeCopy(src, parent); T result = (T)createProject(src.getDescriptor(),name,false); @@ -260,10 +261,7 @@ public abstract class ItemGroupMixIn { acl.checkPermission(Item.CREATE); Jenkins.getInstance().getProjectNamingStrategy().checkName(name); - if (parent.getItem(name) != null) { - throw new IllegalArgumentException(parent.getDisplayName() + " already contains an item '" + name + "'"); - } - // TODO what if we have no DISCOVER permission on the existing job? + Items.verifyItemDoesNotAlreadyExist(parent, name, null); // place it as config.xml File configXml = Items.getConfigFile(getRootDirFor(name)).getFile(); @@ -316,9 +314,7 @@ public abstract class ItemGroupMixIn { acl.getACL().checkCreatePermission(parent, type); Jenkins.getInstance().getProjectNamingStrategy().checkName(name); - if(parent.getItem(name)!=null) - throw new IllegalArgumentException("Project of the name "+name+" already exists"); - // TODO problem with DISCOVER as noted above + Items.verifyItemDoesNotAlreadyExist(parent, name, null); TopLevelItem item = type.newInstance(parent, name); try { diff --git a/core/src/main/java/hudson/model/Items.java b/core/src/main/java/hudson/model/Items.java index e828527ec10712c694001d159a761dd8653a4a92..927abc72e0bbe5e658d85c3eb14214b90fcbfbf6 100644 --- a/core/src/main/java/hudson/model/Items.java +++ b/core/src/main/java/hudson/model/Items.java @@ -30,29 +30,30 @@ import hudson.XmlFile; import hudson.model.listeners.ItemListener; import hudson.remoting.Callable; import hudson.security.ACL; +import hudson.security.ACLContext; import hudson.security.AccessControlled; import hudson.triggers.Trigger; import hudson.util.DescriptorList; import hudson.util.EditDistance; import hudson.util.XStream2; -import jenkins.model.Jenkins; -import org.acegisecurity.Authentication; -import org.apache.commons.lang.StringUtils; - import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Comparator; +import java.util.Iterator; import java.util.List; +import java.util.NoSuchElementException; import java.util.Stack; import java.util.StringTokenizer; import javax.annotation.CheckForNull; import javax.annotation.Nonnull; - import jenkins.model.DirectlyModifiableTopLevelItemGroup; +import jenkins.model.Jenkins; +import org.acegisecurity.Authentication; import org.apache.commons.io.FileUtils; +import org.apache.commons.lang.StringUtils; /** * Convenience methods related to {@link Item}. @@ -79,6 +80,44 @@ public class Items { return false; } }; + /** + * A comparator of {@link Item} instances that uses a case-insensitive comparison of {@link Item#getName()}. + * If you are replacing {@link #getAllItems(ItemGroup, Class)} with {@link #allItems(ItemGroup, Class)} and + * need to restore the sort order of a further filtered result, you probably want {@link #BY_FULL_NAME}. + * + * @since 2.37 + */ + public static final Comparator BY_NAME = new Comparator() { + @Override public int compare(Item i1, Item i2) { + return name(i1).compareToIgnoreCase(name(i2)); + } + + String name(Item i) { + String n = i.getName(); + if (i instanceof ItemGroup) { + n += '/'; + } + return n; + } + }; + /** + * A comparator of {@link Item} instances that uses a case-insensitive comparison of {@link Item#getFullName()}. + * + * @since 2.37 + */ + public static final Comparator BY_FULL_NAME = new Comparator() { + @Override public int compare(Item i1, Item i2) { + return name(i1).compareToIgnoreCase(name(i2)); + } + + String name(Item i) { + String n = i.getFullName(); + if (i instanceof ItemGroup) { + n += '/'; + } + return n; + } + }; /** * Runs a block while making {@link #currentlyUpdatingByXml} be temporarily true. @@ -120,7 +159,7 @@ public class Items { * Returns all the registered {@link TopLevelItemDescriptor}s that the current security principal is allowed to * create within the specified item group. * - * @since TODO + * @since 1.607 */ public static List all(ItemGroup c) { return all(Jenkins.getAuthentication(), c); @@ -130,7 +169,7 @@ public class Items { * Returns all the registered {@link TopLevelItemDescriptor}s that the specified security principal is allowed to * create within the specified item group. * - * @since TODO + * @since 1.607 */ public static List all(Authentication a, ItemGroup c) { List result = new ArrayList(); @@ -350,7 +389,12 @@ public class Items { /** * Gets all the {@link Item}s recursively in the {@link ItemGroup} tree - * and filter them by the given type. + * and filter them by the given type. The returned list will represent a snapshot view of the items present at some + * time during the call. If items are moved during the call, depending on the move, it may be possible for some + * items to escape the snapshot entirely. + *

      + * If you do not need to iterate all items, or if the order of the items is not required, consider using + * {@link #allItems(ItemGroup, Class)} instead. * * @since 1.512 */ @@ -361,18 +405,8 @@ public class Items { } private static void getAllItems(final ItemGroup root, Class type, List r) { List items = new ArrayList(((ItemGroup) root).getItems()); - Collections.sort(items, new Comparator() { - @Override public int compare(Item i1, Item i2) { - return name(i1).compareToIgnoreCase(name(i2)); - } - String name(Item i) { - String n = i.getName(); - if (i instanceof ItemGroup) { - n += '/'; - } - return n; - } - }); + // because we add items depth first, we can use the quicker BY_NAME comparison + Collections.sort(items, BY_NAME); for (Item i : items) { if (type.isInstance(i)) { if (i.hasPermission(Item.READ)) { @@ -385,6 +419,41 @@ public class Items { } } + /** + * Gets a read-only view of all the {@link Item}s recursively in the {@link ItemGroup} tree visible to + * {@link Jenkins#getAuthentication()} without concern for the order in which items are returned. Each iteration + * of the view will be "live" reflecting the items available between the time the iteration was started and the + * time the iteration was completed, however if items are moved during an iteration - depending on the move - it + * may be possible for such items to escape the entire iteration. + * + * @param root the root. + * @param type the type. + * @param the type. + * @return An {@link Iterable} for all items. + * @since 2.37 + */ + public static Iterable allItems(ItemGroup root, Class type) { + return allItems(Jenkins.getAuthentication(), root, type); + } + + + /** + * Gets a read-only view all the {@link Item}s recursively in the {@link ItemGroup} tree visible to the supplied + * authentication without concern for the order in which items are returned. Each iteration + * of the view will be "live" reflecting the items available between the time the iteration was started and the + * time the iteration was completed, however if items are moved during an iteration - depending on the move - it + * may be possible for such items to escape the entire iteration. + * + * @param root the root. + * @param type the type. + * @param the type. + * @return An {@link Iterable} for all items. + * @since 2.37 + */ + public static Iterable allItems(Authentication authentication, ItemGroup root, Class type) { + return new AllItemsIterable<>(root, authentication, type); + } + /** * Finds an item whose name (when referenced from the specified context) is closest to the given name. * @param the type of item being considered @@ -395,10 +464,9 @@ public class Items { * @since 1.538 */ public static @CheckForNull T findNearest(Class type, String name, ItemGroup context) { - List projects = Jenkins.getInstance().getAllItems(type); - String[] names = new String[projects.size()]; - for (int i = 0; i < projects.size(); i++) { - names[i] = projects.get(i).getRelativeNameFrom(context); + List names = new ArrayList<>(); + for (T item: Jenkins.getInstance().allItems(type)) { + names.add(item.getRelativeNameFrom(context)); } String nearest = EditDistance.findNearest(name, names); return Jenkins.getInstance().getItem(nearest, context, type); @@ -425,9 +493,7 @@ public class Items { throw new IllegalArgumentException(); } String name = item.getName(); - if (destination.getItem(name) != null) { - throw new IllegalArgumentException(name + " already exists"); - } + verifyItemDoesNotAlreadyExist(destination, name, null); String oldFullName = item.getFullName(); // TODO AbstractItem.renameTo has a more baroque implementation; factor it out into a utility method perhaps? File destDir = destination.getRootDirFor(item); @@ -440,6 +506,145 @@ public class Items { return newItem; } + private static class AllItemsIterable implements Iterable { + + /** + * The authentication we are iterating as. + */ + private final Authentication authentication; + /** + * The root we are iterating from. + */ + private final ItemGroup root; + /** + * The type of item we want to return. + */ + private final Class type; + + private AllItemsIterable(ItemGroup root, Authentication authentication, Class type) { + this.root = root; + this.authentication = authentication; + this.type = type; + } + + /** + * {@inheritDoc} + */ + @Override + public Iterator iterator() { + return new AllItemsIterator(); + } + + private class AllItemsIterator implements Iterator { + + /** + * The stack of {@link ItemGroup}s that we have left to descend into. + */ + private final Stack stack = new Stack<>(); + /** + * The iterator of the current {@link ItemGroup} we are iterating. + */ + private Iterator delegate = null; + /** + * The next item. + */ + private T next = null; + + private AllItemsIterator() { + // put on the stack so that hasNext() is the only place that has to worry about authentication + // alternative would be to impersonate and populate delegate. + stack.push(root); + } + + /** + * {@inheritDoc} + */ + @Override + public void remove() { + throw new UnsupportedOperationException(); + } + + /** + * {@inheritDoc} + */ + @Override + public boolean hasNext() { + if (next != null) { + return true; + } + while (true) { + if (delegate == null || !delegate.hasNext()) { + if (stack.isEmpty()) { + return false; + } + ItemGroup group = stack.pop(); + // group.getItems() is responsible for performing the permission check so we will not repeat it + if (Jenkins.getAuthentication() == authentication) { + delegate = group.getItems().iterator(); + } else { + // slower path because the caller has switched authentication + // we need to keep the original authentication so that allItems() can be used + // like getAllItems() without the cost of building the entire list up front + try (ACLContext ctx = ACL.as(authentication)) { + delegate = group.getItems().iterator(); + } + } + } + while (delegate.hasNext()) { + Item item = delegate.next(); + if (item instanceof ItemGroup) { + stack.push((ItemGroup) item); + } + if (type.isInstance(item)) { + next = type.cast(item); + return true; + } + } + } + } + + /** + * {@inheritDoc} + */ + @Override + public T next() { + if (!hasNext()) { + throw new NoSuchElementException(); + } + try { + return next; + } finally { + next = null; + } + } + + } + } + + /** + * Securely check for the existence of an item before trying to create one with the same name. + * @param parent the folder where we are about to create/rename/move an item + * @param newName the proposed new name + * @param variant if not null, an existing item which we accept could be there + * @throws IllegalArgumentException if there is already something there, which you were supposed to know about + * @throws Failure if there is already something there but you should not be told details + */ + static void verifyItemDoesNotAlreadyExist(@Nonnull ItemGroup parent, @Nonnull String newName, @CheckForNull Item variant) throws IllegalArgumentException, Failure { + Item existing; + try (ACLContext ctxt = ACL.as(ACL.SYSTEM)) { + existing = parent.getItem(newName); + } + if (existing != null && existing != variant) { + if (existing.hasPermission(Item.DISCOVER)) { + String prefix = parent.getFullName(); + throw new IllegalArgumentException((prefix.isEmpty() ? "" : prefix + "/") + newName + " already exists"); + } else { + // Cannot hide its existence, so at least be as vague as possible. + throw new Failure(""); + } + } + } + /** * Used to load/save job configuration. * diff --git a/core/src/main/java/hudson/model/Job.java b/core/src/main/java/hudson/model/Job.java index f66ef21095704928fbef2b50fbfe5b57f4b7eb31..0612daa9f11c2c2426d0f49249f96d0035340dea 100644 --- a/core/src/main/java/hudson/model/Job.java +++ b/core/src/main/java/hudson/model/Job.java @@ -128,7 +128,7 @@ import static javax.servlet.http.HttpServletResponse.SC_NO_CONTENT; * @author Kohsuke Kawaguchi */ public abstract class Job, RunT extends Run> - extends AbstractItem implements ExtensionPoint, StaplerOverridable, ModelObjectWithChildren, OnMaster { + extends AbstractItem implements ExtensionPoint, StaplerOverridable, ModelObjectWithChildren { private static final Logger LOGGER = Logger.getLogger(Job.class.getName()); @@ -568,7 +568,7 @@ public abstract class Job, RunT extends Run T getProperty(Class clazz) { @@ -698,7 +698,7 @@ public abstract class Job, RunT extends Run getBuilds() { - return RunList.fromRuns(_getRuns().values()); + return RunList.fromRuns(_getRuns().values()); } /** @@ -730,7 +730,7 @@ public abstract class Job, RunT extends Run getBuildsAsMap() { - return Collections.unmodifiableSortedMap(_getRuns()); + return Collections.unmodifiableSortedMap(_getRuns()); } /** @@ -1224,28 +1224,27 @@ public abstract class Job, RunT extends Run, JobPropertyDescriptor> t = new DescribableList, JobPropertyDescriptor>(NOOP,getAllProperties()); - JSONObject jsonProperties = json.optJSONObject("properties"); - if (jsonProperties != null) { - //This handles the situation when Parameterized build checkbox is checked but no parameters are selected. User will be redirected to an error page with proper error message. - Job.checkForEmptyParameters(jsonProperties); - t.rebuild(req,jsonProperties,JobPropertyDescriptor.getPropertyDescriptors(Job.this.getClass())); - } else { - t.clear(); - } - properties.clear(); - for (JobProperty p : t) { - p.setOwner(this); - properties.add(p); - } - - submit(req, rsp); + DescribableList, JobPropertyDescriptor> t = new DescribableList, JobPropertyDescriptor>(NOOP,getAllProperties()); + JSONObject jsonProperties = json.optJSONObject("properties"); + if (jsonProperties != null) { + t.rebuild(req,jsonProperties,JobPropertyDescriptor.getPropertyDescriptors(Job.this.getClass())); + } else { + t.clear(); + } + properties.clear(); + for (JobProperty p : t) { + p.setOwner(this); + properties.add(p); + } - save(); + submit(req, rsp); + bc.commit(); + } ItemListener.fireOnUpdated(this); String newName = req.getParameter("name"); @@ -1537,18 +1536,4 @@ public abstract class Job, RunT extends Run> { Class applicable = Types.erasure(Types.getTypeArgument(pt, 0)); return applicable.isAssignableFrom(jobType); } else { - throw new AssertionError(clazz+" doesn't properly parameterize JobProperty. The isApplicable() method must be overriden."); + throw new AssertionError(clazz+" doesn't properly parameterize JobProperty. The isApplicable() method must be overridden."); } } diff --git a/core/src/main/java/hudson/model/Label.java b/core/src/main/java/hudson/model/Label.java index 74a9fa6901619b4e5cc581aae998d1e50e439c5b..f66b0f75bdbd9c776e9293a733dda9a69c502ab3 100644 --- a/core/src/main/java/hudson/model/Label.java +++ b/core/src/main/java/hudson/model/Label.java @@ -56,11 +56,11 @@ import org.kohsuke.stapler.export.ExportedBean; import java.io.StringReader; import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; -import java.util.Collection; import java.util.Stack; import java.util.TreeSet; @@ -362,10 +362,11 @@ public abstract class Label extends Actionable implements Comparable

      - * This class provides a few hooks to augument the HTML generation process of Hudson, across + * This class provides a few hooks to augment the HTML generation process of Hudson, across * all the HTML pages that Hudson delivers. * *

      diff --git a/core/src/main/java/hudson/model/ParameterDefinition.java b/core/src/main/java/hudson/model/ParameterDefinition.java index 20250924d909dd408ed556da1dc8552d42a3a15e..23d37bd405370bcf7034213e3d6475cb1394ea89 100644 --- a/core/src/main/java/hudson/model/ParameterDefinition.java +++ b/core/src/main/java/hudson/model/ParameterDefinition.java @@ -79,7 +79,7 @@ import org.kohsuke.stapler.export.ExportedBean; * through XStream. * * - *

      Assocaited Views

      + *

      Associated Views

      *

      config.jelly

      *

      * {@link ParameterDefinition} class uses config.jelly to contribute a form diff --git a/core/src/main/java/hudson/model/ParameterValue.java b/core/src/main/java/hudson/model/ParameterValue.java index d3b39f614a3678c5e2c8a1cd8dd79e76180382c4..f19f21a963b36ba0bbddc80046312fc4949305af 100644 --- a/core/src/main/java/hudson/model/ParameterValue.java +++ b/core/src/main/java/hudson/model/ParameterValue.java @@ -31,11 +31,17 @@ import hudson.scm.SCM; import hudson.tasks.BuildWrapper; import hudson.tasks.Builder; import hudson.util.VariableResolver; +import java.io.IOException; import java.io.Serializable; import java.util.Map; +import java.util.logging.Logger; +import javax.annotation.CheckForNull; +import jenkins.model.Jenkins; import net.sf.json.JSONObject; +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.DoNotUse; import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.export.Exported; @@ -70,6 +76,9 @@ import org.kohsuke.stapler.export.ExportedBean; */ @ExportedBean(defaultVisibility=3) public abstract class ParameterValue implements Serializable { + + private static final Logger LOGGER = Logger.getLogger(ParameterValue.class.getName()); + protected final String name; private String description; @@ -91,6 +100,16 @@ public abstract class ParameterValue implements Serializable { this.description = description; } + @Restricted(DoNotUse.class) // for value.jelly + public String getFormattedDescription() { + try { + return Jenkins.getInstance().getMarkupFormatter().translate(description); + } catch (IOException e) { + LOGGER.warning("failed to translate description using configured markup formatter"); + return ""; + } + } + /** * Name of the parameter. * @@ -258,7 +277,7 @@ public abstract class ParameterValue implements Serializable { * *

      * This message is used as a tooltip to describe jobs in the queue. The text should be one line without - * new line. No HTML allowed (the caller will perform necessary HTML escapes, so any text can be returend.) + * new line. No HTML allowed (the caller will perform necessary HTML escapes, so any text can be returned.) * * @since 1.323 */ @@ -284,9 +303,11 @@ public abstract class ParameterValue implements Serializable { * Returns the most natural Java object that represents the actual value, like * boolean, string, etc. * - * If there's nothing that really fits the bill, the callee can return {@code this}. + * @return if there is no natural value for this parameter type, {@code this} may be used; + * {@code null} may be used when the value is normally defined but missing in this case for various reasons * @since 1.568 */ + @CheckForNull public Object getValue() { return null; } diff --git a/core/src/main/java/hudson/model/ParametersAction.java b/core/src/main/java/hudson/model/ParametersAction.java index 50a0b8184bc8f33084ff05690503f06a969c7edf..fa2ed5b013861f3595e4cb24f6c42a240c63f6dc 100644 --- a/core/src/main/java/hudson/model/ParametersAction.java +++ b/core/src/main/java/hudson/model/ParametersAction.java @@ -50,7 +50,7 @@ import java.util.TreeSet; import java.util.logging.Level; import java.util.logging.Logger; -import static com.google.common.collect.Lists.newArrayList; +import com.google.common.collect.Lists; import static com.google.common.collect.Sets.newHashSet; import javax.annotation.CheckForNull; import javax.annotation.Nonnull; @@ -67,6 +67,16 @@ import jenkins.util.SystemProperties; @ExportedBean public class ParametersAction implements RunAction2, Iterable, QueueAction, EnvironmentContributingAction, LabelAssignmentAction { + /** + * Three state variable (null, false, true). + * + * If explicitly set to true, it will keep all variable, explicitly set to + * false it will drop all of them (except if they are marked safe). + * If null, and they are not safe, it will log a warning in logs to the user + * to let him choose the behavior + * + * @since 2.3 + */ @Restricted(NoExternalUse.class) public static final String KEEP_UNDEFINED_PARAMETERS_SYSTEM_PROPERTY_NAME = ParametersAction.class.getName() + ".keepUndefinedParameters"; @@ -107,7 +117,7 @@ public class ParametersAction implements RunAction2, Iterable, Q * * @param parameters the parameters * @param additionalSafeParameters additional safe parameters - * @since TODO + * @since 1.651.2, 2.3 */ public ParametersAction(List parameters, Collection additionalSafeParameters) { this(parameters); @@ -169,7 +179,7 @@ public class ParametersAction implements RunAction2, Iterable, Q @Exported(visibility=2) public List getParameters() { - return Collections.unmodifiableList(filter(parameters)); + return Collections.unmodifiableList(filter(parameters)); } public ParameterValue getParameter(String name) { @@ -231,7 +241,7 @@ public class ParametersAction implements RunAction2, Iterable, Q parametersAction.safeParameters = this.safeParameters; return parametersAction; } - List combinedParameters = newArrayList(overrides); + List combinedParameters = Lists.newArrayList(overrides); Set names = newHashSet(); for(ParameterValue v : overrides) { @@ -306,7 +316,8 @@ public class ParametersAction implements RunAction2, Iterable, Q return parameters; } - if (SystemProperties.getBoolean(KEEP_UNDEFINED_PARAMETERS_SYSTEM_PROPERTY_NAME)) { + String shouldKeepFlag = SystemProperties.getString(KEEP_UNDEFINED_PARAMETERS_SYSTEM_PROPERTY_NAME); + if ("true".equalsIgnoreCase(shouldKeepFlag)) { return parameters; } @@ -315,10 +326,10 @@ public class ParametersAction implements RunAction2, Iterable, Q for (ParameterValue v : this.parameters) { if (this.parameterDefinitionNames.contains(v.getName()) || isSafeParameter(v.getName())) { filteredParameters.add(v); - } else { + } else if ("false".equalsIgnoreCase(shouldKeepFlag)) { LOGGER.log(Level.WARNING, "Skipped parameter `{0}` as it is undefined on `{1}`. Set `-D{2}=true` to allow " + "undefined parameters to be injected as environment variables or `-D{3}=[comma-separated list]` to whitelist specific parameter names, " - + "even though it represents a security breach", + + "even though it represents a security breach or `-D{2}=false` to no longer show this message.", new Object [] { v.getName(), run.getParent().getFullName(), KEEP_UNDEFINED_PARAMETERS_SYSTEM_PROPERTY_NAME, SAFE_PARAMETERS_SYSTEM_PROPERTY_NAME }); } } @@ -334,7 +345,7 @@ public class ParametersAction implements RunAction2, Iterable, Q * caller could inject any parameter (using any key) here. Treat it as untrusted data. * * @return all parameters defined here. - * @since TODO + * @since 1.651.2, 2.3 */ public List getAllParameters() { return Collections.unmodifiableList(parameters); diff --git a/core/src/main/java/hudson/model/ParametersDefinitionProperty.java b/core/src/main/java/hudson/model/ParametersDefinitionProperty.java index 7dc5f76b176920ae91378e1adf61d9ef5ce18e88..956812158d7b695354f1aa108fe81b297e92e1a2 100644 --- a/core/src/main/java/hudson/model/ParametersDefinitionProperty.java +++ b/core/src/main/java/hudson/model/ParametersDefinitionProperty.java @@ -221,6 +221,15 @@ public class ParametersDefinitionProperty extends OptionalJobProperty> @Extension @Symbol("parameters") public static class DescriptorImpl extends OptionalJobPropertyDescriptor { + @Override + public ParametersDefinitionProperty newInstance(StaplerRequest req, JSONObject formData) throws FormException { + ParametersDefinitionProperty prop = (ParametersDefinitionProperty)super.newInstance(req, formData); + if (prop != null && prop.parameterDefinitions.isEmpty()) { + return null; + } + return prop; + } + @Override public boolean isApplicable(Class jobType) { return ParameterizedJobMixIn.ParameterizedJob.class.isAssignableFrom(jobType); diff --git a/core/src/main/java/hudson/model/PermalinkProjectAction.java b/core/src/main/java/hudson/model/PermalinkProjectAction.java index 38e561a982124036add7700fb23d0e070f7a94ee..22c949e7d4c3e9ab9783bc45b32994d8541a8203 100644 --- a/core/src/main/java/hudson/model/PermalinkProjectAction.java +++ b/core/src/main/java/hudson/model/PermalinkProjectAction.java @@ -49,7 +49,7 @@ public interface PermalinkProjectAction extends Action { * *

      * Because {@link Permalink} is a strategy-pattern object, - * this method should normally return a pre-initialzied + * this method should normally return a pre-initialized * read-only static list object. * * @return diff --git a/core/src/main/java/hudson/model/Queue.java b/core/src/main/java/hudson/model/Queue.java index 62b289e3f3b9d7555764e39f4ee5197a702c2637..73348264a45d9b27e3754ea7a80520b7b5d35fdf 100644 --- a/core/src/main/java/hudson/model/Queue.java +++ b/core/src/main/java/hudson/model/Queue.java @@ -61,6 +61,7 @@ import hudson.model.queue.CauseOfBlockage.BecauseNodeIsOffline; import hudson.model.queue.CauseOfBlockage.BecauseLabelIsOffline; import hudson.model.queue.CauseOfBlockage.BecauseNodeIsBusy; import hudson.model.queue.WorkUnitContext; +import hudson.security.ACL; import hudson.security.AccessControlled; import jenkins.security.QueueItemAuthenticatorProvider; import jenkins.util.Timer; @@ -122,10 +123,10 @@ import org.kohsuke.accmod.restrictions.DoNotUse; import com.thoughtworks.xstream.XStream; import com.thoughtworks.xstream.converters.basic.AbstractSingleValueConverter; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; -import jenkins.util.SystemProperties; import javax.annotation.CheckForNull; import javax.annotation.Nonnegative; import jenkins.model.queue.AsynchronousExecution; +import jenkins.model.queue.CompositeCauseOfBlockage; import org.kohsuke.stapler.QueryParameter; import org.kohsuke.stapler.interceptor.RequirePOST; @@ -219,7 +220,7 @@ public class Queue extends ResourceController implements Saveable { * to assign a work. Once a work is assigned, the executor actually gets * started to carry out the task in question. */ - public class JobOffer extends MappingWorksheet.ExecutorSlot { + public static class JobOffer extends MappingWorksheet.ExecutorSlot { public final Executor executor; /** @@ -246,20 +247,44 @@ public class Queue extends ResourceController implements Saveable { } /** - * Verifies that the {@link Executor} represented by this object is capable of executing the given task. + * @deprecated discards information; prefer {@link #getCauseOfBlockage} */ + @Deprecated public boolean canTake(BuildableItem item) { - Node node = getNode(); - if (node==null) return false; // this executor is about to die - - if(node.canTake(item)!=null) - return false; // this node is not able to take the task - - for (QueueTaskDispatcher d : QueueTaskDispatcher.all()) - if (d.canTake(node,item)!=null) - return false; + return getCauseOfBlockage(item) == null; + } - return isAvailable(); + /** + * Checks whether the {@link Executor} represented by this object is capable of executing the given task. + * @return a reason why it cannot, or null if it could + * @since 2.37 + */ + public @CheckForNull CauseOfBlockage getCauseOfBlockage(BuildableItem item) { + Node node = getNode(); + if (node == null) { + return CauseOfBlockage.fromMessage(Messages._Queue_node_has_been_removed_from_configuration(executor.getOwner().getDisplayName())); + } + CauseOfBlockage reason = node.canTake(item); + if (reason != null) { + return reason; + } + for (QueueTaskDispatcher d : QueueTaskDispatcher.all()) { + reason = d.canTake(node, item); + if (reason != null) { + return reason; + } + } + // inlining isAvailable: + if (workUnit != null) { // unlikely in practice (should not have even found this executor if so) + return CauseOfBlockage.fromMessage(Messages._Queue_executor_slot_already_in_use()); + } + if (executor.getOwner().isOffline()) { + return new CauseOfBlockage.BecauseNodeIsOffline(node); + } + if (!executor.getOwner().isAcceptingTasks()) { // Node.canTake (above) does not consider RetentionStrategy.isAcceptingTasks + return new CauseOfBlockage.BecauseNodeIsNotAcceptingTasks(node); + } + return null; } /** @@ -351,16 +376,13 @@ public class Queue extends ResourceController implements Saveable { // first try the old format File queueFile = getQueueFile(); if (queueFile.exists()) { - BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(queueFile))); - try { + try (BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(queueFile)))) { String line; while ((line = in.readLine()) != null) { AbstractProject j = Jenkins.getInstance().getItemByFullName(line, AbstractProject.class); if (j != null) j.scheduleBuild(); } - } finally { - in.close(); } // discard the queue file now that we are done queueFile.delete(); @@ -531,7 +553,7 @@ public class Queue extends ResourceController implements Saveable { * @param actions * These actions can be used for associating information scoped to a particular build, to * the task being queued. Upon the start of the build, these {@link Action}s will be automatically - * added to the {@link Run} object, and hence avaialable to everyone. + * added to the {@link Run} object, and hence available to everyone. * For the convenience of the caller, this list can contain null, and those will be silently ignored. * @since 1.311 * @return @@ -615,6 +637,9 @@ public class Queue extends ResourceController implements Saveable { for (Item item : duplicatesInQueue) { for (FoldableAction a : Util.filter(actions, FoldableAction.class)) { a.foldIntoExisting(item, p, actions); + if (LOGGER.isLoggable(Level.FINE)) { + LOGGER.log(Level.FINE, "after folding {0}, {1} includes {2}", new Object[] {a, item, item.getAllActions()}); + } } } @@ -703,7 +728,11 @@ public class Queue extends ResourceController implements Saveable { } private void updateSnapshot() { - snapshot = new Snapshot(waitingList, blockedProjects, buildables, pendings); + Snapshot revised = new Snapshot(waitingList, blockedProjects, buildables, pendings); + if (LOGGER.isLoggable(Level.FINEST)) { + LOGGER.log(Level.FINEST, "{0} → {1}; leftItems={2}", new Object[] {snapshot, revised, leftItems.asMap()}); + } + snapshot = revised; } public boolean cancel(Item item) { @@ -1052,7 +1081,13 @@ public class Queue extends ResourceController implements Saveable { List result = new ArrayList(); result.addAll(blockedProjects.getAll(t)); result.addAll(buildables.getAll(t)); - result.addAll(pendings.getAll(t)); + // Do not include pendings—we have already finalized WorkUnitContext.actions. + if (LOGGER.isLoggable(Level.FINE)) { + List thePendings = pendings.getAll(t); + if (!thePendings.isEmpty()) { + LOGGER.log(Level.FINE, "ignoring {0} during scheduleInternal", thePendings); + } + } for (Item item : waitingList) { if (item.task.equals(t)) { result.add(item); @@ -1412,12 +1447,14 @@ public class Queue extends ResourceController implements Saveable { } // pending -> buildable for (BuildableItem p: lostPendings) { - LOGGER.log(Level.INFO, + if (LOGGER.isLoggable(Level.FINE)) { + LOGGER.log(Level.FINE, "BuildableItem {0}: pending -> buildable as the assigned executor disappeared", p.task.getFullDisplayName()); + } p.isPending = false; pendings.remove(p); - makeBuildable(p); + makeBuildable(p); // TODO whatever this is for, the return value is being ignored, so this does nothing at all } } @@ -1433,7 +1470,7 @@ public class Queue extends ResourceController implements Saveable { Collections.sort(blockedItems, QueueSorter.DEFAULT_BLOCKED_ITEM_COMPARATOR); } for (BlockedItem p : blockedItems) { - String taskDisplayName = p.task.getFullDisplayName(); + String taskDisplayName = LOGGER.isLoggable(Level.FINEST) ? p.task.getFullDisplayName() : null; LOGGER.log(Level.FINEST, "Current blocked item: {0}", taskDisplayName); if (!isBuildBlocked(p) && allowNewBuildableTask(p.task)) { LOGGER.log(Level.FINEST, @@ -1468,7 +1505,7 @@ public class Queue extends ResourceController implements Saveable { if (!isBuildBlocked(top) && allowNewBuildableTask(p)) { // ready to be executed immediately Runnable r = makeBuildable(new BuildableItem(top)); - String topTaskDisplayName = top.task.getFullDisplayName(); + String topTaskDisplayName = LOGGER.isLoggable(Level.FINEST) ? top.task.getFullDisplayName() : null; if (r != null) { LOGGER.log(Level.FINEST, "Executing runnable {0}", topTaskDisplayName); r.run(); @@ -1515,13 +1552,18 @@ public class Queue extends ResourceController implements Saveable { } } else { - List candidates = new ArrayList(parked.size()); + List candidates = new ArrayList<>(parked.size()); + List reasons = new ArrayList<>(parked.size()); for (JobOffer j : parked.values()) { - if (j.canTake(p)) { + CauseOfBlockage reason = j.getCauseOfBlockage(p); + if (reason == null) { LOGGER.log(Level.FINEST, "{0} is a potential candidate for task {1}", - new Object[]{j.executor.getDisplayName(), taskDisplayName}); + new Object[]{j, taskDisplayName}); candidates.add(j); + } else { + LOGGER.log(Level.FINEST, "{0} rejected {1}: {2}", new Object[] {j, taskDisplayName, reason}); + reasons.add(reason); } } @@ -1533,6 +1575,7 @@ public class Queue extends ResourceController implements Saveable { // check if we can execute other projects LOGGER.log(Level.FINER, "Failed to map {0} to executors. candidates={1} parked={2}", new Object[]{p, candidates, parked.values()}); + p.transientCausesOfBlockage = reasons.isEmpty() ? null : reasons; continue; } @@ -1556,8 +1599,8 @@ public class Queue extends ResourceController implements Saveable { // of isBuildBlocked(p) will become a bottleneck before updateSnapshot() will. Additionally // since the snapshot itself only ever has at most one reference originating outside of the stack // it should remain in the eden space and thus be cheap to GC. - // See https://issues.jenkins-ci.org/browse/JENKINS-27708?focusedCommentId=225819&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-225819 - // or https://issues.jenkins-ci.org/browse/JENKINS-27708?focusedCommentId=225906&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-225906 + // See https://jenkins-ci.org/issue/27708?focusedCommentId=225819&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-225819 + // or https://jenkins-ci.org/issue/27708?focusedCommentId=225906&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-225906 // for alternative fixes of this issue. updateSnapshot(); } @@ -2459,6 +2502,12 @@ public class Queue extends ResourceController implements Saveable { */ private boolean isPending; + /** + * Reasons why the last call to {@link #maintain} left this buildable (but not blocked or executing). + * May be null but not empty. + */ + private transient volatile @CheckForNull List transientCausesOfBlockage; + public BuildableItem(WaitingItem wi) { super(wi); } @@ -2472,6 +2521,8 @@ public class Queue extends ResourceController implements Saveable { if(isBlockedByShutdown(task)) return CauseOfBlockage.fromMessage(Messages._Queue_HudsonIsAboutToShutDown()); + List causesOfBlockage = transientCausesOfBlockage; + Label label = getAssignedLabel(); List allNodes = jenkins.getNodes(); if (allNodes.isEmpty()) @@ -2483,9 +2534,14 @@ public class Queue extends ResourceController implements Saveable { if (nodes.size() != 1) return new BecauseLabelIsOffline(label); else return new BecauseNodeIsOffline(nodes.iterator().next()); } else { + if (causesOfBlockage != null && label.getIdleExecutors() > 0) { + return new CompositeCauseOfBlockage(causesOfBlockage); + } if (nodes.size() != 1) return new BecauseLabelIsBusy(label); else return new BecauseNodeIsBusy(nodes.iterator().next()); } + } else if (causesOfBlockage != null && new ComputerSet().getIdleExecutors() > 0) { + return new CompositeCauseOfBlockage(causesOfBlockage); } else { return CauseOfBlockage.createNeedsMoreExecutor(Messages._Queue_WaitingForNextAvailableExecutor()); } @@ -2772,7 +2828,7 @@ public class Queue extends ResourceController implements Saveable { @SuppressFBWarnings(value = "IA_AMBIGUOUS_INVOCATION_OF_INHERITED_OR_OUTER_METHOD", justification = "It will invoke the inherited clear() method according to Java semantics. " - + "FindBugs recommends suppresing warnings in such case") + + "FindBugs recommends suppressing warnings in such case") public void cancelAll() { for (T t : new ArrayList(this)) t.cancel(Queue.this); diff --git a/core/src/main/java/hudson/model/RSS.java b/core/src/main/java/hudson/model/RSS.java index 553a21c85a3a3eb32828200f5d25f59036da8029..bc36830e29c56d3b356c3eb33e14fc0ac1dd8071 100644 --- a/core/src/main/java/hudson/model/RSS.java +++ b/core/src/main/java/hudson/model/RSS.java @@ -50,14 +50,14 @@ public final class RSS { rsp.setStatus(HttpServletResponse.SC_OK); rsp.setContentType("application/xml; charset=UTF-8"); - PrintWriter pw = rsp.getWriter(); - pw.println(""); - pw.println(""+(url!=null?0:1)+""); - if(url==null) { - pw.println("url must be specified"); + try (PrintWriter pw = rsp.getWriter()) { + pw.println(""); + pw.println("" + (url != null ? 0 : 1) + ""); + if (url == null) { + pw.println("url must be specified"); + } + pw.println(""); } - pw.println(""); - pw.close(); } /** diff --git a/core/src/main/java/hudson/model/ResourceController.java b/core/src/main/java/hudson/model/ResourceController.java index b47f62f72099ce699ff236eee965f7c6db1f0af6..852a72f3669d352badd44a1de041d6be49ad53a6 100644 --- a/core/src/main/java/hudson/model/ResourceController.java +++ b/core/src/main/java/hudson/model/ResourceController.java @@ -32,6 +32,7 @@ import java.util.Iterator; import java.util.concurrent.Callable; import java.util.concurrent.CopyOnWriteArraySet; import javax.annotation.Nonnull; +import jenkins.security.NotReallyRoleSensitiveCallable; /** * Controls mutual exclusion of {@link ResourceList}. @@ -77,20 +78,18 @@ public class ResourceController { */ public void execute(@Nonnull Runnable task, final ResourceActivity activity ) throws InterruptedException { final ResourceList resources = activity.getResourceList(); - _withLock(new Runnable() { + _withLock(new NotReallyRoleSensitiveCallable() { @Override - public void run() { - while(inUse.isCollidingWith(resources)) - try { - // TODO revalidate the resource list after re-acquiring lock, for now we just let the build fail - _await(); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } + public Void call() throws InterruptedException { + while (inUse.isCollidingWith(resources)) { + // TODO revalidate the resource list after re-acquiring lock, for now we just let the build fail + _await(); + } // we have a go inProgress.add(activity); - inUse = ResourceList.union(inUse,resources); + inUse = ResourceList.union(inUse, resources); + return null; } }); @@ -184,5 +183,11 @@ public class ResourceController { return callable.call(); } } + + protected V _withLock(hudson.remoting.Callable callable) throws T { + synchronized (this) { + return callable.call(); + } + } } diff --git a/core/src/main/java/hudson/model/Run.java b/core/src/main/java/hudson/model/Run.java index dad840bf3a05fea569257b209bcf447cde1b31b4..f67171e0087487dd289f4987256e3f1c1ff1ce39 100644 --- a/core/src/main/java/hudson/model/Run.java +++ b/core/src/main/java/hudson/model/Run.java @@ -36,13 +36,16 @@ import hudson.ExtensionList; import hudson.ExtensionPoint; import hudson.FeedAdapter; import hudson.Functions; +import hudson.console.AnnotatedLargeText; +import hudson.console.ConsoleLogFilter; +import hudson.console.ConsoleNote; +import hudson.console.ModelHyperlinkNote; +import hudson.console.PlainTextConsoleOutputStream; import jenkins.util.SystemProperties; import hudson.Util; import hudson.XmlFile; import hudson.cli.declarative.CLIMethod; -import hudson.console.*; import hudson.model.Descriptor.FormException; -import hudson.model.Run.RunExecution; import hudson.model.listeners.RunListener; import hudson.model.listeners.SaveableListener; import hudson.model.queue.Executables; @@ -58,7 +61,7 @@ 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; @@ -68,8 +71,8 @@ import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; +import java.io.RandomAccessFile; import java.io.Reader; -import java.io.StringWriter; import java.nio.charset.Charset; import java.text.DateFormat; import java.text.SimpleDateFormat; @@ -83,7 +86,6 @@ 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; @@ -113,9 +115,14 @@ import org.acegisecurity.AccessDeniedException; import org.acegisecurity.Authentication; import org.apache.commons.io.IOUtils; import org.apache.commons.jelly.XMLOutput; +import org.apache.commons.lang.ArrayUtils; import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.restrictions.NoExternalUse; -import org.kohsuke.stapler.*; +import org.kohsuke.stapler.HttpResponse; +import org.kohsuke.stapler.QueryParameter; +import org.kohsuke.stapler.Stapler; +import org.kohsuke.stapler.StaplerRequest; +import org.kohsuke.stapler.StaplerResponse; import org.kohsuke.stapler.export.Exported; import org.kohsuke.stapler.export.ExportedBean; import org.kohsuke.stapler.interceptor.RequirePOST; @@ -349,7 +356,7 @@ public abstract class Run ,RunT extends Run,RunT extends Run getBadgeActions() { List r = getActions(BuildBadgeAction.class); if(isKeepLog()) { + r = new ArrayList<>(r); r.add(new KeepLogBuildBadge()); } return r; @@ -680,7 +688,7 @@ public abstract class Run ,RunT extends Run,RunT extends Run,RunT extends Run,RunT extends Run getLog(int maxLines) throws IOException { - int lineCount = 0; - List logLines = new LinkedList(); if (maxLines == 0) { - return logLines; + return Collections.emptyList(); } - BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(getLogFile()),getCharset())); - try { - for (String line = reader.readLine(); line != null; line = reader.readLine()) { - logLines.add(line); - ++lineCount; - // If we have too many lines, remove the oldest line. This way we - // never have to hold the full contents of a huge log file in memory. - // Adding to and removing from the ends of a linked list are cheap - // operations. - if (lineCount > maxLines) - logLines.remove(0); + + int lines = 0; + long filePointer; + final List lastLines = new ArrayList<>(Math.min(maxLines, 128)); + final List bytes = new ArrayList<>(); + + try (RandomAccessFile fileHandler = new RandomAccessFile(getLogFile(), "r")) { + long fileLength = fileHandler.length() - 1; + + for (filePointer = fileLength; filePointer != -1 && maxLines != lines; filePointer--) { + fileHandler.seek(filePointer); + byte readByte = fileHandler.readByte(); + + if (readByte == 0x0A) { + if (filePointer < fileLength) { + lines = lines + 1; + lastLines.add(convertBytesToString(bytes)); + bytes.clear(); + } + } else if (readByte != 0xD) { + bytes.add(readByte); + } } - } finally { - reader.close(); } + if (lines != maxLines) { + lastLines.add(convertBytesToString(bytes)); + } + + Collections.reverse(lastLines); + // If the log has been truncated, include that information. // Use set (replaces the first element) rather than add so that // the list doesn't grow beyond the specified maximum number of lines. - if (lineCount > maxLines) - logLines.set(0, "[...truncated " + (lineCount - (maxLines - 1)) + " lines...]"); + if (lines == maxLines) { + lastLines.set(0, "[...truncated " + Functions.humanReadableByteSize(filePointer)+ "...]"); + } + + return ConsoleNote.removeNotes(lastLines); + } - return ConsoleNote.removeNotes(logLines); + private String convertBytesToString(List bytes) { + Collections.reverse(bytes); + Byte[] byteArray = bytes.toArray(new Byte[bytes.size()]); + return new String(ArrayUtils.toPrimitive(byteArray), getCharset()); } public void doBuildStatus( StaplerRequest req, StaplerResponse rsp ) throws IOException { @@ -2165,9 +2193,7 @@ public abstract class Run ,RunT extends Run * TODO: move out more stuff to {@link DumbSlave}. * - * On Febrary, 2016 a general renaming was done internally: the "slave" term was replaced by + * On February, 2016 a general renaming was done internally: the "slave" term was replaced by * "Agent". This change was applied in: UI labels/HTML pages, javadocs and log messages. * Java classes, fields, methods, etc were not renamed to avoid compatibility issues. - * See JENKINS-27268. + * See JENKINS-27268. * * @author Kohsuke Kawaguchi */ @@ -121,7 +123,7 @@ public abstract class Slave extends Node implements Serializable { private Mode mode = Mode.NORMAL; /** - * Agent availablility strategy. + * Agent availability strategy. */ private RetentionStrategy retentionStrategy; @@ -373,7 +375,7 @@ public abstract class Slave extends Node implements Serializable { return res.openConnection(); } - public URL getURL() throws MalformedURLException { + public URL getURL() throws IOException { String name = fileName; // Prevent the access to war contents & prevent the folder escaping (SECURITY-195) @@ -383,6 +385,8 @@ public abstract class Slave extends Node implements Serializable { if (name.equals("hudson-cli.jar")) { name="jenkins-cli.jar"; + } else if (name.equals("slave.jar") || name.equals("remoting.jar")) { + name = "lib/" + Which.jarFile(Channel.class).getName(); } URL res = Jenkins.getInstance().servletContext.getResource("/WEB-INF/" + name); @@ -394,11 +398,8 @@ public abstract class Slave extends Node implements Serializable { } public byte[] readFully() throws IOException { - InputStream in = connect().getInputStream(); - try { + try (InputStream in = connect().getInputStream()) { return IOUtils.toByteArray(in); - } finally { - in.close(); } } @@ -495,7 +496,7 @@ public abstract class Slave extends Node implements Serializable { * @since 2.12 */ @Nonnull - @Restricted(NoExternalUse.class) // intedned for use by Jelly EL only (plus hack in DelegatingComputerLauncher) + @Restricted(NoExternalUse.class) // intended for use by Jelly EL only (plus hack in DelegatingComputerLauncher) public final List> computerLauncherDescriptors(@CheckForNull Slave it) { DescriptorExtensionList> all = Jenkins.getInstance().>getDescriptorList( diff --git a/core/src/main/java/hudson/model/TaskAction.java b/core/src/main/java/hudson/model/TaskAction.java index fbf46b9461f31de86f0e115b1c1580da30427561..00b1ba364ac557b5b6fcd687b2a7d9e563914464 100644 --- a/core/src/main/java/hudson/model/TaskAction.java +++ b/core/src/main/java/hudson/model/TaskAction.java @@ -49,7 +49,7 @@ import hudson.security.ACL; */ public abstract class TaskAction extends AbstractModelObject implements Action { /** - * If non-null, that means either the activitiy is in progress + * If non-null, that means either the activity is in progress * asynchronously, or it failed unexpectedly and the thread is dead. */ protected transient volatile TaskThread workerThread; diff --git a/core/src/main/java/hudson/model/TaskThread.java b/core/src/main/java/hudson/model/TaskThread.java index 8cb60c320af7106a367acd7b6e97bd98080b9f75..73623e7b0d043f1cc6792e3c8ada2b3ddd841f1c 100644 --- a/core/src/main/java/hudson/model/TaskThread.java +++ b/core/src/main/java/hudson/model/TaskThread.java @@ -23,6 +23,7 @@ */ package hudson.model; +import hudson.Functions; import hudson.console.AnnotatedLargeText; import hudson.util.StreamTaskListener; @@ -131,7 +132,7 @@ public abstract class TaskThread extends Thread { } catch (InterruptedException e) { listener.getLogger().println("Aborted"); } catch (Exception e) { - e.printStackTrace(listener.getLogger()); + Functions.printStackTrace(e, listener.getLogger()); } finally { listener = null; isRunning =false; diff --git a/core/src/main/java/hudson/model/TopLevelItemDescriptor.java b/core/src/main/java/hudson/model/TopLevelItemDescriptor.java index f53306d1b2c06defa28adc7c4693f8fd8294699a..8c2383aea74803cb9331558116a3f6635b6154f0 100644 --- a/core/src/main/java/hudson/model/TopLevelItemDescriptor.java +++ b/core/src/main/java/hudson/model/TopLevelItemDescriptor.java @@ -30,6 +30,9 @@ import org.acegisecurity.AccessDeniedException; import org.apache.commons.jelly.Script; import org.apache.commons.jelly.XMLOutput; import org.apache.commons.lang.StringUtils; +import org.jenkins.ui.icon.Icon; +import org.jenkins.ui.icon.IconSet; +import org.jenkins.ui.icon.IconSpec; import org.kohsuke.stapler.MetaClass; import org.kohsuke.stapler.Stapler; import org.kohsuke.stapler.StaplerRequest; @@ -48,7 +51,7 @@ import java.util.logging.Logger; * * @author Kohsuke Kawaguchi */ -public abstract class TopLevelItemDescriptor extends Descriptor { +public abstract class TopLevelItemDescriptor extends Descriptor implements IconSpec { private static final Logger LOGGER = Logger.getLogger(TopLevelItemDescriptor.class.getName()); @@ -189,8 +192,10 @@ public abstract class TopLevelItemDescriptor extends Descriptor { * @return A string or null if it is not defined. * * @since 2.0 + * @deprecated prefer {@link #getIconClassName()} */ @CheckForNull + @Deprecated public String getIconFilePathPattern() { return null; } @@ -203,8 +208,10 @@ public abstract class TopLevelItemDescriptor extends Descriptor { * @return A string or null if it is not defined. * * @since 2.0 + * @deprecated prefer {@link #getIconClassName()} */ @CheckForNull + @Deprecated public String getIconFilePath(String size) { if (!StringUtils.isBlank(getIconFilePathPattern())) { return getIconFilePathPattern().replace(":size", size); @@ -212,6 +219,36 @@ public abstract class TopLevelItemDescriptor extends Descriptor { return null; } + /** + * Get the Item's Icon class specification e.g. 'icon-notepad'. + *

      + * Note: do NOT include icon size specifications (such as 'icon-sm'). + * + * @return The Icon class specification e.g. 'icon-notepad'. + */ + @Override + public String getIconClassName() { + // Oh the fun of somebody adding a legacy way of referencing images into 2.0 code + String pattern = getIconFilePathPattern(); + if (pattern != null) { + // here we go with the dance of the IconSet's + String path = pattern.replace(":size", "24x24"); // we'll strip the icon-md to get the class name + if (path.indexOf('/') == -1) { + // this one is easy... too easy... also will never happen + return IconSet.toNormalizedIconNameClass(path); + } + if (Jenkins.RESOURCE_PATH.length() > 0 && path.startsWith(Jenkins.RESOURCE_PATH)) { + // will to live falling + path = path.substring(Jenkins.RESOURCE_PATH.length()); + } + Icon icon = IconSet.icons.getIconByUrl(path); + if (icon != null) { + return icon.getClassSpec().replaceAll("\\s*icon-md\\s*", " ").replaceAll("\\s+", " "); + } + } + return null; + } + /** * @deprecated since 2007-01-19. * This is not a valid operation for {@link Item}s. diff --git a/core/src/main/java/hudson/model/UpdateCenter.java b/core/src/main/java/hudson/model/UpdateCenter.java index ed1915e53da5b2c1e55409687182f5bee30b356a..98e9426bf48f441c2235e9824169a6062105ac4c 100644 --- a/core/src/main/java/hudson/model/UpdateCenter.java +++ b/core/src/main/java/hudson/model/UpdateCenter.java @@ -30,6 +30,7 @@ import hudson.Functions; import hudson.PluginManager; import hudson.PluginWrapper; import hudson.ProxyConfiguration; +import hudson.security.ACLContext; import jenkins.util.SystemProperties; import hudson.Util; import hudson.XmlFile; @@ -157,8 +158,7 @@ public class UpdateCenter extends AbstractModelObject implements Saveable, OnMas /** * {@linkplain UpdateSite#getId() ID} of the default update site. - * @since 1.483 - public property - * @since TODO - configurable via system property + * @since 1.483; configurable via system property since 2.4 */ public static final String ID_DEFAULT = SystemProperties.getString(UpdateCenter.class.getName()+".defaultUpdateSiteId", PREDEFINED_UPDATE_SITE_ID); @@ -213,7 +213,7 @@ public class UpdateCenter extends AbstractModelObject implements Saveable, OnMas /** * Connection status check has been skipped. * As example, it may happen if there is no connection check URL defined for the site. - * @since TODO + * @since 2.4 */ SKIPPED, /** @@ -249,13 +249,13 @@ public class UpdateCenter extends AbstractModelObject implements Saveable, OnMas * Creates an update center. * @param config Requested configuration. May be {@code null} if defaults should be used * @return Created Update center. {@link UpdateCenter} by default, but may be overridden - * @since TODO + * @since 2.4 */ @Nonnull public static UpdateCenter createUpdateCenter(@CheckForNull UpdateCenterConfiguration config) { String requiredClassName = SystemProperties.getString(UpdateCenter.class.getName()+".className", null); if (requiredClassName == null) { - // Use the defaul Update Center + // Use the default Update Center LOGGER.log(Level.FINE, "Using the default Update Center implementation"); return createDefaultUpdateCenter(config); } @@ -752,14 +752,11 @@ public class UpdateCenter extends AbstractModelObject implements Saveable, OnMas */ public String getBackupVersion() { try { - JarFile backupWar = new JarFile(new File(Lifecycle.get().getHudsonWar() + ".bak")); - try { + try (JarFile backupWar = new JarFile(new File(Lifecycle.get().getHudsonWar() + ".bak"))) { Attributes attrs = backupWar.getManifest().getMainAttributes(); String v = attrs.getValue("Jenkins-Version"); - if (v==null) v = attrs.getValue("Hudson-Version"); + if (v == null) v = attrs.getValue("Hudson-Version"); return v; - } finally { - backupWar.close(); } } catch (IOException e) { LOGGER.log(Level.WARNING, "Failed to read backup version ", e); @@ -823,7 +820,7 @@ public class UpdateCenter extends AbstractModelObject implements Saveable, OnMas } public String getDisplayName() { - return "Update center"; + return Messages.UpdateCenter_DisplayName(); } public String getSearchUrl() { @@ -986,6 +983,12 @@ public class UpdateCenter extends AbstractModelObject implements Saveable, OnMas */ @Extension @Symbol("coreUpdate") public static final class CoreUpdateMonitor extends AdministrativeMonitor { + + @Override + public String getDisplayName() { + return Messages.UpdateCenter_CoreUpdateMonitor_DisplayName(); + } + public boolean isActivated() { Data data = getData(); return data!=null && data.hasCoreUpdates(); @@ -1365,6 +1368,11 @@ public class UpdateCenter extends AbstractModelObject implements Saveable, OnMas @Exported(inline=true) public volatile RestartJenkinsJobStatus status = new Pending(); + /** + * The name of the user that started this job + */ + private String authentication; + /** * Cancel job */ @@ -1378,6 +1386,7 @@ public class UpdateCenter extends AbstractModelObject implements Saveable, OnMas public RestartJenkinsJob(UpdateSite site) { super(site); + this.authentication = Jenkins.getAuthentication().getName(); } public synchronized void run() { @@ -1386,7 +1395,10 @@ public class UpdateCenter extends AbstractModelObject implements Saveable, OnMas } status = new Running(); try { - Jenkins.getInstance().safeRestart(); + // safeRestart records the current authentication for the log, so set it to the managing user + try (ACLContext _ = ACL.as(User.get(authentication, false, Collections.emptyMap()))) { + Jenkins.getInstance().safeRestart(); + } } catch (RestartNotSupportedException exception) { // ignore if restart is not allowed status = new Failure(); @@ -1610,7 +1622,7 @@ public class UpdateCenter extends AbstractModelObject implements Saveable, OnMas /** * During download, an attempt is made to compute the SHA-1 checksum of the file. * - * @since TODO + * @since 1.641 */ @CheckForNull protected String getComputedSHA1() { @@ -1899,7 +1911,7 @@ public class UpdateCenter extends AbstractModelObject implements Saveable, OnMas /** * Indicates there is another installation job for this plugin - * @since TODO + * @since 2.1 */ protected boolean wasInstalled() { synchronized(UpdateCenter.this) { diff --git a/core/src/main/java/hudson/model/UpdateSite.java b/core/src/main/java/hudson/model/UpdateSite.java index f5b5e4beb7345f16277002cc1d3f59c90828f477..5d467ef591ad0a8f1264f7db1497843125180643 100644 --- a/core/src/main/java/hudson/model/UpdateSite.java +++ b/core/src/main/java/hudson/model/UpdateSite.java @@ -26,6 +26,7 @@ package hudson.model; import hudson.ClassicPluginStrategy; +import hudson.ExtensionList; import hudson.PluginManager; import hudson.PluginWrapper; import hudson.Util; @@ -46,7 +47,9 @@ import java.security.GeneralSecurityException; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; +import java.util.HashSet; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.Set; import java.util.TreeMap; @@ -55,17 +58,24 @@ import java.util.concurrent.Callable; import java.util.concurrent.Future; import java.util.logging.Level; import java.util.logging.Logger; +import java.util.regex.Pattern; +import java.util.regex.PatternSyntaxException; import javax.annotation.CheckForNull; import javax.annotation.Nonnull; +import javax.annotation.Nullable; + import jenkins.model.Jenkins; import jenkins.model.DownloadSettings; +import jenkins.security.UpdateSiteWarningsConfiguration; import jenkins.util.JSONSignatureValidator; import jenkins.util.SystemProperties; +import net.sf.json.JSONArray; import net.sf.json.JSONException; import net.sf.json.JSONObject; import org.apache.commons.io.IOUtils; import org.apache.commons.lang.StringUtils; import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.DoNotUse; import org.kohsuke.accmod.restrictions.NoExternalUse; import org.kohsuke.stapler.DataBoundConstructor; import org.kohsuke.stapler.HttpResponse; @@ -99,7 +109,7 @@ public class UpdateSite { * *

      * There's normally some delay between when we send HTML that includes the check code, - * until we get the data back, so this variable is used to avoid asking too many browseres + * until we get the data back, so this variable is used to avoid asking too many browsers * all at once. */ private transient volatile long lastAttempt; @@ -130,6 +140,10 @@ public class UpdateSite { */ private final String url; + /** + * the prefix for the signature validator name + */ + private static final String signatureValidatorPrefix = "update site"; public UpdateSite(String id, String url) { @@ -242,10 +256,28 @@ public class UpdateSite { /** * Let sub-classes of UpdateSite provide their own signature validator. * @return the signature validator. + * @deprecated use {@link #getJsonSignatureValidator(@CheckForNull String)} instead. */ + @Deprecated @Nonnull protected JSONSignatureValidator getJsonSignatureValidator() { - return new JSONSignatureValidator("update site '"+id+"'"); + return getJsonSignatureValidator(null); + } + + /** + * Let sub-classes of UpdateSite provide their own signature validator. + * @param name, the name for the JSON signature Validator object. + * if name is null, then the default name will be used, + * which is "update site" followed by the update site id + * @return the signature validator. + * @since 2.21 + */ + @Nonnull + protected JSONSignatureValidator getJsonSignatureValidator(@CheckForNull String name) { + if (name == null) { + name = signatureValidatorPrefix + " '" + id + "'"; + } + return new JSONSignatureValidator(name); } /** @@ -422,6 +454,28 @@ public class UpdateSite { return url; } + + /** + * URL which exposes the metadata location in a specific update site. + * @param downloadable, the downloadable id of a specific metatadata json (e.g. hudson.tasks.Maven.MavenInstaller.json) + * @return the location + * @since 2.20 + */ + @CheckForNull + @Restricted(NoExternalUse.class) + public String getMetadataUrlForDownloadable(String downloadable) { + String siteUrl = getUrl(); + String updateSiteMetadataUrl = null; + int baseUrlEnd = siteUrl.indexOf("update-center.json"); + if (baseUrlEnd != -1) { + String siteBaseUrl = siteUrl.substring(0, baseUrlEnd); + updateSiteMetadataUrl = siteBaseUrl + "updates/" + downloadable; + } else { + LOGGER.log(Level.WARNING, "Url {0} does not look like an update center:", siteUrl); + } + return updateSiteMetadataUrl; + } + /** * Where to actually download the update center? * @@ -469,6 +523,12 @@ public class UpdateSite { * Plugins in the repository, keyed by their artifact IDs. */ public final Map plugins = new TreeMap(String.CASE_INSENSITIVE_ORDER); + /** + * List of warnings (mostly security) published with the update site. + * + * @since 2.40 + */ + private final Set warnings = new HashSet(); /** * If this is non-null, Jenkins is going to check the connectivity to this URL to make sure @@ -484,6 +544,18 @@ public class UpdateSite { } else { core = null; } + + JSONArray w = o.optJSONArray("warnings"); + if (w != null) { + for (int i = 0; i < w.size(); i++) { + try { + warnings.add(new Warning(w.getJSONObject(i))); + } catch (JSONException ex) { + LOGGER.log(Level.WARNING, "Failed to parse JSON for warning", ex); + } + } + } + for(Map.Entry e : (Set>)o.getJSONObject("plugins").entrySet()) { Plugin p = new Plugin(sourceId, e.getValue()); // JENKINS-33308 - include implied dependencies for older plugins that may need them @@ -501,6 +573,16 @@ public class UpdateSite { connectionCheckUrl = (String)o.get("connectionCheckUrl"); } + /** + * Returns the set of warnings + * @return the set of warnings + * @since 2.40 + */ + @Restricted(NoExternalUse.class) + public Set getWarnings() { + return this.warnings; + } + /** * Is there a new version of the core? */ @@ -571,7 +653,7 @@ public class UpdateSite { /** * The base64 encoded binary SHA-1 checksum of the file. * Can be null if not provided by the update site. - * @since TODO + * @since 1.641 (and 1.625.3 LTS) */ // TODO @Exported assuming we want this in the API public String getSha1() { @@ -602,6 +684,232 @@ public class UpdateSite { } + /** + * A version range for {@code Warning}s indicates which versions of a given plugin are affected + * by it. + * + * {@link #name}, {@link #firstVersion} and {@link #lastVersion} fields are only used for administrator notices. + * + * The {@link #pattern} is used to determine whether a given warning applies to the current installation. + * + * @since 2.40 + */ + @Restricted(NoExternalUse.class) + public static final class WarningVersionRange { + /** + * Human-readable English name for this version range, e.g. 'regular', 'LTS', '2.6 line'. + */ + @Nullable + public final String name; + + /** + * First version in this version range to be subject to the warning. + */ + @Nullable + public final String firstVersion; + + /** + * Last version in this version range to be subject to the warning. + */ + @Nullable + public final String lastVersion; + + /** + * Regular expression pattern for this version range that matches all included version numbers. + */ + @Nonnull + private final Pattern pattern; + + public WarningVersionRange(JSONObject o) { + this.name = Util.fixEmpty(o.optString("name")); + this.firstVersion = Util.fixEmpty(o.optString("firstVersion")); + this.lastVersion = Util.fixEmpty(o.optString("lastVersion")); + Pattern p; + try { + p = Pattern.compile(o.getString("pattern")); + } catch (PatternSyntaxException ex) { + LOGGER.log(Level.WARNING, "Failed to compile pattern '" + o.getString("pattern") + "', using '.*' instead", ex); + p = Pattern.compile(".*"); + } + this.pattern = p; + } + + public boolean includes(VersionNumber number) { + return pattern.matcher(number.toString()).matches(); + } + } + + /** + * Represents a warning about a certain component, mostly related to known security issues. + * + * @see UpdateSiteWarningsConfiguration + * @see jenkins.security.UpdateSiteWarningsMonitor + * + * @since 2.40 + */ + @Restricted(NoExternalUse.class) + public static final class Warning { + + public enum Type { + CORE, + PLUGIN, + UNKNOWN + } + + /** + * The type classifier for this warning. + */ + @Nonnull + public /* final */ Type type; + + /** + * The globally unique ID of this warning. + * + *

      This is typically the CVE identifier or SECURITY issue (Jenkins project); + * possibly with a unique suffix (e.g. artifactId) if either applies to multiple components.

      + */ + @Exported + @Nonnull + public final String id; + + /** + * The name of the affected component. + *
        + *
      • If type is 'core', this is 'core' by convention. + *
      • If type is 'plugin', this is the artifactId of the affected plugin + *
      + */ + @Exported + @Nonnull + public final String component; + + /** + * A short, English language explanation for this warning. + */ + @Exported + @Nonnull + public final String message; + + /** + * A URL with more information about this, typically a security advisory. For use in administrator notices + * only, so + */ + @Exported + @Nonnull + public final String url; + + /** + * A list of named version ranges specifying which versions of the named component this warning applies to. + * + * If this list is empty, all versions of the component are considered to be affected by this warning. + */ + @Exported + @Nonnull + public final List versionRanges; + + /** + * + * @param o the {@link JSONObject} representing the warning + * @throws JSONException if the argument does not match the expected format + */ + @Restricted(NoExternalUse.class) + public Warning(JSONObject o) { + try { + this.type = Type.valueOf(o.getString("type").toUpperCase(Locale.US)); + } catch (IllegalArgumentException ex) { + this.type = Type.UNKNOWN; + } + this.id = o.getString("id"); + this.component = o.getString("name"); + this.message = o.getString("message"); + this.url = o.getString("url"); + + if (o.has("versions")) { + List ranges = new ArrayList<>(); + JSONArray versions = o.getJSONArray("versions"); + for (int i = 0; i < versions.size(); i++) { + WarningVersionRange range = new WarningVersionRange(versions.getJSONObject(i)); + ranges.add(range); + } + this.versionRanges = Collections.unmodifiableList(ranges); + } else { + this.versionRanges = Collections.emptyList(); + } + } + + /** + * Two objects are considered equal if they are the same type and have the same ID. + * + * @param o the other object + * @return true iff this object and the argument are considered equal + */ + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof Warning)) return false; + + Warning warning = (Warning) o; + + return id.equals(warning.id); + } + + @Override + public int hashCode() { + return id.hashCode(); + } + + public boolean isPluginWarning(@Nonnull String pluginName) { + return type == Type.PLUGIN && pluginName.equals(this.component); + } + + /** + * Returns true if this warning is relevant to the current configuration + * @return true if this warning is relevant to the current configuration + */ + public boolean isRelevant() { + switch (this.type) { + case CORE: + VersionNumber current = Jenkins.getVersion(); + + if (!isRelevantToVersion(current)) { + return false; + } + return true; + case PLUGIN: + + // check whether plugin is installed + PluginWrapper plugin = Jenkins.getInstance().getPluginManager().getPlugin(this.component); + if (plugin == null) { + return false; + } + + // check whether warning is relevant to installed version + VersionNumber currentCore = plugin.getVersionNumber(); + if (!isRelevantToVersion(currentCore)) { + return false; + } + return true; + case UNKNOWN: + default: + return false; + } + } + + public boolean isRelevantToVersion(@Nonnull VersionNumber version) { + if (this.versionRanges.isEmpty()) { + // no version ranges specified, so all versions are affected + return true; + } + + for (UpdateSite.WarningVersionRange range : this.versionRanges) { + if (range.includes(version)) { + return true; + } + } + return false; + } + } + public final class Plugin extends Entry { /** * Optional URL to the Wiki page that discusses this plugin. @@ -819,6 +1127,49 @@ public class UpdateSite { return true; } + /** + * @since 2.40 + */ + @CheckForNull + @Restricted(NoExternalUse.class) + public Set getWarnings() { + ExtensionList list = ExtensionList.lookup(UpdateSiteWarningsConfiguration.class); + if (list.size() == 0) { + return Collections.emptySet(); + } + + Set warnings = new HashSet<>(); + + UpdateSiteWarningsConfiguration configuration = list.get(0); + + for (Warning warning: configuration.getAllWarnings()) { + if (configuration.isIgnored(warning)) { + // warning is currently being ignored + continue; + } + if (!warning.isPluginWarning(this.name)) { + // warning is not about this plugin + continue; + } + + if (!warning.isRelevantToVersion(new VersionNumber(this.version))) { + // warning is not relevant to this version + continue; + } + warnings.add(warning); + } + + return warnings; + } + + /** + * @since 2.40 + */ + @Restricted(DoNotUse.class) + public boolean hasWarnings() { + return getWarnings().size() > 0; + } + /** * @deprecated as of 1.326 * Use {@link #deploy()}. diff --git a/core/src/main/java/hudson/model/UsageStatistics.java b/core/src/main/java/hudson/model/UsageStatistics.java index 4f46b292d4d36630287fb3a5f8cdb3a462113757..1fdbcca89260c3bde412669ac3bddfbf6fb93ec4 100644 --- a/core/src/main/java/hudson/model/UsageStatistics.java +++ b/core/src/main/java/hudson/model/UsageStatistics.java @@ -158,14 +158,22 @@ public class UsageStatistics extends PageDecorator { o.put("plugins",plugins); JSONObject jobs = new JSONObject(); - List items = j.getAllItems(TopLevelItem.class); - for (TopLevelItemDescriptor d : Items.all()) { - int cnt=0; - for (TopLevelItem item : items) { - if(item.getDescriptor()==d) - cnt++; + // capture the descriptors as these should be small compared with the number of items + // so we will walk all items only once and we can short-cut the search of descriptors + TopLevelItemDescriptor[] descriptors = Items.all().toArray(new TopLevelItemDescriptor[0]); + int counts[] = new int[descriptors.length]; + for (TopLevelItem item: j.allItems(TopLevelItem.class)) { + TopLevelItemDescriptor d = item.getDescriptor(); + for (int i = 0; i < descriptors.length; i++) { + if (d == descriptors[i]) { + counts[i]++; + // no point checking any more, we found the match + break; + } } - jobs.put(d.getJsonSafeClassName(),cnt); + } + for (int i = 0; i < descriptors.length; i++) { + jobs.put(descriptors[i].getJsonSafeClassName(), counts[i]); } o.put("jobs",jobs); @@ -198,7 +206,7 @@ public class UsageStatistics extends PageDecorator { } /** - * Asymmetric cipher is slow and in case of Sun RSA implementation it can only encyrypt the first block. + * Asymmetric cipher is slow and in case of Sun RSA implementation it can only encrypt the first block. * * So first create a symmetric key, then place this key in the beginning of the stream by encrypting it * with the asymmetric cipher. The rest of the stream will be encrypted by a symmetric cipher. diff --git a/core/src/main/java/hudson/model/User.java b/core/src/main/java/hudson/model/User.java index 159e25abc1c6688b58e4a62de64c0fe33984135d..bc9956add4ec689d5f286d4dc78323eef99665e0 100644 --- a/core/src/main/java/hudson/model/User.java +++ b/core/src/main/java/hudson/model/User.java @@ -24,11 +24,16 @@ */ package hudson.model; -import jenkins.security.UserDetailsCache; -import jenkins.util.SystemProperties; import com.google.common.base.Predicate; import com.infradna.tool.bridge_method_injector.WithBridgeMethods; -import hudson.*; +import hudson.BulkChange; +import hudson.CopyOnWrite; +import hudson.Extension; +import hudson.ExtensionList; +import hudson.ExtensionPoint; +import hudson.FeedAdapter; +import hudson.Util; +import hudson.XmlFile; import hudson.model.Descriptor.FormException; import hudson.model.listeners.SaveableListener; import hudson.security.ACL; @@ -40,37 +45,11 @@ import hudson.util.FormApply; import hudson.util.FormValidation; import hudson.util.RunList; import hudson.util.XStream2; -import jenkins.model.IdStrategy; -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; -import org.acegisecurity.GrantedAuthority; -import org.acegisecurity.providers.UsernamePasswordAuthenticationToken; -import org.acegisecurity.providers.anonymous.AnonymousAuthenticationToken; -import org.acegisecurity.userdetails.UserDetails; -import org.acegisecurity.userdetails.UsernameNotFoundException; -import org.jenkinsci.Symbol; -import org.springframework.dao.DataAccessException; -import org.kohsuke.accmod.Restricted; -import org.kohsuke.accmod.restrictions.NoExternalUse; -import org.kohsuke.stapler.StaplerRequest; -import org.kohsuke.stapler.StaplerResponse; -import org.kohsuke.stapler.export.Exported; -import org.kohsuke.stapler.export.ExportedBean; -import org.apache.commons.io.filefilter.DirectoryFileFilter; -import org.kohsuke.stapler.interceptor.RequirePOST; - -import javax.annotation.concurrent.GuardedBy; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletResponse; import java.io.File; -import java.io.IOException; import java.io.FileFilter; +import java.io.IOException; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Comparator; @@ -90,7 +69,34 @@ import java.util.logging.Logger; import javax.annotation.CheckForNull; import javax.annotation.Nonnull; import javax.annotation.Nullable; +import javax.annotation.concurrent.GuardedBy; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import jenkins.model.IdStrategy; +import jenkins.model.Jenkins; +import jenkins.model.ModelObjectWithContextMenu; +import jenkins.security.ImpersonatingUserDetailsService; +import jenkins.security.LastGrantedAuthoritiesProperty; +import jenkins.security.UserDetailsCache; +import jenkins.util.SystemProperties; +import net.sf.json.JSONObject; +import org.acegisecurity.Authentication; +import org.acegisecurity.GrantedAuthority; +import org.acegisecurity.providers.UsernamePasswordAuthenticationToken; +import org.acegisecurity.providers.anonymous.AnonymousAuthenticationToken; +import org.acegisecurity.userdetails.UserDetails; +import org.acegisecurity.userdetails.UsernameNotFoundException; +import org.apache.commons.io.filefilter.DirectoryFileFilter; import org.apache.commons.lang.StringUtils; +import org.jenkinsci.Symbol; +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.NoExternalUse; +import org.kohsuke.stapler.StaplerRequest; +import org.kohsuke.stapler.StaplerResponse; +import org.kohsuke.stapler.export.Exported; +import org.kohsuke.stapler.export.ExportedBean; +import org.kohsuke.stapler.interceptor.RequirePOST; +import org.springframework.dao.DataAccessException; /** * Represents a user. @@ -122,14 +128,14 @@ public class User extends AbstractModelObject implements AccessControlled, Descr /** * The username of the 'unknown' user used to avoid null user references. */ - private static final String UKNOWN_USERNAME = "unknown"; + private static final String UNKNOWN_USERNAME = "unknown"; /** * These usernames should not be used by real users logging into Jenkins. Therefore, we prevent * users with these names from being saved. */ private static final String[] ILLEGAL_PERSISTED_USERNAMES = new String[]{ACL.ANONYMOUS_USERNAME, - ACL.SYSTEM_USERNAME, UKNOWN_USERNAME}; + ACL.SYSTEM_USERNAME, UNKNOWN_USERNAME}; private transient final String id; private volatile String fullName; @@ -347,7 +353,7 @@ public class User extends AbstractModelObject implements AccessControlled, Descr * This is used to avoid null {@link User} instance. */ public static @Nonnull User getUnknown() { - return getById(UKNOWN_USERNAME, true); + return getById(UNKNOWN_USERNAME, true); } /** @@ -646,9 +652,10 @@ public class User extends AbstractModelObject implements AccessControlled, Descr * Gets the list of {@link Build}s that include changes by this user, * by the timestamp order. */ + @SuppressWarnings("unchecked") @WithBridgeMethods(List.class) public @Nonnull RunList getBuilds() { - return new RunList>(Jenkins.getInstance().getAllItems(Job.class)).filter(new Predicate>() { + return RunList.fromJobs(Jenkins.getInstance().allItems(Job.class)).filter(new Predicate>() { @Override public boolean apply(Run r) { return r instanceof AbstractBuild && relatedTo((AbstractBuild) r); } @@ -661,7 +668,7 @@ public class User extends AbstractModelObject implements AccessControlled, Descr */ public @Nonnull Set> getProjects() { Set> r = new HashSet>(); - for (AbstractProject p : Jenkins.getInstance().getAllItems(AbstractProject.class)) + for (AbstractProject p : Jenkins.getInstance().allItems(AbstractProject.class)) if(p.hasParticipant(this)) r.add(p); return r; @@ -713,12 +720,13 @@ public class User extends AbstractModelObject implements AccessControlled, Descr * @since 1.600 */ public static boolean isIdOrFullnameAllowed(@CheckForNull String id) { - //TODO: StringUtils.isBlank() checks the null falue, but FindBugs is not smart enough. Remove it later + //TODO: StringUtils.isBlank() checks the null value, but FindBugs is not smart enough. Remove it later if (id == null || StringUtils.isBlank(id)) { return false; } + final String trimmedId = id.trim(); for (String invalidId : ILLEGAL_PERSISTED_USERNAMES) { - if (id.equalsIgnoreCase(invalidId)) + if (trimmedId.equalsIgnoreCase(invalidId)) return false; } return true; @@ -831,7 +839,7 @@ public class User extends AbstractModelObject implements AccessControlled, Descr public void doRssLatest(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException { final List lastBuilds = new ArrayList(); - for (AbstractProject p : Jenkins.getInstance().getAllItems(AbstractProject.class)) { + for (AbstractProject p : Jenkins.getInstance().allItems(AbstractProject.class)) { for (AbstractBuild b = p.getLastBuild(); b != null; b = b.getPreviousBuild()) { if (relatedTo(b)) { lastBuilds.add(b); @@ -839,6 +847,14 @@ public class User extends AbstractModelObject implements AccessControlled, Descr } } } + // historically these have been reported sorted by project name, we switched to the lazy iteration + // so we only have to sort the sublist of runs rather than the full list of irrelevant projects + Collections.sort(lastBuilds, new Comparator() { + @Override + public int compare(Run o1, Run o2) { + return Items.BY_FULL_NAME.compare(o1.getParent(), o2.getParent()); + } + }); rss(req, rsp, " latest build", RunList.fromRuns(lastBuilds), Run.FEED_ADAPTER_LATEST); } @@ -982,11 +998,24 @@ public class User extends AbstractModelObject implements AccessControlled, Descr public ContextMenu doContextMenu(StaplerRequest request, StaplerResponse response) throws Exception { return new ContextMenu().from(this,request,response); } + + /** + * Gets list of Illegal usernames, for which users should not be created. + * Always includes users from {@link #ILLEGAL_PERSISTED_USERNAMES} + * @return List of usernames + */ + @Restricted(NoExternalUse.class) + /*package*/ static Set getIllegalPersistedUsernames() { + // TODO: This method is designed for further extensibility via system properties. To be extended in a follow-up issue + final Set res = new HashSet<>(); + res.addAll(Arrays.asList(ILLEGAL_PERSISTED_USERNAMES)); + return res; + } public static abstract class CanonicalIdResolver extends AbstractDescribableImpl implements ExtensionPoint, Comparable { /** - * context key for realm (domain) where idOrFullName has been retreived from. + * context key for realm (domain) where idOrFullName has been retrieved from. * Can be used (for example) to distinguish ambiguous committer ID using the SCM URL. * Associated Value is a {@link String} */ @@ -1093,5 +1122,20 @@ public class User extends AbstractModelObject implements AccessControlled, Descr * JENKINS-22346. */ public static boolean ALLOW_NON_EXISTENT_USER_TO_LOGIN = SystemProperties.getBoolean(User.class.getName()+".allowNonExistentUserToLogin"); -} + /** + * Jenkins historically created a (usually) ephemeral user record when an user with Overall/Administer permission + * accesses a /user/arbitraryName URL. + *

      + * Unfortunately this constitutes a CSRF vulnerability, as malicious users can make admins create arbitrary numbers + * of ephemeral user records, so the behavior was changed in Jenkins 2.TODO / 2.32.2. + *

      + * As some users may be relying on the previous behavior, setting this to true restores the previous behavior. This + * is not recommended. + * + * SECURITY-406. + */ + @Restricted(NoExternalUse.class) + public static boolean ALLOW_USER_CREATION_VIA_URL = SystemProperties.getBoolean(User.class.getName() + ".allowUserCreationViaUrl"); + +} diff --git a/core/src/main/java/hudson/model/UserProperty.java b/core/src/main/java/hudson/model/UserProperty.java index 0f0958d95cb22680b32ab6af3c40b52f7d185ef6..48198a28ebbe9400139f48735b15067cf33bbfcc 100644 --- a/core/src/main/java/hudson/model/UserProperty.java +++ b/core/src/main/java/hudson/model/UserProperty.java @@ -58,7 +58,7 @@ public abstract class UserProperty implements ReconfigurableDescribable for rendering, this method returns columns to be displayed. */ public Iterable getColumns() { - return ListViewColumn.createDefaultInitialColumnList(); + return ListViewColumn.createDefaultInitialColumnList(this); } /** @@ -1044,10 +1050,18 @@ public abstract class View extends AbstractModelObject implements AccessControll * @return A {@link Categories} entity that is shown as JSON file. */ @Restricted(DoNotUse.class) - public Categories doItemCategories(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException { + public Categories doItemCategories(StaplerRequest req, StaplerResponse rsp, @QueryParameter String iconStyle) throws IOException, ServletException { getOwner().checkPermission(Item.CREATE); Categories categories = new Categories(); int order = 0; + JellyContext ctx; + + if (StringUtils.isNotBlank(iconStyle)) { + ctx = new JellyContext(); + ctx.setVariable("resURL", req.getContextPath() + Jenkins.RESOURCE_PATH); + } else { + ctx = null; + } for (TopLevelItemDescriptor descriptor : DescriptorVisibilityFilter.apply(getOwnerItemGroup(), Items.all(Jenkins.getAuthentication(), getOwnerItemGroup()))) { ItemCategory ic = ItemCategory.getCategory(descriptor); Map metadata = new HashMap(); @@ -1058,6 +1072,17 @@ public abstract class View extends AbstractModelObject implements AccessControll metadata.put("displayName", descriptor.getDisplayName()); metadata.put("description", descriptor.getDescription()); metadata.put("iconFilePathPattern", descriptor.getIconFilePathPattern()); + String iconClassName = descriptor.getIconClassName(); + if (StringUtils.isNotBlank(iconClassName)) { + metadata.put("iconClassName", iconClassName); + if (ctx != null) { + Icon icon = IconSet.icons + .getIconByClassSpec(StringUtils.join(new String[]{iconClassName, iconStyle}, " ")); + if (icon != null) { + metadata.put("iconQualifiedUrl", icon.getQualifiedUrl(ctx)); + } + } + } Category category = categories.getItem(ic.getId()); if (category != null) { @@ -1156,28 +1181,20 @@ public abstract class View extends AbstractModelObject implements AccessControll // data XMLUtils.safeTransform(source, new StreamResult(out)); out.close(); - } catch (TransformerException e) { - throw new IOException("Failed to persist configuration.xml", e); - } catch (SAXException e) { + } catch (TransformerException|SAXException e) { throw new IOException("Failed to persist configuration.xml", e); } // try to reflect the changes by reloading - InputStream in = new BufferedInputStream(new ByteArrayInputStream(out.toString().getBytes("UTF-8"))); - try { + + try (InputStream in = new BufferedInputStream(new ByteArrayInputStream(out.toString().getBytes("UTF-8")))){ // Do not allow overwriting view name as it might collide with another // view in same ViewGroup and might not satisfy Jenkins.checkGoodName. String oldname = name; - Jenkins.XSTREAM.unmarshal(new XppDriver().createReader(in), this); + Jenkins.XSTREAM.unmarshal(new Xpp3Driver().createReader(in), this); name = oldname; - } catch (StreamException e) { - throw new IOException("Unable to read",e); - } catch(ConversionException e) { - throw new IOException("Unable to read",e); - } catch(Error e) {// mostly reflection errors + } catch (StreamException | ConversionException | Error e) {// mostly reflection errors throw new IOException("Unable to read",e); - } finally { - in.close(); } save(); } @@ -1204,11 +1221,30 @@ public abstract class View extends AbstractModelObject implements AccessControll return Jenkins.getInstance().getDescriptorList(View.class); } + /** + * Returns the {@link ViewDescriptor} instances that can be instantiated for the {@link ViewGroup} in the current + * {@link StaplerRequest}. + *

      + * NOTE: Historically this method is only ever called from a {@link StaplerRequest} + * @return the list of instantiable {@link ViewDescriptor} instances for the current {@link StaplerRequest} + */ + @Nonnull public static List allInstantiable() { List r = new ArrayList(); - for (ViewDescriptor d : all()) - if(d.isInstantiable()) + StaplerRequest request = Stapler.getCurrentRequest(); + if (request == null) { + throw new IllegalStateException("This method can only be invoked from a stapler request"); + } + ViewGroup owner = request.findAncestorObject(ViewGroup.class); + if (owner == null) { + throw new IllegalStateException("This method can only be invoked from a request with a ViewGroup ancestor"); + } + for (ViewDescriptor d : DescriptorVisibilityFilter.apply(owner, all())) { + if (d.isApplicableIn(owner) && d.isInstantiable() + && owner.getACL().hasCreatePermission(Jenkins.getAuthentication(), owner, d)) { r.add(d); + } + } return r; } @@ -1253,6 +1289,7 @@ public abstract class View extends AbstractModelObject implements AccessControll if (mode==null || mode.length()==0) { if(isXmlSubmission) { View v = createViewFromXML(name, req.getInputStream()); + owner.getACL().checkCreatePermission(owner, v.getDescriptor()); v.owner = owner; rsp.setStatus(HttpServletResponse.SC_OK); return v; @@ -1261,7 +1298,7 @@ public abstract class View extends AbstractModelObject implements AccessControll } View v; - if (mode!=null && mode.equals("copy")) { + if ("copy".equals(mode)) { v = copy(req, owner, name); } else { ViewDescriptor descriptor = all().findByName(mode); @@ -1272,6 +1309,7 @@ public abstract class View extends AbstractModelObject implements AccessControll // create a view v = descriptor.newInstance(req,req.getSubmittedForm()); } + owner.getACL().checkCreatePermission(owner, v.getDescriptor()); v.owner = owner; // redirect to the config screen @@ -1302,20 +1340,14 @@ public abstract class View extends AbstractModelObject implements AccessControll * @param name Alternative name to use or null to keep the one in xml. */ public static View createViewFromXML(String name, InputStream xml) throws IOException { - InputStream in = new BufferedInputStream(xml); - try { + + try (InputStream in = new BufferedInputStream(xml)) { View v = (View) Jenkins.XSTREAM.fromXML(in); if (name != null) v.name = name; checkGoodName(v.name); return v; - } catch(StreamException e) { - throw new IOException("Unable to read",e); - } catch(ConversionException e) { - throw new IOException("Unable to read",e); - } catch(Error e) {// mostly reflection errors + } catch(StreamException|ConversionException|Error e) {// mostly reflection errors throw new IOException("Unable to read",e); - } finally { - in.close(); } } diff --git a/core/src/main/java/hudson/model/ViewDescriptor.java b/core/src/main/java/hudson/model/ViewDescriptor.java index dde3c0b9edb1bc3e305005dfee1f11d85b2ea33d..c1656cea644919df8ffd122637dcc982a7af1b4d 100644 --- a/core/src/main/java/hudson/model/ViewDescriptor.java +++ b/core/src/main/java/hudson/model/ViewDescriptor.java @@ -23,17 +23,26 @@ */ package hudson.model; +import hudson.util.FormValidation; import hudson.views.ListViewColumn; import hudson.views.ListViewColumnDescriptor; import hudson.views.ViewJobFilter; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; import java.util.Iterator; import java.util.List; +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; import jenkins.model.DirectlyModifiableTopLevelItemGroup; import jenkins.model.Jenkins; +import org.apache.commons.lang.StringUtils; +import org.jvnet.tiger_types.Types; import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.restrictions.DoNotUse; import org.kohsuke.stapler.AncestorInPath; import org.kohsuke.stapler.QueryParameter; +import org.kohsuke.stapler.Stapler; +import org.kohsuke.stapler.StaplerRequest; /** * {@link Descriptor} for {@link View}. @@ -101,6 +110,12 @@ public abstract class ViewDescriptor extends Descriptor { * Possible {@link ListViewColumnDescriptor}s that can be used with this view. */ public List> getColumnsDescriptors() { + StaplerRequest request = Stapler.getCurrentRequest(); + if (request != null) { + View view = request.findAncestorObject(clazz); + return view == null ? DescriptorVisibilityFilter.applyType(clazz, ListViewColumn.all()) + : DescriptorVisibilityFilter.apply(view, ListViewColumn.all()); + } return ListViewColumn.all(); } @@ -108,6 +123,62 @@ public abstract class ViewDescriptor extends Descriptor { * Possible {@link ViewJobFilter} types that can be used with this view. */ public List> getJobFiltersDescriptors() { + StaplerRequest request = Stapler.getCurrentRequest(); + if (request != null) { + View view = request.findAncestorObject(clazz); + return view == null ? DescriptorVisibilityFilter.applyType(clazz, ViewJobFilter.all()) + : DescriptorVisibilityFilter.apply(view, ViewJobFilter.all()); + } return ViewJobFilter.all(); } + + /** + * Validation of the display name field. + * + * @param view the view to check the new display name of. + * @param value the proposed new display name. + * @return the validation result. + * @since 2.37 + */ + @SuppressWarnings("unused") // expose utility check method to subclasses + protected FormValidation checkDisplayName(@Nonnull View view, @CheckForNull String value) { + if (StringUtils.isBlank(value)) { + // no custom name, no need to check + return FormValidation.ok(); + } + for (View v: view.owner.getViews()) { + if (v.getViewName().equals(view.getViewName())) { + continue; + } + if (StringUtils.equals(v.getDisplayName(), value)) { + return FormValidation.warning(Messages.View_DisplayNameNotUniqueWarning(value)); + } + } + return FormValidation.ok(); + } + + /** + * Returns true if this {@link View} type is applicable to the given {@link ViewGroup} type. + *

      + * Default implementation returns {@code true} always. + * + * @return true to indicate applicable, in which case the view will be instantiable within the type of owner. + * @since 2.37 + */ + public boolean isApplicable(Class ownerType) { + return true; + } + + /** + * Returns true if this {@link View} type is applicable in the specific {@link ViewGroup}. + *

      + * Default implementation returns {@link #isApplicable(Class)} for the {@link ViewGroup#getClass()}. + * + * @return true to indicate applicable, in which case the view will be instantiable within the given owner. + * @since 2.37 + */ + public boolean isApplicableIn(ViewGroup owner) { + return isApplicable(owner.getClass()); + } + } diff --git a/core/src/main/java/hudson/model/ViewGroupMixIn.java b/core/src/main/java/hudson/model/ViewGroupMixIn.java index e390005edbb57e186f8afadd96b02616ef6935dd..dcdc5a803c4de3be55b1fb575ee8a0e5f205e5c8 100644 --- a/core/src/main/java/hudson/model/ViewGroupMixIn.java +++ b/core/src/main/java/hudson/model/ViewGroupMixIn.java @@ -26,6 +26,8 @@ package hudson.model; import hudson.model.ItemGroupMixIn; import hudson.model.View; import hudson.model.ViewGroup; +import java.util.Locale; +import java.util.logging.Level; import org.kohsuke.stapler.export.Exported; import java.io.IOException; @@ -99,6 +101,15 @@ public abstract class ViewGroupMixIn { View pv = getPrimaryView(); if (pv instanceof ViewGroup) return ((ViewGroup)pv).getView(name); + if (pv instanceof AllView && AllView.DEFAULT_VIEW_NAME.equals(pv.name)) { + // JENKINS-38606: primary view is the default AllView, is somebody using an old link to localized form? + for (Locale l : Locale.getAvailableLocales()) { + if (name.equals(Messages._Hudson_ViewName().toString(l))) { + // why yes they are, let's keep that link working + return pv; + } + } + } } return null; } diff --git a/core/src/main/java/hudson/model/WorkspaceCleanupThread.java b/core/src/main/java/hudson/model/WorkspaceCleanupThread.java index e15228f3d75639a941b82c00129c4fae8abbad42..0a01a5f28fe5ca9cd329df55e244f87f76e2436e 100644 --- a/core/src/main/java/hudson/model/WorkspaceCleanupThread.java +++ b/core/src/main/java/hudson/model/WorkspaceCleanupThread.java @@ -26,6 +26,7 @@ package hudson.model; import hudson.Extension; import hudson.ExtensionList; import hudson.FilePath; +import hudson.Functions; import jenkins.util.SystemProperties; import hudson.Util; import hudson.slaves.WorkspaceList; @@ -68,7 +69,7 @@ public class WorkspaceCleanupThread extends AsyncPeriodicWork { Jenkins j = Jenkins.getInstance(); nodes.add(j); nodes.addAll(j.getNodes()); - for (TopLevelItem item : j.getAllItems(TopLevelItem.class)) { + for (TopLevelItem item : j.allItems(TopLevelItem.class)) { if (item instanceof ModifiableTopLevelItemGroup) { // no such thing as TopLevelItemGroup, and ItemGroup offers no access to its type parameter continue; // children will typically have their own workspaces as subdirectories; probably no real workspace of its own } @@ -82,10 +83,10 @@ public class WorkspaceCleanupThread extends AsyncPeriodicWork { try { check = shouldBeDeleted(item, ws, node); } catch (IOException x) { - x.printStackTrace(listener.error("Failed to check " + node.getDisplayName())); + Functions.printStackTrace(x, listener.error("Failed to check " + node.getDisplayName())); continue; } catch (InterruptedException x) { - x.printStackTrace(listener.error("Failed to check " + node.getDisplayName())); + Functions.printStackTrace(x, listener.error("Failed to check " + node.getDisplayName())); continue; } if (check) { @@ -94,9 +95,9 @@ public class WorkspaceCleanupThread extends AsyncPeriodicWork { ws.deleteRecursive(); WorkspaceList.tempDir(ws).deleteRecursive(); } catch (IOException x) { - x.printStackTrace(listener.error("Failed to delete " + ws + " on " + node.getDisplayName())); + Functions.printStackTrace(x, listener.error("Failed to delete " + ws + " on " + node.getDisplayName())); } catch (InterruptedException x) { - x.printStackTrace(listener.error("Failed to delete " + ws + " on " + node.getDisplayName())); + Functions.printStackTrace(x, listener.error("Failed to delete " + ws + " on " + node.getDisplayName())); } } } diff --git a/core/src/main/java/hudson/model/listeners/ItemListener.java b/core/src/main/java/hudson/model/listeners/ItemListener.java index 7ff530c43816ae47cc64058932cb256b8ed26ebc..c48d4db8f447f66a587628c5251657dfd8c68e07 100644 --- a/core/src/main/java/hudson/model/listeners/ItemListener.java +++ b/core/src/main/java/hudson/model/listeners/ItemListener.java @@ -24,17 +24,18 @@ package hudson.model.listeners; import com.google.common.base.Function; +import hudson.AbortException; import hudson.ExtensionPoint; import hudson.ExtensionList; import hudson.Extension; +import hudson.model.Failure; import hudson.model.Item; import hudson.model.ItemGroup; import hudson.model.Items; import hudson.security.ACL; -import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; -import jenkins.security.NotReallyRoleSensitiveCallable; +import org.acegisecurity.AccessDeniedException; /** * Receives notifications about CRUD operations of {@link Item}. @@ -56,6 +57,18 @@ public class ItemListener implements ExtensionPoint { public void onCreated(Item item) { } + /** + * Called before a job is copied into a new parent, providing the ability to veto the copy operation before it + * starts. + * + * @param src the item being copied + * @param parent the proposed parent + * @throws Failure to veto the operation. + * @since TODO + */ + public void onCheckCopy(Item src, ItemGroup parent) throws Failure { + } + /** * Called after a new job is created by copying from an existing job. * @@ -136,7 +149,7 @@ public class ItemListener implements ExtensionPoint { /** * @since 1.446 - * Called at the begenning of the orderly shutdown sequence to + * Called at the beginning of the orderly shutdown sequence to * allow plugins to clean up stuff */ public void onBeforeShutdown() { @@ -180,6 +193,27 @@ public class ItemListener implements ExtensionPoint { }); } + /** + * Call before a job is copied into a new parent, to allow the {@link ItemListener} implementations the ability + * to veto the copy operation before it starts. + * + * @param src the item being copied + * @param parent the proposed parent + * @throws Failure if the copy operation has been vetoed. + * @since TODO + */ + public static void checkBeforeCopy(final Item src, final ItemGroup parent) throws Failure { + for (ItemListener l : all()) { + try { + l.onCheckCopy(src, parent); + } catch (Failure e) { + throw e; + } catch (RuntimeException x) { + LOGGER.log(Level.WARNING, "failed to send event to listener of " + l.getClass(), x); + } + } + } + public static void fireOnCreated(final Item item) { forAll(new Function() { @Override public Void apply(ItemListener l) { @@ -240,11 +274,7 @@ public class ItemListener implements ExtensionPoint { } }); if (rootItem instanceof ItemGroup) { - for (final Item child : ACL.impersonate(ACL.SYSTEM, new NotReallyRoleSensitiveCallable,RuntimeException>() { - @Override public List call() { - return Items.getAllItems((ItemGroup) rootItem, Item.class); - } - })) { + for (final Item child : Items.allItems(ACL.SYSTEM, (ItemGroup)rootItem, Item.class)) { final String childNew = child.getFullName(); assert childNew.startsWith(newFullName); assert childNew.charAt(newFullName.length()) == '/'; diff --git a/core/src/main/java/hudson/model/listeners/SCMListener.java b/core/src/main/java/hudson/model/listeners/SCMListener.java index 161fb0f6033801c5103001fba164c3fd036bb4c6..76f5e36ec872fa1e40ae5d5f5fb0ffb9cc3c3cbd 100644 --- a/core/src/main/java/hudson/model/listeners/SCMListener.java +++ b/core/src/main/java/hudson/model/listeners/SCMListener.java @@ -51,7 +51,7 @@ import jenkins.model.Jenkins; * This is an abstract class so that methods added in the future won't break existing listeners. * *

      - * Once instanciated, use the {@link #register()} method to start receiving events. + * Once instantiated, use the {@link #register()} method to start receiving events. * * @author Kohsuke Kawaguchi * @see jenkins.model.Jenkins#getSCMListeners() diff --git a/core/src/main/java/hudson/model/queue/CauseOfBlockage.java b/core/src/main/java/hudson/model/queue/CauseOfBlockage.java index 5cb65870363776ea7a6f87160d26335d2a28cdc0..e5ba86359771f88092d1ed5982197bc48dad24d7 100644 --- a/core/src/main/java/hudson/model/queue/CauseOfBlockage.java +++ b/core/src/main/java/hudson/model/queue/CauseOfBlockage.java @@ -1,12 +1,14 @@ package hudson.model.queue; import hudson.console.ModelHyperlinkNote; +import hudson.model.Computer; import hudson.model.Queue.Task; import hudson.model.Node; import hudson.model.Messages; import hudson.model.Label; import hudson.model.TaskListener; import hudson.slaves.Cloud; +import javax.annotation.Nonnull; import org.jvnet.localizer.Localizable; /** @@ -42,8 +44,10 @@ public abstract class CauseOfBlockage { /** * Obtains a simple implementation backed by {@link Localizable}. */ - public static CauseOfBlockage fromMessage(final Localizable l) { + public static CauseOfBlockage fromMessage(@Nonnull final Localizable l) { + l.getKey(); // null check return new CauseOfBlockage() { + @Override public String getShortDescription() { return l.toString(); } @@ -103,6 +107,33 @@ public abstract class CauseOfBlockage { } } + /** + * Build is blocked because a node (or its retention strategy) is not accepting tasks. + * @since 2.37 + */ + public static final class BecauseNodeIsNotAcceptingTasks extends CauseOfBlockage implements NeedsMoreExecutor { + + public final Node node; + + public BecauseNodeIsNotAcceptingTasks(Node node) { + this.node = node; + } + + @Override + public String getShortDescription() { + Computer computer = node.toComputer(); + String name = computer != null ? computer.getDisplayName() : node.getDisplayName(); + return Messages.Node_BecauseNodeIsNotAcceptingTasks(name); + } + + @Override + public void print(TaskListener listener) { + listener.getLogger().println( + Messages.Node_BecauseNodeIsNotAcceptingTasks(ModelHyperlinkNote.encodeTo(node))); + } + + } + /** * Build is blocked because all the nodes that match a given label is offline. */ diff --git a/core/src/main/java/hudson/node_monitors/AbstractAsyncNodeMonitorDescriptor.java b/core/src/main/java/hudson/node_monitors/AbstractAsyncNodeMonitorDescriptor.java index a825594798f1f1416c132b68d57075ad2b735f20..8621f37cebe47cd29ba7bceb3aa8b313224aafe9 100644 --- a/core/src/main/java/hudson/node_monitors/AbstractAsyncNodeMonitorDescriptor.java +++ b/core/src/main/java/hudson/node_monitors/AbstractAsyncNodeMonitorDescriptor.java @@ -23,7 +23,7 @@ import static java.util.logging.Level.WARNING; * performs monitoring on all agents concurrently and asynchronously. * * @param - * represents the the result of the monitoring. + * represents the result of the monitoring. * @author Kohsuke Kawaguchi */ public abstract class AbstractAsyncNodeMonitorDescriptor extends AbstractNodeMonitorDescriptor { diff --git a/core/src/main/java/hudson/node_monitors/AbstractNodeMonitorDescriptor.java b/core/src/main/java/hudson/node_monitors/AbstractNodeMonitorDescriptor.java index c79d4ea918e63392e2e08c056278955079db9e05..ee1cd6c41db395f121c52e79b695a0a608b5167b 100644 --- a/core/src/main/java/hudson/node_monitors/AbstractNodeMonitorDescriptor.java +++ b/core/src/main/java/hudson/node_monitors/AbstractNodeMonitorDescriptor.java @@ -49,7 +49,7 @@ import java.util.logging.Logger; * and taking some action based on its result. * * @param - * represents the the result of the monitoring. + * represents the result of the monitoring. * @author Kohsuke Kawaguchi */ public abstract class AbstractNodeMonitorDescriptor extends Descriptor { diff --git a/core/src/main/java/hudson/node_monitors/MonitorMarkedNodeOffline.java b/core/src/main/java/hudson/node_monitors/MonitorMarkedNodeOffline.java index a881b745cb923b728e3ae3d53cd1f6ccf64d8435..6a75d5c14b71154477c5e13a0d7373f6c29b41bd 100644 --- a/core/src/main/java/hudson/node_monitors/MonitorMarkedNodeOffline.java +++ b/core/src/main/java/hudson/node_monitors/MonitorMarkedNodeOffline.java @@ -37,6 +37,11 @@ import hudson.Extension; */ @Extension public class MonitorMarkedNodeOffline extends AdministrativeMonitor { + @Override + public String getDisplayName() { + return Messages.MonitorMarkedNodeOffline_DisplayName(); + } + public boolean active = false; public boolean isActivated() { diff --git a/core/src/main/java/hudson/org/apache/tools/tar/TarInputStream.java b/core/src/main/java/hudson/org/apache/tools/tar/TarInputStream.java index d7d8a5b54da3e24bd7f83ea3f1d1f1306d63d77c..1e532b9f310b2421ae96d5aaa13da5d92e619e34 100644 --- a/core/src/main/java/hudson/org/apache/tools/tar/TarInputStream.java +++ b/core/src/main/java/hudson/org/apache/tools/tar/TarInputStream.java @@ -53,7 +53,7 @@ public class TarInputStream extends FilterInputStream { /** * This contents of this array is not used at all in this class, - * it is only here to avoid repreated object creation during calls + * it is only here to avoid repeated object creation during calls * to the no-arg read method. */ protected byte[] oneBuf; @@ -126,7 +126,7 @@ public class TarInputStream extends FilterInputStream { * is left in the entire archive, only in the current entry. * This value is determined from the entry's size header field * and the amount of data already read from the current entry. - * Integer.MAX_VALUE is returen in case more than Integer.MAX_VALUE + * Integer.MAX_VALUE is returned in case more than Integer.MAX_VALUE * bytes are left in the current entry in the archive. * * @return The number of available bytes for the current entry. @@ -246,7 +246,7 @@ public class TarInputStream extends FilterInputStream { this.currEntry = new TarEntry(headerBuf); if (this.debug) { - System.err.println("TarInputStream: SET CURRENTRY '" + System.err.println("TarInputStream: SET currENTRY '" + this.currEntry.getName() + "' size = " + this.currEntry.getSize()); diff --git a/core/src/main/java/hudson/os/SU.java b/core/src/main/java/hudson/os/SU.java index 5998d366c0b753b5c85e382fee17cc7fcbead9c1..fea373b4f1c899ee1e3e2a0b0d3afc29ff939fe3 100644 --- a/core/src/main/java/hudson/os/SU.java +++ b/core/src/main/java/hudson/os/SU.java @@ -152,7 +152,7 @@ public abstract class SU { ArgumentListBuilder args = new ArgumentListBuilder().add(javaExe); if(slaveJar.isFile()) args.add("-jar").add(slaveJar); - else // in production code this never happens, but during debugging this is convenientud + else // in production code this never happens, but during debugging this is convenient args.add("-cp").add(slaveJar).add(hudson.remoting.Launcher.class.getName()); if(rootPassword==null) { diff --git a/core/src/main/java/hudson/os/solaris/ZFSInstaller.java b/core/src/main/java/hudson/os/solaris/ZFSInstaller.java index 398b0a6d54bb71b5f82862c4480c328e4ef005d8..a5709e8976ad1b39b17cec622aaee0798f89190b 100644 --- a/core/src/main/java/hudson/os/solaris/ZFSInstaller.java +++ b/core/src/main/java/hudson/os/solaris/ZFSInstaller.java @@ -28,6 +28,7 @@ import com.sun.akuma.JavaVMArguments; import hudson.Launcher.LocalLauncher; import hudson.Util; import hudson.Extension; +import hudson.Functions; import jenkins.util.SystemProperties; import hudson.os.SU; import hudson.model.AdministrativeMonitor; @@ -228,7 +229,7 @@ public class ZFSInstaller extends AdministrativeMonitor implements Serializable try { datasetName = createZfsFileSystem(listener,username,password); } catch (Exception e) { - e.printStackTrace(listener.error(e.getMessage())); + Functions.printStackTrace(e, listener.error(e.getMessage())); if (e instanceof ZFSException) { ZFSException ze = (ZFSException) e; @@ -292,7 +293,7 @@ public class ZFSInstaller extends AdministrativeMonitor implements Serializable } } catch (Exception e) { // if we let any exception from here, it will prevent Hudson from starting. - e.printStackTrace(listener.error("Migration failed")); + Functions.printStackTrace(e, listener.error("Migration failed")); } // migration failed return new MigrationFailedNotice(out); diff --git a/core/src/main/java/hudson/scheduler/BaseParser.java b/core/src/main/java/hudson/scheduler/BaseParser.java index 3e43a32d7c3d343f4aa997723169f4678ed6c9ab..e846636d6fed855fffa727cdb56e502f16f3d981 100644 --- a/core/src/main/java/hudson/scheduler/BaseParser.java +++ b/core/src/main/java/hudson/scheduler/BaseParser.java @@ -37,7 +37,7 @@ import jenkins.util.SystemProperties; * @author Kohsuke Kawaguchi */ abstract class BaseParser extends LLkParser { - // lower/uppser bounds of fields (inclusive) + // lower/upper bounds of fields (inclusive) static final int[] LOWER_BOUNDS = new int[] {0,0,1,1,0}; static final int[] UPPER_BOUNDS = new int[] {59,23,31,12,7}; diff --git a/core/src/main/java/hudson/scheduler/CronTab.java b/core/src/main/java/hudson/scheduler/CronTab.java index d289dc32efd0aeeb809e6663d9fcf6fb9b82ca5c..81fa5075c90d574f5ae4870aab954df09d918778 100644 --- a/core/src/main/java/hudson/scheduler/CronTab.java +++ b/core/src/main/java/hudson/scheduler/CronTab.java @@ -326,10 +326,19 @@ public final class CronTab { * See {@link #ceil(long)}. * * This method modifies the given calendar and returns the same object. + * + * @throws RareOrImpossibleDateException if the date isn't hit in the 2 years after it indicates an impossible + * (e.g. Jun 31) date, or at least a date too rare to be useful. This addresses JENKINS-41864 and was added in TODO */ public Calendar ceil(Calendar cal) { + Calendar twoYearsFuture = (Calendar) cal.clone(); + twoYearsFuture.add(Calendar.YEAR, 2); OUTER: while (true) { + if (cal.compareTo(twoYearsFuture) > 0) { + // we went too far into the future + throw new RareOrImpossibleDateException(); + } for (CalendarField f : CalendarField.ADJUST_ORDER) { int cur = f.valueOf(cal); int next = f.ceil(this,cur); @@ -378,10 +387,20 @@ public final class CronTab { * See {@link #floor(long)} * * This method modifies the given calendar and returns the same object. + * + * @throws RareOrImpossibleDateException if the date isn't hit in the 2 years before it indicates an impossible + * (e.g. Jun 31) date, or at least a date too rare to be useful. This addresses JENKINS-41864 and was added in TODO */ public Calendar floor(Calendar cal) { + Calendar twoYearsAgo = (Calendar) cal.clone(); + twoYearsAgo.add(Calendar.YEAR, -2); + OUTER: while (true) { + if (cal.compareTo(twoYearsAgo) < 0) { + // we went too far into the past + throw new RareOrImpossibleDateException(); + } for (CalendarField f : CalendarField.ADJUST_ORDER) { int cur = f.valueOf(cal); int next = f.floor(this,cur); diff --git a/core/src/main/java/hudson/scheduler/RareOrImpossibleDateException.java b/core/src/main/java/hudson/scheduler/RareOrImpossibleDateException.java new file mode 100644 index 0000000000000000000000000000000000000000..7f2cf4e2cfec564549778cd80596da37f7d9df57 --- /dev/null +++ b/core/src/main/java/hudson/scheduler/RareOrImpossibleDateException.java @@ -0,0 +1,53 @@ +/* + * The MIT License + * + * Copyright (c) 2017 CloudBees, Inc. + * + * 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 hudson.scheduler; + +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.NoExternalUse; + +import java.util.Calendar; + +/** + * This exception is thrown when trying to determine the previous or next occurrence of a given date determines + * that it's not happened, or going to happen, within some time period (e.g. within the next year). + * + *

      This can typically have a few different reasons:

      + * + *
        + *
      • The date is impossible. For example, June 31 does never happen, so 0 0 31 6 * will never happen
      • + *
      • The date happens only rarely + *
          + *
        • February 29 being the obvious one
        • + *
        • Cron tab patterns specifying all of month, day of month, and day of week can also occur so rarely to trigger this exception
        • + *
        + *
      • + *
      + * + * @see CronTab#floor(Calendar) + * @see CronTab#ceil(Calendar) + * @since 2.49 + */ +@Restricted(NoExternalUse.class) +public class RareOrImpossibleDateException extends RuntimeException { +} diff --git a/core/src/main/java/hudson/scm/AutoBrowserHolder.java b/core/src/main/java/hudson/scm/AutoBrowserHolder.java index 10e03cb0f64af8ffa641ffd05b65f65212f752e9..001d31487180b27f97fd3285d3b93c1294c85ed4 100644 --- a/core/src/main/java/hudson/scm/AutoBrowserHolder.java +++ b/core/src/main/java/hudson/scm/AutoBrowserHolder.java @@ -76,7 +76,7 @@ final class AutoBrowserHolder { * null if no applicable configuration was found. */ private RepositoryBrowser infer() { - for( AbstractProject p : Jenkins.getInstance().getAllItems(AbstractProject.class) ) { + for( AbstractProject p : Jenkins.getInstance().allItems(AbstractProject.class) ) { SCM scm = p.getScm(); if (scm!=null && scm.getClass()==owner.getClass() && scm.getBrowser()!=null && ((SCMDescriptor)scm.getDescriptor()).isBrowserReusable(scm,owner)) { diff --git a/core/src/main/java/hudson/scm/SCM.java b/core/src/main/java/hudson/scm/SCM.java index 2cf33416658b9ad63725b6ea95920e96a94aac09..9afb80f9a1aab0de9b725b16f3e9082787c3c767 100644 --- a/core/src/main/java/hudson/scm/SCM.java +++ b/core/src/main/java/hudson/scm/SCM.java @@ -28,6 +28,7 @@ import hudson.DescriptorExtensionList; import hudson.Extension; import hudson.ExtensionPoint; import hudson.FilePath; +import hudson.Functions; import hudson.Launcher; import hudson.Util; import hudson.model.AbstractBuild; @@ -673,7 +674,7 @@ public abstract class SCM implements Describable, ExtensionPoint { createEmptyChangeLog(changelogFile, (TaskListener) listener, rootTag); return true; } catch (IOException e) { - e.printStackTrace(listener.error(e.getMessage())); + Functions.printStackTrace(e, listener.error(e.getMessage())); return false; } } diff --git a/core/src/main/java/hudson/search/CollectionSearchIndex.java b/core/src/main/java/hudson/search/CollectionSearchIndex.java index 26422553c4e477a42896441eb602b152eebd0285..bed7ca7ea8b3a381734f96ec553e974fdfb7444e 100644 --- a/core/src/main/java/hudson/search/CollectionSearchIndex.java +++ b/core/src/main/java/hudson/search/CollectionSearchIndex.java @@ -24,8 +24,10 @@ package hudson.search; import java.util.Collection; +import java.util.Collections; import java.util.List; import java.util.Map; +import javax.annotation.Nonnull; /** * {@link SearchIndex} built on a {@link Map}. @@ -44,6 +46,12 @@ public abstract class CollectionSearchIndex i */ protected abstract Collection all(); + @Nonnull + protected Iterable allAsIterable() { + Collection all = all(); + return all == null ? Collections.emptySet() : all; + } + public void find(String token, List result) { SearchItem p = get(token); if(p!=null) @@ -51,13 +59,11 @@ public abstract class CollectionSearchIndex i } public void suggest(String token, List result) { - Collection items = all(); boolean isCaseSensitive = UserSearchProperty.isCaseInsensitive(); if(isCaseSensitive){ token = token.toLowerCase(); } - if(items==null) return; - for (SMT o : items) { + for (SMT o : allAsIterable()) { String name = getName(o); if(isCaseSensitive) name=name.toLowerCase(); diff --git a/core/src/main/java/hudson/search/Search.java b/core/src/main/java/hudson/search/Search.java index c817a26dbd171ce5c9508bb16bb9e71ec13c9e41..627d77fafba4c570c86c12bac722b895764a3822 100644 --- a/core/src/main/java/hudson/search/Search.java +++ b/core/src/main/java/hudson/search/Search.java @@ -29,6 +29,8 @@ import hudson.Util; import hudson.util.EditDistance; import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; import java.util.AbstractList; import java.util.ArrayList; import java.util.Collections; @@ -40,6 +42,8 @@ import java.util.logging.Logger; import javax.servlet.ServletException; +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.NoExternalUse; import org.kohsuke.stapler.Ancestor; import org.kohsuke.stapler.QueryParameter; import org.kohsuke.stapler.StaplerRequest; @@ -60,6 +64,11 @@ import org.kohsuke.stapler.export.Flavor; * @see SearchableModelObject */ public class Search { + @Restricted(NoExternalUse.class) // used from stapler views only + public static String encodeQuery(String query) throws UnsupportedEncodingException { + return URLEncoder.encode(query, "UTF-8"); + } + public void doIndex(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException { List l = req.getAncestors(); for( int i=l.size()-1; i>=0; i-- ) { @@ -211,7 +220,7 @@ public class Search { } /** - * When there are mutiple suggested items, this method can narrow down the resultset + * When there are multiple suggested items, this method can narrow down the resultset * to the SuggestedItem that has a url that contains the query. This is useful is one * job has a display name that matches another job's project name. * @param r A list of Suggested items. It is assumed that there is at least one @@ -324,7 +333,7 @@ public class Search { /** * Returns {@link List} such that its get(end) - * returns the concatanation of [token_start,...,token_end] + * returns the concatenation of [token_start,...,token_end] * (both end inclusive.) */ public List subSequence(final int start) { diff --git a/core/src/main/java/hudson/security/ACL.java b/core/src/main/java/hudson/security/ACL.java index c72071fe4fcb5885c7bf3c00b7d78fcf91dae6a1..2febef6650cc90e4787b34fd3f7c8ab6e7630b56 100644 --- a/core/src/main/java/hudson/security/ACL.java +++ b/core/src/main/java/hudson/security/ACL.java @@ -24,6 +24,9 @@ package hudson.security; import hudson.model.User; +import hudson.model.View; +import hudson.model.ViewDescriptor; +import hudson.model.ViewGroup; import javax.annotation.CheckForNull; import javax.annotation.Nonnull; @@ -93,7 +96,7 @@ public abstract class ACL { * @param d the descriptor of the item to be created. * @throws AccessDeniedException * if the user doesn't have the permission. - * @since TODO + * @since 1.607 */ public final void checkCreatePermission(@Nonnull ItemGroup c, @Nonnull TopLevelItemDescriptor d) { @@ -113,13 +116,49 @@ public abstract class ACL { * @param d the descriptor of the item to be created. * @return false * if the user doesn't have the permission. - * @since TODO + * @since 1.607 */ public boolean hasCreatePermission(@Nonnull Authentication a, @Nonnull ItemGroup c, @Nonnull TopLevelItemDescriptor d) { return true; } + /** + * Checks if the current security principal has the permission to create views within the specified view group. + *

      + * This is just a convenience function. + * + * @param c the container of the item. + * @param d the descriptor of the view to be created. + * @throws AccessDeniedException if the user doesn't have the permission. + * @since 1.607 + */ + public final void checkCreatePermission(@Nonnull ViewGroup c, + @Nonnull ViewDescriptor d) { + Authentication a = Jenkins.getAuthentication(); + if (!hasCreatePermission(a, c, d)) { + throw new AccessDeniedException(Messages.AccessDeniedException2_MissingPermission(a.getName(), + View.CREATE.group.title + "/" + View.CREATE.name + View.CREATE + "/" + d.getDisplayName())); + } + } + + /** + * Checks if the given principal has the permission to create views within the specified view group. + *

      + * Note that {@link #SYSTEM} can be passed in as the authentication parameter, + * in which case you should probably just assume it can create anything anywhere. + * @param a the principal. + * @param c the container of the view. + * @param d the descriptor of the view to be created. + * @return false + * if the user doesn't have the permission. + * @since 2.37 + */ + public boolean hasCreatePermission(@Nonnull Authentication a, @Nonnull ViewGroup c, + @Nonnull ViewDescriptor d) { + return true; + } + // // Sid constants // diff --git a/core/src/main/java/hudson/security/AccessDeniedException2.java b/core/src/main/java/hudson/security/AccessDeniedException2.java index 0f5da052b264f889947d2b0de1294a411c985489..7b39396bf66721990964e6b7f2bbdf328800eefc 100644 --- a/core/src/main/java/hudson/security/AccessDeniedException2.java +++ b/core/src/main/java/hudson/security/AccessDeniedException2.java @@ -6,12 +6,17 @@ import org.acegisecurity.GrantedAuthority; import javax.servlet.http.HttpServletResponse; import java.io.PrintWriter; +import jenkins.util.SystemProperties; /** * {@link AccessDeniedException} with more information. * @author Kohsuke Kawaguchi */ public class AccessDeniedException2 extends AccessDeniedException { + + /** If true, report {@code X-You-Are-In-Group} headers. Disabled due to JENKINS-39402; use {@code /whoAmI} etc. to diagnose permission issues. */ + private static /* not final */ boolean REPORT_GROUP_HEADERS = SystemProperties.getBoolean(AccessDeniedException2.class.getName() + ".REPORT_GROUP_HEADERS"); + /** * This object represents the user being authenticated. */ @@ -38,8 +43,12 @@ public class AccessDeniedException2 extends AccessDeniedException { */ public void reportAsHeaders(HttpServletResponse rsp) { rsp.addHeader("X-You-Are-Authenticated-As",authentication.getName()); - for (GrantedAuthority auth : authentication.getAuthorities()) { - rsp.addHeader("X-You-Are-In-Group",auth.getAuthority()); + if (REPORT_GROUP_HEADERS) { + for (GrantedAuthority auth : authentication.getAuthorities()) { + rsp.addHeader("X-You-Are-In-Group",auth.getAuthority()); + } + } else { + rsp.addHeader("X-You-Are-In-Group-Disabled", "JENKINS-39402: use -Dhudson.security.AccessDeniedException2.REPORT_GROUP_HEADERS=true or use /whoAmI to diagnose"); } rsp.addHeader("X-Required-Permission", permission.getId()); for (Permission p=permission.impliedBy; p!=null; p=p.impliedBy) { diff --git a/core/src/main/java/hudson/security/BCrypt.java b/core/src/main/java/hudson/security/BCrypt.java new file mode 100644 index 0000000000000000000000000000000000000000..aebb6059a53050cbfe2fd7956bf4a0403b738f33 --- /dev/null +++ b/core/src/main/java/hudson/security/BCrypt.java @@ -0,0 +1,777 @@ +// Copyright (c) 2006 Damien Miller +// +// Permission to use, copy, modify, and distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +package hudson.security; // repackaged from http://www.mindrot.org/files/jBCrypt/jBCrypt-0.4.zip (and public modifier removed) + +import java.io.UnsupportedEncodingException; +import java.security.SecureRandom; + +/** + * BCrypt implements OpenBSD-style Blowfish password hashing using + * the scheme described in "A Future-Adaptable Password Scheme" by + * Niels Provos and David Mazieres. + *

      + * This password hashing system tries to thwart off-line password + * cracking using a computationally-intensive hashing algorithm, + * based on Bruce Schneier's Blowfish cipher. The work factor of + * the algorithm is parameterised, so it can be increased as + * computers get faster. + *

      + * Usage is really simple. To hash a password for the first time, + * call the hashpw method with a random salt, like this: + *

      + * + * String pw_hash = BCrypt.hashpw(plain_password, BCrypt.gensalt());
      + *
      + *

      + * To check whether a plaintext password matches one that has been + * hashed previously, use the checkpw method: + *

      + * + * if (BCrypt.checkpw(candidate_password, stored_hash))
      + *     System.out.println("It matches");
      + * else
      + *     System.out.println("It does not match");
      + *
      + *

      + * The gensalt() method takes an optional parameter (log_rounds) + * that determines the computational complexity of the hashing: + *

      + * + * String strong_salt = BCrypt.gensalt(10)
      + * String stronger_salt = BCrypt.gensalt(12)
      + *
      + *

      + * The amount of work increases exponentially (2**log_rounds), so + * each increment is twice as much work. The default log_rounds is + * 10, and the valid range is 4 to 30. + * + * @author Damien Miller + * @version 0.2 + */ +class BCrypt { + // BCrypt parameters + private static final int GENSALT_DEFAULT_LOG2_ROUNDS = 10; + private static final int BCRYPT_SALT_LEN = 16; + + // Blowfish parameters + private static final int BLOWFISH_NUM_ROUNDS = 16; + + // Initial contents of key schedule + private static final int P_orig[] = { + 0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, + 0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89, + 0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c, + 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917, + 0x9216d5d9, 0x8979fb1b + }; + private static final int S_orig[] = { + 0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, + 0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99, + 0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16, + 0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e, + 0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee, + 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013, + 0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef, + 0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e, + 0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60, + 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440, + 0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce, + 0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a, + 0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e, + 0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677, + 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193, + 0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032, + 0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88, + 0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239, + 0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e, + 0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0, + 0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3, + 0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98, + 0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88, + 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe, + 0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6, + 0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d, + 0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b, + 0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7, + 0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba, + 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463, + 0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f, + 0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09, + 0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3, + 0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb, + 0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279, + 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8, + 0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab, + 0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82, + 0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db, + 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573, + 0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0, + 0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b, + 0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790, + 0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8, + 0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4, + 0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0, + 0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7, + 0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c, + 0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad, + 0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1, + 0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299, + 0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9, + 0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477, + 0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf, + 0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49, + 0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af, + 0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa, + 0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5, + 0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41, + 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915, + 0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400, + 0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915, + 0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664, + 0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a, + 0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623, + 0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266, + 0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1, + 0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e, + 0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6, + 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1, + 0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e, + 0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1, + 0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737, + 0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8, + 0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff, + 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd, + 0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701, + 0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7, + 0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41, + 0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331, + 0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf, + 0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af, + 0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e, + 0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87, + 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c, + 0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2, + 0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16, + 0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd, + 0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b, + 0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509, + 0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e, + 0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3, + 0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f, + 0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a, + 0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4, + 0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960, + 0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66, + 0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28, + 0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802, + 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84, + 0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510, + 0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf, + 0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14, + 0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e, + 0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50, + 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7, + 0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8, + 0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281, + 0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99, + 0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696, + 0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128, + 0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73, + 0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0, + 0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0, + 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105, + 0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250, + 0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3, + 0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285, + 0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00, + 0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061, + 0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb, + 0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e, + 0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735, + 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc, + 0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9, + 0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340, + 0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20, + 0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7, + 0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934, + 0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068, + 0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af, + 0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840, + 0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45, + 0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504, + 0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a, + 0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb, + 0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee, + 0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6, + 0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42, + 0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b, + 0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2, + 0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb, + 0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527, + 0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b, + 0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33, + 0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c, + 0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3, + 0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc, + 0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17, + 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564, + 0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b, + 0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115, + 0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922, + 0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728, + 0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0, + 0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e, + 0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37, + 0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d, + 0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804, + 0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b, + 0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3, + 0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb, + 0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d, + 0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c, + 0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350, + 0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9, + 0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a, + 0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe, + 0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d, + 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc, + 0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f, + 0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61, + 0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2, + 0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9, + 0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2, + 0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c, + 0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e, + 0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633, + 0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10, + 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169, + 0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52, + 0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027, + 0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5, + 0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62, + 0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634, + 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76, + 0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24, + 0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc, + 0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4, + 0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c, + 0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837, + 0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0, + 0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b, + 0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe, + 0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b, + 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4, + 0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8, + 0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6, + 0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304, + 0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22, + 0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4, + 0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6, + 0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9, + 0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59, + 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593, + 0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51, + 0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28, + 0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c, + 0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b, + 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28, + 0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c, + 0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd, + 0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a, + 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319, + 0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb, + 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f, + 0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991, + 0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32, + 0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680, + 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166, + 0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae, + 0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb, + 0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5, + 0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47, + 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370, + 0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d, + 0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84, + 0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048, + 0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8, + 0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd, + 0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9, + 0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7, + 0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38, + 0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f, + 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c, + 0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525, + 0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1, + 0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442, + 0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964, + 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e, + 0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8, + 0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d, + 0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f, + 0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299, + 0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02, + 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc, + 0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614, + 0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a, + 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6, + 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b, + 0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0, + 0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060, + 0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e, + 0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9, + 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f, + 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6 + }; + + // bcrypt IV: "OrpheanBeholderScryDoubt". The C implementation calls + // this "ciphertext", but it is really plaintext or an IV. We keep + // the name to make code comparison easier. + static private final int bf_crypt_ciphertext[] = { + 0x4f727068, 0x65616e42, 0x65686f6c, + 0x64657253, 0x63727944, 0x6f756274 + }; + + // Table for Base64 encoding + static private final char base64_code[] = { + '.', '/', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', + 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', + 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', + 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', + 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', + '6', '7', '8', '9' + }; + + // Table for Base64 decoding + static private final byte index_64[] = { + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 0, 1, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, -1, -1, + -1, -1, -1, -1, -1, 2, 3, 4, 5, 6, + 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, + -1, -1, -1, -1, -1, -1, 28, 29, 30, + 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, -1, -1, -1, -1, -1 + }; + + // Expanded Blowfish key + private int P[]; + private int S[]; + + /** + * Encode a byte array using bcrypt's slightly-modified base64 + * encoding scheme. Note that this is *not* compatible with + * the standard MIME-base64 encoding. + * + * @param d the byte array to encode + * @param len the number of bytes to encode + * @return base64-encoded string + * @exception IllegalArgumentException if the length is invalid + */ + private static String encode_base64(byte d[], int len) + throws IllegalArgumentException { + int off = 0; + StringBuffer rs = new StringBuffer(); + int c1, c2; + + if (len <= 0 || len > d.length) + throw new IllegalArgumentException ("Invalid len"); + + while (off < len) { + c1 = d[off++] & 0xff; + rs.append(base64_code[(c1 >> 2) & 0x3f]); + c1 = (c1 & 0x03) << 4; + if (off >= len) { + rs.append(base64_code[c1 & 0x3f]); + break; + } + c2 = d[off++] & 0xff; + c1 |= (c2 >> 4) & 0x0f; + rs.append(base64_code[c1 & 0x3f]); + c1 = (c2 & 0x0f) << 2; + if (off >= len) { + rs.append(base64_code[c1 & 0x3f]); + break; + } + c2 = d[off++] & 0xff; + c1 |= (c2 >> 6) & 0x03; + rs.append(base64_code[c1 & 0x3f]); + rs.append(base64_code[c2 & 0x3f]); + } + return rs.toString(); + } + + /** + * Look up the 3 bits base64-encoded by the specified character, + * range-checking againt conversion table + * @param x the base64-encoded value + * @return the decoded value of x + */ + private static byte char64(char x) { + if ((int)x < 0 || (int)x > index_64.length) + return -1; + return index_64[(int)x]; + } + + /** + * Decode a string encoded using bcrypt's base64 scheme to a + * byte array. Note that this is *not* compatible with + * the standard MIME-base64 encoding. + * @param s the string to decode + * @param maxolen the maximum number of bytes to decode + * @return an array containing the decoded bytes + * @throws IllegalArgumentException if maxolen is invalid + */ + private static byte[] decode_base64(String s, int maxolen) + throws IllegalArgumentException { + StringBuffer rs = new StringBuffer(); + int off = 0, slen = s.length(), olen = 0; + byte ret[]; + byte c1, c2, c3, c4, o; + + if (maxolen <= 0) + throw new IllegalArgumentException ("Invalid maxolen"); + + while (off < slen - 1 && olen < maxolen) { + c1 = char64(s.charAt(off++)); + c2 = char64(s.charAt(off++)); + if (c1 == -1 || c2 == -1) + break; + o = (byte)(c1 << 2); + o |= (c2 & 0x30) >> 4; + rs.append((char)o); + if (++olen >= maxolen || off >= slen) + break; + c3 = char64(s.charAt(off++)); + if (c3 == -1) + break; + o = (byte)((c2 & 0x0f) << 4); + o |= (c3 & 0x3c) >> 2; + rs.append((char)o); + if (++olen >= maxolen || off >= slen) + break; + c4 = char64(s.charAt(off++)); + o = (byte)((c3 & 0x03) << 6); + o |= c4; + rs.append((char)o); + ++olen; + } + + ret = new byte[olen]; + for (off = 0; off < olen; off++) + ret[off] = (byte)rs.charAt(off); + return ret; + } + + /** + * Blowfish encipher a single 64-bit block encoded as + * two 32-bit halves + * @param lr an array containing the two 32-bit half blocks + * @param off the position in the array of the blocks + */ + private final void encipher(int lr[], int off) { + int i, n, l = lr[off], r = lr[off + 1]; + + l ^= P[0]; + for (i = 0; i <= BLOWFISH_NUM_ROUNDS - 2;) { + // Feistel substitution on left word + n = S[(l >> 24) & 0xff]; + n += S[0x100 | ((l >> 16) & 0xff)]; + n ^= S[0x200 | ((l >> 8) & 0xff)]; + n += S[0x300 | (l & 0xff)]; + r ^= n ^ P[++i]; + + // Feistel substitution on right word + n = S[(r >> 24) & 0xff]; + n += S[0x100 | ((r >> 16) & 0xff)]; + n ^= S[0x200 | ((r >> 8) & 0xff)]; + n += S[0x300 | (r & 0xff)]; + l ^= n ^ P[++i]; + } + lr[off] = r ^ P[BLOWFISH_NUM_ROUNDS + 1]; + lr[off + 1] = l; + } + + /** + * Cycically extract a word of key material + * @param data the string to extract the data from + * @param offp a "pointer" (as a one-entry array) to the + * current offset into data + * @return the next word of material from data + */ + private static int streamtoword(byte data[], int offp[]) { + int i; + int word = 0; + int off = offp[0]; + + for (i = 0; i < 4; i++) { + word = (word << 8) | (data[off] & 0xff); + off = (off + 1) % data.length; + } + + offp[0] = off; + return word; + } + + /** + * Initialise the Blowfish key schedule + */ + private void init_key() { + P = (int[])P_orig.clone(); + S = (int[])S_orig.clone(); + } + + /** + * Key the Blowfish cipher + * @param key an array containing the key + */ + private void key(byte key[]) { + int i; + int koffp[] = { 0 }; + int lr[] = { 0, 0 }; + int plen = P.length, slen = S.length; + + for (i = 0; i < plen; i++) + P[i] = P[i] ^ streamtoword(key, koffp); + + for (i = 0; i < plen; i += 2) { + encipher(lr, 0); + P[i] = lr[0]; + P[i + 1] = lr[1]; + } + + for (i = 0; i < slen; i += 2) { + encipher(lr, 0); + S[i] = lr[0]; + S[i + 1] = lr[1]; + } + } + + /** + * Perform the "enhanced key schedule" step described by + * Provos and Mazieres in "A Future-Adaptable Password Scheme" + * http://www.openbsd.org/papers/bcrypt-paper.ps + * @param data salt information + * @param key password information + */ + private void ekskey(byte data[], byte key[]) { + int i; + int koffp[] = { 0 }, doffp[] = { 0 }; + int lr[] = { 0, 0 }; + int plen = P.length, slen = S.length; + + for (i = 0; i < plen; i++) + P[i] = P[i] ^ streamtoword(key, koffp); + + for (i = 0; i < plen; i += 2) { + lr[0] ^= streamtoword(data, doffp); + lr[1] ^= streamtoword(data, doffp); + encipher(lr, 0); + P[i] = lr[0]; + P[i + 1] = lr[1]; + } + + for (i = 0; i < slen; i += 2) { + lr[0] ^= streamtoword(data, doffp); + lr[1] ^= streamtoword(data, doffp); + encipher(lr, 0); + S[i] = lr[0]; + S[i + 1] = lr[1]; + } + } + + /** + * Perform the central password hashing step in the + * bcrypt scheme + * @param password the password to hash + * @param salt the binary salt to hash with the password + * @param log_rounds the binary logarithm of the number + * of rounds of hashing to apply + * @param cdata the plaintext to encrypt + * @return an array containing the binary hashed password + */ + public byte[] crypt_raw(byte password[], byte salt[], int log_rounds, + int cdata[]) { + int rounds, i, j; + int clen = cdata.length; + byte ret[]; + + if (log_rounds < 4 || log_rounds > 30) + throw new IllegalArgumentException ("Bad number of rounds"); + rounds = 1 << log_rounds; + if (salt.length != BCRYPT_SALT_LEN) + throw new IllegalArgumentException ("Bad salt length"); + + init_key(); + ekskey(salt, password); + for (i = 0; i != rounds; i++) { + key(password); + key(salt); + } + + for (i = 0; i < 64; i++) { + for (j = 0; j < (clen >> 1); j++) + encipher(cdata, j << 1); + } + + ret = new byte[clen * 4]; + for (i = 0, j = 0; i < clen; i++) { + ret[j++] = (byte)((cdata[i] >> 24) & 0xff); + ret[j++] = (byte)((cdata[i] >> 16) & 0xff); + ret[j++] = (byte)((cdata[i] >> 8) & 0xff); + ret[j++] = (byte)(cdata[i] & 0xff); + } + return ret; + } + + /** + * Hash a password using the OpenBSD bcrypt scheme + * @param password the password to hash + * @param salt the salt to hash with (perhaps generated + * using BCrypt.gensalt) + * @return the hashed password + */ + public static String hashpw(String password, String salt) { + BCrypt B; + String real_salt; + byte passwordb[], saltb[], hashed[]; + char minor = (char)0; + int rounds, off = 0; + StringBuffer rs = new StringBuffer(); + + if (salt.charAt(0) != '$' || salt.charAt(1) != '2') + throw new IllegalArgumentException ("Invalid salt version"); + if (salt.charAt(2) == '$') + off = 3; + else { + minor = salt.charAt(2); + if (minor != 'a' || salt.charAt(3) != '$') + throw new IllegalArgumentException ("Invalid salt revision"); + off = 4; + } + + // Extract number of rounds + if (salt.charAt(off + 2) > '$') + throw new IllegalArgumentException ("Missing salt rounds"); + rounds = Integer.parseInt(salt.substring(off, off + 2)); + + real_salt = salt.substring(off + 3, off + 25); + try { + passwordb = (password + (minor >= 'a' ? "\000" : "")).getBytes("UTF-8"); + } catch (UnsupportedEncodingException uee) { + throw new AssertionError("UTF-8 is not supported"); + } + + saltb = decode_base64(real_salt, BCRYPT_SALT_LEN); + + B = new BCrypt(); + hashed = B.crypt_raw(passwordb, saltb, rounds, + (int[])bf_crypt_ciphertext.clone()); + + rs.append("$2"); + if (minor >= 'a') + rs.append(minor); + rs.append("$"); + if (rounds < 10) + rs.append("0"); + if (rounds > 30) { + throw new IllegalArgumentException( + "rounds exceeds maximum (30)"); + } + rs.append(Integer.toString(rounds)); + rs.append("$"); + rs.append(encode_base64(saltb, saltb.length)); + rs.append(encode_base64(hashed, + bf_crypt_ciphertext.length * 4 - 1)); + return rs.toString(); + } + + /** + * Generate a salt for use with the BCrypt.hashpw() method + * @param log_rounds the log2 of the number of rounds of + * hashing to apply - the work factor therefore increases as + * 2**log_rounds. + * @param random an instance of SecureRandom to use + * @return an encoded salt value + */ + public static String gensalt(int log_rounds, SecureRandom random) { + StringBuffer rs = new StringBuffer(); + byte rnd[] = new byte[BCRYPT_SALT_LEN]; + + random.nextBytes(rnd); + + rs.append("$2a$"); + if (log_rounds < 10) + rs.append("0"); + if (log_rounds > 30) { + throw new IllegalArgumentException( + "log_rounds exceeds maximum (30)"); + } + rs.append(Integer.toString(log_rounds)); + rs.append("$"); + rs.append(encode_base64(rnd, rnd.length)); + return rs.toString(); + } + + /** + * Generate a salt for use with the BCrypt.hashpw() method + * @param log_rounds the log2 of the number of rounds of + * hashing to apply - the work factor therefore increases as + * 2**log_rounds. + * @return an encoded salt value + */ + public static String gensalt(int log_rounds) { + return gensalt(log_rounds, new SecureRandom()); + } + + /** + * Generate a salt for use with the BCrypt.hashpw() method, + * selecting a reasonable default for the number of hashing + * rounds to apply + * @return an encoded salt value + */ + public static String gensalt() { + return gensalt(GENSALT_DEFAULT_LOG2_ROUNDS); + } + + /** + * Check that a plaintext password matches a previously hashed + * one + * @param plaintext the plaintext password to verify + * @param hashed the previously-hashed password + * @return true if the passwords match, false otherwise + */ + public static boolean checkpw(String plaintext, String hashed) { + byte hashed_bytes[]; + byte try_bytes[]; + try { + String try_pw = hashpw(plaintext, hashed); + hashed_bytes = hashed.getBytes("UTF-8"); + try_bytes = try_pw.getBytes("UTF-8"); + } catch (UnsupportedEncodingException uee) { + return false; + } + if (hashed_bytes.length != try_bytes.length) + return false; + byte ret = 0; + for (int i = 0; i < try_bytes.length; i++) + ret |= hashed_bytes[i] ^ try_bytes[i]; + return ret == 0; + } +} diff --git a/core/src/main/java/hudson/security/BasicAuthenticationFilter.java b/core/src/main/java/hudson/security/BasicAuthenticationFilter.java index 3e055d25847292dbf4ba9276021976db3f8fefdf..f0963b8c89913612b0fa863c575b221f723cdfeb 100644 --- a/core/src/main/java/hudson/security/BasicAuthenticationFilter.java +++ b/core/src/main/java/hudson/security/BasicAuthenticationFilter.java @@ -43,12 +43,12 @@ import java.io.IOException; import java.net.URLEncoder; /** - * Implements the dual authentcation mechanism. + * Implements the dual authentication mechanism. * *

      * Jenkins supports both the HTTP basic authentication and the form-based authentication. * The former is for scripted clients, and the latter is for humans. Unfortunately, - * because the servlet spec does not allow us to programatically authenticate users, + * because the servlet spec does not allow us to programmatically authenticate users, * we need to rely on some hack to make it work, and this is the class that implements * that hack. * diff --git a/core/src/main/java/hudson/security/FederatedLoginService.java b/core/src/main/java/hudson/security/FederatedLoginService.java index b966fe13d5f65cde39041b9deb213e618f1d2f28..908a8e25a0dbf2d59710a5b1b216875b233eb70e 100644 --- a/core/src/main/java/hudson/security/FederatedLoginService.java +++ b/core/src/main/java/hudson/security/FederatedLoginService.java @@ -35,6 +35,8 @@ import org.kohsuke.stapler.HttpResponse; import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerResponse; +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; import javax.servlet.ServletException; import java.io.IOException; import java.io.Serializable; @@ -99,12 +101,14 @@ public abstract class FederatedLoginService implements ExtensionPoint { * The object is bound to /federatedLoginService/URLNAME/. The url name needs to be unique among all * {@link FederatedLoginService}s. */ + @Nonnull public abstract String getUrlName(); /** * Returns your implementation of {@link FederatedLoginServiceUserProperty} that stores * opaque identifiers. */ + @Nonnull public abstract Class getUserPropertyClass(); /** @@ -117,6 +121,7 @@ public abstract class FederatedLoginService implements ExtensionPoint { * * @return must not be null. */ + @Nonnull public abstract String getIdentifier(); /** @@ -125,6 +130,7 @@ public abstract class FederatedLoginService implements ExtensionPoint { * * @return null if this information is not available. */ + @CheckForNull public abstract String getNickname(); /** @@ -132,6 +138,7 @@ public abstract class FederatedLoginService implements ExtensionPoint { * * @return null if this information is not available. */ + @CheckForNull public abstract String getFullName(); /** @@ -139,6 +146,7 @@ public abstract class FederatedLoginService implements ExtensionPoint { * * @return null if this information is not available. */ + @CheckForNull public abstract String getEmailAddress(); /** @@ -150,6 +158,7 @@ public abstract class FederatedLoginService implements ExtensionPoint { /** * Locates the user who owns this identifier. */ + @CheckForNull public final User locateUser() { Class pt = getUserPropertyClass(); String id = getIdentifier(); @@ -175,6 +184,7 @@ public abstract class FederatedLoginService implements ExtensionPoint { * a user registration session (provided that {@link SecurityRealm} supports that.) */ @SuppressWarnings("ACL.impersonate") + @Nonnull public User signin() throws UnclaimedIdentityException { User u = locateUser(); if (u!=null) { diff --git a/core/src/main/java/hudson/security/GlobalSecurityConfiguration.java b/core/src/main/java/hudson/security/GlobalSecurityConfiguration.java index 5fa446fef78979095cdd601dbb5fcb5f417ccfa0..751ad92f93c8e8813253c86d47e029419ebe04aa 100644 --- a/core/src/main/java/hudson/security/GlobalSecurityConfiguration.java +++ b/core/src/main/java/hudson/security/GlobalSecurityConfiguration.java @@ -49,6 +49,9 @@ import net.sf.json.JSONArray; import net.sf.json.JSONObject; import org.jenkinsci.Symbol; +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.DoNotUse; +import org.kohsuke.accmod.restrictions.NoExternalUse; import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerResponse; @@ -72,6 +75,15 @@ public class GlobalSecurityConfiguration extends ManagementLink implements Descr return Jenkins.getInstance().getSlaveAgentPort(); } + /** + * @since 2.24 + * @return true if the slave agent port is enforced on this instance. + */ + @Restricted(NoExternalUse.class) + public boolean isSlaveAgentPortEnforced() { + return Jenkins.getInstance().isSlaveAgentPortEnforced(); + } + public Set getAgentProtocols() { return Jenkins.getInstance().getAgentProtocols(); } @@ -102,10 +114,12 @@ public class GlobalSecurityConfiguration extends ManagementLink implements Descr j.setDisableRememberMe(security.optBoolean("disableRememberMe", false)); j.setSecurityRealm(SecurityRealm.all().newInstanceFromRadioList(security, "realm")); j.setAuthorizationStrategy(AuthorizationStrategy.all().newInstanceFromRadioList(security, "authorization")); - try { - j.setSlaveAgentPort(new ServerTcpPort(security.getJSONObject("slaveAgentPort")).getPort()); - } catch (IOException e) { - throw new hudson.model.Descriptor.FormException(e, "slaveAgentPortType"); + if (!isSlaveAgentPortEnforced()) { + try { + j.setSlaveAgentPort(new ServerTcpPort(security.getJSONObject("slaveAgentPort")).getPort()); + } catch (IOException e) { + throw new hudson.model.Descriptor.FormException(e, "slaveAgentPortType"); + } } Set agentProtocols = new TreeSet<>(); if (security.has("agentProtocol")) { diff --git a/core/src/main/java/hudson/security/HudsonPrivateSecurityRealm.java b/core/src/main/java/hudson/security/HudsonPrivateSecurityRealm.java index ca95fba12940d941dfb515a2ccaa7b83ee826d89..fdd12e2df10a5811b004e7a5be4e1ce2acdee672 100644 --- a/core/src/main/java/hudson/security/HudsonPrivateSecurityRealm.java +++ b/core/src/main/java/hudson/security/HudsonPrivateSecurityRealm.java @@ -60,7 +60,6 @@ import org.kohsuke.stapler.HttpResponses; import org.kohsuke.stapler.Stapler; import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerResponse; -import org.mindrot.jbcrypt.BCrypt; import org.springframework.dao.DataAccessException; import javax.servlet.Filter; diff --git a/core/src/main/java/hudson/security/Permission.java b/core/src/main/java/hudson/security/Permission.java index 2bfdeb0bc9bffb6ff506f9999c58d3fce6bc9c58..431ad0fd1d887c4579378b67dc60a8b97d0894ea 100644 --- a/core/src/main/java/hudson/security/Permission.java +++ b/core/src/main/java/hudson/security/Permission.java @@ -314,7 +314,7 @@ public final class Permission { // // Root Permissions. // -// These permisisons are meant to be used as the 'impliedBy' permission for other more specific permissions. +// These permissions are meant to be used as the 'impliedBy' permission for other more specific permissions. // The intention is to allow a simplified AuthorizationStrategy implementation agnostic to // specific permissions. diff --git a/core/src/main/java/hudson/security/PermissionGroup.java b/core/src/main/java/hudson/security/PermissionGroup.java index 724e3594629dd8875f7370ddcd1c392f193d0cbe..13542cf4a884342883700f8e6d945c83fe95dac7 100644 --- a/core/src/main/java/hudson/security/PermissionGroup.java +++ b/core/src/main/java/hudson/security/PermissionGroup.java @@ -30,6 +30,8 @@ import java.util.List; import java.util.SortedSet; import java.util.TreeSet; import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + import org.jvnet.localizer.Localizable; /** @@ -39,6 +41,8 @@ import org.jvnet.localizer.Localizable; */ public final class PermissionGroup implements Iterable, Comparable { private final SortedSet permissions = new TreeSet(Permission.ID_COMPARATOR); + + @Nonnull public final Class owner; /** @@ -53,7 +57,7 @@ public final class PermissionGroup implements Iterable, Comparable

      , Extension text = null; } if (text != null) { - OutputStream o = rsp.getCompressedOutputStream(req); - try { + try (OutputStream o = rsp.getCompressedOutputStream(req)) { rsp.setContentType("text/plain;charset=UTF-8"); o.write(text.getBytes("UTF-8")); - } finally { - o.close(); } } else { super.doXml(req, rsp, xpath, wrapper, tree, depth); diff --git a/core/src/main/java/hudson/slaves/ChannelPinger.java b/core/src/main/java/hudson/slaves/ChannelPinger.java index 2bc6d4cffba786883e005f1adf79f40221c8c304..0d4dae702ca82e6daaf5f487ffc8a392c60ff50a 100644 --- a/core/src/main/java/hudson/slaves/ChannelPinger.java +++ b/core/src/main/java/hudson/slaves/ChannelPinger.java @@ -36,10 +36,9 @@ import jenkins.slaves.PingFailureAnalyzer; import java.io.IOException; import java.util.concurrent.atomic.AtomicBoolean; +import java.util.logging.Level; import java.util.logging.Logger; -import static java.util.logging.Level.*; - /** * Establish a periodic ping to keep connections between {@link Slave slaves} * and the main Jenkins node alive. This prevents network proxies from @@ -49,17 +48,40 @@ import static java.util.logging.Level.*; */ @Extension public class ChannelPinger extends ComputerListener { - private static final Logger LOGGER = Logger.getLogger(ChannelPinger.class.getName()); - private static final String SYS_PROPERTY_NAME = ChannelPinger.class.getName() + ".pingInterval"; - private static final int DEFAULT_PING_INTERVAL_MIN = 5; + static final int PING_TIMEOUT_SECONDS_DEFAULT = 4 * 60; + static final int PING_INTERVAL_SECONDS_DEFAULT = 5 * 60; + private static final Logger LOGGER = Logger.getLogger(ChannelPinger.class.getName()); + private static final String TIMEOUT_SECONDS_PROPERTY = ChannelPinger.class.getName() + ".pingTimeoutSeconds"; + private static final String INTERVAL_MINUTES_PROPERTY_DEPRECATED = ChannelPinger.class.getName() + ".pingInterval"; + private static final String INTERVAL_SECONDS_PROPERTY = ChannelPinger.class.getName() + ".pingIntervalSeconds"; + + /** + * Timeout for the ping in seconds. + */ + private int pingTimeoutSeconds = SystemProperties.getInteger(TIMEOUT_SECONDS_PROPERTY, PING_TIMEOUT_SECONDS_DEFAULT, Level.WARNING); + /** - * Interval for the ping in minutes. + * Interval for the ping in seconds. */ - private final int pingInterval; + private int pingIntervalSeconds = PING_INTERVAL_SECONDS_DEFAULT; public ChannelPinger() { - pingInterval = SystemProperties.getInteger(SYS_PROPERTY_NAME, DEFAULT_PING_INTERVAL_MIN); + + Integer interval = SystemProperties.getInteger(INTERVAL_SECONDS_PROPERTY, null, Level.WARNING); + + // if interval wasn't set we read the deprecated property in minutes + if (interval == null) { + interval = SystemProperties.getInteger(INTERVAL_MINUTES_PROPERTY_DEPRECATED,null, Level.WARNING); + if (interval != null) { + LOGGER.warning(INTERVAL_MINUTES_PROPERTY_DEPRECATED + " property is deprecated, " + INTERVAL_SECONDS_PROPERTY + " should be used"); + interval *= 60; //to seconds + } + } + + if (interval != null) { + pingIntervalSeconds = interval; + } } @Override @@ -68,13 +90,13 @@ public class ChannelPinger extends ComputerListener { } public void install(Channel channel) { - if (pingInterval < 1) { - LOGGER.fine("Agent ping is disabled"); + if (pingTimeoutSeconds < 1 || pingIntervalSeconds < 1) { + LOGGER.warning("Agent ping is disabled"); return; } try { - channel.call(new SetUpRemotePing(pingInterval)); + channel.call(new SetUpRemotePing(pingTimeoutSeconds, pingIntervalSeconds)); LOGGER.fine("Set up a remote ping for " + channel.getName()); } catch (Exception e) { LOGGER.severe("Failed to set up a ping for " + channel.getName()); @@ -82,26 +104,69 @@ public class ChannelPinger extends ComputerListener { // set up ping from both directions, so that in case of a router dropping a connection, // both sides can notice it and take compensation actions. - setUpPingForChannel(channel, pingInterval, true); + setUpPingForChannel(channel, pingTimeoutSeconds, pingIntervalSeconds, true); } - private static class SetUpRemotePing extends MasterToSlaveCallable { + static class SetUpRemotePing extends MasterToSlaveCallable { private static final long serialVersionUID = -2702219700841759872L; - private int pingInterval; - public SetUpRemotePing(int pingInterval) { - this.pingInterval = pingInterval; + @Deprecated + private transient int pingInterval; + private final int pingTimeoutSeconds; + private final int pingIntervalSeconds; + + SetUpRemotePing(int pingTimeoutSeconds, int pingIntervalSeconds) { + this.pingTimeoutSeconds = pingTimeoutSeconds; + this.pingIntervalSeconds = pingIntervalSeconds; } + @Override public Void call() throws IOException { - setUpPingForChannel(Channel.current(), pingInterval, false); + setUpPingForChannel(Channel.current(), pingTimeoutSeconds, pingIntervalSeconds, false); return null; } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + pingIntervalSeconds; + result = prime * result + pingTimeoutSeconds; + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + SetUpRemotePing other = (SetUpRemotePing) obj; + if (pingIntervalSeconds != other.pingIntervalSeconds) { + return false; + } + if (pingTimeoutSeconds != other.pingTimeoutSeconds) { + return false; + } + return true; + } + + protected Object readResolve() { + if (pingInterval != 0) { + return new SetUpRemotePing(PING_TIMEOUT_SECONDS_DEFAULT, pingInterval * 60); + } + return this; + } } - private static void setUpPingForChannel(final Channel channel, int interval, final boolean analysis) { - LOGGER.log(FINE, "setting up ping on {0} at interval {1}m", new Object[] {channel.getName(), interval}); + static void setUpPingForChannel(final Channel channel, int timeoutSeconds, int intervalSeconds, final boolean analysis) { + LOGGER.log(Level.FINE, "setting up ping on {0} with a {1} seconds interval and {2} seconds timeout", new Object[] {channel.getName(), intervalSeconds, timeoutSeconds}); final AtomicBoolean isInClosed = new AtomicBoolean(false); - final PingThread t = new PingThread(channel, interval * 60 * 1000) { + final PingThread t = new PingThread(channel, timeoutSeconds * 1000L, intervalSeconds * 1000L) { @Override protected void onDead(Throwable cause) { try { @@ -109,13 +174,13 @@ public class ChannelPinger extends ComputerListener { analyze(cause); } if (isInClosed.get()) { - LOGGER.log(FINE,"Ping failed after the channel "+channel.getName()+" is already partially closed.",cause); + LOGGER.log(Level.FINE,"Ping failed after the channel "+channel.getName()+" is already partially closed.",cause); } else { - LOGGER.log(INFO,"Ping failed. Terminating the channel "+channel.getName()+".",cause); + LOGGER.log(Level.INFO,"Ping failed. Terminating the channel "+channel.getName()+".",cause); channel.close(cause); } } catch (IOException e) { - LOGGER.log(SEVERE,"Failed to terminate the channel "+channel.getName(),e); + LOGGER.log(Level.SEVERE,"Failed to terminate the channel "+channel.getName(),e); } } /** Keep in a separate method so we do not even try to do class loading on {@link PingFailureAnalyzer} from an agent JVM. */ @@ -141,6 +206,7 @@ public class ChannelPinger extends ComputerListener { }); t.start(); - LOGGER.fine("Ping thread started for " + channel + " with a " + interval + " minute interval"); + LOGGER.log(Level.FINE, "Ping thread started for {0} with a {1} seconds interval and a {2} seconds timeout", + new Object[] { channel, intervalSeconds, timeoutSeconds }); } } diff --git a/core/src/main/java/hudson/slaves/Cloud.java b/core/src/main/java/hudson/slaves/Cloud.java index 651ba81f5aaee0c4b13d27395e2d58e321287782..ee35c0442657e7b25e9b8456f3d604cb64de0665 100644 --- a/core/src/main/java/hudson/slaves/Cloud.java +++ b/core/src/main/java/hudson/slaves/Cloud.java @@ -28,6 +28,7 @@ import hudson.Extension; import hudson.DescriptorExtensionList; import hudson.model.Computer; import hudson.model.Slave; +import hudson.security.PermissionScope; import hudson.slaves.NodeProvisioner.PlannedNode; import hudson.model.Describable; import jenkins.model.Jenkins; @@ -42,6 +43,7 @@ import hudson.util.DescriptorList; import org.kohsuke.stapler.DataBoundConstructor; import java.util.Collection; +import java.util.concurrent.Future; /** * Creates {@link Node}s to dynamically expand/shrink the agents attached to Hudson. @@ -175,10 +177,14 @@ public abstract class Cloud extends AbstractModelObject implements ExtensionPoin return Jenkins.getInstance().>getDescriptorList(Cloud.class); } + private static final PermissionScope PERMISSION_SCOPE = new PermissionScope(Cloud.class); + /** * Permission constant to control mutation operations on {@link Cloud}. * * This includes provisioning a new node, as well as removing it. */ - public static final Permission PROVISION = Jenkins.ADMINISTER; + public static final Permission PROVISION = new Permission( + Computer.PERMISSIONS, "Provision", Messages._Cloud_ProvisionPermission_Description(), Jenkins.ADMINISTER, PERMISSION_SCOPE + ); } diff --git a/core/src/main/java/hudson/slaves/CloudProvisioningListener.java b/core/src/main/java/hudson/slaves/CloudProvisioningListener.java index 7789824d5f9ae777de5822cab951d9bb094c7a70..d538fbb049acd4439274b585f6bca16a3720c22a 100644 --- a/core/src/main/java/hudson/slaves/CloudProvisioningListener.java +++ b/core/src/main/java/hudson/slaves/CloudProvisioningListener.java @@ -5,9 +5,12 @@ import hudson.ExtensionPoint; import hudson.model.Label; import hudson.model.Node; import hudson.model.queue.CauseOfBlockage; +import jenkins.model.Jenkins; import java.util.Collection; +import javax.annotation.Nonnull; + /** * Allows extensions to be notified of events in any {@link Cloud} and to prevent * provisioning from a {@link Cloud}. @@ -53,6 +56,7 @@ public abstract class CloudProvisioningListener implements ExtensionPoint { /** * Called when the {@link NodeProvisioner.PlannedNode#future} completes. + * * @param plannedNode the plannedNode which resulted in the node being provisioned * @param node the node which has been provisioned by the cloud */ @@ -60,21 +64,48 @@ public abstract class CloudProvisioningListener implements ExtensionPoint { } + /** + * Called when the nodeis fully connected in the Jenkins. + * + * @param plannedNode the plannedNode which resulted in the node being provisioned + * @param node the node which has been provisioned by the cloud + * + * @since 2.37 + */ + public void onCommit(@Nonnull NodeProvisioner.PlannedNode plannedNode, @Nonnull Node node) { + // Noop by default + } + /** * Called when {@link NodeProvisioner.PlannedNode#future#get()} throws an exception. * - * @param plannedNode the planned node which failed to launch + * @param plannedNode the planned node which failed to provision * @param t the exception */ public void onFailure(NodeProvisioner.PlannedNode plannedNode, Throwable t) { } + /** + * Called when {@link Jenkins#addNode(Node)} throws an exception. + * + * @param plannedNode the plannedNode which resulted in the node being provisioned + * @param node the node which has been provisioned by the cloud + * @param t the exception + * + * @since 2.37 + */ + public void onRollback(@Nonnull NodeProvisioner.PlannedNode plannedNode, @Nonnull Node node, + @Nonnull Throwable t) { + // Noop by default + } + /** * All the registered {@link CloudProvisioningListener}s. */ public static ExtensionList all() { return ExtensionList.lookup(CloudProvisioningListener.class); } + } diff --git a/core/src/main/java/hudson/slaves/CommandLauncher.java b/core/src/main/java/hudson/slaves/CommandLauncher.java index 832e392ea3abf24e19492f31fb48fa8d16c675d6..4f7c075a068b67ea7d7d690ce879c4f096b18c0c 100644 --- a/core/src/main/java/hudson/slaves/CommandLauncher.java +++ b/core/src/main/java/hudson/slaves/CommandLauncher.java @@ -27,6 +27,7 @@ import hudson.AbortException; import hudson.EnvVars; import hudson.Util; import hudson.Extension; +import hudson.Functions; import hudson.model.Descriptor; import hudson.model.Slave; import jenkins.model.Jenkins; @@ -143,11 +144,11 @@ public class CommandLauncher extends ComputerLauncher { LOGGER.info("agent launched for " + computer.getDisplayName()); } catch (InterruptedException e) { - e.printStackTrace(listener.error(Messages.ComputerLauncher_abortedLaunch())); + Functions.printStackTrace(e, listener.error(Messages.ComputerLauncher_abortedLaunch())); } catch (RuntimeException e) { - e.printStackTrace(listener.error(Messages.ComputerLauncher_unexpectedError())); + Functions.printStackTrace(e, listener.error(Messages.ComputerLauncher_unexpectedError())); } catch (Error e) { - e.printStackTrace(listener.error(Messages.ComputerLauncher_unexpectedError())); + Functions.printStackTrace(e, listener.error(Messages.ComputerLauncher_unexpectedError())); } catch (IOException e) { Util.displayIOException(e, listener); @@ -159,14 +160,14 @@ public class CommandLauncher extends ComputerLauncher { } msg = hudson.model.Messages.Slave_UnableToLaunch(computer.getDisplayName(), msg); LOGGER.log(Level.SEVERE, msg, e); - e.printStackTrace(listener.error(msg)); + Functions.printStackTrace(e, listener.error(msg)); if(_proc!=null) { reportProcessTerminated(_proc, listener); try { ProcessTree.get().killAll(_proc, _cookie); } catch (InterruptedException x) { - x.printStackTrace(listener.error(Messages.ComputerLauncher_abortedLaunch())); + Functions.printStackTrace(x, listener.error(Messages.ComputerLauncher_abortedLaunch())); } } } diff --git a/core/src/main/java/hudson/slaves/ComputerLauncher.java b/core/src/main/java/hudson/slaves/ComputerLauncher.java index cbca34f3ff52bdf1434b4280c7f89315cc143cdb..603df116de66f8466fd6a7962547430cc85c1ab4 100644 --- a/core/src/main/java/hudson/slaves/ComputerLauncher.java +++ b/core/src/main/java/hudson/slaves/ComputerLauncher.java @@ -82,7 +82,7 @@ public abstract class ComputerLauncher extends AbstractDescribableImplIf you are delegating to another {@link ComputerLauncher} you must extend this base class + * * @author Kohsuke Kawaguchi * @since 1.382 */ diff --git a/core/src/main/java/hudson/slaves/NodeDescriptor.java b/core/src/main/java/hudson/slaves/NodeDescriptor.java index d75d3a15291eef24bfbc228c36c804a79a4f9093..6f06289c38d35390d9a9a099b66dabb63965eca2 100644 --- a/core/src/main/java/hudson/slaves/NodeDescriptor.java +++ b/core/src/main/java/hudson/slaves/NodeDescriptor.java @@ -99,7 +99,7 @@ public abstract class NodeDescriptor extends Descriptor { public FormValidation doCheckName(@QueryParameter String value ) { String name = Util.fixEmptyAndTrim(value); if(name==null) - return FormValidation.error(Messages.NodeDescripter_CheckName_Mandatory()); + return FormValidation.error(Messages.NodeDescriptor_CheckName_Mandatory()); try { Jenkins.checkGoodName(name); } catch (Failure f) { diff --git a/core/src/main/java/hudson/slaves/NodeProvisioner.java b/core/src/main/java/hudson/slaves/NodeProvisioner.java index bcde3623b4e6ce325c8ecc6f577f31ca891040f2..af141a048f74d8cf157d31133907b000460a6579 100644 --- a/core/src/main/java/hudson/slaves/NodeProvisioner.java +++ b/core/src/main/java/hudson/slaves/NodeProvisioner.java @@ -23,6 +23,7 @@ */ package hudson.slaves; +import hudson.AbortException; import hudson.ExtensionPoint; import hudson.model.*; import jenkins.model.Jenkins; @@ -217,36 +218,48 @@ public class NodeProvisioner { PlannedNode f = itr.next(); if (f.future.isDone()) { try { - Node node = f.future.get(); - for (CloudProvisioningListener cl : CloudProvisioningListener.all()) { - cl.onComplete(f, node); - } - - jenkins.addNode(node); - LOGGER.log(Level.INFO, - "{0} provisioning successfully completed. " - + "We have now {1,number,integer} computer(s)", - new Object[]{f.displayName, jenkins.getComputers().length}); - } catch (InterruptedException e) { - throw new AssertionError(e); // since we confirmed that the future is already done - } catch (ExecutionException e) { - LOGGER.log(Level.WARNING, "Provisioned agent " + f.displayName + " failed to launch", - e.getCause()); - for (CloudProvisioningListener cl : CloudProvisioningListener.all()) { - cl.onFailure(f, e.getCause()); + Node node = null; + try { + node = f.future.get(); + } catch (InterruptedException e) { + throw new AssertionError("InterruptedException occurred", e); // since we confirmed that the future is already done + } catch (ExecutionException e) { + Throwable cause = e.getCause(); + if (!(cause instanceof AbortException)) { + LOGGER.log(Level.WARNING, + "Unexpected exception encountered while provisioning agent " + + f.displayName, + cause); + } + fireOnFailure(f, cause); } - } catch (IOException e) { - LOGGER.log(Level.WARNING, "Provisioned agent " + f.displayName + " failed to launch", - e); - for (CloudProvisioningListener cl : CloudProvisioningListener.all()) { - cl.onFailure(f, e); + + if (node != null) { + fireOnComplete(f, node); + + try { + jenkins.addNode(node); + LOGGER.log(Level.INFO, + "{0} provisioning successfully completed. " + + "We have now {1,number,integer} computer(s)", + new Object[]{f.displayName, jenkins.getComputers().length}); + fireOnCommit(f, node); + } catch (IOException e) { + LOGGER.log(Level.WARNING, + "Provisioned agent " + f.displayName + " failed to launch", + e); + fireOnRollback(f, node, e); + } } } catch (Error e) { // we are not supposed to try and recover from Errors throw e; } catch (Throwable e) { - LOGGER.log(Level.SEVERE, "Unexpected uncaught exception encountered while " - + "processing provisioned agent " + f.displayName, e); + // Just log it + LOGGER.log(Level.SEVERE, + "Unexpected uncaught exception encountered while processing agent " + + f.displayName, + e); } finally { while (true) { List orig = pendingLaunches.get(); @@ -701,9 +714,7 @@ public class NodeProvisioner { Collection additionalCapacities = c.provision(state.getLabel(), workloadToProvision); - for (CloudProvisioningListener cl : CloudProvisioningListener.all()) { - cl.onStarted(c, state.getLabel(), additionalCapacities); - } + fireOnStarted(c, state.getLabel(), additionalCapacities); for (PlannedNode ac : additionalCapacities) { excessWorkload -= ac.numExecutors; @@ -817,4 +828,76 @@ public class NodeProvisioner { } return defaultValue; } + + private static void fireOnFailure(final NodeProvisioner.PlannedNode plannedNode, final Throwable cause) { + for (CloudProvisioningListener cl : CloudProvisioningListener.all()) { + try { + cl.onFailure(plannedNode, cause); + } catch (Error e) { + throw e; + } catch (Throwable e) { + LOGGER.log(Level.SEVERE, "Unexpected uncaught exception encountered while " + + "processing onFailure() listener call in " + cl + " for agent " + + plannedNode.displayName, e); + } + } + } + + private static void fireOnRollback(final NodeProvisioner.PlannedNode plannedNode, final Node newNode, + final Throwable cause) { + for (CloudProvisioningListener cl : CloudProvisioningListener.all()) { + try { + cl.onRollback(plannedNode, newNode, cause); + } catch (Error e) { + throw e; + } catch (Throwable e) { + LOGGER.log(Level.SEVERE, "Unexpected uncaught exception encountered while " + + "processing onRollback() listener call in " + cl + " for agent " + + newNode.getDisplayName(), e); + } + } + } + + private static void fireOnComplete(final NodeProvisioner.PlannedNode plannedNode, final Node newNode) { + for (CloudProvisioningListener cl : CloudProvisioningListener.all()) { + try { + cl.onComplete(plannedNode, newNode); + } catch (Error e) { + throw e; + } catch (Throwable e) { + LOGGER.log(Level.SEVERE, "Unexpected uncaught exception encountered while " + + "processing onComplete() listener call in " + cl + " for agent " + + plannedNode.displayName, e); + } + } + } + + private static void fireOnCommit(final NodeProvisioner.PlannedNode plannedNode, final Node newNode) { + for (CloudProvisioningListener cl : CloudProvisioningListener.all()) { + try { + cl.onCommit(plannedNode, newNode); + } catch (Error e) { + throw e; + } catch (Throwable e) { + LOGGER.log(Level.SEVERE, "Unexpected uncaught exception encountered while " + + "processing onCommit() listener call in " + cl + " for agent " + + newNode.getDisplayName(), e); + } + } + } + + private static void fireOnStarted(final Cloud cloud, final Label label, + final Collection plannedNodes) { + for (CloudProvisioningListener cl : CloudProvisioningListener.all()) { + try { + cl.onStarted(cloud, label, plannedNodes); + } catch (Error e) { + throw e; + } catch (Throwable e) { + LOGGER.log(Level.SEVERE, "Unexpected uncaught exception encountered while " + + "processing onStarted() listener call in " + cl + " for label " + + label.toString(), e); + } + } + } } diff --git a/core/src/main/java/hudson/slaves/NodeSpecific.java b/core/src/main/java/hudson/slaves/NodeSpecific.java index 59ee2ca217dfaeb99db40d7c69bbefbf58f46f00..e40ef509dfaf96284d7c92d5913af9fa185e698b 100644 --- a/core/src/main/java/hudson/slaves/NodeSpecific.java +++ b/core/src/main/java/hudson/slaves/NodeSpecific.java @@ -24,10 +24,11 @@ package hudson.slaves; -import edu.umd.cs.findbugs.annotations.NonNull; import hudson.model.Node; import hudson.model.EnvironmentSpecific; import hudson.model.TaskListener; + +import javax.annotation.Nonnull; import java.io.IOException; /** @@ -45,5 +46,5 @@ public interface NodeSpecific> { /** * Returns a specialized copy of T for functioning in the given node. */ - T forNode(@NonNull Node node, TaskListener log) throws IOException, InterruptedException; + T forNode(@Nonnull Node node, TaskListener log) throws IOException, InterruptedException; } diff --git a/core/src/main/java/hudson/slaves/OfflineCause.java b/core/src/main/java/hudson/slaves/OfflineCause.java index 7f7704d712162073f05e9ef300f155391d30323a..3d711dd5f0ccd710fd267d94172871879b88aa36 100644 --- a/core/src/main/java/hudson/slaves/OfflineCause.java +++ b/core/src/main/java/hudson/slaves/OfflineCause.java @@ -24,16 +24,19 @@ package hudson.slaves; -import jenkins.model.Jenkins; import hudson.Functions; import hudson.model.Computer; import hudson.model.User; +import jenkins.model.Jenkins; import org.jvnet.localizer.Localizable; import org.kohsuke.stapler.export.ExportedBean; import org.kohsuke.stapler.export.Exported; +import javax.annotation.CheckForNull; import javax.annotation.Nonnull; +import java.io.ObjectStreamException; +import java.util.Collections; import java.util.Date; /** @@ -128,21 +131,49 @@ public abstract class OfflineCause { /** * Taken offline by user. + * * @since 1.551 */ public static class UserCause extends SimpleOfflineCause { - private final User user; - - public UserCause(User user, String message) { - super(hudson.slaves.Messages._SlaveComputer_DisconnectedBy( - user!=null ? user.getId() : Jenkins.ANONYMOUS.getName(), + @Deprecated + private transient User user; + // null when unknown + private /*final*/ @CheckForNull String userId; + + public UserCause(@CheckForNull User user, @CheckForNull String message) { + this( + user != null ? user.getId() : null, message != null ? " : " + message : "" - )); - this.user = user; + ); + } + + private UserCause(String userId, String message) { + super(hudson.slaves.Messages._SlaveComputer_DisconnectedBy(userId != null ? userId : Jenkins.ANONYMOUS.getName(), message)); + this.userId = userId; } public User getUser() { - return user; + return userId == null + ? User.getUnknown() + : User.getById(userId, true) + ; + } + + // Storing the User in a filed was a mistake, switch to userId + @SuppressWarnings("deprecation") + private Object readResolve() throws ObjectStreamException { + if (user != null) { + String id = user.getId(); + if (id != null) { + userId = id; + } else { + // The user field is not properly deserialized so id may be missing. Look the user up by fullname + User user = User.get(this.user.getFullName(), true, Collections.emptyMap()); + userId = user.getId(); + } + this.user = null; + } + return this; } } diff --git a/core/src/main/java/hudson/slaves/RetentionStrategy.java b/core/src/main/java/hudson/slaves/RetentionStrategy.java index 90fa17331de5f39f0e7d54271d45a9f9d31d52d0..3d8c79e544ad1f154e00a695e9edef3c9361dc54 100644 --- a/core/src/main/java/hudson/slaves/RetentionStrategy.java +++ b/core/src/main/java/hudson/slaves/RetentionStrategy.java @@ -181,7 +181,7 @@ public abstract class RetentionStrategy extends AbstractDesc private static final Logger logger = Logger.getLogger(Demand.class.getName()); /** - * The delay (in minutes) for which the agent must be in demand before tring to launch it. + * The delay (in minutes) for which the agent must be in demand before trying to launch it. */ private final long inDemandDelay; diff --git a/core/src/main/java/hudson/slaves/SlaveComputer.java b/core/src/main/java/hudson/slaves/SlaveComputer.java index 50e071ef986fc09c0b42760b4cb7b8f8b647b879..40e66914d746cd0f9df6d4d89d6678baf89c6e9a 100644 --- a/core/src/main/java/hudson/slaves/SlaveComputer.java +++ b/core/src/main/java/hudson/slaves/SlaveComputer.java @@ -23,10 +23,9 @@ */ package hudson.slaves; -import edu.umd.cs.findbugs.annotations.OverrideMustInvoke; -import edu.umd.cs.findbugs.annotations.When; import hudson.AbortException; import hudson.FilePath; +import hudson.Functions; import hudson.Util; import hudson.console.ConsoleLogFilter; import hudson.model.Computer; @@ -56,6 +55,7 @@ import jenkins.security.MasterToSlaveCallable; import jenkins.slaves.EncryptedSlaveAgentJnlpFile; import jenkins.slaves.JnlpSlaveAgentProtocol; import jenkins.slaves.systemInfo.SlaveSystemInfo; +import jenkins.util.SystemProperties; import org.acegisecurity.context.SecurityContext; import org.acegisecurity.context.SecurityContextHolder; import org.kohsuke.stapler.HttpRedirect; @@ -67,6 +67,7 @@ import org.kohsuke.stapler.WebMethod; import org.kohsuke.stapler.interceptor.RequirePOST; import javax.annotation.CheckForNull; +import javax.annotation.OverridingMethodsMustInvokeSuper; import javax.servlet.ServletException; import java.io.File; import java.io.IOException; @@ -160,7 +161,7 @@ public class SlaveComputer extends Computer { * {@inheritDoc} */ @Override - @OverrideMustInvoke(When.ANYTIME) + @OverridingMethodsMustInvokeSuper public boolean isAcceptingTasks() { // our boolean flag is an override on any additional programmatic reasons why this agent might not be // accepting tasks. @@ -264,13 +265,13 @@ public class SlaveComputer extends Computer { throw e; } catch (IOException e) { Util.displayIOException(e,taskListener); - e.printStackTrace(taskListener.error(Messages.ComputerLauncher_unexpectedError())); + Functions.printStackTrace(e, taskListener.error(Messages.ComputerLauncher_unexpectedError())); throw e; } catch (InterruptedException e) { - e.printStackTrace(taskListener.error(Messages.ComputerLauncher_abortedLaunch())); + Functions.printStackTrace(e, taskListener.error(Messages.ComputerLauncher_abortedLaunch())); throw e; } catch (Exception e) { - e.printStackTrace(taskListener.error(Messages.ComputerLauncher_unexpectedError())); + Functions.printStackTrace(e, taskListener.error(Messages.ComputerLauncher_unexpectedError())); throw e; } } finally { @@ -494,7 +495,7 @@ public class SlaveComputer extends Computer { // Orderly shutdown will have null exception if (cause!=null) { offlineCause = new ChannelTermination(cause); - cause.printStackTrace(taskListener.error("Connection terminated")); + Functions.printStackTrace(cause, taskListener.error("Connection terminated")); } else { taskListener.getLogger().println("Connection terminated"); } @@ -541,7 +542,7 @@ public class SlaveComputer extends Computer { // it'll have a catastrophic impact on the communication. channel.pinClassLoader(getClass().getClassLoader()); - channel.call(new SlaveInitializer()); + channel.call(new SlaveInitializer(DEFAULT_RING_BUFFER_SIZE)); SecurityContext old = ACL.impersonate(ACL.SYSTEM); try { for (ComputerListener cl : ComputerListener.all()) { @@ -556,7 +557,7 @@ public class SlaveComputer extends Computer { // update the data structure atomically to prevent others from seeing a channel that's not properly initialized yet synchronized(channelLock) { if(this.channel!=null) { - // check again. we used to have this entire method in a big sycnhronization block, + // check again. we used to have this entire method in a big synchronization block, // but Channel constructor blocks for an external process to do the connection // if CommandLauncher is used, and that cannot be interrupted because it blocks at InputStream. // so if the process hangs, it hangs the thread in a lock, and since Hudson will try to relaunch, @@ -804,11 +805,19 @@ public class SlaveComputer extends Computer { /** * This field is used on each agent to record logs on the agent. */ - static final RingBufferLogHandler SLAVE_LOG_HANDLER = new RingBufferLogHandler(); + static RingBufferLogHandler SLAVE_LOG_HANDLER; } private static class SlaveInitializer extends MasterToSlaveCallable { + final int ringBufferSize; + + public SlaveInitializer(int ringBufferSize) { + this.ringBufferSize = ringBufferSize; + } + public Void call() { + SLAVE_LOG_HANDLER = new RingBufferLogHandler(ringBufferSize); + // avoid double installation of the handler. JNLP slaves can reconnect to the master multiple times // and each connection gets a different RemoteClassLoader, so we need to evict them by class name, // not by their identity. @@ -867,5 +876,8 @@ public class SlaveComputer extends Computer { } } + // use RingBufferLogHandler class name to configure for backward compatibility + private static final int DEFAULT_RING_BUFFER_SIZE = SystemProperties.getInteger(RingBufferLogHandler.class.getName() + ".defaultSize", 256); + private static final Logger LOGGER = Logger.getLogger(SlaveComputer.class.getName()); } diff --git a/core/src/main/java/hudson/tasks/ArtifactArchiver.java b/core/src/main/java/hudson/tasks/ArtifactArchiver.java index 0f49ace24e0a6b71911e147f4eecb1b1c9f9bd97..2453a25adf44bbe6282d96ed5ae22f4abe0e0779 100644 --- a/core/src/main/java/hudson/tasks/ArtifactArchiver.java +++ b/core/src/main/java/hudson/tasks/ArtifactArchiver.java @@ -29,6 +29,7 @@ import jenkins.MasterToSlaveFileCallable; import hudson.Launcher; import hudson.Util; import hudson.Extension; +import hudson.Functions; import jenkins.util.SystemProperties; import hudson.model.AbstractProject; import hudson.model.Result; @@ -266,8 +267,7 @@ public class ArtifactArchiver extends Recorder implements SimpleBuildStep { } } catch (IOException e) { Util.displayIOException(e,listener); - e.printStackTrace(listener.error( - Messages.ArtifactArchiver_FailedToArchive(artifacts))); + Functions.printStackTrace(e, listener.error(Messages.ArtifactArchiver_FailedToArchive(artifacts))); build.setResult(Result.FAILURE); return; } @@ -352,7 +352,7 @@ public class ArtifactArchiver extends Recorder implements SimpleBuildStep { @Extension public static final class Migrator extends ItemListener { @SuppressWarnings("deprecation") @Override public void onLoaded() { - for (AbstractProject p : Jenkins.getInstance().getAllItems(AbstractProject.class)) { + for (AbstractProject p : Jenkins.getInstance().allItems(AbstractProject.class)) { try { ArtifactArchiver aa = p.getPublishersList().get(ArtifactArchiver.class); if (aa != null && aa.latestOnly != null) { diff --git a/core/src/main/java/hudson/tasks/BatchFile.java b/core/src/main/java/hudson/tasks/BatchFile.java index 8dee9eaaca4db89bbb2a98a4472d238035a4d183..b6bf2bb74c101f56ebc95cb114d10321aa8eb173 100644 --- a/core/src/main/java/hudson/tasks/BatchFile.java +++ b/core/src/main/java/hudson/tasks/BatchFile.java @@ -25,14 +25,21 @@ package hudson.tasks; import hudson.FilePath; import hudson.Extension; +import hudson.Util; import hudson.model.AbstractProject; +import hudson.util.FormValidation; import hudson.util.LineEndingConversion; -import net.sf.json.JSONObject; import org.jenkinsci.Symbol; +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.DoNotUse; import org.kohsuke.stapler.DataBoundConstructor; -import org.kohsuke.stapler.StaplerRequest; +import org.kohsuke.stapler.DataBoundSetter; +import org.kohsuke.stapler.QueryParameter; + import java.io.ObjectStreamException; +import javax.annotation.CheckForNull; + /** * Executes commands by using Windows batch file. * @@ -44,6 +51,8 @@ public class BatchFile extends CommandInterpreter { super(LineEndingConversion.convertEOL(command, LineEndingConversion.EOLType.Windows)); } + private Integer unstableReturn; + public String[] buildCommandLine(FilePath script) { return new String[] {"cmd","/c","call",script.getRemote()}; } @@ -56,8 +65,25 @@ public class BatchFile extends CommandInterpreter { return ".bat"; } + @CheckForNull + public final Integer getUnstableReturn() { + return new Integer(0).equals(unstableReturn) ? null : unstableReturn; + } + + @DataBoundSetter + public void setUnstableReturn(Integer unstableReturn) { + this.unstableReturn = unstableReturn; + } + + @Override + protected boolean isErrorlevelForUnstableBuild(int exitCode) { + return this.unstableReturn != null && exitCode != 0 && this.unstableReturn.equals(exitCode); + } + private Object readResolve() throws ObjectStreamException { - return new BatchFile(command); + BatchFile batch = new BatchFile(command); + batch.setUnstableReturn(unstableReturn); + return batch; } @Extension @Symbol("batchFile") @@ -71,9 +97,28 @@ public class BatchFile extends CommandInterpreter { return Messages.BatchFile_DisplayName(); } - @Override - public Builder newInstance(StaplerRequest req, JSONObject data) { - return new BatchFile(data.getString("command")); + /** + * Performs on-the-fly validation of the errorlevel. + */ + @Restricted(DoNotUse.class) + public FormValidation doCheckUnstableReturn(@QueryParameter String value) { + value = Util.fixEmptyAndTrim(value); + if (value == null) { + return FormValidation.ok(); + } + long unstableReturn; + try { + unstableReturn = Long.parseLong(value); + } catch (NumberFormatException e) { + return FormValidation.error(hudson.model.Messages.Hudson_NotANumber()); + } + if (unstableReturn == 0) { + return FormValidation.warning(hudson.tasks.Messages.BatchFile_invalid_exit_code_zero()); + } + if (unstableReturn < Integer.MIN_VALUE || unstableReturn > Integer.MAX_VALUE) { + return FormValidation.error(hudson.tasks.Messages.BatchFile_invalid_exit_code_range(unstableReturn)); + } + return FormValidation.ok(); } public boolean isApplicable(Class jobType) { diff --git a/core/src/main/java/hudson/tasks/BuildStepCompatibilityLayer.java b/core/src/main/java/hudson/tasks/BuildStepCompatibilityLayer.java index 24e2093c106e837b3e04825ef5120d0b2ef9afd2..d47a246aadc991e170fb99d17cb9bc7ea50e4c42 100644 --- a/core/src/main/java/hudson/tasks/BuildStepCompatibilityLayer.java +++ b/core/src/main/java/hudson/tasks/BuildStepCompatibilityLayer.java @@ -31,9 +31,12 @@ import hudson.model.Action; import hudson.model.Project; import hudson.model.AbstractBuild; import hudson.model.AbstractProject; +import hudson.util.ReflectionUtils; import hudson.Launcher; +import hudson.Util; import java.io.IOException; +import java.lang.reflect.Method; import java.util.Collection; import java.util.Collections; @@ -118,8 +121,13 @@ public abstract class BuildStepCompatibilityLayer implements BuildStep { * Use {@link #perform(AbstractBuild, Launcher, BuildListener)} instead. */ @Deprecated - public boolean perform(Build build, Launcher launcher, BuildListener listener) throws InterruptedException, IOException { - throw new UnsupportedOperationException(); + public boolean perform(Build build, Launcher launcher, BuildListener listener) + throws InterruptedException, IOException { + if (build instanceof AbstractBuild && Util.isOverridden(BuildStepCompatibilityLayer.class, this.getClass(), + "perform", AbstractBuild.class, Launcher.class, BuildListener.class)) { + return perform((AbstractBuild) build, launcher, listener); + } + throw new AbstractMethodError(); } /** diff --git a/core/src/main/java/hudson/tasks/BuildTrigger.java b/core/src/main/java/hudson/tasks/BuildTrigger.java index 21dd6b3d0c9bb1ca328792275bddd4376f502f3b..d2b0a91f6b0d97cd6deb2e029d39cf3590e85d2a 100644 --- a/core/src/main/java/hudson/tasks/BuildTrigger.java +++ b/core/src/main/java/hudson/tasks/BuildTrigger.java @@ -420,7 +420,7 @@ public class BuildTrigger extends Recorder implements DependencyDeclarer { private void locationChanged(Item item, String oldFullName, String newFullName) { // update BuildTrigger of other projects that point to this object. // can't we generalize this? - for( Project p : Jenkins.getInstance().getAllItems(Project.class) ) { + for( Project p : Jenkins.getInstance().allItems(Project.class) ) { BuildTrigger t = p.getPublishersList().get(BuildTrigger.class); if(t!=null) { String cp2 = Items.computeRelativeNamesAfterRenaming(oldFullName, newFullName, t.childProjects, p.getParent()); diff --git a/core/src/main/java/hudson/tasks/CommandInterpreter.java b/core/src/main/java/hudson/tasks/CommandInterpreter.java index 982ecadb3f46c12edd6e3ebaf43c6b0eedf0a6b8..2b7908fdfa838104454593403eb7a5217ca222b9 100644 --- a/core/src/main/java/hudson/tasks/CommandInterpreter.java +++ b/core/src/main/java/hudson/tasks/CommandInterpreter.java @@ -28,9 +28,11 @@ import hudson.Launcher; import hudson.Proc; import hudson.Util; import hudson.EnvVars; +import hudson.Functions; import hudson.model.AbstractBuild; import hudson.model.BuildListener; import hudson.model.Node; +import hudson.model.Result; import hudson.model.TaskListener; import hudson.remoting.ChannelClosedException; @@ -64,6 +66,18 @@ public abstract class CommandInterpreter extends Builder { return perform(build,launcher,(TaskListener)listener); } + /** + * Determines whether a non-zero exit code from the process should change the build + * status to {@link Result#UNSTABLE} instead of default {@link Result#FAILURE}. + * + * Changing to {@link Result#UNSTABLE} does not abort the build, next steps are continued. + * + * @since 2.26 + */ + protected boolean isErrorlevelForUnstableBuild(int exitCode) { + return false; + } + public boolean perform(AbstractBuild build, Launcher launcher, TaskListener listener) throws InterruptedException { FilePath ws = build.getWorkspace(); if (ws == null) { @@ -80,7 +94,7 @@ public abstract class CommandInterpreter extends Builder { script = createScriptFile(ws); } catch (IOException e) { Util.displayIOException(e,listener); - e.printStackTrace(listener.fatalError(Messages.CommandInterpreter_UnableToProduceScript())); + Functions.printStackTrace(e, listener.fatalError(Messages.CommandInterpreter_UnableToProduceScript())); return false; } @@ -93,9 +107,14 @@ public abstract class CommandInterpreter extends Builder { envVars.put(e.getKey(),e.getValue()); r = join(launcher.launch().cmds(buildCommandLine(script)).envs(envVars).stdout(listener).pwd(ws).start()); + + if(isErrorlevelForUnstableBuild(r)) { + build.setResult(Result.UNSTABLE); + r = 0; + } } catch (IOException e) { Util.displayIOException(e, listener); - e.printStackTrace(listener.fatalError(Messages.CommandInterpreter_CommandFailed())); + Functions.printStackTrace(e, listener.fatalError(Messages.CommandInterpreter_CommandFailed())); } return r==0; } finally { @@ -114,10 +133,10 @@ public abstract class CommandInterpreter extends Builder { LOGGER.log(Level.FINE, "Script deletion failed", e); } else { Util.displayIOException(e,listener); - e.printStackTrace( listener.fatalError(Messages.CommandInterpreter_UnableToDelete(script)) ); + Functions.printStackTrace(e, listener.fatalError(Messages.CommandInterpreter_UnableToDelete(script))); } } catch (Exception e) { - e.printStackTrace( listener.fatalError(Messages.CommandInterpreter_UnableToDelete(script)) ); + Functions.printStackTrace(e, listener.fatalError(Messages.CommandInterpreter_UnableToDelete(script))); } } } @@ -127,7 +146,8 @@ public abstract class CommandInterpreter extends Builder { * * This allows subtypes to treat the exit code differently (for example by treating non-zero exit code * as if it's zero, or to set the status to {@link Result#UNSTABLE}). Any non-zero exit code will cause - * the build step to fail. + * the build step to fail. Use {@link #isErrorlevelForUnstableBuild(int exitCode)} to redefine the default + * behaviour. * * @since 1.549 */ @@ -139,7 +159,7 @@ public abstract class CommandInterpreter extends Builder { * Creates a script file in a temporary name in the specified directory. */ public FilePath createScriptFile(@Nonnull FilePath dir) throws IOException, InterruptedException { - return dir.createTextTempFile("hudson", getFileExtension(), getContents(), false); + return dir.createTextTempFile("jenkins", getFileExtension(), getContents(), false); } public abstract String[] buildCommandLine(FilePath script); diff --git a/core/src/main/java/hudson/tasks/Fingerprinter.java b/core/src/main/java/hudson/tasks/Fingerprinter.java index 1385e645b41ccc43b60ae46f1d60e68684efedfb..fb45ef9cc2cba11f4147b863d92b9c29b1081909 100644 --- a/core/src/main/java/hudson/tasks/Fingerprinter.java +++ b/core/src/main/java/hudson/tasks/Fingerprinter.java @@ -27,6 +27,7 @@ import com.google.common.collect.ImmutableMap; import hudson.EnvVars; import hudson.Extension; import hudson.FilePath; +import hudson.Functions; import jenkins.MasterToSlaveFileCallable; import hudson.Launcher; import jenkins.util.SystemProperties; @@ -137,7 +138,7 @@ public class Fingerprinter extends Recorder implements Serializable, DependencyD Jenkins.getInstance().rebuildDependencyGraphAsync(); } } catch (IOException e) { - e.printStackTrace(listener.error(Messages.Fingerprinter_Failed())); + Functions.printStackTrace(e, listener.error(Messages.Fingerprinter_Failed())); build.setResult(Result.FAILURE); } diff --git a/core/src/main/java/hudson/tasks/Maven.java b/core/src/main/java/hudson/tasks/Maven.java index d213cb1bea2632de3992a53d300b1537444c57a6..cbfd2b4173f45a0fcacffae7bfe68ed96c99f6ec 100644 --- a/core/src/main/java/hudson/tasks/Maven.java +++ b/core/src/main/java/hudson/tasks/Maven.java @@ -147,7 +147,7 @@ public class Maven extends Builder { * * Defaults to false unless user requests otherwise. Old configurations are set to true to mimic the legacy behaviour. * - * @since TODO + * @since 2.12 */ private @Nonnull Boolean injectBuildVariables; @@ -298,7 +298,7 @@ public class Maven extends Builder { int startIndex = 0; int endIndex; do { - // split targets into multiple invokations of maven separated by | + // split targets into multiple invocations of maven separated by | endIndex = targets.indexOf('|', startIndex); if (-1 == endIndex) { endIndex = targets.length(); @@ -340,13 +340,17 @@ public class Maven extends Builder { } } + Set sensitiveVars = build.getSensitiveBuildVariables(); + + // Inject environment variables only if chosen to do so if (isInjectBuildVariables()) { - Set sensitiveVars = build.getSensitiveBuildVariables(); - args.addKeyValuePairs("-D",build.getBuildVariables(),sensitiveVars); - final VariableResolver resolver = new Union(new ByMap(env), vr); - args.addKeyValuePairsFromPropertyString("-D",this.properties,resolver,sensitiveVars); + args.addKeyValuePairs("-D", build.getBuildVariables(), sensitiveVars); } + // Add properties from builder configuration, AFTER the injected build variables. + final VariableResolver resolver = new Union(new ByMap(env), vr); + args.addKeyValuePairsFromPropertyString("-D", this.properties, resolver, sensitiveVars); + if (usesPrivateRepository()) args.add("-Dmaven.repo.local=" + build.getWorkspace().child(".repository")); args.addTokenized(normalizedTarget); @@ -366,7 +370,7 @@ public class Maven extends Builder { } } catch (IOException e) { Util.displayIOException(e,listener); - e.printStackTrace( listener.fatalError(Messages.Maven_ExecFailed()) ); + Functions.printStackTrace(e, listener.fatalError(Messages.Maven_ExecFailed())); return false; } startIndex = endIndex + 1; diff --git a/core/src/main/java/hudson/tasks/Publisher.java b/core/src/main/java/hudson/tasks/Publisher.java index f81cbdeb4490a2c338093ad749e55a3baa307616..c1c8a601e26e620b881c843472a30014fded37cf 100644 --- a/core/src/main/java/hudson/tasks/Publisher.java +++ b/core/src/main/java/hudson/tasks/Publisher.java @@ -101,7 +101,7 @@ public abstract class Publisher extends BuildStepCompatibilityLayer implements D * to include their execution time in the total build time. * *

      - * So normally, that is the preferrable behavior, but in a few cases + * So normally, that is the preferable behavior, but in a few cases * this is problematic. One of such cases is when a publisher needs to * trigger other builds, which in turn need to see this build as a * completed build. Those plugins that need to do this can return true diff --git a/core/src/main/java/hudson/tasks/Shell.java b/core/src/main/java/hudson/tasks/Shell.java index 701bccb4b62569defed61f40ff5f0d1fc20837fc..4360f4ce94c9bf74e8c83ecd164765a4c23d8148 100644 --- a/core/src/main/java/hudson/tasks/Shell.java +++ b/core/src/main/java/hudson/tasks/Shell.java @@ -24,7 +24,6 @@ package hudson.tasks; import hudson.FilePath; -import hudson.Functions; import hudson.Util; import hudson.Extension; import hudson.model.AbstractProject; @@ -35,8 +34,12 @@ import java.io.ObjectStreamException; import hudson.util.LineEndingConversion; import jenkins.security.MasterToSlaveCallable; import net.sf.json.JSONObject; +import org.apache.commons.lang.SystemUtils; import org.jenkinsci.Symbol; +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.DoNotUse; import org.kohsuke.stapler.DataBoundConstructor; +import org.kohsuke.stapler.DataBoundSetter; import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.QueryParameter; @@ -46,17 +49,24 @@ import java.util.Arrays; import java.util.logging.Level; import java.util.logging.Logger; +import javax.annotation.CheckForNull; + /** * Executes a series of commands by using a shell. * * @author Kohsuke Kawaguchi */ public class Shell extends CommandInterpreter { + @DataBoundConstructor public Shell(String command) { super(LineEndingConversion.convertEOL(command, LineEndingConversion.EOLType.Unix)); } + private Integer unstableReturn; + + + /** * Older versions of bash have a bug where non-ASCII on the first line * makes the shell think the file is a binary file and not a script. Adding @@ -82,7 +92,7 @@ public class Shell extends CommandInterpreter { args.add(script.getRemote()); args.set(0,args.get(0).substring(2)); // trim off "#!" return args.toArray(new String[args.size()]); - } else + } else return new String[] { getDescriptor().getShellOrDefault(script.getChannel()), "-xe", script.getRemote()}; } @@ -94,13 +104,30 @@ public class Shell extends CommandInterpreter { return ".sh"; } + @CheckForNull + public final Integer getUnstableReturn() { + return new Integer(0).equals(unstableReturn) ? null : unstableReturn; + } + + @DataBoundSetter + public void setUnstableReturn(Integer unstableReturn) { + this.unstableReturn = unstableReturn; + } + + @Override + protected boolean isErrorlevelForUnstableBuild(int exitCode) { + return this.unstableReturn != null && exitCode != 0 && this.unstableReturn.equals(exitCode); + } + @Override public DescriptorImpl getDescriptor() { return (DescriptorImpl)super.getDescriptor(); } private Object readResolve() throws ObjectStreamException { - return new Shell(command); + Shell shell = new Shell(command); + shell.setUnstableReturn(unstableReturn); + return shell; } @Extension @Symbol("shell") @@ -128,13 +155,14 @@ public class Shell extends CommandInterpreter { */ @Deprecated public String getShellOrDefault() { - if(shell==null) - return Functions.isWindows() ?"sh":"/bin/sh"; + if (shell == null) { + return SystemUtils.IS_OS_WINDOWS ? "sh" : "/bin/sh"; + } return shell; } public String getShellOrDefault(VirtualChannel channel) { - if (shell != null) + if (shell != null) return shell; String interpreter = null; @@ -151,7 +179,7 @@ public class Shell extends CommandInterpreter { return interpreter; } - + public void setShell(String shell) { this.shell = Util.fixEmptyAndTrim(shell); save(); @@ -161,6 +189,30 @@ public class Shell extends CommandInterpreter { return Messages.Shell_DisplayName(); } + /** + * Performs on-the-fly validation of the exit code. + */ + @Restricted(DoNotUse.class) + public FormValidation doCheckUnstableReturn(@QueryParameter String value) { + value = Util.fixEmptyAndTrim(value); + if (value == null) { + return FormValidation.ok(); + } + long unstableReturn; + try { + unstableReturn = Long.parseLong(value); + } catch (NumberFormatException e) { + return FormValidation.error(hudson.model.Messages.Hudson_NotANumber()); + } + if (unstableReturn == 0) { + return FormValidation.warning(hudson.tasks.Messages.Shell_invalid_exit_code_zero()); + } + if (unstableReturn < 1 || unstableReturn > 255) { + return FormValidation.error(hudson.tasks.Messages.Shell_invalid_exit_code_range(unstableReturn)); + } + return FormValidation.ok(); + } + @Override public boolean configure(StaplerRequest req, JSONObject data) throws FormException { req.bindJSON(this, data); @@ -172,19 +224,19 @@ public class Shell extends CommandInterpreter { */ public FormValidation doCheckShell(@QueryParameter String value) { // Executable requires admin permission - return FormValidation.validateExecutable(value); + return FormValidation.validateExecutable(value); } - + private static final class Shellinterpreter extends MasterToSlaveCallable { private static final long serialVersionUID = 1L; public String call() throws IOException { - return Functions.isWindows() ? "sh" : "/bin/sh"; + return SystemUtils.IS_OS_WINDOWS ? "sh" : "/bin/sh"; } } - + } - + private static final Logger LOGGER = Logger.getLogger(Shell.class.getName()); } diff --git a/core/src/main/java/hudson/tasks/UserNameResolver.java b/core/src/main/java/hudson/tasks/UserNameResolver.java index 5aa7af3768737af85d837bc70f75e7c0cc89a17f..79b8bc81ab413708443cf01da00f911c348aec73 100644 --- a/core/src/main/java/hudson/tasks/UserNameResolver.java +++ b/core/src/main/java/hudson/tasks/UserNameResolver.java @@ -58,7 +58,7 @@ public abstract class UserNameResolver implements ExtensionPoint { * *

      * When multiple resolvers are installed, they are consulted in order and - * the search will be over when a name is found by someoene. + * the search will be over when a name is found by someone. * *

      * Since {@link UserNameResolver} is singleton, this method can be invoked concurrently diff --git a/core/src/main/java/hudson/tools/DownloadFromUrlInstaller.java b/core/src/main/java/hudson/tools/DownloadFromUrlInstaller.java index 5ad04e76ef63e1d6a0215e9c5048412ab3ffa2de..e60facbf6851c3365b20be2dcb963615cd35bbcb 100644 --- a/core/src/main/java/hudson/tools/DownloadFromUrlInstaller.java +++ b/core/src/main/java/hudson/tools/DownloadFromUrlInstaller.java @@ -10,6 +10,7 @@ import net.sf.json.JSONObject; import java.io.IOException; import java.util.Arrays; import java.util.Collections; +import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.net.URL; @@ -37,7 +38,7 @@ public abstract class DownloadFromUrlInstaller extends ToolInstaller { /** * Checks if the specified expected location already contains the installed version of the tool. * - * This check needs to run fairly efficiently. The current implementation uses the souce URL of {@link Installable}, + * This check needs to run fairly efficiently. The current implementation uses the source URL of {@link Installable}, * based on the assumption that released bits do not change its content. */ protected boolean isUpToDate(FilePath expectedLocation, Installable i) throws IOException, InterruptedException { @@ -169,42 +170,23 @@ public abstract class DownloadFromUrlInstaller extends ToolInstaller { return false; } + /** + * Merge a list of ToolInstallerList and removes duplicate tool installers (ie having the same id) + * @param jsonList the list of ToolInstallerList to merge + * @return the merged ToolInstallerList wrapped in a JSONObject + */ private JSONObject reduce(List jsonList) { List reducedToolEntries = new LinkedList<>(); - //collect all tool installers objects from the multiple json objects + + HashSet processedIds = new HashSet(); for (JSONObject jsonToolList : jsonList) { ToolInstallerList toolInstallerList = (ToolInstallerList) JSONObject.toBean(jsonToolList, ToolInstallerList.class); - reducedToolEntries.addAll(Arrays.asList(toolInstallerList.list)); - } - - while (Downloadable.hasDuplicates(reducedToolEntries, "id")) { - List tmpToolInstallerEntries = new LinkedList<>(); - //we need to skip the processed entries - boolean processed[] = new boolean[reducedToolEntries.size()]; - for (int i = 0; i < reducedToolEntries.size(); i++) { - if (processed[i] == true) { - continue; - } - ToolInstallerEntry data1 = reducedToolEntries.get(i); - boolean hasDuplicate = false; - for (int j = i + 1; j < reducedToolEntries.size(); j ++) { - ToolInstallerEntry data2 = reducedToolEntries.get(j); - //if we found a duplicate we choose the first one - if (data1.id.equals(data2.id)) { - hasDuplicate = true; - processed[j] = true; - tmpToolInstallerEntries.add(data1); - //after the first duplicate has been found we break the loop since the duplicates are - //processed two by two - break; - } - } - //if no duplicate has been found we just insert the entry in the tmp list - if (!hasDuplicate) { - tmpToolInstallerEntries.add(data1); + for(ToolInstallerEntry entry : toolInstallerList.list) { + // being able to add the id into the processedIds set means this tool has not been processed before + if (processedIds.add(entry.id)) { + reducedToolEntries.add(entry); } } - reducedToolEntries = tmpToolInstallerEntries; } ToolInstallerList toolInstallerList = new ToolInstallerList(); diff --git a/core/src/main/java/hudson/tools/InstallerTranslator.java b/core/src/main/java/hudson/tools/InstallerTranslator.java index 87d1dcd1e3656ad197c6d71b8e3e7812a51f343f..fd45212bd7401bc565438296ce140f2abd2c0b1c 100644 --- a/core/src/main/java/hudson/tools/InstallerTranslator.java +++ b/core/src/main/java/hudson/tools/InstallerTranslator.java @@ -28,6 +28,7 @@ import hudson.Extension; import hudson.model.Node; import hudson.model.TaskListener; import java.io.IOException; +import java.util.ArrayList; import java.util.Map; import java.util.WeakHashMap; import java.util.concurrent.Semaphore; @@ -50,6 +51,9 @@ public class InstallerTranslator extends ToolLocationTranslator { if (isp == null) { return null; } + + ArrayList inapplicableInstallersMessages = new ArrayList(); + for (ToolInstaller installer : isp.installers) { if (installer.appliesTo(node)) { Semaphore semaphore; @@ -69,8 +73,16 @@ public class InstallerTranslator extends ToolLocationTranslator { } finally { semaphore.release(); } + } else { + inapplicableInstallersMessages.add(Messages.CannotBeInstalled( + installer.getDescriptor().getDisplayName(), + tool.getName(), + node.getDisplayName())); } } + for (String message : inapplicableInstallersMessages) { + log.getLogger().println(message); + } return null; } diff --git a/core/src/main/java/hudson/tools/JDKInstaller.java b/core/src/main/java/hudson/tools/JDKInstaller.java index 8a42e7e1cab8948449e9ca681307c768300ec8bb..4a8447c85c87cca2407d83d9abc9bf1ce07911a4 100644 --- a/core/src/main/java/hudson/tools/JDKInstaller.java +++ b/core/src/main/java/hudson/tools/JDKInstaller.java @@ -80,6 +80,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import static hudson.tools.JDKInstaller.Preference.*; +import org.kohsuke.stapler.interceptor.RequirePOST; /** * Install JDKs from java.sun.com. @@ -273,11 +274,8 @@ public class JDKInstaller extends ToolInstaller { if (r != 0) { out.println(Messages.JDKInstaller_FailedToInstallJDK(r)); // log file is in UTF-16 - InputStreamReader in = new InputStreamReader(fs.read(logFile), "UTF-16"); - try { - IOUtils.copy(in,new OutputStreamWriter(out)); - } finally { - in.close(); + try (InputStreamReader in = new InputStreamReader(fs.read(logFile), "UTF-16")) { + IOUtils.copy(in, new OutputStreamWriter(out)); } throw new AbortException(); } @@ -521,11 +519,8 @@ public class JDKInstaller extends ToolInstaller { File tmp = new File(cache.getPath()+".tmp"); try { tmp.getParentFile().mkdirs(); - FileOutputStream out = new FileOutputStream(tmp); - try { + try (FileOutputStream out = new FileOutputStream(tmp)) { IOUtils.copy(m.getResponseBodyAsStream(), out); - } finally { - out.close(); } tmp.renameTo(cache); @@ -794,7 +789,9 @@ public class JDKInstaller extends ToolInstaller { /** * Submits the Oracle account username/password. */ + @RequirePOST public HttpResponse doPostCredential(@QueryParameter String username, @QueryParameter String password) throws IOException, ServletException { + Jenkins.getInstance().checkPermission(Jenkins.ADMINISTER); this.username = username; this.password = Secret.fromString(password); save(); diff --git a/core/src/main/java/hudson/tools/ToolDescriptor.java b/core/src/main/java/hudson/tools/ToolDescriptor.java index 3bf153f2342c4219410148033417de8bc0882a98..3c944d86dc31c9b326268bcf8c361ed25a27e337 100644 --- a/core/src/main/java/hudson/tools/ToolDescriptor.java +++ b/core/src/main/java/hudson/tools/ToolDescriptor.java @@ -100,7 +100,7 @@ public abstract class ToolDescriptor extends Descrip * Lists up {@link ToolPropertyDescriptor}s that are applicable to this {@link ToolInstallation}. */ public List getPropertyDescriptors() { - return PropertyDescriptor.for_(ToolProperty.all(),clazz); + return PropertyDescriptor.for_(ToolProperty.all(), clazz); } diff --git a/core/src/main/java/hudson/triggers/SCMTrigger.java b/core/src/main/java/hudson/triggers/SCMTrigger.java index e221ccf3ec7b735d9d26ca2d7e275e7a412f2544..74ae690f7c03ef5f49eae96b064a081e80add6a8 100644 --- a/core/src/main/java/hudson/triggers/SCMTrigger.java +++ b/core/src/main/java/hudson/triggers/SCMTrigger.java @@ -27,6 +27,7 @@ package hudson.triggers; import antlr.ANTLRException; import com.google.common.base.Preconditions; import hudson.Extension; +import hudson.Functions; import hudson.Util; import hudson.console.AnnotatedLargeText; import hudson.model.AbstractBuild; @@ -71,11 +72,14 @@ import jenkins.util.SystemProperties; import net.sf.json.JSONObject; import org.apache.commons.io.FileUtils; import org.apache.commons.jelly.XMLOutput; +import org.apache.commons.lang.StringUtils; import org.jenkinsci.Symbol; import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.restrictions.DoNotUse; import org.kohsuke.accmod.restrictions.NoExternalUse; +import org.kohsuke.stapler.AncestorInPath; import org.kohsuke.stapler.DataBoundConstructor; +import org.kohsuke.stapler.DataBoundSetter; import org.kohsuke.stapler.QueryParameter; import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerResponse; @@ -97,17 +101,28 @@ import static java.util.logging.Level.WARNING; public class SCMTrigger extends Trigger { private boolean ignorePostCommitHooks; - + + @DataBoundConstructor public SCMTrigger(String scmpoll_spec) throws ANTLRException { - this(scmpoll_spec, false); + super(scmpoll_spec); } - - @DataBoundConstructor + + /** + * Backwards-compatibility constructor. + * + * @param scmpoll_spec + * The spec to poll with. + * @param ignorePostCommitHooks + * Whether to ignore post commit hooks. + * + * @deprecated since 2.21 + */ + @Deprecated public SCMTrigger(String scmpoll_spec, boolean ignorePostCommitHooks) throws ANTLRException { super(scmpoll_spec); this.ignorePostCommitHooks = ignorePostCommitHooks; } - + /** * This trigger wants to ignore post-commit hooks. *

      @@ -119,6 +134,23 @@ public class SCMTrigger extends Trigger { return this.ignorePostCommitHooks; } + /** + * Data-bound setter for ignoring post commit hooks. + * + * @param ignorePostCommitHooks + * True if we should ignore post commit hooks, false otherwise. + * + * @since 2.22 + */ + @DataBoundSetter + public void setIgnorePostCommitHooks(boolean ignorePostCommitHooks) { + this.ignorePostCommitHooks = ignorePostCommitHooks; + } + + public String getScmpoll_spec() { + return super.getSpec(); + } + @Override public void run() { if (job == null) { @@ -130,7 +162,7 @@ public class SCMTrigger extends Trigger { /** * Run the SCM trigger with additional build actions. Used by SubversionRepositoryStatus - * to trigger a build at a specific revisionn number. + * to trigger a build at a specific revision number. * * @param additionalActions * @since 1.375 @@ -178,7 +210,7 @@ public class SCMTrigger extends Trigger { return new File(job.getRootDir(),"scm-polling.log"); } - @Extension @Symbol("scm") + @Extension @Symbol("pollSCM") public static class DescriptorImpl extends TriggerDescriptor { private static ThreadFactory threadFactory() { @@ -281,12 +313,24 @@ public class SCMTrigger extends Trigger { @Restricted(NoExternalUse.class) public boolean isPollingThreadCountOptionVisible() { + if (getPollingThreadCount() != 0) { + // this is a user who already configured the option + return true; + } // unless you have a fair number of projects, this option is likely pointless. // so let's hide this option for new users to avoid confusing them // unless it was already changed - // TODO switch to check for SCMTriggerItem - return Jenkins.getInstance().getAllItems(AbstractProject.class).size() > 10 - || getPollingThreadCount() != 0; + int count = 0; + // we are faster walking some items with a lazy iterator than building a list of all items just to query + // the size. This also lets us check against SCMTriggerItem rather than AbstractProject + for (Item item: Jenkins.getInstance().allItems(Item.class)) { + if (item instanceof SCMTriggerItem) { + if (++count > 10) { + return true; + } + } + } + return false; } /** @@ -316,10 +360,34 @@ public class SCMTrigger extends Trigger { return FormValidation.ok(); return FormValidation.validateNonNegativeInteger(value); } + + /** + * Performs syntax check. + */ + public FormValidation doCheckScmpoll_spec(@QueryParameter String value, + @QueryParameter boolean ignorePostCommitHooks, + @AncestorInPath Item item) { + if (StringUtils.isBlank(value)) { + if (ignorePostCommitHooks) { + return FormValidation.ok(Messages.SCMTrigger_no_schedules_no_hooks()); + } else { + return FormValidation.ok(Messages.SCMTrigger_no_schedules_hooks()); + } + } else { + return Jenkins.getInstance().getDescriptorByType(TimerTrigger.DescriptorImpl.class) + .doCheckSpec(value, item); + } + } } @Extension public static final class AdministrativeMonitorImpl extends AdministrativeMonitor { + + @Override + public String getDisplayName() { + return Messages.SCMTrigger_AdministrativeMonitorImpl_DisplayName(); + } + private boolean on; public boolean isActivated() { @@ -533,7 +601,7 @@ public class SCMTrigger extends Trigger { logger.println("No changes"); return result; } catch (Error | RuntimeException e) { - e.printStackTrace(listener.error("Failed to record SCM polling for "+job)); + Functions.printStackTrace(e, listener.error("Failed to record SCM polling for " + job)); LOGGER.log(Level.SEVERE,"Failed to record SCM polling for "+job,e); throw e; } finally { @@ -549,7 +617,7 @@ public class SCMTrigger extends Trigger { if (job == null) { return; } - // we can pre-emtively check the SCMDecisionHandler instances here + // we can preemptively check the SCMDecisionHandler instances here // note that job().poll(listener) should also check this SCMDecisionHandler veto = SCMDecisionHandler.firstShouldPollVeto(job); if (veto != null) { diff --git a/core/src/main/java/hudson/triggers/TimerTrigger.java b/core/src/main/java/hudson/triggers/TimerTrigger.java index 4380c0797cd82afb80c887d5c630aaf5c5869bd7..da844fa6b6befd6c9d0ec198d5843158a938e34f 100644 --- a/core/src/main/java/hudson/triggers/TimerTrigger.java +++ b/core/src/main/java/hudson/triggers/TimerTrigger.java @@ -32,6 +32,7 @@ import hudson.model.Cause; import hudson.model.Item; import hudson.scheduler.CronTabList; import hudson.scheduler.Hash; +import hudson.scheduler.RareOrImpossibleDateException; import hudson.util.FormValidation; import java.text.DateFormat; import java.util.ArrayList; @@ -104,13 +105,17 @@ public class TimerTrigger extends Trigger { } private void updateValidationsForNextRun(Collection validations, CronTabList ctl) { - Calendar prev = ctl.previous(); - Calendar next = ctl.next(); - if (prev != null && next != null) { - DateFormat fmt = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL); - validations.add(FormValidation.ok(Messages.TimerTrigger_would_last_have_run_at_would_next_run_at(fmt.format(prev.getTime()), fmt.format(next.getTime())))); - } else { - validations.add(FormValidation.warning(Messages.TimerTrigger_no_schedules_so_will_never_run())); + try { + Calendar prev = ctl.previous(); + Calendar next = ctl.next(); + if (prev != null && next != null) { + DateFormat fmt = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL); + validations.add(FormValidation.ok(Messages.TimerTrigger_would_last_have_run_at_would_next_run_at(fmt.format(prev.getTime()), fmt.format(next.getTime())))); + } else { + validations.add(FormValidation.warning(Messages.TimerTrigger_no_schedules_so_will_never_run())); + } + } catch (RareOrImpossibleDateException ex) { + validations.add(FormValidation.warning(Messages.TimerTrigger_the_specified_cron_tab_is_rare_or_impossible())); } } } diff --git a/core/src/main/java/hudson/triggers/Trigger.java b/core/src/main/java/hudson/triggers/Trigger.java index c05a4490ced66793c1cc0cd289e34f3eb9981a93..e578de88983e2fda4ed7fc2f981321efad1d0e60 100644 --- a/core/src/main/java/hudson/triggers/Trigger.java +++ b/core/src/main/java/hudson/triggers/Trigger.java @@ -60,7 +60,7 @@ import antlr.ANTLRException; import javax.annotation.CheckForNull; import javax.annotation.Nonnull; -import edu.umd.cs.findbugs.annotations.SuppressWarnings; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import hudson.model.Items; import jenkins.model.ParameterizedJobMixIn; import org.jenkinsci.Symbol; @@ -90,7 +90,11 @@ public abstract class Trigger implements Describable> this.job = project; try {// reparse the tabs with the job as the hash - this.tabs = CronTabList.create(spec, Hash.from(project.getFullName())); + if (spec != null) { + this.tabs = CronTabList.create(spec, Hash.from(project.getFullName())); + } else { + LOGGER.log(Level.WARNING, "The job {0} has a null crontab spec which is incorrect", job.getFullName()); + } } catch (ANTLRException e) { // this shouldn't fail because we've already parsed stuff in the constructor, // so if it fails, use whatever 'tabs' that we already have. @@ -262,7 +266,7 @@ public abstract class Trigger implements Describable> } // Process all triggers, except SCMTriggers when synchronousPolling is set - for (ParameterizedJobMixIn.ParameterizedJob p : inst.getAllItems(ParameterizedJobMixIn.ParameterizedJob.class)) { + for (ParameterizedJobMixIn.ParameterizedJob p : inst.allItems(ParameterizedJobMixIn.ParameterizedJob.class)) { for (Trigger t : p.getTriggers().values()) { if (!(t instanceof SCMTrigger && scmd.synchronousPolling)) { if (t !=null && t.spec != null && t.tabs != null) { @@ -281,7 +285,7 @@ public abstract class Trigger implements Describable> LOGGER.log(Level.FINER, "did not trigger {0}", p); } } else { - LOGGER.log(Level.WARNING, "The job {0} has a syntactically incorrect config and is missing the cron spec for a trigger", p.getFullName()); + LOGGER.log(Level.WARNING, "The job {0} has a syntactically incorrect config and is missing the cron spec for a trigger", p.getFullName()); } } } diff --git a/core/src/main/java/hudson/util/ArgumentListBuilder.java b/core/src/main/java/hudson/util/ArgumentListBuilder.java index 255208737abe6af15ffb19f154ab275ce782c3e5..8023fa77d049c6c8741ef3c7e7e0169d2a7a91b6 100644 --- a/core/src/main/java/hudson/util/ArgumentListBuilder.java +++ b/core/src/main/java/hudson/util/ArgumentListBuilder.java @@ -233,7 +233,7 @@ public class ArgumentListBuilder implements Serializable, Cloneable { * * @param original Resolution will be delegated to this resolver. Resolved * values will be escaped afterwards. - * @see JENKINS-10539 + * @see JENKINS-10539 */ private static VariableResolver propertiesGeneratingResolver(final VariableResolver original) { diff --git a/core/src/main/java/hudson/util/BootFailure.java b/core/src/main/java/hudson/util/BootFailure.java index eefb4da81978f361b000dfc72f848cab77d4a089..8d1055b1c29787ce3e8b09c21d6044cc0216ef74 100644 --- a/core/src/main/java/hudson/util/BootFailure.java +++ b/core/src/main/java/hudson/util/BootFailure.java @@ -60,8 +60,7 @@ public abstract class BootFailure extends ErrorObject { File f = getBootFailureFile(home); try { if (f.exists()) { - BufferedReader failureFileReader = new BufferedReader(new FileReader(f)); - try { + try (BufferedReader failureFileReader = new BufferedReader(new FileReader(f))) { String line; while ((line=failureFileReader.readLine())!=null) { try { @@ -70,8 +69,6 @@ public abstract class BootFailure extends ErrorObject { // ignore any parse error } } - } finally { - failureFileReader.close(); } } } catch (IOException e) { diff --git a/core/src/main/java/hudson/util/ByteArrayOutputStream2.java b/core/src/main/java/hudson/util/ByteArrayOutputStream2.java index 8942599afb86e01993934386e68aee0eef74bc17..0425f217bdffecbaa2fa8092e96b4e63cff7e09e 100644 --- a/core/src/main/java/hudson/util/ByteArrayOutputStream2.java +++ b/core/src/main/java/hudson/util/ByteArrayOutputStream2.java @@ -26,7 +26,7 @@ public class ByteArrayOutputStream2 extends ByteArrayOutputStream { public void readFrom(InputStream is) throws IOException { while(true) { if(count==buf.length) { - // realllocate + // reallocate byte[] data = new byte[buf.length*2]; System.arraycopy(buf,0,data,0,buf.length); buf = data; diff --git a/core/src/main/java/hudson/util/CharacterEncodingFilter.java b/core/src/main/java/hudson/util/CharacterEncodingFilter.java index 5e7ea94d937698db457b521ea6810e1f34a010e8..8a058f180f28198e627d41e238fc17381487ea1a 100644 --- a/core/src/main/java/hudson/util/CharacterEncodingFilter.java +++ b/core/src/main/java/hudson/util/CharacterEncodingFilter.java @@ -90,7 +90,7 @@ public class CharacterEncodingFilter implements Filter { // containers often implement RFCs incorrectly in that it doesn't interpret query parameter // decoding with UTF-8. This will ensure we get it right. - // but doing this for config.xml submission could potentiall overwrite valid + // but doing this for config.xml submission could potentially overwrite valid // "text/xml;charset=xxx" String contentType = req.getContentType(); if (contentType != null) { diff --git a/core/src/main/java/hudson/util/ChunkedInputStream.java b/core/src/main/java/hudson/util/ChunkedInputStream.java index 5691eeb80de8d02117e227a5d80644dc5ea14bc7..0ae926f75c2e653d9e60c39f12d7ca61f5654ddf 100644 --- a/core/src/main/java/hudson/util/ChunkedInputStream.java +++ b/core/src/main/java/hudson/util/ChunkedInputStream.java @@ -67,7 +67,7 @@ public class ChunkedInputStream extends InputStream { /** The current position within the current chunk */ private int pos; - /** True if we'are at the beginning of stream */ + /** True if we're at the beginning of stream */ private boolean bof = true; /** True if we've reached the end of stream */ @@ -101,7 +101,7 @@ public class ChunkedInputStream extends InputStream { * is followed by a CRLF. The method returns -1 as soon as a chunksize of 0 * is detected.

      * - *

      Trailer headers are read automcatically at the end of the stream and + *

      Trailer headers are read automatically at the end of the stream and * can be obtained with the getResponseFooters() method.

      * * @return -1 of the end of the stream has been reached or the next data diff --git a/core/src/main/java/hudson/util/CompressedFile.java b/core/src/main/java/hudson/util/CompressedFile.java index b6ccf22c3071f022282175548922904de589b4fd..f2f852ca33b9d83d3a18a6e82afd32a7daf0afbc 100644 --- a/core/src/main/java/hudson/util/CompressedFile.java +++ b/core/src/main/java/hudson/util/CompressedFile.java @@ -44,14 +44,14 @@ import com.jcraft.jzlib.GZIPInputStream; import com.jcraft.jzlib.GZIPOutputStream; /** - * Represents write-once read-many file that can be optiionally compressed + * Represents write-once read-many file that can be optionally compressed * to save disk space. This is used for console output and other bulky data. * *

      * In this class, the data on the disk can be one of two states: *

        *
      1. Uncompressed, in which case the original data is available in the specified file name. - *
      2. Compressed, in which case the gzip-compressed data is available in the specifiled file name + ".gz" extension. + *
      3. Compressed, in which case the gzip-compressed data is available in the specified file name + ".gz" extension. *
      * * Once the file is written and completed, it can be compressed asynchronously @@ -138,13 +138,8 @@ public class CompressedFile { compressionThread.submit(new Runnable() { public void run() { try { - InputStream in = read(); - OutputStream out = new GZIPOutputStream(new FileOutputStream(gz)); - try { - Util.copyStream(in,out); - } finally { - in.close(); - out.close(); + try (InputStream in = read(); OutputStream out = new GZIPOutputStream(new FileOutputStream(gz))) { + Util.copyStream(in, out); } // if the compressed file is created successfully, remove the original file.delete(); diff --git a/core/src/main/java/hudson/util/CopyOnWriteList.java b/core/src/main/java/hudson/util/CopyOnWriteList.java index 43e189ba19a5a15f70c31b102cc8e2229067504e..4e6af51dc66059910aedd71201e43e3e493bd698 100644 --- a/core/src/main/java/hudson/util/CopyOnWriteList.java +++ b/core/src/main/java/hudson/util/CopyOnWriteList.java @@ -143,7 +143,7 @@ public class CopyOnWriteList implements Iterable { } public List getView() { - return Collections.unmodifiableList(core); + return Collections.unmodifiableList(core); } public void addAllTo(Collection dst) { diff --git a/core/src/main/java/hudson/util/DescribableList.java b/core/src/main/java/hudson/util/DescribableList.java index 66c60e443598739c4d88a2e977817f9c72342146..a5e6df62804bb5f6d6c458397de4aef694cdf4b6 100644 --- a/core/src/main/java/hudson/util/DescribableList.java +++ b/core/src/main/java/hudson/util/DescribableList.java @@ -200,7 +200,7 @@ public class DescribableList, D extends Descriptor> * Rebuilds the list by creating a fresh instances from the submitted form. * *

      - * This version works with the the <f:hetero-list> UI tag, where the user + * This version works with the <f:hetero-list> UI tag, where the user * is allowed to create multiple instances of the same descriptor. Order is also * significant. */ @@ -249,7 +249,7 @@ public class DescribableList, D extends Descriptor> /** * {@link Converter} implementation for XStream. * - * Serializaion form is compatible with plain {@link List}. + * Serialization form is compatible with plain {@link List}. */ public static class ConverterImpl extends AbstractCollectionConverter { CopyOnWriteList.ConverterImpl copyOnWriteListConverter; diff --git a/core/src/main/java/hudson/util/DescriptorList.java b/core/src/main/java/hudson/util/DescriptorList.java index 75fedaab399d26866d538fa0f2d1624a2e7f0924..34ea3ba796d8cd4670d5ff431235515f33b6b127 100644 --- a/core/src/main/java/hudson/util/DescriptorList.java +++ b/core/src/main/java/hudson/util/DescriptorList.java @@ -54,7 +54,7 @@ import javax.annotation.CheckForNull; *

      * The other mode is the new mode, where the {@link Descriptor}s are actually stored in {@link ExtensionList} * (see {@link jenkins.model.Jenkins#getDescriptorList(Class)}) and this class acts as a view to it. This enables - * bi-directional interoperability — both descriptors registred automatically and descriptors registered + * bi-directional interoperability — both descriptors registered automatically and descriptors registered * manually are visible from both {@link DescriptorList} and {@link ExtensionList}. In this mode, * {@link #legacy} is null but {@link #type} is non-null. * diff --git a/core/src/main/java/hudson/util/DoubleLaunchChecker.java b/core/src/main/java/hudson/util/DoubleLaunchChecker.java index 801b9fe5c657b9a9173d50186e9d8df7f43dea38..091319f7128b4e448445b25bf362f7fdb0c3c594 100644 --- a/core/src/main/java/hudson/util/DoubleLaunchChecker.java +++ b/core/src/main/java/hudson/util/DoubleLaunchChecker.java @@ -61,7 +61,7 @@ import java.lang.reflect.Method; * *

      * More traditional way of doing this is to use a lock file with PID in it, but unfortunately in Java, - * there's no reliabe way to obtain PID. + * there's no reliable way to obtain PID. * * @author Kohsuke Kawaguchi * @since 1.178 diff --git a/core/src/main/java/hudson/util/FormFieldValidator.java b/core/src/main/java/hudson/util/FormFieldValidator.java index 2fc8874a9683153985d8c99dd110b5a14c261e80..737b3ee715a236812e873b6691798f1b284b554f 100644 --- a/core/src/main/java/hudson/util/FormFieldValidator.java +++ b/core/src/main/java/hudson/util/FormFieldValidator.java @@ -133,7 +133,7 @@ public abstract class FormFieldValidator { throw new AccessDeniedException("No subject"); subject.checkPermission(permission); } catch (AccessDeniedException e) { - // if the user has hudson-wisde admin permission, all checks are allowed + // if the user has hudson-wide admin permission, all checks are allowed // this is to protect Hudson administrator from broken ACL/SecurityRealm implementation/configuration. if(!Jenkins.getInstance().hasPermission(Jenkins.ADMINISTER)) throw e; @@ -481,7 +481,7 @@ public abstract class FormFieldValidator { else warning(msg); } } catch (InterruptedException e) { - ok(); // coundn't check + ok(); // couldn't check } } diff --git a/core/src/main/java/hudson/util/FormFillFailure.java b/core/src/main/java/hudson/util/FormFillFailure.java new file mode 100644 index 0000000000000000000000000000000000000000..8fcf650b7ff9cdd183169a8d7bf04052faade015 --- /dev/null +++ b/core/src/main/java/hudson/util/FormFillFailure.java @@ -0,0 +1,212 @@ +/* + * The MIT License + * + * Copyright (c) 2004-2017, Sun Microsystems, Inc., CloudBees, Inc. + * + * 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 hudson.util; + +import hudson.Functions; +import hudson.Util; +import java.io.IOException; +import java.util.Locale; +import javax.annotation.Nonnull; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletResponse; +import jenkins.model.Jenkins; +import org.kohsuke.stapler.HttpResponse; +import org.kohsuke.stapler.Stapler; +import org.kohsuke.stapler.StaplerRequest; +import org.kohsuke.stapler.StaplerResponse; + +/** + * Represents a failure in a form field doFillXYZ method. + * + *

      + * Use one of the factory methods to create an instance, then throw it from your doFillXyz + * method. + * + * @since 2.50 + */ +public abstract class FormFillFailure extends IOException implements HttpResponse { + + /** + * Sends out a string error message that indicates an error. + * + * @param message Human readable message to be sent. + */ + public static FormFillFailure error(@Nonnull String message) { + return errorWithMarkup(Util.escape(message)); + } + + public static FormFillFailure warning(@Nonnull String message) { + return warningWithMarkup(Util.escape(message)); + } + + /** + * Sends out a string error message that indicates an error, + * by formatting it with {@link String#format(String, Object[])} + */ + public static FormFillFailure error(String format, Object... args) { + return error(String.format(format, args)); + } + + public static FormFillFailure warning(String format, Object... args) { + return warning(String.format(format, args)); + } + + /** + * Sends out a string error message, with optional "show details" link that expands to the full stack trace. + * + *

      + * Use this with caution, so that anonymous users do not gain too much insights into the state of the system, + * as error stack trace often reveals a lot of information. Consider if an error needs to be exposed + * to everyone or just those who have higher access to job/hudson/etc. + */ + public static FormFillFailure error(Throwable e, String message) { + return _error(FormValidation.Kind.ERROR, e, message); + } + + public static FormFillFailure warning(Throwable e, String message) { + return _error(FormValidation.Kind.WARNING, e, message); + } + + private static FormFillFailure _error(FormValidation.Kind kind, Throwable e, String message) { + if (e == null) { + return _errorWithMarkup(Util.escape(message), kind); + } + + return _errorWithMarkup(Util.escape(message) + + " " + + Messages.FormValidation_Error_Details() + + "

      "
      +                + Util.escape(Functions.printThrowable(e)) +
      +                "
      ", kind + ); + } + + public static FormFillFailure error(Throwable e, String format, Object... args) { + return error(e, String.format(format, args)); + } + + public static FormFillFailure warning(Throwable e, String format, Object... args) { + return warning(e, String.format(format, args)); + } + + /** + * Sends out an HTML fragment that indicates an error. + * + *

      + * This method must be used with care to avoid cross-site scripting + * attack. + * + * @param message Human readable message to be sent. error(null) + * can be used as ok(). + */ + public static FormFillFailure errorWithMarkup(String message) { + return _errorWithMarkup(message, FormValidation.Kind.ERROR); + } + + public static FormFillFailure warningWithMarkup(String message) { + return _errorWithMarkup(message, FormValidation.Kind.WARNING); + } + + private static FormFillFailure _errorWithMarkup(@Nonnull final String message, final FormValidation.Kind kind) { + return new FormFillFailure(kind, message) { + public String renderHtml() { + StaplerRequest req = Stapler.getCurrentRequest(); + if (req == null) { // being called from some other context + return message; + } + // 1x16 spacer needed for IE since it doesn't support min-height + return "

      " + + message + "
      "; + } + + @Override + public String toString() { + return kind + ": " + message; + } + }; + } + + /** + * Sends out an arbitrary HTML fragment as the output. + */ + public static FormFillFailure respond(FormValidation.Kind kind, final String html) { + return new FormFillFailure(kind) { + public String renderHtml() { + return html; + } + + @Override + public String toString() { + return getKind() + ": " + html; + } + }; + } + + private final FormValidation.Kind kind; + private boolean selectionCleared; + + /** + * Instances should be created via one of the factory methods above. + * + * @param kind the kind + */ + private FormFillFailure(FormValidation.Kind kind) { + this.kind = kind; + } + + private FormFillFailure(FormValidation.Kind kind, String message) { + super(message); + this.kind = kind; + } + + public void generateResponse(StaplerRequest req, StaplerResponse rsp, Object node) + throws IOException, ServletException { + rsp.setContentType("text/html;charset=UTF-8"); + rsp.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); + rsp.setHeader("X-Jenkins-Select-Error", selectionCleared ? "clear" : "retain"); + rsp.getWriter().print(renderHtml()); + } + + public FormValidation.Kind getKind() { + return kind; + } + + public boolean isSelectionCleared() { + return selectionCleared; + } + + /** + * Flags this failure as requiring that the select options should be cleared out. + * + * @return {@code this} for method chaining. + */ + public FormFillFailure withSelectionCleared() { + this.selectionCleared = true; + return this; + } + + public abstract String renderHtml(); + +} diff --git a/core/src/main/java/hudson/util/FormValidation.java b/core/src/main/java/hudson/util/FormValidation.java index 4c52f19b6d909f07ccc703c5de43a2d490ea1460..c95e5d1da81cd3a17c6b5d69f28626429c4b4eeb 100644 --- a/core/src/main/java/hudson/util/FormValidation.java +++ b/core/src/main/java/hudson/util/FormValidation.java @@ -511,7 +511,7 @@ public abstract class FormValidation extends IOException implements HttpResponse } /** - * Implement the actual form validation logic, by using other convenience methosd defined in this class. + * Implement the actual form validation logic, by using other convenience methods defined in this class. * If you are not using any of those, you don't need to extend from this class. */ protected abstract FormValidation check() throws IOException, ServletException; @@ -638,7 +638,7 @@ public abstract class FormValidation extends IOException implements HttpResponse */ public String toStemUrl() { if (names==null) return null; - return jsStringEscape(Descriptor.getCurrentDescriptorByNameUrl()) + '/' + relativePath(); + return Descriptor.getCurrentDescriptorByNameUrl() + '/' + relativePath(); } public String getDependsOn() { diff --git a/core/src/main/java/hudson/util/HistoricalSecrets.java b/core/src/main/java/hudson/util/HistoricalSecrets.java new file mode 100644 index 0000000000000000000000000000000000000000..37a6fa39e170b3a3a236f7576253205b6d82de0e --- /dev/null +++ b/core/src/main/java/hudson/util/HistoricalSecrets.java @@ -0,0 +1,84 @@ +/* + * The MIT License + * + * Copyright (c) 2004-2010, Sun Microsystems, Inc., Kohsuke Kawaguchi + * Copyright (c) 2016, CloudBees Inc. + * + * 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 hudson.util; + +import com.trilead.ssh2.crypto.Base64; +import hudson.Util; +import jenkins.model.Jenkins; +import jenkins.security.CryptoConfidentialKey; +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.NoExternalUse; + +import javax.crypto.Cipher; +import javax.crypto.SecretKey; +import java.io.IOException; +import java.security.GeneralSecurityException; + +import static java.nio.charset.StandardCharsets.UTF_8; + +/** + * Historical algorithms for decrypting {@link Secret}s. + */ +@Restricted(NoExternalUse.class) +public class HistoricalSecrets { + + /*package*/ static Secret decrypt(String data, CryptoConfidentialKey key) throws IOException, GeneralSecurityException { + byte[] in = Base64.decode(data.toCharArray()); + Secret s = tryDecrypt(key.decrypt(), in); + if (s!=null) return s; + + // try our historical key for backward compatibility + Cipher cipher = Secret.getCipher("AES"); + cipher.init(Cipher.DECRYPT_MODE, getLegacyKey()); + return tryDecrypt(cipher, in); + } + + /*package*/ static Secret tryDecrypt(Cipher cipher, byte[] in) { + try { + String plainText = new String(cipher.doFinal(in), UTF_8); + if(plainText.endsWith(MAGIC)) + return new Secret(plainText.substring(0,plainText.length()-MAGIC.length())); + return null; + } catch (GeneralSecurityException e) { + return null; // if the key doesn't match with the bytes, it can result in BadPaddingException + } + } + + /** + * Turns {@link Jenkins#getSecretKey()} into an AES key. + * + * @deprecated + * This is no longer the key we use to encrypt new information, but we still need this + * to be able to decrypt what's already persisted. + */ + @Deprecated + /*package*/ static SecretKey getLegacyKey() throws GeneralSecurityException { + String secret = Secret.SECRET; + if(secret==null) return Jenkins.getInstance().getSecretKeyAsAES128(); + return Util.toAes128Key(secret); + } + + private static final String MAGIC = "::::MAGIC::::"; +} diff --git a/core/src/main/java/hudson/util/HttpResponses.java b/core/src/main/java/hudson/util/HttpResponses.java index 511a3f20e0cf414df50cbe8006bcdb82aaf6b1f7..ccef89059e1adbc3bda2d76f96d97c219303ab8d 100644 --- a/core/src/main/java/hudson/util/HttpResponses.java +++ b/core/src/main/java/hudson/util/HttpResponses.java @@ -29,6 +29,7 @@ import org.kohsuke.stapler.HttpResponse; import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerResponse; +import javax.annotation.CheckForNull; import javax.annotation.Nonnull; import javax.servlet.ServletException; import java.io.File; diff --git a/core/src/main/java/hudson/util/IOUtils.java b/core/src/main/java/hudson/util/IOUtils.java index b8edc312426a650da8a380f22f98d673209e6ecc..39561cb19bf0cfd0f53e150e59fbc64abe7bc1c9 100644 --- a/core/src/main/java/hudson/util/IOUtils.java +++ b/core/src/main/java/hudson/util/IOUtils.java @@ -71,7 +71,7 @@ public class IOUtils { * *

      * {@link InputStream#skip(long)} has two problems. One is that - * it doesn't let us reliably differentiate "hit EOF" case vs "inpustream just returning 0 since there's no data + * it doesn't let us reliably differentiate "hit EOF" case vs "inputstream just returning 0 since there's no data * currently available at hand", and some subtypes (such as {@link FileInputStream#skip(long)} returning -1. * *

      @@ -136,12 +136,9 @@ public class IOUtils { * @since 1.422 */ public static String readFirstLine(InputStream is, String encoding) throws IOException { - BufferedReader reader = new BufferedReader( - encoding==null ? new InputStreamReader(is) : new InputStreamReader(is,encoding)); - try { + try (BufferedReader reader = new BufferedReader( + encoding == null ? new InputStreamReader(is) : new InputStreamReader(is, encoding))) { return reader.readLine(); - } finally { - reader.close(); } } diff --git a/core/src/main/java/hudson/util/Iterators.java b/core/src/main/java/hudson/util/Iterators.java index 2b5d88f74bdbad1378d9ee83581dbe2bfc7b046a..74d82950dc298e8d79b0ccc471dd95d340e12163 100644 --- a/core/src/main/java/hudson/util/Iterators.java +++ b/core/src/main/java/hudson/util/Iterators.java @@ -24,6 +24,7 @@ package hudson.util; import com.google.common.base.Predicates; +import com.google.common.collect.ImmutableList; import java.util.Collections; import java.util.Iterator; @@ -314,12 +315,13 @@ public class Iterators { *

      * That is, this creates {A,B,C,D} from {A,B},{C,D}. */ + @SafeVarargs public static Iterable sequence( final Iterable... iterables ) { return new Iterable() { public Iterator iterator() { - return new FlattenIterator>(Arrays.asList(iterables)) { + return new FlattenIterator>(ImmutableList.copyOf(iterables)) { protected Iterator expand(Iterable iterable) { - return cast(iterable).iterator(); + return Iterators.cast(iterable).iterator(); } }; } @@ -350,8 +352,9 @@ public class Iterators { }; } + @SafeVarargs public static Iterator sequence(Iterator... iterators) { - return com.google.common.collect.Iterators.concat(iterators); + return com.google.common.collect.Iterators.concat(iterators); } /** diff --git a/core/src/main/java/hudson/util/ListBoxModel.java b/core/src/main/java/hudson/util/ListBoxModel.java index c880739b2cf10ed892a5a6167828da24049884c7..98d75fbd9abff31094fc762038f932f0bc5d5603 100644 --- a/core/src/main/java/hudson/util/ListBoxModel.java +++ b/core/src/main/java/hudson/util/ListBoxModel.java @@ -50,7 +50,7 @@ import java.util.Collection; * *

      
        * <select id='foo'>
      - *   <option>Fetching values...</optoin>
      + *   <option>Fetching values...</option>
        * </select>
        * 
      * diff --git a/core/src/main/java/hudson/util/MaskingClassLoader.java b/core/src/main/java/hudson/util/MaskingClassLoader.java index c51e1f187bcb5588843b8b0451d872073fa39ef1..47563439d4a7561f14a9586c61c590e2e4d96fb8 100644 --- a/core/src/main/java/hudson/util/MaskingClassLoader.java +++ b/core/src/main/java/hudson/util/MaskingClassLoader.java @@ -25,12 +25,12 @@ package hudson.util; import java.io.IOException; import java.net.URL; -import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.List; import java.util.Enumeration; import java.util.Collections; +import java.util.concurrent.CopyOnWriteArrayList; /** * {@link ClassLoader} that masks a specified set of classes @@ -45,9 +45,9 @@ public class MaskingClassLoader extends ClassLoader { /** * Prefix of the packages that should be hidden. */ - private final List masksClasses = new ArrayList(); + private final List masksClasses = new CopyOnWriteArrayList<>(); - private final List masksResources = new ArrayList(); + private final List masksResources = new CopyOnWriteArrayList<>(); public MaskingClassLoader(ClassLoader parent, String... masks) { this(parent, Arrays.asList(masks)); @@ -66,7 +66,7 @@ public class MaskingClassLoader extends ClassLoader { } @Override - protected synchronized Class loadClass(String name, boolean resolve) throws ClassNotFoundException { + protected Class loadClass(String name, boolean resolve) throws ClassNotFoundException { for (String mask : masksClasses) { if(name.startsWith(mask)) throw new ClassNotFoundException(); @@ -76,7 +76,7 @@ public class MaskingClassLoader extends ClassLoader { } @Override - public synchronized URL getResource(String name) { + public URL getResource(String name) { if (isMasked(name)) return null; return super.getResource(name); @@ -89,7 +89,7 @@ public class MaskingClassLoader extends ClassLoader { return super.getResources(name); } - public synchronized void add(String prefix) { + public void add(String prefix) { masksClasses.add(prefix); if(prefix !=null){ masksResources.add(prefix.replace(".","/")); diff --git a/core/src/main/java/hudson/util/MultipartFormDataParser.java b/core/src/main/java/hudson/util/MultipartFormDataParser.java index 5c1184cd2e996aadd1c6f790fbd83768c632a0ca..1789759d128943cfd4a0a4570f33749edd7f2950 100644 --- a/core/src/main/java/hudson/util/MultipartFormDataParser.java +++ b/core/src/main/java/hudson/util/MultipartFormDataParser.java @@ -78,7 +78,7 @@ public class MultipartFormDataParser { * * @param contentType Content-Type string. * @return {@code true} if the content type is "multipart/form-data", otherwise {@code false}. - * @since TODO + * @since 1.620 */ public static boolean isMultiPartForm(@CheckForNull String contentType) { if (contentType == null) { diff --git a/core/src/main/java/hudson/util/PersistedList.java b/core/src/main/java/hudson/util/PersistedList.java index 021605ead4d3a0e8434f2658e48624470f5c2380..17fcc663812c14c92cadf39f40a422a944db2608 100644 --- a/core/src/main/java/hudson/util/PersistedList.java +++ b/core/src/main/java/hudson/util/PersistedList.java @@ -217,7 +217,7 @@ public class PersistedList extends AbstractList { /** * {@link Converter} implementation for XStream. * - * Serializaion form is compatible with plain {@link List}. + * Serialization form is compatible with plain {@link List}. */ public static class ConverterImpl extends AbstractCollectionConverter { CopyOnWriteList.ConverterImpl copyOnWriteListConverter; diff --git a/core/src/main/java/hudson/util/ProcessKillingVeto.java b/core/src/main/java/hudson/util/ProcessKillingVeto.java index 3ae76c375dd60d6d34f1385a5c4d46d869b8688b..b8b874e42a55c8cd82f319af0cd5e7e5ab3cb39f 100644 --- a/core/src/main/java/hudson/util/ProcessKillingVeto.java +++ b/core/src/main/java/hudson/util/ProcessKillingVeto.java @@ -1,93 +1,103 @@ -/* - * The MIT License - * - * Copyright (c) 2015, Daniel Weber - * - * 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 hudson.util; - -import hudson.ExtensionPoint; -import hudson.util.ProcessTreeRemoting.IOSProcess; - -import java.util.Collections; -import java.util.List; - -import javax.annotation.CheckForNull; -import javax.annotation.Nonnull; - -import jenkins.model.Jenkins; - -/** - * Allows extensions to veto killing processes. If at least one extension vetoes - * the killing of a process, it will not be killed. This can be useful to keep - * daemon processes alive. An example is mspdbsrv.exe used by Microsoft - * compilers. - * - * See JENKINS-9104 - * - * @since TODO - * - * @author Daniel Weber - */ -public abstract class ProcessKillingVeto implements ExtensionPoint { - - /** - * Describes the cause for a process killing veto. - */ - public static class VetoCause { - private final String message; - - /** - * @param message A string describing the reason for the veto - */ - public VetoCause(@Nonnull String message) { - this.message = message; - } - - /** - * @return A string describing the reason for the veto. - */ - public @Nonnull String getMessage() { - return message; - } - } - - /** - * @return All ProcessKillingVeto extensions currently registered. An empty - * list if Jenkins is not available, never null. - */ - public static List all() { - // check if we are a thread running on the master JVM or a thread running in a remote JVM - Jenkins jenkins = Jenkins.getInstanceOrNull(); - if (jenkins == null) - return Collections.emptyList(); // we are remote, no body gets to veto - return jenkins.getExtensionList(ProcessKillingVeto.class); - } - - /** - * Ask the extension whether it vetoes killing of the given process - * - * @param p The process that is about to be killed - * @return a {@link VetoCause} if the process should not be killed, - * null else. - */ - @CheckForNull - public abstract VetoCause vetoProcessKilling(@Nonnull IOSProcess p); -} +/* + * The MIT License + * + * Copyright (c) 2015, Daniel Weber + * + * 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 hudson.util; + +import hudson.ExtensionList; +import hudson.ExtensionPoint; +import hudson.util.ProcessTreeRemoting.IOSProcess; + +import java.util.Collections; +import java.util.List; + +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; + +import jenkins.util.JenkinsJVM; + +/** + * Allows extensions to veto killing processes. If at least one extension vetoes + * the killing of a process, it will not be killed. This can be useful to keep + * daemon processes alive. An example is mspdbsrv.exe used by Microsoft + * compilers. + * + * See JENKINS-9104 + * + * @since 1.619 + * + * @author Daniel Weber + */ +public abstract class ProcessKillingVeto implements ExtensionPoint { + + /** + * Describes the cause for a process killing veto. + */ + public static class VetoCause { + private final String message; + + /** + * @param message A string describing the reason for the veto + */ + public VetoCause(@Nonnull String message) { + this.message = message; + } + + /** + * @return A string describing the reason for the veto. + */ + public @Nonnull String getMessage() { + return message; + } + } + + /** + * @return All ProcessKillingVeto extensions currently registered. An empty + * list if Jenkins is not available, never null. + */ + public static List all() { + if (JenkinsJVM.isJenkinsJVM()) { + return _all(); + } + return Collections.emptyList(); + } + + /** + * As classloading is lazy, the classes referenced in this method will not be resolved + * until the first time the method is invoked, so we use this method to guard access to Jenkins JVM only classes. + * + * @return All ProcessKillingVeto extensions currently registered. + */ + private static List _all() { + return ExtensionList.lookup(ProcessKillingVeto.class); + } + + /** + * Ask the extension whether it vetoes killing of the given process + * + * @param p The process that is about to be killed + * @return a {@link VetoCause} if the process should not be killed, + * null else. + */ + @CheckForNull + public abstract VetoCause vetoProcessKilling(@Nonnull IOSProcess p); +} diff --git a/core/src/main/java/hudson/util/ProcessTree.java b/core/src/main/java/hudson/util/ProcessTree.java index 42a6a72e343f61c971ae719ae6b13f393ceba74b..f851729a4c7ed83ca643da858a801067ac6da59d 100644 --- a/core/src/main/java/hudson/util/ProcessTree.java +++ b/core/src/main/java/hudson/util/ProcessTree.java @@ -25,6 +25,9 @@ package hudson.util; import com.sun.jna.Memory; import com.sun.jna.Native; +import com.sun.jna.NativeLong; +import com.sun.jna.Pointer; +import com.sun.jna.LastErrorException; import com.sun.jna.ptr.IntByReference; import hudson.EnvVars; import hudson.FilePath; @@ -752,8 +755,28 @@ public abstract class ProcessTree implements Iterable, IProcessTree, /** * Implementation for Solaris that uses /proc. * - * Amazingly, this single code works for both 32bit and 64bit Solaris, despite the fact - * that does a lot of pointer manipulation and what not. + * /proc/PID/psinfo contains a psinfo_t struct. We use it to determine where the + * process arguments and environment are located in PID's address space. + * Note that the psinfo_t struct is different (different sized elements) for 32-bit + * vs 64-bit processes and the kernel will provide the version of the struct that + * matches the _reader_ (this Java process) regardless of whether PID is a + * 32-bit or 64-bit process. + * + * Note that this means that if PID is a 64-bit process, then a 32-bit Java + * process can not get meaningful values for envp and argv out of the psinfo_t. The + * values will have been truncated to 32-bits. + * + * /proc/PID/as contains the address space of the process we are inspecting. We can + * follow the envp and argv pointers from psinfo_t to find the environment variables + * and process arguments. When following pointers in this address space we need to + * make sure to use 32-bit or 64-bit pointers depending on what sized pointers + * PID uses, regardless of what size pointers the Java process uses. + * + * Note that the size of a 64-bit address space is larger than Long.MAX_VALUE (because + * longs are signed). So normal Java utilities like RandomAccessFile and FileChannel + * (which use signed longs as offsets) are not able to read from the end of the address + * space, where envp and argv will be. Therefore we need to use LIBC.pread() directly. + * when accessing this file. */ static class Solaris extends ProcfsUnix { protected OSProcess createProcess(final int pid) throws IOException { @@ -761,15 +784,31 @@ public abstract class ProcessTree implements Iterable, IProcessTree, } private class SolarisProcess extends UnixProcess { + private static final byte PR_MODEL_ILP32 = 1; + private static final byte PR_MODEL_LP64 = 2; + + /* + * An arbitrary upper-limit on how many characters readLine() will + * try reading before giving up. This avoids having readLine() loop + * over the entire process address space if this class has bugs. + */ + private final int LINE_LENGTH_LIMIT = + SystemProperties.getInteger(Solaris.class.getName()+".lineLimit", 10000); + + /* + * True if target process is 64-bit (Java process may be different). + */ + private final boolean b64; + private final int ppid; /** - * Address of the environment vector. Even on 64bit Solaris this is still 32bit pointer. + * Address of the environment vector. */ - private final int envp; + private final long envp; /** - * Similarly, address of the arguments vector. + * Similarly, address of the arguments vector. */ - private final int argp; + private final long argp; private final int argc; private EnvVars envVars; private List arguments; @@ -821,10 +860,23 @@ public abstract class ProcessTree implements Iterable, IProcessTree, throw new IOException("psinfo PID mismatch"); // sanity check ppid = adjust(psinfo.readInt()); - psinfo.seek(188); // now jump to pr_argc - argc = adjust(psinfo.readInt()); - argp = adjust(psinfo.readInt()); - envp = adjust(psinfo.readInt()); + /* + * Read the remainder of psinfo_t differently depending on whether the + * Java process is 32-bit or 64-bit. + */ + if (Pointer.SIZE == 8) { + psinfo.seek(236); // offset of pr_argc + argc = adjust(psinfo.readInt()); + argp = adjustL(psinfo.readLong()); + envp = adjustL(psinfo.readLong()); + b64 = (psinfo.readByte() == PR_MODEL_LP64); + } else { + psinfo.seek(188); // offset of pr_argc + argc = adjust(psinfo.readInt()); + argp = to64(adjust(psinfo.readInt())); + envp = to64(adjust(psinfo.readInt())); + b64 = (psinfo.readByte() == PR_MODEL_LP64); + } } finally { psinfo.close(); } @@ -842,23 +894,28 @@ public abstract class ProcessTree implements Iterable, IProcessTree, return arguments; arguments = new ArrayList(argc); + if (argc == 0) { + return arguments; + } + int psize = b64 ? 8 : 4; + Memory m = new Memory(psize); try { - RandomAccessFile as = new RandomAccessFile(getFile("as"),"r"); if(LOGGER.isLoggable(FINER)) LOGGER.finer("Reading "+getFile("as")); + int fd = LIBC.open(getFile("as").getAbsolutePath(), 0); try { for( int n=0; n, IProcessTree, return envVars; envVars = new EnvVars(); + if (envp == 0) { + return envVars; + } + + int psize = b64 ? 8 : 4; + Memory m = new Memory(psize); try { - RandomAccessFile as = new RandomAccessFile(getFile("as"),"r"); if(LOGGER.isLoggable(FINER)) LOGGER.finer("Reading "+getFile("as")); + int fd = LIBC.open(getFile("as").getAbsolutePath(), 0); try { for( int n=0; ; n++ ) { // read a pointer to one entry - as.seek(to64(envp+n*4)); - int p = adjust(as.readInt()); - if(p==0) - break; // completed the walk + LIBC.pread(fd, m, new NativeLong(psize), new NativeLong(envp+n*psize)); + long addr = b64 ? m.getLong(0) : to64(m.getInt(0)); + if (addr == 0) // completed the walk + break; // now read the null-terminated string - envVars.addLine(readLine(as, p, "env["+ n +"]")); + envVars.addLine(readLine(fd, addr, "env["+ n +"]")); } } finally { - as.close(); + LIBC.close(fd); } - } catch (IOException e) { + } catch (IOException | LastErrorException e) { // failed to read. this can happen under normal circumstances (most notably permission denied) // so don't report this as an error. } - return envVars; } - private String readLine(RandomAccessFile as, int p, String prefix) throws IOException { + private String readLine(int fd, long addr, String prefix) throws IOException { if(LOGGER.isLoggable(FINEST)) - LOGGER.finest("Reading "+prefix+" at "+p); + LOGGER.finest("Reading "+prefix+" at "+addr); - as.seek(to64(p)); + Memory m = new Memory(1); + byte ch = 1; ByteArrayOutputStream buf = new ByteArrayOutputStream(); - int ch,i=0; - while((ch=as.read())>0) { - if((++i)%100==0 && LOGGER.isLoggable(FINEST)) - LOGGER.finest(prefix +" is so far "+buf.toString()); + int i = 0; + while(true) { + if (i++ > LINE_LENGTH_LIMIT) { + LOGGER.finest("could not find end of line, giving up"); + throw new IOException("could not find end of line, giving up"); + } + LIBC.pread(fd, m, new NativeLong(1), new NativeLong(addr)); + ch = m.getByte(0); + if (ch == 0) + break; buf.write(ch); + addr++; } String line = buf.toString(); if(LOGGER.isLoggable(FINEST)) @@ -936,6 +1006,13 @@ public abstract class ProcessTree implements Iterable, IProcessTree, return i; } + public static long adjustL(long i) { + if(IS_LITTLE_ENDIAN) { + return Long.reverseBytes(i); + } else { + return i; + } + } } /** @@ -1033,7 +1110,7 @@ public abstract class ProcessTree implements Iterable, IProcessTree, // for some reason, I was never able to get sysctlbyname work. // if(LIBC.sysctlbyname("kern.argmax", argmaxRef.getPointer(), size, NULL, _)!=0) if(LIBC.sysctl(new int[]{CTL_KERN,KERN_ARGMAX},2, argmaxRef.getPointer(), size, NULL, _)!=0) - throw new IOException("Failed to get kernl.argmax: "+LIBC.strerror(Native.getLastError())); + throw new IOException("Failed to get kern.argmax: "+LIBC.strerror(Native.getLastError())); int argmax = argmaxRef.getValue(); @@ -1124,7 +1201,7 @@ public abstract class ProcessTree implements Iterable, IProcessTree, arguments.add(m.readString()); } } catch (IndexOutOfBoundsException e) { - throw new IllegalStateException("Failed to parse arguments: pid="+pid+", arg0="+args0+", arguments="+arguments+", nargs="+argc+". Please run 'ps e "+pid+"' and report this to https://issues.jenkins-ci.org/browse/JENKINS-9634",e); + throw new IllegalStateException("Failed to parse arguments: pid="+pid+", arg0="+args0+", arguments="+arguments+", nargs="+argc+". Please see https://jenkins.io/redirect/troubleshooting/darwin-failed-to-parse-arguments",e); } // read env vars that follow diff --git a/core/src/main/java/hudson/util/RemotingDiagnostics.java b/core/src/main/java/hudson/util/RemotingDiagnostics.java index ed3a4c814b5f1f73ed2efa72f894b5a843f8a406..d38fa7170e9b6629263850f0722b6afcedcf9420 100644 --- a/core/src/main/java/hudson/util/RemotingDiagnostics.java +++ b/core/src/main/java/hudson/util/RemotingDiagnostics.java @@ -143,7 +143,7 @@ public final class RemotingDiagnostics { if(output!=null) pw.println("Result: "+output); } catch (Throwable t) { - t.printStackTrace(pw); + Functions.printStackTrace(t, pw); } return out.toString(); } diff --git a/core/src/main/java/hudson/util/RingBufferLogHandler.java b/core/src/main/java/hudson/util/RingBufferLogHandler.java index dc51e2c694e506252430188860677b1311de4467..89d0b124d78e0d1b9e5712a181c4f36467b79b04 100644 --- a/core/src/main/java/hudson/util/RingBufferLogHandler.java +++ b/core/src/main/java/hudson/util/RingBufferLogHandler.java @@ -23,7 +23,6 @@ */ package hudson.util; -import jenkins.util.SystemProperties; import java.util.AbstractList; import java.util.List; import java.util.logging.Handler; @@ -36,12 +35,17 @@ import java.util.logging.LogRecord; */ public class RingBufferLogHandler extends Handler { - private static final int DEFAULT_RING_BUFFER_SIZE = SystemProperties.getInteger(RingBufferLogHandler.class.getName() + ".defaultSize", 256); + private static final int DEFAULT_RING_BUFFER_SIZE = Integer.getInteger(RingBufferLogHandler.class.getName() + ".defaultSize", 256); private int start = 0; private final LogRecord[] records; private volatile int size = 0; + /** + * This constructor is deprecated. It can't access system properties with {@link jenkins.util.SystemProperties} + * as it's not legal to use it on remoting agents. + */ + @Deprecated public RingBufferLogHandler() { this(DEFAULT_RING_BUFFER_SIZE); } diff --git a/core/src/main/java/hudson/util/RunList.java b/core/src/main/java/hudson/util/RunList.java index f77232afcc687571c89eac3c398823a9a0c2acde..d9b8adb7dc54fbb56e446337c8e75d97dc5729ea 100644 --- a/core/src/main/java/hudson/util/RunList.java +++ b/core/src/main/java/hudson/util/RunList.java @@ -76,7 +76,23 @@ public class RunList extends AbstractList { this.base = combine(runLists); } - private Iterable combine(Iterable> runLists) { + /** + * Creates a a {@link RunList} combining all the runs of the supplied jobs. + * + * @param jobs the supplied jobs. + * @param the base class of job. + * @param the base class of run. + * @return the run list. + * @since 2.37 + */ + public static , R extends Run> RunList fromJobs(Iterable jobs) { + List> runLists = new ArrayList<>(); + for (Job j : jobs) + runLists.add(j.getBuilds()); + return new RunList<>(combine(runLists)); + } + + private static Iterable combine(Iterable> runLists) { return Iterables.mergeSorted(runLists, new Comparator() { public int compare(R o1, R o2) { long lhs = o1.getTimeInMillis(); diff --git a/core/src/main/java/hudson/util/Secret.java b/core/src/main/java/hudson/util/Secret.java index a2a2bcb97167cabcd03b207a0e299dd1af93b729..e8380e7b04967a0733c56e06aff04dacbb50cf70 100644 --- a/core/src/main/java/hudson/util/Secret.java +++ b/core/src/main/java/hudson/util/Secret.java @@ -2,6 +2,7 @@ * The MIT License * * Copyright (c) 2004-2010, Sun Microsystems, Inc., Kohsuke Kawaguchi + * Copyright (c) 2016, CloudBees Inc. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -30,12 +31,12 @@ import com.thoughtworks.xstream.io.HierarchicalStreamReader; import com.thoughtworks.xstream.io.HierarchicalStreamWriter; import com.trilead.ssh2.crypto.Base64; import jenkins.util.SystemProperties; +import java.util.Arrays; import jenkins.model.Jenkins; import hudson.Util; import jenkins.security.CryptoConfidentialKey; import org.kohsuke.stapler.Stapler; -import javax.crypto.SecretKey; import javax.crypto.Cipher; import java.io.Serializable; import java.io.UnsupportedEncodingException; @@ -47,6 +48,8 @@ import javax.annotation.Nonnull; import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.restrictions.NoExternalUse; +import static java.nio.charset.StandardCharsets.UTF_8; + /** * Glorified {@link String} that uses encryption in the persisted form, to avoid accidental exposure of a secret. * @@ -61,14 +64,21 @@ import org.kohsuke.accmod.restrictions.NoExternalUse; * @author Kohsuke Kawaguchi */ public final class Secret implements Serializable { + private static final byte PAYLOAD_V1 = 1; /** * Unencrypted secret text. */ @Nonnull private final String value; + private byte[] iv; + + /*package*/ Secret(String value) { + this.value = value; + } - private Secret(String value) { + /*package*/ Secret(String value, byte[] iv) { this.value = value; + this.iv = iv; } /** @@ -105,20 +115,6 @@ public final class Secret implements Serializable { return value.hashCode(); } - /** - * Turns {@link Jenkins#getSecretKey()} into an AES key. - * - * @deprecated - * This is no longer the key we use to encrypt new information, but we still need this - * to be able to decrypt what's already persisted. - */ - @Deprecated - /*package*/ static SecretKey getLegacyKey() throws GeneralSecurityException { - String secret = SECRET; - if(secret==null) return Jenkins.getInstance().getSecretKeyAsAES128(); - return Util.toAes128Key(secret); - } - /** * Encrypts {@link #value} and returns it in an encoded printable form. * @@ -126,23 +122,42 @@ public final class Secret implements Serializable { */ public String getEncryptedValue() { try { - Cipher cipher = KEY.encrypt(); - // add the magic suffix which works like a check sum. - return new String(Base64.encode(cipher.doFinal((value+MAGIC).getBytes("UTF-8")))); + synchronized (this) { + if (iv == null) { //if we were created from plain text or other reason without iv + iv = KEY.newIv(); + } + } + Cipher cipher = KEY.encrypt(iv); + byte[] encrypted = cipher.doFinal(this.value.getBytes(UTF_8)); + byte[] payload = new byte[1 + 8 + iv.length + encrypted.length]; + int pos = 0; + // For PAYLOAD_V1 we use this byte shifting model, V2 probably will need DataOutput + payload[pos++] = PAYLOAD_V1; + payload[pos++] = (byte)(iv.length >> 24); + payload[pos++] = (byte)(iv.length >> 16); + payload[pos++] = (byte)(iv.length >> 8); + payload[pos++] = (byte)(iv.length); + payload[pos++] = (byte)(encrypted.length >> 24); + payload[pos++] = (byte)(encrypted.length >> 16); + payload[pos++] = (byte)(encrypted.length >> 8); + payload[pos++] = (byte)(encrypted.length); + System.arraycopy(iv, 0, payload, pos, iv.length); + pos+=iv.length; + System.arraycopy(encrypted, 0, payload, pos, encrypted.length); + return "{"+new String(Base64.encode(payload))+"}"; } catch (GeneralSecurityException e) { throw new Error(e); // impossible - } catch (UnsupportedEncodingException e) { - throw new Error(e); // impossible } } /** - * Pattern matching a possible output of {@link #getEncryptedValue}. - * Basically, any Base64-encoded value. - * You must then call {@link #decrypt} to eliminate false positives. + * Pattern matching a possible output of {@link #getEncryptedValue} + * Basically, any Base64-encoded value optionally wrapped by {@code {}}. + * You must then call {@link #decrypt(String)} to eliminate false positives. + * @see #ENCRYPTED_VALUE_PATTERN */ @Restricted(NoExternalUse.class) - public static final Pattern ENCRYPTED_VALUE_PATTERN = Pattern.compile("[A-Za-z0-9+/]+={0,2}"); + public static final Pattern ENCRYPTED_VALUE_PATTERN = Pattern.compile("\\{?[A-Za-z0-9+/]+={0,2}}?"); /** * Reverse operation of {@link #getEncryptedValue()}. Returns null @@ -151,32 +166,52 @@ public final class Secret implements Serializable { @CheckForNull public static Secret decrypt(@CheckForNull String data) { if(data==null) return null; - try { - byte[] in = Base64.decode(data.toCharArray()); - Secret s = tryDecrypt(KEY.decrypt(), in); - if (s!=null) return s; - // try our historical key for backward compatibility - Cipher cipher = getCipher("AES"); - cipher.init(Cipher.DECRYPT_MODE, getLegacyKey()); - return tryDecrypt(cipher, in); - } catch (GeneralSecurityException e) { - return null; - } catch (UnsupportedEncodingException e) { - throw new Error(e); // impossible - } catch (IOException e) { - return null; - } - } - - /*package*/ static Secret tryDecrypt(Cipher cipher, byte[] in) throws UnsupportedEncodingException { - try { - String plainText = new String(cipher.doFinal(in), "UTF-8"); - if(plainText.endsWith(MAGIC)) - return new Secret(plainText.substring(0,plainText.length()-MAGIC.length())); - return null; - } catch (GeneralSecurityException e) { - return null; // if the key doesn't match with the bytes, it can result in BadPaddingException + if (data.startsWith("{") && data.endsWith("}")) { //likely CBC encrypted/containing metadata but could be plain text + byte[] payload; + try { + payload = Base64.decode(data.substring(1, data.length()-1).toCharArray()); + } catch (IOException e) { + return null; + } + switch (payload[0]) { + case PAYLOAD_V1: + // For PAYLOAD_V1 we use this byte shifting model, V2 probably will need DataOutput + int ivLength = ((payload[1] & 0xff) << 24) + | ((payload[2] & 0xff) << 16) + | ((payload[3] & 0xff) << 8) + | (payload[4] & 0xff); + int dataLength = ((payload[5] & 0xff) << 24) + | ((payload[6] & 0xff) << 16) + | ((payload[7] & 0xff) << 8) + | (payload[8] & 0xff); + if (payload.length != 1 + 8 + ivLength + dataLength) { + // not valid v1 + return null; + } + byte[] iv = Arrays.copyOfRange(payload, 9, 9 + ivLength); + byte[] code = Arrays.copyOfRange(payload, 9+ivLength, payload.length); + String text; + try { + text = new String(KEY.decrypt(iv).doFinal(code), UTF_8); + } catch (GeneralSecurityException e) { + // it's v1 which cannot be historical, but not decrypting + return null; + } + return new Secret(text, iv); + default: + return null; + } + } else { + try { + return HistoricalSecrets.decrypt(data, KEY); + } catch (GeneralSecurityException e) { + return null; + } catch (UnsupportedEncodingException e) { + throw new Error(e); // impossible + } catch (IOException e) { + return null; + } } } @@ -234,8 +269,6 @@ public final class Secret implements Serializable { } } - private static final String MAGIC = "::::MAGIC::::"; - /** * Workaround for JENKINS-6459 / http://java.net/jira/browse/GLASSFISH-11862 * @see #getCipher(String) @@ -252,6 +285,14 @@ public final class Secret implements Serializable { */ private static final CryptoConfidentialKey KEY = new CryptoConfidentialKey(Secret.class.getName()); + /** + * Reset the internal secret key for testing. + */ + @Restricted(NoExternalUse.class) + /*package*/ static void resetKeyForTest() { + KEY.resetForTest(); + } + private static final long serialVersionUID = 1L; static { diff --git a/core/src/main/java/hudson/util/SecretRewriter.java b/core/src/main/java/hudson/util/SecretRewriter.java index 0ee05dc869371d895914d4c8403f09a755be5b6f..04bbb82f880708d42a347aa5c2ea1370946e3aab 100644 --- a/core/src/main/java/hudson/util/SecretRewriter.java +++ b/core/src/main/java/hudson/util/SecretRewriter.java @@ -1,8 +1,8 @@ package hudson.util; import com.trilead.ssh2.crypto.Base64; +import hudson.Functions; import hudson.model.TaskListener; -import org.apache.commons.io.FileUtils; import javax.crypto.Cipher; import javax.crypto.SecretKey; @@ -34,21 +34,21 @@ public class SecretRewriter { */ private int count; - /** - * If non-null the original file before rewrite gets in here. - */ - private final File backupDirectory; - /** * Canonical paths of the directories we are recursing to protect * against symlink induced cycles. */ private Set callstack = new HashSet(); - public SecretRewriter(File backupDirectory) throws GeneralSecurityException { + public SecretRewriter() throws GeneralSecurityException { cipher = Secret.getCipher("AES"); - key = Secret.getLegacyKey(); - this.backupDirectory = backupDirectory; + key = HistoricalSecrets.getLegacyKey(); + } + + /** @deprecated SECURITY-376: {@code backupDirectory} is ignored */ + @Deprecated + public SecretRewriter(File backupDirectory) throws GeneralSecurityException { + this(); } private String tryRewrite(String s) throws IOException, InvalidKeyException { @@ -64,64 +64,56 @@ public class SecretRewriter { return s; // not a valid base64 } cipher.init(Cipher.DECRYPT_MODE, key); - Secret sec = Secret.tryDecrypt(cipher, in); + Secret sec = HistoricalSecrets.tryDecrypt(cipher, in); if(sec!=null) // matched return sec.getEncryptedValue(); // replace by the new encrypted value else // not encrypted with the legacy key. leave it unmodified return s; } - /** - * @param backup - * if non-null, the original file will be copied here before rewriting. - * if the rewrite doesn't happen, no copying. - */ + /** @deprecated SECURITY-376: {@code backup} is ignored */ + @Deprecated public boolean rewrite(File f, File backup) throws InvalidKeyException, IOException { + return rewrite(f); + } + + public boolean rewrite(File f) throws InvalidKeyException, IOException { + AtomicFileWriter w = new AtomicFileWriter(f, "UTF-8"); try { - PrintWriter out = new PrintWriter(new BufferedWriter(w)); boolean modified = false; // did we actually change anything? - try { - FileInputStream fin = new FileInputStream(f); - try { + try (PrintWriter out = new PrintWriter(new BufferedWriter(w))) { + try (FileInputStream fin = new FileInputStream(f)) { BufferedReader r = new BufferedReader(new InputStreamReader(fin, "UTF-8")); String line; StringBuilder buf = new StringBuilder(); - while ((line=r.readLine())!=null) { - int copied=0; + while ((line = r.readLine()) != null) { + int copied = 0; buf.setLength(0); while (true) { - int sidx = line.indexOf('>',copied); - if (sidx<0) break; - int eidx = line.indexOf('<',sidx); - if (eidx<0) break; + int sidx = line.indexOf('>', copied); + if (sidx < 0) break; + int eidx = line.indexOf('<', sidx); + if (eidx < 0) break; - String elementText = line.substring(sidx+1,eidx); + String elementText = line.substring(sidx + 1, eidx); String replacement = tryRewrite(elementText); if (!replacement.equals(elementText)) modified = true; - buf.append(line.substring(copied,sidx+1)); + buf.append(line.substring(copied, sidx + 1)); buf.append(replacement); copied = eidx; } buf.append(line.substring(copied)); out.println(buf.toString()); } - } finally { - fin.close(); } - } finally { - out.close(); } if (modified) { - if (backup!=null) { - backup.getParentFile().mkdirs(); - FileUtils.copyFile(f,backup); - } w.commit(); } return modified; @@ -166,16 +158,12 @@ public class SecretRewriter { if ((count++)%100==0) listener.getLogger().println("Scanning "+child); try { - File backup = null; - if (backupDirectory!=null) backup = new File(backupDirectory,relative+'/'+ cn); - if (rewrite(child,backup)) { - if (backup!=null) - listener.getLogger().println("Copied "+child+" to "+backup+" as a backup"); + if (rewrite(child)) { listener.getLogger().println("Rewritten "+child); rewritten++; } } catch (IOException e) { - e.printStackTrace(listener.error("Failed to rewrite "+child)); + Functions.printStackTrace(e, listener.error("Failed to rewrite " + child)); } } if (child.isDirectory()) { @@ -200,7 +188,6 @@ public class SecretRewriter { String n = dir.getName(); return n.equals("workspace") || n.equals("artifacts") || n.equals("plugins") // no mutable data here - || n.equals("jenkins.security.RekeySecretAdminMonitor") // we don't want to rewrite backups || n.equals(".") || n.equals(".."); } diff --git a/core/src/main/java/hudson/util/SequentialExecutionQueue.java b/core/src/main/java/hudson/util/SequentialExecutionQueue.java index a1cfa3ccba97beff3fbb220db77674ca2f65557a..1ad1915099ef4fa5ab80122781c6ba6c4adced07 100644 --- a/core/src/main/java/hudson/util/SequentialExecutionQueue.java +++ b/core/src/main/java/hudson/util/SequentialExecutionQueue.java @@ -23,7 +23,7 @@ import java.util.concurrent.ExecutorService; */ public class SequentialExecutionQueue implements Executor { /** - * Access is sycnhronized by {@code Queue.this} + * Access is synchronized by {@code Queue.this} */ private final Map entries = new HashMap(); private ExecutorService executors; diff --git a/core/src/main/java/hudson/util/Service.java b/core/src/main/java/hudson/util/Service.java index 56ec8928f03e947854e66033202188db58159209..6275b07e3f9f1132e07a867a5f1c34ee483ffc39 100644 --- a/core/src/main/java/hudson/util/Service.java +++ b/core/src/main/java/hudson/util/Service.java @@ -50,28 +50,25 @@ public class Service { final Enumeration e = classLoader.getResources("META-INF/services/"+type.getName()); while (e.hasMoreElements()) { URL url = e.nextElement(); - BufferedReader configFile = new BufferedReader(new InputStreamReader(url.openStream(),"UTF-8")); - try { + try (BufferedReader configFile = new BufferedReader(new InputStreamReader(url.openStream(), "UTF-8"))) { String line; while ((line = configFile.readLine()) != null) { line = line.trim(); - if (line.startsWith("#") || line.length()==0) continue; + if (line.startsWith("#") || line.length() == 0) continue; try { Class t = classLoader.loadClass(line); - if (!type.isAssignableFrom(t)) continue; // invalid type + if (!type.isAssignableFrom(t)) continue; // invalid type result.add(type.cast(t.newInstance())); } catch (ClassNotFoundException x) { - LOGGER.log(WARNING,"Failed to load "+line,x); + LOGGER.log(WARNING, "Failed to load " + line, x); } catch (InstantiationException x) { - LOGGER.log(WARNING,"Failed to load "+line,x); + LOGGER.log(WARNING, "Failed to load " + line, x); } catch (IllegalAccessException x) { - LOGGER.log(WARNING,"Failed to load "+line,x); + LOGGER.log(WARNING, "Failed to load " + line, x); } } - } finally { - configFile.close(); } } @@ -87,26 +84,23 @@ public class Service { Enumeration e = cl.getResources("META-INF/services/" + spi.getName()); while(e.hasMoreElements()) { final URL url = e.nextElement(); - final BufferedReader r = new BufferedReader(new InputStreamReader(url.openStream(),"UTF-8")); - try { + try (BufferedReader r = new BufferedReader(new InputStreamReader(url.openStream(), "UTF-8"))) { String line; - while((line=r.readLine())!=null) { - if(line.startsWith("#")) + while ((line = r.readLine()) != null) { + if (line.startsWith("#")) continue; // comment line line = line.trim(); - if(line.length()==0) + if (line.length() == 0) continue; // empty line. ignore. try { result.add(cl.loadClass(line).asSubclass(spi)); } catch (ClassNotFoundException x) { - LOGGER.log(Level.WARNING, "Failed to load "+line, x); + LOGGER.log(Level.WARNING, "Failed to load " + line, x); } } } catch (IOException x) { - LOGGER.log(Level.WARNING, "Failed to load "+url, x); - } finally { - r.close(); + LOGGER.log(Level.WARNING, "Failed to load " + url, x); } } } catch (IOException x) { diff --git a/core/src/main/java/hudson/util/TextFile.java b/core/src/main/java/hudson/util/TextFile.java index 4e16532044291ec497acfcdd05daa925ae972f77..b6fb8341e8e3b23abac560f363ab145c8dd94355 100644 --- a/core/src/main/java/hudson/util/TextFile.java +++ b/core/src/main/java/hudson/util/TextFile.java @@ -67,13 +67,10 @@ public class TextFile { public String read() throws IOException { StringWriter out = new StringWriter(); PrintWriter w = new PrintWriter(out); - BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(file),"UTF-8")); - try { + try (BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-8"))) { String line; - while((line=in.readLine())!=null) + while ((line = in.readLine()) != null) w.println(line); - } finally{ - in.close(); } return out.toString(); } @@ -177,23 +174,20 @@ public class TextFile { * So all in all, this algorithm should work decently, and it works quite efficiently on a large text. */ public @Nonnull String fastTail(int numChars, Charset cs) throws IOException { - RandomAccessFile raf = new RandomAccessFile(file,"r"); - try { + try (RandomAccessFile raf = new RandomAccessFile(file, "r")) { long len = raf.length(); // err on the safe side and assume each char occupies 4 bytes // additional 1024 byte margin is to bring us back in sync in case we started reading from non-char boundary. - long pos = Math.max(0, len - (numChars*4+1024)); + long pos = Math.max(0, len - (numChars * 4 + 1024)); raf.seek(pos); - byte[] tail = new byte[(int) (len-pos)]; + byte[] tail = new byte[(int) (len - pos)]; raf.readFully(tail); String tails = cs.decode(java.nio.ByteBuffer.wrap(tail)).toString(); - return new String(tails.substring(Math.max(0,tails.length()-numChars))); // trim the baggage of substring by allocating a new String - } finally { - raf.close(); + return new String(tails.substring(Math.max(0, tails.length() - numChars))); // trim the baggage of substring by allocating a new String } } diff --git a/core/src/main/java/hudson/util/XStream2.java b/core/src/main/java/hudson/util/XStream2.java index b08cb8be430af5e81745ce9ec3e1e432a55eb0f4..67cb8ef5d5526cd37b448044400d34e7facf7994 100644 --- a/core/src/main/java/hudson/util/XStream2.java +++ b/core/src/main/java/hudson/util/XStream2.java @@ -43,7 +43,7 @@ import com.thoughtworks.xstream.io.HierarchicalStreamDriver; import com.thoughtworks.xstream.io.HierarchicalStreamReader; import com.thoughtworks.xstream.io.HierarchicalStreamWriter; import com.thoughtworks.xstream.mapper.CannotResolveClassException; -import edu.umd.cs.findbugs.annotations.SuppressWarnings; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import hudson.PluginManager; import hudson.PluginWrapper; import hudson.diagnosis.OldDataMonitor; @@ -422,7 +422,7 @@ public class XStream2 extends XStream { private PluginManager pm; - @SuppressWarnings("NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE") // classOwnership checked for null so why does FB complain? + @SuppressFBWarnings("NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE") // classOwnership checked for null so why does FB complain? @Override public String ownerOf(Class clazz) { if (classOwnership != null) { return classOwnership.ownerOf(clazz); diff --git a/core/src/main/java/hudson/util/io/RewindableFileOutputStream.java b/core/src/main/java/hudson/util/io/RewindableFileOutputStream.java index 38e522a18842cdccd04993772726c779ace41a39..b7bb2b5f022df4b4d4caabc53349f85991e2bbc1 100644 --- a/core/src/main/java/hudson/util/io/RewindableFileOutputStream.java +++ b/core/src/main/java/hudson/util/io/RewindableFileOutputStream.java @@ -28,11 +28,13 @@ import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; +import org.apache.commons.io.FileUtils; /** * {@link OutputStream} that writes to a file. *

      * Allows the caller to rewind the stream and override previous content with fresh new data. + * @since 2.18 */ public class RewindableFileOutputStream extends OutputStream { protected final File out; @@ -47,6 +49,7 @@ public class RewindableFileOutputStream extends OutputStream { private synchronized OutputStream current() throws IOException { if (current == null) { if (!closed) { + FileUtils.forceMkdir(out.getParentFile()); try { current = new FileOutputStream(out,false); } catch (FileNotFoundException e) { diff --git a/core/src/main/java/hudson/util/io/RewindableRotatingFileOutputStream.java b/core/src/main/java/hudson/util/io/RewindableRotatingFileOutputStream.java index 132f0743a00c1439c840632d0b7d2c08f0f40644..aa53ea9f4c46dbd13284da0ebc48ac7efaf42269 100644 --- a/core/src/main/java/hudson/util/io/RewindableRotatingFileOutputStream.java +++ b/core/src/main/java/hudson/util/io/RewindableRotatingFileOutputStream.java @@ -30,7 +30,7 @@ import java.io.IOException; * {@link ReopenableFileOutputStream} that does log rotation upon rewind. * * @author Kohsuke Kawaguchi - * @since 1.416 + * @since 2.18 */ public class RewindableRotatingFileOutputStream extends RewindableFileOutputStream { /** diff --git a/core/src/main/java/hudson/util/jna/GNUCLibrary.java b/core/src/main/java/hudson/util/jna/GNUCLibrary.java index d555c8c4d18e1fa0ecc4a65c0ebb4b3870499a2d..6cfa2a4b83f57fa60c00404599e9e4140a550cd6 100644 --- a/core/src/main/java/hudson/util/jna/GNUCLibrary.java +++ b/core/src/main/java/hudson/util/jna/GNUCLibrary.java @@ -29,6 +29,7 @@ import com.sun.jna.Pointer; import com.sun.jna.Native; import com.sun.jna.Memory; import com.sun.jna.NativeLong; +import com.sun.jna.LastErrorException; import com.sun.jna.ptr.IntByReference; import jnr.posix.POSIX; import org.jvnet.libpam.impl.CLibrary.passwd; @@ -74,8 +75,10 @@ public interface GNUCLibrary extends Library { int chown(String fileName, int uid, int gid); int chmod(String fileName, int i); + int open(String pathname, int flags) throws LastErrorException; int dup(int old); int dup2(int old, int _new); + long pread(int fd, Memory buffer, NativeLong size, NativeLong offset) throws LastErrorException; int close(int fd); // see http://www.gnu.org/s/libc/manual/html_node/Renaming-Files.html diff --git a/core/src/main/java/hudson/util/spring/BeanBuilder.java b/core/src/main/java/hudson/util/spring/BeanBuilder.java index 38482703fdc96b717673bfb59cf25b897e11e5ad..9c8b9485c5ee1c9a6d9e0c1b89ca8cc1a4c3377c 100644 --- a/core/src/main/java/hudson/util/spring/BeanBuilder.java +++ b/core/src/main/java/hudson/util/spring/BeanBuilder.java @@ -147,7 +147,7 @@ public class BeanBuilder extends GroovyObjectSupport { } /** - * Retrieves the RuntimeSpringConfiguration instance used the the BeanBuilder + * Retrieves the RuntimeSpringConfiguration instance used by the BeanBuilder * @return The RuntimeSpringConfiguration instance */ public RuntimeSpringConfiguration getSpringConfig() { @@ -198,7 +198,7 @@ public class BeanBuilder extends GroovyObjectSupport { /** * This class is used to defer the adding of a property to a bean definition until later * This is for a case where you assign a property to a list that may not contain bean references at - * that point of asignment, but may later hence it would need to be managed + * that point of assignment, but may later hence it would need to be managed * * @author Graeme Rocher */ diff --git a/core/src/main/java/hudson/util/spring/RuntimeSpringConfiguration.java b/core/src/main/java/hudson/util/spring/RuntimeSpringConfiguration.java index f97f14346600a1857185fe792eebb0a660bb86ce..e17bd0662cfc7406b8c5eccbe1310025428b1669 100644 --- a/core/src/main/java/hudson/util/spring/RuntimeSpringConfiguration.java +++ b/core/src/main/java/hudson/util/spring/RuntimeSpringConfiguration.java @@ -171,7 +171,7 @@ interface RuntimeSpringConfiguration extends ServletContextAware { BeanConfiguration getBeanConfig(String name); /** - * Creates and returns the BeanDefinition that is regsitered within the given name or returns null + * Creates and returns the BeanDefinition that is registered within the given name or returns null * * @param name The name of the bean definition * @return A BeanDefinition diff --git a/core/src/main/java/hudson/views/BuildButtonColumn.java b/core/src/main/java/hudson/views/BuildButtonColumn.java index 3f7cbbc7d3f93f70ca83d125233fe5aa095a4e34..f0aa4436cfc6265cca83644f45b25b4420f5d1e3 100644 --- a/core/src/main/java/hudson/views/BuildButtonColumn.java +++ b/core/src/main/java/hudson/views/BuildButtonColumn.java @@ -24,6 +24,7 @@ package hudson.views; import hudson.Extension; +import hudson.model.AbstractItem; import org.jenkinsci.Symbol; import org.kohsuke.stapler.DataBoundConstructor; @@ -32,6 +33,13 @@ public class BuildButtonColumn extends ListViewColumn { public BuildButtonColumn() { } + public String taskNoun(Object job) { + if (job instanceof AbstractItem) { + return ((AbstractItem) job).getTaskNoun(); + } + return hudson.model.Messages.AbstractItem_TaskNoun(); + } + @Extension(ordinal=DEFAULT_COLUMNS_ORDINAL_ACTIONS_START-1) @Symbol("buildButton") public static class DescriptorImpl extends ListViewColumnDescriptor { @Override diff --git a/core/src/main/java/hudson/views/ListViewColumn.java b/core/src/main/java/hudson/views/ListViewColumn.java index b5b4b62f9f442de7edde156e38b466158a35143c..fe1a62823a5cf5b397a2bb7197087bdd1bb6fe46 100644 --- a/core/src/main/java/hudson/views/ListViewColumn.java +++ b/core/src/main/java/hudson/views/ListViewColumn.java @@ -29,6 +29,7 @@ import hudson.ExtensionPoint; import hudson.model.Describable; import hudson.model.Descriptor; import hudson.model.Descriptor.FormException; +import hudson.model.DescriptorVisibilityFilter; import jenkins.model.Jenkins; import hudson.model.Item; import hudson.model.ItemGroup; @@ -53,7 +54,7 @@ import net.sf.json.JSONObject; * the <td> tag. * *

      - * This object may have an additional columHeader.jelly. The default ColmnHeader + * This object may have an additional columnHeader.jelly. The default ColumnHeader * will render {@link #getColumnCaption()}. * *

      @@ -121,20 +122,50 @@ public abstract class ListViewColumn implements ExtensionPoint, Describable createDefaultInitialColumnList() { + return createDefaultInitialColumnList(ListViewColumn.all()); + } + + /** + * Creates the list of {@link ListViewColumn}s to be used for newly created {@link ListView}s and their likes. + * + * @see ListView#initColumns() + * @since 2.37 + */ + public static List createDefaultInitialColumnList(Class context) { + return createDefaultInitialColumnList(DescriptorVisibilityFilter.applyType(context, ListViewColumn.all())); + } + + /** + * Creates the list of {@link ListViewColumn}s to be used for a {@link ListView}s and their likes. + * + * @see View#getColumns() + * @since 2.37 + */ + public static List createDefaultInitialColumnList(View view) { + return createDefaultInitialColumnList(DescriptorVisibilityFilter.apply(view, ListViewColumn.all())); + } + + private static List createDefaultInitialColumnList(List> descriptors) { // OK, set up default list of columns: // create all instances ArrayList r = new ArrayList(); final JSONObject emptyJSON = new JSONObject(); - for (Descriptor d : ListViewColumn.all()) + for (Descriptor d : descriptors) try { if (d instanceof ListViewColumnDescriptor) { ListViewColumnDescriptor ld = (ListViewColumnDescriptor) d; - if (!ld.shownByDefault()) continue; // skip this + if (!ld.shownByDefault()) { + continue; // skip this + } } ListViewColumn lvc = d.newInstance(null, emptyJSON); - if (!lvc.shownByDefault()) continue; // skip this + if (!lvc.shownByDefault()) { + continue; // skip this + } r.add(lvc); } catch (FormException e) { diff --git a/core/src/main/java/hudson/views/MyViewsTabBar.java b/core/src/main/java/hudson/views/MyViewsTabBar.java index c166c71e7d24c38a913485e7746243234c0d2c3c..1d2fe44db1fc2e0b080759dabba478d4b88220d6 100644 --- a/core/src/main/java/hudson/views/MyViewsTabBar.java +++ b/core/src/main/java/hudson/views/MyViewsTabBar.java @@ -28,11 +28,19 @@ import hudson.Extension; import hudson.ExtensionPoint; import hudson.model.AbstractDescribableImpl; import hudson.model.Descriptor; +import hudson.model.View; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import javax.annotation.Nonnull; import jenkins.model.GlobalConfiguration; import jenkins.model.Jenkins; import hudson.model.MyViewsProperty; import net.sf.json.JSONObject; import org.jenkinsci.Symbol; +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.NoExternalUse; import org.kohsuke.stapler.StaplerRequest; /** @@ -63,6 +71,27 @@ public abstract class MyViewsTabBar extends AbstractDescribableImpl sort(@Nonnull List views) { + List result = new ArrayList<>(views); + Collections.sort(result, new Comparator() { + @Override + public int compare(View o1, View o2) { + return o1.getDisplayName().compareTo(o2.getDisplayName()); + } + }); + return result; + } + /** * Configures {@link ViewsTabBar} in the system configuration. * diff --git a/core/src/main/java/hudson/views/ViewsTabBar.java b/core/src/main/java/hudson/views/ViewsTabBar.java index 579f110ce5a3b2a04accd6051c4b2c2f212b4e53..2b638b5d8a57d369ddd58c3c7b24a09517deea69 100644 --- a/core/src/main/java/hudson/views/ViewsTabBar.java +++ b/core/src/main/java/hudson/views/ViewsTabBar.java @@ -29,11 +29,19 @@ import hudson.ExtensionPoint; import hudson.model.AbstractDescribableImpl; import hudson.model.Descriptor; import hudson.model.Descriptor.FormException; +import hudson.model.View; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import javax.annotation.Nonnull; import jenkins.model.GlobalConfiguration; import jenkins.model.Jenkins; import hudson.model.ListView; import net.sf.json.JSONObject; import org.jenkinsci.Symbol; +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.NoExternalUse; import org.kohsuke.stapler.StaplerRequest; /** @@ -65,6 +73,27 @@ public abstract class ViewsTabBar extends AbstractDescribableImpl i return (ViewsTabBarDescriptor)super.getDescriptor(); } + /** + * Sorts the views by {@link View#getDisplayName()}. + * + * @param views the views. + * @return the sorted views + * @since 2.37 + */ + @Nonnull + @Restricted(NoExternalUse.class) + @SuppressWarnings("unused") // invoked from stapler view + public List sort(@Nonnull List views) { + List result = new ArrayList(views); + Collections.sort(result, new Comparator() { + @Override + public int compare(View o1, View o2) { + return o1.getDisplayName().compareTo(o2.getDisplayName()); + } + }); + return result; + } + /** * Configures {@link ViewsTabBar} in the system configuration. * diff --git a/core/src/main/java/hudson/widgets/BuildHistoryWidget.java b/core/src/main/java/hudson/widgets/BuildHistoryWidget.java index c93d66b435d7e0eae5ed6bdff8c7676272f01d28..efd81da9d1fc6a5afdc52287de472130517ef2c1 100644 --- a/core/src/main/java/hudson/widgets/BuildHistoryWidget.java +++ b/core/src/main/java/hudson/widgets/BuildHistoryWidget.java @@ -77,6 +77,6 @@ public class BuildHistoryWidget extends HistoryWidget { historyPageFilter.add(baseList, getQueuedItems()); historyPageFilter.widget = this; - return historyPageFilter; + return updateFirstTransientBuildKey(historyPageFilter); } } diff --git a/core/src/main/java/hudson/widgets/HistoryWidget.java b/core/src/main/java/hudson/widgets/HistoryWidget.java index 4a502b29b098d883f1a23cb8d64376803dbefc0f..e82e78ad75b25b31bcca01ad1e6259ed2dab0db0 100644 --- a/core/src/main/java/hudson/widgets/HistoryWidget.java +++ b/core/src/main/java/hudson/widgets/HistoryWidget.java @@ -114,6 +114,20 @@ public class HistoryWidget extends Widget { return firstTransientBuildKey; } + /** + * Calculates the first transient build record. Everything >= this will be discarded when AJAX call is made. + * + * @param historyPageFilter + * The history page filter containing the list of builds. + * @return + * The history page filter that was passed in. + */ + @SuppressWarnings("unchecked") + protected HistoryPageFilter updateFirstTransientBuildKey(HistoryPageFilter historyPageFilter) { + updateFirstTransientBuildKey(historyPageFilter.runs); + return historyPageFilter; + } + private Iterable> updateFirstTransientBuildKey(Iterable> source) { String key=null; for (HistoryPageEntry t : source) { @@ -166,7 +180,7 @@ public class HistoryWidget extends Widget { historyPageFilter.add(baseList); historyPageFilter.widget = this; - return historyPageFilter; + return updateFirstTransientBuildKey(historyPageFilter); } protected HistoryPageFilter newPageFilter() { @@ -238,7 +252,6 @@ public class HistoryWidget extends Widget { } HistoryPageFilter page = getHistoryPageFilter(); - updateFirstTransientBuildKey(page.runs); req.getView(page,"ajaxBuildHistory.jelly").forward(req,rsp); } diff --git a/core/src/main/java/jenkins/CLI.java b/core/src/main/java/jenkins/CLI.java new file mode 100644 index 0000000000000000000000000000000000000000..970e59dc62db197646b2080c8aa91d0531ccd2af --- /dev/null +++ b/core/src/main/java/jenkins/CLI.java @@ -0,0 +1,17 @@ +package jenkins; + +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.NoExternalUse; + +/** + * Kill switch to disable the entire Jenkins CLI system. + * + * Marked as no external use because the CLI subsystem is nearing EOL. + * + * @author Kohsuke Kawaguchi + */ +@Restricted(NoExternalUse.class) +public class CLI { + // non-final to allow setting from $JENKINS_HOME/init.groovy.d + public static boolean DISABLED = Boolean.getBoolean(CLI.class.getName()+".disabled"); +} diff --git a/core/src/main/java/jenkins/I18n.java b/core/src/main/java/jenkins/I18n.java index d0f36ae3a4def86aaac25cfb6a906608c3f49ce4..35722c4941faacd72268d62a289d91dac0d75ef0 100644 --- a/core/src/main/java/jenkins/I18n.java +++ b/core/src/main/java/jenkins/I18n.java @@ -93,7 +93,18 @@ public class I18n implements RootAction { String language = request.getParameter("language"); String country = request.getParameter("country"); String variant = request.getParameter("variant"); - + // https://www.w3.org/International/questions/qa-lang-priorities + // in case we have regions/countries in the language query parameter + if (language != null) { + String[] languageTokens = language.split("-|_"); + language = languageTokens[0]; + if (country == null && languageTokens.length > 1) { + country = languageTokens[1]; + if (variant == null && languageTokens.length > 2) { + variant = languageTokens[2]; + } + } + } try { Locale locale = request.getLocale(); diff --git a/core/src/main/java/jenkins/MissingDependencyException.java b/core/src/main/java/jenkins/MissingDependencyException.java index c1b25673ef63e3ba4581db3ebec8a91553d218e6..efd36b84071025dc5cf27002b756fba64527d80f 100644 --- a/core/src/main/java/jenkins/MissingDependencyException.java +++ b/core/src/main/java/jenkins/MissingDependencyException.java @@ -34,7 +34,7 @@ import hudson.Util; * Exception thrown if plugin resolution fails due to missing dependencies * * @author Carlos Sanchez - * @since TODO + * @since 2.4 * */ public class MissingDependencyException extends IOException { diff --git a/core/src/main/java/jenkins/PluginSubtypeMarker.java b/core/src/main/java/jenkins/PluginSubtypeMarker.java index d8e127f3ceefbd5887084367dce9c340e96d2e8d..a161595120a93a08573d1d1b0f4bd78fc0fa50f2 100644 --- a/core/src/main/java/jenkins/PluginSubtypeMarker.java +++ b/core/src/main/java/jenkins/PluginSubtypeMarker.java @@ -23,6 +23,7 @@ */ package jenkins; +import hudson.Functions; import hudson.Plugin; import org.kohsuke.MetaInfServices; @@ -69,9 +70,7 @@ public class PluginSubtypeMarker extends AbstractProcessor { try { write(e); } catch (IOException x) { - StringWriter sw = new StringWriter(); - x.printStackTrace(new PrintWriter(sw)); - processingEnv.getMessager().printMessage(Kind.ERROR,sw.toString(),e); + processingEnv.getMessager().printMessage(Kind.ERROR, Functions.printThrowable(x), e); } } } @@ -111,11 +110,8 @@ public class PluginSubtypeMarker extends AbstractProcessor { private void write(TypeElement c) throws IOException { FileObject f = processingEnv.getFiler().createResource(StandardLocation.CLASS_OUTPUT, "", "META-INF/services/hudson.Plugin"); - Writer w = new OutputStreamWriter(f.openOutputStream(),"UTF-8"); - try { + try (Writer w = new OutputStreamWriter(f.openOutputStream(), "UTF-8")) { w.write(c.getQualifiedName().toString()); - } finally { - w.close(); } } diff --git a/core/src/main/java/jenkins/SoloFilePathFilter.java b/core/src/main/java/jenkins/SoloFilePathFilter.java index 989728458231393097e29780157ce661032afc45..ce135759824434df1e830e7c44556649c2060075 100644 --- a/core/src/main/java/jenkins/SoloFilePathFilter.java +++ b/core/src/main/java/jenkins/SoloFilePathFilter.java @@ -28,7 +28,7 @@ public final class SoloFilePathFilter extends FilePathFilter { private boolean noFalse(String op, File f, boolean b) { if (!b) - throw new SecurityException("agent may not " + op + " " + f+"\nSee http://jenkins-ci.org/security-144 for more details"); + throw new SecurityException("agent may not " + op + " " + f+"\nSee https://jenkins.io/redirect/security-144 for more details"); return true; } diff --git a/core/src/main/java/jenkins/diagnosis/HsErrPidList.java b/core/src/main/java/jenkins/diagnosis/HsErrPidList.java index 64b1d93d78d36da5020a1d30d56e048f6be03c0b..f11090a4b4d88d19cb550a863978108ceee07ff7 100644 --- a/core/src/main/java/jenkins/diagnosis/HsErrPidList.java +++ b/core/src/main/java/jenkins/diagnosis/HsErrPidList.java @@ -49,14 +49,8 @@ public class HsErrPidList extends AdministrativeMonitor { return; } try { - FileChannel ch = null; - try { - ch = new FileInputStream(getSecretKeyFile()).getChannel(); + try (FileChannel ch = new FileInputStream(getSecretKeyFile()).getChannel()) { map = ch.map(MapMode.READ_ONLY,0,1); - } finally { - if (ch != null) { - ch.close(); - } } scan("./hs_err_pid%p.log"); diff --git a/core/src/main/java/jenkins/diagnostics/CompletedInitializationMonitor.java b/core/src/main/java/jenkins/diagnostics/CompletedInitializationMonitor.java new file mode 100644 index 0000000000000000000000000000000000000000..84803aa006ca2af0c4335fa604e56dace04ef772 --- /dev/null +++ b/core/src/main/java/jenkins/diagnostics/CompletedInitializationMonitor.java @@ -0,0 +1,56 @@ +/* + * The MIT License + * + * Copyright (c) 2016, CloudBees, Inc. + * + * 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.diagnostics; + +import hudson.Extension; +import hudson.init.InitMilestone; +import hudson.model.AdministrativeMonitor; +import jenkins.model.Jenkins; +import org.jenkinsci.Symbol; +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.NoExternalUse; + +/** + * Performs monitoring of {@link Jenkins} {@link InitMilestone} status. + * + * @author Oleg Nenashev + * @since 2.21 + */ +@Restricted(NoExternalUse.class) +@Extension @Symbol("completedInitialization") +public class CompletedInitializationMonitor extends AdministrativeMonitor { + + @Override + public String getDisplayName() { + return Messages.CompletedInitializationMonitor_DisplayName(); + } + + @Override + public boolean isActivated() { + final Jenkins instance = Jenkins.getInstance(); + // Safe to check in such way, because monitors are being checked in UI only. + // So Jenkins class construction and initialization must be always finished by the call of this extension. + return instance.getInitLevel() != InitMilestone.COMPLETED; + } +} diff --git a/core/src/main/java/jenkins/diagnostics/SecurityIsOffMonitor.java b/core/src/main/java/jenkins/diagnostics/SecurityIsOffMonitor.java index b31e065a706d59fbf2ecf3a969ce7876d9465509..ec2d1b1c0970d3f24975f2268d38c24a877174d8 100644 --- a/core/src/main/java/jenkins/diagnostics/SecurityIsOffMonitor.java +++ b/core/src/main/java/jenkins/diagnostics/SecurityIsOffMonitor.java @@ -6,6 +6,7 @@ import jenkins.model.Jenkins; import org.jenkinsci.Symbol; import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerResponse; +import org.kohsuke.stapler.interceptor.RequirePOST; import java.io.IOException; @@ -20,6 +21,12 @@ import java.io.IOException; */ @Extension @Symbol("securityIsOff") public class SecurityIsOffMonitor extends AdministrativeMonitor { + + @Override + public String getDisplayName() { + return Messages.SecurityIsOffMonitor_DisplayName(); + } + @Override public boolean isActivated() { return !Jenkins.getInstance().isUseSecurity(); @@ -28,6 +35,7 @@ public class SecurityIsOffMonitor extends AdministrativeMonitor { /** * Depending on whether the user said "yes" or "no", send him to the right place. */ + @RequirePOST public void doAct(StaplerRequest req, StaplerResponse rsp) throws IOException { if(req.hasParameter("no")) { disable(true); diff --git a/core/src/main/java/jenkins/diagnostics/URICheckEncodingMonitor.java b/core/src/main/java/jenkins/diagnostics/URICheckEncodingMonitor.java new file mode 100644 index 0000000000000000000000000000000000000000..8b171de6eb58ec931a6036683e59eb1cebf44d5e --- /dev/null +++ b/core/src/main/java/jenkins/diagnostics/URICheckEncodingMonitor.java @@ -0,0 +1,42 @@ +package jenkins.diagnostics; + +import hudson.Extension; +import hudson.model.*; +import hudson.util.FormValidation; +import jenkins.model.Jenkins; +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.NoExternalUse; +import org.kohsuke.stapler.StaplerRequest; + +import java.io.IOException; + +import static hudson.Util.fixEmpty; + +@Restricted(NoExternalUse.class) +@Extension +public class URICheckEncodingMonitor extends AdministrativeMonitor { + + public boolean isCheckEnabled() { + return !"ISO-8859-1".equalsIgnoreCase(System.getProperty("file.encoding")); + } + + @Override + public boolean isActivated() { + return true; + } + + @Override + public String getDisplayName() { + return Messages.URICheckEncodingMonitor_DisplayName(); + } + + public FormValidation doCheckURIEncoding(StaplerRequest request) throws IOException { + Jenkins.getInstance().checkPermission(Jenkins.ADMINISTER); + // expected is non-ASCII String + final String expected = "\u57f7\u4e8b"; + final String value = fixEmpty(request.getParameter("value")); + if (!expected.equals(value)) + return FormValidation.warningWithMarkup(hudson.model.Messages.Hudson_NotUsesUTF8ToDecodeURL()); + return FormValidation.ok(); + } +} diff --git a/core/src/main/java/jenkins/install/InstallState.java b/core/src/main/java/jenkins/install/InstallState.java index 622a552c078c9fb66affb3f09b3b9842a3253575..71790d3c5483012c7f959afdd3c5a8f166943d31 100644 --- a/core/src/main/java/jenkins/install/InstallState.java +++ b/core/src/main/java/jenkins/install/InstallState.java @@ -52,7 +52,7 @@ public class InstallState implements ExtensionPoint { public static final InstallState UNKNOWN = new InstallState("UNKNOWN", true); /** - * After any setup / restart / etc. hooks are done, states hould be running + * After any setup / restart / etc. hooks are done, states should be running */ @Extension public static final InstallState RUNNING = new InstallState("RUNNING", true); @@ -151,7 +151,7 @@ public class InstallState implements ExtensionPoint { public static final InstallState TEST = new InstallState("TEST", true); /** - * Jenkins started in development mode: Bolean.getBoolean("hudson.Main.development"). + * Jenkins started in development mode: Boolean.getBoolean("hudson.Main.development"). * Can be run normally with the -Djenkins.install.runSetupWizard=true */ public static final InstallState DEVELOPMENT = new InstallState("DEVELOPMENT", true); diff --git a/core/src/main/java/jenkins/install/InstallUtil.java b/core/src/main/java/jenkins/install/InstallUtil.java index 97ebfff9f0355ede0de97a31f0ff17028cb4d0e0..9f2a150f9158f5f815526f02f86901ed17198d33 100644 --- a/core/src/main/java/jenkins/install/InstallUtil.java +++ b/core/src/main/java/jenkins/install/InstallUtil.java @@ -40,6 +40,7 @@ import javax.annotation.Nonnull; import javax.inject.Provider; import org.apache.commons.io.FileUtils; +import org.apache.commons.lang.StringUtils; import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.restrictions.NoExternalUse; @@ -69,6 +70,7 @@ public class InstallUtil { // tests need this to be 1.0 private static final VersionNumber NEW_INSTALL_VERSION = new VersionNumber("1.0"); + private static final VersionNumber FORCE_NEW_INSTALL_VERSION = new VersionNumber("0.0"); /** * Simple chain pattern using iterator.next() @@ -89,7 +91,7 @@ public class InstallUtil { */ public static void proceedToNextStateFrom(InstallState prior) { InstallState next = getNextInstallState(prior); - if (Main.isDevelopmentMode) LOGGER.info("Install state tranisitioning from: " + prior + " to: " + next); + if (Main.isDevelopmentMode) LOGGER.info("Install state transitioning from: " + prior + " to: " + next); if (next != null) { Jenkins.getInstance().setInstallState(next); } @@ -166,7 +168,7 @@ public class InstallUtil { // Neither the top level config or the lastExecVersionFile have a version // stored in them, which means it's a new install. - if (lastRunVersion.compareTo(NEW_INSTALL_VERSION) == 0) { + if (FORCE_NEW_INSTALL_VERSION.equals(lastRunVersion) || lastRunVersion.compareTo(NEW_INSTALL_VERSION) == 0) { Jenkins j = Jenkins.getInstance(); // Allow for skipping @@ -181,11 +183,13 @@ public class InstallUtil { } } - // Edge case: used Jenkins 1 but did not save the system config page, - // the version is not persisted and returns 1.0, so try to check if - // they actually did anything - if (!j.getItemMap().isEmpty() || !j.getNodes().isEmpty()) { - return InstallState.UPGRADE; + if (!FORCE_NEW_INSTALL_VERSION.equals(lastRunVersion)) { + // Edge case: used Jenkins 1 but did not save the system config page, + // the version is not persisted and returns 1.0, so try to check if + // they actually did anything + if (!j.getItemMap().isEmpty() || !j.getNodes().isEmpty()) { + return InstallState.UPGRADE; + } } return InstallState.INITIAL_SECURITY_SETUP; @@ -227,7 +231,13 @@ public class InstallUtil { File lastExecVersionFile = getLastExecVersionFile(); if (lastExecVersionFile.exists()) { try { - return FileUtils.readFileToString(lastExecVersionFile); + String version = FileUtils.readFileToString(lastExecVersionFile); + // JENKINS-37438 blank will force the setup + // wizard regardless of current state of the system + if (StringUtils.isBlank(version)) { + return FORCE_NEW_INSTALL_VERSION.toString(); + } + return version; } catch (IOException e) { LOGGER.log(SEVERE, "Unexpected Error. Unable to read " + lastExecVersionFile.getAbsolutePath(), e); LOGGER.log(WARNING, "Unable to determine the last running version (see error above). Treating this as a restart. No plugins will be updated."); diff --git a/core/src/main/java/jenkins/install/SetupWizard.java b/core/src/main/java/jenkins/install/SetupWizard.java index 9d91e686d4490ae39d088feec371304adb75d033..35cff955f0006ff99d2855af0503603a502822f3 100644 --- a/core/src/main/java/jenkins/install/SetupWizard.java +++ b/core/src/main/java/jenkins/install/SetupWizard.java @@ -20,6 +20,7 @@ import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import javax.servlet.http.HttpServletResponse; +import jenkins.util.SystemProperties; import org.acegisecurity.Authentication; import org.acegisecurity.context.SecurityContextHolder; import org.acegisecurity.providers.UsernamePasswordAuthenticationToken; @@ -117,9 +118,9 @@ public class SetupWizard extends PageDecorator { authStrategy.setAllowAnonymousRead(false); jenkins.setAuthorizationStrategy(authStrategy); - // Shut down all the ports we can by default: - jenkins.setSlaveAgentPort(-1); // -1 to disable - + // Disable jnlp by default, but honor system properties + jenkins.setSlaveAgentPort(SystemProperties.getInteger(Jenkins.class.getName()+".slaveAgentPort",-1)); + // require a crumb issuer jenkins.setCrumbIssuer(new DefaultCrumbIssuer(false)); @@ -309,6 +310,19 @@ public class SetupWizard extends PageDecorator { return HttpResponses.okJSON(); } + /** + * Returns whether the system needs a restart, and if it is supported + * e.g. { restartRequired: true, restartSupported: false } + */ + @Restricted(DoNotUse.class) // WebOnly + public HttpResponse doRestartStatus() throws IOException { + JSONObject response = new JSONObject(); + Jenkins jenkins = Jenkins.getInstance(); + response.put("restartRequired", jenkins.getUpdateCenter().isRestartRequiredForCompletion()); + response.put("restartSupported", jenkins.getLifecycle().canRestart()); + return HttpResponses.okJSON(response); + } + /** * Provides the list of platform plugin updates from the last time * the upgrade was run. @@ -325,7 +339,7 @@ public class SetupWizard extends PageDecorator { /** * Gets the suggested plugin list from the update sites, falling back to a local version - * @return JSON array with the categorized plugon list + * @return JSON array with the categorized plugin list */ @CheckForNull /*package*/ JSONArray getPlatformPluginList() { diff --git a/core/src/main/java/jenkins/management/AdministrativeMonitorsConfiguration.java b/core/src/main/java/jenkins/management/AdministrativeMonitorsConfiguration.java new file mode 100644 index 0000000000000000000000000000000000000000..390d5a3eecd48cd71648a2cbf971b74f0262ffa2 --- /dev/null +++ b/core/src/main/java/jenkins/management/AdministrativeMonitorsConfiguration.java @@ -0,0 +1,56 @@ +/* + * The MIT License + * + * Copyright (c) 2016, CloudBees, Inc. + * + * 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.management; + +import hudson.Extension; +import hudson.model.AdministrativeMonitor; +import jenkins.model.GlobalConfiguration; +import net.sf.json.JSONObject; +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.NoExternalUse; +import org.kohsuke.stapler.StaplerRequest; + +import java.io.IOException; +import java.util.logging.Level; +import java.util.logging.Logger; + +@Extension +@Restricted(NoExternalUse.class) +public class AdministrativeMonitorsConfiguration extends GlobalConfiguration { + @Override + public boolean configure(StaplerRequest req, JSONObject json) throws FormException { + for (AdministrativeMonitor am : AdministrativeMonitor.all()) { + try { + boolean disable = !json.getJSONArray("administrativeMonitor").contains(am.id); + am.disable(disable); + } catch (IOException e) { + LOGGER.log(Level.WARNING, "Failed to process form submission for " + am.id, e); + } + } + return true; + } + + private static Logger LOGGER = Logger.getLogger(AdministrativeMonitorsConfiguration.class.getName()); +} diff --git a/core/src/main/java/jenkins/management/AdministrativeMonitorsDecorator.java b/core/src/main/java/jenkins/management/AdministrativeMonitorsDecorator.java new file mode 100644 index 0000000000000000000000000000000000000000..ff8ea3efa6ac58cb3341ebe545114d43caab7c03 --- /dev/null +++ b/core/src/main/java/jenkins/management/AdministrativeMonitorsDecorator.java @@ -0,0 +1,148 @@ +/* + * The MIT License + * + * Copyright (c) 2016, Daniel Beck, CloudBees, Inc. + * + * 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.management; + +import hudson.Extension; +import hudson.Functions; +import hudson.diagnosis.ReverseProxySetupMonitor; +import hudson.model.AdministrativeMonitor; +import hudson.model.PageDecorator; +import hudson.util.HttpResponses; +import hudson.util.HudsonIsLoading; +import hudson.util.HudsonIsRestarting; +import jenkins.diagnostics.URICheckEncodingMonitor; +import jenkins.model.Jenkins; +import net.sf.json.JSON; +import net.sf.json.JSONObject; +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.NoExternalUse; +import org.kohsuke.stapler.Ancestor; +import org.kohsuke.stapler.HttpResponse; +import org.kohsuke.stapler.Stapler; +import org.kohsuke.stapler.StaplerRequest; + +import javax.servlet.ServletException; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +/** + * Show a notification and popup for active administrative monitors on all pages. + */ +@Extension +@Restricted(NoExternalUse.class) +public class AdministrativeMonitorsDecorator extends PageDecorator { + private final Collection ignoredJenkinsRestOfUrls = new ArrayList<>(); + + public AdministrativeMonitorsDecorator() { + // redundant + ignoredJenkinsRestOfUrls.add("manage"); + + // otherwise this would be added to every internal context menu building request + ignoredJenkinsRestOfUrls.add("contextMenu"); + + // don't show here to allow admins to disable malfunctioning monitors via AdministrativeMonitorsDecorator + ignoredJenkinsRestOfUrls.add("configure"); + } + + @Override + public String getDisplayName() { + return Messages.AdministrativeMonitorsDecorator_DisplayName(); + } + + public int getActiveAdministrativeMonitorsCount() { + return getActiveAdministrativeMonitors().size(); + } + + public Collection getActiveAdministrativeMonitors() { + Collection active = new ArrayList<>(); + Collection ams = new ArrayList<>(Jenkins.getInstance().administrativeMonitors); + for (AdministrativeMonitor am : ams) { + if (am instanceof ReverseProxySetupMonitor) { + // TODO make reverse proxy monitor work when shown on any URL + continue; + } + if (am instanceof URICheckEncodingMonitor) { + // TODO make URI encoding monitor work when shown on any URL + continue; + } + if (am.isEnabled() && am.isActivated()) { + active.add(am); + } + } + return active; + } + + /** + * Whether the administrative monitors notifier should be shown. + * @return true iff the administrative monitors notifier should be shown. + * @throws IOException + * @throws ServletException + */ + public boolean shouldDisplay() throws IOException, ServletException { + if (!Functions.hasPermission(Jenkins.ADMINISTER)) { + return false; + } + + StaplerRequest req = Stapler.getCurrentRequest(); + + if (req == null) { + return false; + } + List ancestors = req.getAncestors(); + + if (ancestors == null || ancestors.size() == 0) { + // ??? + return false; + } + + Ancestor a = ancestors.get(ancestors.size() - 1); + Object o = a.getObject(); + + // don't show while Jenkins is loading + if (o instanceof HudsonIsLoading) { + return false; + } + // … or restarting + if (o instanceof HudsonIsRestarting) { + return false; + } + + // don't show for some URLs served directly by Jenkins + if (o instanceof Jenkins) { + String url = a.getRestOfUrl(); + + if (ignoredJenkinsRestOfUrls.contains(url)) { + return false; + } + } + + if (getActiveAdministrativeMonitorsCount() == 0) { + return false; + } + + return true; + } +} \ No newline at end of file diff --git a/core/src/main/java/jenkins/management/AsynchronousAdministrativeMonitor.java b/core/src/main/java/jenkins/management/AsynchronousAdministrativeMonitor.java index 50d4e6cbebd205c6c30b58cc16d6ea41e586f0f5..4e621ab53b248697033f5f94d7351eb96aeec365 100644 --- a/core/src/main/java/jenkins/management/AsynchronousAdministrativeMonitor.java +++ b/core/src/main/java/jenkins/management/AsynchronousAdministrativeMonitor.java @@ -1,6 +1,7 @@ package jenkins.management; import hudson.AbortException; +import hudson.Functions; import hudson.console.AnnotatedLargeText; import hudson.model.AdministrativeMonitor; import hudson.model.TaskListener; @@ -125,7 +126,7 @@ public abstract class AsynchronousAdministrativeMonitor extends AdministrativeMo } catch (AbortException e) { listener.error(e.getMessage()); } catch (Throwable e) { - e.printStackTrace(listener.error(getName() + " failed")); + Functions.printStackTrace(e, listener.error(getName() + " failed")); LOGGER.log(Level.WARNING, getName() + " failed", e); } } diff --git a/core/src/main/java/jenkins/management/ReloadLink.java b/core/src/main/java/jenkins/management/ReloadLink.java index 9159788379eaa942ce6526f92372bcdc67e8b92a..59fabb8ba1bf49ba25a9b5dd52dbb5b0244e0a4c 100644 --- a/core/src/main/java/jenkins/management/ReloadLink.java +++ b/core/src/main/java/jenkins/management/ReloadLink.java @@ -56,5 +56,9 @@ public class ReloadLink extends ManagementLink { @Override public boolean getRequiresConfirmation() { return true; } - + + @Override + public boolean getRequiresPOST() { + return true; + } } diff --git a/core/src/main/java/jenkins/model/CauseOfInterruption.java b/core/src/main/java/jenkins/model/CauseOfInterruption.java index 81dd16111d882ee4b997dd7ac8e07a61cd81ffcd..7a8c173f212198258c2327347490a1c2a8229636 100644 --- a/core/src/main/java/jenkins/model/CauseOfInterruption.java +++ b/core/src/main/java/jenkins/model/CauseOfInterruption.java @@ -33,6 +33,7 @@ import org.kohsuke.stapler.export.ExportedBean; import java.io.Serializable; import java.util.Collections; import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; /** * Records why an {@linkplain Executor#interrupt() executor is interrupted}. @@ -74,18 +75,46 @@ public abstract class CauseOfInterruption implements Serializable { * Indicates that the build was interrupted from UI. */ public static final class UserInterruption extends CauseOfInterruption { + + @Nonnull private final String user; - public UserInterruption(User user) { + public UserInterruption(@Nonnull User user) { this.user = user.getId(); } - public UserInterruption(String userId) { + public UserInterruption(@Nonnull String userId) { this.user = userId; } - @CheckForNull + /** + * Gets ID of the user, who interrupted the build. + * @return User ID + * @since 2.31 + */ + @Nonnull + public String getUserId() { + return user; + } + + /** + * Gets user, who caused the interruption. + * @return User instance if it can be located. + * Result of {@link User#getUnknown()} otherwise + */ + @Nonnull public User getUser() { + final User userInstance = getUserOrNull(); + return userInstance != null ? userInstance : User.getUnknown(); + } + + /** + * Gets user, who caused the interruption. + * @return User or {@code null} if it has not been found + * @since 2.31 + */ + @CheckForNull + public User getUserOrNull() { return User.get(user, false, Collections.emptyMap()); } diff --git a/core/src/main/java/jenkins/model/DownloadSettings.java b/core/src/main/java/jenkins/model/DownloadSettings.java index 81688c220b5f8e5118ab0abf563c2229da88d286..e4c78c2ef3fe1cc54270b6b55caa895733745052 100644 --- a/core/src/main/java/jenkins/model/DownloadSettings.java +++ b/core/src/main/java/jenkins/model/DownloadSettings.java @@ -36,13 +36,11 @@ import hudson.util.FormValidation; import java.io.IOException; import java.util.logging.Level; import java.util.logging.Logger; -import net.sf.json.JSONObject; import org.acegisecurity.AccessDeniedException; import org.jenkinsci.Symbol; import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.restrictions.NoExternalUse; import org.kohsuke.stapler.HttpResponse; -import org.kohsuke.stapler.StaplerRequest; /** * Lets user configure how metadata files should be downloaded. @@ -63,11 +61,6 @@ public final class DownloadSettings extends GlobalConfiguration { load(); } - @Override public boolean configure(StaplerRequest req, JSONObject json) throws FormException { - req.bindJSON(this, json); - return true; - } - public boolean isUseBrowser() { return useBrowser; } @@ -145,6 +138,11 @@ public final class DownloadSettings extends GlobalConfiguration { @Extension public static final class Warning extends AdministrativeMonitor { + @Override + public String getDisplayName() { + return Messages.DownloadSettings_Warning_DisplayName(); + } + @Override public boolean isActivated() { return DownloadSettings.get().isUseBrowser(); } diff --git a/core/src/main/java/jenkins/model/GlobalConfiguration.java b/core/src/main/java/jenkins/model/GlobalConfiguration.java index 31c8e08ff3c6c09c7b7547dbfb5661bf8a2a35c3..f751404bed11274f520ea1037a00775b0d763f1c 100644 --- a/core/src/main/java/jenkins/model/GlobalConfiguration.java +++ b/core/src/main/java/jenkins/model/GlobalConfiguration.java @@ -4,6 +4,8 @@ import hudson.ExtensionList; import hudson.ExtensionPoint; import hudson.model.Describable; import hudson.model.Descriptor; +import net.sf.json.JSONObject; +import org.kohsuke.stapler.StaplerRequest; /** * Convenient base class for extensions that contributes to the system configuration page but nothing @@ -12,8 +14,8 @@ import hudson.model.Descriptor; *

      * All {@link Descriptor}s are capable of contributing fragment to the system config page. If you are * implementing other extension points that need to expose some global configuration, you can do so - * with global.groovy or global.jelly from your {@link Descriptor} instance. However - * each global.* file will appear as its own section in the global configuration page. + * with {@code global.groovy} or {@code global.jelly} from your {@link Descriptor} instance. However + * each {@code global.*} file will appear as its own section in the global configuration page. * *

      * An option to present a single section for your plugin in the Jenkins global configuration page is @@ -21,14 +23,20 @@ import hudson.model.Descriptor; * properties defined in your GlobalConfiguration subclass, here are two possibilities: *

      • @{@link javax.inject.Inject} into your other {@link hudson.Extension}s (so this does not work * for classes not annotated with {@link hudson.Extension})
      • - *
      • access it via a call to GlobalConfiguration.all().get(<your GlobalConfiguration subclass>.class) - *
      + *
    1. access it via a call to {@code GlobalConfiguration.all().get(.class)}
    2. + * + *

      + * While an implementation might store its actual configuration data in various ways, + * meaning {@link #configure(StaplerRequest, JSONObject)} must be overridden, + * in the normal case you would simply define persistable fields with getters and setters. + * The {@code config} view would use data-bound controls like {@code f:entry}. + * Then make sure your constructor calls {@link #load} and your setters call {@link #save}. * *

      Views

      *

      - * Subtypes of this class should define a config.groovy file or config.jelly file + * Subtypes of this class should define a {@code config.groovy} file or {@code config.jelly} file * that gets pulled into the system configuration page. - * + * Typically its contents should be wrapped in an {@code f:section}. * * @author Kohsuke Kawaguchi * @since 1.425 @@ -47,6 +55,17 @@ public abstract class GlobalConfiguration extends Descriptor{@inheritDoc} + */ + @Override + public boolean configure(StaplerRequest req, JSONObject json) throws FormException { + req.bindJSON(this, json); + return true; + } + /** * Returns all the registered {@link GlobalConfiguration} descriptors. */ diff --git a/core/src/main/java/jenkins/model/InterruptedBuildAction.java b/core/src/main/java/jenkins/model/InterruptedBuildAction.java index b5f9c6b6f5654f8f05a96daa352f23a7e2cad3f8..c734d58bbb3033bc587e2bddaebe01fff450fbd7 100644 --- a/core/src/main/java/jenkins/model/InterruptedBuildAction.java +++ b/core/src/main/java/jenkins/model/InterruptedBuildAction.java @@ -43,7 +43,7 @@ public class InterruptedBuildAction extends InvisibleAction { private final List causes; public InterruptedBuildAction(Collection causes) { - this.causes = ImmutableList.copyOf(causes); + this.causes = ImmutableList.copyOf(causes); } @Exported diff --git a/core/src/main/java/jenkins/model/Jenkins.java b/core/src/main/java/jenkins/model/Jenkins.java index 83e31848940418641e2a02396f9d790561fa8595..1378ee603f8dfbc8379be48ef0c7ba059e3cd9ca 100644 --- a/core/src/main/java/jenkins/model/Jenkins.java +++ b/core/src/main/java/jenkins/model/Jenkins.java @@ -30,33 +30,14 @@ import antlr.ANTLRException; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Lists; +import com.google.inject.Inject; import com.google.inject.Injector; import com.thoughtworks.xstream.XStream; -import hudson.BulkChange; -import hudson.DNSMultiCast; -import hudson.DescriptorExtensionList; -import hudson.Extension; -import hudson.ExtensionComponent; -import hudson.ExtensionFinder; -import hudson.ExtensionList; -import hudson.ExtensionPoint; -import hudson.FilePath; -import hudson.Functions; -import hudson.Launcher; +import hudson.*; import hudson.Launcher.LocalLauncher; -import hudson.Lookup; -import hudson.Main; -import hudson.Plugin; -import hudson.PluginManager; -import hudson.PluginWrapper; -import hudson.ProxyConfiguration; import jenkins.AgentProtocol; +import jenkins.diagnostics.URICheckEncodingMonitor; import jenkins.util.SystemProperties; -import hudson.TcpSlaveAgentListener; -import hudson.UDPBroadcastThread; -import hudson.Util; -import hudson.WebAppMain; -import hudson.XmlFile; import hudson.cli.declarative.CLIMethod; import hudson.cli.declarative.CLIResolver; import hudson.init.InitMilestone; @@ -137,7 +118,6 @@ import hudson.security.AccessControlled; import hudson.security.AuthorizationStrategy; import hudson.security.BasicAuthenticationFilter; import hudson.security.FederatedLoginService; -import hudson.security.FullControlOnceLoggedInAuthorizationStrategy; import hudson.security.HudsonFilter; import hudson.security.LegacyAuthorizationStrategy; import hudson.security.LegacySecurityRealm; @@ -212,6 +192,7 @@ import jenkins.slaves.WorkspaceLocator; import jenkins.util.JenkinsJVM; import jenkins.util.Timer; import jenkins.util.io.FileBoolean; +import jenkins.util.io.OnMaster; import jenkins.util.xml.XMLUtils; import net.jcip.annotations.GuardedBy; import net.sf.json.JSONObject; @@ -270,7 +251,6 @@ import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.PrintWriter; -import java.io.StringWriter; import java.net.BindException; import java.net.HttpURLConnection; import java.net.URL; @@ -323,7 +303,7 @@ import org.kohsuke.stapler.WebMethod; @ExportedBean public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLevelItemGroup, StaplerProxy, StaplerFallback, ModifiableViewGroup, AccessControlled, DescriptorByNameOwner, - ModelObjectWithContextMenu, ModelObjectWithChildren { + ModelObjectWithContextMenu, ModelObjectWithChildren, OnMaster { private transient final Queue queue; /** @@ -596,7 +576,16 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve * TCP agent port. * 0 for random, -1 to disable. */ - private int slaveAgentPort = SystemProperties.getInteger(Jenkins.class.getName()+".slaveAgentPort",0); + private int slaveAgentPort = getSlaveAgentPortInitialValue(0); + + private static int getSlaveAgentPortInitialValue(int def) { + return SystemProperties.getInteger(Jenkins.class.getName()+".slaveAgentPort", def); + } + + /** + * If -Djenkins.model.Jenkins.slaveAgentPort is defined, enforce it on every start instead of only the first one. + */ + private static final boolean SLAVE_AGENT_PORT_ENFORCE = SystemProperties.getBoolean(Jenkins.class.getName()+".slaveAgentPortEnforce", false); /** * The TCP agent protocols that are explicitly disabled (we store the disabled ones so that newer protocols @@ -606,6 +595,11 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve */ @CheckForNull private List disabledAgentProtocols; + /** + * @deprecated Just a temporary buffer for XSTream migration code from JENKINS-39465, do not use + */ + @Deprecated + private transient String[] _disabledAgentProtocols; /** * The TCP agent protocols that are {@link AgentProtocol#isOptIn()} and explicitly enabled. @@ -615,6 +609,11 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve */ @CheckForNull private List enabledAgentProtocols; + /** + * @deprecated Just a temporary buffer for XSTream migration code from JENKINS-39465, do not use + */ + @Deprecated + private transient String[] _enabledAgentProtocols; /** * The TCP agent protocols that are enabled. Built from {@link #disabledAgentProtocols} and @@ -832,7 +831,7 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve * @param pluginManager * If non-null, use existing plugin manager. create a new one. */ - @edu.umd.cs.findbugs.annotations.SuppressWarnings({ + @edu.umd.cs.findbugs.annotations.SuppressFBWarnings({ "SC_START_IN_CTOR", // bug in FindBugs. It flags UDPBroadcastThread.start() call but that's for another class "ST_WRITE_TO_STATIC_FROM_INSTANCE_METHOD" // Trigger.timer }) @@ -908,6 +907,18 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve InitMilestone.ordering() // forced ordering among key milestones ); + // Ensure we reached the final initialization state. Log the error otherwise + if (initLevel != InitMilestone.COMPLETED) { + LOGGER.log(SEVERE, "Jenkins initialization has not reached the COMPLETED initialization milestone after the startup. " + + "Current state: {0}. " + + "It may cause undefined incorrect behavior in Jenkins plugin relying on this state. " + + "It is likely an issue with the Initialization task graph. " + + "Example: usage of @Initializer(after = InitMilestone.COMPLETED) in a plugin (JENKINS-37759). " + + "Please create a bug in Jenkins bugtracker. ", + initLevel); + } + + if(KILL_AFTER_LOAD) System.exit(0); @@ -935,11 +946,25 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve updateComputerList(); - {// master is online now - Computer c = toComputer(); - if(c!=null) - for (ComputerListener cl : ComputerListener.all()) - cl.onOnline(c, new LogTaskListener(LOGGER, INFO)); + {// master is online now, it's instance must always exist + final Computer c = toComputer(); + if(c != null) { + for (ComputerListener cl : ComputerListener.all()) { + try { + cl.onOnline(c, new LogTaskListener(LOGGER, INFO)); + } catch (Throwable t) { + if (t instanceof Error) { + // We propagate Runtime errors, because they are fatal. + throw t; + } + + // Other exceptions should be logged instead of failing the Jenkins startup (See listener's Javadoc) + // We also throw it for InterruptedException since it's what is expected according to the javadoc + LOGGER.log(SEVERE, String.format("Invocation of the computer listener %s failed for the Jenkins master node", + cl.getClass()), t); + } + } + } } for (ItemListener l : ItemListener.all()) { @@ -970,6 +995,19 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve if (jdks == null) { jdks = new ArrayList<>(); } + if (SLAVE_AGENT_PORT_ENFORCE) { + slaveAgentPort = getSlaveAgentPortInitialValue(slaveAgentPort); + } + if (disabledAgentProtocols == null && _disabledAgentProtocols != null) { + disabledAgentProtocols = Arrays.asList(_disabledAgentProtocols); + _disabledAgentProtocols = null; + } + if (enabledAgentProtocols == null && _enabledAgentProtocols != null) { + enabledAgentProtocols = Arrays.asList(_enabledAgentProtocols); + _enabledAgentProtocols = null; + } + // Invalidate the protocols cache after the reload + agentProtocols = null; return this; } @@ -1079,11 +1117,26 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve return slaveAgentPort; } + /** + * @since 2.24 + */ + public boolean isSlaveAgentPortEnforced() { + return Jenkins.SLAVE_AGENT_PORT_ENFORCE; + } + /** * @param port * 0 to indicate random available TCP port. -1 to disable this service. */ public void setSlaveAgentPort(int port) throws IOException { + if (SLAVE_AGENT_PORT_ENFORCE) { + LOGGER.log(Level.WARNING, "setSlaveAgentPort({0}) call ignored because system property {1} is true", new String[] { Integer.toString(port), Jenkins.class.getName()+".slaveAgentPortEnforce" }); + } else { + forceSetSlaveAgentPort(port); + } + } + + private void forceSetSlaveAgentPort(int port) throws IOException { this.slaveAgentPort = port; launchTcpSlaveAgentListener(); } @@ -1174,16 +1227,19 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve tcpSlaveAgentListener = null; } if (slaveAgentPort != -1 && tcpSlaveAgentListener == null) { - String administrativeMonitorId = getClass().getName() + ".tcpBind"; + final String administrativeMonitorId = getClass().getName() + ".tcpBind"; try { tcpSlaveAgentListener = new TcpSlaveAgentListener(slaveAgentPort); // remove previous monitor in case of previous error - for (Iterator it = AdministrativeMonitor.all().iterator(); it.hasNext(); ) { - AdministrativeMonitor am = it.next(); + AdministrativeMonitor toBeRemoved = null; + ExtensionList all = AdministrativeMonitor.all(); + for (AdministrativeMonitor am : all) { if (administrativeMonitorId.equals(am.id)) { - it.remove(); + toBeRemoved = am; + break; } } + all.remove(toBeRemoved); } catch (BindException e) { LOGGER.log(Level.WARNING, String.format("Failed to listen to incoming agent connections through JNLP port %s. Change the JNLP port number", slaveAgentPort), e); new AdministrativeError(administrativeMonitorId, @@ -1194,6 +1250,38 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve } } + @Extension + @Restricted(NoExternalUse.class) + public static class EnforceSlaveAgentPortAdministrativeMonitor extends AdministrativeMonitor { + @Inject + Jenkins j; + + @Override + public String getDisplayName() { + return jenkins.model.Messages.EnforceSlaveAgentPortAdministrativeMonitor_displayName(); + } + + public String getSystemPropertyName() { + return Jenkins.class.getName() + ".slaveAgentPort"; + } + + public int getExpectedPort() { + int slaveAgentPort = j.slaveAgentPort; + return Jenkins.getSlaveAgentPortInitialValue(slaveAgentPort); + } + + public void doAct(StaplerRequest req, StaplerResponse rsp) throws IOException { + j.forceSetSlaveAgentPort(getExpectedPort()); + rsp.sendRedirect2(req.getContextPath() + "/manage"); + } + + @Override + public boolean isActivated() { + int slaveAgentPort = Jenkins.getInstance().slaveAgentPort; + return SLAVE_AGENT_PORT_ENFORCE && slaveAgentPort != Jenkins.getSlaveAgentPortInitialValue(slaveAgentPort); + } + } + public void setNodeName(String name) { throw new UnsupportedOperationException(); // not allowed } @@ -1349,7 +1437,7 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve /** * @deprecated - * UI method. Not meant to be used programatically. + * UI method. Not meant to be used programmatically. */ @Deprecated public ComputerSet getComputer() { @@ -1368,7 +1456,7 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve */ @SuppressWarnings({"unchecked", "rawtypes"}) // too late to fix public Descriptor getDescriptor(String id) { - // legacy descriptors that are reigstered manually doesn't show up in getExtensionList, so check them explicitly. + // legacy descriptors that are registered manually doesn't show up in getExtensionList, so check them explicitly. Iterable descriptors = Iterators.sequence(getExtensionList(Descriptor.class), DescriptorExtensionList.listLegacyInstances()); for (Descriptor d : descriptors) { if (d.getId().equals(id)) { @@ -1402,6 +1490,7 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve * If you have an instance of {@code type} and call {@link Describable#getDescriptor()}, * you'll get the same instance that this method returns. */ + @CheckForNull public Descriptor getDescriptor(Class type) { for( Descriptor d : getExtensionList(Descriptor.class) ) if(d.clazz==type) @@ -1465,11 +1554,14 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve /** * Gets the plugin object from its short name. - * - *

      * This allows URL hudson/plugin/ID to be served by the views * of the plugin class. + * @param shortName Short name of the plugin + * @return The plugin singleton or {@code null} if for some reason the plugin is not loaded. + * The fact the plugin is loaded does not mean it is enabled and fully initialized for the current Jenkins session. + * Use {@link Plugin#getWrapper()} and then {@link PluginWrapper#isActive()} to check it. */ + @CheckForNull public Plugin getPlugin(String shortName) { PluginWrapper p = pluginManager.getPlugin(shortName); if(p==null) return null; @@ -1483,12 +1575,15 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve * This allows easy storage of plugin information in the plugin singleton without * every plugin reimplementing the singleton pattern. * + * @param

      Class of the plugin * @param clazz The plugin class (beware class-loader fun, this will probably only work * from within the jpi that defines the plugin class, it may or may not work in other cases) - * - * @return The plugin instance. + * @return The plugin singleton or {@code null} if for some reason the plugin is not loaded. + * The fact the plugin is loaded does not mean it is enabled and fully initialized for the current Jenkins session. + * Use {@link Plugin#getWrapper()} and then {@link PluginWrapper#isActive()} to check it. */ @SuppressWarnings("unchecked") + @CheckForNull public

      P getPlugin(Class

      clazz) { PluginWrapper p = pluginManager.getPlugin(clazz); if(p==null) return null; @@ -1598,11 +1693,6 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve */ @Exported(name="jobs") public List getItems() { - if (authorizationStrategy instanceof AuthorizationStrategy.Unsecured || - authorizationStrategy instanceof FullControlOnceLoggedInAuthorizationStrategy) { - return new ArrayList(items.values()); - } - List viewableItems = new ArrayList(); for (TopLevelItem item : items.values()) { if (item.hasPermission(Item.READ)) @@ -1642,6 +1732,16 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve return Items.getAllItems(this, type); } + /** + * Gets all the {@link Item}s unordered, lazily and recursively in the {@link ItemGroup} tree + * and filter them by the given type. + * + * @since 2.37 + */ + public Iterable allItems(Class type) { + return Items.allItems(this, type); + } + /** * Gets all the items recursively. * @@ -1651,6 +1751,15 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve return getAllItems(Item.class); } + /** + * Gets all the items unordered, lazily and recursively. + * + * @since 2.37 + */ + public Iterable allItems() { + return allItems(Item.class); + } + /** * Gets a list of simple top-level projects. * @deprecated This method will ignore Maven and matrix projects, as well as projects inside containers such as folders. @@ -1670,8 +1779,9 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve */ public Collection getJobNames() { List names = new ArrayList(); - for (Job j : getAllItems(Job.class)) + for (Job j : allItems(Job.class)) names.add(j.getFullName()); + Collections.sort(names, String.CASE_INSENSITIVE_ORDER); return names; } @@ -2130,27 +2240,35 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve @Override public SearchIndexBuilder makeSearchIndex() { - return super.makeSearchIndex() - .add("configure", "config","configure") - .add("manage") - .add("log") - .add(new CollectionSearchIndex() { - protected SearchItem get(String key) { return getItemByFullName(key, TopLevelItem.class); } - protected Collection all() { return getAllItems(TopLevelItem.class); } - }) - .add(getPrimaryView().makeSearchIndex()) - .add(new CollectionSearchIndex() {// for computers - protected Computer get(String key) { return getComputer(key); } - protected Collection all() { return computers.values(); } - }) - .add(new CollectionSearchIndex() {// for users - protected User get(String key) { return User.get(key,false); } - protected Collection all() { return User.getAll(); } - }) - .add(new CollectionSearchIndex() {// for views - protected View get(String key) { return getView(key); } - protected Collection all() { return views; } - }); + SearchIndexBuilder builder = super.makeSearchIndex(); + if (hasPermission(ADMINISTER)) { + builder.add("configure", "config", "configure") + .add("manage") + .add("log"); + } + builder.add(new CollectionSearchIndex() { + protected SearchItem get(String key) { return getItemByFullName(key, TopLevelItem.class); } + protected Collection all() { return getAllItems(TopLevelItem.class); } + @Nonnull + @Override + protected Iterable allAsIterable() { + return allItems(TopLevelItem.class); + } + }) + .add(getPrimaryView().makeSearchIndex()) + .add(new CollectionSearchIndex() {// for computers + protected Computer get(String key) { return getComputer(key); } + protected Collection all() { return computers.values(); } + }) + .add(new CollectionSearchIndex() {// for users + protected User get(String key) { return User.get(key,false); } + protected Collection all() { return User.getAll(); } + }) + .add(new CollectionSearchIndex() {// for views + protected View get(String key) { return getView(key); } + protected Collection all() { return viewGroupMixIn.getViews(); } + }); + return builder; } public String getUrlChildPrefix() { @@ -2224,7 +2342,7 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve // Almost everyone else except Nginx put the host and port in separate headers buf.append(host); } else { - // Nginx uses the same spec as for the Host header, i.e. hostanme:port + // Nginx uses the same spec as for the Host header, i.e. hostname:port buf.append(host.substring(0, index)); if (index + 1 < host.length()) { try { @@ -2747,11 +2865,11 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve /** * Gets the user of the given name. * - * @return the user of the given name (which may or may not be an id), if that person exists or the invoker {@link #hasPermission} on {@link #ADMINISTER}; else null + * @return the user of the given name (which may or may not be an id), if that person exists; else null * @see User#get(String,boolean), {@link User#getById(String, boolean)} */ public @CheckForNull User getUser(String name) { - return User.get(name,hasPermission(ADMINISTER)); + return User.get(name, User.ALLOW_USER_CREATION_VIA_URL && hasPermission(ADMINISTER)); } public synchronized TopLevelItem createProject( TopLevelItemDescriptor type, String name ) throws IOException { @@ -2933,7 +3051,7 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve }); for (final File subdir : subdirs) { - g.requires(loadJenkins).attains(JOB_LOADED).notFatal().add("Loading job "+subdir.getName(),new Executable() { + g.requires(loadJenkins).attains(JOB_LOADED).notFatal().add("Loading item " + subdir.getName(), new Executable() { public void run(Reactor session) throws Exception { if(!Items.getConfigFile(subdir).exists()) { //Does not have job config file, so it is not a jenkins job hence skip it @@ -2946,7 +3064,7 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve }); } - g.requires(JOB_LOADED).add("Cleaning up old builds",new Executable() { + g.requires(JOB_LOADED).add("Cleaning up obsolete items deleted from the disk", new Executable() { public void run(Reactor reactor) throws Exception { // anything we didn't load from disk, throw them away. // doing this after loading from disk allows newly loaded items @@ -2975,11 +3093,12 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve // initialize views by inserting the default view if necessary // this is both for clean Jenkins and for backward compatibility. if(views.size()==0 || primaryView==null) { - View v = new AllView(Messages.Hudson_ViewName()); + View v = new AllView(AllView.DEFAULT_VIEW_NAME); setViewOwner(v); views.add(0,v); primaryView = v.getViewName(); } + primaryView = AllView.migrateLegacyPrimaryAllViewLocalizedName(views, primaryView); if (useSecurity!=null && !useSecurity) { // forced reset to the unsecure mode. @@ -3031,7 +3150,7 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve /** * Called to shut down the system. */ - @edu.umd.cs.findbugs.annotations.SuppressWarnings("ST_WRITE_TO_STATIC_FROM_INSTANCE_METHOD") + @edu.umd.cs.findbugs.annotations.SuppressFBWarnings("ST_WRITE_TO_STATIC_FROM_INSTANCE_METHOD") public void cleanUp() { if (theInstance != this && theInstance != null) { LOGGER.log(Level.WARNING, "This instance is no longer the singleton, ignoring cleanUp()"); @@ -3656,9 +3775,7 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve try { r.put(e.getKey(), e.getValue().get(endTime-System.currentTimeMillis(), TimeUnit.MILLISECONDS)); } catch (Exception x) { - StringWriter sw = new StringWriter(); - x.printStackTrace(new PrintWriter(sw,true)); - r.put(e.getKey(), Collections.singletonMap("Failed to retrieve thread dump",sw.toString())); + r.put(e.getKey(), Collections.singletonMap("Failed to retrieve thread dump", Functions.printThrowable(x))); } } return Collections.unmodifiableSortedMap(new TreeMap>(r)); @@ -3770,7 +3887,7 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve String from = req.getParameter("from"); if(from!=null && from.startsWith("/") && !from.equals("/loginError")) { - rsp.sendRedirect2(from); // I'm bit uncomfortable letting users redircted to other sites, make sure the URL falls into this domain + rsp.sendRedirect2(from); // I'm bit uncomfortable letting users redirected to other sites, make sure the URL falls into this domain return; } @@ -3839,6 +3956,18 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve public void reload() throws IOException, InterruptedException, ReactorException { queue.save(); executeReactor(null, loadTasks()); + + // Ensure we reached the final initialization state. Log the error otherwise + if (initLevel != InitMilestone.COMPLETED) { + LOGGER.log(SEVERE, "Jenkins initialization has not reached the COMPLETED initialization milestone after the configuration reload. " + + "Current state: {0}. " + + "It may cause undefined incorrect behavior in Jenkins plugin relying on this state. " + + "It is likely an issue with the Initialization task graph. " + + "Example: usage of @Initializer(after = InitMilestone.COMPLETED) in a plugin (JENKINS-37759). " + + "Please create a bug in Jenkins bugtracker.", + initLevel); + } + User.reload(); queue.load(); servletContext.setAttribute("app", this); @@ -3864,7 +3993,7 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve /** * For debugging. Expose URL to perform GC. */ - @edu.umd.cs.findbugs.annotations.SuppressWarnings("DM_GC") + @edu.umd.cs.findbugs.annotations.SuppressFBWarnings("DM_GC") @RequirePOST public void doGc(StaplerResponse rsp) throws IOException { checkPermission(Jenkins.ADMINISTER); @@ -4072,9 +4201,9 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve if (rsp!=null) { rsp.setStatus(HttpServletResponse.SC_OK); rsp.setContentType("text/plain"); - PrintWriter w = rsp.getWriter(); - w.println("Shutting down"); - w.close(); + try (PrintWriter w = rsp.getWriter()) { + w.println("Shutting down"); + } } System.exit(0); @@ -4219,6 +4348,7 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve @RequirePOST public void doFingerprintCleanup(StaplerResponse rsp) throws IOException { + checkPermission(ADMINISTER); FingerprintCleanupThread.invoke(); rsp.setStatus(HttpServletResponse.SC_OK); rsp.setContentType("text/plain"); @@ -4227,6 +4357,7 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve @RequirePOST public void doWorkspaceCleanup(StaplerResponse rsp) throws IOException { + checkPermission(ADMINISTER); WorkspaceCleanupThread.invoke(); rsp.setStatus(HttpServletResponse.SC_OK); rsp.setContentType("text/plain"); @@ -4331,20 +4462,21 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve * Checks if container uses UTF-8 to decode URLs. See * http://wiki.jenkins-ci.org/display/JENKINS/Tomcat#Tomcat-i18n */ + @Restricted(NoExternalUse.class) + @RestrictedSince("2.37") + @Deprecated public FormValidation doCheckURIEncoding(StaplerRequest request) throws IOException { - // expected is non-ASCII String - final String expected = "\u57f7\u4e8b"; - final String value = fixEmpty(request.getParameter("value")); - if (!expected.equals(value)) - return FormValidation.warningWithMarkup(Messages.Hudson_NotUsesUTF8ToDecodeURL()); - return FormValidation.ok(); + return ExtensionList.lookup(URICheckEncodingMonitor.class).get(0).doCheckURIEncoding(request); } /** * Does not check when system default encoding is "ISO-8859-1". */ + @Restricted(NoExternalUse.class) + @RestrictedSince("2.37") + @Deprecated public static boolean isCheckURIEncodingEnabled() { - return !"ISO-8859-1".equalsIgnoreCase(System.getProperty("file.encoding")); + return ExtensionList.lookup(URICheckEncodingMonitor.class).get(0).isCheckEnabled(); } /** @@ -4425,29 +4557,42 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve try { checkPermission(READ); } catch (AccessDeniedException e) { - String rest = Stapler.getCurrentRequest().getRestOfPath(); - for (String name : ALWAYS_READABLE_PATHS) { - if (rest.startsWith(name)) { - return this; - } - } - for (String name : getUnprotectedRootActions()) { - if (rest.startsWith("/" + name + "/") || rest.equals("/" + name)) { - return this; - } - } - - // TODO SlaveComputer.doSlaveAgentJnlp; there should be an annotation to request unprotected access - if (rest.matches("/computer/[^/]+/slave-agent[.]jnlp") - && "true".equals(Stapler.getCurrentRequest().getParameter("encrypt"))) { + if (!isSubjectToMandatoryReadPermissionCheck(Stapler.getCurrentRequest().getRestOfPath())) { return this; } - throw e; } return this; } + + /** + * Test a path to see if it is subject to mandatory read permission checks by container-managed security + * @param restOfPath the URI, excluding the Jenkins root URI and query string + * @return true if the path is subject to mandatory read permission checks + * @since 2.37 + */ + public boolean isSubjectToMandatoryReadPermissionCheck(String restOfPath) { + for (String name : ALWAYS_READABLE_PATHS) { + if (restOfPath.startsWith(name)) { + return false; + } + } + + for (String name : getUnprotectedRootActions()) { + if (restOfPath.startsWith("/" + name + "/") || restOfPath.equals("/" + name)) { + return false; + } + } + + // TODO SlaveComputer.doSlaveAgentJnlp; there should be an annotation to request unprotected access + if (restOfPath.matches("/computer/[^/]+/slave-agent[.]jnlp") + && "true".equals(Stapler.getCurrentRequest().getParameter("encrypt"))) { + return false; + } + + return true; + } /** * Gets a list of unprotected root actions. @@ -4924,8 +5069,8 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve // for backward compatibility with <1.75, recognize the tag name "view" as well. XSTREAM.alias("view", ListView.class); XSTREAM.alias("listView", ListView.class); - XSTREAM.addImplicitCollection(Jenkins.class, "disabledAgentProtocols", "disabledAgentProtocol", String.class); - XSTREAM.addImplicitCollection(Jenkins.class, "enabledAgentProtocols", "enabledAgentProtocol", String.class); + XSTREAM.addImplicitArray(Jenkins.class, "_disabledAgentProtocols", "disabledAgentProtocol"); + XSTREAM.addImplicitArray(Jenkins.class, "_enabledAgentProtocols", "enabledAgentProtocol"); XSTREAM2.addCriticalField(Jenkins.class, "securityRealm"); XSTREAM2.addCriticalField(Jenkins.class, "authorizationStrategy"); // this seems to be necessary to force registration of converter early enough diff --git a/core/src/main/java/jenkins/model/JenkinsLocationConfiguration.java b/core/src/main/java/jenkins/model/JenkinsLocationConfiguration.java index 5eaa12739739b0e2d68ab9fedc6bc91c03a63ddf..981ef9a3a665cf6ff6373c93860fc731160a5f64 100644 --- a/core/src/main/java/jenkins/model/JenkinsLocationConfiguration.java +++ b/core/src/main/java/jenkins/model/JenkinsLocationConfiguration.java @@ -5,10 +5,8 @@ import hudson.Util; import hudson.XmlFile; import hudson.util.FormValidation; import hudson.util.XStream2; -import net.sf.json.JSONObject; import org.jenkinsci.Symbol; import org.kohsuke.stapler.QueryParameter; -import org.kohsuke.stapler.StaplerRequest; import javax.mail.internet.AddressException; import javax.mail.internet.InternetAddress; @@ -147,12 +145,6 @@ public class JenkinsLocationConfiguration extends GlobalConfiguration { } } - @Override - public boolean configure(StaplerRequest req, JSONObject json) throws FormException { - req.bindJSON(this,json); - return true; - } - /** * Checks the URL in global.jelly */ diff --git a/core/src/main/java/jenkins/model/NodeListener.java b/core/src/main/java/jenkins/model/NodeListener.java index 06596e9003bdf273de238b76f6877401215b3deb..43d26922922733ddd1607bdef1ee1bd8e1e97593 100644 --- a/core/src/main/java/jenkins/model/NodeListener.java +++ b/core/src/main/java/jenkins/model/NodeListener.java @@ -36,7 +36,7 @@ import java.util.logging.Logger; * Listen to {@link Node} CRUD operations. * * @author ogondza. - * @since TODO + * @since 2.8 */ public abstract class NodeListener implements ExtensionPoint { diff --git a/core/src/main/java/jenkins/model/Nodes.java b/core/src/main/java/jenkins/model/Nodes.java index b232b370bcdef5c458732e93f8b426caae92fe31..2b1116bb86b1f802bb356f45bbe15886c74fb648 100644 --- a/core/src/main/java/jenkins/model/Nodes.java +++ b/core/src/main/java/jenkins/model/Nodes.java @@ -204,7 +204,7 @@ public class Nodes implements Saveable { * Replace node of given name. * * @return {@code true} if node was replaced. - * @since TODO + * @since 2.8 */ public boolean replaceNode(final Node oldOne, final @Nonnull Node newOne) throws IOException { if (oldOne == nodes.get(oldOne.getNodeName())) { diff --git a/core/src/main/java/jenkins/model/ParameterizedJobMixIn.java b/core/src/main/java/jenkins/model/ParameterizedJobMixIn.java index 40fa6503a804f1108102208899e7e550864a55b1..c148d1fc98adf5d98f2edfe6ddf9fdaa3e12ace0 100644 --- a/core/src/main/java/jenkins/model/ParameterizedJobMixIn.java +++ b/core/src/main/java/jenkins/model/ParameterizedJobMixIn.java @@ -269,7 +269,7 @@ public abstract class ParameterizedJobMixIn & Param /** * Allows customization of the human-readable display name to be rendered in the Build Now link. * @see #getBuildNowText - * @since TODO + * @since 1.624 */ public static final AlternativeUiTextProvider.Message BUILD_NOW_TEXT = new AlternativeUiTextProvider.Message(); @@ -278,7 +278,8 @@ public abstract class ParameterizedJobMixIn & Param * Uses {@link #BUILD_NOW_TEXT}. */ public final String getBuildNowText() { - return isParameterized() ? Messages.ParameterizedJobMixIn_build_with_parameters() : AlternativeUiTextProvider.get(BUILD_NOW_TEXT, asJob(), Messages.ParameterizedJobMixIn_build_now()); + return isParameterized() ? AlternativeUiTextProvider.get(BUILD_NOW_TEXT, asJob(), Messages.ParameterizedJobMixIn_build_with_parameters()) + : AlternativeUiTextProvider.get(BUILD_NOW_TEXT, asJob(), Messages.ParameterizedJobMixIn_build_now()); } /** diff --git a/core/src/main/java/jenkins/model/RunIdMigrator.java b/core/src/main/java/jenkins/model/RunIdMigrator.java index 5675d8ab4a24d2c9373f9e4f3b0a994f86ed7b15..eb6bc83c34c6bac9fcffaa1871badcdeeec39ca9 100644 --- a/core/src/main/java/jenkins/model/RunIdMigrator.java +++ b/core/src/main/java/jenkins/model/RunIdMigrator.java @@ -166,7 +166,7 @@ public final class RunIdMigrator { doMigrate(dir); save(dir); if (jenkinsHome != null && offeredToUnmigrate.add(jenkinsHome)) - LOGGER.log(WARNING, "Build record migration (https://wiki.jenkins-ci.org/display/JENKINS/JENKINS-24380+Migration) is one-way. If you need to downgrade Jenkins, run: {0}", getUnmigrationCommandLine(jenkinsHome)); + LOGGER.log(WARNING, "Build record migration (https://jenkins.io/redirect/build-record-migration) is one-way. If you need to downgrade Jenkins, run: {0}", getUnmigrationCommandLine(jenkinsHome)); return true; } diff --git a/core/src/main/java/jenkins/model/TransientActionFactory.java b/core/src/main/java/jenkins/model/TransientActionFactory.java index f0871920eaf6f6fc98c271999eb1b3bade581a5b..b3d0579abce06df05795256b7adba024c616d139 100644 --- a/core/src/main/java/jenkins/model/TransientActionFactory.java +++ b/core/src/main/java/jenkins/model/TransientActionFactory.java @@ -24,12 +24,22 @@ package jenkins.model; +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; +import hudson.ExtensionList; +import hudson.ExtensionListListener; import hudson.ExtensionPoint; import hudson.model.Action; import hudson.model.Actionable; import hudson.model.TopLevelItem; +import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; +import java.util.List; import javax.annotation.Nonnull; +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.NoExternalUse; /** * Allows you to add actions to any kind of object at once. @@ -48,12 +58,77 @@ public abstract class TransientActionFactory implements ExtensionPoint { */ public abstract Class type(); + /** + * A supertype of any actions this factory might produce. + * Defined so that factories which produce irrelevant actions need not be consulted by, e.g., {@link Actionable#getAction(Class)}. + * For historical reasons this defaults to {@link Action} itself. + * If your implementation was returning multiple disparate kinds of actions, it is best to split it into two factories. + *

      If an API defines a abstract {@link Action} subtype and you are providing a concrete implementation, + * you may return the API type here to delay class loading. + * @return a bound for the result of {@link #createFor} + * @since 2.34 + */ + public /* abstract */ Class actionType() { + return Action.class; + } + /** * Creates actions for a given object. * This may be called frequently for the same object, so if your implementation is expensive, do your own caching. * @param target an actionable object - * @return a possible empty set of actions + * @return a possible empty set of actions (typically either using {@link Collections#emptySet} or {@link Collections#singleton}) */ public abstract @Nonnull Collection createFor(@Nonnull T target); + /** @see no pairs/tuples in Java */ + private static class CacheKey { + private final Class type; + private final Class actionType; + CacheKey(Class type, Class actionType) { + this.type = type; + this.actionType = actionType; + } + @Override + public boolean equals(Object obj) { + return obj instanceof CacheKey && type == ((CacheKey) obj).type && actionType == ((CacheKey) obj).actionType; + } + @Override + public int hashCode() { + return type.hashCode() ^ actionType.hashCode(); + } + } + @SuppressWarnings("rawtypes") + private static final LoadingCache, LoadingCache>>> cache = + CacheBuilder.newBuilder().weakKeys().build(new CacheLoader, LoadingCache>>>() { + @Override + public LoadingCache>> load(final ExtensionList allFactories) throws Exception { + final LoadingCache>> perJenkinsCache = + CacheBuilder.newBuilder().build(new CacheLoader>>() { + @Override + public List> load(CacheKey key) throws Exception { + List> factories = new ArrayList<>(); + for (TransientActionFactory taf : allFactories) { + Class actionType = taf.actionType(); + if (taf.type().isAssignableFrom(key.type) && (key.actionType.isAssignableFrom(actionType) || actionType.isAssignableFrom(key.actionType))) { + factories.add(taf); + } + } + return factories; + } + }); + allFactories.addListener(new ExtensionListListener() { + @Override + public void onChange() { + perJenkinsCache.invalidateAll(); + } + }); + return perJenkinsCache; + } + }); + + @Restricted(NoExternalUse.class) // pending a need for it outside Actionable + public static Iterable> factoriesFor(Class type, Class actionType) { + return cache.getUnchecked(ExtensionList.lookup(TransientActionFactory.class)).getUnchecked(new CacheKey(type, actionType)); + } + } diff --git a/core/src/main/java/jenkins/model/item_category/ItemCategory.java b/core/src/main/java/jenkins/model/item_category/ItemCategory.java index 6efdefd2f82e58923375478d19c1222fbfc9ae74..1f80cc82a1b44a5413da717c49e22b669d954048 100644 --- a/core/src/main/java/jenkins/model/item_category/ItemCategory.java +++ b/core/src/main/java/jenkins/model/item_category/ItemCategory.java @@ -44,7 +44,7 @@ public abstract class ItemCategory implements ExtensionPoint { * This field indicates how much non-default categories are required in * order to start showing them in Jenkins. * This field is restricted for the internal use only, because all other changes would cause binary compatibility issues. - * See JENKINS-36593 for more info. + * See JENKINS-36593 for more info. */ @Restricted(NoExternalUse.class) public static int MIN_TOSHOW = 1; diff --git a/core/src/main/java/jenkins/model/lazy/AbstractLazyLoadRunMap.java b/core/src/main/java/jenkins/model/lazy/AbstractLazyLoadRunMap.java index a36da7421bbb26118dff34086197a99294e5d1c4..60a2ae3c7921e85d120183a23b24456b00133557 100644 --- a/core/src/main/java/jenkins/model/lazy/AbstractLazyLoadRunMap.java +++ b/core/src/main/java/jenkins/model/lazy/AbstractLazyLoadRunMap.java @@ -293,7 +293,7 @@ public abstract class AbstractLazyLoadRunMap extends AbstractMap i } /** - * Checks if the the specified build exists. + * Checks if the specified build exists. * * @param number the build number to probe. * @return {@code true} if there is an run for the corresponding number, note that this does not mean that diff --git a/core/src/main/java/jenkins/model/lazy/LazyBuildMixIn.java b/core/src/main/java/jenkins/model/lazy/LazyBuildMixIn.java index 6778edf7b224d81017e996187aaf9b1b2097c4ac..bd727d5d5808635e9edb14b2684a513c450dcc4a 100644 --- a/core/src/main/java/jenkins/model/lazy/LazyBuildMixIn.java +++ b/core/src/main/java/jenkins/model/lazy/LazyBuildMixIn.java @@ -185,13 +185,11 @@ public abstract class LazyBuildMixIn & Queue.Task & builds.put(lastBuild); lastBuild.getPreviousBuild(); // JENKINS-20662: create connection to previous build return lastBuild; - } catch (InstantiationException e) { - throw new Error(e); - } catch (IllegalAccessException e) { - throw new Error(e); } catch (InvocationTargetException e) { + LOGGER.log(Level.WARNING, String.format("A new build could not be created in job %s", asJob().getFullName()), e); throw handleInvocationTargetException(e); - } catch (NoSuchMethodException e) { + } catch (ReflectiveOperationException | IllegalStateException e) { + LOGGER.log(Level.WARNING, String.format("A new build could not be created in job %s", asJob().getFullName()), e); throw new Error(e); } } diff --git a/core/src/main/java/jenkins/model/queue/CompositeCauseOfBlockage.java b/core/src/main/java/jenkins/model/queue/CompositeCauseOfBlockage.java new file mode 100644 index 0000000000000000000000000000000000000000..9cb04c3bb7d60743fdfacff93fe998af930be5dd --- /dev/null +++ b/core/src/main/java/jenkins/model/queue/CompositeCauseOfBlockage.java @@ -0,0 +1,63 @@ +/* + * The MIT License + * + * Copyright 2016 CloudBees, Inc. + * + * 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.queue; + +import hudson.model.TaskListener; +import hudson.model.queue.CauseOfBlockage; +import java.util.List; +import java.util.Map; +import java.util.TreeMap; +import org.apache.commons.lang.StringUtils; +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.NoExternalUse; + +/** + * Represents the fact that there was at least one {@link hudson.model.Queue.JobOffer} which rejected a task. + */ +@Restricted(NoExternalUse.class) +public class CompositeCauseOfBlockage extends CauseOfBlockage { + + public final Map uniqueReasons; + + public CompositeCauseOfBlockage(List delegates) { + uniqueReasons = new TreeMap<>(); + for (CauseOfBlockage delegate : delegates) { + uniqueReasons.put(delegate.getShortDescription(), delegate); + } + } + + @Override + public String getShortDescription() { + return StringUtils.join(uniqueReasons.keySet(), "; "); + } + + @Override + public void print(TaskListener listener) { + for (CauseOfBlockage delegate : uniqueReasons.values()) { + delegate.print(listener); + } + } + +} diff --git a/core/src/main/java/jenkins/mvn/GlobalMavenConfig.java b/core/src/main/java/jenkins/mvn/GlobalMavenConfig.java index c10b3db2d5e5ee34457d4a694dddeb888da0fb04..b8d0ebe4a5f0b6b7d8c9afe7ae252d68429cc734 100644 --- a/core/src/main/java/jenkins/mvn/GlobalMavenConfig.java +++ b/core/src/main/java/jenkins/mvn/GlobalMavenConfig.java @@ -4,10 +4,8 @@ import hudson.Extension; import jenkins.model.GlobalConfiguration; import jenkins.model.GlobalConfigurationCategory; import jenkins.tools.ToolConfigurationCategory; -import net.sf.json.JSONObject; import org.jenkinsci.Symbol; -import org.kohsuke.stapler.StaplerRequest; //as close as it gets to the global Maven Project configuration @Extension(ordinal = 50) @Symbol("maven") @@ -24,12 +22,6 @@ public class GlobalMavenConfig extends GlobalConfiguration { return GlobalConfigurationCategory.get(ToolConfigurationCategory.class); } - @Override - public boolean configure(StaplerRequest req, JSONObject json) throws FormException { - req.bindJSON(this, json); - return true; - } - public void setGlobalSettingsProvider(GlobalSettingsProvider globalSettingsProvider) { this.globalSettingsProvider = globalSettingsProvider; save(); diff --git a/core/src/main/java/jenkins/mvn/GlobalSettingsProvider.java b/core/src/main/java/jenkins/mvn/GlobalSettingsProvider.java index aa7285eed9695978639586c8b476e3f0b93d0baa..9fb3e6518984c3aaecd5050b00bcd686c43fb21f 100644 --- a/core/src/main/java/jenkins/mvn/GlobalSettingsProvider.java +++ b/core/src/main/java/jenkins/mvn/GlobalSettingsProvider.java @@ -24,7 +24,7 @@ public abstract class GlobalSettingsProvider extends AbstractDescribableImplnull if no settings will be provided. */ public abstract FilePath supplySettings(AbstractBuild build, TaskListener listener); diff --git a/core/src/main/java/jenkins/security/ApiTokenProperty.java b/core/src/main/java/jenkins/security/ApiTokenProperty.java index c380124e7a325caef39c5af28a71f71cc4d498ce..34fe62ebb42b7c9cf2dadbcb9d31f5531a616f0c 100644 --- a/core/src/main/java/jenkins/security/ApiTokenProperty.java +++ b/core/src/main/java/jenkins/security/ApiTokenProperty.java @@ -66,7 +66,7 @@ public class ApiTokenProperty extends UserProperty { * If enabled, shows API tokens to users with {@link Jenkins#ADMINISTER) permissions. * Disabled by default due to the security reasons. * If enabled, it restores the original Jenkins behavior (SECURITY-200). - * @since TODO + * @since 1.638 */ private static final boolean SHOW_TOKEN_TO_ADMINS = SystemProperties.getBoolean(ApiTokenProperty.class.getName() + ".showTokenToAdmins"); @@ -87,12 +87,12 @@ public class ApiTokenProperty extends UserProperty { /** * Gets the API token. - * The method performs security checks. Only the current user and SYSTEM may see it. + * The method performs security checks since 1.638. Only the current user and SYSTEM may see it. * Users with {@link Jenkins#ADMINISTER} may be allowed to do it using {@link #SHOW_TOKEN_TO_ADMINS}. * * @return API Token. Never null, but may be {@link Messages#ApiTokenProperty_ChangeToken_TokenIsHidden()} * if the user has no appropriate permissions. - * @since TODO: the method performs security checks + * @since 1.426, and since 1.638 the method performs security checks */ @Nonnull public String getApiToken() { diff --git a/core/src/main/java/jenkins/security/CryptoConfidentialKey.java b/core/src/main/java/jenkins/security/CryptoConfidentialKey.java index dd1dad9e37b96fc9018181b62702aa3217f64e55..836e71dd69a182f68f2648fcdeec007287b2c5ed 100644 --- a/core/src/main/java/jenkins/security/CryptoConfidentialKey.java +++ b/core/src/main/java/jenkins/security/CryptoConfidentialKey.java @@ -1,9 +1,15 @@ package jenkins.security; +import hudson.Main; import hudson.util.Secret; +import jenkins.model.Jenkins; +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.DoNotUse; +import org.kohsuke.accmod.restrictions.NoExternalUse; import javax.crypto.Cipher; import javax.crypto.SecretKey; +import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import java.io.IOException; import java.security.GeneralSecurityException; @@ -15,6 +21,9 @@ import java.security.GeneralSecurityException; * @since 1.498 */ public class CryptoConfidentialKey extends ConfidentialKey { + @Restricted(NoExternalUse.class) // TODO pending API + public static final int DEFAULT_IV_LENGTH = 16; + private volatile SecretKey secret; public CryptoConfidentialKey(String id) { super(id); @@ -35,7 +44,7 @@ public class CryptoConfidentialKey extends ConfidentialKey { store(payload); } // Due to the stupid US export restriction JDK only ships 128bit version. - secret = new SecretKeySpec(payload,0,128/8, ALGORITHM); + secret = new SecretKeySpec(payload,0,128/8, KEY_ALGORITHM); } } } @@ -47,10 +56,12 @@ public class CryptoConfidentialKey extends ConfidentialKey { /** * Returns a {@link Cipher} object for encrypting with this key. + * @deprecated use {@link #encrypt(byte[])} */ + @Deprecated public Cipher encrypt() { try { - Cipher cipher = Secret.getCipher(ALGORITHM); + Cipher cipher = Secret.getCipher(KEY_ALGORITHM); cipher.init(Cipher.ENCRYPT_MODE, getKey()); return cipher; } catch (GeneralSecurityException e) { @@ -58,12 +69,68 @@ public class CryptoConfidentialKey extends ConfidentialKey { } } + /** + * Returns a {@link Cipher} object for encrypting with this key using the provided initialization vector. + * @param iv the initialization vector + * @return the cipher + */ + @Restricted(NoExternalUse.class) // TODO pending API + public Cipher encrypt(byte[] iv) { + try { + Cipher cipher = Secret.getCipher(ALGORITHM); + cipher.init(Cipher.ENCRYPT_MODE, getKey(), new IvParameterSpec(iv)); + return cipher; + } catch (GeneralSecurityException e) { + throw new AssertionError(e); + } + } + + /** + * Returns a {@link Cipher} object for decrypting with this key using the provided initialization vector. + * @param iv the initialization vector + * @return the cipher + */ + @Restricted(NoExternalUse.class) // TODO pending ApI + public Cipher decrypt(byte[] iv) { + try { + Cipher cipher = Secret.getCipher(ALGORITHM); + cipher.init(Cipher.DECRYPT_MODE, getKey(), new IvParameterSpec(iv)); + return cipher; + } catch (GeneralSecurityException e) { + throw new AssertionError(e); + } + } + + /** + * Generates a new Initialization Vector. + * @param length the length of the salt + * @return some random bytes + * @see #encrypt(byte[]) + */ + @Restricted(NoExternalUse.class) // TODO pending API + public byte[] newIv(int length) { + return ConfidentialStore.get().randomBytes(length); + } + + /** + * Generates a new Initialization Vector of default length. + * @return some random bytes + * @see #newIv(int) + * @see #encrypt(byte[]) + */ + @Restricted(NoExternalUse.class) // TODO pending API + public byte[] newIv() { + return newIv(DEFAULT_IV_LENGTH); + } + /** * Returns a {@link Cipher} object for decrypting with this key. + * @deprecated use {@link #decrypt(byte[])} */ + @Deprecated public Cipher decrypt() { try { - Cipher cipher = Secret.getCipher(ALGORITHM); + Cipher cipher = Secret.getCipher(KEY_ALGORITHM); cipher.init(Cipher.DECRYPT_MODE, getKey()); return cipher; } catch (GeneralSecurityException e) { @@ -72,5 +139,18 @@ public class CryptoConfidentialKey extends ConfidentialKey { } - private static final String ALGORITHM = "AES"; + private static final String KEY_ALGORITHM = "AES"; + private static final String ALGORITHM = "AES/CBC/PKCS5Padding"; + + /** + * Reset the internal secret key for testing. + */ + @Restricted(NoExternalUse.class) + public void resetForTest() { + if (Main.isUnitTest) { + this.secret = null; + } else { + throw new IllegalStateException("Only for testing"); + } + } } diff --git a/core/src/main/java/jenkins/security/ImpersonatingExecutorService.java b/core/src/main/java/jenkins/security/ImpersonatingExecutorService.java new file mode 100644 index 0000000000000000000000000000000000000000..a4a3c0de44e1720863a1fa1a55b42bf60c5ec37e --- /dev/null +++ b/core/src/main/java/jenkins/security/ImpersonatingExecutorService.java @@ -0,0 +1,77 @@ +/* + * The MIT License + * + * Copyright 2017 CloudBees, Inc. + * + * 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.security; + +import hudson.security.ACL; +import hudson.security.ACLContext; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutorService; +import jenkins.util.InterceptingExecutorService; +import org.acegisecurity.Authentication; + +/** + * Uses {@link ACL#impersonate(Authentication)} for all tasks. + * @see SecurityContextExecutorService + * @since 2.51 + */ +public final class ImpersonatingExecutorService extends InterceptingExecutorService { + + private final Authentication authentication; + + /** + * Creates a wrapper service. + * @param base the base service + * @param authentication for example {@link ACL#SYSTEM} + */ + public ImpersonatingExecutorService(ExecutorService base, Authentication authentication) { + super(base); + this.authentication = authentication; + } + + @Override + protected Runnable wrap(final Runnable r) { + return new Runnable() { + @Override + public void run() { + try (ACLContext ctxt = ACL.as(authentication)) { + r.run(); + } + } + }; + } + + @Override + protected Callable wrap(final Callable r) { + return new Callable() { + @Override + public V call() throws Exception { + try (ACLContext ctxt = ACL.as(authentication)) { + return r.call(); + } + } + }; + } + +} diff --git a/core/src/main/java/jenkins/security/ImpersonatingScheduledExecutorService.java b/core/src/main/java/jenkins/security/ImpersonatingScheduledExecutorService.java new file mode 100644 index 0000000000000000000000000000000000000000..8bb31c24301d54f929072261269abdd773d332a2 --- /dev/null +++ b/core/src/main/java/jenkins/security/ImpersonatingScheduledExecutorService.java @@ -0,0 +1,76 @@ +/* + * The MIT License + * + * Copyright 2017 CloudBees, Inc. + * + * 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.security; + +import hudson.security.ACL; +import hudson.security.ACLContext; +import java.util.concurrent.Callable; +import java.util.concurrent.ScheduledExecutorService; +import jenkins.util.InterceptingScheduledExecutorService; +import org.acegisecurity.Authentication; + +/** + * Variant of {@link ImpersonatingExecutorService} for scheduled services. + * @since 2.51 + */ +public final class ImpersonatingScheduledExecutorService extends InterceptingScheduledExecutorService { + + private final Authentication authentication; + + /** + * Creates a wrapper service. + * @param base the base service + * @param authentication for example {@link ACL#SYSTEM} + */ + public ImpersonatingScheduledExecutorService(ScheduledExecutorService base, Authentication authentication) { + super(base); + this.authentication = authentication; + } + + @Override + protected Runnable wrap(final Runnable r) { + return new Runnable() { + @Override + public void run() { + try (ACLContext ctxt = ACL.as(authentication)) { + r.run(); + } + } + }; + } + + @Override + protected Callable wrap(final Callable r) { + return new Callable() { + @Override + public V call() throws Exception { + try (ACLContext ctxt = ACL.as(authentication)) { + return r.call(); + } + } + }; + } + +} diff --git a/core/src/main/java/jenkins/security/QueueItemAuthenticatorConfiguration.java b/core/src/main/java/jenkins/security/QueueItemAuthenticatorConfiguration.java index dfa8f95f6313aa0229ed6a8368fb0c2dc7250e65..03f609f16360b65c15326fdf78c7e5babe8cbbd4 100644 --- a/core/src/main/java/jenkins/security/QueueItemAuthenticatorConfiguration.java +++ b/core/src/main/java/jenkins/security/QueueItemAuthenticatorConfiguration.java @@ -1,6 +1,5 @@ package jenkins.security; -import edu.umd.cs.findbugs.annotations.NonNull; import hudson.Extension; import hudson.util.DescribableList; import jenkins.model.GlobalConfiguration; @@ -10,6 +9,7 @@ import net.sf.json.JSONObject; import org.jenkinsci.Symbol; import org.kohsuke.stapler.StaplerRequest; +import javax.annotation.Nonnull; import java.io.IOException; import java.util.List; @@ -59,7 +59,7 @@ public class QueueItemAuthenticatorConfiguration extends GlobalConfiguration { @Extension(ordinal = 100) public static class ProviderImpl extends QueueItemAuthenticatorProvider { - @NonNull + @Nonnull @Override public List getAuthenticators() { return get().getAuthenticators(); diff --git a/core/src/main/java/jenkins/security/QueueItemAuthenticatorProvider.java b/core/src/main/java/jenkins/security/QueueItemAuthenticatorProvider.java index 2b6529ddeaa0073cc95f222d65c94ff86c58e8d3..dbdca64a1a96d430508b95e560d23d14c5750cf0 100644 --- a/core/src/main/java/jenkins/security/QueueItemAuthenticatorProvider.java +++ b/core/src/main/java/jenkins/security/QueueItemAuthenticatorProvider.java @@ -1,13 +1,11 @@ package jenkins.security; -import edu.umd.cs.findbugs.annotations.NonNull; import hudson.Extension; import hudson.ExtensionList; import hudson.ExtensionPoint; -import jenkins.model.Jenkins; +import javax.annotation.Nonnull; import java.util.ArrayList; -import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.NoSuchElementException; @@ -21,7 +19,7 @@ import java.util.NoSuchElementException; */ public abstract class QueueItemAuthenticatorProvider implements ExtensionPoint { - @NonNull + @Nonnull public abstract List getAuthenticators(); public static Iterable authenticators() { diff --git a/core/src/main/java/jenkins/security/RekeySecretAdminMonitor.java b/core/src/main/java/jenkins/security/RekeySecretAdminMonitor.java index 7b48e94a0c371ed69c3b68a548de24c7e613d74c..3f16cb31712a9081605788a0e9ad9acc6c5e6253 100644 --- a/core/src/main/java/jenkins/security/RekeySecretAdminMonitor.java +++ b/core/src/main/java/jenkins/security/RekeySecretAdminMonitor.java @@ -1,6 +1,8 @@ package jenkins.security; import hudson.Extension; +import hudson.Util; +import hudson.Functions; import hudson.init.InitMilestone; import hudson.init.Initializer; import hudson.model.TaskListener; @@ -12,7 +14,6 @@ import jenkins.model.Jenkins; import jenkins.util.io.FileBoolean; import org.jenkinsci.Symbol; import org.kohsuke.stapler.HttpResponse; -import org.kohsuke.stapler.StaplerProxy; import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.interceptor.RequirePOST; @@ -30,7 +31,7 @@ import java.util.logging.Logger; * @author Kohsuke Kawaguchi */ @Extension @Symbol("rekeySecret") -public class RekeySecretAdminMonitor extends AsynchronousAdministrativeMonitor implements StaplerProxy { +public class RekeySecretAdminMonitor extends AsynchronousAdministrativeMonitor { /** * Whether we detected a need to run the rewrite program. @@ -52,6 +53,7 @@ public class RekeySecretAdminMonitor extends AsynchronousAdministrativeMonitor i */ private final FileBoolean scanOnBoot = state("scanOnBoot"); + @SuppressWarnings("OverridableMethodCallInConstructor") // should have been final public RekeySecretAdminMonitor() throws IOException { // if JENKINS_HOME existed <1.497, we need to offer rewrite // this computation needs to be done and the value be captured, @@ -61,14 +63,7 @@ public class RekeySecretAdminMonitor extends AsynchronousAdministrativeMonitor i if (j.isUpgradedFromBefore(new VersionNumber("1.496.*")) && new FileBoolean(new File(j.getRootDir(),"secret.key.not-so-secret")).isOff()) needed.on(); - } - - /** - * Requires ADMINISTER permission for any operation in here. - */ - public Object getTarget() { - Jenkins.getInstance().checkPermission(Jenkins.ADMINISTER); - return this; + Util.deleteRecursive(new File(getBaseDir(), "backups")); // SECURITY-376: no longer used } @Override @@ -141,7 +136,7 @@ public class RekeySecretAdminMonitor extends AsynchronousAdministrativeMonitor i protected void fix(TaskListener listener) throws Exception { LOGGER.info("Initiating a re-keying of secrets. See "+getLogFile()); - SecretRewriter rewriter = new SecretRewriter(new File(getBaseDir(),"backups")); + SecretRewriter rewriter = new SecretRewriter(); try { PrintStream log = listener.getLogger(); @@ -152,7 +147,7 @@ public class RekeySecretAdminMonitor extends AsynchronousAdministrativeMonitor i LOGGER.info("Secret re-keying completed"); } catch (Exception e) { LOGGER.log(Level.SEVERE, "Fatal failure in re-keying secrets",e); - e.printStackTrace(listener.error("Fatal failure in rewriting secrets")); + Functions.printStackTrace(e, listener.error("Fatal failure in rewriting secrets")); } } diff --git a/core/src/main/java/jenkins/security/UpdateSiteWarningsConfiguration.java b/core/src/main/java/jenkins/security/UpdateSiteWarningsConfiguration.java new file mode 100644 index 0000000000000000000000000000000000000000..a8295d8b75ef187189e086b5f0eda5cb06ac0f51 --- /dev/null +++ b/core/src/main/java/jenkins/security/UpdateSiteWarningsConfiguration.java @@ -0,0 +1,124 @@ +/* + * The MIT License + * + * Copyright (c) 2016, CloudBees, Inc. + * + * 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.security; + +import hudson.Extension; +import hudson.PluginWrapper; +import hudson.model.UpdateSite; +import jenkins.model.GlobalConfiguration; +import jenkins.model.GlobalConfigurationCategory; +import jenkins.model.Jenkins; +import net.sf.json.JSONObject; +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.NoExternalUse; +import org.kohsuke.stapler.StaplerRequest; + +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; + +/** + * Configuration for update site-provided warnings. + * + * @see UpdateSiteWarningsMonitor + * + * @since 2.40 + */ +@Extension +@Restricted(NoExternalUse.class) +public class UpdateSiteWarningsConfiguration extends GlobalConfiguration { + + private HashSet ignoredWarnings = new HashSet<>(); + + @Override + public GlobalConfigurationCategory getCategory() { + return GlobalConfigurationCategory.get(GlobalConfigurationCategory.Security.class); + } + + public UpdateSiteWarningsConfiguration() { + load(); + } + + @Nonnull + public Set getIgnoredWarnings() { + return Collections.unmodifiableSet(ignoredWarnings); + } + + public boolean isIgnored(@Nonnull UpdateSite.Warning warning) { + return ignoredWarnings.contains(warning.id); + } + + @CheckForNull + public PluginWrapper getPlugin(@Nonnull UpdateSite.Warning warning) { + if (warning.type != UpdateSite.Warning.Type.PLUGIN) { + return null; + } + return Jenkins.getInstance().getPluginManager().getPlugin(warning.component); + } + + @Nonnull + public Set getAllWarnings() { + HashSet allWarnings = new HashSet<>(); + + for (UpdateSite site : Jenkins.getInstance().getUpdateCenter().getSites()) { + UpdateSite.Data data = site.getData(); + if (data != null) { + allWarnings.addAll(data.getWarnings()); + } + } + return allWarnings; + } + + @Nonnull + public Set getApplicableWarnings() { + Set allWarnings = getAllWarnings(); + + HashSet applicableWarnings = new HashSet<>(); + for (UpdateSite.Warning warning: allWarnings) { + if (warning.isRelevant()) { + applicableWarnings.add(warning); + } + } + + return Collections.unmodifiableSet(applicableWarnings); + } + + + @Override + public boolean configure(StaplerRequest req, JSONObject json) throws FormException { + HashSet newIgnoredWarnings = new HashSet<>(); + for (Object key : json.keySet()) { + String warningKey = key.toString(); + if (!json.getBoolean(warningKey)) { + newIgnoredWarnings.add(warningKey); + } + } + this.ignoredWarnings = newIgnoredWarnings; + this.save(); + return true; + } +} diff --git a/core/src/main/java/jenkins/security/UpdateSiteWarningsMonitor.java b/core/src/main/java/jenkins/security/UpdateSiteWarningsMonitor.java new file mode 100644 index 0000000000000000000000000000000000000000..b91b18c613d25a2e01f29eace6bd9253dff3324e --- /dev/null +++ b/core/src/main/java/jenkins/security/UpdateSiteWarningsMonitor.java @@ -0,0 +1,177 @@ +/* + * The MIT License + * + * Copyright (c) 2016, CloudBees, Inc. + * + * 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.security; + +import hudson.Extension; +import hudson.ExtensionList; +import hudson.PluginWrapper; +import hudson.model.AdministrativeMonitor; +import hudson.model.UpdateSite; +import hudson.util.HttpResponses; +import jenkins.model.Jenkins; +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.NoExternalUse; +import org.kohsuke.stapler.HttpResponse; +import org.kohsuke.stapler.QueryParameter; +import org.kohsuke.stapler.interceptor.RequirePOST; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + + +/** + * Administrative monitor showing plugin/core warnings published by the configured update site to the user. + * + *

      Terminology overview:

      + * + *
        + *
      • Applicable warnings are those relevant to currently installed components + *
      • Active warnings are those actually shown to users. + *
      • Hidden warnings are those _not_ shown to users due to them being configured to be hidden. + *
      • Inapplicable warnings are those that are not applicable. + *
      + * + *

      The following sets may be non-empty:

      + * + *
        + *
      • Intersection of applicable and active + *
      • Intersection of applicable and hidden + *
      • Intersection of hidden and inapplicable (although not really relevant) + *
      • Intersection of inapplicable and neither hidden nor active + *
      + * + *

      The following sets must necessarily be empty:

      + * + *
        + *
      • Intersection of applicable and inapplicable + *
      • Intersection of active and hidden + *
      • Intersection of active and inapplicable + *
      + * + * @since 2.40 + */ +@Extension +@Restricted(NoExternalUse.class) +public class UpdateSiteWarningsMonitor extends AdministrativeMonitor { + @Override + public boolean isActivated() { + return !getActiveCoreWarnings().isEmpty() || !getActivePluginWarningsByPlugin().isEmpty(); + } + + public List getActiveCoreWarnings() { + List CoreWarnings = new ArrayList<>(); + + for (UpdateSite.Warning warning : getActiveWarnings()) { + if (warning.type != UpdateSite.Warning.Type.CORE) { + // this is not a core warning + continue; + } + CoreWarnings.add(warning); + } + return CoreWarnings; + } + + public Map> getActivePluginWarningsByPlugin() { + Map> activePluginWarningsByPlugin = new HashMap<>(); + + for (UpdateSite.Warning warning : getActiveWarnings()) { + if (warning.type != UpdateSite.Warning.Type.PLUGIN) { + // this is not a plugin warning + continue; + } + + String pluginName = warning.component; + + PluginWrapper plugin = Jenkins.getInstance().getPluginManager().getPlugin(pluginName); + + if (!activePluginWarningsByPlugin.containsKey(plugin)) { + activePluginWarningsByPlugin.put(plugin, new ArrayList()); + } + activePluginWarningsByPlugin.get(plugin).add(warning); + } + return activePluginWarningsByPlugin; + + } + + private Set getActiveWarnings() { + ExtensionList configurations = ExtensionList.lookup(UpdateSiteWarningsConfiguration.class); + if (configurations.isEmpty()) { + return Collections.emptySet(); + } + UpdateSiteWarningsConfiguration configuration = configurations.get(0); + + HashSet activeWarnings = new HashSet<>(); + + for (UpdateSite.Warning warning : configuration.getApplicableWarnings()) { + if (!configuration.getIgnoredWarnings().contains(warning.id)) { + activeWarnings.add(warning); + } + } + + return Collections.unmodifiableSet(activeWarnings); + } + + /** + * Redirects the user to the plugin manager or security configuration + */ + @RequirePOST + public HttpResponse doForward(@QueryParameter String fix, @QueryParameter String configure) { + if (fix != null) { + return HttpResponses.redirectViaContextPath("pluginManager"); + } + if (configure != null) { + return HttpResponses.redirectViaContextPath("configureSecurity"); + } + + // shouldn't happen + return HttpResponses.redirectViaContextPath("/"); + } + + /** + * Returns true iff there are applicable but ignored (i.e. hidden) warnings. + * + * @return true iff there are applicable but ignored (i.e. hidden) warnings. + */ + public boolean hasApplicableHiddenWarnings() { + ExtensionList configurations = ExtensionList.lookup(UpdateSiteWarningsConfiguration.class); + if (configurations.isEmpty()) { + return false; + } + + UpdateSiteWarningsConfiguration configuration = configurations.get(0); + + return getActiveWarnings().size() < configuration.getApplicableWarnings().size(); + } + + @Override + public String getDisplayName() { + return Messages.UpdateSiteWarningsMonitor_DisplayName(); + } +} diff --git a/core/src/main/java/jenkins/security/UserDetailsCache.java b/core/src/main/java/jenkins/security/UserDetailsCache.java index be6e2d20b613e85d0a9b83c8e82b99df7f0ae400..1d5f221e43bfba1fd42c63853b433e509564fff1 100644 --- a/core/src/main/java/jenkins/security/UserDetailsCache.java +++ b/core/src/main/java/jenkins/security/UserDetailsCache.java @@ -47,7 +47,7 @@ import static com.google.common.cache.CacheBuilder.newBuilder; /** * Cache layer for {@link org.acegisecurity.userdetails.UserDetails} lookup. * - * @since TODO + * @since 2.15 */ @Extension public final class UserDetailsCache { @@ -59,7 +59,7 @@ public final class UserDetailsCache { */ private static /*not final*/ Integer EXPIRE_AFTER_WRITE_SEC = SystemProperties.getInteger(SYS_PROP_NAME, (int)TimeUnit.MINUTES.toSeconds(2)); private final Cache detailsCache; - private final Cache existanceCache; + private final Cache existenceCache; /** * Constructor intended to be instantiated by Jenkins only. @@ -75,7 +75,7 @@ public final class UserDetailsCache { } } detailsCache = newBuilder().softValues().expireAfterWrite(EXPIRE_AFTER_WRITE_SEC, TimeUnit.SECONDS).build(); - existanceCache = newBuilder().softValues().expireAfterWrite(EXPIRE_AFTER_WRITE_SEC, TimeUnit.SECONDS).build(); + existenceCache = newBuilder().softValues().expireAfterWrite(EXPIRE_AFTER_WRITE_SEC, TimeUnit.SECONDS).build(); } /** @@ -97,7 +97,7 @@ public final class UserDetailsCache { */ @CheckForNull public UserDetails getCached(String idOrFullName) throws UsernameNotFoundException { - Boolean exists = existanceCache.getIfPresent(idOrFullName); + Boolean exists = existenceCache.getIfPresent(idOrFullName); if (exists != null && !exists) { throw new UserMayOrMayNotExistException(String.format("\"%s\" does not exist", idOrFullName)); } else { @@ -119,7 +119,7 @@ public final class UserDetailsCache { */ @Nonnull public UserDetails loadUserByUsername(String idOrFullName) throws UsernameNotFoundException, DataAccessException, ExecutionException { - Boolean exists = existanceCache.getIfPresent(idOrFullName); + Boolean exists = existenceCache.getIfPresent(idOrFullName); if(exists != null && !exists) { throw new UsernameNotFoundException(String.format("\"%s\" does not exist", idOrFullName)); } else { @@ -141,7 +141,7 @@ public final class UserDetailsCache { * Discards all entries in the cache. */ public void invalidateAll() { - existanceCache.invalidateAll(); + existenceCache.invalidateAll(); detailsCache.invalidateAll(); } @@ -150,7 +150,7 @@ public final class UserDetailsCache { * @param idOrFullName the key */ public void invalidate(final String idOrFullName) { - existanceCache.invalidate(idOrFullName); + existenceCache.invalidate(idOrFullName); detailsCache.invalidate(idOrFullName); } @@ -171,17 +171,17 @@ public final class UserDetailsCache { Jenkins jenkins = Jenkins.getInstance(); UserDetails userDetails = jenkins.getSecurityRealm().loadUserByUsername(idOrFullName); if (userDetails == null) { - existanceCache.put(this.idOrFullName, Boolean.FALSE); + existenceCache.put(this.idOrFullName, Boolean.FALSE); throw new NullPointerException("hudson.security.SecurityRealm should never return null. " + jenkins.getSecurityRealm() + " returned null for idOrFullName='" + idOrFullName + "'"); } - existanceCache.put(this.idOrFullName, Boolean.TRUE); + existenceCache.put(this.idOrFullName, Boolean.TRUE); return userDetails; } catch (UsernameNotFoundException e) { - existanceCache.put(this.idOrFullName, Boolean.FALSE); + existenceCache.put(this.idOrFullName, Boolean.FALSE); throw e; } catch (DataAccessException e) { - existanceCache.invalidate(this.idOrFullName); + existenceCache.invalidate(this.idOrFullName); throw e; } } diff --git a/core/src/main/java/jenkins/security/s2m/AdminCallableMonitor.java b/core/src/main/java/jenkins/security/s2m/AdminCallableMonitor.java index 67a54237174200b923835bdd7459f08dd57083f3..3a9d095af1522ad81371ee4373852cd84949e11f 100644 --- a/core/src/main/java/jenkins/security/s2m/AdminCallableMonitor.java +++ b/core/src/main/java/jenkins/security/s2m/AdminCallableMonitor.java @@ -9,6 +9,7 @@ import org.jenkinsci.Symbol; import org.kohsuke.stapler.HttpResponse; import org.kohsuke.stapler.HttpResponses; import org.kohsuke.stapler.QueryParameter; +import org.kohsuke.stapler.interceptor.RequirePOST; import javax.inject.Inject; import java.io.IOException; @@ -39,7 +40,7 @@ public class AdminCallableMonitor extends AdministrativeMonitor { @Override public String getDisplayName() { - return "Agent \u2192 Master Access Control"; + return Messages.AdminCallableMonitor_DisplayName(); } // bind this to URL @@ -48,8 +49,9 @@ public class AdminCallableMonitor extends AdministrativeMonitor { } /** - * Depending on whether the user said "examin" or "dismiss", send him to the right place. + * Depending on whether the user said "examine" or "dismiss", send him to the right place. */ + @RequirePOST public HttpResponse doAct(@QueryParameter String dismiss) throws IOException { if(dismiss!=null) { disable(true); diff --git a/core/src/main/java/jenkins/security/s2m/AdminWhitelistRule.java b/core/src/main/java/jenkins/security/s2m/AdminWhitelistRule.java index c9aabe56919f8e6e4342b752c7d3e299feb9390e..a05fd59e8ebc58c7ab1d112318f8a2f709144390 100644 --- a/core/src/main/java/jenkins/security/s2m/AdminWhitelistRule.java +++ b/core/src/main/java/jenkins/security/s2m/AdminWhitelistRule.java @@ -109,14 +109,14 @@ public class AdminWhitelistRule implements StaplerProxy { private InputStream transformForWindows(InputStream src) throws IOException { BufferedReader r = new BufferedReader(new InputStreamReader(src)); ByteArrayOutputStream out = new ByteArrayOutputStream(); - PrintStream p = new PrintStream(out); - String line; - while ((line=r.readLine())!=null) { - if (!line.startsWith("#") && Functions.isWindows()) - line = line.replace("/","\\\\"); - p.println(line); + try (PrintStream p = new PrintStream(out)) { + String line; + while ((line = r.readLine()) != null) { + if (!line.startsWith("#") && Functions.isWindows()) + line = line.replace("/", "\\\\"); + p.println(line); + } } - p.close(); return new ByteArrayInputStream(out.toByteArray()); } diff --git a/core/src/main/java/jenkins/security/s2m/CallableDirectionChecker.java b/core/src/main/java/jenkins/security/s2m/CallableDirectionChecker.java index 858375a8abcf29d52cb67ab031bfbd565e7ca1a8..d21c5a5880d73d3251fed8a4e9c8d6ed14df8ae9 100644 --- a/core/src/main/java/jenkins/security/s2m/CallableDirectionChecker.java +++ b/core/src/main/java/jenkins/security/s2m/CallableDirectionChecker.java @@ -60,7 +60,7 @@ public class CallableDirectionChecker extends RoleChecker { return; } - throw new SecurityException("Sending " + name + " from agent to master is prohibited.\nSee http://jenkins-ci.org/security-144 for more details"); + throw new SecurityException("Sending " + name + " from agent to master is prohibited.\nSee https://jenkins.io/redirect/security-144 for more details"); } /** diff --git a/core/src/main/java/jenkins/security/s2m/MasterKillSwitchWarning.java b/core/src/main/java/jenkins/security/s2m/MasterKillSwitchWarning.java index 7a5df576f12b5fb292e49a85ca8ce5ea523ce724..54164c00c1790a40688ffead26e8c17a3d24e084 100644 --- a/core/src/main/java/jenkins/security/s2m/MasterKillSwitchWarning.java +++ b/core/src/main/java/jenkins/security/s2m/MasterKillSwitchWarning.java @@ -5,6 +5,7 @@ import hudson.model.AdministrativeMonitor; import org.kohsuke.stapler.HttpResponse; import org.kohsuke.stapler.HttpResponses; import org.kohsuke.stapler.QueryParameter; +import org.kohsuke.stapler.interceptor.RequirePOST; import javax.inject.Inject; import java.io.IOException; @@ -28,6 +29,12 @@ public class MasterKillSwitchWarning extends AdministrativeMonitor { return rule.getMasterKillSwitch() && config.isRelevant(); } + @Override + public String getDisplayName() { + return Messages.MasterKillSwitchWarning_DisplayName(); + } + + @RequirePOST public HttpResponse doAct(@QueryParameter String dismiss) throws IOException { if(dismiss!=null) { disable(true); diff --git a/core/src/main/java/jenkins/slaves/DefaultJnlpSlaveReceiver.java b/core/src/main/java/jenkins/slaves/DefaultJnlpSlaveReceiver.java index f82ad9ca18930f111e6819965d04ee4172dfc80b..686ed005e385adfe7b1f6dbb4661ee1453ed9bbe 100644 --- a/core/src/main/java/jenkins/slaves/DefaultJnlpSlaveReceiver.java +++ b/core/src/main/java/jenkins/slaves/DefaultJnlpSlaveReceiver.java @@ -1,22 +1,41 @@ package jenkins.slaves; +import edu.umd.cs.findbugs.annotations.NonNull; +import hudson.ClassicPluginStrategy; import hudson.Extension; +import hudson.Functions; import hudson.TcpSlaveAgentListener.ConnectionFromCurrentPeer; import hudson.Util; +import hudson.model.Computer; import hudson.model.Slave; import hudson.remoting.Channel; +import hudson.slaves.ComputerLauncher; +import hudson.slaves.ComputerLauncherFilter; +import hudson.slaves.DelegatingComputerLauncher; +import hudson.slaves.JNLPLauncher; import hudson.slaves.SlaveComputer; +import java.io.OutputStream; +import java.io.PrintWriter; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; import jenkins.model.Jenkins; -import org.jenkinsci.remoting.engine.JnlpServerHandshake; +import jenkins.security.ChannelConfigurator; +import jenkins.util.SystemProperties; +import org.apache.commons.io.IOUtils; +import org.jenkinsci.remoting.engine.JnlpConnectionState; import java.io.IOException; import java.security.SecureRandom; -import java.util.Properties; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import java.util.logging.Level; import java.util.logging.Logger; +import org.jenkinsci.remoting.protocol.impl.ConnectionRefusalException; +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.NoExternalUse; /** * Match the name against the agent name and route the incoming JNLP agent as {@link Slave}. @@ -27,81 +46,170 @@ import java.util.logging.Logger; */ @Extension public class DefaultJnlpSlaveReceiver extends JnlpAgentReceiver { + + /** + * Disables strict verification of connections. Turn this on if you have plugins that incorrectly extend + * {@link ComputerLauncher} when then should have extended {@link DelegatingComputerLauncher} + * + * @since 2.28 + */ + @Restricted(NoExternalUse.class) + public static boolean disableStrictVerification = + SystemProperties.getBoolean(DefaultJnlpSlaveReceiver.class.getName() + ".disableStrictVerification"); + + @Override - public boolean handle(String nodeName, JnlpServerHandshake handshake) throws IOException, InterruptedException { - SlaveComputer computer = (SlaveComputer) Jenkins.getInstance().getComputer(nodeName); + public boolean owns(String clientName) { + Computer computer = Jenkins.getInstance().getComputer(clientName); + return computer != null; + } - if (computer==null) { - return false; + private static ComputerLauncher getDelegate(ComputerLauncher launcher) { + try { + Method getDelegate = launcher.getClass().getMethod("getDelegate"); + if (ComputerLauncher.class.isAssignableFrom(getDelegate.getReturnType())) { + return (ComputerLauncher) getDelegate.invoke(launcher); + } + } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) { + // ignore + } + try { + Method getLauncher = launcher.getClass().getMethod("getLauncher"); + if (ComputerLauncher.class.isAssignableFrom(getLauncher.getReturnType())) { + return (ComputerLauncher) getLauncher.invoke(launcher); + } + } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) { + // ignore } + return null; + } + @Override + public void afterProperties(@NonNull JnlpConnectionState event) { + String clientName = event.getProperty(JnlpConnectionState.CLIENT_NAME_KEY); + SlaveComputer computer = (SlaveComputer) Jenkins.getInstance().getComputer(clientName); + if (computer == null) { + event.reject(new ConnectionRefusalException(String.format("%s is not a JNLP agent", clientName))); + return; + } + ComputerLauncher launcher = computer.getLauncher(); + while (!(launcher instanceof JNLPLauncher)) { + ComputerLauncher l; + if (launcher instanceof DelegatingComputerLauncher) { + launcher = ((DelegatingComputerLauncher) launcher).getLauncher(); + } else if (launcher instanceof ComputerLauncherFilter) { + launcher = ((ComputerLauncherFilter) launcher).getCore(); + } else if (null != (l = getDelegate(launcher))) { // TODO remove when all plugins are fixed + LOGGER.log(Level.INFO, "Connecting {0} as a JNLP agent where the launcher {1} does not mark " + + "itself correctly as being a JNLP agent", + new Object[]{clientName, computer.getLauncher().getClass()}); + launcher = l; + } else { + if (disableStrictVerification) { + LOGGER.log(Level.WARNING, "Connecting {0} as a JNLP agent where the launcher {1} does not mark " + + "itself correctly as being a JNLP agent", + new Object[]{clientName, computer.getLauncher().getClass()}); + break; + } else { + LOGGER.log(Level.WARNING, "Rejecting connection to {0} from {1} as a JNLP agent as the launcher " + + "{2} does not extend JNLPLauncher or does not implement " + + "DelegatingComputerLauncher with a delegation chain leading to a JNLPLauncher. " + + "Set system property " + + "jenkins.slaves.DefaultJnlpSlaveReceiver.disableStrictVerification=true to allow" + + "connections until the plugin has been fixed.", + new Object[]{clientName, event.getSocket().getRemoteSocketAddress(), computer.getLauncher().getClass()}); + event.reject(new ConnectionRefusalException(String.format("%s is not a JNLP agent", clientName))); + return; + } + } + } Channel ch = computer.getChannel(); - if (ch !=null) { - String c = handshake.getRequestProperty("Cookie"); - if (c!=null && c.equals(ch.getProperty(COOKIE_NAME))) { + if (ch != null) { + String cookie = event.getProperty(JnlpConnectionState.COOKIE_KEY); + if (cookie != null && cookie.equals(ch.getProperty(COOKIE_NAME))) { // we think we are currently connected, but this request proves that it's from the party // we are supposed to be communicating to. so let the current one get disconnected - LOGGER.info("Disconnecting "+nodeName+" as we are reconnected from the current peer"); + LOGGER.log(Level.INFO, "Disconnecting {0} as we are reconnected from the current peer", clientName); try { computer.disconnect(new ConnectionFromCurrentPeer()).get(15, TimeUnit.SECONDS); - } catch (ExecutionException | TimeoutException e) { - throw new IOException("Failed to disconnect the current client",e); + } catch (ExecutionException | TimeoutException | InterruptedException e) { + event.reject(new ConnectionRefusalException("Failed to disconnect the current client", e)); + return; } } else { - handshake.error(nodeName + " is already connected to this master. Rejecting this connection."); - return true; + event.reject(new ConnectionRefusalException(String.format( + "%s is already connected to this master. Rejecting this connection.", clientName))); + return; } } + event.approve(); + event.setStash(new State(computer)); + } + + @Override + public void beforeChannel(@NonNull JnlpConnectionState event) { + DefaultJnlpSlaveReceiver.State state = event.getStash(DefaultJnlpSlaveReceiver.State.class); + final SlaveComputer computer = state.getNode(); + final OutputStream log = computer.openLogFile(); + state.setLog(log); + PrintWriter logw = new PrintWriter(log, true); + logw.println("JNLP agent connected from " + event.getSocket().getInetAddress()); + for (ChannelConfigurator cc : ChannelConfigurator.all()) { + cc.onChannelBuilding(event.getChannelBuilder(), computer); + } + event.getChannelBuilder().withHeaderStream(log); + String cookie = event.getProperty(JnlpConnectionState.COOKIE_KEY); + if (cookie != null) { + event.getChannelBuilder().withProperty(COOKIE_NAME, cookie); + } + } - if (!matchesSecret(nodeName,handshake)) { - handshake.error(nodeName + " can't be connected since the agent's secret does not match the handshake secret."); - return true; + @Override + public void afterChannel(@NonNull JnlpConnectionState event) { + DefaultJnlpSlaveReceiver.State state = event.getStash(DefaultJnlpSlaveReceiver.State.class); + final SlaveComputer computer = state.getNode(); + try { + computer.setChannel(event.getChannel(), state.getLog(), null); + } catch (IOException | InterruptedException e) { + PrintWriter logw = new PrintWriter(state.getLog(), true); + Functions.printStackTrace(e, logw); + IOUtils.closeQuietly(event.getChannel()); } + } - Properties response = new Properties(); - String cookie = generateCookie(); - response.put("Cookie",cookie); - handshake.success(response); + @Override + public void channelClosed(@NonNull JnlpConnectionState event) { + final String nodeName = event.getProperty(JnlpConnectionState.CLIENT_NAME_KEY); + IOException cause = event.getCloseCause(); + if (cause != null) { + LOGGER.log(Level.WARNING, Thread.currentThread().getName() + " for " + nodeName + " terminated", + cause); + } + } - // this cast is leaking abstraction - JnlpSlaveAgentProtocol2.Handler handler = (JnlpSlaveAgentProtocol2.Handler)handshake; + private static class State implements JnlpConnectionState.ListenerState { + @Nonnull + private final SlaveComputer node; + @CheckForNull + private OutputStream log; - ch = handler.jnlpConnect(computer); + public State(@Nonnull SlaveComputer node) { + this.node = node; + } - ch.setProperty(COOKIE_NAME, cookie); + @Nonnull + public SlaveComputer getNode() { + return node; + } - return true; - } - - /** - * Called after the client has connected to check if the agent secret matches the handshake secret - * - * @param nodeName - * Name of the incoming JNLP agent. All {@link JnlpAgentReceiver} shares a single namespace - * of names. The implementation needs to be able to tell which name belongs to them. - * - * @param handshake - * Encapsulation of the interaction with the incoming JNLP agent. - * - * @return - * true if the agent secret matches the handshake secret, false otherwise. - */ - private boolean matchesSecret(String nodeName, JnlpServerHandshake handshake){ - SlaveComputer computer = (SlaveComputer) Jenkins.getInstance().getComputer(nodeName); - String handshakeSecret = handshake.getRequestProperty("Secret-Key"); - // Verify that the agent secret matches the handshake secret. - if (!computer.getJnlpMac().equals(handshakeSecret)) { - LOGGER.log(Level.WARNING, "An attempt was made to connect as {0} from {1} with an incorrect secret", new Object[]{nodeName, handshake.getSocket()!=null?handshake.getSocket().getRemoteSocketAddress():null}); - return false; - } else { - return true; + @CheckForNull + public OutputStream getLog() { + return log; } - } - private String generateCookie() { - byte[] cookie = new byte[32]; - new SecureRandom().nextBytes(cookie); - return Util.toHexString(cookie); + public void setLog(@Nonnull OutputStream log) { + this.log = log; + } } private static final Logger LOGGER = Logger.getLogger(DefaultJnlpSlaveReceiver.class.getName()); diff --git a/core/src/main/java/jenkins/slaves/EncryptedSlaveAgentJnlpFile.java b/core/src/main/java/jenkins/slaves/EncryptedSlaveAgentJnlpFile.java index feb11427a8f0dc6cc08d0efe1440f03b7b8af37a..9d152a68f0fb886d99150a386d5965a90901d70c 100644 --- a/core/src/main/java/jenkins/slaves/EncryptedSlaveAgentJnlpFile.java +++ b/core/src/main/java/jenkins/slaves/EncryptedSlaveAgentJnlpFile.java @@ -4,6 +4,7 @@ import hudson.security.AccessControlled; import hudson.security.Permission; import hudson.slaves.SlaveComputer; import hudson.util.Secret; +import hudson.Util; import org.kohsuke.stapler.HttpResponse; import org.kohsuke.stapler.ResponseImpl; import org.kohsuke.stapler.StaplerRequest; @@ -36,7 +37,8 @@ import java.security.SecureRandom; public class EncryptedSlaveAgentJnlpFile implements HttpResponse { /** * The object that owns the Jelly view that renders JNLP file. - * For example {@link SlaveComputer}. + * This is typically a {@link SlaveComputer} and if so we'll use {@link SlaveComputer#getJnlpMac()} + * to determine the secret HMAC code. */ private final AccessControlled it; /** @@ -44,9 +46,11 @@ public class EncryptedSlaveAgentJnlpFile implements HttpResponse { */ private final String viewName; /** - * Name of the agent, which is used to determine secret HMAC code. + * Name of the agent, which is used to determine secret HMAC code if {@link #it} + * is not a {@link SlaveComputer}. */ private final String slaveName; + /** * Permission that allows plain text access. Checked against {@link #it}. */ @@ -55,8 +59,8 @@ public class EncryptedSlaveAgentJnlpFile implements HttpResponse { public EncryptedSlaveAgentJnlpFile(AccessControlled it, String viewName, String slaveName, Permission connectPermission) { this.it = it; this.viewName = viewName; - this.slaveName = slaveName; this.connectPermission = connectPermission; + this.slaveName = slaveName; } @Override @@ -77,7 +81,12 @@ public class EncryptedSlaveAgentJnlpFile implements HttpResponse { byte[] iv = new byte[128/8]; new SecureRandom().nextBytes(iv); - byte[] jnlpMac = JnlpSlaveAgentProtocol.SLAVE_SECRET.mac(slaveName.getBytes("UTF-8")); + byte[] jnlpMac; + if(it instanceof SlaveComputer) { + jnlpMac = Util.fromHexString(((SlaveComputer)it).getJnlpMac()); + } else { + jnlpMac = JnlpSlaveAgentProtocol.SLAVE_SECRET.mac(slaveName.getBytes("UTF-8")); + } SecretKey key = new SecretKeySpec(jnlpMac, 0, /* export restrictions */ 128 / 8, "AES"); byte[] encrypted; try { diff --git a/core/src/main/java/jenkins/slaves/IOHubProvider.java b/core/src/main/java/jenkins/slaves/IOHubProvider.java new file mode 100644 index 0000000000000000000000000000000000000000..dad9cf8398d46500f39f2a6bc8af6605ae37b3b1 --- /dev/null +++ b/core/src/main/java/jenkins/slaves/IOHubProvider.java @@ -0,0 +1,71 @@ +/* + * The MIT License + * + * Copyright (c) 2016, CloudBees, Inc. + * + * 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.slaves; + +import hudson.Extension; +import hudson.init.Terminator; +import hudson.model.Computer; +import java.io.IOException; +import java.util.logging.Level; +import java.util.logging.Logger; +import org.jenkinsci.remoting.protocol.IOHub; + +/** + * Singleton holder of {@link IOHub} + * + * @since 2.27 + */ +@Extension +public class IOHubProvider { + /** + * Our logger. + */ + private static final Logger LOGGER = Logger.getLogger(IOHubProvider.class.getName()); + /** + * Our hub. + */ + private IOHub hub; + + public IOHubProvider() { + try { + hub = IOHub.create(Computer.threadPoolForRemoting); + } catch (IOException e) { + LOGGER.log(Level.SEVERE, "Failed to launch IOHub", e); + this.hub = null; + } + } + + public IOHub getHub() { + return hub; + } + + @Terminator + public void cleanUp() throws IOException { + if (hub != null) { + hub.close(); + hub = null; + } + } + +} diff --git a/core/src/main/java/jenkins/slaves/JnlpAgentReceiver.java b/core/src/main/java/jenkins/slaves/JnlpAgentReceiver.java index 7865c8852628c45b15cc6bd074af301c1a4adbe8..39473d75d65878b1c0cb5e0c0533a481618a5bc6 100644 --- a/core/src/main/java/jenkins/slaves/JnlpAgentReceiver.java +++ b/core/src/main/java/jenkins/slaves/JnlpAgentReceiver.java @@ -2,73 +2,67 @@ package jenkins.slaves; import hudson.ExtensionList; import hudson.ExtensionPoint; +import hudson.Util; import hudson.model.Slave; -import jenkins.model.Jenkins; -import org.jenkinsci.remoting.engine.JnlpServerHandshake; - -import java.io.IOException; -import java.util.Properties; +import java.security.SecureRandom; +import javax.annotation.Nonnull; +import org.jenkinsci.remoting.engine.JnlpClientDatabase; +import org.jenkinsci.remoting.engine.JnlpConnectionStateListener; /** - * Receives incoming agents connecting through {@link JnlpSlaveAgentProtocol2}. + * Receives incoming agents connecting through {@link JnlpSlaveAgentProtocol2}, {@link JnlpSlaveAgentProtocol3}, {@link JnlpSlaveAgentProtocol4}. * *

      * This is useful to establish the communication with other JVMs and use them * for different purposes outside {@link Slave}s. + + *

        + *
      • When the {@link jenkins.slaves.JnlpAgentReceiver#exists(String)} method is invoked for an agent, the {@link jenkins.slaves.JnlpAgentReceiver#owns(String)} method is called on all the extension points: if no owner is found an exception is thrown.
      • + *
      • If owner is found, then the {@link org.jenkinsci.remoting.engine.JnlpConnectionState} lifecycle methods are invoked for all registered {@link JnlpConnectionStateListener} until the one which changes the state of {@link org.jenkinsci.remoting.engine.JnlpConnectionState} by setting an approval or rejected state is found. + * When found, that listener will be set as the owner of the incoming connection event.
      • + *
      • Subsequent steps of the connection lifecycle are only called on the {@link JnlpAgentReceiver} implementation owner for that connection event.
      • + *
      + * * * @author Kohsuke Kawaguchi * @since 1.561 */ -public abstract class JnlpAgentReceiver implements ExtensionPoint { +public abstract class JnlpAgentReceiver extends JnlpConnectionStateListener implements ExtensionPoint { - /** - * Called after the client has connected. - * - *

      - * The implementation must do the following in the order: - * - *

        - *
      1. Check if the implementation recognizes and claims the given name. - * If not, return false to let other {@link JnlpAgentReceiver} have a chance to - * take this connection. - * - *
      2. If you claim the name but the connection is refused, call - * {@link JnlpSlaveHandshake#error(String)} to refuse the client, and return true. - * The connection will be shut down and the client will report this error to the user. - * - *
      3. If you claim the name and the connection is OK, call - * {@link JnlpSlaveHandshake#success(Properties)} to accept the client. - * - *
      4. Proceed to build a channel with {@link JnlpSlaveHandshake#createChannelBuilder(String)} - * and return true - * - * @param name - * Name of the incoming JNLP agent. All {@link JnlpAgentReceiver} shares a single namespace - * of names. The implementation needs to be able to tell which name belongs to them. - * - * @param handshake - * Encapsulation of the interaction with the incoming JNLP agent. - * - * @return - * true if the name was claimed and the handshake was completed (either successfully or unsuccessfully) - * false if the name was not claimed. Other {@link JnlpAgentReceiver}s will be called to see if they - * take this connection. - * - * @throws Exception - * Any exception thrown from this method will fatally terminate the connection. - */ - public abstract boolean handle(String name, JnlpServerHandshake handshake) throws IOException, InterruptedException; - - /** - * @deprecated - * Use {@link #handle(String, JnlpServerHandshake)} - */ - public boolean handle(String name, JnlpSlaveHandshake handshake) throws IOException, InterruptedException { - return handle(name,(JnlpServerHandshake)handshake); - } + private static final SecureRandom secureRandom = new SecureRandom(); + public static final JnlpClientDatabase DATABASE = new JnlpAgentDatabase(); public static ExtensionList all() { return ExtensionList.lookup(JnlpAgentReceiver.class); } + + public static boolean exists(String clientName) { + for (JnlpAgentReceiver receiver : all()) { + if (receiver.owns(clientName)) { + return true; + } + } + return false; + } + + protected abstract boolean owns(String clientName); + + public static String generateCookie() { + byte[] cookie = new byte[32]; + secureRandom.nextBytes(cookie); + return Util.toHexString(cookie); + } + + private static class JnlpAgentDatabase extends JnlpClientDatabase { + @Override + public boolean exists(String clientName) { + return JnlpAgentReceiver.exists(clientName); + } + + @Override + public String getSecretOf(@Nonnull String clientName) { + return JnlpSlaveAgentProtocol.SLAVE_SECRET.mac(clientName); + } + } } diff --git a/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol.java b/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol.java index d0759dbd6bf8453e550c1859aa74609447a2da96..e351b93945ed07ad94503def59eb75e7753a44a3 100644 --- a/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol.java +++ b/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol.java @@ -1,32 +1,23 @@ package jenkins.slaves; -import hudson.AbortException; import hudson.Extension; +import hudson.ExtensionList; import hudson.Util; import hudson.model.Computer; -import hudson.remoting.Channel; -import hudson.remoting.Channel.Listener; -import hudson.remoting.ChannelBuilder; -import hudson.remoting.Engine; -import hudson.slaves.SlaveComputer; +import java.io.IOException; +import java.net.Socket; +import java.util.Collections; +import java.util.HashMap; +import java.util.logging.Logger; +import javax.annotation.Nonnull; +import javax.inject.Inject; import jenkins.AgentProtocol; import jenkins.model.Jenkins; -import jenkins.security.ChannelConfigurator; import jenkins.security.HMACConfidentialKey; import org.jenkinsci.Symbol; -import org.jenkinsci.remoting.engine.JnlpServerHandshake; -import org.jenkinsci.remoting.nio.NioChannelHub; - -import javax.inject.Inject; -import java.io.BufferedWriter; -import java.io.DataInputStream; -import java.io.IOException; -import java.io.OutputStream; -import java.io.OutputStreamWriter; -import java.io.PrintWriter; -import java.net.Socket; -import java.util.logging.Level; -import java.util.logging.Logger; +import org.jenkinsci.remoting.engine.JnlpClientDatabase; +import org.jenkinsci.remoting.engine.JnlpConnectionState; +import org.jenkinsci.remoting.engine.JnlpProtocol1Handler; /** * {@link AgentProtocol} that accepts connection from agents. @@ -56,10 +47,29 @@ import java.util.logging.Logger; * @author Kohsuke Kawaguchi * @since 1.467 */ -@Extension @Symbol("jnlp") +@Extension +@Symbol("jnlp") public class JnlpSlaveAgentProtocol extends AgentProtocol { + /** + * Our logger + */ + private static final Logger LOGGER = Logger.getLogger(JnlpSlaveAgentProtocol.class.getName()); + /** + * This secret value is used as a seed for agents. + */ + public static final HMACConfidentialKey SLAVE_SECRET = + new HMACConfidentialKey(JnlpSlaveAgentProtocol.class, "secret"); + + private NioChannelSelector hub; + + private JnlpProtocol1Handler handler; + @Inject - NioChannelSelector hub; + public void setHub(NioChannelSelector hub) { + this.hub = hub; + this.handler = new JnlpProtocol1Handler(JnlpAgentReceiver.DATABASE, Computer.threadPoolForRemoting, + hub.getHub(), true); + } /** * {@inheritDoc} @@ -71,7 +81,7 @@ public class JnlpSlaveAgentProtocol extends AgentProtocol { @Override public String getName() { - return "JNLP-connect"; + return handler.isEnabled() ? handler.getName() : null; } /** @@ -84,95 +94,11 @@ public class JnlpSlaveAgentProtocol extends AgentProtocol { @Override public void handle(Socket socket) throws IOException, InterruptedException { - new Handler(hub.getHub(),socket).run(); + handler.handle(socket, + Collections.singletonMap(JnlpConnectionState.COOKIE_KEY, JnlpAgentReceiver.generateCookie()), + ExtensionList.lookup(JnlpAgentReceiver.class)); } - protected static class Handler extends JnlpServerHandshake { - - /** - * @deprecated as of 1.559 - * Use {@link #Handler(NioChannelHub, Socket)} - */ - @Deprecated - public Handler(Socket socket) throws IOException { - this(null,socket); - } - - public Handler(NioChannelHub hub, Socket socket) throws IOException { - super(hub, Computer.threadPoolForRemoting, socket); - } - - protected void run() throws IOException, InterruptedException { - final String secret = in.readUTF(); - final String nodeName = in.readUTF(); - - if(!SLAVE_SECRET.mac(nodeName).equals(secret)) { - error("Unauthorized access"); - return; - } - - - SlaveComputer computer = (SlaveComputer) Jenkins.getInstance().getComputer(nodeName); - if(computer==null) { - error("No such agent: "+nodeName); - return; - } - - if(computer.getChannel()!=null) { - error(nodeName+" is already connected to this master. Rejecting this connection."); - return; - } - - out.println(Engine.GREETING_SUCCESS); - - jnlpConnect(computer); - } - - protected Channel jnlpConnect(SlaveComputer computer) throws InterruptedException, IOException { - final String nodeName = computer.getName(); - final OutputStream log = computer.openLogFile(); - PrintWriter logw = new PrintWriter(log,true); - logw.println("JNLP agent connected from "+ socket.getInetAddress()); - - try { - ChannelBuilder cb = createChannelBuilder(nodeName); - - for (ChannelConfigurator cc : ChannelConfigurator.all()) { - cc.onChannelBuilding(cb, computer); - } - - computer.setChannel(cb.withHeaderStream(log).build(socket), log, - new Listener() { - @Override - public void onClosed(Channel channel, IOException cause) { - if(cause!=null) - LOGGER.log(Level.WARNING, Thread.currentThread().getName() + " for " + nodeName + " terminated", cause); - try { - socket.close(); - } catch (IOException e) { - // ignore - } - } - }); - return computer.getChannel(); - } catch (AbortException e) { - logw.println(e.getMessage()); - logw.println("Failed to establish the connection with the agent"); - throw e; - } catch (IOException e) { - logw.println("Failed to establish the connection with the agent " + nodeName); - e.printStackTrace(logw); - throw e; - } - } - } - - private static final Logger LOGGER = Logger.getLogger(JnlpSlaveAgentProtocol.class.getName()); - - /** - * This secret value is used as a seed for agents. - */ - public static final HMACConfidentialKey SLAVE_SECRET = new HMACConfidentialKey(JnlpSlaveAgentProtocol.class,"secret"); /** * A/B test turning off this protocol by default. diff --git a/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol2.java b/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol2.java index 1a2bb649dca9e0358b76faa7e2894c07906fa567..66bc07dc9d72992701ab59889da570498f7002ea 100644 --- a/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol2.java +++ b/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol2.java @@ -1,13 +1,19 @@ package jenkins.slaves; import hudson.Extension; -import org.jenkinsci.Symbol; -import org.jenkinsci.remoting.engine.JnlpServerHandshake; -import org.jenkinsci.remoting.nio.NioChannelHub; - -import java.io.ByteArrayInputStream; +import hudson.ExtensionList; +import hudson.model.Computer; import java.io.IOException; import java.net.Socket; +import java.util.Collections; +import java.util.HashMap; +import javax.annotation.Nonnull; +import javax.inject.Inject; +import jenkins.AgentProtocol; +import org.jenkinsci.Symbol; +import org.jenkinsci.remoting.engine.JnlpClientDatabase; +import org.jenkinsci.remoting.engine.JnlpConnectionState; +import org.jenkinsci.remoting.engine.JnlpProtocol2Handler; /** * {@link JnlpSlaveAgentProtocol} Version 2. @@ -20,11 +26,23 @@ import java.net.Socket; * @author Kohsuke Kawaguchi * @since 1.467 */ -@Extension @Symbol("jnlp2") -public class JnlpSlaveAgentProtocol2 extends JnlpSlaveAgentProtocol { +@Extension +@Symbol("jnlp2") +public class JnlpSlaveAgentProtocol2 extends AgentProtocol { + private NioChannelSelector hub; + + private JnlpProtocol2Handler handler; + + @Inject + public void setHub(NioChannelSelector hub) { + this.hub = hub; + this.handler = new JnlpProtocol2Handler(JnlpAgentReceiver.DATABASE, Computer.threadPoolForRemoting, + hub.getHub(), true); + } + @Override public String getName() { - return "JNLP2-connect"; + return handler.isEnabled() ? handler.getName() : null; } /** @@ -45,43 +63,9 @@ public class JnlpSlaveAgentProtocol2 extends JnlpSlaveAgentProtocol { @Override public void handle(Socket socket) throws IOException, InterruptedException { - new Handler2(hub.getHub(),socket).run(); + handler.handle(socket, + Collections.singletonMap(JnlpConnectionState.COOKIE_KEY, JnlpAgentReceiver.generateCookie()), + ExtensionList.lookup(JnlpAgentReceiver.class)); } - protected static class Handler2 extends Handler { - /** - * @deprecated as of 1.559 - * Use {@link #Handler2(NioChannelHub, Socket)} - */ - @Deprecated - public Handler2(Socket socket) throws IOException { - super(socket); - } - - public Handler2(NioChannelHub hub, Socket socket) throws IOException { - super(hub, socket); - } - - /** - * Handles JNLP agent connection request (v2 protocol) - */ - @Override - protected void run() throws IOException, InterruptedException { - request.load(new ByteArrayInputStream(in.readUTF().getBytes("UTF-8"))); - - final String nodeName = request.getProperty("Node-Name"); - - for (JnlpAgentReceiver recv : JnlpAgentReceiver.all()) { - try { - if (recv.handle(nodeName,this)) - return; - } catch (AbstractMethodError e) { - if (recv.handle(nodeName,new JnlpSlaveHandshake(this))) - return; - } - } - - error("JNLP2-connect: rejected connection for node: " + nodeName); - } - } } diff --git a/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol3.java b/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol3.java index e0f5c761668b649c9b317cc8c4b50e667a1cb885..50779ee9da4085bb1d527148f202ddfde90a2376 100644 --- a/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol3.java +++ b/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol3.java @@ -1,43 +1,45 @@ package jenkins.slaves; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; -import hudson.AbortException; import hudson.Extension; +import hudson.ExtensionList; import hudson.Util; import hudson.model.Computer; -import hudson.remoting.Channel; -import hudson.remoting.ChannelBuilder; -import hudson.slaves.SlaveComputer; +import java.io.IOException; +import java.net.Socket; +import java.util.Collections; +import java.util.HashMap; +import javax.annotation.Nonnull; +import javax.inject.Inject; import jenkins.AgentProtocol; import jenkins.model.Jenkins; -import jenkins.security.ChannelConfigurator; -import org.jenkinsci.remoting.engine.JnlpServer3Handshake; -import org.jenkinsci.remoting.nio.NioChannelHub; +import jenkins.util.SystemProperties; +import org.jenkinsci.remoting.engine.JnlpClientDatabase; +import org.jenkinsci.remoting.engine.JnlpConnectionState; +import org.jenkinsci.remoting.engine.JnlpProtocol3Handler; import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.restrictions.NoExternalUse; -import javax.inject.Inject; -import java.io.IOException; -import java.io.OutputStream; -import java.io.PrintWriter; -import java.net.Socket; -import java.util.logging.Level; -import java.util.logging.Logger; -import jenkins.util.SystemProperties; - /** * Master-side implementation for JNLP3-connect protocol. * - *

        @see {@link org.jenkinsci.remoting.engine.JnlpProtocol3} for more details. + *

        @see {@link org.jenkinsci.remoting.engine.JnlpProtocol3Handler} for more details. * - * @author Akshay Dayal * @since 1.XXX */ -// TODO @Deprecated once JENKINS-36871 is merged +@Deprecated @Extension public class JnlpSlaveAgentProtocol3 extends AgentProtocol { + private NioChannelSelector hub; + + private JnlpProtocol3Handler handler; + @Inject - NioChannelSelector hub; + public void setHub(NioChannelSelector hub) { + this.hub = hub; + this.handler = new JnlpProtocol3Handler(JnlpAgentReceiver.DATABASE, Computer.threadPoolForRemoting, + hub.getHub(), true); + } /** * {@inheritDoc} @@ -52,7 +54,7 @@ public class JnlpSlaveAgentProtocol3 extends AgentProtocol { // we only want to force the protocol off for users that have explicitly banned it via system property // everyone on the A/B test will just have the opt-in flag toggled // TODO strip all this out and hardcode OptIn==TRUE once JENKINS-36871 is merged - return forceEnabled != Boolean.FALSE ? "JNLP3-connect" : null; + return forceEnabled != Boolean.FALSE ? handler.getName() : null; } /** @@ -65,76 +67,11 @@ public class JnlpSlaveAgentProtocol3 extends AgentProtocol { @Override public void handle(Socket socket) throws IOException, InterruptedException { - new Handler(hub.getHub(), socket).run(); - } - - static class Handler extends JnlpServer3Handshake { - private SlaveComputer computer; - private PrintWriter logw; - private OutputStream log; - - public Handler(NioChannelHub hub, Socket socket) throws IOException { - super(hub, Computer.threadPoolForRemoting, socket); - } - - protected void run() throws IOException, InterruptedException { - try { - Channel channel = connect(); - - computer.setChannel(channel, log, - new Channel.Listener() { - @Override - public void onClosed(Channel channel, IOException cause) { - if (cause != null) - LOGGER.log(Level.WARNING, - Thread.currentThread().getName() + " for + " + - getNodeName() + " terminated", cause); - try { - socket.close(); - } catch (IOException e) { - // Do nothing. - } - } - }); - } catch (AbortException e) { - logw.println(e.getMessage()); - logw.println("Failed to establish the connection with the agent"); - throw e; - } catch (IOException e) { - logw.println("Failed to establish the connection with the agent " + getNodeName()); - e.printStackTrace(logw); - throw e; - } - } - - @Override - public ChannelBuilder createChannelBuilder(String nodeName) { - log = computer.openLogFile(); - logw = new PrintWriter(log,true); - logw.println("JNLP agent connected from " + socket.getInetAddress()); - - ChannelBuilder cb = super.createChannelBuilder(nodeName).withHeaderStream(log); - - for (ChannelConfigurator cc : ChannelConfigurator.all()) { - cc.onChannelBuilding(cb, computer); - } - - return cb; - } - - @Override - protected String getNodeSecret(String nodeName) throws Failure { - computer = (SlaveComputer) Jenkins.getInstance().getComputer(nodeName); - if (computer == null) { - throw new Failure("Agent trying to register for invalid node: " + nodeName); - } - return computer.getJnlpMac(); - } - + handler.handle(socket, + Collections.singletonMap(JnlpConnectionState.COOKIE_KEY, JnlpAgentReceiver.generateCookie()), + ExtensionList.lookup(JnlpAgentReceiver.class)); } - private static final Logger LOGGER = Logger.getLogger(JnlpSlaveAgentProtocol3.class.getName()); - /** * Flag to control the activation of JNLP3 protocol. * @@ -152,6 +89,9 @@ public class JnlpSlaveAgentProtocol3 extends AgentProtocol { forceEnabled = SystemProperties.optBoolean(JnlpSlaveAgentProtocol3.class.getName() + ".enabled"); if (forceEnabled != null) { ENABLED = forceEnabled; + } else { + byte hash = Util.fromHexString(Jenkins.getActiveInstance().getLegacyInstanceId())[0]; + ENABLED = (hash % 10) == 0; } } } diff --git a/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol4.java b/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol4.java new file mode 100644 index 0000000000000000000000000000000000000000..cfa4ac8de73702b9dc4386e384c5d9811c401421 --- /dev/null +++ b/core/src/main/java/jenkins/slaves/JnlpSlaveAgentProtocol4.java @@ -0,0 +1,208 @@ +/* + * The MIT License + * + * Copyright (c) 2016, CloudBees, Inc. + * + * 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.slaves; + +import hudson.Extension; +import hudson.ExtensionList; +import hudson.model.Computer; +import java.io.IOException; +import java.net.Socket; +import java.security.KeyManagementException; +import java.security.KeyStore; +import java.security.KeyStoreException; +import java.security.NoSuchAlgorithmException; +import java.security.UnrecoverableKeyException; +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; +import java.security.interfaces.RSAPrivateKey; +import java.util.Collections; +import java.util.HashMap; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.inject.Inject; +import javax.net.ssl.KeyManagerFactory; +import javax.net.ssl.SSLContext; +import javax.net.ssl.TrustManager; +import jenkins.AgentProtocol; +import jenkins.model.identity.InstanceIdentityProvider; +import org.jenkinsci.remoting.engine.JnlpConnectionState; +import org.jenkinsci.remoting.engine.JnlpProtocol4Handler; +import org.jenkinsci.remoting.protocol.IOHub; +import org.jenkinsci.remoting.protocol.cert.PublicKeyMatchingX509ExtendedTrustManager; + +/** + * Master-side implementation for JNLP4-connect protocol. + * + *

        @see {@link org.jenkinsci.remoting.engine.JnlpProtocol4Handler} for more details. + * + * @since 2.27 available as the experimental protocol + * @since TODO enabled by default + */ +@Extension +public class JnlpSlaveAgentProtocol4 extends AgentProtocol { + /** + * Our logger. + */ + private static final Logger LOGGER = Logger.getLogger(JnlpSlaveAgentProtocol4.class.getName()); + + /** + * Our keystore. + */ + private final KeyStore keyStore; + /** + * Our trust manager. + */ + private final TrustManager trustManager; + + /** + * The provider of our {@link IOHub} + */ + private IOHubProvider hub; + + /** + * Our handler. + */ + private JnlpProtocol4Handler handler; + /** + * Our SSL context. + */ + private SSLContext sslContext; + + /** + * Constructor. + * + * @throws KeyStoreException if things go wrong. + * @throws KeyManagementException if things go wrong. + * @throws IOException if things go wrong. + */ + public JnlpSlaveAgentProtocol4() throws KeyStoreException, KeyManagementException, IOException { + // prepare our local identity and certificate + X509Certificate identityCertificate = InstanceIdentityProvider.RSA.getCertificate(); + if (identityCertificate == null) { + throw new KeyStoreException("JENKINS-41987: no X509Certificate found; perhaps instance-identity module is missing or too old"); + } + RSAPrivateKey privateKey = InstanceIdentityProvider.RSA.getPrivateKey(); + if (privateKey == null) { + throw new KeyStoreException("JENKINS-41987: no RSAPrivateKey found; perhaps instance-identity module is missing or too old"); + } + + // prepare our keyStore so we can provide our authentication + keyStore = KeyStore.getInstance("JKS"); + char[] password = "password".toCharArray(); + try { + keyStore.load(null, password); + } catch (IOException e) { + throw new IllegalStateException("Specification says this should not happen as we are not doing I/O", e); + } catch (NoSuchAlgorithmException | CertificateException e) { + throw new IllegalStateException("Specification says this should not happen as we are not loading keys", e); + } + keyStore.setKeyEntry("jenkins", privateKey, password, + new X509Certificate[]{identityCertificate}); + + // prepare our keyManagers to provide to the SSLContext + KeyManagerFactory kmf; + try { + kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); + kmf.init(keyStore, password); + } catch (NoSuchAlgorithmException e) { + throw new IllegalStateException("Specification says the default algorithm should exist", e); + } catch (UnrecoverableKeyException e) { + throw new IllegalStateException("The key was just inserted with this exact password", e); + } + + // prepare our trustManagers + trustManager = new PublicKeyMatchingX509ExtendedTrustManager(false, true); + TrustManager[] trustManagers = {trustManager}; + + // prepare our SSLContext + try { + sslContext = SSLContext.getInstance("TLS"); + } catch (NoSuchAlgorithmException e) { + throw new IllegalStateException("Java runtime specification requires support for TLS algorithm", e); + } + sslContext.init(kmf.getKeyManagers(), trustManagers, null); + } + + /** + * Inject the {@link IOHubProvider} + * + * @param hub the hub provider. + */ + @Inject + public void setHub(IOHubProvider hub) { + this.hub = hub; + handler = new JnlpProtocol4Handler(JnlpAgentReceiver.DATABASE, Computer.threadPoolForRemoting, hub.getHub(), + sslContext, false, true); + } + + /** + * {@inheritDoc} + */ + @Override + public boolean isOptIn() { + return false; + } + + /** + * {@inheritDoc} + */ + @Override + public String getDisplayName() { + return Messages.JnlpSlaveAgentProtocol4_displayName(); + } + + /** + * {@inheritDoc} + */ + @Override + public String getName() { + return handler.getName(); + } + + /** + * {@inheritDoc} + */ + @Override + public void handle(Socket socket) throws IOException, InterruptedException { + try { + X509Certificate certificate = (X509Certificate) keyStore.getCertificate("jenkins"); + if (certificate == null + || certificate.getNotAfter().getTime() < System.currentTimeMillis() + TimeUnit.DAYS.toMillis(1)) { + LOGGER.log(Level.INFO, "Updating {0} TLS certificate to retain validity", getName()); + X509Certificate identityCertificate = InstanceIdentityProvider.RSA.getCertificate(); + RSAPrivateKey privateKey = InstanceIdentityProvider.RSA.getPrivateKey(); + char[] password = "password".toCharArray(); + keyStore.setKeyEntry("jenkins", privateKey, password, new X509Certificate[]{identityCertificate}); + } + } catch (KeyStoreException e) { + LOGGER.log(Level.FINEST, "Ignored", e); + } + handler.handle(socket, + Collections.singletonMap(JnlpConnectionState.COOKIE_KEY, JnlpAgentReceiver.generateCookie()), + ExtensionList.lookup(JnlpAgentReceiver.class)); + } + +} diff --git a/core/src/main/java/jenkins/slaves/JnlpSlaveHandshake.java b/core/src/main/java/jenkins/slaves/JnlpSlaveHandshake.java deleted file mode 100644 index 1b67b98ecffd19e2bdbfea9515f7c79398aba84d..0000000000000000000000000000000000000000 --- a/core/src/main/java/jenkins/slaves/JnlpSlaveHandshake.java +++ /dev/null @@ -1,22 +0,0 @@ -package jenkins.slaves; - -import org.jenkinsci.remoting.engine.JnlpServerHandshake; -import org.jenkinsci.remoting.nio.NioChannelHub; - -import java.io.IOException; -import java.net.Socket; -import java.util.concurrent.ExecutorService; - -/** - * Palette of objects to talk to the incoming JNLP agent connection. - * - * @author Kohsuke Kawaguchi - * @since 1.561 - * @deprecated as of 1.609 - * Use {@link JnlpServerHandshake} - */ -public class JnlpSlaveHandshake extends JnlpServerHandshake { - /*package*/ JnlpSlaveHandshake(JnlpServerHandshake rhs) { - super(rhs); - } -} diff --git a/core/src/main/java/jenkins/slaves/restarter/JnlpSlaveRestarterInstaller.java b/core/src/main/java/jenkins/slaves/restarter/JnlpSlaveRestarterInstaller.java index d30d6d2281867dce1c9bfe35844f029e444af4e2..1eb68dcc6f6da09528e9e35f0e0c40f39be21954 100644 --- a/core/src/main/java/jenkins/slaves/restarter/JnlpSlaveRestarterInstaller.java +++ b/core/src/main/java/jenkins/slaves/restarter/JnlpSlaveRestarterInstaller.java @@ -1,6 +1,7 @@ package jenkins.slaves.restarter; import hudson.Extension; +import hudson.Functions; import hudson.model.Computer; import hudson.model.TaskListener; import hudson.remoting.Engine; @@ -93,7 +94,7 @@ public class JnlpSlaveRestarterInstaller extends ComputerListener implements Ser LOGGER.log(FINE, "Effective SlaveRestarter on {0}: {1}", new Object[] {c.getName(), effective}); } catch (Throwable e) { - e.printStackTrace(listener.error("Failed to install restarter")); + Functions.printStackTrace(e, listener.error("Failed to install restarter")); } } diff --git a/core/src/main/java/jenkins/slaves/restarter/WinswSlaveRestarter.java b/core/src/main/java/jenkins/slaves/restarter/WinswSlaveRestarter.java index f9bd660a2133e260abdfc64d70fbed318ebb6d44..8dbdc8ab898588a5f462faf224197076a46671ce 100644 --- a/core/src/main/java/jenkins/slaves/restarter/WinswSlaveRestarter.java +++ b/core/src/main/java/jenkins/slaves/restarter/WinswSlaveRestarter.java @@ -52,7 +52,7 @@ public class WinswSlaveRestarter extends SlaveRestarter { // this command. If that is the case, there's nothing we can do about it. int r = exec("restart!"); throw new IOException("Restart failure. '"+exe+" restart' completed with "+r+" but I'm still alive! " - + "See https://wiki.jenkins-ci.org/display/JENKINS/Distributed+builds#Distributedbuilds-Windowsslaveserviceupgrades" + + "See https://jenkins.io/redirect/troubleshooting/windows-agent-restart" + " for a possible explanation and solution"); } diff --git a/core/src/main/java/jenkins/triggers/ReverseBuildTrigger.java b/core/src/main/java/jenkins/triggers/ReverseBuildTrigger.java index c9f432e6d1e7bdfef5cf6ebec2b907eff0b3d965..e9be86f3dd65010ea3dc438b72db54eb3e425228 100644 --- a/core/src/main/java/jenkins/triggers/ReverseBuildTrigger.java +++ b/core/src/main/java/jenkins/triggers/ReverseBuildTrigger.java @@ -216,7 +216,7 @@ public final class ReverseBuildTrigger extends Trigger implements Dependenc private Map> calculateCache() { try (ACLContext _ = ACL.as(ACL.SYSTEM)) { final Map> result = new WeakHashMap<>(); - for (Job downstream : Jenkins.getInstance().getAllItems(Job.class)) { + for (Job downstream : Jenkins.getInstance().allItems(Job.class)) { ReverseBuildTrigger trigger = ParameterizedJobMixIn.getTrigger(downstream, ReverseBuildTrigger.class); if (trigger == null) { @@ -276,7 +276,7 @@ public final class ReverseBuildTrigger extends Trigger implements Dependenc @Override public void onLocationChanged(Item item, final String oldFullName, final String newFullName) { try (ACLContext _ = ACL.as(ACL.SYSTEM)) { - for (Job p : Jenkins.getInstance().getAllItems(Job.class)) { + for (Job p : Jenkins.getInstance().allItems(Job.class)) { ReverseBuildTrigger t = ParameterizedJobMixIn.getTrigger(p, ReverseBuildTrigger.class); if (t != null) { String revised = diff --git a/core/src/main/java/jenkins/util/AntClassLoader.java b/core/src/main/java/jenkins/util/AntClassLoader.java index 16c7c374742507b66dcf8852ef89c28cfd6b33a0..baf7eb968ab6ddf6c19dc0382ce2c714988282c1 100644 --- a/core/src/main/java/jenkins/util/AntClassLoader.java +++ b/core/src/main/java/jenkins/util/AntClassLoader.java @@ -1352,31 +1352,25 @@ public class AntClassLoader extends ClassLoader implements SubBuildListener { throws ClassNotFoundException { // we need to search the components of the path to see if // we can find the class we want. - InputStream stream = null; String classFilename = getClassFilename(name); - try { - Enumeration e = pathComponents.elements(); - while (e.hasMoreElements()) { - File pathComponent = (File) e.nextElement(); - try { - stream = getResourceStream(pathComponent, classFilename); - if (stream != null) { - log("Loaded from " + pathComponent + " " - + classFilename, Project.MSG_DEBUG); - return getClassFromStream(stream, name, pathComponent); - } - } catch (SecurityException se) { - throw se; - } catch (IOException ioe) { - // ioe.printStackTrace(); - log("Exception reading component " + pathComponent + " (reason: " - + ioe.getMessage() + ")", Project.MSG_VERBOSE); + Enumeration e = pathComponents.elements(); + while (e.hasMoreElements()) { + File pathComponent = (File) e.nextElement(); + try (final InputStream stream = getResourceStream(pathComponent, classFilename)) { + if (stream != null) { + log("Loaded from " + pathComponent + " " + + classFilename, Project.MSG_DEBUG); + return getClassFromStream(stream, name, pathComponent); } + } catch (SecurityException se) { + throw se; + } catch (IOException ioe) { + // ioe.printStackTrace(); + log("Exception reading component " + pathComponent + " (reason: " + + ioe.getMessage() + ")", Project.MSG_VERBOSE); } - throw new ClassNotFoundException(name); - } finally { - FileUtils.close(stream); } + throw new ClassNotFoundException(name); } /** diff --git a/core/src/main/java/jenkins/util/AtmostOneTaskExecutor.java b/core/src/main/java/jenkins/util/AtmostOneTaskExecutor.java index a030ecdf4ea13c9c7a74dc868330951630be52c7..6f4b04a1760632b94a6f1cf7d2ce238a2fdfe6a7 100644 --- a/core/src/main/java/jenkins/util/AtmostOneTaskExecutor.java +++ b/core/src/main/java/jenkins/util/AtmostOneTaskExecutor.java @@ -2,6 +2,7 @@ package jenkins.util; import com.google.common.util.concurrent.SettableFuture; import hudson.remoting.AtmostOneThreadExecutor; +import hudson.security.ACL; import hudson.util.DaemonThreadFactory; import hudson.util.NamingThreadFactory; @@ -9,6 +10,9 @@ import java.util.concurrent.Callable; import java.util.concurrent.Executor; import java.util.concurrent.ExecutorService; import java.util.concurrent.Future; +import java.util.logging.Level; +import java.util.logging.Logger; +import jenkins.security.ImpersonatingExecutorService; /** * {@link Executor}-like class that executes a single task repeatedly, in such a way that a single execution @@ -41,6 +45,9 @@ import java.util.concurrent.Future; * @see AtmostOneThreadExecutor */ public class AtmostOneTaskExecutor { + + private static final Logger LOGGER = Logger.getLogger(AtmostOneTaskExecutor.class.getName()); + /** * The actual executor that executes {@link #task} */ @@ -65,10 +72,10 @@ public class AtmostOneTaskExecutor { } public AtmostOneTaskExecutor(Callable task) { - this(new AtmostOneThreadExecutor(new NamingThreadFactory( + this(new ImpersonatingExecutorService(new AtmostOneThreadExecutor(new NamingThreadFactory( new DaemonThreadFactory(), String.format("AtmostOneTaskExecutor[%s]", task) - )), + )), ACL.SYSTEM), task ); } @@ -100,6 +107,7 @@ public class AtmostOneTaskExecutor { try { inprogress.set(task.call()); } catch (Throwable t) { + LOGGER.log(Level.WARNING, null, t); inprogress.setException(t); } finally { synchronized (AtmostOneTaskExecutor.this) { diff --git a/core/src/main/java/jenkins/util/HttpSessionListener.java b/core/src/main/java/jenkins/util/HttpSessionListener.java index 276c0bb45f43d673624c1eed00fa9ac61ad5c510..7efbee9dd00b1e74f8c757538328436d39915c7d 100644 --- a/core/src/main/java/jenkins/util/HttpSessionListener.java +++ b/core/src/main/java/jenkins/util/HttpSessionListener.java @@ -36,7 +36,7 @@ import javax.servlet.http.HttpSessionEvent; * Allows plugins to listen to {@link HttpSession} lifecycle events. * * @author tom.fennelly@gmail.com - * @since TODO + * @since 2.2 */ public abstract class HttpSessionListener implements ExtensionPoint, javax.servlet.http.HttpSessionListener { diff --git a/core/src/main/java/jenkins/util/InterceptingScheduledExecutorService.java b/core/src/main/java/jenkins/util/InterceptingScheduledExecutorService.java new file mode 100644 index 0000000000000000000000000000000000000000..7fdbe6a4926bb6f612cf03b837d68ea6a30b4626 --- /dev/null +++ b/core/src/main/java/jenkins/util/InterceptingScheduledExecutorService.java @@ -0,0 +1,67 @@ +/* + * The MIT License + * + * Copyright 2017 CloudBees, Inc. + * + * 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.util; + +import java.util.concurrent.Callable; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.TimeUnit; + +/** + * Generalization of {@link InterceptingExecutorService} to scheduled services. + * @since 2.51 + */ +public abstract class InterceptingScheduledExecutorService extends InterceptingExecutorService implements ScheduledExecutorService { + + protected InterceptingScheduledExecutorService(ScheduledExecutorService base) { + super(base); + } + + @Override + protected ScheduledExecutorService delegate() { + return (ScheduledExecutorService) super.delegate(); + } + + @Override + public ScheduledFuture schedule(Runnable command, long delay, TimeUnit unit) { + return delegate().schedule(wrap(command), delay, unit); + } + + @Override + public ScheduledFuture schedule(Callable callable, long delay, TimeUnit unit) { + return delegate().schedule(wrap(callable), delay, unit); + } + + @Override + public ScheduledFuture scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit) { + return delegate().scheduleAtFixedRate(wrap(command), initialDelay, period, unit); + } + + @Override + public ScheduledFuture scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit) { + return delegate().scheduleWithFixedDelay(wrap(command), initialDelay, delay, unit); + } + +} diff --git a/core/src/main/java/jenkins/util/JSONSignatureValidator.java b/core/src/main/java/jenkins/util/JSONSignatureValidator.java index 73f9dd0a2696aefc273ef77056a31bdcf29400a0..865a7b9917645791b056667ade8c85456373dc45 100644 --- a/core/src/main/java/jenkins/util/JSONSignatureValidator.java +++ b/core/src/main/java/jenkins/util/JSONSignatureValidator.java @@ -143,10 +143,9 @@ public class JSONSignatureValidator { if (cert.endsWith("/") || cert.endsWith(".txt")) { continue; // skip directories also any text files that are meant to be documentation } - InputStream in = j.servletContext.getResourceAsStream(cert); - if (in == null) continue; // our test for paths ending in / should prevent this from happening Certificate certificate; - try { + try (InputStream in = j.servletContext.getResourceAsStream(cert)) { + if (in == null) continue; // our test for paths ending in / should prevent this from happening certificate = cf.generateCertificate(in); } catch (CertificateException e) { LOGGER.log(Level.WARNING, String.format("Webapp resources in /WEB-INF/update-center-rootCAs are " @@ -155,8 +154,6 @@ public class JSONSignatureValidator { + "resource for now.", cert), e); continue; - } finally { - in.close(); } try { TrustAnchor certificateAuthority = new TrustAnchor((X509Certificate) certificate, null); diff --git a/core/src/main/java/jenkins/util/JenkinsJVM.java b/core/src/main/java/jenkins/util/JenkinsJVM.java index dce80915f358061cd283de220bdf4682e7524fc4..f8e37a79a15cfa401fc3711a5ddef0adaa7d6dfb 100644 --- a/core/src/main/java/jenkins/util/JenkinsJVM.java +++ b/core/src/main/java/jenkins/util/JenkinsJVM.java @@ -9,7 +9,7 @@ import org.kohsuke.accmod.restrictions.NoExternalUse; /** * A utility class to identify if the current JVM is the one that is running {@link Jenkins} * - * @since TODO + * @since 1.653 */ public class JenkinsJVM { /** diff --git a/core/src/main/java/jenkins/util/ProgressiveRendering.java b/core/src/main/java/jenkins/util/ProgressiveRendering.java index 22afed60d6eb6273441f59f474208493e3e5b131..77582d74cef238479bce8f0dc445a33440448120 100644 --- a/core/src/main/java/jenkins/util/ProgressiveRendering.java +++ b/core/src/main/java/jenkins/util/ProgressiveRendering.java @@ -24,7 +24,7 @@ package jenkins.util; -import edu.umd.cs.findbugs.annotations.SuppressWarnings; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.lang.reflect.Field; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; diff --git a/core/src/main/java/jenkins/util/ResourceBundleUtil.java b/core/src/main/java/jenkins/util/ResourceBundleUtil.java index a62c3fa7729d27d49b78f6ed20348f5bc309ef58..b2eee336abc1a262fad51a1ea537c29f53d42e9c 100644 --- a/core/src/main/java/jenkins/util/ResourceBundleUtil.java +++ b/core/src/main/java/jenkins/util/ResourceBundleUtil.java @@ -27,12 +27,16 @@ import net.sf.json.JSONObject; import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.restrictions.NoExternalUse; +import javax.annotation.CheckForNull; import javax.annotation.Nonnull; +import hudson.PluginWrapper; +import java.util.logging.Logger; import java.util.Locale; import java.util.Map; import java.util.MissingResourceException; import java.util.ResourceBundle; import java.util.concurrent.ConcurrentHashMap; +import jenkins.model.Jenkins; /** * Simple {@link java.util.ResourceBundle} utility class. @@ -42,6 +46,7 @@ import java.util.concurrent.ConcurrentHashMap; @Restricted(NoExternalUse.class) public class ResourceBundleUtil { + private static final Logger logger = Logger.getLogger("jenkins.util.ResourceBundle"); private static final Map bundles = new ConcurrentHashMap<>(); private ResourceBundleUtil() { @@ -72,7 +77,23 @@ public class ResourceBundleUtil { return bundleJSON; } - ResourceBundle bundle = ResourceBundle.getBundle(baseName, locale); + ResourceBundle bundle = getBundle(baseName, locale, Jenkins.class.getClassLoader()); + if (bundle == null) { + // Not in Jenkins core. Check the plugins. + Jenkins jenkins = Jenkins.getInstance(); // will never return null + if (jenkins != null) { + for (PluginWrapper plugin : jenkins.getPluginManager().getPlugins()) { + bundle = getBundle(baseName, locale, plugin.classLoader); + if (bundle != null) { + break; + } + } + } + } + if (bundle == null) { + throw new MissingResourceException("Can't find bundle for base name " + + baseName + ", locale " + locale, baseName + "_" + locale, ""); + } bundleJSON = toJSONObject(bundle); bundles.put(bundleKey, bundleJSON); @@ -80,6 +101,30 @@ public class ResourceBundleUtil { return bundleJSON; } + /** + * Get a plugin bundle using the supplied Locale and classLoader + * + * @param baseName The bundle base name. + * @param locale The Locale. + * @param classLoader The classLoader + * @return The bundle JSON. + */ + private static @CheckForNull ResourceBundle getBundle(@Nonnull String baseName, @Nonnull Locale locale, @Nonnull ClassLoader classLoader) { + try { + return ResourceBundle.getBundle(baseName, locale, classLoader); + } catch (MissingResourceException e) { + // fall through and return null. + logger.finer(e.getMessage()); + } + return null; + } + + /** + * Create a JSON representation of a resource bundle + * + * @param bundle The resource bundle. + * @return The bundle JSON. + */ private static JSONObject toJSONObject(@Nonnull ResourceBundle bundle) { JSONObject json = new JSONObject(); for (String key : bundle.keySet()) { diff --git a/core/src/main/java/jenkins/util/SystemProperties.java b/core/src/main/java/jenkins/util/SystemProperties.java index 794e956b1aec0df06cc2d41d34d80d3dbd0fcf7b..c8c318887f02a72a0cd6a9dd7277617c5cbf7a3c 100644 --- a/core/src/main/java/jenkins/util/SystemProperties.java +++ b/core/src/main/java/jenkins/util/SystemProperties.java @@ -32,6 +32,8 @@ import java.util.logging.Logger; import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; + +import jenkins.util.io.OnMaster; import org.apache.commons.lang.StringUtils; import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.restrictions.NoExternalUse; @@ -61,11 +63,11 @@ import org.kohsuke.accmod.restrictions.NoExternalUse; * because {@link EnvVars} is only for build variables, not Jenkins itself variables. * * @author Johannes Ernst - * @since TODO + * @since 2.4 */ //TODO: Define a correct design of this engine later. Should be accessible in libs (remoting, stapler) and Jenkins modules too @Restricted(NoExternalUse.class) -public class SystemProperties implements ServletContextListener { +public class SystemProperties implements ServletContextListener, OnMaster { // this class implements ServletContextListener and is declared in WEB-INF/web.xml /** @@ -88,7 +90,7 @@ public class SystemProperties implements ServletContextListener { * Called by the servlet container to initialize the {@link ServletContext}. */ @Override - @SuppressFBWarnings(value = "ST_WRITE_TO_STATIC_FROM_INSTANCE_METHOD", + @SuppressFBWarnings(value = "ST_WRITE_TO_STATIC_FROM_INSTANCE_METHOD", justification = "Currently Jenkins instance may have one ond only one context") public void contextInitialized(ServletContextEvent event) { theContext = event.getServletContext(); @@ -138,31 +140,49 @@ public class SystemProperties implements ServletContextListener { * @param key the name of the system property. * @param def a default value. * @return the string value of the system property, - * or {@code null} if the the property is missing and the default value is {@code null}. + * or {@code null} if the property is missing and the default value is {@code null}. * * @exception NullPointerException if {@code key} is {@code null}. * @exception IllegalArgumentException if {@code key} is empty. */ public static String getString(String key, @CheckForNull String def) { + return getString(key, def, Level.CONFIG); + } + + /** + * Gets the system property indicated by the specified key, or a default value. + * This behaves just like {@link System#getProperty(java.lang.String, java.lang.String)}, except + * that it also consults the {@link ServletContext}'s "init" parameters. + * + * @param key the name of the system property. + * @param def a default value. + * @param logLevel the level of the log if the provided key is not found. + * @return the string value of the system property, + * or {@code null} if the property is missing and the default value is {@code null}. + * + * @exception NullPointerException if {@code key} is {@code null}. + * @exception IllegalArgumentException if {@code key} is empty. + */ + public static String getString(String key, @CheckForNull String def, Level logLevel) { String value = System.getProperty(key); // keep passing on any exceptions if (value != null) { - if (LOGGER.isLoggable(Level.CONFIG)) { - LOGGER.log(Level.CONFIG, "Property (system): {0} => {1}", new Object[] {key, value}); + if (LOGGER.isLoggable(logLevel)) { + LOGGER.log(logLevel, "Property (system): {0} => {1}", new Object[] {key, value}); } return value; } value = tryGetValueFromContext(key); if (value != null) { - if (LOGGER.isLoggable(Level.CONFIG)) { - LOGGER.log(Level.CONFIG, "Property (context): {0} => {1}", new Object[]{key, value}); + if (LOGGER.isLoggable(logLevel)) { + LOGGER.log(logLevel, "Property (context): {0} => {1}", new Object[]{key, value}); } return value; } value = def; - if (LOGGER.isLoggable(Level.CONFIG)) { - LOGGER.log(Level.CONFIG, "Property (default): {0} => {1}", new Object[] {key, value}); + if (LOGGER.isLoggable(logLevel)) { + LOGGER.log(logLevel, "Property (default): {0} => {1}", new Object[] {key, value}); } return value; } @@ -238,6 +258,24 @@ public class SystemProperties implements ServletContextListener { return getInteger(name, null); } + /** + * Determines the integer value of the system property with the + * specified name, or a default value. + * + * This behaves just like Integer.getInteger(String,Integer), except that it + * also consults the ServletContext's "init" parameters. If neither exist, + * return the default value. + * + * @param name property name. + * @param def a default value. + * @return the {@code Integer} value of the property. + * If the property is missing, return the default value. + * Result may be {@code null} only if the default value is {@code null}. + */ + public static Integer getInteger(String name, Integer def) { + return getInteger(name, def, Level.CONFIG); + } + /** * Determines the integer value of the system property with the * specified name, or a default value. @@ -248,11 +286,12 @@ public class SystemProperties implements ServletContextListener { * * @param name property name. * @param def a default value. + * @param logLevel the level of the log if the provided system property name cannot be decoded into Integer. * @return the {@code Integer} value of the property. * If the property is missing, return the default value. * Result may be {@code null} only if the default value is {@code null}. */ - public static Integer getInteger(String name, Integer def) { + public static Integer getInteger(String name, Integer def, Level logLevel) { String v = getString(name); if (v != null) { @@ -260,8 +299,8 @@ public class SystemProperties implements ServletContextListener { return Integer.decode(v); } catch (NumberFormatException e) { // Ignore, fallback to default - if (LOGGER.isLoggable(Level.CONFIG)) { - LOGGER.log(Level.CONFIG, "Property. Value is not integer: {0} => {1}", new Object[] {name, v}); + if (LOGGER.isLoggable(logLevel)) { + LOGGER.log(logLevel, "Property. Value is not integer: {0} => {1}", new Object[] {name, v}); } } } @@ -282,7 +321,25 @@ public class SystemProperties implements ServletContextListener { public static Long getLong(String name) { return getLong(name, null); } - + + /** + * Determines the integer value of the system property with the + * specified name, or a default value. + * + * This behaves just like Long.getLong(String,Long), except that it + * also consults the ServletContext's "init" parameters. If neither exist, + * return the default value. + * + * @param name property name. + * @param def a default value. + * @return the {@code Long} value of the property. + * If the property is missing, return the default value. + * Result may be {@code null} only if the default value is {@code null}. + */ + public static Long getLong(String name, Long def) { + return getLong(name, def, Level.CONFIG); + } + /** * Determines the integer value of the system property with the * specified name, or a default value. @@ -293,11 +350,12 @@ public class SystemProperties implements ServletContextListener { * * @param name property name. * @param def a default value. + * @param logLevel the level of the log if the provided system property name cannot be decoded into Long. * @return the {@code Long} value of the property. * If the property is missing, return the default value. * Result may be {@code null} only if the default value is {@code null}. */ - public static Long getLong(String name, Long def) { + public static Long getLong(String name, Long def, Level logLevel) { String v = getString(name); if (v != null) { @@ -305,8 +363,8 @@ public class SystemProperties implements ServletContextListener { return Long.decode(v); } catch (NumberFormatException e) { // Ignore, fallback to default - if (LOGGER.isLoggable(Level.CONFIG)) { - LOGGER.log(Level.CONFIG, "Property. Value is not long: {0} => {1}", new Object[] {name, v}); + if (LOGGER.isLoggable(logLevel)) { + LOGGER.log(logLevel, "Property. Value is not long: {0} => {1}", new Object[] {name, v}); } } } diff --git a/core/src/main/java/jenkins/util/Timer.java b/core/src/main/java/jenkins/util/Timer.java index 27870fd26babf9cba879ad957851d2ee75275ff4..b452efa0622cafe7377043d71309a226ef7d5603 100644 --- a/core/src/main/java/jenkins/util/Timer.java +++ b/core/src/main/java/jenkins/util/Timer.java @@ -1,9 +1,11 @@ package jenkins.util; +import hudson.security.ACL; import hudson.util.DaemonThreadFactory; import hudson.util.NamingThreadFactory; import javax.annotation.Nonnull; import java.util.concurrent.ScheduledExecutorService; +import jenkins.security.ImpersonatingScheduledExecutorService; /** * Holds the {@link ScheduledExecutorService} for running all background tasks in Jenkins. @@ -39,7 +41,8 @@ public class Timer { if (executorService == null) { // corePoolSize is set to 10, but will only be created if needed. // ScheduledThreadPoolExecutor "acts as a fixed-sized pool using corePoolSize threads" - executorService = new ErrorLoggingScheduledThreadPoolExecutor(10, new NamingThreadFactory(new DaemonThreadFactory(), "jenkins.util.Timer")); + // TODO consider also wrapping in ContextResettingExecutorService + executorService = new ImpersonatingScheduledExecutorService(new ErrorLoggingScheduledThreadPoolExecutor(10, new NamingThreadFactory(new DaemonThreadFactory(), "jenkins.util.Timer")), ACL.SYSTEM); } return executorService; } diff --git a/core/src/main/java/jenkins/util/io/OnMaster.java b/core/src/main/java/jenkins/util/io/OnMaster.java index dccd02d6ceb312079cbd44916360e5a5991045da..e8006d6b890bd2d89478f67de875794f5e684255 100644 --- a/core/src/main/java/jenkins/util/io/OnMaster.java +++ b/core/src/main/java/jenkins/util/io/OnMaster.java @@ -16,4 +16,36 @@ package jenkins.util.io; * @since 1.475 */ public interface OnMaster { +// TODO uncomment once we can have a delegating ClassFilter, also add SystemProperty to toggle feature +// @Extension +// @Restricted(NoExternalUse.class) +// class ChannelConfiguratorImpl extends ChannelConfigurator { +// @Override +// public void onChannelBuilding(ChannelBuilder builder, @Nullable Object context) { +// if (context instanceof SlaveComputer) { +// builder.withClassFilter(new ClassFilterImpl(builder.getClassFilter(), OnMaster.class.getName, ...)); +// } +// } +// } +// +// @Restricted(NoExternalUse.class) +// class ClassFilterImpl extends ClassFilter { +// private final ClassFilter delegate; +// private final Set blacklist; +// +// public ClassFilterImpl(ClassFilter delegate, String... blacklist) { +// this.blacklist = new HashSet<>(blacklist); +// this.delegate = delegate; +// } +// +// @Override +// protected boolean isBlacklisted(String name) { +// return blacklist.contains(name) || delegate.isBlacklisted(name); +// } +// +// @Override +// protected boolean isBlacklisted(Class c) { +// return c.getAnnotation(MasterJVMOnly.class) != null || delegate.isBlacklisted(c); +// } +// } } diff --git a/core/src/main/java/jenkins/util/xstream/XStreamDOM.java b/core/src/main/java/jenkins/util/xstream/XStreamDOM.java index 4fa5e4d04c9b35d836507a3c809225b94f538d27..41603b5179940306aa95fa40f4c970fc6dc698ca 100644 --- a/core/src/main/java/jenkins/util/xstream/XStreamDOM.java +++ b/core/src/main/java/jenkins/util/xstream/XStreamDOM.java @@ -35,7 +35,7 @@ import com.thoughtworks.xstream.io.xml.AbstractXmlReader; import com.thoughtworks.xstream.io.xml.AbstractXmlWriter; import com.thoughtworks.xstream.io.xml.DocumentReader; import com.thoughtworks.xstream.io.xml.XmlFriendlyReplacer; -import com.thoughtworks.xstream.io.xml.XppDriver; +import com.thoughtworks.xstream.io.xml.Xpp3Driver; import hudson.Util; import hudson.util.VariableResolver; @@ -241,11 +241,11 @@ public class XStreamDOM { * Writes this {@link XStreamDOM} into {@link OutputStream}. */ public void writeTo(OutputStream os) { - writeTo(new XppDriver().createWriter(os)); + writeTo(new Xpp3Driver().createWriter(os)); } public void writeTo(Writer w) { - writeTo(new XppDriver().createWriter(w)); + writeTo(new Xpp3Driver().createWriter(w)); } public void writeTo(HierarchicalStreamWriter w) { @@ -262,11 +262,11 @@ public class XStreamDOM { } public static XStreamDOM from(InputStream in) { - return from(new XppDriver().createReader(in)); + return from(new Xpp3Driver().createReader(in)); } public static XStreamDOM from(Reader in) { - return from(new XppDriver().createReader(in)); + return from(new Xpp3Driver().createReader(in)); } public static XStreamDOM from(HierarchicalStreamReader in) { diff --git a/core/src/main/java/jenkins/widgets/HistoryPageFilter.java b/core/src/main/java/jenkins/widgets/HistoryPageFilter.java index bc350c6ee401810bca8f7f0b402f0521a728c45e..269f5e44fc45ba5c3c718a1d9825ba9054adc19e 100644 --- a/core/src/main/java/jenkins/widgets/HistoryPageFilter.java +++ b/core/src/main/java/jenkins/widgets/HistoryPageFilter.java @@ -25,9 +25,13 @@ package jenkins.widgets; import com.google.common.collect.Iterables; import com.google.common.collect.Iterators; +import hudson.model.AbstractBuild; import hudson.model.Job; +import hudson.model.ParameterValue; +import hudson.model.ParametersAction; import hudson.model.Queue; import hudson.model.Run; +import hudson.search.UserSearchProperty; import hudson.widgets.HistoryWidget; import javax.annotation.Nonnull; @@ -37,6 +41,7 @@ import java.util.Comparator; import java.util.Iterator; import java.util.LinkedList; import java.util.List; +import java.util.Map; /** * History page filter. @@ -52,8 +57,8 @@ public class HistoryPageFilter { // Need to use different Lists for Queue.Items and Runs because // we need access to them separately in the jelly files for rendering. - public final List> queueItems = new ArrayList>(); - public final List> runs = new ArrayList>(); + public final List> queueItems = new ArrayList<>(); + public final List> runs = new ArrayList<>(); public boolean hasUpPage = false; // there are newer builds than on this page public boolean hasDownPage = false; // there are older builds than on this page @@ -117,7 +122,7 @@ public class HistoryPageFilter { * Add build items to the History page. * * @param runItems The items to be added. Assumes the items are in descending queue ID order i.e. newest first. - * @since TODO + * @since 2.17 */ public void add(@Nonnull Iterable runItems) { addInternal(runItems); @@ -128,7 +133,7 @@ public class HistoryPageFilter { * * @param runItems The items to be added. Assumes the items are in descending queue ID order i.e. newest first. * @param queueItems The queue items to be added. Queue items do not need to be sorted. - * @since TODO + * @since 2.17 */ public void add(@Nonnull Iterable runItems, @Nonnull List queueItems) { sort(queueItems); @@ -343,6 +348,13 @@ public class HistoryPageFilter { return true; } else if (fitsSearchString(run.getResult())) { return true; + } else if (run instanceof AbstractBuild && fitsSearchBuildVariables((AbstractBuild) run)) { + return true; + } else { + ParametersAction parametersAction = run.getAction(ParametersAction.class); + if (parametersAction != null && fitsSearchBuildParameters(parametersAction)) { + return true; + } } // Non of the fuzzy matches "liked" the search term. @@ -354,14 +366,38 @@ public class HistoryPageFilter { return true; } - if (data != null) { - if (data instanceof Number) { - return data.toString().equals(searchString); + if (data == null) { + return false; + } + + if (data instanceof Number) { + return data.toString().equals(searchString); + } else { + if (UserSearchProperty.isCaseInsensitive()) { + return data.toString().toLowerCase().contains(searchString.toLowerCase()); } else { - return data.toString().toLowerCase().contains(searchString); + return data.toString().contains(searchString); + } + } + } + + private boolean fitsSearchBuildVariables(AbstractBuild runAsBuild) { + Map buildVariables = runAsBuild.getBuildVariables(); + for (String paramsValues : buildVariables.values()) { + if (fitsSearchString(paramsValues)) { + return true; } } - return false; - } + } + + private boolean fitsSearchBuildParameters(ParametersAction parametersAction) { + List parameters = parametersAction.getParameters(); + for (ParameterValue parameter : parameters) { + if (!parameter.isSensitive() && fitsSearchString(parameter.getValue())) { + return true; + } + } + return false; + } } diff --git a/core/src/main/resources/META-INF/upgrade/Functions.hint b/core/src/main/resources/META-INF/upgrade/Functions.hint new file mode 100644 index 0000000000000000000000000000000000000000..149d172c4b446635b006450ad0678b30b5d88c37 --- /dev/null +++ b/core/src/main/resources/META-INF/upgrade/Functions.hint @@ -0,0 +1,2 @@ +$t.printStackTrace($s) :: $s instance java.io.PrintStream && $t instanceof Throwable => hudson.Functions.printStackTrace($t, $s);; +$t.printStackTrace($s) :: $s instance java.io.PrintWriter && $t instanceof Throwable => hudson.Functions.printStackTrace($t, $s);; diff --git a/core/src/main/resources/hudson/AboutJenkins/index.properties b/core/src/main/resources/hudson/AboutJenkins/index.properties index 5bb26ae164d2524d950c4432aa8b4765c6911083..33e9a29740aab4f45f185bd692c0af4e3f3d88b9 100644 --- a/core/src/main/resources/hudson/AboutJenkins/index.properties +++ b/core/src/main/resources/hudson/AboutJenkins/index.properties @@ -21,7 +21,7 @@ # THE SOFTWARE. about=About Jenkins {0} -blurb=Jenkins is a community-developed open-source automation server. +blurb=Jenkins is a community-developed open-source automation server. dependencies=Jenkins depends on the following 3rd party libraries plugin.dependencies=License and dependency information for plugins diff --git a/core/src/main/resources/hudson/AboutJenkins/index_cs.properties b/core/src/main/resources/hudson/AboutJenkins/index_cs.properties index 5d65f6c53b378e0e48385be4c7de0349fed57bbd..c31e32c1605ad9875e5b38c17d9ffb436ad51647 100644 --- a/core/src/main/resources/hudson/AboutJenkins/index_cs.properties +++ b/core/src/main/resources/hudson/AboutJenkins/index_cs.properties @@ -1,4 +1,4 @@ # This file is under the MIT License by authors -blurb=Jenkins je komunitou vyv\u00EDjen\u00FD server pr\u016Fb\u011B\u017En\u00E9 integrace s otev\u0159en\u00FDm zdrojov\u00FDm k\u00F3dem. +blurb=Jenkins je komunitou vyv\u00EDjen\u00FD server pr\u016Fb\u011B\u017En\u00E9 integrace s otev\u0159en\u00FDm zdrojov\u00FDm k\u00F3dem. dependencies=Jenkins z\u00E1vis\u00ED na n\u00E1sleduj\u00EDc\u00EDch knihovn\u00E1ch 3. stran. diff --git a/core/src/main/resources/hudson/AboutJenkins/index_da.properties b/core/src/main/resources/hudson/AboutJenkins/index_da.properties index fad72531968eb5e1bffd0d4b6a68e8447d9215f0..a97dcba293b24aa05b70a23d5bf0b6a000b07ca8 100644 --- a/core/src/main/resources/hudson/AboutJenkins/index_da.properties +++ b/core/src/main/resources/hudson/AboutJenkins/index_da.properties @@ -21,5 +21,5 @@ # THE SOFTWARE. about=Om Jenkins {0} -blurb=Jenkins er en f\u00E6llesskab udviklede open-source continuous integration server. +blurb=Jenkins er en f\u00E6llesskab udviklede open-source continuous integration server. dependencies=Jenkins afh\u00E6nger af de f\u00F8lgende 3. parts libraries diff --git a/core/src/main/resources/hudson/AboutJenkins/index_de.properties b/core/src/main/resources/hudson/AboutJenkins/index_de.properties index c35a151a6d395051ce77a07c09351af91a9a1d08..1d0626fd82e85ebd299ea7825c5899c909b33b16 100644 --- a/core/src/main/resources/hudson/AboutJenkins/index_de.properties +++ b/core/src/main/resources/hudson/AboutJenkins/index_de.properties @@ -21,7 +21,7 @@ # THE SOFTWARE. about=\u00DCber Jenkins {0} -blurb=Jenkins ist ein Open Source Continuous Integration Server. +blurb=Jenkins ist ein Open Source Continuous Integration Server. dependencies=Jenkins benutzt folgende Dritthersteller-Bibliotheken. No\ information\ recorded=Keine Informationen verf\u00FCgbar diff --git a/core/src/main/resources/hudson/AboutJenkins/index_es.properties b/core/src/main/resources/hudson/AboutJenkins/index_es.properties index c86fbea162d2ea59ff401e5b05de9a08de6fd746..d58fbc63eb1ea998b35d23c7c0a86030bb757af8 100644 --- a/core/src/main/resources/hudson/AboutJenkins/index_es.properties +++ b/core/src/main/resources/hudson/AboutJenkins/index_es.properties @@ -21,5 +21,5 @@ # THE SOFTWARE. about=Acerca de Jenkins {0} -blurb=Jenkins un servidor de Integraci\u00F3n Cont\u00EDnua, de c\u00F3digo abierto y desarrollado en comunidad. +blurb=Jenkins un servidor de Integraci\u00F3n Cont\u00EDnua, de c\u00F3digo abierto y desarrollado en comunidad. dependencies=Jenkins depende de las siguientes librerias de terceros. diff --git a/core/src/main/resources/hudson/AboutJenkins/index_fi.properties b/core/src/main/resources/hudson/AboutJenkins/index_fi.properties index a182a18565cfaa3d9ce99b252ada6b5bebd7ef39..7f78e833b9665359bc05278ddf02845fd92e613c 100644 --- a/core/src/main/resources/hudson/AboutJenkins/index_fi.properties +++ b/core/src/main/resources/hudson/AboutJenkins/index_fi.properties @@ -21,5 +21,5 @@ # THE SOFTWARE. about=Tietoja Jenkinsist\u00E4 {0} -blurb=Jenkins on yhteis\u00F6kehitteinen, avoimen l\u00E4hdekoodin jatkuvan integroinnin palvelinohjelmisto +blurb=Jenkins on yhteis\u00F6kehitteinen, avoimen l\u00E4hdekoodin jatkuvan integroinnin palvelinohjelmisto dependencies=Jenkins k\u00E4ytt\u00E4\u00E4 seuraavia kolmannen osapuolen kirjastoja diff --git a/core/src/main/resources/hudson/AboutJenkins/index_fr.properties b/core/src/main/resources/hudson/AboutJenkins/index_fr.properties index e58703411e2c0fe5b7937b0bf0158b0c7373148a..d4d9f46e1158bc0b6c08dae9380b36c9ac01ffff 100644 --- a/core/src/main/resources/hudson/AboutJenkins/index_fr.properties +++ b/core/src/main/resources/hudson/AboutJenkins/index_fr.properties @@ -21,7 +21,7 @@ # THE SOFTWARE. about=A propos de Jenkins {0} -blurb=Jenkins est un serveur d''int\u00e9gration continue d\u00e9velopp\u00e9 par la communaut\u00e9 open-source. +blurb=Jenkins est un serveur d''int\u00e9gration continue d\u00e9velopp\u00e9 par la communaut\u00e9 open-source. dependencies=Jenkins d\u00e9pend des librairies externes suivantes plugin.dependencies=Licence et informations de d\u00e9pendance pour les plugins : diff --git a/core/src/main/resources/hudson/AboutJenkins/index_hu.properties b/core/src/main/resources/hudson/AboutJenkins/index_hu.properties index 2d047c885b71bb359116e96d0e6a6d3c6256b19a..d9057950b37feefcacfefd754e8ae52e7415a165 100644 --- a/core/src/main/resources/hudson/AboutJenkins/index_hu.properties +++ b/core/src/main/resources/hudson/AboutJenkins/index_hu.properties @@ -1,5 +1,5 @@ # This file is under the MIT License by authors about=Jenkins {0} N\u00E9vjegye -blurb=Jenkins egy k\u00F6z\u00F6ss\u00E9gi fejleszt\u00E9s\u0171, ny\u00EDlt forr\u00E1s\u00FA CI szerver. +blurb=Jenkins egy k\u00F6z\u00F6ss\u00E9gi fejleszt\u00E9s\u0171, ny\u00EDlt forr\u00E1s\u00FA CI szerver. dependencies=Jenking a k\u00F6vetkez\u0151 3. f\u00E9lt\u0151l sz\u00E1rmaz\u00F3 k\u00F6nyvt\u00E1rakt\u00F3l f\u00FCgg. diff --git a/core/src/main/resources/hudson/AboutJenkins/index_it.properties b/core/src/main/resources/hudson/AboutJenkins/index_it.properties index f4b786b035562f1c56aa80d37f5b38c42eb1e11a..22a3db714d2d186c5d93f8a24c4652013260d440 100644 --- a/core/src/main/resources/hudson/AboutJenkins/index_it.properties +++ b/core/src/main/resources/hudson/AboutJenkins/index_it.properties @@ -1,5 +1,5 @@ # This file is under the MIT License by authors about=Informazioni su Jenkins {0} -blurb=Jenkins \u00E8 un server di "continuous integration" a codice aperto sviluppato da una comunit\u00E0. +blurb=Jenkins \u00E8 un server di "continuous integration" a codice aperto sviluppato da una comunit\u00E0. dependencies=Jenkins dipende dalle seguenti librerie di terze parti. diff --git a/core/src/main/resources/hudson/AboutJenkins/index_ja.properties b/core/src/main/resources/hudson/AboutJenkins/index_ja.properties index d4c5b5f961cf8413c56129aceae2ba1bd827b1ec..5f4a40a4c0d164fa1fb9e2e354a723a2c344be1c 100644 --- a/core/src/main/resources/hudson/AboutJenkins/index_ja.properties +++ b/core/src/main/resources/hudson/AboutJenkins/index_ja.properties @@ -21,7 +21,7 @@ # THE SOFTWARE. about=Jenkins {0} \u306b\u3064\u3044\u3066 -blurb=Jenkins \u306f\u30b3\u30df\u30e5\u30cb\u30c6\u30a3\u3067\u958b\u767a\u3055\u308c\u3066\u3044\u308b\u30aa\u30fc\u30d7\u30f3\u30bd\u30fc\u30b9\u306eCI\u30b5\u30fc\u30d0\u3067\u3059\u3002 +blurb=Jenkins \u306f\u30b3\u30df\u30e5\u30cb\u30c6\u30a3\u3067\u958b\u767a\u3055\u308c\u3066\u3044\u308b\u30aa\u30fc\u30d7\u30f3\u30bd\u30fc\u30b9\u306eCI\u30b5\u30fc\u30d0\u3067\u3059\u3002 dependencies=Jenkins \u306F\u6B21\u306E\u30B5\u30FC\u30C9\u30D1\u30FC\u30C6\u30A3\u306E\u30E9\u30A4\u30D6\u30E9\u30EA\u3092\u4F7F\u7528\u3057\u3066\u3044\u307E\u3059\u3002 plugin.dependencies=\u30d7\u30e9\u30b0\u30a4\u30f3\u306e\u30e9\u30a4\u30bb\u30f3\u30b9\u3068\u4f9d\u5b58\u6027: diff --git a/core/src/main/resources/hudson/AboutJenkins/index_lt.properties b/core/src/main/resources/hudson/AboutJenkins/index_lt.properties index e99d3c32feffff31f032939f641196a23a129982..a46c3ea780b5564c9ecee8167a284e4f2792ea39 100644 --- a/core/src/main/resources/hudson/AboutJenkins/index_lt.properties +++ b/core/src/main/resources/hudson/AboutJenkins/index_lt.properties @@ -1,5 +1,5 @@ about=Apie Jenkins {0} -blurb=Jenkins - bendruomen\u0117s kuriamas atviro kodo pastovios integracijos (CIS) serveris. +blurb=Jenkins - bendruomen\u0117s kuriamas atviro kodo pastovios integracijos (CIS) serveris. dependencies=Jenkins priklauso nuo \u0161i\u0173 3-\u0173j\u0173 \u0161ali\u0173 bibliotek\u0173. plugin.dependencies=Pried\u0173 licencijos ir priklausomybi\u0173 informacija static.dependencies=Statiniai resursai diff --git a/core/src/main/resources/hudson/AboutJenkins/index_nb_NO.properties b/core/src/main/resources/hudson/AboutJenkins/index_nb_NO.properties index 1cd9084adcb4dfb73408cd09008db29861aab113..fdd1020a6c5554be3c7b34556492291c9c081994 100644 --- a/core/src/main/resources/hudson/AboutJenkins/index_nb_NO.properties +++ b/core/src/main/resources/hudson/AboutJenkins/index_nb_NO.properties @@ -21,5 +21,5 @@ # THE SOFTWARE. about=Om Jenkins -blurb=Jenkins er en fellesskaps-utviklet, \u00E5pen kildekode kontinuerlig integrasjonsserver. +blurb=Jenkins er en fellesskaps-utviklet, \u00E5pen kildekode kontinuerlig integrasjonsserver. dependencies=Jenkins benytter f\u00F8lgende tredjeparts-biblioteker. diff --git a/core/src/main/resources/hudson/AboutJenkins/index_pl.properties b/core/src/main/resources/hudson/AboutJenkins/index_pl.properties index 41b9fec9383895e6ebe7c54f938c4f66a035f516..3fc4d0a8c865d00857d30114acc68fb520d44277 100644 --- a/core/src/main/resources/hudson/AboutJenkins/index_pl.properties +++ b/core/src/main/resources/hudson/AboutJenkins/index_pl.properties @@ -1,6 +1,26 @@ -# This file is under the MIT License by authors - +# The MIT License +# +# Copyright (c) 2017, Damian Szczepanik +# +# 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. about=O Jenkinsie {0} -blurb=Jenkins jest rozwijanym przez spo\u0142eczno\u015B\u0107 open-source serwerem Continuous Integration +blurb=Jenkins jest rozwijanym przez spo\u0142eczno\u015B\u0107 open-source serwerem Continuous Integration dependencies=Jenkins jest oparty na nast\u0119puj\u0105cych zewn\u0119trznych bibliotekach: plugin.dependencies=Informacja o licencji i zale\u017Cno\u015Bci plugin\u00F3w: +static.dependencies=Statyczne zasoby diff --git a/core/src/main/resources/hudson/AboutJenkins/index_pt_BR.properties b/core/src/main/resources/hudson/AboutJenkins/index_pt_BR.properties index 1b3eae7474509d8f307d9c58d503fe7d16ed5630..9f6b73ebfa34e3bd56bbb41a0e8fab8a19f65819 100644 --- a/core/src/main/resources/hudson/AboutJenkins/index_pt_BR.properties +++ b/core/src/main/resources/hudson/AboutJenkins/index_pt_BR.properties @@ -21,7 +21,7 @@ # THE SOFTWARE. about=Sobre o Jenkins {0} -blurb=Jenkins \u00E9 um servidor de aplica\u00E7\u00E3o cont\u00EDnua desenvolvido em modo open-source pela comunidade. +blurb=Jenkins \u00E9 um servidor de aplica\u00E7\u00E3o cont\u00EDnua desenvolvido em modo open-source pela comunidade. dependencies=Jenkins depende das seguintes depend\u00EAncias de terceiros: No\ information\ recorded=Nenhuma informa\u00e7\u00e3o registrada # License and dependency information for plugins: diff --git a/core/src/main/resources/hudson/AboutJenkins/index_ru.properties b/core/src/main/resources/hudson/AboutJenkins/index_ru.properties index 295096a45350bf958b621207fd0c40ac428a2e39..5512833e3eeb2177672f857e2da44ab27d41aa4e 100644 --- a/core/src/main/resources/hudson/AboutJenkins/index_ru.properties +++ b/core/src/main/resources/hudson/AboutJenkins/index_ru.properties @@ -21,6 +21,6 @@ # THE SOFTWARE. about=\u041E Jenkins {0} -blurb=Jenkins \u0441\u0435\u0440\u0432\u0435\u0440 \u043D\u0435\u043F\u0440\u0435\u0440\u044B\u0432\u043D\u043E\u0439 \u0438\u043D\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u0441 \u043E\u0442\u043A\u0440\u044B\u0442\u044B\u043C \u0438\u0441\u0445\u043E\u0434\u043D\u044B\u043C \u043A\u043E\u0434\u043E\u043C. +blurb=Jenkins \u0441\u0435\u0440\u0432\u0435\u0440 \u043D\u0435\u043F\u0440\u0435\u0440\u044B\u0432\u043D\u043E\u0439 \u0438\u043D\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u0441 \u043E\u0442\u043A\u0440\u044B\u0442\u044B\u043C \u0438\u0441\u0445\u043E\u0434\u043D\u044B\u043C \u043A\u043E\u0434\u043E\u043C. dependencies=Jenkins \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442 \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0438\u0435 \u0441\u0442\u043E\u0440\u043E\u043D\u043D\u0438\u0435 \u0431\u0438\u0431\u043B\u0438\u043E\u0442\u0435\u043A\u0438. plugin.dependencies=\u0418\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u044F \u043E \u043B\u0438\u0446\u0435\u043D\u0437\u0438\u044F\u0445 \u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043C\u043E\u0441\u0442\u044F\u0445 \u043F\u043B\u0430\u0433\u0438\u043D\u043E\u0432: diff --git a/core/src/main/resources/hudson/AboutJenkins/index_sr.properties b/core/src/main/resources/hudson/AboutJenkins/index_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..5c3d7a7bbf5a765c270269e490be5ab7d9531ef3 --- /dev/null +++ b/core/src/main/resources/hudson/AboutJenkins/index_sr.properties @@ -0,0 +1,8 @@ +# This file is under the MIT License by authors + +about=\u041E Jenkins-\u0443 {0} +blurb=Jenkins \u0441\u0435\u0440\u0432\u0435\u0440 \u0437\u0430 \u043A\u043E\u043D\u0442\u0438\u043D\u0443\u0438\u0440\u0430\u043D\u0443 \u0438\u043D\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0458\u0443 \u0441\u0430 \u043E\u0442\u0432\u043E\u0440\u0435\u043D\u0438\u043C \u0438\u0437\u0432\u043E\u0440\u043D\u0438\u043C \u043A\u043E\u0434\u043E\u043C. +dependencies=Jenkins \u0437\u0430\u0432\u0438\u0441\u0438 \u043E\u0434 \u0441\u0442\u0440\u0430\u043D\u0438\u0445 \u0431\u0438\u0431\u043B\u0438\u043E\u0442\u0435\u043A\u0430 +No\ information\ recorded=\u041D\u0435\u043C\u0430 \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0458\u0435 +static.dependencies=\u0421\u0442\u0430\u0442\u0443\u0447\u043A\u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u0438 +plugin.dependencies=\u0418\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0458\u0435 \u043E \u043B\u0438\u0446\u0435\u043D\u0446\u0438 \u0438 \u043C\u043E\u0434\u0443\u043B\u0438\u043C\u0430: diff --git a/core/src/main/resources/hudson/AboutJenkins/index_uk.properties b/core/src/main/resources/hudson/AboutJenkins/index_uk.properties index b8d02b4edfc06702cba16e2fb4d566d54e29c3e5..90f70bb94a4424afb59b1c95e119f7b4169c56b8 100644 --- a/core/src/main/resources/hudson/AboutJenkins/index_uk.properties +++ b/core/src/main/resources/hudson/AboutJenkins/index_uk.properties @@ -1,5 +1,5 @@ # This file is under the MIT License by authors about=\u041F\u0440\u043E \u0414\u0436\u0435\u043D\u043A\u0456\u043A\u0441 -blurb=\u0414\u0436\u0435\u043D\u043A\u0456\u043D\u0441 \u0454 \u0441\u0435\u0440\u0432\u0435\u0440\u043E\u043C \u0431\u0435\u0437\u043F\u0435\u0440\u0435\u0440\u0432\u043D\u043E\u0457 \u0456\u043D\u0442\u0435\u0433\u0440\u0430\u0446\u0456\u0457 \u0437 \u0432\u0456\u0434\u043A\u0440\u0438\u0442\u0438\u043C \u043A\u043E\u0434\u043E\u043C \u0440\u043E\u0437\u0440\u043E\u0431\u043B\u044E\u0432\u0430\u043D\u0438\u0439 \u0441\u043F\u0456\u043B\u044C\u043D\u043E\u0442\u043E\u044E. +blurb=\u0414\u0436\u0435\u043D\u043A\u0456\u043D\u0441 \u0454 \u0441\u0435\u0440\u0432\u0435\u0440\u043E\u043C \u0431\u0435\u0437\u043F\u0435\u0440\u0435\u0440\u0432\u043D\u043E\u0457 \u0456\u043D\u0442\u0435\u0433\u0440\u0430\u0446\u0456\u0457 \u0437 \u0432\u0456\u0434\u043A\u0440\u0438\u0442\u0438\u043C \u043A\u043E\u0434\u043E\u043C \u0440\u043E\u0437\u0440\u043E\u0431\u043B\u044E\u0432\u0430\u043D\u0438\u0439 \u0441\u043F\u0456\u043B\u044C\u043D\u043E\u0442\u043E\u044E. dependencies=\u0414\u0436\u0435\u043D\u043A\u0456\u043D\u0441 \u043C\u0430\u0454 \u0437\u0430\u043B\u0435\u0436\u043D\u043E\u0441\u0442\u0456 \u0432\u0456\u0434 \u043D\u0430\u0442\u0443\u043F\u043D\u0438\u0445 diff --git a/core/src/main/resources/hudson/AboutJenkins/index_zh_CN.properties b/core/src/main/resources/hudson/AboutJenkins/index_zh_CN.properties index 713451482a27491e600a007cc6f898881dd15f62..2678d4a34206add1e56c148c711ecc2da26f3cee 100644 --- a/core/src/main/resources/hudson/AboutJenkins/index_zh_CN.properties +++ b/core/src/main/resources/hudson/AboutJenkins/index_zh_CN.properties @@ -21,5 +21,5 @@ # THE SOFTWARE. about=\u5173\u4E8EJenkins{0} -blurb=Jenkins\u662F\u4E00\u4E2A\u57FA\u4E8E\u793E\u533A\u5F00\u53D1\u7684\u5F00\u6E90\u6301\u7EED\u96C6\u6210\u670D\u52A1\u5668 +blurb=Jenkins\u662F\u4E00\u4E2A\u57FA\u4E8E\u793E\u533A\u5F00\u53D1\u7684\u5F00\u6E90\u6301\u7EED\u96C6\u6210\u670D\u52A1\u5668 dependencies=Jenkins\u4F9D\u8D56\u4E8E\u4EE5\u4E0B\u7B2C\u4E09\u65B9\u5E93 diff --git a/core/src/main/resources/hudson/AboutJenkins/index_zh_TW.properties b/core/src/main/resources/hudson/AboutJenkins/index_zh_TW.properties index 8003b81289e9da1cbccae2fe56e04963df5310e5..2b9701f4e24bbf539d9c5be8f56ccf5c024995cc 100644 --- a/core/src/main/resources/hudson/AboutJenkins/index_zh_TW.properties +++ b/core/src/main/resources/hudson/AboutJenkins/index_zh_TW.properties @@ -21,5 +21,5 @@ # THE SOFTWARE. about=\u95DC\u65BC Jenkins {0} -blurb=Jenkins \u662F\u793E\u7FA4\u958B\u767C\u7684\u958B\u653E\u539F\u59CB\u78BC\u6301\u7E8C\u6574\u5408\u4F3A\u670D\u5668\u3002 +blurb=Jenkins \u662F\u793E\u7FA4\u958B\u767C\u7684\u958B\u653E\u539F\u59CB\u78BC\u6301\u7E8C\u6574\u5408\u4F3A\u670D\u5668\u3002 dependencies=Jenkins \u76F8\u4F9D\u65BC\u4E0B\u5217\u7B2C\u4E09\u65B9\u51FD\u5F0F\u5EAB\u3002 diff --git a/core/src/main/resources/hudson/Messages.properties b/core/src/main/resources/hudson/Messages.properties index ec7f6002b40adfbeb934c212f774a51558c24c4a..80ecb8db835f27d6f2e181080c3d696a8e15b1f5 100644 --- a/core/src/main/resources/hudson/Messages.properties +++ b/core/src/main/resources/hudson/Messages.properties @@ -21,7 +21,7 @@ # THE SOFTWARE. FilePath.did_not_manage_to_validate_may_be_too_sl=Did not manage to validate {0} (may be too slow) -FilePath.validateAntFileMask.whitespaceSeprator=\ +FilePath.validateAntFileMask.whitespaceSeparator=\ Whitespace can no longer be used as the separator. Please Use \u2018,\u2019 as the separator instead. FilePath.validateAntFileMask.doesntMatchAndSuggest=\ \u2018{0}\u2019 doesn\u2019t match anything, but \u2018{1}\u2019 does. Perhaps that\u2019s what you mean? @@ -61,6 +61,8 @@ PluginManager.UploadPluginsPermission.Description=\ PluginManager.ConfigureUpdateCenterPermission.Description=\ The "configure update center" permission allows a user to \ configure update sites and proxy settings. +PluginManager.PluginCycleDependenciesMonitor.DisplayName=Cyclic Dependencies Detector +PluginManager.PluginUpdateMonitor.DisplayName=Invalid Plugin Configuration AboutJenkins.DisplayName=About Jenkins AboutJenkins.Description=See the version and license information. @@ -80,4 +82,7 @@ PluginWrapper.disabledAndObsolete={0} v{1} is disabled and older than required. PluginWrapper.disabled={0} is disabled. To fix, enable it. PluginWrapper.obsolete={0} v{1} is older than required. To fix, install v{2} or later. PluginWrapper.obsoleteCore=You must update Jenkins from v{0} to v{1} or later to run this plugin. +PluginWrapper.PluginWrapperAdministrativeMonitor.DisplayName=Plugins Failed To Load + TcpSlaveAgentListener.PingAgentProtocol.displayName=Ping protocol + diff --git a/core/src/main/resources/hudson/Messages_pl.properties b/core/src/main/resources/hudson/Messages_pl.properties index 268459378aee701589c2ab385e99a27a54c17b08..fca6881a879818dd85ac263a0ece0ae7e0444b7b 100644 --- a/core/src/main/resources/hudson/Messages_pl.properties +++ b/core/src/main/resources/hudson/Messages_pl.properties @@ -1,6 +1,6 @@ # The MIT License # -# Copyright (c) 2016, Damian Szczepanik +# Copyright (c) 2016-2017, Damian Szczepanik # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -19,16 +19,17 @@ # 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. - Util.millisecond={0} ms Util.second={0} sek Util.minute={0} min -Util.hour ={0} godz -Util.day ={0} {0,choice,0#dni|1#dzie\u0144|1\u0443 \u0442\u043E\u043A\u0443 \u0438\u043B\u0438 \u043D\u0435\u0443\u0441\u043F\u0435\u0448\u043D\u0438. diff --git a/core/src/main/resources/hudson/PluginManager/installed.jelly b/core/src/main/resources/hudson/PluginManager/installed.jelly index 22ff5f7419877e6c10edb7be60b5121c39a789f5..f2cdc4b13cd09a2ec40be89a1dca1ddbd35f9083 100644 --- a/core/src/main/resources/hudson/PluginManager/installed.jelly +++ b/core/src/main/resources/hudson/PluginManager/installed.jelly @@ -64,7 +64,6 @@ THE SOFTWARE. ${%Name} ${%Version} ${%Previously installed version} - ${%Pinned} ${%Uninstall} @@ -113,12 +112,6 @@ THE SOFTWARE. - - - - - - @@ -153,7 +146,7 @@ THE SOFTWARE.

        Failed : ${p.name}

        -
        +
        ${p.exceptionString}
        @@ -204,18 +197,6 @@ THE SOFTWARE. } updateMsg(); // set the initial state - - function unpin(button,shortName) { - new Ajax.Request("./plugin/"+shortName+"/unpin", { - method: "POST", - onFailure : function(t) { - alert('Failed to unpin:'+t.responseText); - }, - onSuccess : function(t) { - $('unpin-'+shortName).innerHTML = ""; - } - }); - } diff --git a/core/src/main/resources/hudson/PluginManager/installed.properties b/core/src/main/resources/hudson/PluginManager/installed.properties index 2fa0cafb8083f2b150ecd074aeb95ea0321dc2b7..0c1b07c42737b8ee2958fe7c7f1691c9eb8c56b8 100644 --- a/core/src/main/resources/hudson/PluginManager/installed.properties +++ b/core/src/main/resources/hudson/PluginManager/installed.properties @@ -19,6 +19,5 @@ # 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. -wiki.url=http://wiki.jenkins-ci.org/display/JENKINS/Pinned+Plugins downgradeTo=Downgrade to {0} -requires.restart=This Jenkins instance requires a restart. Changing the state of plugins at this time is strongly discouraged. Restart Jenkins before proceeding. \ No newline at end of file +requires.restart=This Jenkins instance requires a restart. Changing the state of plugins at this time is strongly discouraged. Restart Jenkins before proceeding. diff --git a/core/src/main/resources/hudson/PluginManager/installed_bg.properties b/core/src/main/resources/hudson/PluginManager/installed_bg.properties index c950862a63b41df6b8dedcfffb431ff6a6e94386..60dc8c4e29ac354bafffe5de51bec57b6b793d95 100644 --- a/core/src/main/resources/hudson/PluginManager/installed_bg.properties +++ b/core/src/main/resources/hudson/PluginManager/installed_bg.properties @@ -26,8 +26,6 @@ Enabled=\ \u0420\u0430\u0437\u0440\u0435\u0448\u0435\u043d Name=\ \u0418\u043c\u0435 -Pinned=\ - \u0424\u0438\u043a\u0441\u0438\u0440\u0430\u043d\u0430 \u0432\u0435\u0440\u0441\u0438\u044f Previously\ installed\ version=\ \u041f\u0440\u0435\u0434\u0438\u0448\u043d\u043e \u0438\u043d\u0441\u0442\u0430\u043b\u0438\u0440\u0430\u043d\u0430 \u0432\u0435\u0440\u0441\u0438\u044f Restart\ Once\ No\ Jobs\ Are\ Running=\ @@ -36,8 +34,6 @@ Uncheck\ to\ disable\ the\ plugin=\ \u041c\u0430\u0445\u043d\u0435\u0442\u0435 \u043e\u0442\u043c\u0435\u0442\u043a\u0430\u0442\u0430 \u0437\u0430 \u0437\u0430\u0431\u0440\u0430\u043d\u0430 \u043d\u0430 \u043f\u0440\u0438\u0441\u0442\u0430\u0432\u043a\u0430\u0442\u0430 Uninstall=\ \u0414\u0435\u0438\u043d\u0441\u0442\u0430\u043b\u0438\u0440\u0430\u043d\u0435 -Unpin=\ - \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0430 \u0432\u0435\u0440\u0441\u0438\u044f Version=\ \u0412\u0435\u0440\u0441\u0438\u044f downgradeTo=\ @@ -62,8 +58,6 @@ This\ plugin\ cannot\ be\ enabled=\ \u0422\u0430\u0437\u0438 \u043f\u0440\u0438\u0441\u0442\u0430\u0432\u043a\u0430 \u043d\u0435 \u043c\u043e\u0436\u0435 \u0434\u0430 \u0441\u0435 \u0432\u043a\u043b\u044e\u0447\u0438 Filter=\ \u0424\u0438\u043b\u0442\u0440\u0438\u0440\u0430\u043d\u0435 -wiki.url=\ - \u0422\u0430\u0437\u0438 \u043f\u0440\u0438\u0441\u0442\u0430\u0432\u043a\u0430 \u043d\u0435 \u043c\u043e\u0436\u0435 \u0434\u0430 \u0441\u0435 \u0438\u0437\u043a\u043b\u044e\u0447\u0438 requires.restart=\ \u0422\u0440\u044f\u0431\u0432\u0430 \u0434\u0430 \u0440\u0435\u0441\u0442\u0430\u0440\u0442\u0438\u0440\u0430\u0442\u0435 Jenkins, \u043f\u0440\u0435\u0434\u0438 \u0434\u0430 \u043f\u0440\u0430\u0432\u0438\u0442\u0435 \u043f\u043e\u0432\u0435\u0447\u0435 \u043f\u0440\u043e\u043c\u0435\u043d\u0438 \u043f\u043e\ \u043f\u0440\u0438\u0441\u0442\u0430\u0432\u043a\u0438\u0442\u0435. \u041e\u043f\u0430\u0441\u043d\u043e \u0435 \u0434\u0430 \u043f\u0440\u043e\u0434\u044a\u043b\u0436\u0438\u0442\u0435 \u0431\u0435\u0437 \u0440\u0435\u0441\u0442\u0430\u0440\u0442\u0438\u0440\u0430\u043d\u0435. diff --git a/core/src/main/resources/hudson/PluginManager/installed_cs.properties b/core/src/main/resources/hudson/PluginManager/installed_cs.properties index 21847ed21d95ec27e0b955dc11f6614d8e745f13..9fb56abb6a8981744a87550484f14cb02aa68927 100644 --- a/core/src/main/resources/hudson/PluginManager/installed_cs.properties +++ b/core/src/main/resources/hudson/PluginManager/installed_cs.properties @@ -3,11 +3,9 @@ Changes\ will\ take\ effect\ when\ you\ restart\ Jenkins=Zm\u011Bny se projev\u00ED a\u017E po restartu Jenkinse Enabled=Povolen\u00E9 Name=Jm\u00E9no -Pinned=Preferovat Previously\ installed\ version=P\u0159edchoz\u00ED nainstalovan\u00E1 verze Restart\ Once\ No\ Jobs\ Are\ Running=Restartovat a\u017E po dokon\u010Den\u00ED v\u0161ech \u00FAloh. Uncheck\ to\ disable\ the\ plugin=Od\u0161krtnout pro deaktivaci modulu Uninstall=Odinstalovat Version=Verze downgradeTo=Vr\u00E1tit se k {0} -wiki.url=http://wiki.jenkins-ci.org/display/JENKINS/Pinned+Plugins diff --git a/core/src/main/resources/hudson/PluginManager/installed_da.properties b/core/src/main/resources/hudson/PluginManager/installed_da.properties index 4086d2a08ac457e4508899f2278ebd1c94b988ad..9e17d018924b1a85654c414ad1927ddc02722b72 100644 --- a/core/src/main/resources/hudson/PluginManager/installed_da.properties +++ b/core/src/main/resources/hudson/PluginManager/installed_da.properties @@ -21,15 +21,12 @@ # THE SOFTWARE. Version=Version -wiki.url=http://wiki.jenkins-ci.org/display/JENKINS/Pinned+Plugins Restart\ Once\ No\ Jobs\ Are\ Running=Genstart n\u00e5r ingen jobs k\u00f8rer Previously\ installed\ version=Forudg\u00e5ende installerede version New\ plugins\ will\ take\ effect\ once\ you\ restart\ Jenkins=Nye plugins tr\u00e6der i kraft efter du har genstartet Jenkins Uncheck\ to\ disable\ the\ plugin=Fjern flueben for at sl\u00e5 plugin''et fra No\ plugins\ installed.=Ingen installerede plugins. downgradeTo=Nedgrader til {0} -Pinned=L\u00e5st Name=Navn Changes\ will\ take\ effect\ when\ you\ restart\ Jenkins=\u00c6ndringer tr\u00e6der i kraft efter Jenkins er genstartet Enabled=Sl\u00e5et til -Unpin=L\u00e5s op diff --git a/core/src/main/resources/hudson/PluginManager/installed_de.properties b/core/src/main/resources/hudson/PluginManager/installed_de.properties index 3653a5c9e839f877ae82b4bfb8ce5761c8ec8656..e8cef970fe8810640a18b051d130afc9593f04a9 100644 --- a/core/src/main/resources/hudson/PluginManager/installed_de.properties +++ b/core/src/main/resources/hudson/PluginManager/installed_de.properties @@ -29,9 +29,6 @@ Version=Version Restart\ Once\ No\ Jobs\ Are\ Running=Neu starten, sobald keine Jobs mehr laufen. Previously\ installed\ version=Vorher installierte Version downgradeTo={0} wiederherstellen -Pinned=Gesperrt -Unpin=Entsperren -wiki.url=http://wiki.jenkins-ci.org/display/JENKINS/Pinned+Plugins Uninstall=Deinstallieren Uninstallation\ pending=Zur Deinstallation vorgemerkt Update\ Center=Update-Center diff --git a/core/src/main/resources/hudson/PluginManager/installed_es.properties b/core/src/main/resources/hudson/PluginManager/installed_es.properties index 70956f31d1b389dd4f44eef441fb8e53e1bcaa8f..34f849e78dccc253e5099bc7b453a12f3e0596ed 100644 --- a/core/src/main/resources/hudson/PluginManager/installed_es.properties +++ b/core/src/main/resources/hudson/PluginManager/installed_es.properties @@ -27,10 +27,7 @@ Name=Nombre Version=Versin Changes\ will\ take\ effect\ when\ you\ restart\ Jenkins=Los cambios no estarn disponibles hasta que Jenkins se reinicie Restart\ Once\ No\ Jobs\ Are\ Running=Reiniciar cuando no haya tareas en ejecucin -wiki.url="http://wiki.jenkins-ci.org/display/JENKINS/Pinned+Plugins" downgradeTo=Bajar a la version {0}. Previously\ installed\ version=Versin previamente instalada. -Pinned=marcado Uninstall=Desinstalar -Unpin=desmarcar Update\ Center=Centro de actualizaciones diff --git a/core/src/main/resources/hudson/PluginManager/installed_fi.properties b/core/src/main/resources/hudson/PluginManager/installed_fi.properties index c04443e10d2fe07012c6a0233fd44bf0581752dc..209c8d6e2d3903add7a171d1838baf01770f505f 100644 --- a/core/src/main/resources/hudson/PluginManager/installed_fi.properties +++ b/core/src/main/resources/hudson/PluginManager/installed_fi.properties @@ -23,10 +23,8 @@ Changes\ will\ take\ effect\ when\ you\ restart\ Jenkins=Muutokset astuvat voimaan kun Jenkins k\u00E4ynnistet\u00E4\u00E4n Enabled=Aktivoitu Name=Nimi -Pinned=Lukittu Previously\ installed\ version=Aiemmin asennettu versio Restart\ Once\ No\ Jobs\ Are\ Running=K\u00E4ynnist\u00E4 heti kun k\u00E4\u00E4nn\u00F6ksi\u00E4 ei ole ajossa Uncheck\ to\ disable\ the\ plugin=Poist ruudun rasti poistaaksesi liit\u00E4nn\u00E4inen k\u00E4yt\u00F6st\u00E4 -Unpin=Vapauta lukitus Version=Versio downgradeTo=Palaa versioon {0} diff --git a/core/src/main/resources/hudson/PluginManager/installed_fr.properties b/core/src/main/resources/hudson/PluginManager/installed_fr.properties index fde1e85e1c11cb7e8ef32524056d3193409e6fa4..b3767a6e65ecde4201c44f5c2db50a59c22e5dd2 100644 --- a/core/src/main/resources/hudson/PluginManager/installed_fr.properties +++ b/core/src/main/resources/hudson/PluginManager/installed_fr.properties @@ -28,9 +28,6 @@ Uncheck\ to\ disable\ the\ plugin=D\u00e9cochez pour d\u00e9sactiver le plugin Enabled=Activ\u00e9 Name=Nom Uninstall=D\u00E9sinstaller -Unpin=Annuler \u00E9pingler Version=Version -Pinned=\u00C9pingl\u00E9 Previously\ installed\ version=Version pr\u00E9c\u00E9dente downgradeTo=R\u00E9trograder \u00E0 {0} -wiki.url=http://wiki.jenkins-ci.org/display/JENKINS/Pinned+Plugins diff --git a/core/src/main/resources/hudson/PluginManager/installed_hu.properties b/core/src/main/resources/hudson/PluginManager/installed_hu.properties index 01d83570d004de8d58e6774dc17923350d7e5bd6..a71aafe3567e5b4b7f530dc97750319017773d7e 100644 --- a/core/src/main/resources/hudson/PluginManager/installed_hu.properties +++ b/core/src/main/resources/hudson/PluginManager/installed_hu.properties @@ -28,4 +28,3 @@ Restart\ Once\ No\ Jobs\ Are\ Running=\u00DAjraind\u00EDt\u00E1s ha m\u00E1r nin Uncheck\ to\ disable\ the\ plugin=T\u00F6r\u00F6lje a jel\u00F6l\u00E9st a be\u00E9p\u00FCl\u0151 kikapcsol\u00E1s\u00E1hoz Version=Verzi\u00F3 downgradeTo=Visszafriss\u00EDt\u00E9s {0} verzi\u00F3ra -wiki.url=http://wiki.jenkins-ci.org/display/JENKINS/Pinned+Plugins diff --git a/core/src/main/resources/hudson/PluginManager/installed_it.properties b/core/src/main/resources/hudson/PluginManager/installed_it.properties index 0c30e7269d122832fc67c9585b1bffb81121b59c..2be147af2a3a07f1079642d9cdaaa49f304b847a 100644 --- a/core/src/main/resources/hudson/PluginManager/installed_it.properties +++ b/core/src/main/resources/hudson/PluginManager/installed_it.properties @@ -23,12 +23,9 @@ Changes\ will\ take\ effect\ when\ you\ restart\ Jenkins=Le modifiche avranno effetto quando riavvierai Jenkins Enabled=Attivo Name=Nome -Pinned=Bloccato Previously\ installed\ version=Versione precedente Restart\ Once\ No\ Jobs\ Are\ Running=Riavvia quando non ci sono lavori in esecuzione Uncheck\ to\ disable\ the\ plugin=Deseleziona per disattivare il plugin Uninstall=Disintalla -Unpin=Sblocca Version=Versione downgradeTo=Retrocedi a -wiki.url=http://wiki.jenkins-ci.org/display/JENKINS/Pinned+Plugins diff --git a/core/src/main/resources/hudson/PluginManager/installed_ja.properties b/core/src/main/resources/hudson/PluginManager/installed_ja.properties index cca9a2797f7350e2a3c8134cd565fddc7811f0d7..8e9aaf1ef60c3fe9b450e5938855407ea3b3810d 100644 --- a/core/src/main/resources/hudson/PluginManager/installed_ja.properties +++ b/core/src/main/resources/hudson/PluginManager/installed_ja.properties @@ -27,9 +27,6 @@ Enabled=\u6709\u52b9\u5316 Name=\u540d\u524d Version=\u30d0\u30fc\u30b8\u30e7\u30f3 Restart\ Once\ No\ Jobs\ Are\ Running=\u30b8\u30e7\u30d6\u304c\u5b9f\u884c\u4e2d\u3067\u306a\u3051\u308c\u3070\u518d\u8d77\u52d5 -Pinned=\u30d4\u30f3 -Unpin=\u89e3\u9664 -wiki.url=http://wiki.jenkins-ci.org/display/JA/Pinned+Plugins Previously\ installed\ version=\u524d\u56de\u30d0\u30fc\u30b8\u30e7\u30f3 downgradeTo={0} \u306b\u30c0\u30a6\u30f3\u30b0\u30ec\u30fc\u30c9 Update\ Center=\u30a2\u30c3\u30d7\u30c7\u30fc\u30c8\u30bb\u30f3\u30bf\u30fc diff --git a/core/src/main/resources/hudson/PluginManager/installed_ko.properties b/core/src/main/resources/hudson/PluginManager/installed_ko.properties index 7a6397fbf43c26b8aff2d1febbb00bca4a35f369..1d745838f474d6d7a274acca4520adbe482b0bc3 100644 --- a/core/src/main/resources/hudson/PluginManager/installed_ko.properties +++ b/core/src/main/resources/hudson/PluginManager/installed_ko.properties @@ -23,13 +23,10 @@ Changes\ will\ take\ effect\ when\ you\ restart\ Jenkins=Jenkins\uC744 \uC7AC\uC2DC\uC791\uD558\uBA74 \uBCC0\uACBD\uC0AC\uD56D\uC774 \uC801\uC6A9\uB429\uB2C8\uB2E4. Enabled=\uC0AC\uC6A9\uAC00\uB2A5 Name=\uC774\uB984 -Pinned=\uACE0\uC815\uB428 Previously\ installed\ version=\uC774\uC804 \uC124\uCE58 \uBC84\uC804 Restart\ Once\ No\ Jobs\ Are\ Running=\uB3D9\uC791\uC911\uC778 \uC791\uC5C5\uC774 \uC5C6\uC73C\uBA74 \uD55C\uBC88 \uC7AC\uAE30\uB3D9\uD569\uB2C8\uB2E4. Uncheck\ to\ disable\ the\ plugin=\uC0AC\uC6A9\uBD88\uAC00 \uD50C\uB7EC\uADF8\uC778 \uCCB4\uD06C\uD574\uC81C Uninstall=\uC124\uCE58 \uC81C\uAC70 Uninstallation\ pending=\uC0AD\uC81C \uB300\uAE30 -Unpin=\uACE0\uC815 \uD574\uC81C Version=\uBC84\uC804 downgradeTo={0}\uC73C\uB85C \uB2E4\uC6B4\uADF8\uB808\uC774\uB4DC -wiki.url=http://wiki.jenkins-ci.org/display/JENKINS/Pinned+Plugins diff --git a/core/src/main/resources/hudson/PluginManager/installed_lv.properties b/core/src/main/resources/hudson/PluginManager/installed_lv.properties index 27b7271b2c7ca80d3bf812a3945af09a2c23521a..6539b07429a8033f1f0bd1e9a25b1f4919dcec87 100644 --- a/core/src/main/resources/hudson/PluginManager/installed_lv.properties +++ b/core/src/main/resources/hudson/PluginManager/installed_lv.properties @@ -3,11 +3,8 @@ Changes\ will\ take\ effect\ when\ you\ restart\ Jenkins=Izmai\u0146as st\u0101sies sp\u0113k\u0101 p\u0113c Jenkins p\u0101rstart\u0113\u0161anas Enabled=Iespejots Name=Nosaukums -Pinned=Piesaist\u012Bts Previously\ installed\ version=Iepriek\u0161 instal\u0113t\u0101 versija Restart\ Once\ No\ Jobs\ Are\ Running=P\u0101rstart\u0113 tikl\u012Bdz neviens uzdevums nestr\u0101d\u0101 Uncheck\ to\ disable\ the\ plugin=At\u0137eks\u0113 lai atsp\u0113jotu spraudni Uninstall=Atinstal\u0113t -Unpin=Atsiet Version=Versija -wiki.url=http://wiki.jenkins-ci.org/display/JENKINS/Pinned+Plugins diff --git a/core/src/main/resources/hudson/PluginManager/installed_nl.properties b/core/src/main/resources/hudson/PluginManager/installed_nl.properties index 78c5ea28610ab25a901a9f3959b97abf820a91b1..aa7cc818944895680c9fafd0b01dbf47cf58fb2d 100644 --- a/core/src/main/resources/hudson/PluginManager/installed_nl.properties +++ b/core/src/main/resources/hudson/PluginManager/installed_nl.properties @@ -27,10 +27,7 @@ Restart\ Once\ No\ Jobs\ Are\ Running=Opnieuw starten Uncheck\ to\ disable\ the\ plugin=Vink aan om de plugin te de-activeren. Enabled=Actief Name=Naam -Unpin=Losmaken Version=Versie -Pinned=Vastgezet Previously\ installed\ version=Vorige ge\u00EFnstalleerde versie Restart\ Now=Nu herstarten downgradeTo=Versie {0} terugzetten -wiki.url=http://wiki.jenkins-ci.org/display/JENKINS/Pinned+Plugins diff --git a/core/src/main/resources/hudson/PluginManager/installed_pl.properties b/core/src/main/resources/hudson/PluginManager/installed_pl.properties index df5e36320154937824fc6736d73c062a9ea776cd..882151920ae8ab28e0c4d0d7fdd885a615f64b3d 100644 --- a/core/src/main/resources/hudson/PluginManager/installed_pl.properties +++ b/core/src/main/resources/hudson/PluginManager/installed_pl.properties @@ -1,6 +1,6 @@ # The MIT License # -# Copyright (c) 2004-2010, Sun Microsystems, Inc. +# Copyright (c) 2004-2016, Sun Microsystems, Damian Szczepanik # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -23,13 +23,17 @@ Changes\ will\ take\ effect\ when\ you\ restart\ Jenkins=Zmiany zostan\u0105 wprowadzone po ponownym uruchomieniu Jenkinsa Enabled=W\u0142\u0105czone wtyczki Name=Nazwa -Pinned=Przypi\u0119ta Previously\ installed\ version=Poprzednia zainstalowana wersja Restart\ Once\ No\ Jobs\ Are\ Running=Uruchom ponownie gdy \u017Cadne zadania nie s\u0105 wykonywane Uncheck\ to\ disable\ the\ plugin=Odznacz aby wy\u0142\u0105czy\u0107 wtyczk\u0119 Uninstall=Odinstaluj -Unpin=Odepnij Version=Wersja downgradeTo=Powr\u00F3\u0107 do starszej wersji {0} requires.restart=Wymagane jest ponowne uruchomienie Jenkinsa. Zmiany wtyczek w tym momencie s\u0105 bardzo niewskazane. Uruchom ponownie Jenkinsa, zanim wprowadzisz zmiany. -wiki.url=http://wiki.jenkins-ci.org/display/JENKINS/Pinned+Plugins \ No newline at end of file +Uninstallation\ pending=Trwa odinstalowywanie +This\ plugin\ cannot\ be\ disabled=Ta wtyczka nie mo\u017Ce by\u0107 wy\u0142\u0105czona +No\ plugins\ installed.=Brak zainstalowanych wtyczek +This\ plugin\ cannot\ be\ enabled=Ta wtyczka nie mo\u017Ce by\u0107 wy\u0142\u0105czona +Update\ Center=Centrum aktualizacji +Filter=Filtruj +No\ description\ available.=Opis nie jest dost\u0119pny diff --git a/core/src/main/resources/hudson/PluginManager/installed_pt_BR.properties b/core/src/main/resources/hudson/PluginManager/installed_pt_BR.properties index 492b30e39c76f80fbb68d008212cd664ef2d08fa..543c634fa81a45edad7691004e9cae6b15accbd3 100644 --- a/core/src/main/resources/hudson/PluginManager/installed_pt_BR.properties +++ b/core/src/main/resources/hudson/PluginManager/installed_pt_BR.properties @@ -24,15 +24,12 @@ No\ plugins\ installed.=Nenhum plugin instalado. Changes\ will\ take\ effect\ when\ you\ restart\ Jenkins=A mudan\u00e7as ter\u00e3o efeito quando o Jenkins for reiniciado Uncheck\ to\ disable\ the\ plugin=Desmarque para desativar o plugin Enabled=Habilitar -Pinned=Fixado Previously\ installed\ version=Vers\u00E3o anterior instalada Restart\ Once\ No\ Jobs\ Are\ Running=Reiniciar assim que nenhum job estiver rodando Uninstall=Desinstalar -Unpin=Desprender Version=Vers\u00e3o Name=Nome downgradeTo=Regredir para {0} -wiki.url=http://wiki.jenkins-ci.org/display/JENKINS/Pinned+Plugins Filter=Filtro Update\ Center=Central de atualiza\u00e7\u00e3o No\ description\ available.=Nenhuma descri\u00e7\u00e3o dispon\u00edvel diff --git a/core/src/main/resources/hudson/PluginManager/installed_pt_PT.properties b/core/src/main/resources/hudson/PluginManager/installed_pt_PT.properties index 32259b92eca3c3e50a56ec81e1a3107c2827e1ae..e4464f4900255725f2afe88835223683096d8d60 100644 --- a/core/src/main/resources/hudson/PluginManager/installed_pt_PT.properties +++ b/core/src/main/resources/hudson/PluginManager/installed_pt_PT.properties @@ -3,11 +3,9 @@ Changes\ will\ take\ effect\ when\ you\ restart\ Jenkins=As altera\u00E7\u00F5es ser\u00E3o aplicadas quando reiniciares o Jenkins Enabled=Ativado Name=Nome -Pinned=Fixo Previously\ installed\ version=\u00DAltima vers\u00E3o instalada Restart\ Once\ No\ Jobs\ Are\ Running=Reiniciar quando n\u00E3o estiverem Jobs em execu\u00E7\u00E3o Uncheck\ to\ disable\ the\ plugin=Seleccione para desactivar o plugin Uninstall=Desinstalar Version=Vers\u00E3o downgradeTo=Downgrade para {0} -wiki.url=http://wiki.jenkins-ci.org/display/JENKINS/Pinned+Plugins diff --git a/core/src/main/resources/hudson/PluginManager/installed_ro.properties b/core/src/main/resources/hudson/PluginManager/installed_ro.properties index 9d960272ae146aaa3bba204479e7ecd274637254..a0fc137d09387e6dff7b675cb0a52bca9d2de112 100644 --- a/core/src/main/resources/hudson/PluginManager/installed_ro.properties +++ b/core/src/main/resources/hudson/PluginManager/installed_ro.properties @@ -3,11 +3,8 @@ Changes\ will\ take\ effect\ when\ you\ restart\ Jenkins=Schimb\u0103rile vor avea efect c\u00E2nd ve\u021Bi reporni Jenkins Enabled=Activat Name=Denumire -Pinned=Fixat Previously\ installed\ version=Versiunea instalat\u0103 anterior Restart\ Once\ No\ Jobs\ Are\ Running=Reporne\u0219te odat\u0103 ce nu mai sunt joburi ce ruleaz\u0103 Uncheck\ to\ disable\ the\ plugin=Debifa\u021Bi pentru a dezactiva pluginul -Unpin=Defixeaz\u0103 Version=Versiune downgradeTo=Retrogradeaz\u0103 la -wiki.url=http://wiki.jenkins-ci.org/display/JENKINS/Pinned+Plugins diff --git a/core/src/main/resources/hudson/PluginManager/installed_ru.properties b/core/src/main/resources/hudson/PluginManager/installed_ru.properties index 8fd3ed203354f97eeb08bc116a5c431388a1762a..02ece9626713737dc2422ba15194ea032ea8e010 100644 --- a/core/src/main/resources/hudson/PluginManager/installed_ru.properties +++ b/core/src/main/resources/hudson/PluginManager/installed_ru.properties @@ -23,13 +23,10 @@ Changes\ will\ take\ effect\ when\ you\ restart\ Jenkins=\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432\u0441\u0442\u0443\u043f\u044f\u0442 \u0432 \u0441\u0438\u043b\u0443 \u043f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 Jenkins Enabled=\u0410\u043a\u0442\u0438\u0432\u043d\u044b\u0439 Name=\u041d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435 -Pinned=\u041f\u0440\u0438\u043a\u0440\u0435\u043f\u043b\u0451\u043d\u043d\u044b\u0435 Previously\ installed\ version=\u0420\u0430\u043d\u0435\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 Restart\ Once\ No\ Jobs\ Are\ Running=\u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0438 \u0432\u0441\u0435\u0445 \u0437\u0430\u0434\u0430\u0447 Uncheck\ to\ disable\ the\ plugin=\u0421\u043d\u0438\u043c\u0438\u0442\u0435 \u0444\u043b\u0430\u0436\u043e\u043a, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043f\u043b\u0430\u0433\u0438\u043d Uninstall=\u0423\u0434\u0430\u043b\u0438\u0442\u044c Uninstallation\ pending=\u041e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f... -Unpin=\u041e\u0442\u043a\u0440\u0435\u043f\u0438\u0442\u044c Version=\u0412\u0435\u0440\u0441\u0438\u044f downgradeTo=\u0412\u0435\u0440\u043d\u0443\u0442\u044c \u043a \u0432\u0435\u0440\u0441\u0438\u0438 {0} -wiki.url=http://wiki.jenkins-ci.org/display/JENKINS/Pinned+Plugins diff --git a/core/src/main/resources/hudson/PluginManager/installed_sk.properties b/core/src/main/resources/hudson/PluginManager/installed_sk.properties index c8e910951476144131acf6f7d57f124a68bf1a0b..a8be79712009f819087e3ea9a128f30c00b12407 100644 --- a/core/src/main/resources/hudson/PluginManager/installed_sk.properties +++ b/core/src/main/resources/hudson/PluginManager/installed_sk.properties @@ -9,4 +9,3 @@ Uncheck\ to\ disable\ the\ plugin=Odzna\u010Den\u00EDm zak\u00E1\u017Eete plugin Uninstall=Odin\u0161taluj Uninstallation\ pending=Odin\u0161tal\u00E1cia \u010Dak\u00E1 Version=Verzia -wiki.url=http://wiki.jenkins-ci.org/display/JENKINS/Pinned+Plugins diff --git a/core/src/main/resources/hudson/PluginManager/installed_sr.properties b/core/src/main/resources/hudson/PluginManager/installed_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..b555a4dbe95c4f1292178ce39b49dcc2e388a2c7 --- /dev/null +++ b/core/src/main/resources/hudson/PluginManager/installed_sr.properties @@ -0,0 +1,26 @@ +# This file is under the MIT License by authors + +Update\ Center=\u0426\u0435\u043D\u0442\u0430\u0440 \u0437\u0430 \u0410\u0436\u0443\u0440\u0438\u0440\u0430\u045A\u0435 +Filter=\u041F\u0440\u043E\u0444\u0438\u043B\u0442\u0440\u0438\u0440\u0430\u0458 +Warning=\u0423\u043F\u043E\u0437\u043E\u0440\u0435\u045A\u0435 +requires.restart=\u041F\u043E\u0442\u0440\u0435\u0431\u043D\u043E \u0458\u0435 \u043F\u043E\u043D\u043E\u0432\u043E \u043F\u043E\u043A\u0440\u0435\u043D\u0443\u0442\u0438 Jenkins. \u041E\u043F\u0430\u0441\u043D\u043E \u0458\u0435 \u043C\u0435\u045A\u0430\u0442\u0438 \u043C\u043E\u0434\u0443\u043B\u0435 \u0443 \u043E\u0432\u043E \u0432\u0440\u0435\u043C\u0435 - \u043F\u043E\u043D\u043E\u0432\u043E Jenkins \u043F\u0440\u0435 \u043D\u0435\u0433\u043E \u0448\u0442\u043E \u0434\u0435\u043B\u0443\u0458\u0435\u0442\u0435 \u0434\u0430\u0459\u0435. +This\ plugin\ cannot\ be\ enabled=\u041E\u0432\u0430 \u043C\u043E\u0434\u0443\u043B\u0430 \u043D\u0435\u043C\u043E\u0436\u0435 \u0431\u0438\u0442\u0438 \u043E\u043C\u043E\u0433\u0443\u045B\u0435\u043D\u0430 +This\ plugin\ cannot\ be\ disabled=\u041E\u0432\u0430 \u043C\u043E\u0434\u0443\u043B\u0430 \u043D\u0435\u043C\u043E\u0436\u0435 \u0431\u0438\u0442\u0438 \u043E\u043D\u0435\u043C\u043E\u0433\u0443\u045B\u0435\u043D\u0430 +This\ plugin\ cannot\ be\ uninstalled=\u041E\u0432\u0430 \u043C\u043E\u0434\u0443\u043B\u0430 \u043D\u0435\u043C\u043E\u0436\u0435 \u0432\u0438\u0442\u0438 \u0434\u0435\u0438\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u043D\u0430 +It\ has\ one\ or\ more\ disabled\ dependencies=\u041F\u043E\u0441\u0442\u043E\u0458\u0438 \u043D\u0430\u0458\u043C\u0430\u045A\u0435 \u0458\u0435\u0434\u043D\u0430 \u0438\u0441\u043A\u0459\u0443\u0447\u0435\u043D\u0430 \u043C\u043E\u0434\u0443\u043B\u0430 \u043E\u0434 \u043A\u043E\u0458\u0435 \u043E\u0432\u0430 \u0437\u0430\u0432\u0438\u0441\u0438 +It\ has\ one\ or\ more\ enabled\ dependants=\u041F\u043E\u0441\u0442\u043E\u0458\u0438 \u043D\u0430\u0458\u043C\u0430\u045A\u0435 \u0458\u0435\u043D\u0434\u0430 \u0434\u0440\u0443\u0433\u0430 \u043C\u043E\u0434\u0443\u043B\u0430 \u043A\u043E\u0458\u0430 \u0437\u0430\u0432\u0438\u0441\u0438 \u043E\u0434 \u045A\u0435 +It\ has\ one\ or\ more\ installed\ dependants=\u041F\u043E\u0441\u0442\u043E\u0458\u0438 \u043D\u0430\u0458\u043C\u0430\u045A\u0435 \u0458\u0435\u043D\u0434\u0430 \u0434\u0440\u0443\u0433\u0430 \u043C\u043E\u0434\u0443\u043B\u0430 \u043A\u043E\u0458\u0430 \u0437\u0430\u0432\u0438\u0441\u0438 \u043E\u0434 \u045A\u0435 +No\ plugins\ installed.=\u041D\u0435\u043C\u0430 \u0438\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u043D\u0438\u0445 \u043C\u043E\u0434\u0443\u043B\u0430 +Uncheck\ to\ disable\ the\ plugin=\u0423\u043A\u043B\u043E\u043D\u0438\u0442\u0435 \u043A\u0432\u0430\u0447\u0438\u0446\u0443 \u0434\u0430 \u043E\u043D\u0435\u043C\u043E\u0433\u0443\u045B\u0438\u0442\u0435 \u043C\u043E\u0434\u0443\u043B\u0443 +Enabled=\u0410\u043A\u0442\u0438\u043D\u0432\u043E +Name=\u0418\u043C\u0435 +Version=\u0412\u0435\u0440\u0437\u0438\u0458\u0430 +Previously\ installed\ version=\u041F\u0440\u0435\u0442\u0445\u043E\u0434\u043D\u043E \u0438\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u043D\u0430 \u0432\u0435\u0440\u0437\u0438\u0458\u0430 +Uninstall=\u0414\u0435\u0438\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u0430 +No\ description\ available.=\u041D\u0435\u043C\u0430 \u043E\u043F\u0438\u0441\u0430 +downgradeTo=\u0412\u0440\u0430\u0442\u0438 \u0432\u0435\u0440\u0437\u0438\u0458\u0443 \u043D\u0430\u0437\u0430\u0434 \u043D\u0430 {0} +Uninstallation\ pending=\u0414\u0435\u0438\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u0430 \u0458\u0435 \u0443 \u0442\u043E\u043A\u0443 +Changes\ will\ take\ effect\ when\ you\ restart\ Jenkins=\u041F\u0440\u043E\u043C\u0435\u043D\u0435 \u045B\u0435 \u0441\u0442\u0443\u043F\u0438\u0442\u0438 \u043D\u0430\u043A\u043E\u043D \u043F\u043E\u043D\u043E\u0432\u043D\u043E\u0433 \u043F\u043E\u043A\u0440\u0435\u0442\u0430\u045A\u0430 Jenkins +Restart\ Once\ No\ Jobs\ Are\ Running=\u041F\u043D\u043E\u0432\u043E \u043F\u043E\u043A\u0440\u0435\u043D\u0442\u0438 \u043A\u0430\u0434 \u043D\u0435 \u0431\u0443\u0434\u0435 \u0431\u0438\u043B\u043E \u0442\u0435\u043A\u0443\u045B\u0438\u0445 \u0437\u0430\u0434\u0430\u0442\u0430\u043A\u0430. +New\ plugins\ will\ take\ effect\ once\ you\ restart\ Jenkins=\u041D\u043E\u0432\u0435 \u043C\u043E\u0434\u0443\u043B\u0435 \u045B\u0435 \u0441\u0442\u0443\u043F\u0438\u0442\u0438 \u043D\u0430\u043A\u043E\u043D \u043F\u043E\u043D\u043E\u0432\u043E\u0433 \u043F\u043E\u043A\u0440\u0435\u0442\u0430\u045A\u0430 +Restart\ Now=\u041F\u043E\u043D\u043E\u0432\u043E \u043F\u043E\u043A\u0440\u0435\u043D\u0438 \u0441\u0430\u0434\u0430 diff --git a/core/src/main/resources/hudson/PluginManager/installed_uk.properties b/core/src/main/resources/hudson/PluginManager/installed_uk.properties index cdfbd4ea6110127b07f899d1dbdf51677200eddf..36ca71b5e9b39024081128e819ad7c9751eb1083 100644 --- a/core/src/main/resources/hudson/PluginManager/installed_uk.properties +++ b/core/src/main/resources/hudson/PluginManager/installed_uk.properties @@ -3,12 +3,9 @@ Changes\ will\ take\ effect\ when\ you\ restart\ Jenkins=\uBCC0\uACBD\uC0AC\uD56D\uC740 \uC820\uD0A8\uC2A4\uB97C \uC7AC\uC2DC\uC791\uD560\uB54C \uC801\uC6A9\uB429\uB2C8\uB2E4 Enabled=\uD65C\uC131\uD654\uB428 Name=\uC774\uB984 -Pinned=\uD540 \uACE0\uC815 Previously\ installed\ version=\uC774\uC804\uC5D0 \uC124\uCE58\uD55C \uBC84\uC804 Restart\ Once\ No\ Jobs\ Are\ Running=\uC544\uBB34\uB7F0 \uC791\uC5C5\uC774 \uC5C6\uC744 \uB54C \uC7AC\uC2DC\uC791\uD558\uAE30 Uncheck\ to\ disable\ the\ plugin=\uD50C\uB7EC\uADF8\uC778\uC744 \uBE44\uD65C\uC131\uD654\uD558\uB824\uBA74 \uCCB4\uD06C\uB97C \uD574\uC9C0\uD558\uC2ED\uC2DC\uC624 Uninstall=\u0412\u0438\u0434\u0430\u043B\u0438\u0442\u0438 -Unpin=\uD540 \uD574\uCCB4 Version=\uBC84\uC804 downgradeTo={0}\uB85C \uB2E4\uC6B4\uADF8\uB808\uC774\uB4DC -wiki.url=http://wiki.jenkins-ci.org/display/JENKINS/Pinned+Plugins diff --git a/core/src/main/resources/hudson/PluginManager/installed_zh_CN.properties b/core/src/main/resources/hudson/PluginManager/installed_zh_CN.properties index 20edd4eb6a73edac358789c094d1ca71ff907074..cef268874e540eb42c2222a5bcade4e6c00a3ef0 100644 --- a/core/src/main/resources/hudson/PluginManager/installed_zh_CN.properties +++ b/core/src/main/resources/hudson/PluginManager/installed_zh_CN.properties @@ -23,12 +23,9 @@ Changes\ will\ take\ effect\ when\ you\ restart\ Jenkins=\u6240\u6709\u6539\u53D8\u4F1A\u5728\u91CD\u65B0\u542F\u52A8Jenkins\u4EE5\u540E\u751F\u6548\u3002 Enabled=\u542F\u7528 Name=\u540D\u79F0 -Pinned=\u7ED1\u5B9A Previously\ installed\ version=\u4E0A\u4E00\u4E2A\u5B89\u88C5\u7684\u7248\u672C Restart\ Once\ No\ Jobs\ Are\ Running=\u5F53\u6CA1\u6709\u4EFB\u52A1\u65F6\u91CD\u542F Uncheck\ to\ disable\ the\ plugin=\u53D6\u6D88\u9009\u62E9\u4EE5\u7981\u7528\u63D2\u4EF6 Uninstall=\u5378\u8F7D -Unpin=\u89E3\u9664\u7ED1\u5B9A Version=\u7248\u672C downgradeTo=\u964D\u5230 -wiki.url=http://wiki.jenkins-ci.org/display/JENKINS/Pinned+Plugins diff --git a/core/src/main/resources/hudson/PluginManager/installed_zh_TW.properties b/core/src/main/resources/hudson/PluginManager/installed_zh_TW.properties index 205f23e21971174a1f3015c5ca9368066df6d4f8..9721180a51cfad58cb54873faaed0fa82bba6b11 100644 --- a/core/src/main/resources/hudson/PluginManager/installed_zh_TW.properties +++ b/core/src/main/resources/hudson/PluginManager/installed_zh_TW.properties @@ -30,11 +30,8 @@ Enabled=\u5DF2\u555F\u7528 Name=\u540d\u7a31 Version=\u7248\u672c Previously\ installed\ version=\u524D\u4E00\u5B89\u88DD\u7248\u672C -Pinned=\u5df2\u639b\u8f09 downgradeTo=\u964d\u7248\u6210 {0} -Unpin=\u5378\u9664 -wiki.url=http://wiki.jenkins-ci.org/display/JENKINS/Pinned+Plugins Uninstallation\ pending=\u89e3\u9664\u5b89\u88dd\u4f5c\u696d\u64f1\u7f6e\u4e2d Uninstall=\u89E3\u9664\u5B89\u88DD diff --git a/core/src/main/resources/hudson/PluginManager/sidepanel.groovy b/core/src/main/resources/hudson/PluginManager/sidepanel.groovy index 98aeab34702702834934e1499d9f20e3286ebd81..d129bd53c71afabdb533e5a7e679fad3906d656c 100644 --- a/core/src/main/resources/hudson/PluginManager/sidepanel.groovy +++ b/core/src/main/resources/hudson/PluginManager/sidepanel.groovy @@ -28,7 +28,7 @@ l.header() l.side_panel { l.tasks { l.task(icon:"icon-up icon-md", href:rootURL+'/', title:_("Back to Dashboard")) - l.task(icon:"icon-setting icon-md", href:"${rootURL}/manage", title:_("Manage Jenkins"), permission:app.ADMINISTER, it:app) + l.task(icon:"icon-gear2 icon-md", href:"${rootURL}/manage", title:_("Manage Jenkins"), permission:app.ADMINISTER, it:app) if (!app.updateCenter.jobs.isEmpty()) { l.task(icon:"icon-plugin icon-md", href:"${rootURL}/updateCenter/", title:_("Update Center")) } diff --git a/core/src/main/resources/hudson/PluginManager/sidepanel_sr.properties b/core/src/main/resources/hudson/PluginManager/sidepanel_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..baba7c569c30a788802dce6a9cf9ba11f431ebc2 --- /dev/null +++ b/core/src/main/resources/hudson/PluginManager/sidepanel_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +Back\ to\ Dashboard=\u041D\u0430\u0437\u0430\u0434 \u043A\u0430 \u043A\u043E\u043D\u0442\u043E\u0440\u043B\u043D\u043E\u0458 \u043F\u0430\u043D\u0435\u043B\u0438 +Manage\ Jenkins=\u0423\u043F\u0440\u0430\u0432\u0459\u0430\u045A\u0435 Jenkins-\u043E\u043C +Update\ Center=\u0426\u0435\u043D\u0442\u0430\u0440 \u0437\u0430 \u0410\u0436\u0443\u0440\u0438\u0440\u0430\u045A\u0435 \ No newline at end of file diff --git a/core/src/main/resources/hudson/PluginManager/sites_sr.properties b/core/src/main/resources/hudson/PluginManager/sites_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..008225b821ad3154447f184aeb3fba9c275af713 --- /dev/null +++ b/core/src/main/resources/hudson/PluginManager/sites_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +Update\ Center=\u0426\u0435\u043D\u0442\u0430\u0440 \u0437\u0430 \u0430\u0436\u0443\u0440\u0438\u0440\u0430\u045A\u0435 +Add...=\u0414\u043E\u0434\u0430\u0458... +Remove=\u0423\u043A\u043B\u043E\u043D\u0438 diff --git a/core/src/main/resources/hudson/PluginManager/tabBar_sr.properties b/core/src/main/resources/hudson/PluginManager/tabBar_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..c7e4f8cb4bab6a7ffadb29e6a162a1da3633fb29 --- /dev/null +++ b/core/src/main/resources/hudson/PluginManager/tabBar_sr.properties @@ -0,0 +1,7 @@ +# This file is under the MIT License by authors + +Updates=\u041D\u0430\u0434\u0433\u0440\u0430\u0434\u045A\u0435 +Available=\u0414\u043E\u0441\u0442\u0443\u043F\u043D\u043E +Installed=\u0418\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u043D\u043E +Advanced=\u041D\u0430\u043F\u0440\u0435\u0434\u043D\u043E +Sites=\u0421\u0442\u0440\u0430\u043D\u0438\u0446\u0435 diff --git a/core/src/main/resources/hudson/PluginManager/table.jelly b/core/src/main/resources/hudson/PluginManager/table.jelly index e8c75170b412f01cdc4ac3fa8b082801d1057be6..7511c82584d95ee677399e5c67aafd3b67ba9162 100644 --- a/core/src/main/resources/hudson/PluginManager/table.jelly +++ b/core/src/main/resources/hudson/PluginManager/table.jelly @@ -110,6 +110,15 @@ THE SOFTWARE.
        ${%depCoreWarning(p.getNeededDependenciesRequiredCore().toString())}
        + +
        ${%securityWarning} + +
        +
        @@ -139,18 +148,18 @@ THE SOFTWARE.
        - -
        -
        +
        +
        + - + +
        - diff --git a/core/src/main/resources/hudson/PluginManager/table.properties b/core/src/main/resources/hudson/PluginManager/table.properties index cc7af60893f49c7a3c8f67b61ab97099f922bf0b..63c161534cefcfc384899a32d6c4174d3094c1d3 100644 --- a/core/src/main/resources/hudson/PluginManager/table.properties +++ b/core/src/main/resources/hudson/PluginManager/table.properties @@ -25,13 +25,15 @@ compatWarning=\ Consult the plugin release notes for details. coreWarning=\ Warning: This plugin is built for Jenkins {0} or newer. \ - It may or may not work in your Jenkins. + Jenkins will refuse to load this plugin if installed. depCompatWarning=\ Warning: This plugin requires dependent plugins be upgraded and at least one of these dependent plugins claims to use a different settings format than the installed version. \ Jobs using that plugin may need to be reconfigured, and/or you may not be able to cleanly revert to the prior version without manually restoring old settings. \ Consult the plugin release notes for details. depCoreWarning=\ - Warning: This plugin requires dependent plugins that are \ - built for Jenkins {0} or newer. The dependent plugins may \ - or may not work in your Jenkins and consequently this \ - plugin may or may not work in your Jenkins. + Warning: This plugin requires dependent plugins that require Jenkins {0} or newer. \ + Jenkins will refuse to load the dependent plugins requiring a newer version of Jenkins, \ + and in turn loading this plugin will fail. +securityWarning=\ + Warning: This plugin version may not be safe to use. Please review the following security notices: + diff --git a/core/src/main/resources/hudson/PluginManager/table_pl.properties b/core/src/main/resources/hudson/PluginManager/table_pl.properties index b6b6025d9a0aacc8dbb55a0afa374bbc04479156..475890ea442175696f62afb2c774a4913f55cce2 100644 --- a/core/src/main/resources/hudson/PluginManager/table_pl.properties +++ b/core/src/main/resources/hudson/PluginManager/table_pl.properties @@ -1,6 +1,6 @@ # The MIT License # -# Copyright (c) 2004-2010, Sun Microsystems, Inc. +# Copyright (c) 2004-2017, Sun Microsystems, Inc., Damian Szczepanik # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -32,3 +32,4 @@ Name=Nazwa No\ updates=Brak dost\u0119pnych aktualizacji Version=Wersja coreWarning=UWAGA: Ten dodatek jest przygotowany dla Jenkinsa w wersji {0} lub nowszej. Mo\u017Ce nie dzia\u0142a\u0107 poprawnie z Twoj\u0105 wersj\u0105 Jenkinsa. +Update\ Center=Centrum aktualizacji \ No newline at end of file diff --git a/core/src/main/resources/hudson/PluginManager/table_sr.properties b/core/src/main/resources/hudson/PluginManager/table_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..f1517b4aa23eb508e3e2824c240d96f5aa628c1f --- /dev/null +++ b/core/src/main/resources/hudson/PluginManager/table_sr.properties @@ -0,0 +1,19 @@ +# This file is under the MIT License by authors + +Update\ Center=\u0426\u0435\u043D\u0442\u0430\u0440 \u0437\u0430 \u0410\u0436\u0443\u0440\u0438\u0440\u0430\u045A\u0435 +Filter=\u0424\u0438\u043B\u0442\u0440\u0438\u0440\u0430\u0458 +Check\ to\ install\ the\ plugin=\u0418\u0437\u0430\u0431\u0435\u0440\u0438\u0442\u0435 \u043A\u0432\u0430\u0447\u0438\u0446\u0443 \u0434\u0430 \u0438\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u0442\u0435 \u043C\u043E\u0434\u0443\u043B\u0443 +Click\ this\ heading\ to\ sort\ by\ category=\u041A\u043B\u0438\u043A\u043D\u0438\u0442\u0435 \u043E\u0432\u0430\u0458 \u043D\u0430\u0441\u043B\u043E\u0432 \u0434\u0430 \u0441\u043E\u0440\u0442\u0438\u0440\u0430\u0442\u0435 \u043F\u043E \u043A\u0430\u0442\u0435\u0433\u043E\u0440\u0438\u0458\u0438 +Install=\u0418\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u0458 +Name=\u0418\u043C\u0435 +Version=\u0412\u0435\u0440\u0437\u0438\u0458\u0430 +Installed=\u0418\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u043D\u043E +compatWarning=\ + \u0423\u043F\u043E\u0437\u043E\u0440\u0435\u045A\u0435: \u043D\u043E\u0432\u0430 \u0432\u0435\u0440\u0437\u0438\u0458\u0430 \u043C\u043E\u0434\u0443\u043B\u0435 \u043A\u043E\u0440\u0438\u0441\u0442\u0438 \u0434\u0440\u0443\u0433\u0430 \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 \u043D\u0430 \u043E\u0434\u043D\u043E\u0441\u0443 \u043D\u0430 \u0438\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u043D\u0435 \u0432\u0435\u0440\u0437\u0438\u0458\u0435. \u0417\u0430\u0434\u0430\u0446\u0438 \u043A\u043E\u0458\u0438 \u043A\u043E\u0440\u0438\u0441\u0442\u0435 \u043E\u0432\u0443 \u043C\u043E\u0434\u0443\u043B\u0443 \u045B\u0435 \u043C\u043E\u0436\u0434\u0430 \u043C\u043E\u0440\u0430\u0442\u0438 \u0431\u0438\u0442\u0438 \u0434\u0440\u0443\u0433\u0430\u0447\u0438\u0458\u0435 \u043F\u043E\u0434\u0435\u0448\u0435\u043D\u0438, \u0438 \u043C\u043E\u0436\u0434\u0430 \u043D\u0435\u045B\u0435\u0442\u0435 \u043C\u043E\u045B\u0438 \u0432\u0440\u0430\u0442\u0438\u0442\u0438 \u043D\u0430 \u0441\u0442\u0430\u0440\u0438\u0458\u0443 \u0432\u0435\u0440\u0437\u0438\u0458\u0443 \u0431\u0435\u0437 \u0440\u0443\u0447\u043D\u043E\u0433 \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430. \u0417\u0430 \u0432\u0438\u0448\u0435 \u0434\u0435\u0442\u0430\u0459\u0430, \u043F\u043E\u0433\u043B\u0435\u0434\u0430\u0458\u0442\u0435 \u0431\u0435\u043B\u0435\u0448\u043A\u0435 \u043E\u0432\u0435 \u043C\u043E\u0434\u0443\u043B\u0435. +coreWarning=\u0423\u043F\u043E\u0437\u043E\u0440\u0435\u045A\u0435: \u041C\u043E\u0434\u0443\u043B\u0430 \u0458\u0435 \u043A\u043E\u043C\u043F\u0430\u0442\u0438\u0431\u0438\u043B\u043D\u0430 \u0441\u0430 Jenkins \u0432\u0435\u0440\u0437\u0438\u0458\u0435 {0} \u0438\u043B\u0438 \u043D\u043E\u0432\u0438\u0458\u0435. \u041C\u043E\u0436\u0434\u0430 \u045B\u0435 \u0440\u0430\u0434\u0438\u0442\u0438 \u0441\u0430 \u0432\u0430\u0448\u043E\u0458 \u0432\u0435\u0440\u0437\u0438\u0458\u0438. +depCompatWarning=\u0423\u043F\u043E\u0437\u043E\u0440\u0435\u045A\u0435: \u043E\u0432\u0430 \u043C\u043E\u0434\u0443\u043B\u0430 \u0437\u0430\u0445\u0442\u0435\u0432\u0430 \u0438\u0441\u043F\u0440\u0430\u0432\u0435 \u043D\u0430\u0434 \u043C\u043E\u0434\u0443\u043B\u0438\u043C\u0430 \u043E\u0434 \u043A\u043E\u0458\u0435 \u043E\u0432\u0430 \u0437\u0430\u0432\u0438\u0441\u043D\u0438. \u041D\u0435\u043A\u0438 \u043E\u0434 \u045A\u0438\u0445 \u043D\u0438\u0441\u0443 \u043A\u043E\u043C\u043F\u0430\u0442\u0438\u0431\u0438\u043B\u043D\u0438 \u0441\u0430 \u0432\u0430\u0448\u043E\u043C \u0432\u0435\u0440\u0437\u0438\u0458\u043E\u043C Jenkins-\u0430. \u041C\u043E\u0440\u0430\u0442\u0435 \u0442\u0430\u043A\u043E\u0452\u0435 \u043F\u043E\u0434\u0435\u0441\u0438\u0442\u0438 \u0437\u0430\u0434\u0430\u0442\u043A\u0435 \u043A\u043E\u0458\u0435 \u0438\u0445 \u043A\u043E\u0440\u0438\u0441\u0442\u0435. +depCoreWarning=\u0423\u043F\u043E\u0437\u043E\u0440\u0435\u045A\u0435: \u043E\u0432\u0430 \u043C\u043E\u0434\u0443\u043B\u0430 \u0437\u0430\u0445\u0442\u0435\u0432\u0430 \u0438\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u0443 \u0434\u0440\u0443\u0433\u0438\u0445 \u043C\u043E\u0434\u0443\u043B\u0430 \u043A\u043E\u0458\u0435 \u0441\u0443 \u0441\u0430\u043C\u043E \u0437\u0430 Jenkins \u0432\u0435\u0440\u0437\u0438\u0458\u0443 {0} \u0438\u043B\u0438 \u043D\u043E\u0432\u0438\u0458\u0435. \u041F\u043E\u0441\u0442\u043E\u0458\u0438 \u0448\u0430\u043D\u0441\u0430 \u0434\u0430 \u043E\u043D\u0438 \u043D\u0435\u045B\u0435 \u0440\u0430\u0434\u0438\u0442\u0438 \u0441\u0430 \u0432\u0430\u0448\u043E\u043C \u0432\u0435\u0440\u0437\u0438\u0458\u043E\u043C Jenkins-\u0430, \u0442\u0430\u043A\u043E\u0452\u0435 \u0438 \u043E\u0432\u0430. +Inactive=\u041D\u0435\u0430\u043A\u0442\u0438\u0432\u043D\u0435 +No\ updates=\u041D\u0435\u043C\u0430 \u043D\u0430\u0434\u0433\u0440\u0430\u0434\u045A\u0430 +Install\ without\ restart=\u0418\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u0458 \u0431\u0435\u0437 \u043F\u043E\u043D\u043E\u0432\u043E\u0433 \u043F\u043E\u043A\u0440\u0435\u0442\u0430\u045A\u0430 +Download\ now\ and\ install\ after\ restart=\u041F\u0440\u0435\u0443\u0437\u043C\u0438 \u0441\u0430\u0434\u0430 \u0438 \u0438\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u0458\u0442\u0435 \u043D\u0430\u043A\u043E\u043D \u043F\u043E\u043D\u043E\u0432\u043E\u0433 \u043F\u043E\u043A\u0440\u0435\u0442\u0430\u045A\u0430 diff --git a/core/src/main/resources/hudson/PluginWrapper/PluginWrapperAdministrativeMonitor/message.jelly b/core/src/main/resources/hudson/PluginWrapper/PluginWrapperAdministrativeMonitor/message.jelly index 54fe0726608696b7178c3f83eaea44c6230ab679..bbffff4593374eb20815747d4b3b3f4333e9afb6 100644 --- a/core/src/main/resources/hudson/PluginWrapper/PluginWrapperAdministrativeMonitor/message.jelly +++ b/core/src/main/resources/hudson/PluginWrapper/PluginWrapperAdministrativeMonitor/message.jelly @@ -1,12 +1,12 @@ - +
        - There are dependency errors loading some plugins: + ${%Dependency errors}:
        • ${plugin.longName} v${plugin.version} diff --git a/core/src/main/resources/hudson/PluginWrapper/PluginWrapperAdministrativeMonitor/message.properties b/core/src/main/resources/hudson/PluginWrapper/PluginWrapperAdministrativeMonitor/message.properties new file mode 100644 index 0000000000000000000000000000000000000000..cbad3bfe78e220dad70d3fbac95042d1b14d4e7b --- /dev/null +++ b/core/src/main/resources/hudson/PluginWrapper/PluginWrapperAdministrativeMonitor/message.properties @@ -0,0 +1,22 @@ +# The MIT License +# +# Copyright (c) 2016, Damian Szczepanik +# +# 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. +Dependency\ errors=There are dependency errors loading some plugins diff --git a/core/src/main/resources/hudson/PluginWrapper/PluginWrapperAdministrativeMonitor/message_pl.properties b/core/src/main/resources/hudson/PluginWrapper/PluginWrapperAdministrativeMonitor/message_pl.properties new file mode 100644 index 0000000000000000000000000000000000000000..3d164add4dc87e3378b815804556207b8951a9c9 --- /dev/null +++ b/core/src/main/resources/hudson/PluginWrapper/PluginWrapperAdministrativeMonitor/message_pl.properties @@ -0,0 +1,23 @@ +# The MIT License +# +# Copyright (c) 2016, Damian Szczepanik +# +# 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. +Correct=Napraw +Dependency\ errors=Wyst\u0105pi\u0142y b\u0142\u0119dy podczas \u0142adowania niekt\u00F3rych wtyczek diff --git a/core/src/main/resources/hudson/PluginWrapper/PluginWrapperAdministrativeMonitor/message_sr.properties b/core/src/main/resources/hudson/PluginWrapper/PluginWrapperAdministrativeMonitor/message_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..bca24ec7867558e5ef384bf7c5a8d354695636ab --- /dev/null +++ b/core/src/main/resources/hudson/PluginWrapper/PluginWrapperAdministrativeMonitor/message_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Correct=\u041F\u0440\u0430\u0432\u0438\u043B\u043D\u043E diff --git a/core/src/main/resources/hudson/PluginWrapper/thirdPartyLicenses_de.properties b/core/src/main/resources/hudson/PluginWrapper/thirdPartyLicenses_de.properties index 187db016889c101b211396b3098f32b672639e72..84f1c402cef454d9d3e4353ae548f0dfd662a573 100644 --- a/core/src/main/resources/hudson/PluginWrapper/thirdPartyLicenses_de.properties +++ b/core/src/main/resources/hudson/PluginWrapper/thirdPartyLicenses_de.properties @@ -1,25 +1,25 @@ -# The MIT License -# -# Copyright (c) 2004-2010, Sun Microsystems, Inc. -# -# 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. - -about=\u00DCber {0} -No\ information\ recorded=Keine Informationen verf\u00FCgbar -3rd\ Party\ Dependencies=Dritthersteller-Abh\u00E4ngigkeiten +# The MIT License +# +# Copyright (c) 2004-2010, Sun Microsystems, Inc. +# +# 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. + +about=\u00DCber {0} +No\ information\ recorded=Keine Informationen verf\u00FCgbar +3rd\ Party\ Dependencies=Dritthersteller-Abh\u00E4ngigkeiten diff --git a/core/src/main/resources/hudson/PluginWrapper/thirdPartyLicenses_pl.properties b/core/src/main/resources/hudson/PluginWrapper/thirdPartyLicenses_pl.properties new file mode 100644 index 0000000000000000000000000000000000000000..940ca0bd1742c9d095dc7a7e5f19adc8eaaa8845 --- /dev/null +++ b/core/src/main/resources/hudson/PluginWrapper/thirdPartyLicenses_pl.properties @@ -0,0 +1,24 @@ +# The MIT License +# +# Copyright (c) 2017, Damian Szczepanik +# +# 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. +about=O {0} +No\ information\ recorded=Brak danych +3rd\ Party\ Dependencies=Biblioteki zale\u017Cne diff --git a/core/src/main/resources/hudson/PluginWrapper/thirdPartyLicenses_sr.properties b/core/src/main/resources/hudson/PluginWrapper/thirdPartyLicenses_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..5790695505a246d8cde4defb633382888820a43a --- /dev/null +++ b/core/src/main/resources/hudson/PluginWrapper/thirdPartyLicenses_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +about=\u0418\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0458\u0430 \u043E {0} +3rd\ Party\ Dependencies=\u0417\u0430\u0432\u0438\u0441\u043D\u043E\u0441\u0442\u0438 \u0441\u0430 \u0440\u0430\u0437\u043D\u0438\u0445 \u0441\u0442\u0440\u0430\u043D\u0430 +No\ information\ recorded=\u041D\u0438\u0458\u0435 \u043D\u0438\u0448\u0442\u0430 \u0437\u0430\u043F\u0438\u0441\u0430\u043D\u043E diff --git a/core/src/main/resources/hudson/PluginWrapper/uninstall_sr.properties b/core/src/main/resources/hudson/PluginWrapper/uninstall_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..cf1a20a90ef369030e3068895180f424207f6932 --- /dev/null +++ b/core/src/main/resources/hudson/PluginWrapper/uninstall_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +title=\u0414\u0435\u0438\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u0430 \u043C\u043E\u0434\u0443\u043B\u0435 {0} +Yes=\u0414\u0430 +msg=\u0414\u0435\u0438\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u0442\u0438 \u045B\u0435 \u0442\u0435 \u043C\u043E\u0434\u0443\u043B\u0443 {0}, \u0448\u0442\u043E \u045B\u0435 \u0458\u0435 \u0438\u0437\u0431\u0440\u0438\u0441\u0430\u0442\u0438 \u0441\u0430 \u043F\u0440\u043E\u043C\u0435\u043D\u0459\u0438\u0432\u0435 $JENKINS_HOME, \u0430\u043B\u0438 \u045B\u0435 \u043F\u0440\u0435\u043E\u0441\u0442\u0430\u0442\u0438 \u043F\u043E\u0434\u0430\u0446\u0438 \u043E \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0443. \ No newline at end of file diff --git a/core/src/main/resources/hudson/ProxyConfiguration/config_sr.properties b/core/src/main/resources/hudson/ProxyConfiguration/config_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..3e622e98adc7ed57d26735ae87559a3326c010ae --- /dev/null +++ b/core/src/main/resources/hudson/ProxyConfiguration/config_sr.properties @@ -0,0 +1,21 @@ +# This file is under the MIT License by authors + +Password=\u041B\u043E\u0437\u0438\u043D\u043A\u0430 +User\ name=\u041A\u043E\u0440\u0438\u0441\u043D\u0438\u0447\u043A\u043E \u0438\u043C\u0435 +Port=\u041F\u043E\u0440\u0442 +Server=\u0421\u0435\u0440\u0432\u0435\u0440 +No\ Proxy\ Host=\u041D\u0435\u043C\u0430 Proxy \u0425\u043E\u0441\u0442 +Validate\ Proxy=\u041F\u0440\u043E\u0432\u0435\u0440\u0438 Proxy +Proxy\ Needs\ Authorization=\u041F\u043E\u0442\u0440\u0435\u0431\u043D\u043E \u0430\u0443\u0442\u043E\u0440\u0438\u0437\u0430\u0446\u0438\u0458\u0430 \u0437\u0430 Proxy +No\ Proxy\ for=\u041D\u0435 \u043F\u043E\u0441\u0442\u043E\u0458\u0438 Proxy \u0437\u0430 +Check\ now=\u041F\u0440\u043E\u0432\u0435\u0440\u0438 \u0441\u0430\u0434\u0430 +HTTP\ Proxy\ Configuration=\u041F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 HTTP Proxy +Submit=\u041F\u043E\u0434\u043D\u0435\u0441\u0438 +lastUpdated=\u0417\u0430\u0434\u045A\u0435 \u0430\u0436\u0443\u0440\u0438\u0440\u0430\u043D\u043E: \u043F\u0440\u0435 {0} +uploadtext=\u041C\u043E\u0436\u0435\u0442\u0435 \u043E\u0442\u043F\u0440\u0435\u043C\u0438\u0442\u0438 .hpi \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0443 \u0434\u0430 \u0438\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u0442\u0435 \u043C\u043E\u0434\u0443\u043B\u0443 \u043A\u043E\u0458\u0430 \u0458\u0435 \u0432\u0430\u043D \u0433\u043B\u0430\u0432\u043D\u043E\u0433 \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0458\u0443\u043C\u0430 \u0437\u0430 \u043C\u043E\u0434\u0443\u043B\u0435. +Test\ URL=URL \u0430\u0434\u0440\u0435\u0441\u0430 \u0437\u0430 \u0442\u0435\u0441\u0442\u0438\u0440\u0430\u045A\u0435 +Upload\ Plugin=\u041E\u0442\u043F\u0440\u0435\u043C\u0438 \u043C\u043E\u0434\u0443\u043B\u0443 +File=\u0414\u0430\u0442\u043E\u0442\u0435\u043A\u0430 +Upload=\u041E\u0442\u043F\u0440\u0435\u043C\u0438 +URL=URL \u0430\u0434\u0440\u0435\u0441\u0430 +Update\ Site=\u0410\u0436\u0443\u0440\u0438\u0440\u0430\u0458 \u0441\u0442\u0440\u0430\u043D\u0443 \ No newline at end of file diff --git a/core/src/main/resources/hudson/ProxyConfiguration/help-noProxyHost.html b/core/src/main/resources/hudson/ProxyConfiguration/help-noProxyHost.html index a0421a779264427d811147690c627608acca2aed..91f8dbd8c11e1c868d506d3552a7580a12be5ede 100644 --- a/core/src/main/resources/hudson/ProxyConfiguration/help-noProxyHost.html +++ b/core/src/main/resources/hudson/ProxyConfiguration/help-noProxyHost.html @@ -1,4 +1,4 @@
          Specify host name patterns that shouldn't go through the proxy, one host per line. - "*" is the wild card host name (such as "*.cloudbees.com" or "www*.jenkins-ci.org") + "*" is the wild card host name (such as "*.jenkins.io" or "www*.jenkins-ci.org")
          \ No newline at end of file diff --git a/core/src/main/resources/hudson/ProxyConfiguration/help-noProxyHost_de.html b/core/src/main/resources/hudson/ProxyConfiguration/help-noProxyHost_de.html index d47178d1e4a4a9f33358589873362d70e0b1d12c..73059648808f598cb1828ecfbc0e7fb1dde1b0b5 100644 --- a/core/src/main/resources/hudson/ProxyConfiguration/help-noProxyHost_de.html +++ b/core/src/main/resources/hudson/ProxyConfiguration/help-noProxyHost_de.html @@ -2,5 +2,5 @@ Geben Sie Servernamen-Muster an, die nicht über den Proxy abgerufen werden sollen. Geben Sie einen Eintrag pro Zeile ein. Verwenden Sie gegebenenfalls das Jokerzeichen "*", um Gruppen von Servern anzugeben - (wie in "*.cloudbees.com" or "www*.jenkins-ci.org") + (wie in "*.jenkins.io" or "www*.jenkins-ci.org")
        diff --git a/core/src/main/resources/hudson/ProxyConfiguration/help-noProxyHost_ja.html b/core/src/main/resources/hudson/ProxyConfiguration/help-noProxyHost_ja.html index 76705e6eef7709f4cc64b7d6129da9feaa706f9f..c349cc67b5784ce0178ea62e89aa9eaa526db065 100644 --- a/core/src/main/resources/hudson/ProxyConfiguration/help-noProxyHost_ja.html +++ b/core/src/main/resources/hudson/ProxyConfiguration/help-noProxyHost_ja.html @@ -1,4 +1,4 @@
        プロキシーを使用しないホスト名のパターンを1行に1つずつ設定します。 - ホスト名には"*"(ワイルドカード)を、"*.cloudbees.com"や"www*.jenkins-ci.org"のように使用することができます。 + ホスト名には"*"(ワイルドカード)を、"*.jenkins.io"や"www*.jenkins-ci.org"のように使用することができます。
        \ No newline at end of file diff --git a/core/src/main/resources/hudson/ProxyConfiguration/help-noProxyHost_zh_TW.html b/core/src/main/resources/hudson/ProxyConfiguration/help-noProxyHost_zh_TW.html index 457b9233572244385d6a88b13d125b3f38c49906..a6df9c10ede16f45736e111fa9ae7a1cffec35dc 100644 --- a/core/src/main/resources/hudson/ProxyConfiguration/help-noProxyHost_zh_TW.html +++ b/core/src/main/resources/hudson/ProxyConfiguration/help-noProxyHost_zh_TW.html @@ -1,4 +1,4 @@
        指定不要透過代理伺服器連線的主機名稱樣式,一行一個。 - 可以使用 "*" 代表任何字串 (例如 "*.cloudbees.com" 或是 "www*.jenkins-ci.org")。 + 可以使用 "*" 代表任何字串 (例如 "*.jenkins.io" 或是 "www*.jenkins-ci.org")。
        \ No newline at end of file diff --git a/core/src/main/resources/hudson/TcpSlaveAgentListener/index.jelly b/core/src/main/resources/hudson/TcpSlaveAgentListener/index.jelly index 48854e95fb91e191db00c863ddc839defae840a0..9be4024272949af77f600a245069203a862b2808 100644 --- a/core/src/main/resources/hudson/TcpSlaveAgentListener/index.jelly +++ b/core/src/main/resources/hudson/TcpSlaveAgentListener/index.jelly @@ -26,13 +26,13 @@ THE SOFTWARE. diff --git a/core/src/main/resources/hudson/cli/CLIAction/index.properties b/core/src/main/resources/hudson/cli/CLIAction/index.properties index d2e768307a2f9f6c0bcb6d855d43c372e4a5705a..e4eebf4895f7df8a40581f8f41ff9fdf39f88903 100644 --- a/core/src/main/resources/hudson/cli/CLIAction/index.properties +++ b/core/src/main/resources/hudson/cli/CLIAction/index.properties @@ -1,4 +1,4 @@ Jenkins\ CLI=Jenkins CLI blurb=You can access various features in Jenkins through a command-line tool. See \ - the Wiki for more details of this feature.\ + the documentation for more details of this feature.\ To get started, download jenkins-cli.jar, and run it as follows: diff --git a/core/src/main/resources/hudson/cli/CLIAction/index_de.properties b/core/src/main/resources/hudson/cli/CLIAction/index_de.properties index d7b0a91ed18998be6e85e5a9283999dcf601ac00..372ffd4e8a75d1a18407307a843373c29776f26f 100644 --- a/core/src/main/resources/hudson/cli/CLIAction/index_de.properties +++ b/core/src/main/resources/hudson/cli/CLIAction/index_de.properties @@ -2,6 +2,6 @@ Available\ Commands=Verf\u00FCgbare Kommandos Jenkins\ CLI=Jenkins CLI blurb=\ Sie knnen ausgewhlte Funktionen von Jenkins ber ein Kommandozeilenwerkzeug (engl.: Command Line Interface, CLI) nutzen. \ - Nheres dazu finden Sie im Wiki. \ + Nheres dazu finden Sie in der Dokumentation. \ Um Jenkins CLI einzusetzen, laden Sie jenkins-cli.jar \ lokal herunter und starten es wie folgt: diff --git a/core/src/main/resources/hudson/cli/CLIAction/index_es.properties b/core/src/main/resources/hudson/cli/CLIAction/index_es.properties index 16d664612b1f6bcc029e5f1c392fddca226ba5dc..3639ef88311f251c3bf2d80882f1c135ca6ee7c3 100644 --- a/core/src/main/resources/hudson/cli/CLIAction/index_es.properties +++ b/core/src/main/resources/hudson/cli/CLIAction/index_es.properties @@ -21,7 +21,7 @@ # THE SOFTWARE. blurb=Puedes acceder a varias funcionalidades de Jenkins utilizando la linea de comandos. \ - Echa un vistazo a esta pgina para mas detalles. \ + Echa un vistazo a esta pgina para mas detalles. \ Para comenzar, descarga a href="{0}/jnlpJars/jenkins-cli.jar">jenkins-cli.jar, y ejecuta lo siguiente: Jenkins\ CLI=Interfaz de comandos (CLI) de Jenkins Available\ Commands=Comandos disponibles diff --git a/core/src/main/resources/hudson/cli/CLIAction/index_fr.properties b/core/src/main/resources/hudson/cli/CLIAction/index_fr.properties index 5bb5e770f340c3b11b3e248fb00b83951837de53..c51c705ec8f1c2b37f650af27c2ee908b3c18c44 100644 --- a/core/src/main/resources/hudson/cli/CLIAction/index_fr.properties +++ b/core/src/main/resources/hudson/cli/CLIAction/index_fr.properties @@ -22,4 +22,4 @@ Available\ Commands=Commandes disponibles Jenkins\ CLI=Ligne de commande (CLI) Jenkins -blurb=Vous pouvez acc\u00E9der \u00E0 diverses fonctionnalit\u00E9s de Jenkins \u00E0 travers une ligne de commande. Voir le wiki pour plus d''information sur cette fonctionnalit\u00E9. Pour d\u00E9buter, t\u00E9l\u00E9chargez jenkins-cli.jar et utilisez le comme suit: +blurb=Vous pouvez acc\u00E9der \u00E0 diverses fonctionnalit\u00E9s de Jenkins \u00E0 travers une ligne de commande. Voir le wiki pour plus d''information sur cette fonctionnalit\u00E9. Pour d\u00E9buter, t\u00E9l\u00E9chargez jenkins-cli.jar et utilisez le comme suit: diff --git a/core/src/main/resources/hudson/cli/CLIAction/index_it.properties b/core/src/main/resources/hudson/cli/CLIAction/index_it.properties index fb7ef102f1af3b3951390e87d6c8e692c6155592..61db53365e174fc8e139a82cb822835a591d8afc 100644 --- a/core/src/main/resources/hudson/cli/CLIAction/index_it.properties +++ b/core/src/main/resources/hudson/cli/CLIAction/index_it.properties @@ -1,5 +1,5 @@ Available\ Commands=Comandi disponibili Jenkins\ CLI=Jenkins CLI blurb=Puoi accede alle funzionalit\u00e0\u00a0 di Jenkins attraverso un tool da linea di comando. Per maggiori dettagli visita \ - la Wiki. \ + la Wiki. \ Per iniziare, scarica jenkins-cli.jar, e lancia il seguente comando: diff --git a/core/src/main/resources/hudson/cli/CLIAction/index_ja.properties b/core/src/main/resources/hudson/cli/CLIAction/index_ja.properties index a6522667f8976f705ef254be74139c9b1e0bd042..67bc6c6caa432fd000af3388f89a651538823976 100644 --- a/core/src/main/resources/hudson/cli/CLIAction/index_ja.properties +++ b/core/src/main/resources/hudson/cli/CLIAction/index_ja.properties @@ -21,7 +21,7 @@ # THE SOFTWARE. blurb=\u30b3\u30de\u30f3\u30c9\u30e9\u30a4\u30f3\u306e\u30c4\u30fc\u30eb\u304b\u3089Jenkins\u306e\u69d8\u3005\u306a\u6a5f\u80fd\u3092\u5229\u7528\u3067\u304d\u307e\u3059\u3002\ - \u8a73\u7d30\u306fWiki\u3092\u53c2\u7167\u3057\u3066\u304f\u3060\u3055\u3044\u3002\ + \u8a73\u7d30\u306fWiki\u3092\u53c2\u7167\u3057\u3066\u304f\u3060\u3055\u3044\u3002\ \u307e\u305a\u306f\u3001jenkins-cli.jar\u3092\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u3057\u3066\u6b21\u306e\u3088\u3046\u306b\u8d77\u52d5\u3057\u3066\u304f\u3060\u3055\u3044\u3002 Jenkins\ CLI=Jenkins CLI Available\ Commands=\u5229\u7528\u53ef\u80fd\u306a\u30b3\u30de\u30f3\u30c9 diff --git a/core/src/main/resources/hudson/cli/CLIAction/index_nl.properties b/core/src/main/resources/hudson/cli/CLIAction/index_nl.properties index ee556037d30731fc4b55aee6c8c277ca42c8ca7c..da112a81401f8f3cd21ad805bb39317c029f7648 100644 --- a/core/src/main/resources/hudson/cli/CLIAction/index_nl.properties +++ b/core/src/main/resources/hudson/cli/CLIAction/index_nl.properties @@ -21,4 +21,4 @@ # THE SOFTWARE. Available\ Commands=Beschikbare commando''s -blurb=Je kan gebruik maken van verschillende mogelijkheden in Jenkins via een opdracht op de commandoregel. Zie de Wiki voor verder details hierover. Om te beginnen, download jenkins-cli.jar, en voer het uit als volgt: +blurb=Je kan gebruik maken van verschillende mogelijkheden in Jenkins via een opdracht op de commandoregel. Zie de Wiki voor verder details hierover. Om te beginnen, download jenkins-cli.jar, en voer het uit als volgt: diff --git a/core/src/main/resources/hudson/cli/CLIAction/index_pt_BR.properties b/core/src/main/resources/hudson/cli/CLIAction/index_pt_BR.properties index 2cabf24de096206d9081cf056721b7c586aa6e6c..9eb5bd486e6baba0d3a3255edc88ae178ed22f19 100644 --- a/core/src/main/resources/hudson/cli/CLIAction/index_pt_BR.properties +++ b/core/src/main/resources/hudson/cli/CLIAction/index_pt_BR.properties @@ -23,8 +23,8 @@ Available\ Commands=Comandos dispon\u00EDveis Jenkins\ CLI= # You can access various features in Jenkins through a command-line tool. See \ -# the Wiki for more details of this feature.\ +# the Wiki for more details of this feature.\ # To get started, download jenkins-cli.jar, and run it as follows: -blurb=\ Voc\u00ea pode acessar v\u00e1rias funcionalidades do Jenkins pelo prompt de comando. Veja \ +blurb=\ Voc\u00ea pode acessar v\u00e1rias funcionalidades do Jenkins pelo prompt de comando. Veja \ a Wiki diff --git a/core/src/main/resources/hudson/cli/CLIAction/index_ru.properties b/core/src/main/resources/hudson/cli/CLIAction/index_ru.properties index 2e962ae4686128ddf10b194e06590b50bffd0ec1..6af77f38a59af7b3137699bf22118e076535139f 100644 --- a/core/src/main/resources/hudson/cli/CLIAction/index_ru.properties +++ b/core/src/main/resources/hudson/cli/CLIAction/index_ru.properties @@ -22,4 +22,4 @@ Available\ Commands=\u0414\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u0435 \u043A\u043E\u043C\u0430\u043D\u0434\u044B Jenkins\ CLI=\u041A\u043E\u043D\u0441\u043E\u043B\u044C\u043D\u044B\u0435 \u043A\u043E\u043C\u0430\u043D\u0434\u044B Jenkins -blurb=\u0421 \u043F\u043E\u043C\u043E\u0449\u044C\u044E \u043A\u043E\u043D\u0441\u043E\u043B\u044C\u043D\u044B\u0445 \u043A\u043E\u043C\u0430\u043D\u0434 Jenkins \u0432\u044B \u043C\u043E\u0436\u0435\u0442\u0435 \u043F\u043E\u043B\u0443\u0447\u0438\u0442\u044C \u0434\u043E\u0441\u0442\u0443\u043F \u043A \u0431\u043E\u043B\u044C\u0448\u043E\u043C\u0443 \u043A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u0444\u0443\u043D\u043A\u0446\u0438\u0439. \u0411\u043E\u043B\u0435\u0435 \u0434\u0435\u0442\u0430\u043B\u044C\u043D\u0430\u044F \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u044F \u043D\u0430\u0445\u043E\u0434\u0438\u0442\u0441\u044F \u0432 \u0431\u0430\u0437\u0435 \u0437\u043D\u0430\u043D\u0438\u0439 Jenkins. \u0414\u043B\u044F \u0442\u043E\u0433\u043E, \u0447\u0442\u043E\u0431\u044B \u043D\u0430\u0447\u0430\u0442\u044C \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C\u0441\u044F \u043A\u043E\u043D\u0441\u043E\u043B\u044C\u043D\u044B\u043C\u0438 \u043A\u043E\u043C\u0430\u043D\u0434\u0430\u043C\u0438, \u043D\u0435\u043E\u0431\u0445\u043E\u0434\u0438\u043C\u043E \u0441\u043A\u0430\u0447\u0430\u0442\u044C jenkins-cli.jar, \u0438 \u0437\u0430\u043F\u0443\u0441\u0442\u0438\u0442\u044C \u043F\u0430\u043A\u0435\u0442 \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0438\u043C \u043E\u0431\u0440\u0430\u0437\u043E\u043C: +blurb=\u0421 \u043F\u043E\u043C\u043E\u0449\u044C\u044E \u043A\u043E\u043D\u0441\u043E\u043B\u044C\u043D\u044B\u0445 \u043A\u043E\u043C\u0430\u043D\u0434 Jenkins \u0432\u044B \u043C\u043E\u0436\u0435\u0442\u0435 \u043F\u043E\u043B\u0443\u0447\u0438\u0442\u044C \u0434\u043E\u0441\u0442\u0443\u043F \u043A \u0431\u043E\u043B\u044C\u0448\u043E\u043C\u0443 \u043A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u0444\u0443\u043D\u043A\u0446\u0438\u0439. \u0411\u043E\u043B\u0435\u0435 \u0434\u0435\u0442\u0430\u043B\u044C\u043D\u0430\u044F \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u044F \u043D\u0430\u0445\u043E\u0434\u0438\u0442\u0441\u044F \u0432 \u0431\u0430\u0437\u0435 \u0437\u043D\u0430\u043D\u0438\u0439 Jenkins. \u0414\u043B\u044F \u0442\u043E\u0433\u043E, \u0447\u0442\u043E\u0431\u044B \u043D\u0430\u0447\u0430\u0442\u044C \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u044C\u0441\u044F \u043A\u043E\u043D\u0441\u043E\u043B\u044C\u043D\u044B\u043C\u0438 \u043A\u043E\u043C\u0430\u043D\u0434\u0430\u043C\u0438, \u043D\u0435\u043E\u0431\u0445\u043E\u0434\u0438\u043C\u043E \u0441\u043A\u0430\u0447\u0430\u0442\u044C jenkins-cli.jar, \u0438 \u0437\u0430\u043F\u0443\u0441\u0442\u0438\u0442\u044C \u043F\u0430\u043A\u0435\u0442 \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0438\u043C \u043E\u0431\u0440\u0430\u0437\u043E\u043C: diff --git a/core/src/main/resources/hudson/cli/CLIAction/index_sr.properties b/core/src/main/resources/hudson/cli/CLIAction/index_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..8f1eec2169e7b24d2662aee366f8f294a83eb927 --- /dev/null +++ b/core/src/main/resources/hudson/cli/CLIAction/index_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +Jenkins\ CLI=Jenkins \u0441\u0430 \u043A\u043E\u043C\u0430\u043D\u0434\u043D\u0435 \u043B\u0438\u043D\u0438\u0458\u0435 +blurb=\u041F\u043E\u043C\u043E\u045B\u0443 \u043A\u043E\u043D\u0437\u043E\u043B\u0435 \u043A\u043E\u043C\u0430\u043D\u0434\u0435 Jenkins \u043C\u043E\u0436\u0435\u0442\u0435 \u0434\u043E\u0431\u0438\u0442\u0438 \u043F\u0440\u0438\u0441\u0442\u0443\u043F \u0432\u0435\u043B\u0438\u043A\u043E\u043C \u0431\u0440\u043E\u0458\u0443 \u0444\u0443\u043D\u043A\u0446\u0438\u0458\u0430. \u0414\u0435\u0442\u0430\u0459\u043D\u0435 \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0458\u0435 \u0441\u0435 \u043D\u0430\u043B\u0430\u0437\u0435 \u043D\u0430 \u0443 Jenkins \u0432\u0438\u043A\u0438. \u0423 \u0446\u0438\u0459\u0443 \u0434\u0430 \u043F\u043E\u0447\u043D\u0435\u0442\u0435 \u0434\u0430 \u043A\u043E\u0440\u0438\u0441\u0442\u0438\u0442\u0435 \u043A\u043E\u043C\u0430\u043D\u0434\u0443, \u043F\u043E\u0442\u0440\u0435\u0431\u043D\u043E \u0458\u0435 \u0434\u0430 \u043F\u0440\u0435\u0443\u0437\u043C\u0435\u0442\u0435 jenkins-cli.jar, \u0438 \u043F\u043E\u043A\u0440\u0435\u043D\u0435\u0442\u0435 \u043F\u0430\u043A\u0435\u0442 \u043D\u0430 \u0441\u043B\u0435\u0434\u0435\u045B\u0438 \u043D\u0430\u0447\u0438\u043D: +Available\ Commands=\u0414\u043E\u0441\u0442\u0443\u043F\u043D\u0435 \u043A\u043E\u043C\u0430\u043D\u0434\u0435 diff --git a/core/src/main/resources/hudson/cli/CLIAction/index_zh_CN.properties b/core/src/main/resources/hudson/cli/CLIAction/index_zh_CN.properties index f8cf7eede7f9deedda158318c3ad24db352f74e2..bd6ca6d779ec5cf93bfab86cf1639fa22112c033 100644 --- a/core/src/main/resources/hudson/cli/CLIAction/index_zh_CN.properties +++ b/core/src/main/resources/hudson/cli/CLIAction/index_zh_CN.properties @@ -22,4 +22,4 @@ Available\ Commands=\u53EF\u7528\u7684\u547D\u4EE4 Jenkins\ CLI=Jenkins \u547d\u4ee4\u884c -blurb=\u4F60\u53EF\u4EE5\u901A\u8FC7\u547D\u4EE4\u884C\u5DE5\u5177\u64CD\u4F5CJenkins\u7684\u8BB8\u591A\u7279\u6027\u3002\u4F60\u53EF\u4EE5\u901A\u8FC7 Wiki\u83B7\u5F97\u66F4\u591A\u4FE1\u606F\u3002\u4F5C\u4E3A\u5F00\u59CB\uFF0C\u4F60\u53EF\u4EE5\u4E0B\u8F7Djenkins-cli.jar\uFF0C\u7136\u540E\u8FD0\u884C\u4E0B\u5217\u547D\u4EE4\uFF1A +blurb=\u4F60\u53EF\u4EE5\u901A\u8FC7\u547D\u4EE4\u884C\u5DE5\u5177\u64CD\u4F5CJenkins\u7684\u8BB8\u591A\u7279\u6027\u3002\u4F60\u53EF\u4EE5\u901A\u8FC7 Wiki\u83B7\u5F97\u66F4\u591A\u4FE1\u606F\u3002\u4F5C\u4E3A\u5F00\u59CB\uFF0C\u4F60\u53EF\u4EE5\u4E0B\u8F7Djenkins-cli.jar\uFF0C\u7136\u540E\u8FD0\u884C\u4E0B\u5217\u547D\u4EE4\uFF1A diff --git a/core/src/main/resources/hudson/cli/CLIAction/index_zh_TW.properties b/core/src/main/resources/hudson/cli/CLIAction/index_zh_TW.properties index aaa1f13048e6b46773f370df96af275a93410297..8b9bb390ecec0bb3bd3604f6fc5035b0c4a4e656 100644 --- a/core/src/main/resources/hudson/cli/CLIAction/index_zh_TW.properties +++ b/core/src/main/resources/hudson/cli/CLIAction/index_zh_TW.properties @@ -24,6 +24,6 @@ Jenkins\ CLI=Jenkins \u547d\u4ee4\u5217\u4ecb\u9762 blurb=\ \u60a8\u53ef\u4ee5\u900f\u904e\u547d\u4ee4\u5217\u5de5\u5177\u4f7f\u7528 Jenkins \u7684\u8af8\u591a\u529f\u80fd\u3002\ - \u5728 Wiki \u4e0a\u6709\u8a73\u7d30\u7684\u529f\u80fd\u8aaa\u660e\u3002\ + \u5728 Wiki \u4e0a\u6709\u8a73\u7d30\u7684\u529f\u80fd\u8aaa\u660e\u3002\ \u5fc3\u52d5\u4e0d\u5982\u99ac\u4e0a\u884c\u52d5\uff0c\u4e0b\u8f09 jenkins-cli.jar \u4e26\u57f7\u884c\u4ee5\u4e0b\u6307\u4ee4: Available\ Commands=\u53ef\u7528\u6307\u4ee4 diff --git a/core/src/main/resources/hudson/cli/CliProtocol/description.jelly b/core/src/main/resources/hudson/cli/CliProtocol/description.jelly index e24d56912900efe6607d1b434a1ec7cf61bdeee0..55e2c974b5ba1050be718c322da2b72ff5d8cd2a 100644 --- a/core/src/main/resources/hudson/cli/CliProtocol/description.jelly +++ b/core/src/main/resources/hudson/cli/CliProtocol/description.jelly @@ -1,4 +1,4 @@ - ${%Accepts connections from CLI clients} + ${%summary} diff --git a/core/src/main/resources/hudson/cli/CliProtocol/description.properties b/core/src/main/resources/hudson/cli/CliProtocol/description.properties new file mode 100644 index 0000000000000000000000000000000000000000..76b368aed3841dd8a32e7e24d1f37ca8ed08a25d --- /dev/null +++ b/core/src/main/resources/hudson/cli/CliProtocol/description.properties @@ -0,0 +1 @@ +summary=Accepts connections from CLI clients. This protocol is unencrypted. \ No newline at end of file diff --git a/core/src/main/resources/hudson/cli/CliProtocol2/description.jelly b/core/src/main/resources/hudson/cli/CliProtocol2/description.jelly index 66f27c511c1b651aa6ba9cb396d4140384750ae3..55e2c974b5ba1050be718c322da2b72ff5d8cd2a 100644 --- a/core/src/main/resources/hudson/cli/CliProtocol2/description.jelly +++ b/core/src/main/resources/hudson/cli/CliProtocol2/description.jelly @@ -1,4 +1,4 @@ - ${%Extends the version 1 protocol by adding transport encryption} + ${%summary} diff --git a/core/src/main/resources/hudson/cli/CliProtocol2/description.properties b/core/src/main/resources/hudson/cli/CliProtocol2/description.properties new file mode 100644 index 0000000000000000000000000000000000000000..609298c8b4029a3e48ce8c961cd4b433d43470fd --- /dev/null +++ b/core/src/main/resources/hudson/cli/CliProtocol2/description.properties @@ -0,0 +1 @@ +summary=Extends the version 1 protocol by adding transport encryption. diff --git a/core/src/main/resources/hudson/cli/Messages.properties b/core/src/main/resources/hudson/cli/Messages.properties index f2cf34d4d687eed873eed4a346af0363bca94282..997193ad61b509d453c58ff7de0ad82971ad0cc1 100644 --- a/core/src/main/resources/hudson/cli/Messages.properties +++ b/core/src/main/resources/hudson/cli/Messages.properties @@ -94,5 +94,5 @@ OfflineNodeCommand.ShortDescription=Stop using a node for performing builds temp WaitNodeOnlineCommand.ShortDescription=Wait for a node to become online. WaitNodeOfflineCommand.ShortDescription=Wait for a node to become offline. -CliProtocol.displayName=Jenkins CLI Protocol/1 -CliProtocol2.displayName=Jenkins CLI Protocol/2 +CliProtocol.displayName=Jenkins CLI Protocol/1 (unencrypted) +CliProtocol2.displayName=Jenkins CLI Protocol/2 (transport encryption) diff --git a/core/src/main/resources/hudson/cli/Messages_sr.properties b/core/src/main/resources/hudson/cli/Messages_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..a504742d83a470fcfbe23593087db7f45f73ac03 --- /dev/null +++ b/core/src/main/resources/hudson/cli/Messages_sr.properties @@ -0,0 +1,68 @@ +# This file is under the MIT License by authors + +InstallPluginCommand.DidYouMean={0} \u043B\u0438\u0447\u0438 \u043D\u0430 \u043A\u0440\u0430\u0442\u043A\u043E \u0438\u043C\u0435 \u0437\u0430 \u043C\u043E\u0434\u0443\u043B\u0443. \u0414\u0430 \u043B\u0438 \u0441\u0442\u0435 \u043C\u0438\u0441\u043B\u0438\u043B\u0438 \u2018{1}\u2019? +InstallPluginCommand.InstallingFromUpdateCenter=\u0418\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u045A\u0435 "{0}" \u0441\u0430 \u0446\u0435\u043D\u0442\u0440\u0430 \u0437\u0430 \u0430\u0436\u0443\u0440\u0438\u0430\u045A\u0430 +InstallPluginCommand.InstallingPluginFromLocalFile=\u0418\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u0430 \u043C\u043E\u0434\u0443\u043B\u0430 \u0441\u0430 \u043B\u043E\u043A\u0430\u043B\u0435 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0435 "{0}" +InstallPluginCommand.InstallingPluginFromUrl=\u0418\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u045A\u0435 \u043C\u043E\u0434\u0443\u043B\u0435 \u0441\u0430 {0} +InstallPluginCommand.NoUpdateCenterDefined=\u041D\u0438\u0458\u0435 \u043D\u0430\u0432\u0435\u0434\u0435\u043D \u0441\u0430\u0458\u0442 \u0437\u0430 \u0430\u0436\u0443\u0440\u0438\u0440\u0430\u045A\u0435 \u0443 \u043E\u0432\u043E\u0458 \u0438\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u0438 Jenkins. +InstallPluginCommand.NoUpdateDataRetrieved=\ \u041D\u0438\u0441\u0443 \u0458\u043E\u0448 \u043F\u0440\u0435\u0443\u0437\u0435\u0442\u0438 \u043F\u043E\u0434\u0430\u0446\u0438 \u0438\u0437 \u0446\u0435\u043D\u0442\u0440\u0430 \u0437\u0430 \u0430\u0436\u0443\u0440\u0438\u0440\u0430\u045A\u0435: {0} +InstallPluginCommand.NotAValidSourceName="{0}" \u043D\u0438\u0458\u0435 \u043D\u0438 \u0438\u043C\u0435 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0435, URL \u0430\u0434\u0440\u0435\u0441\u0430, \u043D\u0438\u0442\u0438 \u0438\u043C\u0435 \u043C\u043E\u0434\u0443\u043B\u0435 \u043D\u0430 \u0446\u0435\u043D\u0442\u0440\u0443 \u0437\u0430 \u0430\u0436\u0443\u0440\u0438\u0440\u0430\u045A\u0435 +AddJobToViewCommand.ShortDescription=\u041F\u0440\u0438\u043A\u0430\u0436\u0438 \u0437\u0430\u0434\u0430\u0442\u043A\u0435 \u0443 \u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0443 +BuildCommand.ShortDescription=\ \u041F\u043E\u043A\u0440\u0435\u043D\u0435 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0443 \u0437\u0430\u0434\u0430\u0442\u0430\u043A\u0430 \u0438 \u043E\u043F\u0446\u0438\u043E\u043D\u043E \u0447\u0435\u043A\u0430 \u0437\u0430 \u045A\u0435\u0433\u043E\u0432 \u0437\u0430\u0432\u0440\u0448\u0435\u0442\u0430\u043A +ConsoleCommand.ShortDescription=\u041F\u0440\u0435\u0443\u0437\u043C\u0435 \u0440\u0435\u0437\u0443\u043B\u0442\u0430\u0442 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 +CopyJobCommand.ShortDescription=\u0418\u0441\u043A\u043E\u043F\u0438\u0440\u0430 \u0437\u0430\u0434\u0430\u0442\u0430\u043A +CreateJobCommand.ShortDescription=\u041A\u0440\u0435\u0438\u0440\u0430 \u043D\u043E\u0432\u0438 \u0437\u0430\u0434\u0430\u0442\u0430\u043A \u0447\u0438\u0442\u0430\u0458\u0443\u045B\u0438 stdin \u043A\u0430\u043E \u043A\u043E\u043D\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043E\u043D\u0443 XML \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0443 +CreateNodeCommand.ShortDescription=\u041A\u0440\u0435\u0438\u0440\u0430 \u043D\u043E\u0432\u0443 \u043C\u0430\u0448\u0438\u043D\u0443 \u0447\u0438\u0442\u0430\u0458\u0443\u045B\u0438 stdin \u043A\u0430\u043E \u043A\u043E\u043D\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043E\u043D\u0443 XML \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0443 +CreateViewCommand.ShortDescription=\u041A\u0440\u0435\u0438\u0440\u0430 \u043D\u043E\u0432\u0438 \u043F\u0440\u0435\u0433\u043B\u0435\u0434 \u0447\u0438\u0442\u0430\u0458\u0443\u045B\u0438 stdin \u043A\u0430\u043E \u043A\u043E\u043D\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043E\u043D\u0443 XML \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0443 +DeleteBuildsCommand.ShortDescription=\u0418\u0437\u0431\u0440\u0438\u0448\u0435 \u043F\u043E\u0434\u0430\u0442\u043A\u0435 \u043E \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0438 +DeleteViewCommand.ShortDescription=\u0418\u0437\u0431\u0440\u0438\u0448\u0435 \u043F\u0440\u0435\u0433\u043B\u0435\u0434 +DeleteJobCommand.ShortDescription=\u0418\u0437\u0431\u0440\u0438\u0448\u0435 \u0437\u0430\u0434\u0430\u0442\u0430\u043A +GroovyCommand.ShortDescription=\u0418\u0437\u0432\u0440\u0448\u0438 \u043D\u0430\u0432\u0435\u0434\u0435\u043D Groovy \u043F\u0440\u043E\u0433\u0440\u0430\u043C +GroovyshCommand.ShortDescription=\u041F\u043E\u043A\u0440\u0435\u043D\u0435 \u0438\u043D\u0442\u0435\u0440\u0430\u043A\u0442\u0438\u0432\u0430\u043D \u0438\u043D\u0442\u0435\u0440\u043F\u0440\u0435\u0442\u0430\u0442\u043E\u0440 \u0437\u0430 Groovy +HelpCommand.ShortDescription=\u0418\u0441\u043F\u0438\u0448\u0435 \u0441\u0432\u0435 \u043A\u043E\u043C\u0430\u043D\u0434\u0435 \u0438\u043B\u0438 \u0434\u0435\u0442\u0430\u0459\u043D\u0438 \u043E\u043F\u0438\u0441 \u043E\u0434\u0440\u0435\u0452\u0435\u043D\u0435 \u043A\u043E\u043C\u0430\u043D\u0434\u0435. +InstallPluginCommand.ShortDescription=\u0418\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430 \u043C\u043E\u0434\u0443\u043B\u0443 \u0441\u0430 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0435, URL \u0430\u0434\u0440\u0435\u0441\u0435, \u0438\u043B\u0438 \u0446\u0435\u043D\u0442\u0440\u0430 \u0437\u0430 \u0430\u0436\u0443\u0440\u0438\u0440\u0430\u045A\u0435. +InstallToolCommand.ShortDescription=\u0410\u0443\u0442\u043E\u043C\u0430\u0442\u0441\u043A\u043E \u0438\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430 \u0430\u043B\u0430\u0442 \u0438 \u043F\u0440\u0438\u043A\u0430\u0436\u0435 \u045A\u0435\u0433\u043E\u0432\u0443 \u043B\u043E\u043A\u0430\u0446\u0438\u0458\u0438 \u043D\u0430 stdout. \u041C\u043E\u0436\u0435 \u0441\u0430\u043C\u043E \u0431\u0438\u0442\u0438 \u043F\u043E\u0437\u0432\u0430\u043D \u0443\u043D\u0443\u0442\u0430\u0440 \u0437\u0430\u0434\u0430\u0442\u043A\u043E\u043C. +ListChangesCommand.ShortDescription=\u041F\u0440\u0438\u043A\u0430\u0436\u0435 \u0434\u043D\u0435\u0432\u043D\u0438\u043A \u0438\u0437\u043C\u0435\u043D\u0430 \u0437\u0430 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0430 \u0438\u0437\u0433\u0440\u0430\u045A\u0430. +ListJobsCommand.ShortDescription=\u041F\u0440\u0438\u043A\u0430\u0436\u0435 \u0441\u0432\u0435 \u0437\u0430\u0434\u0430\u0442\u043A\u0435 \u043E\u0434\u0440\u0435\u0452\u0435\u043D\u0435 \u0432\u0440\u0441\u0442\u0435 \u0438\u043B\u0438 \u0433\u0440\u0443\u043F\u0435. +ListPluginsCommand.ShortDescription=\u041F\u0440\u0438\u043A\u0430\u0436\u0435 \u0441\u043F\u0438\u0441\u0430\u043A \u0438\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u043D\u0438\u0445 \u043C\u043E\u0434\u0443\u043B\u0430. +LoginCommand.ShortDescription=\u0421\u0430\u0447\u0443\u0432\u0430 \u0438\u0434\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0446\u0438\u0458\u0443, \u0434\u0430 \u0431\u0438 \u043D\u0430\u043A\u043D\u0430\u0434\u043D\u0438 \u0437\u0430\u0434\u0430\u0446\u0438 \u043C\u043E\u045B\u0438 \u0438\u0437\u0432\u0440\u0448\u0438\u0442\u0438 \u0431\u0435\u0437 \u043F\u043E\u043D\u043E\u0432\u0443 \u0438\u0434\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0446\u0438\u0458\u0443. +LogoutCommand.ShortDescription=\u0418\u0437\u0431\u0440\u0438\u0448\u0435 \u0438\u0434\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0446\u0438\u0458\u0443 \u0441\u0430\u0447\u0443\u0432\u0430\u043D\u043E \u043F\u0440\u0438\u043B\u0438\u043A\u043E\u043C \u043F\u0440\u0438\u0458\u0430\u0432\u0435. +MailCommand.ShortDescription=\u0418\u0437\u0447\u0438\u0442\u0430 stdin \u0438 \u043F\u043E\u0448\u0430\u0459\u0435 \u0441\u0430\u0434\u0440\u0436\u0430\u0458 \u043F\u0440\u0435\u043A\u043E \u0435-\u043F\u043E\u0448\u0442\u0435. +SetBuildParameterCommand.ShortDescription=\u0423\u0440\u0435\u0452\u0438\u0432\u0430\u045A\u0435/\u043F\u043E\u0441\u0442\u0430\u0432\u0459\u0430\u045A\u0435 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0430\u0440\u0430 \u043D\u0430 \u0442\u0440\u0435\u043D\u0443\u0442\u043D\u043E\u0458 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0438. +SetBuildDescriptionCommand.ShortDescription=\u041F\u043E\u0441\u0442\u0430\u0432\u0438 \u043E\u043F\u0438\u0441 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 +SetBuildResultCommand.ShortDescription=\u041F\u043E\u0441\u0442\u0430\u0432\u0438 \u0440\u0435\u0437\u0443\u043B\u0442\u0430\u0442 \u043D\u0430 \u0442\u0440\u0435\u043D\u0443\u0442\u043D\u0443 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0443. \u041C\u043E\u0436\u0435 \u0431\u0438\u0442\u0438 \u043F\u043E\u0437\u0432\u0430\u043D\u043E \u0441\u0430\u043C\u043E \u0443\u043D\u0443\u0442\u0430\u0440 \u0437\u0430\u0434\u0430\u0442\u0430\u043A\u0430. +RemoveJobFromViewCommand.ShortDescription=\u0423\u043A\u043B\u043E\u043D\u0438 \u0437\u0430\u0434\u0430\u0442\u043A\u0435 \u0441\u0430 \u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0430 +VersionCommand.ShortDescription=\u041F\u0440\u0438\u043A\u0430\u0436\u0435 \u0432\u0435\u0440\u0437\u0438\u0458\u0443 Jenkins. +GetJobCommand.ShortDescription=\u0418\u0441\u043F\u0438\u0448\u0435 \u0434\u0435\u0444\u0438\u043D\u0438\u0446\u0438\u0458\u0443 \u0437\u0430\u0434\u0430\u0442\u043A\u0430 \u0443 XML \u0444\u043E\u0440\u043C\u0430\u0442\u0443 \u043D\u0430 stdout. +GetNodeCommand.ShortDescription=\u0418\u0441\u043F\u0438\u0448\u0435 \u0434\u0435\u0444\u0438\u043D\u0438\u0446\u0438\u0458\u0443 \u043C\u0430\u0448\u0438\u043D\u0435 \u0443 XML \u0444\u043E\u0440\u043C\u0430\u0442\u0443 \u043D\u0430 stdout. +GetViewCommand.ShortDescription=\u0418\u0441\u043F\u0438\u0448\u0435 \u0434\u0435\u0444\u0438\u043D\u0438\u0446\u0438\u0458\u0443 \u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0430 \u0443 XML \u0444\u043E\u0440\u043C\u0430\u0442\u0443 \u043D\u0430 stdout. +SetBuildDisplayNameCommand.ShortDescription=\u041F\u043E\u0441\u0442\u0430\u0432\u0438 \u0438\u043C\u0435 (displayName) \u043E \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0438. +WhoAmICommand.ShortDescription=\u0418\u0437\u0432\u0435\u0448\u0442\u0430je \u0432\u0430\u0448\u0435 \u0430\u043A\u0440\u0435\u0434\u0438\u0442\u0438\u0432\u0435 \u0438 \u043F\u0440\u0430\u0432\u0430. +UpdateJobCommand.ShortDescription=\u0410\u0436\u0443\u0440\u0438\u0440\u0430 XML \u0434\u0435\u0444\u0438\u043D\u0438\u0446\u0438\u0458\u0443 \u0437\u0430\u0434\u0430\u0442\u043A\u0430 \u0438\u0437 stdin, \u0437\u0430 \u0440\u0430\u0437\u043B\u0438\u043A\u0443 \u043E\u0434 get-job \u043A\u043E\u043C\u0430\u043D\u0434\u0435. +UpdateNodeCommand.ShortDescription=\u0410\u0436\u0443\u0440\u0438\u0440\u0430 XML \u0434\u0435\u0444\u0438\u043D\u0438\u0446\u0438\u0458\u0443 \u043C\u0430\u0448\u0438\u043D\u0435 \u0438\u0437 stdin, \u0437\u0430 \u0440\u0430\u0437\u043B\u0438\u043A\u0443 \u043E\u0434 get-node \u043A\u043E\u043C\u0430\u043D\u0434\u0435. +SessionIdCommand.ShortDescription=\u0418\u0437\u0458\u0430\u0432\u0438 \u0438\u0434\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0442\u043E\u0440\u0430 \u0441\u0435\u0441\u0438\u0458\u0435, \u0448\u0442\u043E \u0441\u0435 \u043C\u0435\u045A\u0430 \u0441\u0432\u0430\u043A\u0438 \u043F\u0443\u0442 \u043A\u0430\u0434\u0430 \u043F\u043E\u043A\u0440\u0435\u043D\u0435\u0442\u0435 Jenkins. +UpdateViewCommand.ShortDescription=\u0410\u0436\u0443\u0440\u0438\u0440\u0430 XML \u0434\u0435\u0444\u0438\u043D\u0438\u0446\u0438\u0458\u0443 \u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0430 \u0438\u0437 stdin, \u0437\u0430 \u0440\u0430\u0437\u043B\u0438\u043A\u0443 \u043E\u0434 get-view \u043A\u043E\u043C\u0430\u043D\u0434\u0435. +BuildCommand.CLICause.ShortDescription=\u0417\u0430\u0434\u0430\u0442\u0430\u043A \u0458\u0435 \u043F\u043E\u043A\u0440\u0435\u043D\u0443\u0442 \u043F\u0440\u0435\u043A\u043E \u043A\u043E\u043C\u0430\u043D\u0434\u043D\u0435 \u043B\u0438\u043D\u0438\u0458\u0435 \u0441\u0430 \u043A\u043E\u043C\u0430\u043D\u0434\u043E\u043C "{0}" +BuildCommand.CLICause.CannotBuildDisabled=\ +\u041D\u0435 \u043C\u043E\u0436\u0435 \u0441\u0435 \u0438\u0437\u0433\u0440\u0430\u0434\u0438\u0442\u0438 \u0437\u0430\u0434\u0430\u0442\u0430\u043A "{0}" \u0437\u0430\u0448\u0442\u043E \u0458\u0435 \u043E\u043D\u0435\u043C\u043E\u0433\u0443\u045B\u0435\u043D\u043E. +BuildCommand.CLICause.CannotBuildConfigNotSaved=\ +\u041D\u0435 \u043C\u043E\u0436\u0435 \u0441\u0435 \u0438\u0437\u0433\u0440\u0430\u0434\u0438\u0442\u0438 \u0437\u0430\u0434\u0430\u0442\u0430\u043A "{0}" \u0437\u0430\u0448\u0442\u043E \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 \u043D\u0438\u0441\u0443 \u0441\u0430\u0447\u0443\u0432\u0430\u043D\u0430. +BuildCommand.CLICause.CannotBuildUnknownReasons=\ +\u041D\u0435 \u043C\u043E\u0436\u0435 \u0441\u0435 \u0438\u0437\u0433\u0440\u0430\u0434\u0438\u0442\u0438 \u0437\u0430\u0434\u0430\u0442\u0430\u043A "{0}" \u0437\u0431\u043E\u0433 \u043D\u0435\u043F\u043E\u0437\u043D\u0430\u0442\u043E\u0433 \u0440\u0430\u0437\u043B\u043E\u0433\u0430. +DeleteNodeCommand.ShortDescription=\ +\u0423\u043A\u043B\u043E\u043D\u0438 \u043C\u0430\u0448\u0438\u043D\u0443 +ReloadJobCommand.ShortDescription=\ +\u041F\u043E\u043D\u043E\u0432\u043E \u043F\u0440\u0435\u0443\u0437\u043C\u0435 \u0437\u0430\u0434\u0430\u0442\u043A\u0435 +OnlineNodeCommand.ShortDescription=\u041D\u0430\u0441\u0442\u0430\u0432\u0438 \u043A\u043E\u0440\u0438\u0448\u045B\u0435\u045A\u0435 \u043C\u0430\u0448\u0438\u043D\u0435 \u0437\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0443, \u0448\u0442\u043E \u043F\u043E\u043D\u0438\u0448\u0442\u0430\u0432\u0430 \u043F\u0440\u0435\u0442\u0445\u043E\u0434\u043D\u0443 \u043A\u043E\u043C\u0430\u043D\u0434\u0443 "offline-node". +ClearQueueCommand.ShortDescription=\u0418\u0437\u0431\u0440\u0438\u0448\u0435 \u0437\u0430\u043A\u0430\u0437\u0430\u043D\u0435 \u0437\u0430\u0434\u0430\u0442\u0430\u043A\u0435. +ReloadConfigurationCommand.ShortDescription=\u041E\u0434\u0431\u0430\u0446\u0438 \u0441\u0432\u0435 \u043F\u043E\u0434\u0430\u0442\u043A\u0435 \u0443 \u043C\u0435\u043C\u043E\u0440\u0438\u0458\u0438, \u0438 \u043F\u043E\u043D\u043E \u0443\u0447\u0438\u0442\u0430\u0458 \u0441\u0432\u0435 \u0438\u0437 \u0434\u0430\u0442\u043E\u0442\u0435\u0447\u043D\u043E\u0433 \u0441\u0438\u0441\u0442\u0435\u043C\u0430. \u041A\u043E\u0440\u0438\u0441\u043D\u043E \u043A\u0430\u0434 \u0441\u0442\u0435 \u043C\u0435\u045A\u0430\u043B\u0438 \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 \u0434\u0438\u0440\u0435\u043A\u0442\u043D\u043E. +ConnectNodeCommand.ShortDescription=\u041F\u043E\u043D\u043E\u0432\u043E \u0441\u0435 \u043F\u043E\u0432\u0435\u0436\u0438\u0442\u0435 \u043D\u0430 \u043C\u0430\u0448\u0438\u043D\u0443 +QuietDownCommand.ShortDescription=\u041F\u0440\u0438\u043F\u0440\u0435\u043C\u0438 Jenkins \u0437\u0430 \u043F\u043E\u043D\u043E\u0432\u043E \u043F\u043E\u043A\u0440\u0435\u0442\u0430\u045A\u0435. \u041D\u0438\u0441\u0443 \u0434\u043E\u0437\u0432\u043E\u0459\u0435\u043D\u0430 \u043D\u043E\u0432\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430. +DisconnectNodeCommand.ShortDescription=\u041F\u0440\u0435\u043A\u0438\u043D\u0435 \u0432\u0435\u0437\u0443 \u0441\u0430 \u043C\u0430\u0448\u0438\u043D\u043E\u043C. +CancelQuietDownCommand.ShortDescription=\u041F\u043E\u043D\u0438\u0448\u0442\u0438 \u043C\u0435\u0440\u0435 \u043F\u043E\u0447\u0435\u0442\u0435 \u0437\u0430 \u043F\u0440\u0438\u043F\u0440\u0435\u043C\u0443 \u043F\u043E\u043D\u043E\u0432\u043E\u0433 \u043F\u043E\u043A\u0440\u0435\u0442\u0430\u045A\u0430. +OfflineNodeCommand.ShortDescription=\u0421\u0443\u0441\u043F\u0435\u043D\u0437\u0438\u0458\u0430 \u0443\u043F\u043E\u0442\u0440\u0435\u0431\u0435 \u043C\u0430\u0448\u0438\u043D\u0435 \u0437\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0443 \u0434\u043E \u0441\u043B\u0435\u0434\u0435\u045B\u0435 "online-node" \u043A\u043E\u043C\u0430\u043D\u0434\u0435. +WaitNodeOnlineCommand.ShortDescription=\u0421\u0430\u0447\u0435\u043A\u0430\u0458 \u0434\u043E\u043A \u043D\u0435\u043A\u0430 \u043C\u0430\u0448\u0438\u043D\u0430 \u0431\u0443\u0434\u0435 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0430. +WaitNodeOfflineCommand.ShortDescription=\u0421\u0430\u0447\u0435\u043A\u0430\u0458 \u0434\u043E\u043A \u043D\u0435\u043A\u0430 \u043C\u0430\u0448\u0438\u043D\u0430 \u0431\u0443\u0434\u0435 \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0430. +CliProtocol.displayName=\u041F\u0440\u043E\u0442\u043E\u043A\u043E\u043B \u0437\u0430 Jenkins \u043F\u0440\u0435\u043A\u043E \u043A\u043E\u043C\u0430\u043D\u0434\u043D\u0435 \u043B\u0438\u043D\u0438\u0458\u0435, \u0432\u0435\u0440\u0437\u0438\u0458\u0430 1 +CliProtocol2.displayName=\u041F\u0440\u043E\u0442\u043E\u043A\u043E\u043B \u0437\u0430 Jenkins \u043F\u0440\u0435\u043A\u043E \u043A\u043E\u043C\u0430\u043D\u0434\u043D\u0435 \u043B\u0438\u043D\u0438\u0458\u0435, \u0432\u0435\u0440\u0437\u0438\u0458\u0430 2 +CLI.delete-node.shortDescription=\u0423\u043A\u043B\u043E\u043D\u0438 \u043C\u0430\u0448\u0438\u043D\u0443 \ No newline at end of file diff --git a/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index.jelly b/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index.jelly index b752609f48597957e6a3cdb25afd14537fd9ab7a..35988ba3635d6f62c94ddf2f3c7c8683659eeea8 100644 --- a/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index.jelly +++ b/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index.jelly @@ -24,7 +24,7 @@ THE SOFTWARE. - +

        diff --git a/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index.properties b/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index.properties index 5b67eef77097c1bce1f27075173aa2b3d3806f5e..60274c73652036de4dbac29797aa6aacbd2f1c42 100644 --- a/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index.properties +++ b/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index.properties @@ -28,4 +28,4 @@ description.2=To prevent that problem, you should act now. solution.1=Clean up some files from this partition to make more room. solution.2=\ Move JENKINS_HOME to a bigger partition. \ - See our Wiki for how to do this. + See our documentation for how to do this. diff --git a/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index_de.properties b/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index_de.properties index 50dfd49b45e73737fa48a1fd5a665f8b98e84813..4ef1658f7e37dd4443e76757b113a578907041ae 100644 --- a/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index_de.properties +++ b/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index_de.properties @@ -5,4 +5,4 @@ description.1=Das Verzeichnis JENKINS_HOME ({0}) ist fast voll. Ist die description.2=Um dieses Problem zu vermeiden, sollten Sie jetzt handeln. solution.1=Lschen Sie Dateien dieses Laufwerks, um Speicherplatz wieder freizugeben. solution.2=Verschieben Sie JENKINS_HOME auf ein Laufwerk mit mehr freiem Platz. \ - Eine Anleitung dazu finden Sie im Wiki. + Eine Anleitung dazu finden Sie im Wiki. diff --git a/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index_es.properties b/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index_es.properties index 6415c2f555333c8e45cf710191ae37e59ccb74ba..5711590493a5a9787979bb875645d634fbffb140 100644 --- a/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index_es.properties +++ b/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index_es.properties @@ -28,6 +28,6 @@ description.2=Debes hacer algo ahora para prevenir el problema. solution.1=Borra ficheros de esta particin para liberar espacio. solution.2=\ Mueve el directorio de JENKINS_HOME a una partcin mayor. \ - Echa un vistazo a esta pgina para saber cmo hacerlo. + Echa un vistazo a esta pgina para saber cmo hacerlo. JENKINS_HOME\ is\ almost\ full=El directirio JENKINS_HOME ({0}) est casi lleno. diff --git a/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index_fr.properties b/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index_fr.properties index 8b52c71b8aa9a24d8633ff47fdda3c78dcb76a51..e09a76202386d524e321386d9b5871c726cc687c 100644 --- a/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index_fr.properties +++ b/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index_fr.properties @@ -24,5 +24,5 @@ blurb=JENKINS_HOME est presque plein description.1=Votre r\u00E9pertoire JENKINS_HOME ({0}) est presque plein. Quand il n''y aura plus d''espace disponible dans ce r\u00E9pertoire, Jenkins aura un comportement erratique, car il ne pourra plus stocker de donn\u00E9es. description.2=Pour \u00E9viter ce probl\u00E8me, vous devez agir maintenant. solution.1=Supprimez des fichiers sur cette partition afin de faire plus de place. -solution.2=D\u00E9placez JENKINS_HOME sur une partition plus grande. Consultez notre Wiki pour la d\u00E9marche \u00E0 suivre. +solution.2=D\u00E9placez JENKINS_HOME sur une partition plus grande. Consultez notre Wiki pour la d\u00E9marche \u00E0 suivre. JENKINS_HOME\ is\ almost\ full=JENKINS_HOME est presque plein diff --git a/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index_ja.properties b/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index_ja.properties index bf281d21e1208d19af9bfdb14ac041390e28c4b6..e771df40e4a018c0048bcbc938b31e498b638bc2 100644 --- a/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index_ja.properties +++ b/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index_ja.properties @@ -28,5 +28,5 @@ description.2=\u554F\u984C\u304C\u8D77\u304D\u306A\u3044\u3088\u3046\u306B\u3001 solution.1=\u3053\u306E\u30D1\u30FC\u30C6\u30A3\u30B7\u30E7\u30F3\u306E\u30D5\u30A1\u30A4\u30EB\u3092\u524A\u9664\u3057\u3066\u3001\u7A7A\u304D\u3092\u4F5C\u308A\u307E\u3059\u3002 solution.2=\ JENKINS_HOME\u3092\u3082\u3063\u3068\u5BB9\u91CF\u306E\u3042\u308B\u30D1\u30FC\u30C6\u30A3\u30B7\u30E7\u30F3\u306B\u79FB\u3057\u307E\u3059\u3002\ - \u8A73\u3057\u3044\u65B9\u6CD5\u306F\u3001Wiki\u3092\u53C2\u7167\u3057\u3066\u304F\u3060\u3055\u3044\u3002 + \u8A73\u3057\u3044\u65B9\u6CD5\u306F\u3001Wiki\u3092\u53C2\u7167\u3057\u3066\u304F\u3060\u3055\u3044\u3002 JENKINS_HOME\ is\ almost\ full=JENKINS_HOME\u306E\u5BB9\u91CF\u304C\u307B\u307C\u3044\u3063\u3071\u3044\u3067\u3059\u3002 diff --git a/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index_nl.properties b/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index_nl.properties index b567d7a5ce81ab8ebd42d3986baa304cbc1b7027..c37c0bf5b5f35437aa1c224329aeb556d926e9e5 100644 --- a/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index_nl.properties +++ b/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index_nl.properties @@ -26,5 +26,5 @@ description.1=\ description.2=Om problemen te vermijden, dient U nu in te grijpen. solution.1=Gelieve ruimte vrij te maken op deze locatie. solution.2=\ - Verhuis JENKINS_HOME naar een locatie met grotere capaciteit. Op onze Wiki vind je meer informatie over hoe je dit kunt realizeren. + Verhuis JENKINS_HOME naar een locatie met grotere capaciteit. Op onze Wiki vind je meer informatie over hoe je dit kunt realizeren. JENKINS_HOME\ is\ almost\ full=Vrije ruimte in JENKINS_HOME is bijna opgebruikt! diff --git a/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index_pt.properties b/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index_pt.properties index c2ab796deee8e6642dfd390ef8927d644130f940..b1e7f81355c45789e2d08086db714389ddbdc300 100644 --- a/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index_pt.properties +++ b/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index_pt.properties @@ -25,6 +25,6 @@ description.2=Para previnir esse problema, fa\u00e7a alguma coisa agora. description.1=O seu JENKINS_HOME ({0}) est\u00e1 quase cheio. \ Quando esse diret\u00f3rio estiver lotado ocorrer\u00e3o alguns estragos, pois o Jenkins n\u00e3o pode gravar mais dado nenhum. solution.2=Mova o JENKINS_HOME para uma parti\u00e7\u00e3o maior. \ -Veja a nossa Wiki para aprender como fazer isso. +Veja a nossa Wiki para aprender como fazer isso. blurb=JENKINS_HOME est\u00e1 quase cheio solution.1=Limpe alguns arquivos dessa parti\u00e7\u00e3o para liberar mais espa\u00e7o. diff --git a/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index_pt_BR.properties b/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index_pt_BR.properties index 0e5b944a80856ffe78c86cba5aa64bf4667beeca..2f9b767f5d460f2e5c8ad1d8d0f72b6be5c35ff5 100644 --- a/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index_pt_BR.properties +++ b/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index_pt_BR.properties @@ -29,10 +29,10 @@ description.1=Seu diret\ufffdrio JENKINS_HOME ({0}) est\ufffd quase che Quando este diret\ufffdrio ficar completamente cheio, ocorrer\ufffd problemas porque o Jenkins n\ufffdo pode mais armazenar dados. # \ # Move JENKINS_HOME to a bigger partition. \ -# See our Wiki for how to do this. +# See our Wiki for how to do this. solution.2=\ Mova o diret\ufffdrio JENKINS_HOME para uma parti\ufffd\ufffdo maior. \ - Veja nosso Wiki para saber como fazer isto. + Veja nosso Wiki para saber como fazer isto. JENKINS_HOME\ is\ almost\ full=JENKINS_HOME est\ufffd quase cheio # JENKINS_HOME is almost full diff --git a/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index_sr.properties b/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..82dbe60492ab1507eb48e0999ad1a3a2b9129159 --- /dev/null +++ b/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index_sr.properties @@ -0,0 +1,14 @@ +# This file is under the MIT License by authors + +JENKINS_HOME\ is\ almost\ full=JENKINS_HOME \u0458\u0435 \u0441\u043A\u043E\u0440\u043E \u043F\u0440\u0435\u043F\u0443\u043D\u043E +blurb=JENKINS_HOME \u0458\u0435 \u0441\u043A\u043E\u0440\u043E \u043F\u0440\u0435\u043F\u0443\u043D\u043E +description.1=\ \u0412\u0430\u0448 JENKINS_HOME ({0}) \u0458\u0435 \u0441\u043A\u043E\u0440\u043E \u043F\u0440\u0435\u043F\u0443\u043D. \ + \u041A\u0430\u0434 \u0441\u0435 \u0441\u043A\u0440\u043E\u0437 \u043D\u0430\u043F\u0443\u043D\u0438 \u043E\u0432\u0430\u0458 \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0443\u043C, Jenkins \u043D\u0435\u045B\u0435 \u043C\u043E\u045B\u0438 \u043F\u0438\u0441\u0430\u0442\u0438 \u0432\u0438\u0448\u0435 \u043F\u043E\u0434\u0430\u0442\u0430\u043A\u0430. +description.2=\u0414\u0430 \u0431\u0438 \u0441\u0435 \u0441\u043F\u0440\u0435\u0447\u0438\u043E \u043E\u0432\u0430\u0458 \u043F\u0440\u043E\u0431\u043B\u0435\u043C, \u043F\u043E\u0442\u0440\u0435\u0431\u043D\u043E \u0458\u0435 \u0434\u0435\u043B\u043E\u0432\u0430\u0442\u0438 \u043E\u0434\u043C\u0430\u0445. +solution.1=\u041E\u0431\u0440\u0438\u0448\u0435\u0442\u0435 \u043D\u0435\u043A\u0435 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0435 \u0441\u0430 \u043E\u0432\u0435 \u043F\u0430\u0440\u0442\u0438\u0446\u0438\u0458\u0435 \u0434\u0430 \u0431\u0438 \u0441\u0435 \u043E\u0441\u043B\u043E\u0431\u043E\u0434\u0438\u043B\u043E \u043C\u0435\u0441\u0442\u0430. +solution.2=\ +\u041F\u0440\u0435\u0431\u0430\u0446\u0438\u0442\u0435 <\u0422\u0422>JENKINS_HOME \u0432\u0435\u045B\u043E\u0458 \u043F\u0430\u0440\u0442\u0438\u0446\u0438\u0458\u0438.\ +\u041F\u043E\u0433\u043B\u0435\u0434\u0430\u0458\u0442\u0435 <\u0430 href="https://jenkins.io/redirect/migrate-jenkins-home">\u0412\u0438\u043A\u0438 \u0442\u043E\u043C\u0435 \u043A\u0430\u043A\u043E \u0434\u0430 \u0442\u043E \u0443\u0440\u0430\u0434\u0438\u0442\u0438. +Dit= + +# TODO FIXME This file looks completely messed up? \ No newline at end of file diff --git a/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index_zh_TW.properties b/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index_zh_TW.properties index c68caa7b9afcfcab8fea37c71dc5966c73fa45ca..b02747e2a7fc389e3c88d2f56e39db0b150a343b 100644 --- a/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index_zh_TW.properties +++ b/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index_zh_TW.properties @@ -29,5 +29,5 @@ description.2=\u70ba\u4e86\u907f\u514d\u767c\u751f\u61be\u4e8b\uff0c\u60a8\u61c9 solution.1=\u6e05\u6389\u9019\u500b\u5206\u5272\u5340\u4e0a\u7684\u67d0\u4e9b\u6a94\u6848\uff0c\u7a7a\u51fa\u4e00\u4e9b\u7a7a\u9593\u3002 solution.2=\ \u5c07 JENKINS_HOME \u79fb\u5230\u6bd4\u8f03\u5927\u7684\u5206\u5272\u5340\u88e1\u3002\ - \u5728\u6211\u5011\u7684 Wiki \u4e0a\u6709\u4f5c\u6cd5\u8aaa\u660e\u3002 + \u5728\u6211\u5011\u7684 Wiki \u4e0a\u6709\u4f5c\u6cd5\u8aaa\u660e\u3002 JENKINS_HOME\ is\ almost\ full=JENKINS_HOME \u5feb\u6eff\u4e86 diff --git a/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/message_sr.properties b/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/message_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..7f5e6eac953ef5209644aa251862868efe393500 --- /dev/null +++ b/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/message_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +Tell\ me\ more=\u041E\u0431\u0458\u0430\u0441\u043D\u0438 +Dismiss=\u041E\u0442\u043A\u0430\u0436\u0438 +blurb=\u0412\u0430\u0448 Jenkins \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0458\u0443\u043C "{0}" (<\u0422\u0422>JENKINS_HOME) \u0458\u0435 \u0441\u043A\u043E\u0440\u043E \u043F\u0440\u0435\u043F\u0443\u043D. \u0414\u0435\u043B\u0443\u0458\u0442\u0435 \u043F\u0440\u0435 \u043D\u0435\u0433\u043E \u0448\u0442\u043E \u0458\u0435 \u0441\u043A\u0440\u043E\u0437 \u043F\u0440\u0435\u043F\u0443\u043D. diff --git a/core/src/main/resources/hudson/diagnosis/MemoryUsageMonitor/index_sr.properties b/core/src/main/resources/hudson/diagnosis/MemoryUsageMonitor/index_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..1f7374f74686531c8b44e1bb9f92c0138aef1c27 --- /dev/null +++ b/core/src/main/resources/hudson/diagnosis/MemoryUsageMonitor/index_sr.properties @@ -0,0 +1,7 @@ +# This file is under the MIT License by authors + +JVM\ Memory\ Usage=\u0423\u043F\u043E\u0442\u0440\u0435\u0431\u0430 \u043C\u0435\u043C\u043E\u0440\u0438\u0458\u0435 Java \u0432\u0438\u0440\u0442\u0443\u0435\u043B\u043D\u0435 \u043C\u0430\u0448\u0438\u043D\u0435 +Timespan=\u0412\u0440\u0435\u043C\u0435 +Short=\u041A\u0440\u0430\u0442\u043A\u043E +Medium=\u0421\u0440\u0435\u0434\u045A\u0435 +Long=\u0414\u0443\u0433\u043E diff --git a/core/src/main/resources/hudson/diagnosis/Messages.properties b/core/src/main/resources/hudson/diagnosis/Messages.properties index b2e56afd7140e9854ac6dad38b3163939aad714b..06c38a572e012970f2403d6876b982d8ca9a618c 100644 --- a/core/src/main/resources/hudson/diagnosis/Messages.properties +++ b/core/src/main/resources/hudson/diagnosis/Messages.properties @@ -3,3 +3,7 @@ MemoryUsageMonitor.TOTAL=Total OldDataMonitor.Description=Scrub configuration files to remove remnants from old plugins and earlier versions. OldDataMonitor.DisplayName=Manage Old Data HudsonHomeDiskUsageMonitor.DisplayName=Disk Usage Monitor + +NullIdDescriptorMonitor.DisplayName=Missing Descriptor ID +ReverseProxySetupMonitor.DisplayName=Reverse Proxy Setup +TooManyJobsButNoView.DisplayName=Too Many Jobs Not Organized in Views diff --git a/core/src/main/resources/hudson/diagnosis/Messages_pl.properties b/core/src/main/resources/hudson/diagnosis/Messages_pl.properties new file mode 100644 index 0000000000000000000000000000000000000000..d06325b6aebedeee28d04fb132302d2b10fbaa86 --- /dev/null +++ b/core/src/main/resources/hudson/diagnosis/Messages_pl.properties @@ -0,0 +1,23 @@ +# The MIT License +# +# Copyright (c) 2016 Damian Szczepanik +# +# 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. +OldDataMonitor.DisplayName=Zarz\u0105dzanie starymi danymi +OldDataMonitor.Description=Usuwanie danych po nieu\u017Cywanych lub starszych wersjach wtyczek. diff --git a/core/src/main/resources/hudson/diagnosis/Messages_sr.properties b/core/src/main/resources/hudson/diagnosis/Messages_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..b070f89027135acfd4e46480f60e8b2473811c3a --- /dev/null +++ b/core/src/main/resources/hudson/diagnosis/Messages_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authorsMemoryUsageMonitor.USED=\u041A\u043E\u0440\u0438\u0441\u0442\u0438 + +MemoryUsageMonitor.TOTAL=\u0423\u043A\u0443\u043F\u043D\u043E +OldDataMonitor.Description=\u0418\u0437\u0431\u0440\u0438\u0448\u0438\u0442\u0435 \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 \u0434\u0430 \u0431\u0438\u0441\u0442\u0435 \u0443\u043A\u043B\u043E\u043D\u0438\u043B\u0438 \u0441\u0432\u0435 \u043E\u0441\u0442\u0430\u0442\u043A\u0435 \u043E\u0434 \u0441\u0442\u0430\u0440\u0438\u0445 \u043C\u043E\u0434\u0443\u043B\u0430 \u0438 \u0432\u0435\u0440\u0437\u0438\u0458\u0430. +OldDataMonitor.DisplayName=\u0423\u0440\u0435\u0434\u0438 \u0441\u0442\u0430\u0440\u0435 \u043F\u043E\u0434\u0430\u0442\u043A\u0435 \ No newline at end of file diff --git a/core/src/main/resources/hudson/diagnosis/NullIdDescriptorMonitor/message_sr.properties b/core/src/main/resources/hudson/diagnosis/NullIdDescriptorMonitor/message_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..352d8fc5cf003dfb6a79aaba3a2c35fe0f3ea88a --- /dev/null +++ b/core/src/main/resources/hudson/diagnosis/NullIdDescriptorMonitor/message_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +blurb=\u0421\u043B\u0435\u0434\u0435\u045B\u0438 \u0434\u043E\u0434\u0430\u0446\u0438 \u043D\u0435\u043C\u0430\u0458\u0443 \u0418\u0414 \u0438 \u0442\u0430\u043A\u043E, \u0432\u0435\u0440\u043E\u0432\u0430\u0442\u043D\u043E, \u0443\u0437\u0440\u043E\u043A \u043D\u0435\u043A\u043E\u0433 \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0430. \u041C\u043E\u043B\u0438\u043C\u043E \u0432\u0430\u0441, \u0430\u0436\u0443\u0440\u0438\u0440\u0430\u0458\u0442\u0435 \u043E\u0432\u0435 \u043C\u043E\u0434\u0443\u043B\u0435 \u0430\u043A\u043E \u043D\u0438\u0441\u0443 \u043F\u043E\u0441\u043B\u0435\u0434\u045A\u0435 \u0432\u0435\u0440\u0437\u0438\u0458\u0435. \u0410\u043A\u043E \u0432\u0435\u045B \u0458\u0435\u0441\u0443 \u043F\u043E\u0441\u043B\u0435\u0434\u045A\u0435, \u0434\u0430\u0458\u0442\u0435 \u0438\u0437\u0432\u0435\u0448\u0442\u0430\u0458 \u043E \u0433\u0440\u0435\u0448\u043A\u0430\u043C\u0430 \u0434\u0430 \u043C\u043E\u0436\u0435\u043C\u043E \u0434\u0430 \u0438\u0445 \u0438\u0441\u043F\u0440\u0430\u0432\u0438\u043C\u043E. +problem=\u0414\u0435\u0441\u043A\u0440\u0438\u043F\u0442\u043E\u0440 {0} \u0438\u0437 \u043C\u043E\u0434\u0443\u043B\u0435 {2} \u0441\u0430 \u0438\u043C\u0435\u043D\u043E\u043C {1} diff --git a/core/src/main/resources/hudson/diagnosis/OldDataMonitor/manage.jelly b/core/src/main/resources/hudson/diagnosis/OldDataMonitor/manage.jelly index 06c28d21ceef3f24d419be98f554f0910dd69a0f..0f73ec6d0fcba592507f0ae191b646d8e79d6b02 100644 --- a/core/src/main/resources/hudson/diagnosis/OldDataMonitor/manage.jelly +++ b/core/src/main/resources/hudson/diagnosis/OldDataMonitor/manage.jelly @@ -24,7 +24,7 @@ THE SOFTWARE. - +

        ${%Manage Old Data}

        diff --git a/core/src/main/resources/hudson/diagnosis/OldDataMonitor/manage_de.properties b/core/src/main/resources/hudson/diagnosis/OldDataMonitor/manage_de.properties index 9834cb21d567d8e20ad2696d53cb2445c00942d2..c180eae1c854ef762a824d28132ff56856ceb242 100644 --- a/core/src/main/resources/hudson/diagnosis/OldDataMonitor/manage_de.properties +++ b/core/src/main/resources/hudson/diagnosis/OldDataMonitor/manage_de.properties @@ -1,66 +1,66 @@ -# The MIT License -# -# Copyright (c) 2004-2010, Sun Microsystems, Inc., Alan Harder, Simon Wiest -# -# 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. - -Error=Fehler -Manage\ Old\ Data=Veraltete Daten verwalten -Name=Name -No\ old\ data\ was\ found.=Keine veralteten Daten gefunden. -Resave\ data\ files\ with\ structure\ changes\ no\ newer\ than\ Jenkins=\ - Aktualisiere Dateien mit Strukturnderungen nicht aktueller als Jenkins -Type=Typ -Unreadable\ Data=Nicht lesbare Daten -Discard\ Unreadable\ Data=Nicht lesbare Daten entfernen -Upgrade=Aktualisieren -Version=Version -blurb.1=\ - ndert sich die Struktur von Konfigurationsdateien, geht Jenkins folgendermaen vor: \ - Dateien werden beim Einlesen in den Speicher in das neue Datenformat migriert, aber \ - nicht automatisch auf Festplatte zurckgeschrieben. Die Konfigurationsdateien bleiben also \ - unverndert. Dies ermglicht bei Problemen ein Jenkins-Downgrade zu einer frheren \ - Version. Auf der anderen Seite knnen dadurch Dateien endlos in lngst veralteten \ - Formaten verbleiben. Die folgende Tabelle zeigt Dateien, die veraltete Strukturen verwenden, \ - sowie die Jenkins-Version(en), in denen die Datenstruktur verndert wurde. -blurb.2=\ - Beim Einlesen von Konfigurationsdateien knnen Fehler auftreten, z.B. wenn ein Plugin \ - Daten hinzufgt und spter deaktiviert wird, wenn kein Migrationscode fr Strukturnderungen \ - geschrieben wurde oder Jenkins auf eine ltere Version zurckgesetzt wird, nachdem die neuere \ - Version bereits Dateien mit einer neuen Struktur geschrieben hatte. Diese Fehler werden beim \ - Hochfahren von Jenkins zwar protokolliert, die nicht-lesbaren Daten werden aber einfach \ - bersprungen, damit Jenkins trotzdem starten und arbeiten kann. -blurb.3=\ - Mit der untenstehenden Funktion knnen Sie diese Datein im aktuellen Format neu abspeichern. \ - Damit entfllt die Mglichzeit, auf eine ltere als die ausgewhlte Jenkins-Version zurckzukehren. \ - Auch wenn Sie Konfigurationen bestehender Jobs ndern, werden diese Daten im neuen \ - Format gespeichert, was ein spteres Downgrade ausschliet. Nicht-lesbare Daten, die in der \ - Tabelle rechts dargestellt sind, werden bei der Aktualisierung dauerhaft entfernt. -blurb.4=\ - Langfristig wird Migrationscode zum Lesen veralteter Datenformate auch wieder entfernt werden. \ - Die Kompatibilitt wird mindestens 150 Releases nach nderung des Datenformates gewhrleistet. \ - Versionen, die noch lter sind, werden fett dargestellt. Es wird emfohlen, diese Dateien neu \ - abzuspeichern. -blurb.5=\ - (ein Downgrade bis zur ausgewhlten Version knnte immer noch mglich sein) -blurb.6=\ - Nicht-lesbare Daten stellen kein Problem dar, da Jenkins sie einfach ignoriert. \ - Um jedoch lange Protokolle mit zahlreichen Warnungen whrend des Hochfahrens von Jenkins zu \ - vermeiden, knnen Sie nicht-lesbare Daten dauerhaft entfernen, indem Sie diese ber die \ +# The MIT License +# +# Copyright (c) 2004-2010, Sun Microsystems, Inc., Alan Harder, Simon Wiest +# +# 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. + +Error=Fehler +Manage\ Old\ Data=Veraltete Daten verwalten +Name=Name +No\ old\ data\ was\ found.=Keine veralteten Daten gefunden. +Resave\ data\ files\ with\ structure\ changes\ no\ newer\ than\ Jenkins=\ + Aktualisiere Dateien mit Strukturnderungen nicht aktueller als Jenkins +Type=Typ +Unreadable\ Data=Nicht lesbare Daten +Discard\ Unreadable\ Data=Nicht lesbare Daten entfernen +Upgrade=Aktualisieren +Version=Version +blurb.1=\ + ndert sich die Struktur von Konfigurationsdateien, geht Jenkins folgendermaen vor: \ + Dateien werden beim Einlesen in den Speicher in das neue Datenformat migriert, aber \ + nicht automatisch auf Festplatte zurckgeschrieben. Die Konfigurationsdateien bleiben also \ + unverndert. Dies ermglicht bei Problemen ein Jenkins-Downgrade zu einer frheren \ + Version. Auf der anderen Seite knnen dadurch Dateien endlos in lngst veralteten \ + Formaten verbleiben. Die folgende Tabelle zeigt Dateien, die veraltete Strukturen verwenden, \ + sowie die Jenkins-Version(en), in denen die Datenstruktur verndert wurde. +blurb.2=\ + Beim Einlesen von Konfigurationsdateien knnen Fehler auftreten, z.B. wenn ein Plugin \ + Daten hinzufgt und spter deaktiviert wird, wenn kein Migrationscode fr Strukturnderungen \ + geschrieben wurde oder Jenkins auf eine ltere Version zurckgesetzt wird, nachdem die neuere \ + Version bereits Dateien mit einer neuen Struktur geschrieben hatte. Diese Fehler werden beim \ + Hochfahren von Jenkins zwar protokolliert, die nicht-lesbaren Daten werden aber einfach \ + bersprungen, damit Jenkins trotzdem starten und arbeiten kann. +blurb.3=\ + Mit der untenstehenden Funktion knnen Sie diese Datein im aktuellen Format neu abspeichern. \ + Damit entfllt die Mglichzeit, auf eine ltere als die ausgewhlte Jenkins-Version zurckzukehren. \ + Auch wenn Sie Konfigurationen bestehender Jobs ndern, werden diese Daten im neuen \ + Format gespeichert, was ein spteres Downgrade ausschliet. Nicht-lesbare Daten, die in der \ + Tabelle rechts dargestellt sind, werden bei der Aktualisierung dauerhaft entfernt. +blurb.4=\ + Langfristig wird Migrationscode zum Lesen veralteter Datenformate auch wieder entfernt werden. \ + Die Kompatibilitt wird mindestens 150 Releases nach nderung des Datenformates gewhrleistet. \ + Versionen, die noch lter sind, werden fett dargestellt. Es wird emfohlen, diese Dateien neu \ + abzuspeichern. +blurb.5=\ + (ein Downgrade bis zur ausgewhlten Version knnte immer noch mglich sein) +blurb.6=\ + Nicht-lesbare Daten stellen kein Problem dar, da Jenkins sie einfach ignoriert. \ + Um jedoch lange Protokolle mit zahlreichen Warnungen whrend des Hochfahrens von Jenkins zu \ + vermeiden, knnen Sie nicht-lesbare Daten dauerhaft entfernen, indem Sie diese ber die \ untenstehende Funktion neu abspeichern lassen. \ No newline at end of file diff --git a/core/src/main/resources/hudson/diagnosis/OldDataMonitor/manage_sr.properties b/core/src/main/resources/hudson/diagnosis/OldDataMonitor/manage_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..501dad149a2887ac1b77e2c4fef2dd701b5dbb88 --- /dev/null +++ b/core/src/main/resources/hudson/diagnosis/OldDataMonitor/manage_sr.properties @@ -0,0 +1,18 @@ +# This file is under the MIT License by authors + +Manage\ Old\ Data=\u0423\u0440\u0435\u0434\u0438 \u0441\u0442\u0430\u0440\u0435 \u043F\u043E\u0434\u0430\u0442\u043A\u0435 +blurb.1=\u041A\u0430\u0434\u0430 \u0438\u043C\u0430 \u043F\u0440\u043E\u043C\u0435\u043D\u0435 \u0443 \u0442\u043E\u043C\u0435 \u043A\u0430\u043A\u043E \u0441y \u043F\u043E\u0434\u0430\u0446\u0438 \u0443\u0447\u0443\u0432\u0430\u043D\u0438 \u043D\u0430 \u0434\u0438\u0441\u043A\u0443, Jenkins \u043A\u043E\u0440\u0438\u0441\u0442\u0438 \u0441\u043B\u0435\u0434\u0435\u045B\u0443 \u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0458\u0443: \u043F\u043E\u0434\u0430\u0446\u0438 \u0441\u0443 \u043F\u0440\u0435\u043D\u0435\u0442\u0438 \u0443 \u043D\u043E\u0432\u0443 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0437 \u043A\u0430\u0434\u0430 \u0458\u0435 \u0443\u0447\u0438\u0442\u0430\u043D, \u0430\u043B\u0438 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0430 \u043D\u0438\u0458\u0435 \u0441\u0430\u0447\u0443\u0432\u0430\u043D\u0430 \u0443 \u043D\u043E\u0432\u043E\u043C \u0444\u043E\u0440\u043C\u0430\u0442\u0443. \u0422\u043E \u0432\u0430\u043C \u043E\u043C\u043E\u0433\u0443\u045B\u0430\u0432\u0430 \u0434\u0430 \u0441\u0435 \u0432\u0440\u0430\u0442\u0438 \u0432\u0435\u0440\u0437\u0438\u0458\u0430 Jenkins \u0430\u043A\u043E \u0431\u0443\u0434\u0435 \u043F\u043E\u0442\u0440\u0435\u0431\u043D\u043E. \u041C\u0435\u0452\u0443\u0442\u0438\u043C, \u043E\u043D \u0442\u0430\u043A\u043E\u0452\u0435 \u043C\u043E\u0436\u0435 \u043F\u0438\u0441\u0430\u0442\u0438 \u043D\u043E\u0432\u0435 \u043F\u043E\u0434\u0430\u0442\u043A\u0435 \u043D\u0430 \u0434\u0438\u0441\u043A\u0443 \u0443 \u0441\u0442\u0430\u0440\u043E\u043C \u0444\u043E\u0440\u043C\u0430\u0442\u0443 \u043D\u0430 \u043D\u0435\u043E\u0434\u0440\u0435\u0452\u0435\u043D\u043E \u0432\u0440\u0435\u043C\u0435. \u0423 \u0442\u0430\u0431\u0435\u043B\u0438 \u0438\u0441\u043F\u043E\u0434 \u0458\u0435 \u0441\u043F\u0438\u0441\u0430\u043A \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0430 \u043A\u043E\u0458\u0438 \u0441\u0430\u0434\u0440\u0436\u0435 \u0442\u0430\u043A\u0432\u0435 \u043F\u043E\u0434\u0430\u0442\u043A\u0435, \u0438 \u0432\u0435\u0440\u0437\u0438\u0458\u0430 Jenkins, \u0433\u0434\u0435 \u0458\u0435 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0430 \u043F\u0440\u043E\u043C\u0435\u045A\u0435\u043D\u0430. +blurb.2=\u041F\u043E\u043D\u0435\u043A\u0430\u0434 \u0441\u0435 \u043F\u043E\u0458\u0430\u0432\u0435 \u0433\u0440\u0435\u0448\u043A\u0435 \u043F\u0440\u0438\u043B\u0438\u043A\u043E\u043C \u0447\u0438\u0442\u0430\u045A\u0430 \u043F\u043E\u0434\u0430\u0442\u0430\u043A\u0430 (\u0430\u043A\u043E \u043D\u043F\u0440 \u043C\u043E\u0434\u0443\u043B\u0430 \u0431\u0443\u0434\u0435 \u043A\u0430\u0441\u043D\u0438\u0458\u0435 \u0438\u0441\u043A\u0459\u0443\u0447\u0435\u043D\u0430, \u043C\u0438\u0433\u0440\u0430\u0446\u0438\u043E\u043D\u0438 \u043A\u043E\u0434\u0435\u043A\u0441 \u043D\u0430\u043F\u0438\u0441\u0430\u043D \u043D\u0435 \u043F\u0440\u0435\u043F\u043E\u0437\u043D\u0430 \u043F\u0440\u043E\u043C\u0435\u043D\u0435 \u0443 \u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0438, \u0438\u043B\u0438 \u0430\u043A\u043E \u0458\u0435 Jenkins \u0432\u0440\u0430\u045B\u0435\u043D \u043F\u0440\u0435\u0442\u0445\u043E\u0434\u043D\u043E\u0458 \u0432\u0435\u0440\u0437\u0438\u0458\u0438 \u043D\u0430\u043A\u043E\u043D \u0448\u0442\u043E \u0431\u0438 \u043D\u0435\u043A\u0438 \u043F\u043E\u0434\u0430\u0446\u0438 \u043D\u0435\u0431\u0438 \u043C\u043E\u0433\u043B\u0438 \u0431\u0438\u0442\u0438 \u0443\u0447\u0438\u0442\u0430\u043D\u0438). \u041E\u0432\u0435 \u0433\u0440\u0435\u0448\u043A\u0435 \u0441\u0443 \u0441\u0430\u0447\u0443\u0432\u0430\u043D\u0435, \u0430\u043B\u0438 \u043D\u0435\u043E\u0447\u0438\u0442\u0459\u0438\u0432\u0438 \u043F\u043E\u0434\u0430\u0446\u0438 \u0441\u0435 \u043F\u0440\u0435\u0434\u0441\u043A\u0430\u0447\u0443. +Type=\u0422\u0438\u043F +Name=\u0418\u043C\u0435 +Version=\u0412\u0435\u0440\u0437\u0438\u0458\u0430 +blurb.3=\u041F\u0440\u0430\u0442\u0435\u045B\u0438 \u0444\u043E\u0440\u043C\u0443\u043B\u0430\u0440 \u043C\u043E\u0436\u0435 \u0441\u0435 \u043A\u043E\u0440\u0438\u0441\u0442\u0438\u0442\u0438 \u0437\u0430 \u043F\u043E\u043D\u043E\u0432\u043E \u0441\u0430\u0447\u0443\u0432\u0430\u045A\u0435 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0430 \u0443 \u0442\u0440\u0435\u043D\u0443\u0442\u043D\u043E\u043C \u0444\u043E\u0440\u043C\u0430\u0442\u0443, \u043A\u043E\u0458\u0438 \u043D\u0435\u043C\u043E\u0436\u0435 \u0431\u0438\u0442\u0438 \u0443\u0447\u0438\u0442\u0430\u043D \u0441\u0442\u0430\u0440\u0438\u0458\u0438\u043C \u0432\u0435\u0440\u0437\u0438\u0458\u0430\u043C\u0430 Jenkins. \u041D\u043E\u0440\u043C\u0430\u043B\u043D\u0430 \u0443\u043F\u043E\u0442\u0440\u0435\u0431\u0430 \u0442\u0430\u043A\u043E\u0452\u0435 \u043C\u043E\u0436\u0435 \u043F\u0440\u043E\u0438\u0437\u0432\u0435\u0441\u0442\u0438 \u043F\u043E\u0434\u0430\u0442\u043A\u0435 \u043A\u043E\u0458\u0435 \u043D\u0435\u043C\u043E\u0433\u0443 \u0431\u0438\u0442\u0438 \u0443\u0447\u0438\u0442\u0430\u043D\u0438 \u0441\u0442\u0430\u0440\u0438\u0458\u0438\u043C \u0432\u0435\u0440\u0437\u0438\u0458\u0430\u043C\u0430 Jenkins. \u0421\u0432\u0438 \u043D\u0435\u0443\u0441\u043F\u0435\u0448\u043D\u043E \u043F\u0440\u0435\u0431\u0430\u0447\u0435\u043D\u0438 \u043F\u043E\u0434\u0430\u0446\u0438 \u045B\u0435 \u0431\u0438\u0442\u0438 \u0438\u0437\u0431\u0440\u0438\u0441\u0430\u043D\u0438 \u043D\u0430\u043A\u043E\u043D \u0441\u0430\u0447\u0443\u0432\u0430\u045A\u0430. +blurb.4=\ \u041E\u0432\u0430 \u0441\u043F\u043E\u0441\u043E\u0431\u043D\u043E\u0441\u0442 \u043C\u043E\u0436\u0435 \u0435\u0432\u0435\u043D\u0442\u0443\u0430\u043B\u043D\u043E \u0431\u0438\u0442\u0438 \u0443\u043A\u043B\u045A\u0435\u043D\u0430, \u043C\u0435\u0452\u0443\u0442\u0438\u043C \u043A\u043E\u043C\u043F\u0430\u0442\u0438\u0431\u0438\u043B\u043D\u043E\u0441\u0442 \u045B\u0435 \u0431\u0438\u0442\u0438 \u043E\u0434\u0440\u0436\u0430\u043D \u0434\u043E \u043D\u0430\u0458\u043C\u0430\u045A\u0435 150 \u0438\u0437\u0434\u0430\u045A\u0430 \u043F\u043E\u0441\u043B\u0435 \u0438\u043A\u0430\u043A\u0432\u0438\u0445 \u043F\u0440\u043E\u043C\u0435\u043D\u0430. \u0421\u0442\u0430\u0440\u0438\u0458\u0435 \u0432\u0435\u0440\u0437\u0438\u0458\u0435 \u0441\u0443 \u043E\u0437\u043D\u0430\u0447\u0435\u043D\u0438 \u043C\u0430\u0441\u043D\u0438\u043C \u0441\u043B\u043E\u0432\u0438\u043C\u0430. \u041F\u0440\u0435\u043F\u043E\u0440\u0443\u0447\u0443\u0458\u0435 \u0441\u0435 \u0441\u0430\u0447\u0443\u0432\u0430\u045A\u0435 \u043E\u0432\u0438\u0445 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0430. +Resave\ data\ files\ with\ structure\ changes\ no\ newer\ than\ Jenkins=\u041F\u043E\u043D\u043E\u0432\u043E \u0441\u0430\u0447\u0443\u0432\u0430\u0458 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0435 \u0441\u0430 \u043F\u0440\u043E\u043C\u0435\u043D\u0430\u043C\u0430 \u043A\u043E\u0458\u0435 \u043D\u0438\u0441\u0443 \u043D\u043E\u0432\u0438\u0458\u0430 \u043E\u0434 Jenkins +blurb.5=(\u0432\u0440\u0430\u045B\u0430\u045A\u0435 \u043D\u0430 \u043E\u0434\u0430\u0431\u0440\u0430\u043D\u0443 \u0432\u0435\u0440\u0437\u0438\u0458\u0443 \u045B\u0435 \u0431\u0438\u0442\u0438 \u043C\u043E\u0433\u0443\u045B\u0435) +Upgrade=\u0410\u0436\u0443\u0440\u0438\u0440\u0430\u0458 +No\ old\ data\ was\ found.=\u0417\u0430\u0441\u0442\u0430\u0440\u0435\u043B\u0438 \u043F\u043E\u0434\u0430\u0446\u0438 \u043D\u0438\u0441\u0443 \u043F\u0440\u043E\u043D\u0430\u0452\u0435\u043D\u0438. +Unreadable\ Data=\u041D\u0435\u043E\u0447\u0438\u0442\u0459\u0438\u0432\u0438 \u043F\u043E\u0434\u0430\u0446\u0438 +blurb.6=\u041C\u043E\u0436\u0435 \u0441\u0435 \u043E\u0441\u0442\u0430\u0432\u0438\u0442\u0438 \u043D\u0435\u0432\u0430\u0436\u0435\u045B\u0435 \u043F\u043E\u0434\u0430\u0442\u043A\u0435 \u0443 \u043E\u0432\u0438\u043C \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0430\u043C\u0430, \u0437\u0430\u0448\u0442\u043E Jenkins \u0438\u0445 \u043D\u0435 \u0437\u0430\u0431\u0435\u043B\u0435\u0436\u0438. \u041F\u043E\u043D\u043E\u0432\u043E \u0441\u0430\u0447\u0443\u0432\u0430\u0458\u0442\u0435 \u043F\u043E\u0434\u0430\u0442\u043A\u0435 \u0434\u0430 \u0431\u0438\u0441\u0442\u0435 \u0438\u0437\u0431\u0435\u0433\u043B\u0438 \u0436\u0443\u0440\u043D\u0430\u043B \u043F\u043E\u0440\u0443\u043A\u0435 \u043D\u0430\u043A\u043E\u043D \u043F\u043E\u043A\u0440\u0435\u0442\u0430\u045A\u0430. +Error=\u0413\u0440\u0435\u0448\u043A\u0430 +Discard\ Unreadable\ Data=\u041E\u0434\u0431\u0430\u0446\u0438 \u043D\u0435\u0447\u0438\u0459\u0438\u0432\u0435 \u043F\u043E\u0434\u0430\u0442\u043A\u0435 diff --git a/core/src/main/resources/hudson/diagnosis/OldDataMonitor/message_de.properties b/core/src/main/resources/hudson/diagnosis/OldDataMonitor/message_de.properties index bb93c60a8e499878f2daf2e4ddd17bc6e3932d3d..6406a4c1145032aad50cf18a96d0ec69316345b2 100644 --- a/core/src/main/resources/hudson/diagnosis/OldDataMonitor/message_de.properties +++ b/core/src/main/resources/hudson/diagnosis/OldDataMonitor/message_de.properties @@ -1,27 +1,27 @@ -# The MIT License -# -# Copyright (c) 2004-2010, Sun Microsystems, Inc., Alan Harder, Simon Wiest -# -# 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. - - -Dismiss=Ignorieren -Manage=Verwalten -You\ have\ data\ stored\ in\ an\ older\ format\ and/or\ unreadable\ data.=\ +# The MIT License +# +# Copyright (c) 2004-2010, Sun Microsystems, Inc., Alan Harder, Simon Wiest +# +# 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. + + +Dismiss=Ignorieren +Manage=Verwalten +You\ have\ data\ stored\ in\ an\ older\ format\ and/or\ unreadable\ data.=\ Es liegen Daten in einem veralteten Format und/oder nicht lesbare Daten vor. \ No newline at end of file diff --git a/core/src/main/resources/hudson/diagnosis/OldDataMonitor/message_sr.properties b/core/src/main/resources/hudson/diagnosis/OldDataMonitor/message_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..9575d0a32398524af4e5e9cfb0ddf13f6225f5ea --- /dev/null +++ b/core/src/main/resources/hudson/diagnosis/OldDataMonitor/message_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +Manage=\u041F\u043E\u0434\u0435\u0441\u0438 +Dismiss=\u041E\u0442\u043A\u0430\u0436\u0438 +You\ have\ data\ stored\ in\ an\ older\ format\ and/or\ unreadable\ data.=\u0418\u043C\u0430\u0442\u0435 \u043F\u043E\u0434\u0430\u0442\u043A\u0435 \u0441\u0430\u0447\u0443\u0432\u0430\u043D\u0435 \u043F\u043E \u0441\u0442\u0430\u0440\u0438\u0458\u0435\u043C \u0444\u043E\u0440\u043C\u0430\u0442\u0443, \u0438\u043B\u0438 \u043D\u0435\u0443\u0447\u0438\u0442\u0459\u0438\u0432\u0435 \u043F\u043E\u0434\u0430\u0442\u043A\u0435. diff --git a/core/src/main/resources/hudson/diagnosis/ReverseProxySetupMonitor/message_sr.properties b/core/src/main/resources/hudson/diagnosis/ReverseProxySetupMonitor/message_sr.properties index e045957692c99db26648ad5063ef6bc9baf08a51..a61a9cb6dabd56a797d4f4169f527eba4a08f447 100644 --- a/core/src/main/resources/hudson/diagnosis/ReverseProxySetupMonitor/message_sr.properties +++ b/core/src/main/resources/hudson/diagnosis/ReverseProxySetupMonitor/message_sr.properties @@ -1,3 +1,5 @@ # This file is under the MIT License by authors -More\ Info=Vi\u0161e Informacija +More\ Info=\u0412\u0438\u0448\u0435 \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0458\u0430 +blurb=\u0418\u0437\u0433\u043B\u0435\u0434\u0430 \u0434\u0430 \u0438\u043C\u0435 \u0433\u0440\u0435\u0448\u043A\u0430 \u0443 \u0432\u0430\u0448\u043E\u0458 reverse proxy. +Dismiss=\u041E\u0442\u043A\u0430\u0436\u0438 diff --git a/core/src/main/resources/hudson/diagnosis/TooManyJobsButNoView/message_sr.properties b/core/src/main/resources/hudson/diagnosis/TooManyJobsButNoView/message_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..d025743f7361427539960955abd847745a702dd9 --- /dev/null +++ b/core/src/main/resources/hudson/diagnosis/TooManyJobsButNoView/message_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +Create\ a\ view\ now=\u041A\u0440\u0435\u0438\u0440\u0430\u0458 \u043F\u0440\u0435\u0433\u043B\u0435\u0434 \u0441\u0430\u0434\u0430 +Dismiss=\u041E\u0442\u043A\u0430\u0436\u0438 +blurb=\u041F\u043E\u0441\u0442\u043E\u0458\u0438 \u0432\u0435\u043B\u0438\u043A\u0438 \u0431\u0440\u043E\u0458 \u0437\u0430\u0434\u0430\u0442\u0430\u043A\u0430. \u0414\u0430 \u043B\u0438 \u0437\u043D\u0430\u0442\u0435 \u0434\u0430 \u043C\u043E\u0436\u0435\u0442\u0435 \u0434\u0430 \u043E\u0440\u0433\u0430\u043D\u0438\u0437\u0443\u0458\u0435\u0442\u0435 \u0432\u0430\u0448\u0435 \u0437\u0430\u0434\u0430\u0442\u043A\u0435 \u043F\u043E \u0440\u0430\u0437\u043B\u0438\u0447\u0438\u0442\u0438\u043C \u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0438\u043C\u0430? \u041F\u0440\u0438\u0442\u0438\u0441\u043D\u0435\u0442\u0435 " + " \u043D\u0430 \u043F\u043E\u0447\u0435\u0442\u043A\u0443 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0435 \u0431\u0438\u043B\u043E \u043A\u0430\u0434\u0430, \u0434\u0430 \u0434\u043E\u0434\u0430\u0442\u0435 \u043D\u043E\u0432\u0438 \u043F\u0440\u0435\u0433\u043B\u0435\u0434. diff --git a/core/src/main/resources/hudson/fsp/Messages_sr.properties b/core/src/main/resources/hudson/fsp/Messages_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..b4e48fe8ec4a2a4a00d1170614473ef621b2bb0e --- /dev/null +++ b/core/src/main/resources/hudson/fsp/Messages_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +WorkspaceSnapshotSCM.NoSuchJob=\u0417\u0430\u0434\u0430\u0442\u0430\u043A \u0441\u0430 \u0438\u043C\u0435\u043D\u043E\u043C "{0}" \u043D\u0435 \u043F\u043E\u0441\u0442\u043E\u0458\u0438. \u0414\u0430 \u043B\u0438 \u0441\u0442\u0435 \u043C\u0438\u0441\u043B\u0438\u043B\u0438 "{1}"? \ No newline at end of file diff --git a/core/src/main/resources/hudson/init/impl/Messages_sr.properties b/core/src/main/resources/hudson/init/impl/Messages_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..643a509371dbcf932f18addaa6e74df0f73ec6a6 --- /dev/null +++ b/core/src/main/resources/hudson/init/impl/Messages_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +GroovyInitScript.init=\u0418\u0437\u0432\u0440\u0448\u045A\u0430 \u043F\u0440\u0438\u043B\u0430\u0433\u043E\u0452\u0435\u043D\u0438\u0445 \u0438\u043D\u0438\u0446\u0438\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u043E\u043D\u0438 \u043F\u0440\u043E\u0433\u0440\u0430\u043C +InitialUserContent.init=\u041F\u0440\u0438\u043F\u0440\u0435\u043C\u0430\u045A\u0435 \u043E\u0441\u043D\u043E\u0432\u043D\u0438 \u0441\u0430\u0434\u0440\u0436\u0430\u0458 \u0437\u0430 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u043A\u0430 \ No newline at end of file diff --git a/core/src/main/resources/hudson/lifecycle/Messages_pl.properties b/core/src/main/resources/hudson/lifecycle/Messages_pl.properties new file mode 100644 index 0000000000000000000000000000000000000000..adea2803ad1afaa92a82782e20c53e3df1c96c69 --- /dev/null +++ b/core/src/main/resources/hudson/lifecycle/Messages_pl.properties @@ -0,0 +1,25 @@ +# The MIT License +# +# Copyright (c) 2016 Damian Szczepanik +# +# 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. +WindowsInstallerLink.DisplayName=Zainstaluj jako us\u0142ug\u0119 systemow\u0105 +WindowsSlaveInstaller.DotNetRequired=.NET Framework 2.0 lub nowszy jest wymagany dla tej funkcjonalno\u015Bci +WindowsSlaveInstaller.InstallationSuccessful=Instalacja zako\u0144czona pomy\u015Blnie. Chcesz uruchomi\u0107 us\u0142ug\u0119 teraz? +WindowsInstallerLink.Description=Zainstaluj Jenkinsa jako us\u0142ug\u0119 systemow\u0105, aby uruchomi\u0107 Jenkinsa automatycznie po uruchomieniu systemu. diff --git a/core/src/main/resources/hudson/lifecycle/Messages_sr.properties b/core/src/main/resources/hudson/lifecycle/Messages_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..8c6981247ca11c3c5eef36b5b78108be454418ff --- /dev/null +++ b/core/src/main/resources/hudson/lifecycle/Messages_sr.properties @@ -0,0 +1,8 @@ +# This file is under the MIT License by authors + +WindowsInstallerLink.DisplayName=\u0418\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u0458 \u043A\u0430\u043E Windows \u0441\u0435\u0440\u0432\u0438\u0441 +WindowsInstallerLink.Description=\u0418\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430 Jenkins \u043A\u0430\u043E Windows \u0441\u0435\u0440\u0432\u0438\u0441 \u043A\u043E\u0458\u0438 \u0441\u0435 \u0430\u0443\u0442\u043E\u043C\u0430\u0442\u0441\u043A\u043E \u043F\u043E\u043A\u0440\u0435\u043D\u0435 \u043A\u0430\u0434\u0430 \u043F\u043E\u0447\u043D\u0435 \u043C\u0430\u0448\u0438\u043D\u0430. +WindowsSlaveInstaller.ConfirmInstallation=\u041E\u043F\u0435\u0440\u0430\u0446\u0438\u0458\u0430 \u045B\u0435 \u0438\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u0442\u0438 \u0430\u0433\u0435\u043D\u0442 \u043A\u043E\u0458\u0438 \u0441\u0435 \u0430\u0443\u0442\u043E\u043C\u0430\u0442\u0441\u043A\u043E \u043F\u043E\u043A\u0440\u0435\u043D\u0435 \u043A\u0430\u0434\u0430 \u043F\u043E\u0447\u043D\u0435 \u043C\u0430\u0448\u0438\u043D\u0430. +WindowsSlaveInstaller.InstallationSuccessful=\u0423\u0441\u043F\u0435\u0448\u043D\u0430 \u0438\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u0430. \u0414\u0430 \u0441\u0435 \u0436\u0435\u043B\u0438\u0442\u0435 \u0434\u0430 \u0441\u0430\u0434\u0430 \u043F\u043E\u043A\u0440\u0435\u043D\u0435\u0442\u0435 \u0441\u0435\u0440\u0432\u0438\u0441? +WindowsSlaveInstaller.DotNetRequired=\u0417\u0430 \u0442\u043E \u043D\u0438\u0458\u0435 \u043F\u043E\u0442\u0440\u0435\u0431\u043D\u043E .NET Framework 2.0 \u0438\u043B\u0438 \u043D\u043E\u0432\u0438\u0458\u0435 +WindowsSlaveInstaller.RootFsDoesntExist=\u041E\u0441\u043D\u043E\u0432\u043D\u0438 \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0458\u0443\u043C \u0430\u0433\u0435\u043D\u0442\u0430 "{0}" \u043D\u0435 \u043F\u043E\u0441\u0442\u043E\u0458\u0438. \ No newline at end of file diff --git a/core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/_restart.properties b/core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/_restart.properties index 31eae4527a8bad551066df5b8e82304b580ead06..f732713a51eb79f27610047b18a57a43fbfa60c6 100644 --- a/core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/_restart.properties +++ b/core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/_restart.properties @@ -22,4 +22,4 @@ blurb=You should be taken automatically to the new Jenkins in a few seconds. \ If for some reason the service fails to start, please check the Windows event log for errors and consult the wiki page \ - located at the official wiki. + located at the official wiki. diff --git a/core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/_restart_de.properties b/core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/_restart_de.properties index 382bf6e7d7c75567c4bf67f6e75734fbeae96f1e..fe3165afa57ce7bbe786214cc2ca9de22aa514da 100644 --- a/core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/_restart_de.properties +++ b/core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/_restart_de.properties @@ -1,4 +1,4 @@ Please\ wait\ while\ Jenkins\ is\ restarting=Bitte warten Sie, whrend Jenkins neu gestartet wird blurb=Sie sollten automatisch in wenigen Sekunden auf die neue Jenkins-Instanz weitergeleitet werden. \ Sollte der Windows-Dienst nicht starten, suchen Sie im Windows Ereignisprotokoll nach Fehlermeldungen und lesen Sie \ - weitere Hinweise im Wiki. + weitere Hinweise im Wiki. diff --git a/core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/_restart_es.properties b/core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/_restart_es.properties index c9a35d1d85786445af0ef69880b2e67c8e382426..492e81a8d7b2c2a5944a3cd800597d06c8e64bc3 100644 --- a/core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/_restart_es.properties +++ b/core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/_restart_es.properties @@ -22,5 +22,5 @@ blurb=Sers redirigido automticamente al nuevo Jenkins en unos segundos. \ Si por alguna razn el servicio falla, consulta el ''log'' de eventos de windows \ - y echa un vistazo a esta pgina. + y echa un vistazo a esta pgina. Please\ wait\ while\ Jenkins\ is\ restarting=Por favor espera mientras Jenkins es reiniciado diff --git a/core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/_restart_fr.properties b/core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/_restart_fr.properties index ca363550e7084181a9bb40065608fa4b27b9030d..acc033e4e1b1828a0a59b8f3431f7ffc76530e1c 100644 --- a/core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/_restart_fr.properties +++ b/core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/_restart_fr.properties @@ -25,4 +25,4 @@ blurb=Vous devriez \u00EAtre emmen\u00E9 automatiquement vers la nouvelle instan de Jenkins dans quelques secondes. \ Si par hasard le service ne parvient pas \u00E0 se lancer, v\u00E9rifiez les logs \ d''\u00E9v\u00E8nements Windows et consultez \ - la page wiki. + la page wiki. diff --git a/core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/_restart_ja.properties b/core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/_restart_ja.properties index bf999731834a1a2f1d325f6b37ef393018ed6a11..9ffc93da4f8f9812c63eed37aa02848f8409a0d3 100644 --- a/core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/_restart_ja.properties +++ b/core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/_restart_ja.properties @@ -22,5 +22,5 @@ blurb=\u6570\u79D2\u3067\u81EA\u52D5\u7684\u306B\u65B0\u3057\u3044Jenkins\u306B\u63A5\u7D9A\u3057\u307E\u3059\u3002\ \u3082\u3057\u3001\u4F55\u3089\u304B\u306E\u7406\u7531\u3067\u30B5\u30FC\u30D3\u30B9\u306E\u958B\u59CB\u306B\u5931\u6557\u3059\u308B\u5834\u5408\u306F\u3001Windows\u306E\u30A4\u30D9\u30F3\u30C8\u30ED\u30B0\u306B\u30A8\u30E9\u30FC\u304C\u306A\u3044\u304B\u78BA\u8A8D\u3057\u3066\u3001\ - Wiki\u3092\u53C2\u7167\u3057\u3066\u304F\u3060\u3055\u3044\u3002 + Wiki\u3092\u53C2\u7167\u3057\u3066\u304F\u3060\u3055\u3044\u3002 Please\ wait\ while\ Jenkins\ is\ restarting=Jenkins\u3092\u518D\u8D77\u52D5\u3057\u307E\u3059\u306E\u3067\u3001\u3057\u3070\u3089\u304F\u304A\u5F85\u3061\u304F\u3060\u3055\u3044\u3002 diff --git a/core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/_restart_nl.properties b/core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/_restart_nl.properties index 68ff9a6c13ceda5aa416d84dc7ccd7fa36e0fbf0..a0c11bc5f65e52bfbb3ca653682cfa7bf196adfe 100644 --- a/core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/_restart_nl.properties +++ b/core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/_restart_nl.properties @@ -24,4 +24,4 @@ Please\ wait\ while\ Jenkins\ is\ restarting=Gelieve even te wachten. Jenkins wo blurb=Uw nieuwe Jenkins instantie zou automatisch geladen moeten worden. \ Indien de service niet gestart raakt, kunt U er best de Windows event log op nakijken. \ Eventueel kunt U ook wat meer info over typische problemen en hun oplossingen terugvinden op \ - de online wiki pagina. + de online wiki pagina. diff --git a/core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/_restart_pt_BR.properties b/core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/_restart_pt_BR.properties index a26457988fc6a62720345bbf2a860eb3606a834e..eed23b1afc036e7b163029d9bfd69815638ebeaa 100644 --- a/core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/_restart_pt_BR.properties +++ b/core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/_restart_pt_BR.properties @@ -23,7 +23,7 @@ Please\ wait\ while\ Jenkins\ is\ restarting= Por favor aguarde enquanto o Jenkins reinicia # You should be taken automatically to the new Jenkins in a few seconds. \ # If for some reasons the service fails to start, check Windows event log for errors and consult \ -# online wiki page. +# online wiki page. blurb=Voc\u00ea deve ser levado ao Jenkins em poucos instantes. \ Se por alguma raz\u00e3o o servi\u00e7o falhar na inicializa\u00e7\u00e3o, verifique o log de eventos \ diff --git a/core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/_restart_sr.properties b/core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/_restart_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..90525524fe5d80a1196aa01b5b88175726f7b3ef --- /dev/null +++ b/core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/_restart_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +Please\ wait\ while\ Jenkins\ is\ restarting=\u041C\u043E\u043B\u0438\u043C\u043E \u0432\u0430\u0441 \u0441\u0430\u0447\u0435\u043A\u0430\u0458\u0442\u0435 \u0434\u043E\u043A \u0441\u0435 \u043F\u043E\u043D\u043E\u0432\u043E \u043F\u043E\u043A\u0440\u0435\u043D\u0435 Jenkins +blurb=\u0411\u0438\u045B\u0435\u0442\u0435 \u043C\u043E\u043C\u0435\u043D\u0442\u0430\u043B\u043D\u043E \u0430\u0443\u0442\u043E\u043C\u0430\u0442\u0441\u043A\u0438 \u043D\u0430\u0432\u0435\u0441\u0442\u0438 \u043D\u0430 Jenkins.\ +\u0410\u043A\u043E \u0438\u0437 \u043D\u0435\u043A\u043E\u0433 \u0440\u0430\u0437\u043B\u043E\u0433\u0430 \u0441\u0435\u0440\u0432\u0438\u0441 \u043D\u0435 \u0440\u0430\u0434\u0438, \u043F\u0440\u043E\u0432\u0435\u0440\u0438\u0442\u0435 Windows \u0436\u0443\u0440\u043D\u0430\u043B \u0434\u043E\u0433\u0430\u0452\u0430\u0458\u0430 \u043D\u0430 \u0433\u0440\u0435\u0448\u043A\u0435 \u0438\u043B\u0438 \u0441\u0435 \u043E\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0412\u0438\u043A\u0438 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0438 <\u0430 href="https://jenkins.io/redirect/troubleshooting/windows-service-fails-to-start"">\u0437\u0432\u0430\u043D\u0438\u0447\u043D\u043E\u0433 \u0412\u0438\u043A\u0438. diff --git a/core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/_restart_zh_TW.properties b/core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/_restart_zh_TW.properties index c927aebac9948deaf2b127dc38814d7f8c75022c..71355c449f256d3dcf3afa5292e59cf5c6dc5ff9 100644 --- a/core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/_restart_zh_TW.properties +++ b/core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/_restart_zh_TW.properties @@ -21,6 +21,6 @@ # THE SOFTWARE. blurb=\u5e7e\u79d2\u5f8c\u60a8\u5c31\u6703\u88ab\u5e36\u5230\u65b0\u7684 Jenkins \u88e1\u3002\ - \u5982\u679c\u670d\u52d9\u7121\u6cd5\u555f\u52d5\uff0c\u8acb\u6aa2\u67e5 Windows \u4e8b\u4ef6\u65e5\u8a8c\uff0c\u4e26\u53c3\u8003\u7dda\u4e0a Wiki \u5c08\u9801\u3002 + \u5982\u679c\u670d\u52d9\u7121\u6cd5\u555f\u52d5\uff0c\u8acb\u6aa2\u67e5 Windows \u4e8b\u4ef6\u65e5\u8a8c\uff0c\u4e26\u53c3\u8003\u7dda\u4e0a Wiki \u5c08\u9801\u3002 Please\ wait\ while\ Jenkins\ is\ restarting=Jenkins \u91cd\u65b0\u555f\u52d5\u4e2d\uff0c\u8acb\u7a0d\u5019 diff --git a/core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/index_pl.properties b/core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/index_pl.properties new file mode 100644 index 0000000000000000000000000000000000000000..11b31afa40b5188a244e6ec83ba2ab5fd2ab7fb6 --- /dev/null +++ b/core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/index_pl.properties @@ -0,0 +1,27 @@ +# The MIT License +# +# Copyright (c) 2016-2017 Damian Szczepanik +# +# 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. +Installation\ Directory=Katalog instalacyjny +Install\ as\ Windows\ Service=Zainstaluj jako us\u0142ug\u0119 systemow\u0105 +Yes=Tak +Install=Zainstaluj +Installation\ Complete=Instalacja zako\u0144czona +installBlurb=Instalacja jako us\u0142uga systemowa pozwoli uruchamia\u0107 Jenkinsa, gdy tylko system operacyjny b\u0119dzie gotowy niezale\u017Cnie od tego, kto go b\u0119dzie u\u017Cywa\u0142. diff --git a/core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/index_sr.properties b/core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/index_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..b7283ad27b269e9b251f5f91541319708cfa10cb --- /dev/null +++ b/core/src/main/resources/hudson/lifecycle/WindowsInstallerLink/index_sr.properties @@ -0,0 +1,10 @@ +# This file is under the MIT License by authors + +Install\ as\ Windows\ Service=\u0418\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u0458 \u043A\u0430\u043E Windows \u0441\u0435\u0440\u0432\u0438\u0441 +installBlurb=\u0418\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u0430 Jenkins \u043A\u0430\u043E Windows \u0441\u0435\u0440\u0432\u0438\u0441 \u0432\u0430\u043C \u043E\u043C\u043E\u0433\u0443\u045B\u0430\u0432\u0430 \u0434\u0430 \u043F\u043E\u043A\u0440\u0435\u043D\u0435\u0442\u0435 Jenkins \u043A\u0430\u0434\u0430 \u043F\u043E\u0447\u043D\u0435 \u043C\u0430\u0448\u0438\u043D\u0430, \u0431\u0435\u0437 \u043E\u0431\u0437\u0438\u0440\u0430 \u043D\u0430\ +\u043A\u043E \u043A\u043E\u0440\u0438\u0441\u0442\u0438 Jenkins. +Installation\ Directory=\u0414\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0443\u043C \u0437\u0430 \u0438\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u0443 +Install=\u0418\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u0458 +Installation\ Complete=\u0418\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u0430 \u0433\u043E\u0442\u043E\u0432\u0430 +restartBlurb=\u0418\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u0430 \u0458\u0435 \u0443\u0441\u043F\u0435\u0448\u043D\u043E \u0437\u0430\u0432\u0440\u0448\u0435\u043D\u0430. \u0414\u0430\u043B\u0438 \u0436\u0435\u043B\u0438\u0442\u0435 \u0434\u0430 \u0437\u0430\u0443\u0441\u0442\u0430\u0432\u0438\u0442\u0435 Jenkins \u0438 \u043F\u043E\u043D\u043E\u0432\u043E \u043F\u043E\u043A\u0440\u0435\u043D\u0435\u0442\u0435 \u043D\u043E\u0432\u043E-\u0438\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u043D\u0438 Windows \u0441\u0435\u0440\u0432\u0438\u0441? +Yes=\u0414\u0430 diff --git a/core/src/main/resources/hudson/logging/LogRecorder/configure_sr.properties b/core/src/main/resources/hudson/logging/LogRecorder/configure_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..22db6a939b54de73261a31e3004f54e6d4d6dcf9 --- /dev/null +++ b/core/src/main/resources/hudson/logging/LogRecorder/configure_sr.properties @@ -0,0 +1,8 @@ +# This file is under the MIT License by authors + +Name=\u0418\u043C\u0435 +Loggers=\u041F\u0440\u0435\u043F\u0438\u0441\u0438\u0432\u0430\u0447\u0438 +List\ of\ loggers\ and\ the\ log\ levels\ to\ record=\u0421\u043F\u0438\u0441\u0430\u043A \u043F\u0440\u0435\u043F\u0438\u0441\u0438\u0432\u0430\u0447\u0430 \u0438 \u043D\u0438\u0432\u043E\u0438 \u0437\u0430 \u043F\u0438\u0441\u0430\u045A\u0430\u045A\u0435 \u0437 \u0436\u0443\u0440\u043D\u0430\u043B +Logger=\u041F\u0440\u0435\u043F\u0438\u0441\u0438\u0432\u0430\u0447 +Save=\u0421\u0430\u0447\u0443\u0432\u0430\u0458 +Log\ level=\u041D\u0438\u0432\u043E \u0434\u0435\u0442\u0430\u0459\u0430 \u0436\u0443\u0440\u043D\u0430\u043B\u043E\u0432\u0430\u045A\u0430 diff --git a/core/src/main/resources/hudson/logging/LogRecorder/delete_pl.properties b/core/src/main/resources/hudson/logging/LogRecorder/delete_pl.properties new file mode 100644 index 0000000000000000000000000000000000000000..bc11809b5cb211b0284d19ee12dd62f2f9475ca3 --- /dev/null +++ b/core/src/main/resources/hudson/logging/LogRecorder/delete_pl.properties @@ -0,0 +1,23 @@ +# The MIT License +# +# Copyright (c) 2017, Damian Szczepanik +# +# 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. +Are\ you\ sure\ about\ deleting\ this\ log\ recorder?=Czy na pewno chcesz usun\u0105\u0107 tego rejestratora log\u00F3w? +Yes=Tak diff --git a/core/src/main/resources/hudson/logging/LogRecorder/delete_sr.properties b/core/src/main/resources/hudson/logging/LogRecorder/delete_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..79e28f491f4e32a7e4d63e7fab3bebb240742e85 --- /dev/null +++ b/core/src/main/resources/hudson/logging/LogRecorder/delete_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Are\ you\ sure\ about\ deleting\ this\ log\ recorder?=\u0414\u0430\u043B\u0438 \u0436\u0435\u043B\u0438\u0442\u0435 \u0434\u0430 \u0443\u043A\u043B\u043E\u043D\u0438\u0442\u0435 \u043E\u0432\u043E\u0433 \u043F\u0440\u0435\u043F\u0438\u0441\u0438\u0432\u0430\u0447\u0430? +Yes=\u0414\u0430 diff --git a/core/src/main/resources/lib/form/apply_zh_TW.properties b/core/src/main/resources/hudson/logging/LogRecorder/index_pl.properties similarity index 92% rename from core/src/main/resources/lib/form/apply_zh_TW.properties rename to core/src/main/resources/hudson/logging/LogRecorder/index_pl.properties index 8b3022f372a08bcc890589e9088e33b02e6c7266..a3fc012d58917121deaff28d019fc0f73acada64 100644 --- a/core/src/main/resources/lib/form/apply_zh_TW.properties +++ b/core/src/main/resources/hudson/logging/LogRecorder/index_pl.properties @@ -1,6 +1,6 @@ # The MIT License # -# Copyright (c) 2013, Chunghwa Telecom Co., Ltd., Pei-Tang Huang +# Copyright (c) 2017, Damian Szczepanik # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -19,5 +19,4 @@ # 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. - -Apply=\u5957\u7528 +Clear\ This\ Log=Usu\u0144 logi diff --git a/core/src/main/resources/hudson/logging/LogRecorder/index_sr.properties b/core/src/main/resources/hudson/logging/LogRecorder/index_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..ab884fbbc937e48a851a21483d670459ee7afb64 --- /dev/null +++ b/core/src/main/resources/hudson/logging/LogRecorder/index_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Clear\ This\ Log=\u041F\u0440\u0435\u0431\u0440\u0438\u0448\u0438 \u0436\u0443\u0440\u043D\u0430\u043B diff --git a/core/src/main/resources/hudson/logging/LogRecorder/sidepanel_pl.properties b/core/src/main/resources/hudson/logging/LogRecorder/sidepanel_pl.properties new file mode 100644 index 0000000000000000000000000000000000000000..378dffae6e0b8efd935c1bf942028b15852aca92 --- /dev/null +++ b/core/src/main/resources/hudson/logging/LogRecorder/sidepanel_pl.properties @@ -0,0 +1,25 @@ +# The MIT License +# +# Copyright (c) 2017, Damian Szczepanik +# +# 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. +Back\ to\ Loggers=Powr\u00F3t do rejestrator\u00F3w log\u00F3w +Delete=Usu\u0144 +Log\ records=Zawarto\u015B\u0107 rejestratora log\u00F3w +Configure=Skonfiguruj diff --git a/core/src/main/resources/hudson/logging/LogRecorder/sidepanel_sr.properties b/core/src/main/resources/hudson/logging/LogRecorder/sidepanel_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..056edbafdc7b5a359246825a417f74154eebf546 --- /dev/null +++ b/core/src/main/resources/hudson/logging/LogRecorder/sidepanel_sr.properties @@ -0,0 +1,6 @@ +# This file is under the MIT License by authors + +Back\ to\ Loggers=\u041D\u0430\u0437\u0430\u0434 \u043D\u0430 \u043F\u0440\u0435\u043F\u0438\u0441\u0438\u0432\u0430\u0447\u0435 +Log\ records=\u041D\u0438\u0432\u043E\u0438 \u0437\u0430 \u043F\u0438\u0441\u0430\u045A\u0435 \u0443 \u0436\u0443\u0440\u043D\u0430\u043B +Configure=\u041A\u043E\u043D\u0444\u0438\u0433\u0443\u0440\u0438\u0448\u0438 +Delete=\u0423\u043A\u043B\u043E\u043D\u0438 diff --git a/core/src/main/resources/hudson/logging/LogRecorderManager/all_sr.properties b/core/src/main/resources/hudson/logging/LogRecorderManager/all_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..9e6ac59fabe5e1e6b2772f7b4a2823a9b427dd68 --- /dev/null +++ b/core/src/main/resources/hudson/logging/LogRecorderManager/all_sr.properties @@ -0,0 +1,7 @@ +# This file is under the MIT License by authors + +Jenkins\ Log=Jenkins \u0436\u0443\u0440\u043D\u0430\u043B +Level=\u041D\u0438\u0432\u043E +Logger\ Configuration=\u041F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 \u0436\u0443\u0440\u043D\u0430\u043B\u0430 +Name=\u0418\u043C\u0435 +Submit=\u041F\u043E\u0434\u043D\u0435\u0441\u0438 diff --git a/core/src/main/resources/hudson/logging/LogRecorderManager/feeds_sr.properties b/core/src/main/resources/hudson/logging/LogRecorderManager/feeds_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..89231883ddcc627e1f46e051f32bd761449b8d5c --- /dev/null +++ b/core/src/main/resources/hudson/logging/LogRecorderManager/feeds_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +All=\u0421\u0432\u0435 +>\ SEVERE=> \u0421\u0422\u0420\u041E\u0413\u041E +>\ WARNING=> \u0423\u041F\u041E\u0417\u041E\u0420\u0415\u040A\u0415 diff --git a/core/src/main/resources/hudson/logging/LogRecorderManager/index.jelly b/core/src/main/resources/hudson/logging/LogRecorderManager/index.jelly index e188caed69553577930fd4b4221fcf6b38b2956b..1eb55cf888dfe4965db584922067bdf01b360dfa 100644 --- a/core/src/main/resources/hudson/logging/LogRecorderManager/index.jelly +++ b/core/src/main/resources/hudson/logging/LogRecorderManager/index.jelly @@ -32,7 +32,7 @@ THE SOFTWARE.

        ${%Log Recorders} - +

        diff --git a/core/src/main/resources/hudson/logging/LogRecorderManager/index_sr.properties b/core/src/main/resources/hudson/logging/LogRecorderManager/index_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..3ace1a3e186ea7f6bdffbb89c1bea555d8f81f5a --- /dev/null +++ b/core/src/main/resources/hudson/logging/LogRecorderManager/index_sr.properties @@ -0,0 +1,14 @@ +# This file is under the MIT License by authors + +Log=\u0416\u0443\u0440\u043D\u0430\u043B +Log\ Recorders=\u0416\u0443\u0440\u043D\u0430\u043B\u0438 +Name=\u0418\u043C\u0435 +Add\ new\ log\ recorder=\u0414\u043E\u0434\u0430\u0458 \u043D\u043E\u0432\u043E\u0433 \u043F\u0440\u0435\u043F\u0438\u0441\u0438\u0432\u0430\u0447\u0430 +All\ Jenkins\ Logs=\u0421\u0432\u0438 Jenkins \u0436\u0443\u0440\u043D\u0430\u043B\u0438 +Jenkins\ Log=Jenkins \u0436\u0443\u0440\u043D\u0430\u043B +Level=\u041D\u0438\u0432\u043E +Logger\ Configuration=\u041F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0435 \u0436\u0443\u0440\u043D\u0430\u043B\u0430 +Submit=\u041F\u043E\u0434\u043D\u0435\u0441\u0438 +All=\u0421\u0432\u0435 +>\ SEVERE=> \u0421\u0422\u0420\u041E\u0413\u041E +>\ WARNING=> \u0423\u041F\u041E\u0417\u041E\u0420\u0415\u040A\u0415 diff --git a/core/src/main/resources/hudson/logging/LogRecorderManager/levels.properties b/core/src/main/resources/hudson/logging/LogRecorderManager/levels.properties index 4f02f7ea2c93a3b24771be12eea10bd14263ecfa..11646ee2754199f130bd5231284ee3bb4f882787 100644 --- a/core/src/main/resources/hudson/logging/LogRecorderManager/levels.properties +++ b/core/src/main/resources/hudson/logging/LogRecorderManager/levels.properties @@ -20,6 +20,6 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -url=http://wiki.jenkins-ci.org//x/YYI5Ag +url=https://jenkins.io/redirect/log-levels defaultLoggerMsg=Logger with no name is the default logger. \ This level will be inherited by all loggers without a configured level. diff --git a/core/src/main/resources/hudson/logging/LogRecorderManager/levels_da.properties b/core/src/main/resources/hudson/logging/LogRecorderManager/levels_da.properties index bf0d0c2d8694832691212f4dfddcb92cfdeb4637..4b029252569aa6365544a8d55e760b80a3fde67d 100644 --- a/core/src/main/resources/hudson/logging/LogRecorderManager/levels_da.properties +++ b/core/src/main/resources/hudson/logging/LogRecorderManager/levels_da.properties @@ -21,7 +21,7 @@ # THE SOFTWARE. Level=Niveau -url=http://wiki.jenkins-ci.org/display/JENKINS/Logger+Configuration +url=https://jenkins.io/redirect/log-levels defaultLoggerMsg=Unavngiven logger er standardlogger. \ Dette niveau vil nedarve til alle loggere uden et konfigurationsniveau. Name=Navn diff --git a/core/src/main/resources/hudson/logging/LogRecorderManager/levels_de.properties b/core/src/main/resources/hudson/logging/LogRecorderManager/levels_de.properties index f84c727878ff1d373d887040fd429746f8776d2a..1a8a389aec05c724e118f35f244b223fb491def5 100644 --- a/core/src/main/resources/hudson/logging/LogRecorderManager/levels_de.properties +++ b/core/src/main/resources/hudson/logging/LogRecorderManager/levels_de.properties @@ -21,7 +21,7 @@ # THE SOFTWARE. Logger\ Configuration=Logger-Konfiguration -url=http://wiki.jenkins-ci.org/display/JENKINS/Logger+Configuration +url=https://jenkins.io/redirect/log-levels Name=Name Level=Prioritt Submit=bernehmen diff --git a/core/src/main/resources/hudson/logging/LogRecorderManager/levels_es.properties b/core/src/main/resources/hudson/logging/LogRecorderManager/levels_es.properties index f3fdddd73c1d2e176d4c526a0d6a0c3370ead5f6..aa803dda357c43799c6f11aed81b95de469ce9b4 100644 --- a/core/src/main/resources/hudson/logging/LogRecorderManager/levels_es.properties +++ b/core/src/main/resources/hudson/logging/LogRecorderManager/levels_es.properties @@ -20,7 +20,7 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -url=http://wiki.jenkins-ci.org/display/JENKINS/Logger+Configuration +url=https://jenkins.io/redirect/log-levels Level=Nivel de log Logger\ Configuration=Configuracin del logger Submit=Enviar diff --git a/core/src/main/resources/hudson/logging/LogRecorderManager/levels_fr.properties b/core/src/main/resources/hudson/logging/LogRecorderManager/levels_fr.properties index 10e3d012fc9868dfadfd0c493621e9c9d2cb09c5..c30bb5735afa49fac158cc1b037de24fd7010ef1 100644 --- a/core/src/main/resources/hudson/logging/LogRecorderManager/levels_fr.properties +++ b/core/src/main/resources/hudson/logging/LogRecorderManager/levels_fr.properties @@ -24,4 +24,4 @@ Logger\ Configuration=Configuration du logger Name=Nom Level=Niveau Submit=Envoyer -url=http://wiki.jenkins-ci.org/display/JENKINS/Logger+Configuration +url=https://jenkins.io/redirect/log-levels diff --git a/core/src/main/resources/hudson/logging/LogRecorderManager/levels_it.properties b/core/src/main/resources/hudson/logging/LogRecorderManager/levels_it.properties index 3450c5a7292dcdc49eb9427da72c49688a2ef02a..a455ea1aa51f5f566536bf71c7ad8e9b52ddb81e 100644 --- a/core/src/main/resources/hudson/logging/LogRecorderManager/levels_it.properties +++ b/core/src/main/resources/hudson/logging/LogRecorderManager/levels_it.properties @@ -6,4 +6,4 @@ Logger\ Configuration=Configurazione registro Name=Nome Submit=Invia defaultLoggerMsg=Il registro senza nome \u00E8 quello predefinito. Questo livello sar\u00E0 ereditato da tutti i registri senza un livello configurato. -url=http://wiki.jenkins-ci.org//x/YYI5Ag +url=https://jenkins.io/redirect/log-levels diff --git a/core/src/main/resources/hudson/logging/LogRecorderManager/levels_ja.properties b/core/src/main/resources/hudson/logging/LogRecorderManager/levels_ja.properties index ab204e41ff8eca74dee9e4a95b587c590851a42d..2f8444273b1bb023e72c369fe5146437133ff500 100644 --- a/core/src/main/resources/hudson/logging/LogRecorderManager/levels_ja.properties +++ b/core/src/main/resources/hudson/logging/LogRecorderManager/levels_ja.properties @@ -24,7 +24,7 @@ Logger\ Configuration=\u30ED\u30AC\u30FC\u306E\u8A2D\u5B9A Name=\u540D\u524D Level=\u30EC\u30D9\u30EB Submit=\u767B\u9332 -url=http://wiki.jenkins-ci.org/display/JA/Logger+Configuration +url=https://jenkins.io/redirect/log-levels defaultLoggerMsg=\u540D\u524D\u304C\u306A\u3044\u30ED\u30AC\u30FC\u306F\u30C7\u30D5\u30A9\u30EB\u30C8\u306E\u30ED\u30AC\u30FC\u3067\u3059\u3002\ \u30C7\u30D5\u30A9\u30EB\u30C8\u306E\u30ED\u30AC\u30FC\u306E\u30EC\u30D9\u30EB\u306F\u3001\u8A2D\u5B9A\u3057\u306A\u304F\u3066\u3082\u5168\u3066\u306E\u30ED\u30AC\u30FC\u306B\u5F15\u304D\u7D99\u304C\u308C\u307E\u3059\u3002 Adjust\ Levels=\u30EC\u30D9\u30EB\u306E\u8ABF\u6574 diff --git a/core/src/main/resources/hudson/logging/LogRecorderManager/levels_ko.properties b/core/src/main/resources/hudson/logging/LogRecorderManager/levels_ko.properties index b2ae0088527697e3df6162b6066414c9f0eac7d1..bc7562a4935bca8af66d185e4513aa028e391988 100644 --- a/core/src/main/resources/hudson/logging/LogRecorderManager/levels_ko.properties +++ b/core/src/main/resources/hudson/logging/LogRecorderManager/levels_ko.properties @@ -6,4 +6,4 @@ Logger\ Configuration=\uB85C\uAC70 \uC124\uC815 Name=\uC774\uB984 Submit=\uC81C\uCD9C defaultLoggerMsg=\uC774\uB984\uC774 \uC5C6\uB294 Logger\uB294 \uAE30\uBCF8 Logger\uC785\uB2C8\uB2E4. \uB808\uBCA8\uC774 \uC124\uC815\uB418\uC9C0 \uC54A\uC740 \uBAA8\uB4E0 Logger\uB4E4\uC740 \uC774 \uB808\uBCA8\uC744 \uC0C1\uC18D\uD569\uB2C8\uB2E4. -url=http://wiki.jenkins-ci.org//x/YYI5Ag +url=https://jenkins.io/redirect/log-levels diff --git a/core/src/main/resources/hudson/logging/LogRecorderManager/levels_pt.properties b/core/src/main/resources/hudson/logging/LogRecorderManager/levels_pt.properties index 0aa78bd338c9ac614b8996c68bdb0be8f92c7ba2..9863626db1fc5850003322e43e9ff356ff82a8cd 100644 --- a/core/src/main/resources/hudson/logging/LogRecorderManager/levels_pt.properties +++ b/core/src/main/resources/hudson/logging/LogRecorderManager/levels_pt.properties @@ -21,7 +21,7 @@ # THE SOFTWARE. Adjust\ Levels=Ajustar n\u00edveis -url=http://wiki.jenkins-ci.org//x/YYI5Ag +url=https://jenkins.io/redirect/log-levels Submit=Enviar Logger\ Configuration=Configura\u00e7\u00e3o de logger defaultLoggerMsg=Um logger sem nome ser\u00e1 o logger padr\u00e3o. Esse n\u00edvel ser\u00e1 herdado por todos os loggers sem um n\u00edvel configurado. diff --git a/core/src/main/resources/hudson/logging/LogRecorderManager/levels_pt_BR.properties b/core/src/main/resources/hudson/logging/LogRecorderManager/levels_pt_BR.properties index d82fb502196143595073221b3d8303e8dcf2c8cd..6be55205954c3eab7b770730bbd3a4c5e2bcec1b 100644 --- a/core/src/main/resources/hudson/logging/LogRecorderManager/levels_pt_BR.properties +++ b/core/src/main/resources/hudson/logging/LogRecorderManager/levels_pt_BR.properties @@ -28,5 +28,5 @@ Name=Nome Adjust\ Levels=Ajustar os n\u00edveis Submit=Enviar Logger\ Configuration=Configura\u00e7\u00e3o do Logger -# http://wiki.jenkins-ci.org//x/YYI5Ag -url=http://wiki.jenkins-ci.org//x/YYI5Ag +# https://jenkins.io/redirect/log-levels +url=https://jenkins.io/redirect/log-levels diff --git a/core/src/main/resources/hudson/logging/LogRecorderManager/levels_ru.properties b/core/src/main/resources/hudson/logging/LogRecorderManager/levels_ru.properties index 1e6b31ab3351697c8564cccc225bc4375d271264..b156024d81b9618b66799474c3699d63255d8bbc 100644 --- a/core/src/main/resources/hudson/logging/LogRecorderManager/levels_ru.properties +++ b/core/src/main/resources/hudson/logging/LogRecorderManager/levels_ru.properties @@ -26,4 +26,4 @@ Logger\ Configuration=\u041A\u043E\u043D\u0444\u0438\u0433\u0443\u0440\u0430\u04 Name=\u041D\u0430\u0438\u043C\u0435\u043D\u043E\u0432\u0430\u043D\u0438\u0435 Submit=\u0421\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u044C defaultLoggerMsg=\u0416\u0443\u0440\u043D\u0430\u043B \u0431\u0435\u0437 \u0438\u043C\u0435\u043D\u0438 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0441\u044F \u043F\u043E-\u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E. \u0423\u0440\u043E\u0432\u0435\u043D\u044C \u0436\u0443\u0440\u043D\u0430\u043B\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F \u0437\u0430\u0434\u0430\u043D\u043D\u044B\u0439 \u0434\u043B\u044F \u043D\u0435\u0433\u043E \u043D\u0430\u0441\u043B\u0435\u0434\u0443\u0435\u0442\u0441\u044F \u0432\u0441\u0435\u043C\u0438 \u0436\u0443\u0440\u043D\u0430\u043B\u0430\u043C\u0438, \u0434\u043B\u044F \u043A\u043E\u0442\u043E\u0440\u044B\u0445 \u0443\u0440\u043E\u0432\u0435\u043D\u044C \u0436\u0443\u0440\u043D\u0430\u043B\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F \u043D\u0435 \u0437\u0430\u0434\u0430\u043D. -url=http://wiki.jenkins-ci.org/display/JENKINS/Logger+Configuration +url=https://jenkins.io/redirect/log-levels diff --git a/core/src/main/resources/hudson/logging/LogRecorderManager/levels_sr.properties b/core/src/main/resources/hudson/logging/LogRecorderManager/levels_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..059a02ebf24d513b15ff6e8caf07cb9fe2b0ddb2 --- /dev/null +++ b/core/src/main/resources/hudson/logging/LogRecorderManager/levels_sr.properties @@ -0,0 +1,9 @@ +# This file is under the MIT License by authors + +Logger\ Configuration=\u041F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 \u0436\u0443\u0440\u043D\u0430\u043B\u043E\u0432\u0430\u045A\u0430 +url=https://jenkins.io/redirect/log-levels +Name=\u0418\u043C\u0435 +Level=\u041D\u0438\u0432\u043E +defaultLoggerMsg=\u041F\u0440\u0435\u043F\u0438\u0441\u0438\u0432\u0430\u0447 \u0431\u0435\u0437 \u0438\u043C\u0435\u043D\u0430 \u0458\u0435 \u0441\u0442\u0430\u043D\u0434\u0430\u0440\u0434\u043D\u0438 \u043F\u0440\u0435\u043F\u0438\u0441\u0438\u0432\u0430\u0447. \u0422\u0430\u0458 \u043D\u0438\u0432\u043E \u045B\u0435 \u0432\u0438\u0442\u0438 \u043D\u0430\u0441\u043B\u0435\u0452\u0435\u043D +Adjust\ Levels=\u041F\u043E\u0434\u0435\u0441\u0438 \u043D\u0438\u0432\u043E\u0435 +Submit=\u041F\u043E\u0434\u043D\u0435\u0441\u0438 \ No newline at end of file diff --git a/core/src/main/resources/hudson/logging/LogRecorderManager/levels_zh_TW.properties b/core/src/main/resources/hudson/logging/LogRecorderManager/levels_zh_TW.properties index 1a573b548f4197bae6843e610382a6b48e16abb5..1ac8df73eb3018ab6fa5e81c16244609e9989119 100644 --- a/core/src/main/resources/hudson/logging/LogRecorderManager/levels_zh_TW.properties +++ b/core/src/main/resources/hudson/logging/LogRecorderManager/levels_zh_TW.properties @@ -26,4 +26,4 @@ Logger\ Configuration=\u8a18\u9304\u5668\u8a2d\u5b9a Name=\u540d\u7a31 Submit=\u9001\u51fa defaultLoggerMsg=\u6c92\u6709\u540d\u7a31\u7684\u8a18\u9304\u5668\u5c31\u662f\u9810\u8a2d\u8a18\u9304\u5668\u3002\u5b83\u7684\u7b49\u7d1a\u6703\u88ab\u6240\u6709\u6c92\u6709\u6307\u5b9a\u7b49\u7d1a\u7684\u8a18\u9304\u5668\u7e7c\u627f\u3002 -url=http://wiki.jenkins-ci.org//x/YYI5Ag +url=https://jenkins.io/redirect/log-levels diff --git a/core/src/main/resources/lib/form/apply_cs.properties b/core/src/main/resources/hudson/logging/LogRecorderManager/new_sr.properties similarity index 67% rename from core/src/main/resources/lib/form/apply_cs.properties rename to core/src/main/resources/hudson/logging/LogRecorderManager/new_sr.properties index 71bcb17d35ae20689f5924927237369ae7f03c85..2fbb8bde38001bf90e43c02d70be99315bd965fa 100644 --- a/core/src/main/resources/lib/form/apply_cs.properties +++ b/core/src/main/resources/hudson/logging/LogRecorderManager/new_sr.properties @@ -1,3 +1,3 @@ # This file is under the MIT License by authors -Apply=Pou\u017E\u00EDt +Name=\u0418\u043C\u0435 diff --git a/core/src/main/resources/hudson/logging/LogRecorderManager/sidepanel_pl.properties b/core/src/main/resources/hudson/logging/LogRecorderManager/sidepanel_pl.properties index 7f6219d2cdf953321fd993fc6a59ca9566ac78c2..47ad32fa69ca81e082a4c2d42d553b02abd2c6bd 100644 --- a/core/src/main/resources/hudson/logging/LogRecorderManager/sidepanel_pl.properties +++ b/core/src/main/resources/hudson/logging/LogRecorderManager/sidepanel_pl.properties @@ -1,8 +1,27 @@ -# This file is under the MIT License by authors - +# The MIT License +# +# Copyright (c) 2013-2017, Kohsuke Kawaguchi, Damian Szczepanik +# +# 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. All\ Logs=Wszystkie Logi Back\ to\ Dashboard=Powr\u00F3t do tablicy Log\ Levels=Poziom logowania -Logger\ List=Lista loger\u00F3w +Logger\ List=Lista rejestrator\u00F3w log\u00F3w Manage\ Jenkins=Zarz\u0105dzaj Jenkinsem -New\ Log\ Recorder=Nowe Nagrywanie Log\u00F3w +New\ Log\ Recorder=Dodaj rejestratora log\u00F3w diff --git a/core/src/main/resources/hudson/logging/LogRecorderManager/sidepanel_sr.properties b/core/src/main/resources/hudson/logging/LogRecorderManager/sidepanel_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..332bbec552ce0aaacb3eafcd91c95accfba9a67f --- /dev/null +++ b/core/src/main/resources/hudson/logging/LogRecorderManager/sidepanel_sr.properties @@ -0,0 +1,8 @@ +# This file is under the MIT License by authors + +Back\ to\ Dashboard=\u041D\u0430\u0437\u0430\u0434 \u043D\u0430 \u043A\u043E\u043D\u0442\u0440\u043E\u043B\u043D\u0443 \u043F\u0430\u043D\u0435\u043B\u0443 +Manage\ Jenkins=\u0423\u043F\u0440\u0430\u0432\u0459\u0430\u045A\u0435 Jenkins-\u043E\u043C +Logger\ List=\u041F\u0440\u0435\u043F\u0438\u0441\u0438\u0432\u0430\u0447\u0438 +New\ Log\ Recorder=\u041D\u043E\u0432\u0438 \u043F\u0440\u0435\u043F\u0438\u0441\u0438\u0432\u0430\u0447 +Log\ Levels=\u041D\u0438\u0432\u043E\u0438 \u0436\u0443\u0440\u043D\u0430\u043B\u0430 +All\ Logs=\u0421\u0432\u0438 \u0436\u0443\u0440\u043D\u0430\u043B\u0438 diff --git a/core/src/main/resources/hudson/logging/Messages_de.properties b/core/src/main/resources/hudson/logging/Messages_de.properties index f76b7ce7c4ea11b2a94abd23aed52abb7386a9c3..f62c7472e0d98069f2faaa29390368e3acc798f9 100644 --- a/core/src/main/resources/hudson/logging/Messages_de.properties +++ b/core/src/main/resources/hudson/logging/Messages_de.properties @@ -1,23 +1,23 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Simon Wiest -# -# 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. - +# The MIT License +# +# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Simon Wiest +# +# 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. + LogRecorderManager.init=Initialisiere Log-Rekorder \ No newline at end of file diff --git a/core/src/main/resources/hudson/logging/Messages_pl.properties b/core/src/main/resources/hudson/logging/Messages_pl.properties new file mode 100644 index 0000000000000000000000000000000000000000..d9a98bbf3de54a40a82bfef77e8ca2e531ffe743 --- /dev/null +++ b/core/src/main/resources/hudson/logging/Messages_pl.properties @@ -0,0 +1,23 @@ +# The MIT License +# +# Copyright (c) 2017, Damian Szczepanik +# +# 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. +LogRecorderManager.DisplayName=Rejestrator log\u00F3w +LogRecorderManager.init=Inicjalizowanie rejestrator\u00F3w log\u00F3w diff --git a/core/src/main/resources/hudson/logging/Messages_sr.properties b/core/src/main/resources/hudson/logging/Messages_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..9cc510fd61a3da051f08748c68ec993cd7d09b5e --- /dev/null +++ b/core/src/main/resources/hudson/logging/Messages_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +LogRecorderManager.init=\u0418\u043D\u0438\u0446\u0438\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u0458\u0430 \u043F\u0440\u0435\u043F\u0438\u0441\u0438\u0432\u0430\u0447\u0430 +LogRecorderManager.DisplayName=\u0436\u0443\u0440\u043D\u0430\u043B \ No newline at end of file diff --git a/core/src/main/resources/hudson/markup/EscapedMarkupFormatter/config_sr.properties b/core/src/main/resources/hudson/markup/EscapedMarkupFormatter/config_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..b8caf9dd6b919119d9b9a200771920b2f8b66971 --- /dev/null +++ b/core/src/main/resources/hudson/markup/EscapedMarkupFormatter/config_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +blurb=\u0421\u043C\u0430\u0442\u0440\u0430 \u0441\u0432\u0435 \u043A\u0430\u043E \u043E\u0431\u0438\u0447\u0430\u043D \u0442\u0435\u043A\u0441\u0442. HTML \u0437\u043D\u0430\u0446\u0438 < \u0438 & \u0441\u0443 \u043F\u0440\u0435\u0442\u0432\u043E\u0440\u0435\u043D\u0438 \u0443 \u043E\u0434\u0433\u043E\u0432\u0430\u0440\u0430\u0458\u0443\u045B\u0435 \u0435\u043D\u0442\u0438\u0442\u0435\u0442\u0435. diff --git a/core/src/main/resources/hudson/markup/Messages_sr.properties b/core/src/main/resources/hudson/markup/Messages_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..5f8d6dcd1f7caccecd17093c567f1ca2450cd2fd --- /dev/null +++ b/core/src/main/resources/hudson/markup/Messages_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +EscapedMarkupFormatter.DisplayName=\u041E\u0431\u0438\u0447\u0430\u043D \u0442\u0435\u043A\u0441\u0442 \ No newline at end of file diff --git a/core/src/main/resources/hudson/model/AbstractBuild/changes_sr.properties b/core/src/main/resources/hudson/model/AbstractBuild/changes_sr.properties index 5d4ef6a979b40b25f6cb7345c1e9d529d43e2fad..0a8f87fa885e1dc8f805de2f905a5fe03e51ea45 100644 --- a/core/src/main/resources/hudson/model/AbstractBuild/changes_sr.properties +++ b/core/src/main/resources/hudson/model/AbstractBuild/changes_sr.properties @@ -1,3 +1,6 @@ # This file is under the MIT License by authors Changes=\u041F\u0440\u043E\u043C\u0435\u043D\u0435 +Not\ yet\ determined=\u0408\u043E\u0448 \u043D\u0438\u0458\u0435 \u043E\u0434\u0440\u0435\u0452\u0435\u043D\u043E +Failed\ to\ determine=\u041D\u0438\u0458\u0435 \u043C\u043E\u0433\u0443\u045B\u0435 \u043E\u0434\u0440\u0435\u0434\u0438\u0442\u0438 +log=\u0436\u0443\u0440\u043D\u0430\u043B diff --git a/core/src/main/resources/hudson/model/AbstractBuild/index_eu.properties b/core/src/main/resources/hudson/model/AbstractBuild/index_eu.properties index b9331070f8783b1104c8f1de0e33148f42869868..005f64ba2957e5f99503b47c0e003a7383d77492 100644 --- a/core/src/main/resources/hudson/model/AbstractBuild/index_eu.properties +++ b/core/src/main/resources/hudson/model/AbstractBuild/index_eu.properties @@ -1,6 +1,6 @@ # This file is under the MIT License by authors -Build=fghg -Build\ Artifacts=gfhfgh -Took=fghg -startedAgo=dhgg +Build=Eraiki +Build\ Artifacts=Laguntzaileak eraiki +Took=Hartu +startedAgo=orain dela zenbat hasia diff --git a/core/src/main/resources/hudson/model/AbstractBuild/index_pl.properties b/core/src/main/resources/hudson/model/AbstractBuild/index_pl.properties index c2e7fc25608eceebe99a53ccefcde6600bea6b21..23661662c63df3d4228366075d91a0de33249078 100644 --- a/core/src/main/resources/hudson/model/AbstractBuild/index_pl.properties +++ b/core/src/main/resources/hudson/model/AbstractBuild/index_pl.properties @@ -1,6 +1,6 @@ # The MIT License # -# Copyright (c) 2004-2010, Sun Microsystems, Inc. +# Copyright (c) 2004-2016, Sun Microsystems., Inc, Damian Szczepanik # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -21,7 +21,7 @@ # THE SOFTWARE. Build=Zadanie -Build\ Artifacts=Artefakty budowania +Build\ Artifacts=Artefakty zadania Changes\ in\ dependency=Zmiany w zale\u017Cno\u015Bciach Downstream\ Builds=Zadania podrz\u0119dne Not\ yet\ determined=Jeszcze nie ustalono diff --git a/core/src/main/resources/hudson/model/AbstractBuild/index_sr.properties b/core/src/main/resources/hudson/model/AbstractBuild/index_sr.properties index 2a36f45d5710257f12faba03e618f9ee9a9bc13d..8015f80d9cec368ac71047a92437b94bcb08cd57 100644 --- a/core/src/main/resources/hudson/model/AbstractBuild/index_sr.properties +++ b/core/src/main/resources/hudson/model/AbstractBuild/index_sr.properties @@ -1,7 +1,16 @@ # This file is under the MIT License by authors -Build=Projekat +Build=\u0418\u0437\u0433\u0440\u0430\u0434\u045A\u0430 Build\ Artifacts=Artifakti projekta -Took=Uzmi -on=na -startedAgo=Zapoceto pre {0} +Took=\u0422\u0440\u0430\u0458\u0430\u043B\u043E: +on=\u043D\u0430 +startedAgo=\u0417\u0430\u043F\u043E\u0447\u0435\u0442\u043E \u043F\u0440\u0435 {0} +beingExecuted=\u0418\u0437\u0432\u0440\u0448\u0430\u0432\u0430 \u0441\u0435 {0} +Changes\ in\ dependency=\u041F\u0440\u043E\u043C\u0435\u043D\u0435 \u0443 \u0437\u0430\u0432\u0438\u0441\u043D\u043E\u043C \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u0443 +detail=\u0434\u0435\u0442\u0430\u0459\u043D\u0435 \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0458\u0435 +Not\ yet\ determined=\u041D\u0438\u0458\u0435 \u0458\u043E\u0448 \u043E\u0434\u0440\u0435\u0452\u0435\u043D\u043E +Failed\ to\ determine=\u041D\u0438\u0458\u0435 \u043C\u043E\u0433\u043B\u043E \u043E\u0434\u0440\u0435\u0434\u0438\u0442\u0438 +log=\u0436\u0443\u0440\u043D\u0430\u043B +Upstream\ Builds=Upstream \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 +Downstream\ Builds=Downstream \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 +none=\u043D\u0438\u0458\u0435\u0434\u043D\u043E diff --git a/core/src/main/resources/hudson/model/AbstractBuild/sidepanel_sr.properties b/core/src/main/resources/hudson/model/AbstractBuild/sidepanel_sr.properties index effcb55a0a699b1231a9641eb357055fdac95197..639db57af036d9a8df13c2b554dcc1e036e26c45 100644 --- a/core/src/main/resources/hudson/model/AbstractBuild/sidepanel_sr.properties +++ b/core/src/main/resources/hudson/model/AbstractBuild/sidepanel_sr.properties @@ -1,4 +1,4 @@ # This file is under the MIT License by authors -Next\ Build=Naredna Gradnja -Previous\ Build=Prethodno sklapoanje +Previous\ Build=\u041F\u0440\u0435\u0442\u0445\u043E\u0434\u043D\u043E \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 +Next\ Build=\u0421\u043B\u0435\u0434\u0435\u045B\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 diff --git a/core/src/main/resources/hudson/model/AbstractBuild/tasks_eu.properties b/core/src/main/resources/hudson/model/AbstractBuild/tasks_eu.properties index 9789ce28d1c1a9e372d5f182fbbb867bef8a98a6..ddd97547b6754343aeea1092d22a927eba9cb90c 100644 --- a/core/src/main/resources/hudson/model/AbstractBuild/tasks_eu.properties +++ b/core/src/main/resources/hudson/model/AbstractBuild/tasks_eu.properties @@ -1,8 +1,8 @@ # This file is under the MIT License by authors -Back\ to\ Project=drthdf -Changes=hgdg -Console\ Output=ghdgfh -Edit\ Build\ Information=Kompilazioaren argibidea edidatu -Status=hgfdhg -View\ Build\ Information=dhgg +Back\ to\ Project=Proiektura itzuli +Changes=Aldaketak +Console\ Output=Kontsolaren irteera +Edit\ Build\ Information=Konpilazioaren argibideak edidatu +Status=Egoera +View\ Build\ Information=Konpilazioaren egoera ikusi diff --git a/core/src/main/resources/hudson/model/AbstractBuild/tasks_pl.properties b/core/src/main/resources/hudson/model/AbstractBuild/tasks_pl.properties index 5272dc29dff522cd55da44485e97997e2a0ef8cd..ef9d00dfba9d17e85a32a9be004c833e24b2d1bf 100644 --- a/core/src/main/resources/hudson/model/AbstractBuild/tasks_pl.properties +++ b/core/src/main/resources/hudson/model/AbstractBuild/tasks_pl.properties @@ -1,6 +1,6 @@ # The MIT License # -# Copyright (c) 2004-2010, Sun Microsystems, Inc. +# Copyright (c) 2004-2016, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributors # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -22,8 +22,5 @@ Back\ to\ Project=Powr\u00F3t do projektu Changes=Rejestr zmian -Console\ Output=Logi konsoli -View\ as\ plain\ text=Otw\u00F3rz jako niesformatowany tekst Edit\ Build\ Information=Edytuj informacje o zadaniu -View\ Build\ Information=Poka\u017C informacje o zadaniu -raw=surowe wyj\u015Bcie +Status=Status diff --git a/core/src/main/resources/hudson/model/AbstractBuild/tasks_sr.properties b/core/src/main/resources/hudson/model/AbstractBuild/tasks_sr.properties index 2505d1654cbe7eda1007153b52ad54d738497042..f980312c413e5a725b38ccfcfc14ca4a7b1658ce 100644 --- a/core/src/main/resources/hudson/model/AbstractBuild/tasks_sr.properties +++ b/core/src/main/resources/hudson/model/AbstractBuild/tasks_sr.properties @@ -1,9 +1,10 @@ # This file is under the MIT License by authors -Back\ to\ Project=Nazad na projekt -Changes=Promjene -Console\ Output=Ispis konzole -Edit\ Build\ Information=Izmeni informacije o sklapoanju -View\ Build\ Information=Pogledaj informacije u buildu -View\ as\ plain\ text=Pregledati kao cisti text -raw=sirov +Changes=\u041F\u0440\u043E\u043C\u0435\u043D\u0435 +Console\ Output=\u0418\u0441\u0445\u043E\u0434 \u0438\u0437 \u043A\u043E\u043D\u0437\u043E\u043B\u0435 +Edit\ Build\ Information=\u0423\u0440\u0435\u0434\u0438 \u043F\u043E\u0441\u0442\u0430\u0432\u043A\u0435 \u043E \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0438 +View\ Build\ Information=\u041F\u043E\u0441\u0442\u0430\u0432\u043A\u0435 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 +View\ as\ plain\ text=\u041F\u0440\u0435\u0433\u043B\u0435\u0434 \u043E\u0431\u0438\u0447\u043D\u043E\u0433 \u0442\u0435\u043A\u0441\u0442\u0430 +raw=\u043D\u0435\u0444\u043E\u0440\u043C\u0430\u0442\u0438\u0437\u043E\u0432\u0430\u043D \u043F\u0440\u0435\u0433\u043B\u0435\u0434 +Status=\u0421\u0442\u0430\u045A\u0435 +Back\ to\ Project=\u041D\u0430\u0437\u0430\u0434 \u043A\u0430 \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u0443 diff --git a/core/src/main/resources/hudson/model/AbstractItem/delete_ru.properties b/core/src/main/resources/hudson/model/AbstractItem/delete_ru.properties index b7c2d51be86045ff2595eddda3b4afc1e8d2191b..66114af436e70142a2b651771b7358dafce28123 100644 --- a/core/src/main/resources/hudson/model/AbstractItem/delete_ru.properties +++ b/core/src/main/resources/hudson/model/AbstractItem/delete_ru.properties @@ -1,17 +1,17 @@ # The MIT License -# +# # Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Mike Salnikov -# +# # 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 @@ -20,6 +20,5 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Are\ you\ sure\ about\ deleting\ the\ job?=\u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u0432\u0435\u0440\u0435\u043d\u044b \u0432 \u0442\u043e\u043c \u0447\u0442\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443? Yes=\u0414\u0430 -blurb=\u0412\u044B \u0443\u0432\u0435\u0440\u0435\u043D\u044B, \u0447\u0442\u043E \u0445\u043E\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043B\u0438\u0442\u044C {0} ''''''''{1}''''''''? +blurb=\u0412\u044b \u0443\u0432\u0435\u0440\u0435\u043d\u044b, \u0447\u0442\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c {0} ''''''''{1}''''''''? diff --git a/core/src/main/resources/hudson/model/AbstractItem/delete_sr.properties b/core/src/main/resources/hudson/model/AbstractItem/delete_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..4777801d8ff03b1d3c231fc3e038d90b10c66a27 --- /dev/null +++ b/core/src/main/resources/hudson/model/AbstractItem/delete_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +blurb=\u0414\u0430 \u043B\u0438 \u0441\u0442\u0435 \u0441\u0438\u0433\u0443\u0440\u043D\u0438 \u0434\u0430 \u0436\u0435\u043B\u0438\u0442\u0435 \u0438\u0437\u0431\u0440\u0438\u0441\u0430\u0442\u0438 {0} "{1}"? +Yes=\u0414\u0430 +Are\ you\ sure\ about\ deleting\ the\ job?=\u0414\u0430 \u043B\u0438 \u0441\u0442\u0435 \u0441\u0438\u0433\u0443\u0440\u043D\u0438 \u0434\u0430 \u0436\u0435\u043B\u0438\u0442\u0435 \u0434\u0430 \u0443\u043A\u043B\u043E\u043D\u0438\u0442\u0435 \u0437\u0430\u0434\u0430\u0442\u0430\u043A? diff --git a/core/src/main/resources/hudson/model/AbstractItem/noWorkspace_ru.properties b/core/src/main/resources/hudson/model/AbstractItem/noWorkspace_ru.properties index ca520bc3dfdd51a0256f60c8d2c1822c9b321fcb..a76a9c1b5735d7492e2167682729925bb2e1d68b 100644 --- a/core/src/main/resources/hudson/model/AbstractItem/noWorkspace_ru.properties +++ b/core/src/main/resources/hudson/model/AbstractItem/noWorkspace_ru.properties @@ -1,17 +1,17 @@ # The MIT License -# +# # Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Mike Salnikov -# +# # 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 @@ -21,11 +21,15 @@ # THE SOFTWARE. Error\:\ no\ workspace=\u041e\u0448\u0438\u0431\u043a\u0430: \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430 \u0441\u0431\u043e\u0440\u043e\u0447\u043d\u0430\u044f \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f -A\ project\ won't\ have\ any\ workspace\ until\ at\ least\ one\ build\ is\ performed.=\ +A\ project\ won''t\ have\ any\ workspace\ until\ at\ least\ one\ build\ is\ performed.=\ \u041f\u0440\u043e\u0435\u043a\u0442 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u0441\u0431\u043e\u0440\u043e\u0447\u043d\u0443\u044e \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e \u043f\u043e\u043a\u0430 \u0445\u043e\u0442\u044f \u0431\u044b \u043e\u0434\u043d\u0430 \u0441\u0431\u043e\u0440\u043a\u0430 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u0430. -There's\ no\ workspace\ for\ this\ project.\ Possible\ reasons\ are\:=\ +There''s\ no\ workspace\ for\ this\ project.\ Possible\ reasons\ are\:=\ \u0421\u0431\u043e\u0440\u043e\u0447\u043d\u0430\u044f \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f \u0434\u043b\u044f \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u043f\u0440\u0438\u0447\u0438\u043d\u044b: The\ project\ was\ renamed\ recently\ and\ no\ build\ was\ done\ under\ the\ new\ name.=\ \u041f\u0440\u043e\u0435\u043a\u0442 \u0431\u044b\u043b \u043d\u0435\u0434\u0430\u0432\u043d\u043e \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d \u0438 \u0441\u0431\u043e\u0440\u043e\u043a \u043f\u043e\u0434 \u043d\u043e\u0432\u044b\u043c \u0438\u043c\u0435\u043d\u0435\u043c \u0435\u0449\u0435 \u043d\u0435 \u0431\u044b\u043b\u043e. li3=\u0421\u0431\u043e\u0440\u043e\u0447\u043d\u0430\u044f \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f ({0}) \u0431\u044b\u043b\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u0430 \u0438\u0437 \u0440\u0430\u0431\u043e\u0447\u0435\u0433\u043e \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0430 Jenkins. -text=\u0417\u0430\u043F\u0443\u0441\u0442\u0438\u0442\u0435 \u0441\u0431\u043E\u0440\u043A\u0443, \u0447\u0442\u043E\u0431\u044B \u043F\u043E\u0437\u0432\u043E\u043B\u0438\u0442\u044C Jenkins \u0441\u043E\u0437\u0434\u0430\u0442\u044C \u0441\u0431\u043E\u0440\u043E\u0447\u043D\u0443\u044E \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u044E. +text=\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435 \u0441\u0431\u043e\u0440\u043a\u0443, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442\u044c Jenkins \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0431\u043e\u0440\u043e\u0447\u043d\u0443\u044e \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e. +The\ agent\ this\ project\ has\ run\ on\ for\ the\ last\ time\ was\ removed.=\ + \u0410\u0433\u0435\u043d\u0442, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0435\u043a\u0442 \u0431\u044b\u043b \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0440\u0430\u0437 \u0437\u0430\u043f\u0443\u0449\u0435\u043d, \u0443\u0434\u0430\u043b\u0451\u043d. +The\ workspace\ was\ wiped\ out\ and\ no\ build\ has\ been\ done\ since\ then.=\ + \u0421\u0431\u043e\u0440\u043e\u0447\u043d\u0430\u044f \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f \u0431\u044b\u043b\u0430 \u043e\u0447\u0438\u0449\u0435\u043d\u0430, \u0438 \u0441\u0431\u043e\u0440\u043e\u043a \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u0431\u044b\u043b\u043e. \ No newline at end of file diff --git a/core/src/main/resources/hudson/model/AbstractItem/noWorkspace_sr.properties b/core/src/main/resources/hudson/model/AbstractItem/noWorkspace_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..7c8d5110c9a3b5178372ae471c316b880db75a70 --- /dev/null +++ b/core/src/main/resources/hudson/model/AbstractItem/noWorkspace_sr.properties @@ -0,0 +1,14 @@ +# This file is under the MIT License by authors + +Error\:\ no\ workspace=\u0413\u0440\u0435\u0448\u043A\u0430: \u043D\u0435\u043C\u0430 \u0440\u0430\u0434\u043D\u0438 \u043F\u0440\u043E\u0441\u0442\u043E\u0440 +A\ project\ won't\ have\ any\ workspace\ until\ at\ least\ one\ build\ is\ performed.=\u041F\u0440\u043E\u0458\u0435\u043A\u0430\u0442 \u043D\u0435\u045B\u0435 \u0438\u043C\u0430\u0442\u0438 \u0440\u0430\u0434\u043D\u0438 \u043F\u0440\u043E\u0441\u0442\u043E\u0440 \u0434\u043E\u043A \u0441\u0435 \u043D\u0435 \u0438\u0437\u0432\u0440\u0448\u0438 \u0458\u0435\u0434\u043D\u043E \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435. +There's\ no\ workspace\ for\ this\ project.\ Possible\ reasons\ are\:=\u041D\u0435\u043C\u0430 \u0440\u0430\u0434\u043D\u0438 \u043F\u0440\u043E\u0441\u0442\u043E\u0440 \u0437\u0430 \u043E\u0432\u0430\u0458 \u043F\u0440\u043E\u0458\u0435\u043A\u0430\u0442. \u041C\u043E\u0433\u0443\u045B\u0435 \u0458\u0435: +The\ project\ was\ renamed\ recently\ and\ no\ build\ was\ done\ under\ the\ new\ name.=\u041F\u0440\u043E\u0458\u0435\u043A\u0430\u0442 \u0458\u0435 \u0441\u043A\u043E\u0440\u043E \u043F\u0440\u0435\u0438\u043C\u0435\u043D\u043E\u0432\u0430\u043D, \u0438 \u0458\u043E\u0448 \u043D\u0435\u043C\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 \u043F\u043E \u043D\u043E\u0432\u0438\u043C \u0438\u043C\u0435\u043D\u043E\u043C. +The\ agent\ this\ project\ has\ run\ on\ for\ the\ last\ time\ was\ removed.=\u0410\u0433\u0435\u043D\u0442 \u043E\u0432\u043E\u043C \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u0443 \u043D\u0430 \u043A\u043E\u043C \u0458\u0435 \u0437\u0430\u0434\u045A\u0435 \u0438\u0437\u0432\u0440\u0448\u0435\u043D\u043E \u0458\u0435 \u0438\u0437\u0431\u0440\u0438\u0441\u0430\u043D. +li3=\u0420\u0430\u0434\u043D\u0438 \u043F\u0440\u043E\u0441\u0442\u043E\u0440 "{0}" \u0458\u0435 \u0438\u0437\u0431\u0430\u0447\u0435\u043D \u0438\u0437 Jenkins. +The\ workspace\ was\ wiped\ out\ and\ no\ build\ has\ been\ done\ since\ then.=\u041D\u0438\u0458\u0435 \u0431\u0438\u043B\u043E \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 \u043E\u0442\u043A\u0430\u0434 \u0458\u0435 \u0440\u0430\u0434\u043D\u0438 \u043F\u0440\u043E\u0441\u0442\u043E\u0440 \u0438\u0437\u0431\u0440\u0438\u0441\u0430\u043D. +text=\u041F\u043E\u043A\u0440\u0435\u043D\u0438\u0442\u0435 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0443 \u0438 Jenkins \u045B\u0435 \u0441\u0442\u0432\u043E\u0440\u0438\u0442\u0438 \u0440\u0430\u0434\u043D\u0438 \u043F\u0440\u043E\u0441\u0442\u043E\u0440. +Error=\ no workspace=\u0413\u0440\u0435\u0448\u043A\u0430: \u043D\u0435\u043C\u0430 \u0440\u0430\u0434\u043D\u043E\u0433 \u043F\u0440\u043E\u0441\u0442\u043E\u0440\u0430 +There''s\ no\ workspace\ for\ this\ project.\ Possible\ reasons\ are\:=\u041D\u0435\u043C\u0430 \u0440\u0430\u0434\u043D\u043E\u0433 \u043F\u0440\u043E\u0441\u0442\u043E\u0440\u0430 \u0437\u0430 \u043E\u0432\u0430\u0458 \u043F\u0440\u043E\u0458\u0435\u043A\u0430\u0442. \u041C\u043E\u0433\u0443\u045B\u0435 \u0458\u0435: +A\ project\ won''t\ have\ any\ workspace\ until\ at\ least\ one\ build\ is\ performed.=\u041F\u0440\u043E\u0458\u043A\u0442\u0438 \u043D\u0435\u045B\u0435 \u0438\u043C\u0430\u0442\u0438 \u0440\u0430\u0434\u043D\u0438\u0445 \u043F\u0440\u043E\u0441\u0442\u043E\u0440\u0430 \u0434\u043E\u043A \u0441\u0435 \u043D\u0435 \u0438\u0437\u0432\u0440\u0448\u0438 \u0458\u0435\u0434\u043D\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430. +The\ slave\ this\ project\ has\ run\ on\ for\ the\ last\ time\ was\ removed.=\u041F\u043E\u043C\u043E\u045B\u043D\u0438\u043A \u043E\u0432\u043E\u043C \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u0443 \u043D\u0430 \u043A\u043E\u043C \u0458\u0435 \u0437\u0430\u0434\u045A\u0435 \u0438\u0437\u0432\u0440\u0448\u0435\u043D\u043E \u0458\u0435 \u0438\u0437\u0431\u0440\u0438\u0441\u0430\u043D. diff --git a/core/src/main/resources/hudson/model/AbstractModelObject/descriptionForm_sr.properties b/core/src/main/resources/hudson/model/AbstractModelObject/descriptionForm_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..c8e10fc8ec69e893059e2f2cc4ec087c5fc78321 --- /dev/null +++ b/core/src/main/resources/hudson/model/AbstractModelObject/descriptionForm_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Submit=\u041F\u043E\u0434\u043D\u0435\u0441\u0438 diff --git a/core/src/main/resources/hudson/model/AbstractModelObject/editDescription.jelly b/core/src/main/resources/hudson/model/AbstractModelObject/editDescription.jelly index 2e211b6221287f49c065d8e7d40d580dc588c55c..91940efa8d4091a42d10887dea83310bc360ccbd 100644 --- a/core/src/main/resources/hudson/model/AbstractModelObject/editDescription.jelly +++ b/core/src/main/resources/hudson/model/AbstractModelObject/editDescription.jelly @@ -33,7 +33,9 @@ THE SOFTWARE.
        - +
        diff --git a/core/src/main/resources/hudson/model/AbstractModelObject/editDescription_sr.properties b/core/src/main/resources/hudson/model/AbstractModelObject/editDescription_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..c8e10fc8ec69e893059e2f2cc4ec087c5fc78321 --- /dev/null +++ b/core/src/main/resources/hudson/model/AbstractModelObject/editDescription_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Submit=\u041F\u043E\u0434\u043D\u0435\u0441\u0438 diff --git a/core/src/main/resources/hudson/model/AbstractModelObject/error_sr.properties b/core/src/main/resources/hudson/model/AbstractModelObject/error_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..29271bc5b99d5bb966a13a57ea99850aaea7ede9 --- /dev/null +++ b/core/src/main/resources/hudson/model/AbstractModelObject/error_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Error=\u0413\u0440\u0435\u0448\u043A\u0430 +Detail...=\u0414\u0435\u0442\u0430\u0459\u0438... diff --git a/core/src/main/resources/hudson/model/AbstractProject/BecauseOfUpstreamBuildInProgress/summary_sr.properties b/core/src/main/resources/hudson/model/AbstractProject/BecauseOfUpstreamBuildInProgress/summary_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..99a47ce6730324724c44b97a4ad128969f91d078 --- /dev/null +++ b/core/src/main/resources/hudson/model/AbstractProject/BecauseOfUpstreamBuildInProgress/summary_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +description=\u041F\u0440\u043E\u0458\u0435\u043A\u0430\u0442 "{0}", \u043E\u0434 \u043A\u043E\u0433\u0430 \u043E\u0432\u0430\u0458 \u0437\u0430\u0432\u0438\u0441\u0438, \u0441\u0435 \u0432\u0435\u045B \u0433\u0440\u0430\u0434\u0438. \ No newline at end of file diff --git a/core/src/main/resources/hudson/model/AbstractProject/changes_sr.properties b/core/src/main/resources/hudson/model/AbstractProject/changes_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..d12d7fda35cf8ae55f31caf453e39e6cb234c490 --- /dev/null +++ b/core/src/main/resources/hudson/model/AbstractProject/changes_sr.properties @@ -0,0 +1,7 @@ +# This file is under the MIT License by authors + +changes.title={0} \u043F\u0440\u043E\u043C\u0435\u043D\u0435 +Changes=\u041F\u0440\u043E\u043C\u0435\u043D\u0435 +range.label=\ \u043E\u0434 #{0} \u0434\u043E #{1} +from.label=\ \u043E\u0434 #{0} +to.label=\ \u0434\u043E #{0} diff --git a/core/src/main/resources/hudson/model/AbstractProject/configure-common_pl.properties b/core/src/main/resources/hudson/model/AbstractProject/configure-common_pl.properties index cda4b2957f2611a64936e7c186ec34b28ee2ee52..7f251d1bedfe2278528a5ade5167454af7505c67 100644 --- a/core/src/main/resources/hudson/model/AbstractProject/configure-common_pl.properties +++ b/core/src/main/resources/hudson/model/AbstractProject/configure-common_pl.properties @@ -1,7 +1,24 @@ -# This file is under the MIT License by authors - -Advanced\ Project\ Options=Zaawansowane opcje projektu -Display\ Name=Nazwa wy\u015bwietlana -JDK\ to\ be\ used\ for\ this\ project=JDK u\u017cyte do budowy projektu -default.value=(Domy\u015blny) -Keep\ the\ build\ logs\ of\ dependencies=Trzymaj logi projekt\u00f3w zale\u017cnych +# The MIT License +# +# Copyright (c) 2004-2016, Sun Microsystems, Damian Szczepanik +# +# 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. +Display\ Name=Nazwa wy\u015Bwietlana +JDK\ to\ be\ used\ for\ this\ project=JDK u\u017Cyte do budowy projektu +Keep\ the\ build\ logs\ of\ dependencies=Trzymaj logi konsoli projekt\u00F3w zale\u017Cnych diff --git a/core/src/main/resources/hudson/model/AbstractProject/configure-common_sr.properties b/core/src/main/resources/hudson/model/AbstractProject/configure-common_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..6f82603f0a88896fe290621beaa731ae7e8446fc --- /dev/null +++ b/core/src/main/resources/hudson/model/AbstractProject/configure-common_sr.properties @@ -0,0 +1,13 @@ +# This file is under the MIT License by authors + +JDK\ to\ be\ used\ for\ this\ project=JDK \u043A\u043E\u0458\u0438 \u045B\u0435 \u0441\u0435 \u043A\u043E\u0440\u0438\u0441\u0442\u0438\u0442\u0438 \u0437\u0430 \u043E\u0432\u0430\u0458 \u043F\u0440\u043E\u0458\u0435\u043A\u0430\u0442 +Display\ Name=\u0418\u043C\u0435 +Keep\ the\ build\ logs\ of\ dependencies=\u0417\u0430\u0434\u0440\u0436\u0438 \u0436\u0443\u0440\u043D\u0430\u043B \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 \u043E\u0434 \u0437\u0430\u0432\u0438\u0441\u043D\u0438\u0445 +Advanced\ Project\ Options=\u041D\u0430\u043F\u0440\u0435\u0434\u043D\u0430 \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 +default.value=(\u0441\u0442\u0430\u043D\u0434\u0430\u0440\u0434) +Restrict\ where\ this\ project\ can\ be\ run=O\u0433\u0440\u0430\u043D\u0438\u0447\u0438 \u0433\u0434\u0435 \u0458\u0435 \u043E\u0432\u0430\u0458 \u043F\u0440\u043E\u0458\u0435\u043A\u0430\u0442 \u043C\u043E\u0436\u0435 \u0431\u0438\u0442\u0438 \u0438\u0437\u0432\u0440\u0448\u0435\u043D +Tie\ this\ project\ to\ a\ node=\u041F\u043E\u0432\u0435\u0436\u0438 \u043F\u0440\u043E\u0458\u0435\u043A\u0430\u0442 \u0441\u0430 \u043C\u0430\u0448\u0438\u043D\u043E\u043C +Node=\u041C\u0430\u0448\u0438\u043D\u0430 +Advanced\ Project\ Options\ configure-common=\u041D\u0430\u043F\u0440\u0435\u0434\u043D\u0430 \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 +title.concurrentbuilds=\u041E\u0431\u0430\u0432\u0459\u0430 \u043F\u0430\u0440\u0430\u043B\u0435\u043B\u043D\u043E \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 \u0430\u043A\u043E \u0431\u0443\u0434\u0435 \u0431\u0438\u043B\u043E \u043F\u043E\u0442\u0440\u0435\u0431\u043D\u043E +Label\ Expression=\u041D\u0430\u043F\u0440\u0435\u0434\u043D\u0430 \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 diff --git a/core/src/main/resources/hudson/model/AbstractProject/help-concurrentBuild.html b/core/src/main/resources/hudson/model/AbstractProject/help-concurrentBuild.html index 7d2116b37a0a7d7b5b2f88d77caafede88ae2ea9..c97987cd23991e1594616c80d75a05eabd5a74b7 100644 --- a/core/src/main/resources/hudson/model/AbstractProject/help-concurrentBuild.html +++ b/core/src/main/resources/hudson/model/AbstractProject/help-concurrentBuild.html @@ -18,7 +18,7 @@ suites, as it allows each build to contain a smaller number of changes, while the total turnaround time decreases as subsequent builds do not need to wait for previous test runs to complete.
        - This feature is also useful for parameterised projects, whose individual build + This feature is also useful for parameterized projects, whose individual build executions — depending on the parameters used — can be completely independent from one another.

        @@ -30,7 +30,7 @@ Jenkins. For example, "hudson.slaves.WorkspaceList=-" would change the separator to a hyphen.
        For more information on setting system properties, see the wiki page.

        However, if you enable the Use custom workspace option, all builds will diff --git a/core/src/main/resources/hudson/model/AbstractProject/help-concurrentBuild_bg.html b/core/src/main/resources/hudson/model/AbstractProject/help-concurrentBuild_bg.html index 191bee10f3c8a3df1118b492d171af1639359703..1960aa25cb104e8a1c42091a46fdadfe05c03829 100644 --- a/core/src/main/resources/hudson/model/AbstractProject/help-concurrentBuild_bg.html +++ b/core/src/main/resources/hudson/model/AbstractProject/help-concurrentBuild_bg.html @@ -33,7 +33,7 @@ Jenkins. For example, "hudson.slaves.WorkspaceList=-" would change the separator to a hyphen.
        For more information on setting system properties, see the wiki page.

        However, if you enable the Use custom workspace option, all builds will diff --git a/core/src/main/resources/hudson/model/AbstractProject/main_sr.properties b/core/src/main/resources/hudson/model/AbstractProject/main_sr.properties index 543c3b75fdd485f925fde4a5dc0f249a1d8daf14..9ae2b613dc4677f9751daaa0c49bb9ef7da65400 100644 --- a/core/src/main/resources/hudson/model/AbstractProject/main_sr.properties +++ b/core/src/main/resources/hudson/model/AbstractProject/main_sr.properties @@ -1,4 +1,6 @@ # This file is under the MIT License by authors -Last\ Successful\ Artifacts=Poslednji uspe\u0161ni artifakt -Recent\ Changes=Nedavne promene +Recent\ Changes=\u041D\u0435\u0434\u0430\u0432\u043D\u0435 \u043F\u0440\u043E\u043C\u0435\u043D\u0435 +Workspace=\u0420\u0430\u0434\u043D\u0438 \u043F\u0440\u043E\u0441\u0442\u043E\u0440 +Last\ Successful\ Artifacts=\u041F\u043E\u0441\u043B\u0435\u0434\u045A\u0435 \u0443\u0441\u043F\u0435\u0448\u043D\u0438 Artifacts +Latest\ Console\ output=\u041F\u043E\u0441\u043B\u0435\u0434\u045A\u0438 \u0438\u0441\u0445\u043E\u0434 \u0438\u0437 \u043A\u043E\u043D\u0437\u043E\u043B\u0435 diff --git a/core/src/main/resources/hudson/model/AbstractProject/makeDisabled_sr.properties b/core/src/main/resources/hudson/model/AbstractProject/makeDisabled_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..ccf1bf9b675dcde44a00921ecd658a055194a05a --- /dev/null +++ b/core/src/main/resources/hudson/model/AbstractProject/makeDisabled_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +This\ project\ is\ currently\ disabled=\u041E\u0432\u0430\u0458 \u043F\u0440\u043E\u0458\u0435\u043A\u0430\u0442 \u0458\u0435 \u0442\u0440\u0435\u043D\u0443\u0442\u043D\u043E \u043E\u043D\u0435\u043C\u043E\u0433\u0443\u045B\u0435\u043D +Enable=\u041E\u043C\u043E\u0433\u0443\u045B\u0438 +Disable\ Project=\u041E\u043D\u0435\u043C\u043E\u0433\u0443\u045B\u0438 \u043F\u0440\u043E\u0458\u0435\u043A\u0430\u0442 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 201bb0fedda97ce30ddabc515295aeb22b17eb73..9e14bfa982b6236f08adf8e7becf9d888f9ace29 100644 --- a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_pl.properties +++ b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_pl.properties @@ -1,6 +1,6 @@ # The MIT License # -# Copyright (c) 2004-2010, Sun Microsystems, Inc. +# Copyright (c) 2004-2016, Sun Microsystems, Damian Szczepanik # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -22,6 +22,8 @@ Back\ to\ Dashboard=Powr\u00F3t do tablicy Changes=Rejestr zmian -Wipe\ Out\ Workspace=Wyczy\u015b\u0107 przestrze\u0144 robocz\u0105 +Wipe\ Out\ Workspace=Wyczy\u015B\u0107 przestrze\u0144 robocz\u0105 Workspace=Przestrze\u0144 robocza -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? +Status=Status +Up=Powr\u00F3t 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 2eebf4c9818f3b450ef086da52ccc91ee315a18e..ef47d9183d6395e97bcbad6d05b29db360c3ca9d 100644 --- a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_sr.properties +++ b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_sr.properties @@ -1,6 +1,10 @@ # This file is under the MIT License by authors -Back\ to\ Dashboard=Nazad na Tablu -Changes=Izmene -Wipe\ Out\ Workspace=Obrisi Workspace -wipe.out.confirm=Da li si siguran da \u017eeli\u0161 da poni\u0161ti\u0161 radni prostor +Back\ to\ Dashboard=\u041D\u0430\u0437\u0430\u0434 \u043D\u0430 \u043A\u043E\u043D\u0442\u0440\u043E\u043B\u043D\u0443 \u043F\u0430\u043D\u0435\u043B\u0443 +Changes=\u041F\u0440\u043E\u043C\u0435\u043D\u0435 +Wipe\ Out\ Workspace=\u0418\u0437\u0431\u0440\u0438\u0448\u0438 \u0440\u0430\u0434\u043D\u0438 \u043F\u0440\u043E\u0441\u0442\u043E\u0440 +wipe.out.confirm=\u0414\u0430 \u043B\u0438 \u0441\u0442\u0435 \u0441\u0438\u0433\u0443\u0440\u043D\u0438 \u0434\u0430 \u0436\u0435\u043B\u0438\u0442\u0435 \u0434\u0430 \u043F\u043E\u043D\u0438\u0448\u0442\u0438\u0442\u0435 \u0440\u0430\u0434\u043D\u0438 \u043F\u0440\u043E\u0441\u0442\u043E\u0440? +Up=\u041D\u0430\u0433\u043E\u0440\u0435 +Status=\u0421\u0442\u0430\u045A\u0435 +Workspace=\u0420\u0430\u0434\u043D\u0438 \u043F\u0440\u043E\u0441\u0442\u043E\u0440 +View\ Configuration=\u041F\u0440\u0435\u0433\u043B\u0435\u0434\u0430\u0458 \u043F\u043E\u0441\u0442\u0430\u0432\u043A\u0435 diff --git a/core/src/main/resources/hudson/model/AbstractProject/wipeOutWorkspaceBlocked_sr.properties b/core/src/main/resources/hudson/model/AbstractProject/wipeOutWorkspaceBlocked_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..239c6b464bdf65b99ac2e614ba385b9d037679d5 --- /dev/null +++ b/core/src/main/resources/hudson/model/AbstractProject/wipeOutWorkspaceBlocked_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Error\:\ Wipe\ Out\ Workspace\ blocked\ by\ SCM=\u0413\u0440\u0435\u0448\u043A\u0430: \u0431\u0440\u0438\u0441\u0430\u045A\u0435 \u0440\u0430\u0434\u043D\u043E\u0433 \u043F\u0440\u043E\u0441\u0442\u043E\u0440\u0430 \u0458\u0435 \u0441\u043F\u0440\u0435\u0447\u0438\u0458\u043E \u0441\u0438\u0441\u0442\u0435\u043C\u0430 \u0443\u043F\u0440\u0430\u0432\u0459\u0430\u045A\u0430 \u0438\u0437\u0432\u043E\u0440\u043D\u043E\u0433 \u043A\u043E\u0434\u0430 +The\ SCM\ for\ this\ project\ has\ blocked\ this\ attempt\ to\ wipe\ out\ the\ project's\ workspace.=\u0421\u0438\u0441\u0442\u0435\u043C \u0443\u043F\u0440\u0430\u0432\u0459\u0430\u045A\u0430 \u0438\u0437\u0432\u043E\u0440\u043D\u043E\u0433 \u043A\u043E\u0434\u0430 \u0458\u0435 \u0441\u043F\u0440\u0435\u0447\u0438\u0458\u043E \u0431\u0440\u0438\u0441\u0430\u045A\u0435 \u0440\u0430\u0434\u043D\u043E\u0433 \u043F\u0440\u043E\u0441\u0442\u043E\u0440\u0430. diff --git a/core/src/main/resources/hudson/model/AgentSlave/config_sr.properties b/core/src/main/resources/hudson/model/AgentSlave/config_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..2b6b09af19408944c8d309288ac4c3704ec52515 --- /dev/null +++ b/core/src/main/resources/hudson/model/AgentSlave/config_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +launch\ command=\u043F\u043E\u043A\u0440\u0435\u0442\u043D\u0430 \u043A\u043E\u043C\u0430\u043D\u0434\u0430 diff --git a/core/src/main/resources/hudson/model/AllView/newViewDetail_sr.properties b/core/src/main/resources/hudson/model/AllView/newViewDetail_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..6c827494b85e6092886eb9813474ed1a674d3b36 --- /dev/null +++ b/core/src/main/resources/hudson/model/AllView/newViewDetail_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +blurb=\u041E\u0432\u0430\u0458 \u043F\u0440\u0435\u0433\u043B\u0435\u0434 \u043F\u0440\u0438\u043A\u0430\u0436\u0435 \u0441\u0432\u0435 \u0437\u0430\u0434\u0430\u0442\u043A\u0435 \u043D\u0430 Jenkins. diff --git a/core/src/main/resources/hudson/model/AllView/noJob_pl.properties b/core/src/main/resources/hudson/model/AllView/noJob_pl.properties index 993648df376861661a481bb3a6b04dee8d966328..15c9ac098fa3f9560ff2aca89fde02f89a43a034 100644 --- a/core/src/main/resources/hudson/model/AllView/noJob_pl.properties +++ b/core/src/main/resources/hudson/model/AllView/noJob_pl.properties @@ -1,6 +1,6 @@ # The MIT License # -# Copyright (c) 2004-2010, Sun Microsystems, Inc. +# Copyright (c) 2004-2017, Sun Microsystems, Inc., Damian Szczepanik # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -19,7 +19,7 @@ # 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. - -Welcome\ to\ Jenkins!=Witamy w Jenkins! -newJob=Prosz\u0119 utworzy\u0107 nowe zadanie aby rozpocz\u0105\u0107 prac\u0119. - +Welcome\ to\ Jenkins!=Witamy w Jenkinsie! +newJob=Utw\u00F3rz nowe zadanie, aby rozpocz\u0105\u0107 prac\u0119. +login=Zaloguj si\u0119, aby utworzy\u0107 nowe zadanie. +signup=Je\u015Bli nie masz jeszcze konta, mo\u017Cesz si\u0119 zarejestrowa\u0107 teraz. diff --git a/core/src/main/resources/hudson/model/AllView/noJob_ru.properties b/core/src/main/resources/hudson/model/AllView/noJob_ru.properties index 0b1a828a8720bb9cc299113cb59a151808f27d15..08df179d65e1ee42b6bd7eddc22082734b1684aa 100644 --- a/core/src/main/resources/hudson/model/AllView/noJob_ru.properties +++ b/core/src/main/resources/hudson/model/AllView/noJob_ru.properties @@ -20,7 +20,7 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Welcome\ to\ Jenkins\!=\u0414\u043e\u0431\u0440\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c \u0432 Jenkins! +Welcome\ to\ Jenkins!=\u0414\u043e\u0431\u0440\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c \u0432 Jenkins! newJob=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0441\u043e\u0437\u0434\u0430\u0439\u0442\u0435 \u043d\u043e\u0432\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443 \u0434\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0447\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443. login=\u0412\u043e\u0439\u0442\u0438 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043d\u043e\u0432\u044b\u0445 \u0437\u0430\u0434\u0430\u0447. diff --git a/core/src/main/resources/hudson/model/AllView/noJob_sr.properties b/core/src/main/resources/hudson/model/AllView/noJob_sr.properties index a0d1ef95df8a978265f6f9a5b774dde63fcf622f..83ce33c5a5b13afa3682ec63113464ab380d382b 100644 --- a/core/src/main/resources/hudson/model/AllView/noJob_sr.properties +++ b/core/src/main/resources/hudson/model/AllView/noJob_sr.properties @@ -1,4 +1,6 @@ # This file is under the MIT License by authors -Welcome\ to\ Jenkins!=Dobrodo\u0161li u Jenkins! -newJob=Molimo napravite poslove da po\u010Dnete sa radom. +Welcome\ to\ Jenkins!=\u0414\u043E\u0431\u0440\u043E\u0434\u043E\u0448\u043B\u0438 \u0443 Jenkins! +newJob=\u041A\u0440\u0435\u0438\u0440\u0430\u0442\u0435 \u0437\u0430\u0434\u0430\u0442\u0430\u043A \u0434\u0430 \u043F\u043E\u0447\u043D\u0435\u0442\u0435 \u0441\u0430 \u0440\u0430\u0434\u043E\u043C. +login=\ \u041F\u0440\u0438\u0458\u0430\u0432\u0438\u0442\u0435 \u0441\u0435, \u0434\u0430 \u043F\u043E\u043A\u0440\u0435\u043D\u0435\u0442\u0435 \u043D\u043E\u0432\u0438 \u0437\u0430\u0434\u0430\u0442\u043A\u0435. +signup=\u0410\u043A\u043E \u043D\u0435\u043C\u0430\u0442\u0435 \u043D\u0430\u043B\u043E\u0433, \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0443\u0458\u0442\u0435 \u0441\u0435 \u0441\u0430\u0434\u0430. diff --git a/core/src/main/resources/hudson/model/Api/index.jelly b/core/src/main/resources/hudson/model/Api/index.jelly index 18b003dd4ee2377e950575686acb2fe1744c57e0..962c9ea6b76f93f22d40070354c6a3bc53287a13 100644 --- a/core/src/main/resources/hudson/model/Api/index.jelly +++ b/core/src/main/resources/hudson/model/Api/index.jelly @@ -100,7 +100,7 @@ THE SOFTWARE.

        For more information about remote API in Jenkins, see - the documentation. + the documentation.

        Controlling the amount of data you fetch

        diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_is.properties b/core/src/main/resources/hudson/model/BooleanParameterDefinition/config_pl.properties similarity index 90% rename from core/src/main/resources/hudson/views/BuildButtonColumn/column_is.properties rename to core/src/main/resources/hudson/model/BooleanParameterDefinition/config_pl.properties index d3d4d38df05dbf269549b2435eef9403e3e2ad0b..f825b49123faabb9119767e56ee9da726d1065d0 100644 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_is.properties +++ b/core/src/main/resources/hudson/model/BooleanParameterDefinition/config_pl.properties @@ -1,6 +1,6 @@ # The MIT License # -# Copyright (c) 2004-2010, Sun Microsystems, Inc. +# Copyright (c) 2016, Damian Szczepanik # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -19,5 +19,6 @@ # 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. - -Schedule_a_build=Setja keyrslu \u00ED r\u00F6\u00F0 fyrir {0} +Name=Nazwa +Default\ Value=Domy\u015Blna warto\u015B\u0107 +Description=Opis diff --git a/core/src/main/resources/hudson/model/BooleanParameterDefinition/config_sr.properties b/core/src/main/resources/hudson/model/BooleanParameterDefinition/config_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..93b803761e8a11a2f0995c3e1d086d850afb7eee --- /dev/null +++ b/core/src/main/resources/hudson/model/BooleanParameterDefinition/config_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +Name=\u0418\u043C\u0435 +Default\ Value=\u0421\u0442\u0430\u043D\u0434\u0430\u0440\u0434\u043D\u0430 \u0432\u0440\u0435\u0434\u043D\u043E\u0441\u0442 +Description=\u041E\u043F\u0438\u0441 diff --git a/core/src/main/resources/hudson/model/BooleanParameterDefinition/index.jelly b/core/src/main/resources/hudson/model/BooleanParameterDefinition/index.jelly index 4a06f79573eb93111f2402d512fe5c67dbcaf2ad..b2069b3b67d92dd71abdbbd6b73c401a0bd3cff7 100644 --- a/core/src/main/resources/hudson/model/BooleanParameterDefinition/index.jelly +++ b/core/src/main/resources/hudson/model/BooleanParameterDefinition/index.jelly @@ -26,7 +26,8 @@ THE SOFTWARE. - + +
        diff --git a/core/src/main/resources/hudson/model/BooleanParameterValue/value.jelly b/core/src/main/resources/hudson/model/BooleanParameterValue/value.jelly index 4dd9f679d747a3435e4dd00bbb1233fc59846852..7eaf8be8f68465ccc9337ca8c2424c7e4fba6601 100644 --- a/core/src/main/resources/hudson/model/BooleanParameterValue/value.jelly +++ b/core/src/main/resources/hudson/model/BooleanParameterValue/value.jelly @@ -26,7 +26,8 @@ THE SOFTWARE. - + + \ No newline at end of file diff --git a/core/src/main/resources/hudson/model/BuildAuthorizationToken/config_pl.properties b/core/src/main/resources/hudson/model/BuildAuthorizationToken/config_pl.properties new file mode 100644 index 0000000000000000000000000000000000000000..d4a868f5bcf0153d27456f2ce91d20aa7e191076 --- /dev/null +++ b/core/src/main/resources/hudson/model/BuildAuthorizationToken/config_pl.properties @@ -0,0 +1,27 @@ +# The MIT License +# +# Copyright (c) 2016, Damian Szczepanik +# +# 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. +Optionally\ append\ &cause\=Cause+Text\ to\ provide\ text\ that\ will\ be\ included\ in\ the\ recorded\ build\ cause.=Opcjonalnie do\u0142\u0105cz &cause=Cause+Text, aby dostarczy\u0107 tekst, kt\u00F3y b\u0119dzie informowa\u0142 o \u017Ar\u00F3dle budowania. +Use\ the\ following\ URL\ to\ trigger\ build\ remotely\:=U\u017Cyj tego adresu URL, aby wyzwoli\u0107 budowanie zdalnie +Authentication\ Token=Token autentyfikacji +Trigger\ builds\ remotely=Wyzwalaj budowanie zdalnie +e.g.,\ from\ scripts=np. przez skrypt +or=lub diff --git a/core/src/main/resources/hudson/model/BuildAuthorizationToken/config_sr.properties b/core/src/main/resources/hudson/model/BuildAuthorizationToken/config_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..b0b2e90cf53b5da55915fa4b7e01e3131afd6325 --- /dev/null +++ b/core/src/main/resources/hudson/model/BuildAuthorizationToken/config_sr.properties @@ -0,0 +1,8 @@ +# This file is under the MIT License by authors + +Trigger\ builds\ remotely=\u041F\u043E\u043A\u0440\u0435\u0442\u0430\u045A\u0435 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 \u0441\u0430 \u0434\u0430\u043B\u0435\u043A\u0430 +e.g.,\ from\ scripts=\u043D\u043F\u0440. \u043E\u0434 \u0441\u043A\u0440\u0438\u043F\u0442\u043E\u0432\u0430 +Authentication\ Token=\u0422\u043E\u043A\u0435\u043D \u0437\u0430 \u0430\u0443\u0442\u0435\u043D\u0442\u0438\u043A\u0430\u0446\u0438\u0458\u0443 +Use\ the\ following\ URL\ to\ trigger\ build\ remotely\:=\u041A\u043E\u0440\u0438\u0441\u0442\u0438\u0442\u0435 \u0441\u043B\u0435\u0434\u0435\u045B\u0443 \u0430\u0434\u0440\u0435\u0441\u0443 \u0434\u0430 \u0431\u0438 \u043F\u043E\u043A\u0440\u0435\u043D\u0443\u043B\u0438 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0443 \u0441\u0430 \u0434\u0430\u043B\u0435\u043A\u0430: +or=\u0438\u043B\u0438 +Optionally\ append\ &cause\=Cause+Text\ to\ provide\ text\ that\ will\ be\ included\ in\ the\ recorded\ build\ cause.=\u041C\u043E\u0436\u0435\u0442\u0435 \u043D\u0430\u0432\u0435\u0441\u0442\u0438 \u043E\u0431\u0458\u0430\u0448\u045A\u0435\u045A\u0435 \u0437\u0430 \u043F\u043E\u043A\u0440\u0435\u0442\u0430\u045A\u0435 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0443, &cause\=\u043E\u0431\u0458\u0430\u0448\u045A\u0435\u045A\u0435+\u0437\u0430+\u0440\u0430\u0437\u043B\u043E\u0433 \ No newline at end of file diff --git a/core/src/main/resources/hudson/model/BuildTimelineWidget/control.jelly b/core/src/main/resources/hudson/model/BuildTimelineWidget/control.jelly index f695275f06656ae91e35c41097263479810c7a56..a9efb2525b46622f9c4f34dbf445122b062ac070 100644 --- a/core/src/main/resources/hudson/model/BuildTimelineWidget/control.jelly +++ b/core/src/main/resources/hudson/model/BuildTimelineWidget/control.jelly @@ -41,35 +41,42 @@ THE SOFTWARE. var tz = ${(tz.rawOffset + tz.DSTSavings) / 3600000}; var tl = null; + var interval = 24*60*60*1000; {0} \u0431\u0440\u043E\u0458 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 {1} +started_by_project_with_deleted_build=\u0417\u0430\u043F\u043E\u0447\u0435\u0442\u043E \u043E\u0434 \u0441\u0442\u0440\u0430\u043D\u0435 \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u0430 {0} \u0431\u0440\u043E\u0458 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 {1} +caused_by=\u043F\u0440\u0432\u043E\u0431\u0438\u0442\u043D\u043E \u043F\u043E\u043A\u0440\u0435\u043D\u0443\u0442 \u0437\u0431\u043E\u0433: diff --git a/core/src/main/resources/hudson/model/Cause/UserCause/description_sr.properties b/core/src/main/resources/hudson/model/Cause/UserCause/description_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..def7294073225d0fddeda01df2b6ccce316eeb83 --- /dev/null +++ b/core/src/main/resources/hudson/model/Cause/UserCause/description_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +started_by_user=\u041F\u043E\u043A\u0440\u0435\u043D\u0443\u0442 \u043E\u0434 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u043A\u0430 {0} diff --git a/core/src/main/resources/hudson/model/Cause/UserIdCause/description_sr.properties b/core/src/main/resources/hudson/model/Cause/UserIdCause/description_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..8b7e590e9fee90aa2e1204d33cb617751c40277a --- /dev/null +++ b/core/src/main/resources/hudson/model/Cause/UserIdCause/description_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +started_by_user=\u041F\u043E\u043A\u0440\u0435\u043D\u0443\u0442 \u043E\u0434 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u043A\u0430 {1} +started_by_anonymous=\u041F\u043E\u043A\u0440\u0435\u043D\u0443\u0442\u043E \u0430\u043D\u043E\u043D\u0438\u043C\u043D\u0438\u043C \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u043A\u043E\u043C diff --git a/core/src/main/resources/hudson/model/CauseAction/summary_sr.properties b/core/src/main/resources/hudson/model/CauseAction/summary_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..54014aff1e639d33a1e2a5788d3ca3a89ee36120 --- /dev/null +++ b/core/src/main/resources/hudson/model/CauseAction/summary_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Ntimes=({0} \u043F\u0443\u0442\u0430) diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_eo.properties b/core/src/main/resources/hudson/model/ChoiceParameterDefinition/config_pl.properties similarity index 91% rename from core/src/main/resources/hudson/views/BuildButtonColumn/column_eo.properties rename to core/src/main/resources/hudson/model/ChoiceParameterDefinition/config_pl.properties index 9a226e1ff5540441c1d35212a83892878de5aefe..259ba15fc7fe4ce370c47ac16264f519a3f3d213 100644 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_eo.properties +++ b/core/src/main/resources/hudson/model/ChoiceParameterDefinition/config_pl.properties @@ -1,6 +1,6 @@ # The MIT License # -# Copyright (c) 2004-2010, Sun Microsystems, Inc. +# Copyright (c) 2016, Damian Szczepanik # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -19,5 +19,6 @@ # 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. - -Schedule_a_build=Enhorarigi konstruon por {0} +Name=Nazwa +Choices=Lista wyboru +Description=Opis diff --git a/core/src/main/resources/hudson/model/ChoiceParameterDefinition/config_sr.properties b/core/src/main/resources/hudson/model/ChoiceParameterDefinition/config_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..70ec444ad48f20f6a9bfb99e5ea77d66bc3f4c06 --- /dev/null +++ b/core/src/main/resources/hudson/model/ChoiceParameterDefinition/config_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +Name=\u0418\u043C\u0435 +Choices=\u0412\u0430\u0440\u0438\u0430\u043D\u0442\u0438 +Description=\u041E\u043F\u0438\u0441 diff --git a/core/src/main/resources/hudson/model/ChoiceParameterDefinition/index.jelly b/core/src/main/resources/hudson/model/ChoiceParameterDefinition/index.jelly index 36795a45f6551f02f2457c8eedae41c344cf7a64..60c86d9a244ea29159ed5ca403be9ecb9cd2eada 100644 --- a/core/src/main/resources/hudson/model/ChoiceParameterDefinition/index.jelly +++ b/core/src/main/resources/hudson/model/ChoiceParameterDefinition/index.jelly @@ -26,7 +26,8 @@ THE SOFTWARE. - + +
        diff --git a/core/src/main/resources/hudson/model/FileParameterValue/value.jelly b/core/src/main/resources/hudson/model/FileParameterValue/value.jelly index 4c5c35c1d477b5b67a29b14b5eca9b38270a6945..0afcb71564dab75525780e65692a8792eadf1a23 100644 --- a/core/src/main/resources/hudson/model/FileParameterValue/value.jelly +++ b/core/src/main/resources/hudson/model/FileParameterValue/value.jelly @@ -26,7 +26,8 @@ THE SOFTWARE. - + + diff --git a/core/src/main/resources/hudson/model/FileParameterValue/value_sr.properties b/core/src/main/resources/hudson/model/FileParameterValue/value_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..9436855e09d9a2e5753b62b442bdac61803e13a1 --- /dev/null +++ b/core/src/main/resources/hudson/model/FileParameterValue/value_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +view=\u043F\u0440\u0435\u0433\u043B\u0435\u0434 diff --git a/core/src/main/resources/hudson/model/Fingerprint/index_sr.properties b/core/src/main/resources/hudson/model/Fingerprint/index_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..d348edb2072288fab74fea9e4ca1e7fe2c47a076 --- /dev/null +++ b/core/src/main/resources/hudson/model/Fingerprint/index_sr.properties @@ -0,0 +1,8 @@ +# This file is under the MIT License by authors + +Back\ to\ Dashboard=\u041D\u0430\u0437\u0430\u0434 \u043A\u0430 \u043A\u043E\u043D\u0442\u0440\u043E\u043B\u043D\u0443 \u043F\u0430\u043D\u0435\u043B\u0443 +introduced=\u0418\u0437\u0458\u0430\u0432\u0459\u0435\u043D\u043E \u043F\u0440\u0435 {0} +outside\ Jenkins=\u0438\u0437\u0432\u0430\u043D Jenkins +Usage=\u0418\u0441\u043A\u043E\u0440\u0438\u0448\u045B\u0435\u045A\u0435 +This\ file\ has\ not\ been\ used\ anywhere\ else.=\u041E\u0432\u0430 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0430 \u043D\u0438\u0458\u0435 \u0434\u0440\u0443\u0433\u0434\u0435 \u043A\u043E\u0440\u0438\u0448\u045B\u0435\u043D\u0430. +This\ file\ has\ been\ used\ in\ the\ following\ places=\u041E\u0432\u0430 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0430 \u0441\u0435 \u043A\u043E\u0440\u0438\u0441\u0442\u0438 \u043A\u043E\u0434: diff --git a/core/src/main/resources/hudson/model/JDK/config_de.properties b/core/src/main/resources/hudson/model/JDK/config_de.properties index 0e96f25f7f3bb7c2ea803c186f1b8f53470c666d..b8b8b76869a2c554bae1954611687369e8f7cea3 100644 --- a/core/src/main/resources/hudson/model/JDK/config_de.properties +++ b/core/src/main/resources/hudson/model/JDK/config_de.properties @@ -1,23 +1,23 @@ -# The MIT License -# -# Copyright (c) 2004-2010, Sun Microsystems, Inc., Kohsuke Kawaguchi, Simon Wiest -# -# 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. - -Name=Name +# The MIT License +# +# Copyright (c) 2004-2010, Sun Microsystems, Inc., Kohsuke Kawaguchi, Simon Wiest +# +# 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. + +Name=Name diff --git a/core/src/main/resources/lib/form/apply_hu.properties b/core/src/main/resources/hudson/model/JDK/config_sr.properties similarity index 67% rename from core/src/main/resources/lib/form/apply_hu.properties rename to core/src/main/resources/hudson/model/JDK/config_sr.properties index 132698b0d6ac15d52d814074bf2ab112daf230ae..2fbb8bde38001bf90e43c02d70be99315bd965fa 100644 --- a/core/src/main/resources/lib/form/apply_hu.properties +++ b/core/src/main/resources/hudson/model/JDK/config_sr.properties @@ -1,3 +1,3 @@ # This file is under the MIT License by authors -Apply=Alkalmaz +Name=\u0418\u043C\u0435 diff --git a/core/src/main/resources/hudson/model/JDK/config_zh_CN.properties b/core/src/main/resources/hudson/model/JDK/config_zh_CN.properties index 4396111bece6a438e0ca2baee04e7204064a906c..3259f3501578f656d94be94154deb240ffe2c189 100644 --- a/core/src/main/resources/hudson/model/JDK/config_zh_CN.properties +++ b/core/src/main/resources/hudson/model/JDK/config_zh_CN.properties @@ -1,23 +1,23 @@ -# The MIT License -# -# Copyright (c) 2004-2010, Sun Microsystems, Inc., Kohsuke Kawaguchi, Simon Wiest -# -# 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. - -Name=\u522b\u540d +# The MIT License +# +# Copyright (c) 2004-2010, Sun Microsystems, Inc., Kohsuke Kawaguchi, Simon Wiest +# +# 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. + +Name=\u522b\u540d diff --git a/core/src/main/resources/hudson/model/Job/buildTimeTrend_pl.properties b/core/src/main/resources/hudson/model/Job/buildTimeTrend_pl.properties index 76f7eb5480f1e6b2e4246d2a3b213e68bf5b6f1c..6933e0887e54daf8865bc4a718c485f3c915a910 100644 --- a/core/src/main/resources/hudson/model/Job/buildTimeTrend_pl.properties +++ b/core/src/main/resources/hudson/model/Job/buildTimeTrend_pl.properties @@ -1,6 +1,6 @@ # The MIT License # -# Copyright (c) 2004-2010, Sun Microsystems, Inc. +# Copyright (c) 2004-2016, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributors # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -23,5 +23,4 @@ Build\ Time\ Trend=Trend czasu trwania zada\u0144 Build=Zadanie Duration=Czas trwania -More\ than\ 1\ builds\ are\ needed\ for\ the\ trend\ report.=Potrzeba wi\u0119cej ni\u017C jednego zadania by przygotowa\u0107 raport trendu Timeline=Linia czasu diff --git a/core/src/main/resources/hudson/model/Job/buildTimeTrend_ru.properties b/core/src/main/resources/hudson/model/Job/buildTimeTrend_ru.properties index d7aa531f3bd196fa9f152303a7d5b4eb3e097a11..e52af5636783607387606f0839ef18c2a3f38c82 100644 --- a/core/src/main/resources/hudson/model/Job/buildTimeTrend_ru.properties +++ b/core/src/main/resources/hudson/model/Job/buildTimeTrend_ru.properties @@ -1,17 +1,17 @@ # The MIT License -# +# # Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Mike Salnikov -# +# # 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 @@ -20,9 +20,9 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Timeline=\u0412\u0440\u0435\u043C\u0435\u043D\u043D\u0430\u044F \u0448\u043A\u0430\u043B\u0430 -title={0} \u0413\u0440\u0430\u0444\u0438\u043a \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0441\u0431\u043e\u0440\u043a\u0438 +Agent=\u0410\u0433\u0435\u043d\u0442 Build=\u0421\u0431\u043e\u0440\u043a\u0430 -Build\ Time\ Trend=\u0413\u0440\u0430\u0444\u0438\u043A \u043F\u0440\u043E\u0434\u043E\u043B\u0436\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0441\u0442\u0438 +Build\ Time\ Trend=\u0413\u0440\u0430\u0444\u0438\u043a \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 Duration=\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c -More\ than\ 1\ builds\ are\ needed\ for\ the\ trend\ report.=\u0414\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0433\u0440\u0430\u0444\u0438\u043a\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0431\u043e\u043b\u0435\u0435 \u0447\u0435\u043c \u043e\u0434\u043d\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u0435. +Timeline=\u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0448\u043a\u0430\u043b\u0430 +title={0} \u0413\u0440\u0430\u0444\u0438\u043a \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0441\u0431\u043e\u0440\u043a\u0438 \ No newline at end of file diff --git a/core/src/main/resources/hudson/model/Job/buildTimeTrend_sr.properties b/core/src/main/resources/hudson/model/Job/buildTimeTrend_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..7dae472f70b6192b35fe8c9c8a8031f77d3a8287 --- /dev/null +++ b/core/src/main/resources/hudson/model/Job/buildTimeTrend_sr.properties @@ -0,0 +1,10 @@ +# This file is under the MIT License by authors + +title={0} \u0442\u0440\u0435\u043D\u0434 \u0432\u0440\u0435\u043C\u0435\u043D\u0443 \u0437\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0443 +Timeline=\u0412\u0440\u0435\u043C\u0435 +Build\ Time\ Trend=\u0422\u0440\u0435\u043D\u0434 \u0432\u0440\u0435\u043C\u0435\u043D\u0443 \u0437\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0443 +Build=\u0418\u0437\u0433\u0440\u0430\u0434\u0438 +Duration=\u0422\u0440\u0430\u0458\u0430\u045A\u0435 +Agent=\u0410\u0433\u0435\u043D\u0442 +Slave=\u041F\u043E\u043C\u043E\u045B\u043D\u0438\u043A +More\ than\ 1\ builds\ are\ needed\ for\ the\ trend\ report.=\u0412\u0438\u0448\u0435 \u043E\u0434 \u0458\u0435\u0434\u043D\u0435 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 \u0458\u0435 \u043F\u043E\u0442\u0440\u0435\u0431\u043D\u043E \u0437\u0430 \u0440\u0435\u043F\u043E\u0440\u0442\u0430\u0436\u0443 \u0442\u0440\u0435\u043D\u0434\u0430. diff --git a/core/src/main/resources/hudson/model/Job/configure_pl.properties b/core/src/main/resources/hudson/model/Job/configure_pl.properties index ebd96c0e7e38d1068edde07287cd34c9d075ecc9..8de51db76cc57061a3908cc673a9d5aeee93740e 100644 --- a/core/src/main/resources/hudson/model/Job/configure_pl.properties +++ b/core/src/main/resources/hudson/model/Job/configure_pl.properties @@ -1,6 +1,6 @@ # The MIT License # -# Copyright (c) 2004-2010, Sun Microsystems, Inc. +# Copyright (c) 2004-2016, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributors # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -24,5 +24,4 @@ Description=Opis LOADING=\u0141ADOWANIE Save=Zapisz Apply=Zastosuj -Strategy=Strategia name={0} nazwa diff --git a/core/src/main/resources/hudson/model/Job/configure_ru.properties b/core/src/main/resources/hudson/model/Job/configure_ru.properties index 795374cdf8335098e90ff91f100687ccae38ab9c..f53988aeee15b59d89f9ead3a5c5de5c7fde2f73 100644 --- a/core/src/main/resources/hudson/model/Job/configure_ru.properties +++ b/core/src/main/resources/hudson/model/Job/configure_ru.properties @@ -1,27 +1,5 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Mike Salnikov -# -# 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. - -Strategy=\u0421\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f -name={0} +Apply=\u041f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c Description=\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 LOADING=\u0417\u0410\u0413\u0420\u0423\u0417\u041a\u0410 Save=\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c +name={0} \u0438\u043c\u044f diff --git a/core/src/main/resources/hudson/model/Job/configure_sr.properties b/core/src/main/resources/hudson/model/Job/configure_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..67e427cfa16d728ea574aa9b32b321b30004dc43 --- /dev/null +++ b/core/src/main/resources/hudson/model/Job/configure_sr.properties @@ -0,0 +1,8 @@ +# This file is under the MIT License by authors + +LOADING=\u0423\u0447\u0438\u0442\u0430\u0432\u0430\u045A\u0435 +name={0} \u0438\u043C\u0435 +Description=\u041E\u043F\u0438\u0441 +Save=\u0421\u0430\u0447\u0443\u0432\u0430\u0458 +Apply=\u041F\u0440\u0438\u043C\u0435\u043D\u0438 +Strategy=\u0428\u0435\u043C\u0430 diff --git a/core/src/main/resources/hudson/model/Job/index_pl.properties b/core/src/main/resources/hudson/model/Job/index_pl.properties index 7aee47b620ec588af6d1ca0d5c6ef63dd1a86dbc..8be214e8d3625d52abfbbb379fd11cb32dbfa5f9 100644 --- a/core/src/main/resources/hudson/model/Job/index_pl.properties +++ b/core/src/main/resources/hudson/model/Job/index_pl.properties @@ -1,6 +1,25 @@ -# This file is under the MIT License by authors +# The MIT License +# +# Copyright (c) 2004-2016, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributors +# +# 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. -Disable\ Project=Wy\u0142\u0105cz projekt -Enable=W\u0142\u0105cz Project\ name=Nazwa projektu -This\ project\ is\ currently\ disabled=Projekt jest obecnie wy\u0142\u0105czony. + +Full\ project\ name=Pe\u0142na nazwa projektu diff --git a/core/src/main/resources/hudson/model/Job/index_ru.properties b/core/src/main/resources/hudson/model/Job/index_ru.properties index 0439d91594f3bfda77e456a32993b324cf97a294..ef43b96950301df3cc07afc1e9cac3ce1cdf8e46 100644 --- a/core/src/main/resources/hudson/model/Job/index_ru.properties +++ b/core/src/main/resources/hudson/model/Job/index_ru.properties @@ -1,17 +1,17 @@ # The MIT License -# +# # Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Mike Salnikov -# +# # 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 @@ -20,10 +20,5 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Permalinks=\u041f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u044b\u0435 \u0441\u0441\u044b\u043b\u043a\u0438 -Disable\ Project=\u041E\u0442\u043A\u043B\u044E\u0447\u0438\u0442\u044C \u0441\u0431\u043E\u0440\u043A\u0443 -Last\ build=\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0441\u0431\u043e\u0440\u043a\u0430 -Last\ stable\ build=\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u0430\u044f \u0441\u0431\u043e\u0440\u043a\u0430 -Last\ successful\ build=\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0443\u0441\u043f\u0435\u0448\u043d\u0430\u044f \u0441\u0431\u043e\u0440\u043a\u0430 -Last\ failed\ build=\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u043f\u0440\u043e\u0432\u0430\u043b\u0438\u0432\u0448\u0430\u044f\u0441\u044f \u0441\u0431\u043e\u0440\u043a\u0430 -Project\ name=\u041D\u0430\u0437\u0432\u0430\u043D\u0438\u0435 \u043F\u0440\u043E\u0435\u043A\u0442\u0430 +Full\ project\ name=\u041f\u043e\u043b\u043d\u043e\u0435 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 +Project\ name=\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \ No newline at end of file diff --git a/core/src/main/resources/hudson/model/Job/index_sr.properties b/core/src/main/resources/hudson/model/Job/index_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..0d0ed0e2e702cd8da2cd134f5a52835727a47825 --- /dev/null +++ b/core/src/main/resources/hudson/model/Job/index_sr.properties @@ -0,0 +1,12 @@ +# This file is under the MIT License by authors + +Full\ project\ name=\u041F\u0443\u043D\u043E \u0438\u043C\u0435 \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u0430 +Project\ name=\u0418\u043C\u0435 \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u0430 +Disable\ Project=\u041E\u043D\u0435\u043C\u043E\u0433\u0443\u045B\u0438 \u043F\u0440\u043E\u0458\u0435\u043A\u0430\u0442 +Enable=\u041E\u043C\u043E\u0433\u0443\u045B\u0443 +This\ project\ is\ currently\ disabled=\u041E\u0432\u0430\u0458 \u043F\u0440\u043E\u0458\u0435\u043A\u0430\u0442 \u0458\u0435 \u0442\u0440\u0435\u043D\u0443\u0442\u043D\u043E \u043E\u043D\u0435\u043C\u043E\u0433\u0443\u045B\u0435\u043D +Permalinks=\u0422\u0440\u0430\u0458\u043D\u0438 \u043B\u0438\u043D\u043A\u043E\u0432\u0438 +Last\ build=\u0417\u0430\u0434\u045A\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 +Last\ stable\ build=\u0417\u0430\u0434\u045A\u0430 \u0441\u0442\u0430\u0431\u0438\u043B\u043D\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 +Last\ successful\ build=\u0417\u0430\u0434\u045A\u0430 \u0443\u0441\u043F\u0435\u0448\u043D\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 +Last\ failed\ build=\u0417\u0430\u0434\u045A\u0430 \u043D\u0435\u0443\u0441\u043F\u0435\u0448\u043D\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 diff --git a/core/src/main/resources/hudson/model/Job/permalinks_sr.properties b/core/src/main/resources/hudson/model/Job/permalinks_sr.properties index 875957e4c1ffb67801d2e76af4e67a6164ecd8c1..32c60f83c199b7f7217be42e2f27c87c02927876 100644 --- a/core/src/main/resources/hudson/model/Job/permalinks_sr.properties +++ b/core/src/main/resources/hudson/model/Job/permalinks_sr.properties @@ -1,3 +1,3 @@ # This file is under the MIT License by authors -Permalinks=Linkovi +Permalinks=\u0422\u0440\u0430\u0458\u043D\u0438 \u043B\u0438\u043D\u043A\u043E\u0432\u0438 diff --git a/core/src/main/resources/hudson/model/Job/rename_sr.properties b/core/src/main/resources/hudson/model/Job/rename_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..531c0a42259c88d77b6499db587c656fefe01946 --- /dev/null +++ b/core/src/main/resources/hudson/model/Job/rename_sr.properties @@ -0,0 +1,8 @@ +# This file is under the MIT License by authors + +noRenameWhileBuilding=\u041D\u0438\u0458\u0435 \u043C\u043E\u0433\u0443\u045B\u0435 \u043F\u0440\u0435\u0438\u043C\u0435\u043D\u043E\u0432\u0430\u0442\u0438 \u0437\u0430\u0434\u0430\u0442\u0430\u043A \u0434\u043E\u043A \u0441\u0435 \u0433\u0440\u0430\u0434\u0438. +configWasSaved=\u0421\u0432\u0430 \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 \u0441\u0443 \u0441\u0430\u0447\u0443\u0432\u0430\u043D\u0430. +newNameInUse=\u0418\u043C\u0435 {0} \u0458\u0435 \u0437\u0430\u0443\u0437\u0435\u0442\u043E. +description=\u0414\u0430 \u043B\u0438 \u0441\u0442\u0435 \u0441\u0438\u0433\u0443\u0440\u043D\u0438 \u0434\u0430 \u0436\u0435\u043B\u0438\u0442\u0435 \u0434\u0430 \u043F\u0440\u0435\u0438\u043C\u0435\u043D\u0443\u0458\u0435\u0442\u0435 "{0}" \u0443 "{1}"? +Yes=\u0414\u0430 +No=\u041D\u0435 diff --git a/core/src/main/resources/hudson/model/Job/requirePOST_ru.properties b/core/src/main/resources/hudson/model/Job/requirePOST_ru.properties new file mode 100644 index 0000000000000000000000000000000000000000..d6fb09eab4d769d31f405c6c6713ded328004907 --- /dev/null +++ b/core/src/main/resources/hudson/model/Job/requirePOST_ru.properties @@ -0,0 +1 @@ +Proceed=\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c diff --git a/core/src/main/resources/hudson/model/Job/requirePOST_sr.properties b/core/src/main/resources/hudson/model/Job/requirePOST_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..d1f040363ec472aab221fd4b3ed112564820c5e2 --- /dev/null +++ b/core/src/main/resources/hudson/model/Job/requirePOST_sr.properties @@ -0,0 +1,6 @@ +# This file is under the MIT License by authors + +Form\ post\ required=\u0422\u0440\u0435\u0431\u0430\u043B\u043E \u0431\u0438 \u043F\u043E\u0434\u043D\u0435\u0442\u0438 \u043E\u0431\u0440\u0430\u0437\u0430\u0446 \u043F\u0440\u0435\u043A\u043E "POST". +use_post=\u041C\u043E\u0440\u0430\u0442\u0435 \u043A\u043E\u0440\u0438\u0441\u0442\u0438\u0442\u0438 \u043C\u0435\u0442\u043E\u0434 POST \u0434\u0430 \u0438\u0437\u0430\u0437\u043E\u0432\u0435\u0442\u0435 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435.\ +\u0410\u043A\u043E \u0432\u0430\u043C \u0458\u0435 \u043E\u0432\u0430 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0430 \u043F\u0440\u0438\u043A\u0430\u0437\u0430\u043D\u0430, \u043C\u043E\u0433\u0443\u045B\u0435 \u0458\u0435 \u0434\u0430 \u0458\u0435 \u043D\u0435\u043A\u0430 \u043C\u043E\u0434\u0443\u043B\u0430 \u0438\u0437\u043F\u0443\u0441\u0442\u0438\u043B\u0430 GET \u0437\u0430\u0445\u0442\u0435\u0432, \u0443 \u043A\u043E\u043C \u0441\u043B\u0443\u0447\u0430\u0458\u0443 \u043F\u043E\u0434\u043D\u0435\u0441\u0438\u0442\u0435 \u0438\u0437\u0432\u0435\u0448\u0442\u0430\u0458 \u043E \u0433\u0440\u0435\u0448\u0446\u0438 \u0437\u0430 \u0442\u0443 \u043C\u043E\u0434\u0443\u043B\u0443. +Proceed=\u041D\u0430\u0441\u0442\u0430\u0432\u0438 diff --git a/core/src/main/resources/hudson/model/Label/index.jelly b/core/src/main/resources/hudson/model/Label/index.jelly index 931d7932df5ea14edb7af58d0489b008281bb565..10b239fd63cb4ad07a3edf8b70724107ef034151 100644 --- a/core/src/main/resources/hudson/model/Label/index.jelly +++ b/core/src/main/resources/hudson/model/Label/index.jelly @@ -36,7 +36,7 @@ THE SOFTWARE. - + diff --git a/core/src/main/resources/hudson/model/Label/index_sr.properties b/core/src/main/resources/hudson/model/Label/index_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..51a766a551e9051475371bb86a308067e6a3569e --- /dev/null +++ b/core/src/main/resources/hudson/model/Label/index_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +Nodes=\u041C\u0430\u0448\u0438\u043D\u0435 +Projects=\u041F\u0440\u043E\u0458\u0435\u043A\u0442\u0438 +None=\u041D\u0435\u043C\u0430 diff --git a/core/src/main/resources/hudson/model/Label/sidepanel_sr.properties b/core/src/main/resources/hudson/model/Label/sidepanel_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..adab3fbf79fd9310b0f5899281c7fd47cbd063d6 --- /dev/null +++ b/core/src/main/resources/hudson/model/Label/sidepanel_sr.properties @@ -0,0 +1,6 @@ +# This file is under the MIT License by authors + +Overview=\u041F\u0440\u0435\u0433\u043B\u0435\u0434 +Configure=\u041F\u043E\u0434\u0435\u0441\u0438 +Load\ Statistics=\u0423\u0447\u0438\u0442\u0430\u0458 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043A\u0435 +Back\ to\ Dashboard=\u041D\u0430\u0437\u0430\u0434 \u043A\u0430 \u043A\u043E\u043D\u0442\u0440\u043E\u043B\u043D\u0443 \u043F\u0430\u043D\u0435\u043B\u0443 diff --git a/core/src/main/resources/hudson/model/ListView/configure-entries_pl.properties b/core/src/main/resources/hudson/model/ListView/configure-entries_pl.properties index b1c478e57b85b8116896a31e196f8787c0b3e466..c7627c10d3d4cc8749feb4d29144b6c06172f391 100644 --- a/core/src/main/resources/hudson/model/ListView/configure-entries_pl.properties +++ b/core/src/main/resources/hudson/model/ListView/configure-entries_pl.properties @@ -1,6 +1,24 @@ -# This file is under the MIT License by authors - -Add\ column=Dodaj kolumn\u0119 +# The MIT License +# +# Copyright (c) 2013-2016, Kohsuke Kawaguchi, Damian Szczepanik +# +# 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 All\ selected\ jobs=Wszystkie wybrane projekty Columns=Kolumny Disabled\ jobs\ only=Tylko wy\u0142\u0105czone projekty @@ -9,4 +27,7 @@ Job\ Filters=Filtry projekt\u00F3w Jobs=Projekty Regular\ expression=Wyra\u017Cenie regularne Status\ Filter=Status (filtr) -Use\ a\ regular\ expression\ to\ include\ jobs\ into\ the\ view=U\u017Cyj wyra\u017Cenia regularnego aby doda\u0107 projekty do widoku +Use\ a\ regular\ expression\ to\ include\ jobs\ into\ the\ view=U\u017Cyj wyra\u017Cenia regularnego, aby doda\u0107 projekty do widoku +Recurse\ in\ subfolders=Rekursywnie wg\u0142\u0105b folder\u00F3w +Add\ column=Dodaj kolumn\u0119 +Add\ Job\ Filter=Dodaj filtr zada\u0144 diff --git a/core/src/main/resources/hudson/model/ListView/configure-entries_sr.properties b/core/src/main/resources/hudson/model/ListView/configure-entries_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..04cba4a19b8a02999efa39012bb63013f8217a67 --- /dev/null +++ b/core/src/main/resources/hudson/model/ListView/configure-entries_sr.properties @@ -0,0 +1,14 @@ +# This file is under the MIT License by authors + +Job\ Filters=\u0424\u0438\u043B\u0442\u0435\u0440\u0438 \u043D\u0430 \u0437\u0430\u0434\u0430\u0446\u0438\u043C\u0430 +Status\ Filter= +All\ selected\ jobs=\u0421\u0432\u0435 \u0438\u0437\u0430\u0431\u0440\u0430\u043D\u0438 \u0437\u0430\u0434\u0430\u0446\u0438 +Enabled\ jobs\ only=\u0421\u0430\u043C\u043E \u043E\u043C\u043E\u0433\u0443\u045B\u0435\u043D\u0438 \u0437\u0430\u0434\u0430\u0446\u0438 +Disabled\ jobs\ only=\u0421\u0430\u043C\u043E \u043E\u043D\u0435\u043C\u043E\u0433\u0443\u045B\u0435\u043D\u0438 \u0437\u0430\u0434\u0430\u0446\u0438 +Recurse\ in\ subfolders= +Jobs=\u0417\u0430\u0434\u0430\u0446\u0438 +Use\ a\ regular\ expression\ to\ include\ jobs\ into\ the\ view= +Regular\ expression=\u0420\u0435\u0433\u0443\u043B\u0430\u0440\u043D\u0438 \u0438\u0437\u0440\u0430\u0437 +Add\ Job\ Filter= +Columns=\u041A\u043E\u043B\u043E\u043D\u0435 +Add\ column=\u0414\u043E\u0434\u0430\u0458 \u043A\u043E\u043B\u043E\u043D\u0443 diff --git a/core/src/main/resources/windows-service/jenkins-slave.xml b/core/src/main/resources/hudson/model/ListView/newJobButtonBar.jelly similarity index 52% rename from core/src/main/resources/windows-service/jenkins-slave.xml rename to core/src/main/resources/hudson/model/ListView/newJobButtonBar.jelly index b4d3bf58f2092470c250b0703f75fd2b0816b3ff..c7af6102595074fc682a6cadc184704c8bf5d1c4 100644 --- a/core/src/main/resources/windows-service/jenkins-slave.xml +++ b/core/src/main/resources/hudson/model/ListView/newJobButtonBar.jelly @@ -1,7 +1,7 @@ - - - @ID@ - Jenkins Slave - This service runs a slave for Jenkins continuous integration system. - - @JAVA@ - -Xrs @VMARGS@ -jar "%BASE%\slave.jar" @ARGS@ - - rotate - - - + + + + + diff --git a/core/src/main/resources/hudson/model/ListView/newJobButtonBar_ru.properties b/core/src/main/resources/hudson/model/ListView/newJobButtonBar_ru.properties new file mode 100644 index 0000000000000000000000000000000000000000..2b9db53f4c61fbf35107c422d09d18206c871ad0 --- /dev/null +++ b/core/src/main/resources/hudson/model/ListView/newJobButtonBar_ru.properties @@ -0,0 +1 @@ +Add\ to\ current\ view=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a \u0442\u0435\u043a\u0443\u0449\u0435\u043c\u0443 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044e diff --git a/core/src/main/resources/hudson/model/ListView/newJobButtonBar_sr.properties b/core/src/main/resources/hudson/model/ListView/newJobButtonBar_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..ff4f4a4f27400d0e8216673f666e641f0fec32eb --- /dev/null +++ b/core/src/main/resources/hudson/model/ListView/newJobButtonBar_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Add\ to\ current\ view=\u0414\u043E\u0434\u0430\u0458 \u043D\u0430 \u043E\u0432\u0430\u0458 \u043F\u0440\u0435\u0433\u043B\u0435\u0434 diff --git a/core/src/main/resources/hudson/model/ListView/newViewDetail_sr.properties b/core/src/main/resources/hudson/model/ListView/newViewDetail_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..93393667152bbf4ce1ec503c4e9c18ab861b21b8 --- /dev/null +++ b/core/src/main/resources/hudson/model/ListView/newViewDetail_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +blurb=\u041F\u043E\u043A\u0430\u0437\u0443\u0458\u0435 \u0437\u0430\u0434\u0430\u0442\u043A\u0435 \u0443 \u043E\u0431\u043B\u0438\u043A\u0443 \u043E\u0431\u0438\u0447\u043D\u0435 \u043B\u0438\u0441\u0442\u0435. \u041C\u043E\u0436\u0435\u0442\u0435 \u043E\u0434\u0430\u0431\u0440\u0430\u0442\u0438 \u0437\u0430\u0434\u0430\u0442\u043A\u0435 \u0437\u0430 \u043F\u0440\u0438\u043A\u0430\u0437\u0438\u0432\u0430\u045A\u0435 \u0443 \u043D\u0435\u043A\u043E\u043C \u043F\u0440\u0438\u043A\u0430\u0437\u0443. diff --git a/core/src/main/resources/hudson/model/LoadStatistics/main_sr.properties b/core/src/main/resources/hudson/model/LoadStatistics/main_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..de74c71dd496be326fa49b1f6577e732c78ce597 --- /dev/null +++ b/core/src/main/resources/hudson/model/LoadStatistics/main_sr.properties @@ -0,0 +1,48 @@ +# This file is under the MIT License by authors + +title=\u0423\u0447\u0438\u0442\u0430\u0458 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043A\u0435: {0} +Timespan=\u0412\u0440\u0435\u043C\u0435 +Short=\u041A\u0440\u0430\u0442\u043A\u043E +Medium=\u0421\u0440\u0435\u0434\u045A\u0435 +Long=\u0414\u0443\u0433\u043E +Load\ statistics\ graph=\u0423\u0447\u0438\u0442\u0430\u0458 \u0433\u0440\u0430\u0444\u0438\u043A\u043E\u043D \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043A\u0430 +blurb=\ + \u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043A\u0435 \u043E\u043F\u0442\u0435\u0440\u0435\u045B\u0435\u045A\u0430 \u043F\u0440\u0430\u0442\u0435 \u0447\u0435\u0442\u0438\u0440\u0438 \u0433\u043B\u0430\u0432\u043D\u0435 \u043C\u0435\u0442\u0440\u0438\u043A\u0435 \u043A\u043E\u0440\u0438\u0448\u045B\u0435\u045A\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u0430: \ +
        \ +
        \u0411\u0440\u043E\u0458 \u043F\u043E\u0432\u0435\u0437\u0430\u043D\u0438\u0445 \u0438\u0437\u0432\u0440\u0448\u0438\u0442\u0435\u0459\u0430
        \ +
        \ + \u0417\u0430 \u043C\u0430\u0448\u0438\u043D\u0443: \u0430\u043A\u043E \u0458\u0435 \u043C\u0430\u0448\u0438\u043D\u0430 \u043F\u043E\u0432\u0435\u0437\u0430\u043D\u0430 \u043E\u043D\u0434\u0430 \u0458\u0435 \u043E\u0432\u043E \u0432\u0440\u043E\u0458 \u0438\u0437\u0432\u0440\u0448\u0438\u0442\u0435\u0459\u0430 \ + \u0442\u0430\u0458 \u0440\u0430\u0447\u0443\u043D\u0430\u0440 \u0438\u043C\u0430; \u0430\u043A\u043E \u043D\u0438\u0458\u0435 \u043F\u043E\u0432\u0435\u0437\u0430\u043D \u043E\u043D\u0434\u0430 \u0458\u0435 \u0437\u0431\u0438\u0440 \u043D\u0443\u043B\u0430.
        \ + \u0417\u0430 \u043B\u0430\u0431\u0435\u043B\u0443: \u0437\u0431\u0438\u0440 \u0438\u0437\u0432\u0440\u0448\u0438\u0442\u0435\u0459\u0430 \u043D\u0430 \u0441\u0432\u0438\u043C \u0440\u0430\u0447\u0443\u043D\u0430\u0440\u0438\u043C\u0430 \u0441\u0430 \u043E\u0432\u043E\u043C \u043B\u0430\u0431\u0435\u043B\u043E\u043C.
        \ + \u0417\u0430 \u0446\u0435\u043E Jenkins: \u0437\u0431\u0438\u0440 \u0441\u0432\u0438\u0445 \u0438\u0437\u0432\u0440\u0448\u0438\u0442\u0435\u0459\u0430 \u043D\u0430 \u043E\u0432\u043E\u0458 \u0438\u043D\u0441\u0442\u0430\u043D\u0446\u0438 Jenkins-\u0430.
        \ + \u041E\u0441\u0438\u043C \u043F\u0440\u043E\u043C\u0435\u043D\u0430 \u0443 \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0443, \u043E\u0432\u0430 \u0432\u0440\u0435\u0434\u043D\u043E\u0441\u0442 \u043C\u043E\u0436\u0435 \u0441\u0435 \u043C\u0435\u045A\u0430\u0442\u0438 \u043A\u0430\u0434 \u0430\u0433\u0435\u043D\u0442\u0438 \u043F\u0440\u0435\u043A\u0438\u043D\u0443 \u0432\u0435\u0437\u0443. \ +
        \ +
        \u0411\u0440\u043E\u0458 \u0437\u0430\u0443\u0437\u0435\u0442\u0438\u0445 \u0438\u0437\u0432\u0440\u0448\u0438\u0442\u0435\u0459\u0430
        \ +
        \ + \u041E\u0437\u043D\u0430\u0447\u0430\u0432\u0430 \u0431\u0440\u043E\u0458 \u0438\u0437\u0432\u0440\u0448\u0438\u0442\u0435\u0459\u0430 (me\u0452\u0443 \u0438\u0437\u0432\u0440\u0448\u0438\u0442\u0435\u0459\u0430 \u0438\u0437\u043D\u0430\u0434) \ + \u043A\u043E\u0458\u0438 \u0438\u0437\u0432\u0440\u0448\u0430\u0432\u0430\u0458\u0443 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435. \u041E\u0434\u043D\u043E\u0441 \u043E\u0432\u0435 \u0446\u0438\u0444\u0440\u0435 \u043F\u0440\u0435\u043C\u0430 \u0431\u0440\u043E\u0458\u0443 \u043F\u043E\u0432\u0435\u0437\u0430\u043D\u0438\u0445 \u0438\u0437\u0432\u0440\u0448\u0438\u0442\u0435\u0459\u0430 \ + \u0434\u0430\u0458\u0435 \u0432\u0430\u043C \u043A\u043E\u0440\u0438\u0448\u045B\u0435\u045A\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u0430. \u0410\u043A\u043E \u0441\u0443 \u0441\u0432\u0438 \u0438\u0437\u0432\u0440\u0448\u0438\u0442\u0435\u0459\u0438 \u0437\u0430\u0443\u0437\u0435\u0442\u0438 \ + \u0437\u0430 \u0434\u0443\u0436\u0435 \u0432\u0440\u0435\u043C\u0435, \u043C\u043E\u0436\u0434\u0430 \u0431\u0438 \u0442\u0440\u0435\u0431\u0430\u043B\u043E \u0434\u043E\u0434\u0430\u0442\u0438 \u0432\u0438\u0448\u0435 \u043C\u0430\u0448\u0438\u043D\u0430 \u0443 \u0432\u0430\u0448\u0443 Jenkins \u0433\u0440\u0443\u043F\u0443.\ +
        \ +
        \u0411\u0440\u043E\u0458 \u0441\u043B\u043E\u0431\u043E\u0434\u043D\u0438\u0445 \u0438\u0437\u0432\u0440\u0448\u0438\u0442\u0435\u0459\u0430
        \ +
        \ + \u041E\u0437\u043D\u0430\u0447\u0430\u0432\u0430 \u0431\u0440\u043E\u0458 \u0438\u0437\u0432\u0440\u0448\u0438\u0442\u0435\u0459\u0430 (me\u0452\u0443 \u0438\u0437\u0432\u0440\u0448\u0438\u0442\u0435\u0459\u0430 \u0438\u0437\u043D\u0430\u0434) \ + \u043A\u043E\u0458\u0438 \u043C\u043E\u0433\u0443 \u0438\u0437\u0432\u0440\u0448\u0438\u0442\u0438 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435. \u041E\u0434\u043D\u043E\u0441 \u043E\u0432\u0435 \u0446\u0438\u0444\u0440\u0435 \u043F\u0440\u0435\u043C\u0430 \u0431\u0440\u043E\u0458 \u0441\u0432\u0438\u0445 \u0438\u0437\u0432\u0440\u0448\u0438\u0442\u0435\u0459\u0430 \ + \u0434\u0430\u0458\u0435 \u0432\u0430\u043C \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u043E\u0441\u0442 \u0440\u0435\u0441\u0443\u0440\u0441\u0430. \u0410\u043A\u043E \u043D\u0438\u0458\u0435\u0434\u0430\u043D \u043E\u0434 \u0438\u0437\u0432\u0440\u0448\u0438\u0442\u0435\u0459\u0430 \u043D\u0438\u0458\u0435 \u0441\u043B\u043E\u0431\u043E\u0434\u0430\u043D \ + \u0437\u0430 \u0434\u0443\u0436\u0435 \u0432\u0440\u0435\u043C\u0435, \u043C\u043E\u0436\u0434\u0430 \u0431\u0438 \u0442\u0440\u0435\u0431\u0430\u043B\u043E \u0434\u043E\u0434\u0430\u0442\u0438 \u0432\u0438\u0448\u0435 \u043C\u0430\u0448\u0438\u043D\u0430 \u0443 \u0432\u0430\u0448\u0443 Jenkins \u0433\u0440\u0443\u043F\u0443.\ +
        \ +
        \u0414\u0443\u0436\u0438\u043D\u0430 \u0440\u0435\u0434\u0430
        \ +
        \ + \u0411\u0440\u043E\u0458 \u0437\u0430\u0434\u0430\u0442\u0430\u043A\u0430 \u043A\u043E\u0458\u0438 \u0441\u0435 \u043D\u0430\u043B\u0430\u0437\u0435 \u0443 \u0440\u0435\u0434\u0443 \u0437\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0443, \u0447\u0435\u043A\u0430\u0458\u0443\u045B\u0438 \ + \u0441\u043B\u043E\u0431\u043E\u0434\u043D\u043E\u0433 \u0438\u0437\u0432\u0440\u0448\u0438\u0442\u0435\u0459\u0430 (\u043D\u0430 \u043E\u0432\u043E\u0458 \u043C\u0430\u0448\u0438\u043D\u0438, \u0441\u0430 \u043E\u0432\u043E\u043C \u043B\u0430\u0431\u0435\u043B\u043E\u043C, \u0446\u0435\u043B\u0438\u043C Jenkins-\u043E\u043C) \ + \u0426\u0438\u0444\u0440\u0430 \u043D\u0435 \u0443\u043A\u0459\u0443\u0447\u0443\u0458\u0435 \u0437\u0430\u0434\u0430\u0442\u043A\u0435 \u043F\u043E\u0434 \u0442\u0438\u0445\u0438\u043C \u0440\u0435\u0436\u0438\u043C\u043E\u043C, \u043D\u0438\u0442\u0438 \ + \u0437\u0430\u0434\u0430\u0442\u043A\u0435 \u043A\u043E\u0458\u0438 \u0441\u0443 \u0443 \u0440\u0435\u0434\u0443 \u0437\u0430\u0448\u0442\u043E \u043F\u0440\u0435\u0442\u0445\u043E\u0434\u043D\u0435 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 \u0441\u0443 \u0458\u043E\u0448 \u0443\u0432\u0435\u043A \u0443 \u0442\u043E\u043A\u0443. \ + \u0410\u043A\u043E \u0431\u0440\u043E\u0458 \u043F\u0440\u0435\u0452\u0435 \u043F\u0440\u0435\u043A\u043E 0, Jenkins \u045B\u0435 \u0438\u0437\u0432\u0440\u0448\u0438\u0442\u0438 \u0437\u0430\u0434\u0430\u0442\u043A\u0435 \u0442\u0430\u043A\u043E \u0448\u0442\u043E \u045B\u0435 \u0434\u043E\u0434\u0430\u0442\u0438 \u0458\u043E\u0448 \u043C\u0430\u0448\u0438\u043D\u0430. \ +
        \ +
        \ +

        \u0411\u0435\u043B\u0435\u0448\u043A\u0430: \u0411\u0440\u043E\u0458 \u0437\u0430\u0443\u0437\u0435\u0442\u0438\u0445 \u0438 \u0441\u043B\u043E\u0431\u043E\u0434\u043D\u0438\u0445 \u0438\u0437\u0432\u0440\u0448\u0438\u0442\u0435\u0459\u0430 \u043D\u0435\u043C\u043E\u0440\u0430 \u0431\u0438\u0442\u0438 \ + \u0458\u0435\u0434\u043D\u0430\u043A \u0431\u0440\u043E\u0458\u0443 \u043F\u043E\u0432\u0435\u0437\u0430\u043D\u0438\u0445 \u0438\u0437\u0432\u0440\u0448\u0438\u0442\u0435\u0459\u0430, \u0437\u0430\u0448\u0442\u043E \u0438\u0437\u0432\u0440\u0448\u0438\u0442\u0435\u0459\u0438 \u043C\u043E\u0433\u0443 \u0431\u0438\u0442\u0438 \u0441\u0443\u0441\u043F\u0435\u043D\u0434\u043E\u0432\u0430\u043D\u0438 \ + \u0438 \u043F\u0440\u0435\u043C\u0430 \u0442\u043E\u043C\u0435 \u043D\u0438\u0442\u0438 \u0437\u0430\u0443\u0437\u0435\u0442\u0438\u0430 \u043D\u0438 \u0441\u043B\u043E\u0431\u043E\u0434\u043D\u0438\u0430.

        \ +

        \u0413\u0440\u0430\u0444\u0438\u043A\u043E\u043D \u0458\u0435 \u0435\u043A\u0441\u043F\u043E\u043D\u0435\u043D\u0446\u0438\u0430\u043B\u043D\u0438 \u043F\u043E\u043A\u0440\u0435\u0442\u043D\u0438 \u043F\u0440\u0435\u0441\u0435\u043A \u043E\u0434 \u043F\u0435\u0440\u0438\u043E\u0434\u0438\u0447\u043D\u043E \u043F\u0440\u0438\u043A\u0443\u043F\u0459\u0435\u043D\u0435 \u0432\u0440\u0435\u0434\u043D\u043E\u0441\u0442\u0438. \ + 3 \u0440\u0430\u0441\u043F\u043E\u043D\u0430 \u0441\u0443 \u0430\u0436\u0443\u0440\u0438\u0440\u0430\u043D\u0430 \u0441\u0432\u0430\u043A\u0438\u0445 10 \u0441\u0435\u043A\u0443\u043D\u0434\u0438, 1 \u043C\u0438\u043D\u0443\u0442\u0430 \u0438 1 \u0447\u0430\u0441\u0430.

        + diff --git a/core/src/main/resources/hudson/model/Messages.properties b/core/src/main/resources/hudson/model/Messages.properties index f6d08fbd1f6049e5a27a9622796d188b3e541db1..18471360b3280a211bd09919e1ae38e6def60d02 100644 --- a/core/src/main/resources/hudson/model/Messages.properties +++ b/core/src/main/resources/hudson/model/Messages.properties @@ -31,6 +31,7 @@ AbstractBuild.KeptBecause=This build is kept because of {0}. AbstractItem.NoSuchJobExists=No such job \u2018{0}\u2019 exists. Perhaps you meant \u2018{1}\u2019? AbstractItem.NoSuchJobExistsWithoutSuggestion=No such job \u2018{0}\u2019 exists. AbstractItem.Pronoun=Item +AbstractItem.TaskNoun=Build AbstractProject.AssignedLabelString_NoMatch_DidYouMean=There\u2019s no agent/cloud that matches this assignment. Did you mean \u2018{1}\u2019 instead of \u2018{0}\u2019? AbstractProject.NewBuildForWorkspace=Scheduling a new build to get a workspace. AbstractProject.AwaitingBuildForWorkspace=Awaiting build to get a workspace. @@ -149,8 +150,8 @@ Hudson.NotANegativeNumber=Not a negative number Hudson.NotUsesUTF8ToDecodeURL=\ Your container doesn\u2019t use UTF-8 to decode URLs. If you use non-ASCII characters as a job name etc, \ this will cause problems. \ - See Containers and \ - Tomcat i18n for more details. + See Containers and \ + Tomcat i18n for more details. Hudson.AdministerPermission.Description=\ This permission grants the ability to make system-wide configuration changes, \ as well as perform highly sensitive operations that amounts to full local system access \ @@ -194,6 +195,8 @@ Queue.Unknown=??? Queue.WaitingForNextAvailableExecutor=Waiting for next available executor Queue.WaitingForNextAvailableExecutorOn=Waiting for next available executor on {0} Queue.init=Restoring the build queue +Queue.node_has_been_removed_from_configuration={0} has been removed from configuration +Queue.executor_slot_already_in_use=Executor slot already in use ResultTrend.Aborted=Aborted ResultTrend.Failure=Failure @@ -261,7 +264,9 @@ View.ConfigurePermission.Description=\ View.ReadPermission.Description=\ This permission allows users to see views (implied by generic read access). View.MissingMode=No view type is specified - +View.DisplayNameNotUniqueWarning=The display name, "{0}", is already in use by another view and \ + could cause confusion and delay. +UpdateCenter.DisplayName=Update Center UpdateCenter.Status.CheckingInternet=Checking internet connectivity UpdateCenter.Status.CheckingJavaNet=Checking update center connectivity UpdateCenter.Status.Success=Success @@ -272,6 +277,8 @@ UpdateCenter.Status.ConnectionFailed=\ Failed to connect to {0}. \ Perhaps you need to configure HTTP proxy? UpdateCenter.init=Initialing update center +UpdateCenter.CoreUpdateMonitor.DisplayName=Jenkins Update Notification + UpdateCenter.PluginCategory.android=Android Development UpdateCenter.PluginCategory.builder=Build Tools UpdateCenter.PluginCategory.buildwrapper=Build Wrappers @@ -333,7 +340,7 @@ PasswordParameterDefinition.DisplayName=Password Parameter Node.BecauseNodeIsReserved={0} is reserved for jobs with matching label expression Node.BecauseNodeIsNotAcceptingTasks={0} is not accepting tasks Node.LabelMissing={0} doesn\u2019t have label {1} -Node.LackingBuildPermission={0} doesn\u2019t have a permission to run on {1} +Node.LackingBuildPermission={0} lacks permission to run on {1} Node.Mode.NORMAL=Use this node as much as possible Node.Mode.EXCLUSIVE=Only build jobs with label expressions matching this node @@ -380,5 +387,3 @@ Jenkins.IsRestarting=Jenkins is restarting User.IllegalUsername="{0}" is prohibited as a username for security reasons. User.IllegalFullname="{0}" is prohibited as a full name for security reasons. - -Hudson.NoParamsSpecified=No Parameters are specified for this parameterized build diff --git a/core/src/main/resources/hudson/model/Messages_bg.properties b/core/src/main/resources/hudson/model/Messages_bg.properties index ce334d720b5728d79786ebd635f682874baecc6c..7bfea657a253452bc3cbd71403f548251f04ef96 100644 --- a/core/src/main/resources/hudson/model/Messages_bg.properties +++ b/core/src/main/resources/hudson/model/Messages_bg.properties @@ -221,9 +221,9 @@ Hudson.NotUsesUTF8ToDecodeURL=\ \u041a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044a\u0442 \u0437\u0430 \u0441\u044a\u0440\u0432\u043b\u0435\u0442\u0438 \u043d\u0435 \u0438\u0437\u043f\u043e\u043b\u0437\u0432\u0430 UTF-8 \u0437\u0430 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u0430\u043d\u0435 \u043d\u0430 \u0430\u0434\u0440\u0435\u0441\u0438. \u0417\u043d\u0430\u0446\u0438\ \u0438\u0437\u0432\u044a\u043d ASCII \u0432 \u0438\u043c\u0435\u043d\u0430\u0442\u0430 \u043d\u0430 \u0437\u0430\u0434\u0430\u0447\u0438 \u0438 \u0434\u0440. \u0449\u0435 \u043f\u0440\u0438\u0447\u0438\u043d\u044f\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0438. \u0417\u0430 \u043f\u043e\u0432\u0435\u0447\u0435\ \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043f\u043e\u0433\u043b\u0435\u0434\u043d\u0435\u0442\u0435\ - \u041a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0438\ + \u041a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0438\ \u0438\ - \ + \ \u0418\u043d\u0442\u0435\u0440\u043d\u0430\u0446\u0438\u043e\u043d\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0430 Tomcat. Hudson.AdministerPermission.Description=\ \u0422\u043e\u0432\u0430 \u0434\u0430\u0432\u0430 \u043f\u0440\u0430\u0432\u043e \u0437\u0430 \u043f\u0440\u043e\u043c\u044f\u043d\u0430 \u043d\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u0438\u0442\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438, \u043a\u0430\u043a\u0442\u043e \u0438 \u043f\u044a\u043b\u0435\u043d \u0434\u043e\u0441\u0442\u044a\u043f \u0434\u043e\ diff --git a/core/src/main/resources/hudson/model/Messages_de.properties b/core/src/main/resources/hudson/model/Messages_de.properties index 24789d48a8022ba20d5fb33c52496c9d358a11f6..f20b64671e1ddf656c8eee320d61eb9bb98e0c20 100644 --- a/core/src/main/resources/hudson/model/Messages_de.properties +++ b/core/src/main/resources/hudson/model/Messages_de.properties @@ -118,8 +118,8 @@ Hudson.NotANegativeNumber=Keine negative Zahl. Hudson.NotUsesUTF8ToDecodeURL=\ Ihr Container verwendet kein UTF-8, um URLs zu dekodieren. Falls Sie Nicht-ASCII-Zeichen \ in Jobnamen usw. verwenden, kann dies Probleme mit sich bringen. Beachten Sie bitte die Hinweise zu \ - Containern bzw. \ - Tomcat i18N). + Containern bzw. \ + Tomcat i18N). Hudson.AdministerPermission.Description=\ Dieses Recht erlaubt systemweite Konfigurations\u00e4nderungen, sowie sensitive Operationen \ die vollst\u00e4ndigen Zugriff auf das lokale Dateisystem bieten (in den Grenzen des \ diff --git a/core/src/main/resources/hudson/model/Messages_es.properties b/core/src/main/resources/hudson/model/Messages_es.properties index d1f693619dd5c4e2f27a45e77361d81d06aea643..47f01fc3316db340756859871d074b76c3d8b8df 100644 --- a/core/src/main/resources/hudson/model/Messages_es.properties +++ b/core/src/main/resources/hudson/model/Messages_es.properties @@ -99,8 +99,8 @@ Hudson.NotANegativeNumber=No es un n\u00famero negativo Hudson.NotUsesUTF8ToDecodeURL=\ El contenedor de servlets no usa UTF-8 para decodificar URLs. Esto causar\u00e1 problemas si se usan nombres \ con caracteres no ASCII. Echa un vistazo a \ - Containers y a \ - Tomcat i18n para mas detalles. + Containers y a \ + Tomcat i18n para mas detalles. Hudson.AdministerPermission.Description=\ Este permiso garantiza la posibilidad de hacer cambios de configuraci\u00f3n en el sistema, \ as\u00ed como el realizar operaciones sobre el sistema de archivos local. \ diff --git a/core/src/main/resources/hudson/model/Messages_fr.properties b/core/src/main/resources/hudson/model/Messages_fr.properties index 30e1b2e65b3fafd738d675c6a91472458018807a..d1ded2fc0fd08985109baf983d6ec936d29b844e 100644 --- a/core/src/main/resources/hudson/model/Messages_fr.properties +++ b/core/src/main/resources/hudson/model/Messages_fr.properties @@ -79,8 +79,8 @@ Hudson.NotANegativeNumber=Ceci n''est pas un nombre n\u00e9gatif Hudson.NotUsesUTF8ToDecodeURL=\ Votre conteneur n''utilise pas UTF-8 pour d\u00e9coder les URLs. Si vous utilisez des caract\u00e8res non-ASCII \ dans le nom d''un job ou autre, cela causera des probl\u00e8mes. \ - Consultez les pages sur les conteneurs et \ - sur Tomcat i18n pour plus de d\u00e9tails. + Consultez les pages sur les conteneurs et \ + sur Tomcat i18n pour plus de d\u00e9tails. Hudson.AdministerPermission.Description=\ Ce droit permet de faire des changements de configuration au niveau de tout le syst\u00e8me, \ et de r\u00e9aliser des op\u00e9rations tr\u00e8s d\u00e9licates qui n\u00e9cessitent un acc\u00e8s complet \u00e0 tout le syst\u00e8me \ diff --git a/core/src/main/resources/hudson/model/Messages_it.properties b/core/src/main/resources/hudson/model/Messages_it.properties index 8458a59a89565bda36b45c14a24878a60b3ac82d..3b7bbdf392e55b4694ff0b3cb72f1c8f7b1453b1 100644 --- a/core/src/main/resources/hudson/model/Messages_it.properties +++ b/core/src/main/resources/hudson/model/Messages_it.properties @@ -107,8 +107,8 @@ Hudson.NotANegativeNumber=Non \u00e8 un numero negativo Hudson.NotUsesUTF8ToDecodeURL=\ Your container doesn''t use UTF-8 to decode URLs. If you use non-ASCII characters as a job name etc, \ this will cause problems. \ - See Containers and \ - Tomcat i18n for more details. + See Containers and \ + Tomcat i18n for more details. Hudson.AdministerPermission.Description=\ This permission grants the ability to make system-wide configuration changes, \ as well as perform highly sensitive operations that amounts to full local system access \ diff --git a/core/src/main/resources/hudson/model/Messages_ja.properties b/core/src/main/resources/hudson/model/Messages_ja.properties index 3d51ee20c7170e3d7a519c978e0a26637f468ce6..98e610f5c9c22a951609845c99c3c9caf6c411af 100644 --- a/core/src/main/resources/hudson/model/Messages_ja.properties +++ b/core/src/main/resources/hudson/model/Messages_ja.properties @@ -114,8 +114,8 @@ Hudson.NotANonNegativeNumber=0\u4ee5\u4e0a\u306e\u6570\u5b57\u3092\u6307\u5b9a\u Hudson.NotANegativeNumber=\u8ca0\u306e\u6570\u5b57\u3092\u6307\u5b9a\u3057\u3066\u304f\u3060\u3055\u3044\u3002 Hudson.NotUsesUTF8ToDecodeURL=\ URL\u304cUTF-8\u3067\u30c7\u30b3\u30fc\u30c9\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002\u30b8\u30e7\u30d6\u540d\u306a\u3069\u306bnon-ASCII\u306a\u6587\u5b57\u3092\u4f7f\u7528\u3059\u308b\u5834\u5408\u306f\u3001\ - \u30b3\u30f3\u30c6\u30ca\u306e\u8a2d\u5b9a\u3084\ - Tomcat i18N\u3092\u53c2\u8003\u306b\u8a2d\u5b9a\u3057\u3066\u304f\u3060\u3055\u3044\u3002 + \u30b3\u30f3\u30c6\u30ca\u306e\u8a2d\u5b9a\u3084\ + Tomcat i18N\u3092\u53c2\u8003\u306b\u8a2d\u5b9a\u3057\u3066\u304f\u3060\u3055\u3044\u3002 Hudson.AdministerPermission.Description=\ (OS\u304c\u8a31\u53ef\u3059\u308b\u7bc4\u56f2\u5185\u3067\u306e\uff09\u30ed\u30fc\u30ab\u30eb\u30b7\u30b9\u30c6\u30e0\u5168\u4f53\u3078\u306e\u30a2\u30af\u30bb\u30b9\u306b\u76f8\u5f53\u3059\u308b\u3001\ \u3068\u3066\u3082\u6ce8\u610f\u304c\u5fc5\u8981\u306a\u64cd\u4f5c\u3068\u540c\u7a0b\u5ea6\u306e\u3001\u30b7\u30b9\u30c6\u30e0\u5168\u4f53\u306e\u8a2d\u5b9a\u5909\u66f4\u3092\u8a31\u53ef\u3057\u307e\u3059\u3002 diff --git a/core/src/main/resources/hudson/model/Messages_lt.properties b/core/src/main/resources/hudson/model/Messages_lt.properties index 6be646658f3caa9280547d43bb742e7cd4427f68..a820b31b50a695e988414a86fac07df9a97c35c8 100644 --- a/core/src/main/resources/hudson/model/Messages_lt.properties +++ b/core/src/main/resources/hudson/model/Messages_lt.properties @@ -123,8 +123,8 @@ 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. + 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 \ diff --git a/core/src/main/resources/hudson/model/Messages_pl.properties b/core/src/main/resources/hudson/model/Messages_pl.properties index 2430967bbe64fd5baa4c86828a386fc7583afc39..5baa85e5ee0afb292d573776503dca1cb752e8b2 100644 --- a/core/src/main/resources/hudson/model/Messages_pl.properties +++ b/core/src/main/resources/hudson/model/Messages_pl.properties @@ -1,25 +1,49 @@ +# The MIT License +# +# Copyright (c) 2004-2017, Sun Microsystems, Damian Szczepanik +# +# 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. ParametersDefinitionProperty.DisplayName=To zadanie jest sparametryzowane +StringParameterDefinition.DisplayName=Tekst +TextParameterDefinition.DisplayName=Tekst wielolinijkowy +FileParameterDefinition.DisplayName=Plik +BooleanParameterDefinition.DisplayName=Warto\u015B\u0107 logiczna +ChoiceParameterDefinition.DisplayName=Lista wyboru +ChoiceParameterDefinition.MissingChoices=Nie podano warto\u015Bci +PasswordParameterDefinition.DisplayName=Has\u0142o ManageJenkinsAction.DisplayName=Zarz\u0105dzaj Jenkinsem - Job.AllRecentBuildFailed=Wszystkie ostatnie zadania nie powiod\u0142y si\u0119. Job.BuildStability=Stabilno\u015B\u0107 zada\u0144: {0} Job.NOfMFailed={0} spo\u015Br\u00F3d {1} ostatnich zada\u0144 nie powiod\u0142o si\u0119. Job.NoRecentBuildFailed=Brak ostatnich zada\u0144 zako\u0144czonych niepowodzeniem. AbstractProject.Pronoun=Projekt AbstractItem.Pronoun=Projekt - AbstractProject.WorkspaceTitle=Przestrze\u0144 robocza {0} AbstractProject.WorkspaceTitleOnComputer=Przestrze\u0144 robocza {0} na {1} - -BallColor.Aborted=Przerwany -BallColor.Disabled=Zablokowany -BallColor.Failed=Nie powi\u00F3d\u0142 si\u0119 +BallColor.Aborted=Przerwane +BallColor.Disabled=Zablokowane +BallColor.Failed=Nie powiod\u0142o si\u0119 BallColor.InProgress=W trakcie BallColor.NotBuilt=Brak uruchomie\u0144 BallColor.Pending=W oczekiwaniu BallColor.Success=Sukces -BallColor.Unstable=Niestabilny - +BallColor.Unstable=Niestabilne Permalink.LastBuild=Ostatnie zadanie Permalink.LastStableBuild=Ostatnie stabilne zadanie Permalink.LastUnstableBuild=Ostatnie niestabilne zadanie @@ -27,23 +51,31 @@ Permalink.LastUnsuccessfulBuild=Ostatnie niepomy\u015Blne zadanie Permalink.LastSuccessfulBuild=Ostatnie pomy\u015Blne zadanie Permalink.LastFailedBuild=Ostatnie niepomy\u015Blne zadanie Permalink.LastCompletedBuild=Ostatnie zako\u0144czone zadanie - -Run.Summary.Stable=stabilny -Run.Summary.Unstable=niestabilny -Run.Summary.Aborted=przerwany +Run.InProgressDuration={0} i nadal trwa +Run.Summary.Stable=stabilne +Run.Summary.Unstable=niestabilne +Run.Summary.Aborted=przerwane Run.Summary.NotBuilt=brak zada\u0144 -Run.Summary.BackToNormal=ponownie stabilny -Run.Summary.BrokenForALongTime=nieudany od dawna -Run.Summary.BrokenSinceThisBuild=nieudany od tego zadania -Run.Summary.BrokenSince=nieudany od zadania {0} +Run.Summary.BackToNormal=ponownie stabilne +Run.Summary.BrokenForALongTime=nieudane od dawna +Run.Summary.BrokenSinceThisBuild=nieudane od tego zadania +Run.Summary.BrokenSince=nieudane od zadania {0} Run.Summary.Unknown=? - +UpdateCenter.DisplayName=Centrum aktualizacji UpdateCenter.DownloadButNotActivated=Pobrana pomy\u015Blnie. Zostanie w\u0142\u0105czona podczas ponownego uruchomienia Jenkinsa UpdateCenter.Status.CheckingInternet=Sprawdzanie po\u0142\u0105czenia z Internetem UpdateCenter.Status.CheckingJavaNet=Sprawdzanie po\u0142\u0105czenia z centrum aktualizacji UpdateCenter.Status.Success=Zako\u0144czono pomy\u015Blnie - MyViewsProperty.DisplayName=Moje widoki MyViewsProperty.GlobalAction.DisplayName=Moje widoki - -FreeStyleProject.Description=To jest podstawowa funkcja Jenkinsa. Jenkins stworzy projekt \u0142\u0105cz\u0105cy dowolny SCM z dowolnym systemem buduj\u0105cym, mo\u017Ce to by\u0107 r\u00F3wnie\u017C wykorzystane do czego\u015B innego ni\u017C budowanie oprogramowania. \ No newline at end of file +FreeStyleProject.Description=To jest podstawowa funkcja Jenkinsa. Jenkins stworzy projekt \u0142\u0105cz\u0105cy dowolny SCM z dowolnym systemem buduj\u0105cym, mo\u017Ce to by\u0107 r\u00F3wnie\u017C wykorzystane do czego\u015B innego ni\u017C budowanie oprogramowania. +FreeStyleProject.DisplayName=Og\u00F3lny projekt +Node.Mode.NORMAL=Wykorzystuj ten w\u0119ze\u0142 tak bardzo, jak to tylko mo\u017Cliwe +ComputerSet.DisplayName=W\u0119z\u0142y +Hudson.DisplayName=Jenkins +ListView.DisplayName=Widok listy +MyView.DisplayName=M\u00F3j widok +Node.Mode.EXCLUSIVE=Uruchamiaj te projekty, kt\u00F3re maj\u0105 etykiet\u0119 pasuj\u0105c\u0105 do tego w\u0119\u017C\u0142a +Hudson.ViewName=Wszystkie +RunParameterDefinition.DisplayName=Parametr uruchomienia# SCM check out aborted +Hudson.JobAlreadyExists=Projekt o nazwie \u2018{0}\u2019 ju\u017C istnieje diff --git a/core/src/main/resources/hudson/model/Messages_pt_BR.properties b/core/src/main/resources/hudson/model/Messages_pt_BR.properties index 4ed07299f1ed91f75daa52fd131ca2bcbbc322d2..f3519390d1cab95113277cf89b7087cc7ae2bf0f 100644 --- a/core/src/main/resources/hudson/model/Messages_pt_BR.properties +++ b/core/src/main/resources/hudson/model/Messages_pt_BR.properties @@ -194,8 +194,8 @@ UpdateCenter.Status.UnknownHostException=Erro ao resolver o no # \ # Your container doesn''t use UTF-8 to decode URLs. If you use non-ASCII characters as a job name etc, \ # this will cause problems. \ -# See Containers and \ -# Tomcat i18n for more details. +# See Containers and \ +# Tomcat i18n for more details. Hudson.NotUsesUTF8ToDecodeURL=n\u00e3o use caracteres UTF-8 nas URLs # Checking internet connectivity UpdateCenter.Status.CheckingInternet=Checando conex\u00e3o com a Internet diff --git a/core/src/main/resources/hudson/model/Messages_sr.properties b/core/src/main/resources/hudson/model/Messages_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..7a47af65a8795db0e2b26d326f35758179e50de1 --- /dev/null +++ b/core/src/main/resources/hudson/model/Messages_sr.properties @@ -0,0 +1,292 @@ +# This file is under the MIT License by authors + +AbstractBuild.BuildingRemotely=\u0418\u0437\u0433\u0440\u0430\u0434\u045A\u0430 \u0441\u0430 \u0434\u0430\u043B\u0435\u043A\u0430 \u043D\u0430 "{0}" +AbstractBuild.BuildingOnMaster=\u0418\u0437\u0433\u0440\u0430\u0434\u045A\u0430 \u043D\u0430 \u0433\u043B\u0430\u0432\u043D\u043E\u043C \u0441\u0435\u0440\u0432\u0435\u0440\u0443 +AbstractBuild_Building=\u0418\u0437\u0433\u0440\u0430\u0434\u045A\u0430 +AbstractBuild.BuildingInWorkspace=\u043D\u0430 \u0440\u0430\u0434\u043D\u043E\u043C \u043F\u0440\u043E\u0441\u0442\u043E\u0440\u0443 "{0}" +AbstractBuild.KeptBecause=\u041E\u0432\u043E \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 \u0458\u0435 \u0441\u0430\u0447\u0443\u0432\u0430\u043D\u043E \u0437\u0431\u043E\u0433 {0}. +AbstractItem.NoSuchJobExists=\u041D\u0435 \u043F\u043E\u0441\u0442\u043E\u0458\u0438 \u0437\u0430\u0434\u0430\u0442\u0430\u043A "{0}". \u0414\u0430 \u043B\u0438 \u0441\u0442\u0435 \u0438\u043C\u0430\u043B\u0438 "{1}"? +AbstractItem.NoSuchJobExistsWithoutSuggestion=\u041D\u0435 \u043F\u043E\u0441\u0442\u043E\u0458\u0438 \u0437\u0430\u0434\u0430\u0442\u0430\u043A \u0441\u0430 \u0438\u043C\u0435\u043D\u043E\u043C "{0}". +AbstractItem.Pronoun=\u043E\u0431\u0458\u0435\u043A\u0430\u0442 +AbstractProject.AssignedLabelString_NoMatch_DidYouMean=\u041D\u0435\u043C\u0430 \u0442\u0430\u043A\u0432\u043E\u0433 \u0430\u0433\u0435\u043D\u0442\u0430/cloud. \u0414\u0430 \u043B\u0438 \u0441\u0442\u0435 \u043C\u0438\u0441\u043B\u0438\u043B\u0438 "{1}" \u043D\u0430 \u0443\u043C\u0443 \u0443\u043C\u0435\u0441\u0442\u043E "{0}"? +AbstractProject.NewBuildForWorkspace=\u0417\u0430\u043A\u0430\u0437\u0438\u0432\u0430\u045A\u0435 \u043D\u043E\u0432\u0435 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 \u0434\u0430 \u0431\u0438 \u0441\u0435 \u0434\u043E\u0431\u0438\u043E \u043D\u043E\u0432\u0438 \u0440\u0430\u0434\u043D\u0438 \u043F\u0440\u043E\u0441\u0442\u043E\u0440. +AbstractProject.Pronoun=\u041F\u0440\u043E\u0458\u0435\u043A\u0430\u0442 +AbstractProject.AwaitingWorkspaceToComeOnline=\u041F\u043E\u043A\u0440\u0435\u043D\u0438\u0442\u0435 \u043D\u043E\u0432\u0443 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0443 \u0434\u0430 \u0431\u0438 \u0441\u0442\u0435 \u0434\u043E\u0431\u0438\u043B\u0438 \u0440\u0430\u0434\u043D\u0438 \u043F\u0440\u043E\u0441\u0442\u043E\u0440. \u0427\u0435\u043A\u0430\u045A\u0435 {0}ms \u0441\u0430 \u043D\u0430\u0434\u043E\u043C \u0434\u0430 \u045B\u0435 \u0458\u0435\u043D\u0430\u043D \u0431\u0438\u0442\u0438 \u043E\u0441\u043B\u043E\u0431\u043E\u0452\u0435\u043D. +AbstractProject.AwaitingBuildForWorkspace=\u0427\u0435\u043A\u0430\u045A\u0435 \u0437\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0443, \u0434\u0430 \u0431\u0438 \u0441\u0435 \u0434\u043E\u0431\u0438\u043E \u0440\u0430\u0434\u043D\u0438 \u043F\u0440\u043E\u0441\u0442\u043E\u0440. +AbstractProject.Aborted=\u041F\u0440\u0435\u043A\u0438\u043D\u0443\u0442\u043E +AbstractProject.UpstreamBuildInProgress=\u0418\u0437\u0433\u0440\u0430\u0434\u045A\u0430 \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u0430 {0}, \u043E\u0434 \u043A\u043E\u0433\u0430 \u0437\u0430\u0432\u0438\u0441\u0438 \u043E\u0432\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430, \u0458\u0435 \u043F\u043E\u043A\u0440\u0435\u043D\u0443\u0442. +AbstractProject.DownstreamBuildInProgress=\u0418\u0437\u0433\u0440\u0430\u0434\u045A\u0430 \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u0430 {0}, \u043A\u043E\u0458\u0438 \u0437\u0430\u0432\u0438\u0441\u0438 \u043D\u0430 \u043E\u0432\u043E\u043C, \u0458\u0435 \u043F\u043E\u043A\u0440\u0435\u043D\u0443\u0442\u0430. +AbstractProject.Disabled=\u0418\u0437\u0433\u0440\u0430\u0434\u045A\u0430 \u0458\u0435 \u043E\u043D\u0435\u043C\u043E\u0433\u0443\u045B\u0435\u043D\u0430 +AbstractProject.NoBuilds=\u041D\u0435 \u043F\u043E\u0441\u0442\u043E\u0458\u0438 \u043D\u0438 \u0458\u0435\u0434\u043D\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430. \u0417\u0430\u043A\u0430\u0437\u0438\u0432\u0430\u045A\u0435 \u043D\u043E\u0432\u0435 \u0443 \u0442\u043E\u043A\u0443. +AbstractProject.NoSCM=\u041D\u0435 \u043F\u043E\u0441\u0442\u043E\u0458\u0438 \u0441\u0438\u0441\u0442\u0435\u043C \u0437\u0430 \u043A\u043E\u043D\u0442\u0440\u043E\u043B\u0443 \u0438\u0437\u0432\u043E\u0440\u043D\u043E\u0433 \u043A\u043E\u0434\u0430 +AbstractProject.NoWorkspace=\u041D\u0438\u0458\u0435 \u043C\u043E\u0433\u043B\u043E \u0443\u0447\u0438\u0442\u0430\u0442\u0438 \u043D\u0430\u0434\u0433\u0440\u0430\u0434\u045A\u0430 \u0437\u0430\u0448\u0442\u043E \u043D\u0435\u043C\u0430 \u0441\u043B\u043E\u0431\u043E\u0434\u043D\u043E\u0433 \u0440\u0430\u0434\u043D\u043E\u0433 \u043F\u0440\u043E\u0441\u0442\u043E\u0440\u0430. +UpdateCenter.PluginCategory.devops=DevOps +UpdateCenter.PluginCategory.dotnet=.NET \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u0438\u0440\u0430\u045A\u0435 +UpdateCenter.PluginCategory.database=\u0411\u0430\u0437\u0430 \u043F\u043E\u0434\u0430\u0442\u0430\u043A\u0430 +UpdateCenter.PluginCategory.deployment=\u0418\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u0430 +UpdateCenter.PluginCategory.external=\u0418\u043D\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0458\u0430 \u0435\u043A\u0441\u0442\u0435\u0440\u043D\u0438\u043C \u0441\u0435\u0440\u0432\u0438\u0441\u0438\u043C\u0430 \u0438 \u0430\u043B\u0430\u0442\u0438\u043C\u0430 +UpdateCenter.PluginCategory.groovy-related=\u0423 \u0432\u0435\u0437\u0438 \u0441\u0430 Groovy +UpdateCenter.PluginCategory.ios=iOS \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u0438\u0440\u0430\u045A\u0435 +UpdateCenter.PluginCategory.library=\u0411\u0438\u0431\u043B\u0438\u043E\u0442\u0435\u043A\u0435 \u0437\u0430 \u043C\u043E\u0434\u0443\u043B\u0435 (\u0443 \u043A\u043E\u0440\u0438\u0441\u0442 \u0434\u0440\u0443\u0433\u0438\u0445 \u043C\u043E\u0434\u0443\u043B\u0430) +UpdateCenter.PluginCategory.maven=Maven +UpdateCenter.PluginCategory.cluster=\u0423\u043F\u0440\u0430\u0432\u0459\u0430\u045A\u0435 \u043A\u043B\u0430\u0441\u0442\u0435\u0440\u0430 \u0438 \u0440\u0430\u0441\u043F\u043E\u0434\u0435\u0459\u0435\u043D\u043E \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 +UpdateCenter.PluginCategory.android=Android \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u0438\u0440\u0430\u045A\u0435 +UpdateCenter.PluginCategory.python=Python \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u0438\u0440\u0430\u045A\u0435 +UpdateCenter.PluginCategory.report=\u0418\u0437\u0432\u0435\u0448\u0442\u0430\u0458\u0438 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 +UpdateCenter.PluginCategory.ruby=Ruby \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u0438\u0440\u0430\u045A\u0435 +UpdateCenter.PluginCategory.scm=\u0421\u0438\u0441\u0442\u0435\u043C \u0437\u0430 \u0443\u043F\u0440\u0430\u0432\u0459\u0430\u045A\u0435 \u0438\u0437\u0432\u043E\u0440\u043D\u043E\u0433 \u043A\u043E\u0434\u0430 +UpdateCenter.PluginCategory.scala=Scala \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u0438\u0440\u0430\u045A\u0435 +UpdateCenter.PluginCategory.scm-related=\u0412\u0435\u0437\u0430\u043D\u043E \u0441\u0430 \u0441\u0438\u0441\u0442\u0435\u043C\u043E\u043C \u0437\u0430 \u0443\u043F\u0440\u0430\u0432\u0459\u0430\u045A\u0435 \u0438\u0437\u0432\u043E\u0440\u043D\u043E\u0433 \u043A\u043E\u0434\u0430 +UpdateCenter.PluginCategory.security=\u0411\u0435\u0437\u0431\u0435\u0434\u043D\u043E\u0441\u0442 +UpdateCenter.PluginCategory.slaves=\u041F\u043E\u043A\u0440\u0435\u0442\u0430\u045A\u0435 \u0438 \u0443\u043F\u0440\u0430\u0432\u0459\u0430\u045A\u0435 \u0430\u0433\u0435\u043D\u0430\u0442\u0430 +UpdateCenter.PluginCategory.test=\u0422\u0435\u0441\u0442\u0438\u0440\u0430\u045A\u0435 +UpdateCenter.PluginCategory.trigger=\u0410\u0443\u0442\u043E\u043C\u0430\u0442\u0441\u043A\u0438 \u0441\u0442\u0430\u0440\u0442 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 +\u043D\u0430\u043F\u0430\u0441\u0432\u0430= +AbstractProject.WorkspaceTitle=\u0420\u0430\u0434\u043D\u0438 \u043F\u0440\u043E\u0441\u0442\u043E\u0440 \u043E\u0434 {0} +AbstractProject.WorkspaceTitleOnComputer=\u0420\u0430\u0434\u043D\u0438 \u043F\u0440\u043E\u0441\u0442\u043E\u0440 {0} \u043D\u0430 {1} +AbstractProject.PollingABorted=\u041F\u0440\u043E\u0432\u0435\u0440\u0430 \u0441\u0438\u0441\u0442\u0435\u043C\u0430 \u0443\u043F\u0440\u0430\u0432\u0459\u0430\u045A\u0435 \u0438\u0437\u0432\u043E\u0440\u043D\u043E\u0433 \u043A\u043E\u0434\u0430 \u0458\u0435 \u0443\u043A\u0438\u043D\u0443\u0442\u043E +AbstractProject.PollingVetoed=\u0417\u0430\u0445\u0442\u0435\u0432\u0438 \u043F\u0440\u0435\u043C\u0430 \u0441\u0438\u0441\u0442\u0435\u043C\u0443 \u0443\u043F\u0440\u0430\u0432\u0459\u0430\u045A\u0430 \u0438\u0437\u0432\u043E\u0440\u043D\u043E\u0433 \u043A\u043E\u0434\u0430 \u0441\u0443 \u043F\u0440\u0438\u0432\u0440\u0435\u043C\u0435\u043D\u043E \u0441\u0443\u0441\u043F\u0435\u043D\u0434\u043E\u0432\u0430\u043D\u0438 \u043E\u0434 \u0441\u0442\u0440\u0430\u043D\u0435 {0}. +AbstractProject.ScmAborted=\u0423\u0447\u0438\u0442\u0430\u0432\u0430\u045A\u0435 \u043E\u0434 \u0441\u0438\u0441\u0442\u0435\u043C\u0430 \u0443\u043F\u0440\u0430\u0432\u0459\u0430\u045A\u0435 \u0438\u0437\u0432\u043E\u0440\u043D\u043E\u0433 \u043A\u043E\u0434\u0430 \u0458\u0435 \u043F\u0440\u0435\u043A\u0438\u043D\u0443\u0442\u043E +AbstractProject.WorkspaceOffline=\u0420\u0430\u0434\u043D\u0438 \u043F\u0440\u043E\u0441\u0442\u043E\u0440 \u0458\u0435 \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u0430\u043D +AbstractProject.BuildPermission.Description=\u041E\u0432\u0430 \u0434\u043E\u0437\u0432\u043E\u043B\u0430 \u043F\u0440\u0443\u0436\u0438 \u043C\u043E\u0433\u0443\u045B\u043D\u043E\u0441\u0442 \u0434\u0430 \u0441\u0435 \u0437\u0430\u043F\u043E\u0447\u043D\u0435 \u043D\u043E\u0432\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430. +AbstractProject.WorkspacePermission.Description=\u041E\u0432\u0430 \u0434\u043E\u0437\u0432\u043E\u043B\u0430 \u043F\u0440\u0443\u0436\u0438 \u043C\u043E\u0433\u0443\u045B\u043D\u043E\u0441\u0442 \u0434\u0430 \u0441\u0435 \u0443\u0447\u0438\u0442\u0430 \u0441\u0430\u0434\u0440\u0436\u0430\u0458 \u0440\u0430\u0434\u043D\u043E\u0433 \u043F\u0440\u043E\u0441\u0442\u043E\u0440\u0430. +Computer.Caption=\u0410\u0433\u0435\u043D\u0442 {0} +Computer.NoSuchSlaveExists=\u041D\u043C\u0435\u0430 \u0430\u0433\u0435\u043D\u0442\u0430 "{0}". \u0414\u0430 \u043B\u0438 \u0441\u0442\u0435 \u043C\u0438\u0441\u043B\u0438\u043B\u0438 "{1}" \u0443 \u0432\u0438\u0434\u0443? +AbstractProject.ExtendedReadPermission.Description=\u041E\u0432\u043E \u043F\u0440\u0430\u0432\u043E \u0434\u0430\u0458\u0435 \u043F\u0440\u0438\u0441\u0442\u0443\u043F \u043D\u0430 \u0447\u0438\u0442\u0430\u045A\u0435 \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u045A\u0430 \u043F\u0440\u043E\u0458\u0435\u043A\u0430\u0442\u0430, \u0430 \u043C\u043E\u0436\u0435 \u0434\u0430 \u0434\u043E\u0432\u0435\u0434\u0435 \u0434\u043E \u0448\u0438\u0440\u0435\u045A\u0435 \u0442\u0430\u0458\u043D\u0438 \u043A\u043E\u0458\u0435 \u0441\u0435 \u043D\u0430\u043B\u0430\u0437\u0435 \u043F\u043E \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0438 \u043A\u0430\u043E, \u043D\u0430 \u043F\u0440\u0438\u043C\u0435\u0440, \u043B\u043E\u0437\u0438\u043D\u043A\u0435. +AbstractProject.DiscoverPermission.Description=\u041E\u0432\u043E \u0434\u0430\u0458\u0435 \u043F\u0440\u0430\u0432\u043E \u043D\u0430 \u043E\u0442\u043A\u0440\u0438\u0432\u0430\u045A\u0435 \u0437\u0430\u0434\u0430\u0442\u0430\u043A\u0430, \u043A\u043E\u0458\u0438 \u043E\u043C\u043E\u0433\u0443\u045B\u0430\u0432\u0430 \u043F\u0440\u0435\u0443\u0441\u043C\u0435\u0440\u0430\u0432\u0430\u045A\u0435 \u0430\u043D\u043E\u043D\u0438\u043C\u043D\u0435 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u043A\u0435 \u043D\u0430 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0443 \u0437\u0430 \u043F\u0440\u0438\u0458\u0430\u0432\u0443 \u043A\u0430\u0434\u0430 \u0431\u0443\u0434\u0443 \u043F\u043E\u043A\u0443\u0448\u0430\u0432\u0430\u043B\u0438 \u0434\u0430 \u043E\u0442\u0432\u043E\u0440\u0435 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0443 \u043E\u0434\u0440\u0435\u0452\u0435\u043D\u043E\u0433 \u0437\u0430\u0434\u0430\u0442\u043A\u0430. \u0410\u043A\u043E \u043D\u0435\u043C\u0430\u0458\u0443 \u0434\u043E\u0432\u043B\u0430\u045B\u0435\u045A\u0435 \u043E\u043D\u0438 \u045B\u0435 \u0431\u0438\u0442\u0438 \u043F\u0440\u0435\u0443\u0441\u043C\u0435\u0440\u0435\u043D\u0438 \u0433\u0440\u0435\u0448\u0446\u0438 404 \u0438 \u043D\u0435\u045B\u0435 \u043C\u043E\u045B\u0438 \u043F\u0440\u0438\u0441\u0442\u0443\u043F\u0438\u0442\u0438 \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u043E\u043C. +AbstractProject.WipeOutPermission.Description=\u041E\u0432\u043E \u0434\u0430\u0458\u0435 \u043F\u0440\u0430\u0432\u043E \u0434\u0430 \u0443\u043A\u043B\u043E\u043D\u0438\u0442\u0435 \u0441\u0430\u0432 \u0441\u0430\u0434\u0440\u0436\u0430\u0458 \u0440\u0430\u0434\u043D\u043E\u0433 \u043F\u0440\u043E\u0441\u0442\u043E\u0440\u0430. +AbstractProject.CancelPermission.Description=\u041E\u0432\u043E \u0434\u0430\u0458\u0435 \u043F\u0440\u0430\u0432\u043E \u0434\u0430 \u043E\u0442\u043A\u0430\u0436\u0435\u0442\u0435 \u043F\u043B\u0430\u043D\u0438\u0440\u0430\u043D\u0435 \u0438 \u0437\u0430\u0443\u0441\u0442\u0430\u0432\u0438\u0442\u0435 \u043F\u043E\u043A\u0440\u0435\u043D\u0443\u0442\u0435 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435. +AbstractProject.AssignedLabelString.NoMatch=\u041D\u0435\u043C\u0430 \u0430\u0433\u0435\u043D\u0442/cloud \u0437\u0430\u0434\u0443\u0436\u0435\u043D \u043E\u0432\u0438\u043C \u0437\u0430\u0434\u0430\u0442\u043A\u043E\u043C +AbstractProject.AssignedLabelString.InvalidBooleanExpression=\u041F\u043E\u0433\u0440\u0435\u0448\u043D\u0438 \u0431\u0443\u043B\u043E\u0432 \u0438\u0437\u0440\u0430\u0437: {0} +AbstractProject.CustomWorkspaceEmpty=\u041F\u0440\u0438\u043B\u0430\u0433\u043E\u0452\u0435\u043D\u0438 \u0440\u0430\u0434\u043D\u0438 \u043F\u0440\u043E\u0441\u0442\u043E\u0440 \u0458\u0435 \u043F\u0440\u0430\u0437\u0430\u043D. +AbstractProject.LabelLink=\u041B\u0430\u0431\u0435\u043B\u0430 {1} \u0458\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u0438\u0440\u0430\u043D\u0430 {3,choice,0#\u043D\u0435\u043C\u0430 \u043C\u0430\u0448\u0438\u043D\u0430|1#1 \u043C\u0430\u0448\u0438\u043D\u0430|1<{3} \u043C\u0430\u0448\u0438\u043D\u0430\u043C\u0430}{4,choice,0#|1# \u0438 1 cloud|1< \u0438 {4} clouds} +Api.MultipleMatch=\u0418\u0437\u0440\u0430\u0437 \u043A\u0440\u043E\u0437 XPath "{0}" \u043E\u0434\u0433\u043E\u0432\u0430\u0440\u0430 \u043C\u0430\u0448\u0438\u043D\u0438 {1}. \u0423\u043D\u0435\u0441\u0438\u0442\u0435 \u0438\u0437\u0440\u0430\u0437 \u0438\u043B\u0438 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0430\u0440 "wrapper", \u0434\u0430 \u0438\u0445 \u0441\u0432\u0435 \u043F\u043E\u043A\u0440\u0438\u0458\u0435 \u0433\u043B\u0430\u0432\u043D\u0438 \u0435\u043B\u0435\u043C\u0435\u043D\u0442. +Api.NoXPathMatch=\u0418\u0437\u0440\u0430\u0437 \u043A\u0440\u043E\u0437 XPath "{0}" \u043D\u0438\u0458\u0435 \u043D\u0430\u0448\u0430\u043E \u043D\u0438 \u0458\u0435\u0434\u043D\u0443 \u043C\u0430\u0448\u0438\u043D\u0443. +BallColor.Aborted=\u041E\u0442\u043A\u0430\u0437\u0430\u043D\u043E +BallColor.Disabled=\u041E\u043D\u0435\u043C\u043E\u0433\u0443\u045B\u0435\u043D\u043E +BallColor.Failed=\u041D\u0438\u0458\u0435 \u0443\u0441\u043F\u0435\u043B\u043E +BallColor.InProgress=\u0423 \u0442\u043E\u043A\u0443 +BallColor.NotBuilt=\u041D\u0435\u0438\u0437\u0433\u0440\u0430\u0452\u0435\u043D\u043E +BallColor.Pending=\u041E\u0447\u0435\u043A\u0443\u0458\u0435 +BallColor.Success=\u0423\u0441\u043F\u0435\u0448\u043D\u043E +BallColor.Unstable=\u041D\u0435\u0441\u0442\u0430\u0431\u0438\u043B\u043D\u043E +Build.post_build_steps_failed=\u041A\u043E\u0440\u0430\u0446\u0438 \u043F\u043E\u0441\u043B\u0435 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 \u043D\u0438\u0441\u0443 \u0443\u0441\u043F\u0435\u043B\u0435 +CLI.clear-queue.shortDescription=\u0418\u0437\u045B\u0438\u0441\u0442\u0438 \u0440\u0435\u0434 \u0437\u0430\u0434\u0430\u0442\u0430\u043A\u0430 +CLI.disable-job.shortDescription=\u041F\u043E\u043D\u0438\u0448\u0442\u0438 \u0437\u0430\u0434\u0430\u0442\u0430\u043A +CLI.enable-job.shortDescription=\u0423\u043A\u0459\u0443\u0447\u0438 \u0437\u0430\u0434\u0430\u0442\u0430\u043A +CLI.online-node.shortDescription=\u041D\u0430\u0441\u0442\u0430\u0432\u0438 \u043A\u043E\u0440\u0438\u0441\u0442\u0435\u045B\u0438 \u043C\u0430\u0448\u0438\u043D\u0435 \u0437\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0443 \u0434\u0430 \u0431\u0438 \u0441\u0442\u0435 \u043F\u043E\u043D\u0438\u0448\u0442\u0438\u043B\u0438 \u043F\u0440\u0435\u0442\u0445\u043E\u0434\u043D\u0443 \u043A\u043E\u043C\u0430\u043D\u0434\u0443\ +"offline-node". +Computer.Permissions.Title=\u0410\u0433\u0435\u043D\u0442 +Computer.NoSuchSlaveExistsWithoutAdvice=\ \u041D\u0435\u043C\u0430 \u0430\u0433\u0435\u043D\u0442\u0430 {0} +Computer.ExtendedReadPermission.Description=\u041E\u0432\u043E \u0434\u043E\u0437\u0432\u043E\u0459\u0430\u0432\u0430 \u0434\u0430 \u043A\u043E\u0440\u0438\u043D\u0438\u0446\u0438 \u043F\u0440\u043E\u0447\u0438\u0442\u0430\u0458\u0443 \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 \u0430\u0433\u0435\u043D\u0430\u0442\u0430. +Computer.ConfigurePermission.Description=\u041E\u0432\u043E \u0434\u0430\u0458\u0435 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u0446\u0438\u043C\u0430 \u043F\u0440\u0430\u0432\u043E \u0434\u0430 \u043F\u043E\u0441\u0442\u0430\u0432\u0435 \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 \u0430\u0433\u0435\u043D\u0430\u0442\u0430. +Computer.DeletePermission.Description=\u041E\u0432\u043E \u0434\u0430\u0458\u0435 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u0446\u0438\u043C\u0430 \u043F\u0440\u0430\u0432\u043E \u0434\u0430 \u0431\u0440\u0438\u0448\u0443 \u0430\u0433\u0435\u043D\u0442\u0435. +Computer.CreatePermission.Description=\u041E\u0432\u043E \u0434\u0430\u0458\u0435 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u0446\u0438\u043C\u0430 \u043F\u0440\u0430\u0432\u043E \u0434\u0430 \u043F\u043E\u0441\u0442\u0430\u0432\u0435 \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 \u0430\u0433\u0435\u043D\u0430\u0442\u0430. +Computer.ConnectPermission.Description=\u041E\u0432\u043E \u0434\u0430\u0458\u0435 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u0446\u0438\u043C\u0430 \u043F\u0440\u0430\u0432\u043E \u0434\u0430 \u043F\u043E\u0432\u0435\u0436\u0443 \u0430\u0433\u0435\u043D\u0442\u0435 \u0438\u043B\u0438 \u0438\u0445 \u043E\u0437\u043D\u0430\u0447\u0435 \u043F\u043E\u0432\u0435\u0437\u0430\u043D\u0438\u043C. +Computer.DisconnectPermission.Description=\u041E\u0432\u043E \u0434\u0430\u0458\u0435 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u0446\u0438\u043C\u0430 \u043F\u0440\u0430\u0432\u043E \u0434\u0430 \u043E\u0442\u043A\u043E\u043F\u0447\u0430\u0458\u0443 \u0430\u0433\u0435\u043D\u0442\u0435 \u0438\u043B\u0438 \u043E\u0437\u043D\u0430\u0447\u0435 \u043F\u0440\u0438\u0432\u0440\u0435\u043C\u0435\u043C\u043E \u043D\u0435\u043F\u043E\u0432\u0435\u0437\u0430\u043D\u0438\u043C. +Computer.BuildPermission.Description=\u041E\u0432\u043E \u0434\u0430\u0458\u0435 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u0446\u0438\u043C\u0430 \u043F\u0440\u0430\u0432\u043E \u0434\u0430 \u043F\u043E\u043A\u0440\u0435\u043D\u0443 \u0437\u0430\u0434\u0430\u0442\u043A\u0435 \u0441\u0430 \u0441\u0432\u043E\u0458\u0438\u043C \u0438\u043C\u0435\u043D\u0438\u043C\u0430. +ComputerSet.NoSuchSlave=\u041D\u0435\u043C\u0430 \u0430\u0433\u0435\u043D\u0442\u0430 {0} +Computer.BadChannel=\u041C\u0430\u0448\u0438\u043D\u0430 \u0430\u0433\u0435\u043D\u0442\u0430 \u043D\u0438\u0458\u0435 \u043F\u043E\u0432\u0435\u0437\u0430\u043D\u0430 \u0438\u043B\u0438 \u043D\u0438\u0458\u0435 \u0434\u0430\u0459\u0438\u043D\u0441\u043A\u0438 \u043A\u0430\u043D\u0430\u043B (\u043A\u0430\u043E \u043D\u0430 \u043F\u0440\u0438\u043C\u0435\u0440 \u0448\u0442\u043E \u0458\u0435 \u0433\u043B\u0430\u0432\u043D\u0430 \u043C\u0430\u0448\u0438\u043D\u0430) +ComputerSet.SlaveAlreadyExists=\u0412\u0435\u045B \u043F\u043E\u0441\u0442\u043E\u0458\u0438 \u0430\u0433\u0435\u043D\u0442 \u0441\u0430 \u0438\u043C\u0435\u043D\u043E\u043C {0} +ComputerSet.SpecifySlaveToCopy=\u041E\u0434\u0440\u0435\u0434\u0438\u0442\u0435 \u0430\u0433\u0435\u043D\u0442 \u0437\u0430 \u043A\u043E\u043F\u0438\u0440\u0430\u045A\u0435 +ComputerSet.DisplayName=\u0420\u0430\u0447\u0443\u043D\u0430\u0440\u0438 +Descriptor.From=(\u043E\u0434 {0}) +Executor.NotAvailable=\u041D/\u0414 +FreeStyleProject.DisplayName=\u041D\u0435\u0437\u0430\u0432\u0438\u0441\u043D\u0438 \u0437\u0430\u0434\u0430\u0442\u0430\u043A +FreeStyleProject.Description=\u041E\u0432\u043E \u0458\u0435 \u043E\u0441\u043D\u043E\u0432\u043D\u0430 \u0444\u0443\u043D\u043A\u0446\u0438\u043E\u043D\u0430\u043B\u043D\u043E\u0441\u0442 Jenkins-\u0430. Jenkins \u043C\u043E\u0436\u0435 \u0434\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u0438 \u043F\u0440\u043E\u0458\u0435\u043A\u0430\u0442 \u043A\u043E\u0440\u0438\u0441\u0442\u0435\u045B\u0438 \u0431\u0438\u043B\u043E \u043A\u043E\u0433 \u0441\u0438\u0441\u0442\u0435\u043C\u0430 \u0443\u043F\u0440\u0430\u0432\u0459\u0430\u045A\u0435 \u0438\u0437\u0432\u043E\u0440\u043D\u043E\u0433 \u043A\u043E\u0434\u0430 \u0438 \u0438\u0437\u0433\u0440\u0430\u0434\u043D\u0438\u043C \u0441\u0438\u0441\u0442\u0435\u043C\u043E\u043C. \u0422\u0430\u043A\u043E \u043C\u043E\u0436\u0435\u0442\u0435 \u043A\u043E\u0440\u0438\u0441\u0442\u0438\u0442\u0435 Jenkins \u0437\u0430 \u0440\u0430\u0437\u043B\u0438\u0447\u0438\u0442\u0435 \u0441\u0432\u0440\u0445\u0435. +HealthReport.EmptyString= +Hudson.BadPortNumber=\u041F\u043E\u0433\u0440\u0435\u0448\u0430\u043D \u0431\u0440\u043E\u0458 \u043F\u043E\u0440\u0442\u0430 {0} +Hudson.Computer.Caption=\u0413\u043B\u0430\u0432\u043D\u0430 +Hudson.Computer.DisplayName=\u0433\u043B\u0430\u0432\u043D\u0430 \u043C\u0430\u0448\u0438\u043D\u0430 +Hudson.ControlCodeNotAllowed=\u041A\u043E\u043D\u0442\u0440\u043E\u043B\u043D\u0438 \u043A\u043E\u0434 \u043D\u0438\u0458\u0435 \u0434\u043E\u0437\u0432\u043E\u0459\u0435\u043D: {0} +Hudson.JobAlreadyExists=\u0412\u0435\u045B \u043F\u043E\u0441\u0442\u043E\u0458\u0438 \u0437\u0430\u0434\u0430\u0442\u0430\u043A \u0441\u0430 \u0438\u043C\u0435\u043D\u043E\u043C \u2018{0}\u2019 +Hudson.DisplayName=Jenkins +Hudson.NoJavaInPath=java \u043D\u0438\u0458\u0435 \u043F\u0440\u043E\u043D\u0430\u0452\u0435\u043D \u0443 \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0458\u0443\u043C\u0430 PATH-\u0430. \u041C\u043E\u0436\u0434\u0430 \u0431\u0438 \u0442\u0440\u0435\u0431\u0430\u043B\u0438 \u0434\u0430 \u043F\u043E\u0441\u0442\u0430\u0432\u0438\u0442\u0435 JDK? +Hudson.NoName=\u041D\u0438\u0458\u0435 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u043E \u0438\u043C\u0435. +Hudson.NoSuchDirectory=\u041D\u0435\u043C\u0430 \u0434\u0438\u0440\u0435\u0434\u043A\u043E\u0440\u0438\u0458\u0443\u043C\u0430 \u0441\u0430 \u0438\u043C\u0435\u043D\u043E\u043C {0} +Hudson.NodeBeingRemoved=\u041C\u0430\u0448\u0438\u043D\u0430 \u0441\u0435 \u0431\u0440\u0438\u0448\u0435 +Hudson.NotAPlugin={0} \u043D\u0438\u0458\u0435 \u0432\u0440\u0441\u0442\u0430 \u043C\u043E\u0434\u0443\u043B\u0435 \u0437\u0430 Jenkins +Hudson.NotJDKDir={0} \u043D\u0438\u0458\u0435 JDK \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0458\u0443\u043C +Hudson.USER_CONTENT_README=\u0414\u0430\u0442\u043E\u0442\u0435\u043A\u0443 \u0443 \u043E\u0432\u043E\u043C \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0458\u0443\u043C\u0443 \u045B\u0435 \u0431\u0438\u0442\u0438 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0438 \u043F\u0443\u0442\u0435\u043C \u0430\u0434\u0440\u0435\u0441\u0438 http://server/jenkins/userContent/ +Hudson.Permissions.Title=\u041E\u043F\u0448\u0442\u0435 +Hudson.UnsafeChar=\u041E\u043F\u0430\u0441\u043D\u043E \u0458\u0435 \u043A\u043E\u0440\u0438\u0441\u0442\u0438\u0442\u0438 \u0437\u043D\u0430\u043A \u2018{0}\u2019 +Hudson.ViewAlreadyExists=\u0412\u0435\u045B \u043F\u043E\u0441\u0442\u043E\u0458\u0438 \u043F\u0440\u0435\u0433\u043B\u0435\u0434 \u0441\u0430 \u0438\u043C\u0435\u043D\u043E\u043C "{0}" +Hudson.ViewName=\u0421\u0432\u0435 +Hudson.NotANumber=\u041D\u0438\u0458\u0435 \u0431\u0440\u043E\u0458\u043A\u0430 +Hudson.NotAPositiveNumber=\u041D\u0438\u0458\u0435 \u043F\u043E\u0437\u0438\u0442\u0438\u0432\u0430\u043D \u0431\u0440\u043E\u0458. +Hudson.NotANonNegativeNumber=\u0411\u0440\u043E\u0458 \u043D\u0435\u043C\u043E\u0436\u0435 \u0431\u0438\u0442\u0438 \u043D\u0435\u0433\u0430\u0442\u0438\u0432\u0430\u043D. +Hudson.NotANegativeNumber=\u041D\u0438\u0458\u0435 \u043D\u0435\u0433\u0430\u0442\u0438\u0432\u0430\u043D \u0431\u0440\u043E\u0458. +Hudson.NotUsesUTF8ToDecodeURL=URL \u0430\u0434\u0440\u0435\u0441\u0435 \u0432\u0430\u0448\u0435\u0433 \u043A\u043E\u043D\u0442\u0435\u0458\u043D\u0435\u0440\u0430 \u043D\u0438\u0441\u0443 \u0443\u043D\u0435\u0448\u0435\u043D\u0438 \u043F\u043E \u0444\u043E\u0440\u043C\u0430\u0442\u0443 UTF-8. \u0418\u043C\u0435\u043D\u0430 \u0441\u0430 \u0437\u043D\u0430\u0446\u0438\u043C\u0430 \u0438\u0437\u0432\u0430\u043D ASCII \u043C\u043E\u0433\u0443 \u0438\u0437\u0430\u0437\u0432\u0430\u0442\u0438 \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0435. \u041C\u043E\u043B\u0438\u043C\u043E \u0432\u0430\u0441 \u043F\u0440\u043E\u0447\u0438\u0442\u0430\u0458\u0442\u0435 Containers \u0438 \ + Tomcat i18n. +Hudson.AdministerPermission.Description=\u0414\u0430\u0458\u0435 \u043F\u0440\u0430\u0432\u043E \u0434\u0430 \u043C\u0435\u045A\u0430 \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 \u0441\u0438\u0441\u0442\u0435\u043C\u0430, \u043A\u0430\u043E \u0438 \u043A\u043E\u043C\u043F\u043B\u0435\u0442\u0430\u043D \u043F\u0440\u0438\u0441\u0442\u0443\u043F \u043B\u043E\u043A\u0430\u043B\u043D\u043E\u0433 \u0441\u0438\u0441\u0442\u0435\u043C\u0430 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0430 \u0443 \u0458\u0435\u0434\u043D\u0430\u043A\u0435 \u043F\u043E \u043E\u043A\u0432\u0438\u0440\u0443 \u043F\u0440\u0430\u0432\u0430 \u0443 \u0441\u043A\u043B\u0430\u0434\u0443 \u0441\u0430 \u043E\u043F\u0435\u0440\u0430\u0442\u0438\u0432\u043D\u0438 \u0441\u0438\u0441\u0442\u0435\u043C\u043E\u043C. +Hudson.ReadPermission.Description= +Hudson.RunScriptsPermission.Description=\u041E\u0431\u0430\u0432\u0435\u0437\u043D\u043E \u0437\u0430 \u0438\u0437\u0432\u0440\u0448\u0430\u0432\u0430\u045A\u0435 \u0441\u043A\u0440\u0438\u043F\u0442\u0430 \u0443\u043D\u0443\u0442\u0430\u0440 Jenkins \u043F\u0440\u043E\u0446\u0435\u0441\u0430, \u043A\u0430\u043E \u043D\u0430 \u043F\u0440\u0438\u043C\u0435\u0440 \u043F\u0440\u0435\u043A\u043E Groovy \u043A\u043E\u043D\u0441\u043E\u043B\u0435 \u0438\u043B\u0438 \u043A\u043E\u043C\u0430\u043D\u0434\u0435. +Hudson.NodeDescription=\u0433\u043B\u0430\u0432\u043D\u0430 Jenkins \u043C\u0430\u0448\u0438\u043D\u0430 +Item.CREATE.description=\u041A\u0440\u0435\u0438\u0440\u0430\u0458 \u043D\u043E\u0432\u0438 \u0437\u0430\u0434\u0430\u0442\u0430\u043A +Item.Permissions.Title=\u0417\u0430\u0434\u0430\u0442\u0430\u043A +Item.DELETE.description=\u0423\u043A\u043B\u043E\u043D\u0438 \u0437\u0430\u0434\u0430\u0442\u0430\u043A +Item.CONFIGURE.description=\u041F\u0440\u043E\u043C\u0435\u043D\u0438 \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 \u0437\u0430\u0434\u0430\u0442\u043A\u0430 +Item.READ.description=\u041F\u0440\u0435\u0433\u043B\u0435\u0434 \u0437\u0430\u0434\u0430\u0442\u043A\u0430 (\u043C\u043E\u0436\u0435\u0442\u0435 \u0438\u0441\u0442\u043E\u0432\u0440\u0435\u043C\u0435\u043D\u043E\u043C \u0443\u043A\u043B\u043E\u043D\u0438\u0442\u0438 \u043E\u0432\u043E \u043F\u0440\u0430\u0432\u043E \u0438 \u0434\u043E\u0437\u0432\u043E\u043B\u0438\u0442\u0438 \u0430\u043D\u043E\u043D\u0438\u043C\u043D\u0438\u043C \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u043A\u0443 \u0434\u0430 \u0441\u0435 \u043F\u0440\u0438\u0458\u0430\u0432\u0438 \u0434\u0430 \u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0430 \u0437\u0430\u0434\u0430\u0442\u0430\u043A) +ItemGroupMixIn.may_not_copy_as_it_contains_secrets_and_=\u041D\u0435\u043C\u043E\u0436\u0435 \u0441\u0435 \u043A\u043E\u043F\u0438\u0440\u0430\u0442\u0438 {0} \u043F\u043E\u0448\u0442\u043E \u0441\u0430\u0434\u0440\u0436\u0438 \u0442\u0430\u0458\u043D\u0435 \u0438 {1} \u0438\u043C\u0430 {2}/{3} \u0430 \u043D\u0435 /{4} +Job.AllRecentBuildFailed=\u0421\u0432\u0430 \u043D\u0435\u0434\u0430\u0432\u043D\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 \u0441\u0443 \u043D\u0435\u0443\u0441\u043F\u0435\u0448\u043D\u0430 +Job.BuildStability=\u0421\u0442\u0430\u0431\u0438\u043B\u043D\u043E\u0441\u0442 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435: {0} +Job.NOfMFailed={0} \u043E\u0434 \u043F\u043E\u0441\u043B\u0435\u0434\u045A\u0438\u0445 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 {1} \u0441\u0437 \u043D\u0435\u0443\u0441\u043F\u0435\u0448\u043D\u0430. +Job.NoRecentBuildFailed=\u0418\u0437\u043C\u0435\u045B\u0443 \u043D\u0430\u0458\u043D\u043E\u0432\u0438\u0458\u0438\u0445 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 \u043D\u0435\u043C\u0430 \u043D\u0435\u0443\u0441\u043F\u0435\u0448\u043D\u0438\u0445. +Job.Pronoun=\u041F\u0440\u043E\u0458\u0435\u043A\u0430\u0442 +Job.minutes=\u043C\u0438\u043D. +Job.you_must_use_the_save_button_if_you_wish=\u0414\u0430 \u043F\u0440\u0435\u0438\u043C\u0435\u043D\u0443\u0458\u0442\u0435 \u0437\u0430\u0434\u0430\u0442\u0430\u043A, \u043A\u043B\u0438\u043A\u043D\u0438\u0442\u0435 \u043D\u0430 \u0434\u0443\u0433\u043C\u0435 "\u0421\u0430\u0447\u0443\u0432\u0430\u0458". +Label.GroupOf=\u0433\u0440\u0443\u043F\u0430 {0} +Label.InvalidLabel=\u043D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u043D\u0430 \u043B\u0430\u0431\u0435\u043B\u0430 +Label.ProvisionedFrom=\u041D\u0430\u0431\u0430\u0432\u0459\u0435\u043D\u043E \u043E\u0434 {0} +ManageJenkinsAction.DisplayName=\u0423\u043F\u0440\u0430\u0432\u0459\u0430\u045A\u0435 Jenkins-\u043E\u043C +MultiStageTimeSeries.EMPTY_STRING= +Queue.AllNodesOffline=\u0421\u0432\u0435 \u043C\u0430\u0448\u0438\u043D\u0435 \u0441\u0430 \u043B\u0430\u0431\u0435\u043B\u043E\u043C \u2018{0}\u2019 \u0441\u0443 \u0432\u0430\u043D \u043C\u0440\u0435\u0436\u0435 +Queue.LabelHasNoNodes=\u041D\u0435\u043C\u0430 \u043C\u0430\u0448\u0438\u043D\u0430 \u0441\u0430 \u043B\u0430\u0431\u0435\u043B\u043E\u043C \u2018{0}\u2019 +Queue.BlockedBy=\u0417\u0430\u0431\u043B\u043E\u043A\u0438\u0440\u043E\u0432\u0430\u043D\u043E \u043E\u0434 {0} +Queue.HudsonIsAboutToShutDown=Jenkins \u0441\u0435 \u0443\u0441\u043A\u043E\u0440\u043E \u0433\u0430\u0441\u0438 +Queue.InProgress=\u0412\u0435\u045B \u0441\u0435 \u0432\u0440\u0448\u0438 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 +Queue.InQuietPeriod=\ \u0418\u043D\u0442\u0435\u0440\u0432\u0430\u043B \u0442\u0438\u0448\u0438\u043De, \u0438\u0437\u0442\u0438\u0447e \u0437\u0430 {0} +Queue.NodeOffline={0} \u0458\u0435 \u0432\u0430\u043D \u043C\u0440\u0435\u0436\u0435 +Queue.Unknown=\u041D/\u0414 +Queue.WaitingForNextAvailableExecutor=\u0427\u0435\u043A\u0430\u045A\u0435 \u043D\u0430 \u0441\u043B\u0435\u0434\u0435\u045B\u0443 \u0441\u043B\u043E\u0431\u043E\u0434\u043D\u0443 \u043C\u0430\u0448\u0438\u043D\u0443. +Queue.WaitingForNextAvailableExecutorOn=\u0427\u0435\u043A\u0430\u045A\u0435 \u043D\u0430 \u0441\u043B\u0435\u0434\u0435\u045B\u0443 \u0441\u043B\u043E\u0431\u043E\u0434\u043D\u0443 \u043C\u0430\u0448\u0438\u043D\u0443 \u043D\u0430 {0} +Queue.init=\u0412\u0440\u0430\u045B\u0430\u045A\u0435 \u0440\u0435\u0434\u0443 \u0437\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0443. +ResultTrend.Aborted=\u041E\u0434\u0443\u0441\u0442\u0430\u0432\u0459\u0435\u043D\u043E +ResultTrend.Failure=\u041D\u0435\u0443\u0441\u043F\u0435\u0448\u043D\u043E +ResultTrend.Fixed=\u041F\u043E\u043F\u0440\u0430\u0432\u0459\u0435\u043D\u043E +ResultTrend.NotBuilt=\u041D\u0435\u0438\u0437\u0433\u0440\u0430\u0452\u0435\u043D\u043E +ResultTrend.NowUnstable=\u041D\u0435\u0441\u0442\u0430\u0431\u0438\u043B\u043D\u043E +ResultTrend.StillFailing=\u0408\u043E\u0448 \u0458\u0435 \u043D\u0435\u0443\u0441\u043F\u0435\u0448\u043D\u043E +ResultTrend.StillUnstable=\u0408\u043E\u0448 \u0458\u0435 \u043D\u0435\u0441\u0442\u0430\u0431\u0438\u043B\u043D\u043E +ResultTrend.Success=\u0423\u0441\u043F\u0435\u0448\u043D\u043E +ResultTrend.Unstable=\u041D\u0435\u0441\u0442\u0430\u0431\u0438\u043B\u043D\u043E +Run.BuildAborted=\u0418\u0437\u0433\u0440\u0430\u0434\u045A\u0430 \u043E\u0434\u0443\u0441\u0442\u0430\u0432\u0459\u0435\u043D\u0430 +Run.MarkedExplicitly=\u041E\u0432\u0430\u0458 \u0440\u0435\u043A\u043E\u0440\u0434 \u0458\u0435 \u043E\u0431\u0435\u043B\u0435\u0436\u0435\u043D \u0437\u0430 \u0447\u0443\u0432\u0430\u045A\u0435. +Run._is_waiting_for_a_checkpoint_on_={0} \u0447\u0435\u043A\u0430 \u0442\u0440\u0435\u043D\u0443\u0442\u0430\u043A \u0437\u0430 {1} +Run.Permissions.Title=\u0418\u0437\u0432\u0440\u0448\u0438 +Run.running_as_=\u0418\u0437\u0432\u0440\u0448\u0430\u045A\u0435 \u043A\u0430\u043E {0} +Run.UnableToDelete=\u041D\u0438\u0458\u0435 \u043C\u043E\u0433\u0443\u045B\u0435 \u0443\u043A\u043B\u043E\u043D\u0438\u0442\u0438 {0}: {1} +Run.DeletePermission.Description=\u0414\u0430\u0458\u0435 \u043F\u0440\u0430\u0432\u043E \u043D\u0430 \u0431\u0440\u0438\u0441\u0430\u045A\u0435 \u0438\u0437\u0430\u0431\u0440\u0430\u043D\u0438\u0445 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 \u0441\u0430 \u0438\u0441\u0442\u043E\u0440\u0438\u0458\u0435 \u0437\u0430\u0434\u0430\u0442\u0430\u043A\u0430. +Run.UpdatePermission.Description=\u0414\u0430\u0458\u0435 \u043F\u0440\u0430\u0432\u043E \u0434\u0430 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u0446\u0438 \u043F\u0440\u043E\u043C\u0435\u043D\u0435 \u043E\u043F\u0438\u0441 \u0438 \u0434\u0440\u0443\u0433\u0435 \u043F\u043E\u0441\u0442\u0430\u0432\u043A\u0435 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 \u0441\u0430 \u0438\u0441\u0442\u043E\u0440\u0438\u0458\u0435 \u0437\u0430\u0434\u0430\u0442\u0430\u043A\u0430. \u041C\u043E\u0436\u0435 \u0441\u0435, \u043D\u0430 \u043F\u0440\u0438\u043C\u0435\u0440, \u043E\u0441\u0442\u0430\u0432\u0438\u0442\u0438 \u043F\u043E\u0440\u0443\u043A\u0430 \u043A\u043E\u0458\u0430 \u043E\u043F\u0438\u0441\u0443\u0458\u0435 \u0440\u0430\u0437\u043B\u043E\u0433 \u043D\u0435\u0443\u0441\u043F\u0435\u0448\u043D\u0435 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435. +Run.ArtifactsPermission.Description=\u0414\u0430\u0458\u0435 \u043F\u0440\u0430\u0432\u043E \u0434\u0430 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u0446\u0438 \u043F\u0440\u043E\u0447\u0438\u0442\u0430\u0458\u0443 \u0430\u0440\u0442\u0435\u0444\u0430\u043A\u0442\u0435 \u043F\u0440\u043E\u0438\u0437\u0432\u0435\u0434\u0435\u043D\u0438 \u043E\u0434 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435. \u041D\u0435\u043C\u043E\u0458 \u0442\u0435 \u0434\u0430\u0442\u0438 \u043E\u0432\u043E \u043F\u0440\u0430\u0432\u043E \u0430\u043A\u043E \u043D\u0435 \u0436\u0435\u043B\u0438\u0442\u0435 \u0434\u0430 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u0446\u0438 \u0434\u043E\u0441\u0442\u0443\u043F\u0435 \u0430\u0440\u0442\u0435\u0444\u0430\u043A\u0442\u0438\u043C\u0430. +Run.InProgressDuration={0} \u0438 \u0440\u0430\u0441\u0442\u0435 +Run.NotStartedYet=\u041D\u0438\u0458\u0435 \u0458\u043E\u0448 \u043F\u043E\u0447\u0435\u043B\u043E +Run.ArtifactsBrowserTitle=\u0410\u0440\u0442\u0435\u0444\u0430\u043A\u0442\u0438 \u043D\u0430 {0} {1} +Run.Summary.Stable=\u0441\u0442\u0430\u0431\u0438\u043B\u043D\u043E +Run.Summary.Unstable=\u043D\u0435\u0441\u0442\u0430\u0431\u0438\u043B\u043D\u043E +Run.Summary.NotBuilt=\u043D\u0435\u0438\u0437\u0433\u0440\u0430\u0452\u0435\u043D\u043E +Run.Summary.Aborted=\u043E\u0434\u0443\u0441\u0442\u0430\u0432\u0459\u0435\u043D\u043E +Run.Summary.BackToNormal=\u043D\u043E\u0440\u043C\u0430\u043B\u043D\u043E +Run.Summary.BrokenForALongTime=\u0434\u0443\u0436\u0435 \u0432\u0440\u0435\u043C\u0435 \u0441\u043B\u043E\u043C\u0459\u0435\u043D\u043E +Run.Summary.BrokenSinceThisBuild=\u0441\u043B\u043E\u043C\u0459\u0435\u043D\u043E \u043E\u0434 \u043E\u0432\u0435 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 +Run.Summary.BrokenSince=\u0441\u043B\u043E\u043C\u0459\u0435\u043D\u043E \u043E\u0434 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 {0} +Run.Summary.Unknown=\u041D/\u0414 +Slave.InvalidConfig.Executors=\u041D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u043D\u043E \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0435 \u043D\u0430 \u0430\u0433\u0435\u043D\u0442\u0443 \u0437\u0430 {0}. \u041D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u0430\u043D \u0431\u0440\u043E\u0458 \u0438\u0437\u0432\u0440\u0448\u0438\u0442\u0435\u0459\u0430. +Slave.InvalidConfig.NoName=\u041D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u043D\u043E \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0435 \u043D\u0430 \u0430\u0433\u0435\u043D\u0442\u0443 \u2014 \u0438\u043C\u0435 \u0458\u0435 \u043F\u0440\u0430\u0437\u043D\u043E. +Slave.InvalidConfig.NoRemoteDir=\u041D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u043D\u043E \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0435 \u043D\u0430 \u0430\u0433\u0435\u043D\u0442\u0443 \u2014 \u043D\u0438\u0458\u0435 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u043E \u0443\u0434\u0430\u0459\u0435\u043D\u0438 \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0458\u0443\u043C. +Slave.Launching={0} \u043F\u043E\u043A\u0440\u0435\u0442\u0430\u045A\u0435 \u0430\u0433\u0435\u043D\u0442\u043E\u043C +Slave.Network.Mounted.File.System.Warning=\u0414\u0430 \u043B\u0438 \u0441\u0442\u0435 \u0441\u0438\u0433\u0443\u0440\u043D\u0438 \u0434\u0430 \u0436\u0435\u043B\u0438\u0442\u0435 \u0434\u0430 \u043A\u043E\u0440\u0438\u0441\u0442\u0438\u0442\u0435 \u043C\u0440\u0435\u0436\u043D\u0438 \u0441\u0438\u0441\u0442\u0435\u043C \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0430 \u0437\u0430 \u043A\u043E\u0440\u0435\u043D \u0442\u043E\u0433 \u0441\u0438\u0441\u0442\u0435\u043C\u0430. \u0414\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0458\u0443\u043C \u043D\u0435\u043C\u043E\u0440\u0430 \u0431\u0438\u0442\u0438 \u0432\u0438\u0434\u0459\u0438\u0432 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u043A\u0443. +Slave.Remote.Director.Mandatory=\u041E\u0431\u0430\u0432\u0435\u0437\u043D\u043E \u0458\u0435 \u0438\u043C\u0430\u0442\u0438 \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0458\u0443\u043C \u043D\u0430 \u0434\u0430\u0459\u0438\u043D\u0438 +Slave.Terminated=\u0410\u0433\u0435\u043D\u0442 {0} \u0458\u0435 \u0443\u043A\u043B\u043E\u045A\u0435\u043D +Slave.Remote.Relative.Path.Warning=\u0414\u0430 \u043B\u0438 \u0441\u0442\u0435 \u0441\u0438\u0433\u0443\u0440\u043D\u0438 \u0434\u0430 \u0436\u0435\u043B\u0438\u0442\u0435 \u0434\u0430 \u043A\u043E\u0440\u0438\u0441\u0442\u0438\u0442\u0435 \u0440\u0435\u043B\u0430\u0442\u0438\u0432\u043D\u0430 \u043F\u0443\u0442\u0435\u0432\u0430 \u0437\u0430 \u043A\u043E\u0440\u0435\u043D \u0441\u0438\u0441\u0442\u0435\u043C\u0430 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0430. \u041F\u0440\u043E\u0432\u0435\u0440\u0438\u0442\u0435 \u0434\u0430 \u0438\u0437\u0430\u0431\u0440\u0430\u043D\u0438 \u043F\u0440\u043E\u0446\u0435\u0441 \u043F\u043E\u043A\u0440\u0435\u0442\u0430\u045A\u0430 \u043E\u0431\u0435\u0437\u0431\u0435\u0452\u0443\u0458\u0435 \u043A\u043E\u043D\u0441\u0438\u0441\u0442\u0435\u043D\u0442\u043D\u043E\u0433 \u0440\u0430\u0434\u043D\u043E\u0433 \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0458\u0443\u043C\u0430. \u041F\u0440\u0435\u043F\u043E\u0440\u0443\u0447\u0443\u0458\u0435 \u0441\u0435 \u0434\u0430 \u043A\u043E\u0440\u0438\u0441\u0442\u0438\u0442\u0435 \u0430\u043F\u0441\u043E\u043B\u0443\u0442\u043D\u0430 \u043F\u0443\u0442\u0435\u0432\u0430. +Slave.UnableToLaunch=\u0410\u0433\u0435\u043D\u0430\u0442 \u0437\u0430 {0}{1} \u043D\u0435 \u043C\u043E\u0436\u0435 \u0434\u0430 \u0441\u0435 \u043F\u043E\u043A\u0440\u0435\u043D\u0435 +Slave.UnixSlave=\u041E\u0432\u043E \u0458\u0435 \u0430\u0433\u0435\u043D\u0442 \u0437\u0430 Unix +TopLevelItemDescriptor.NotApplicableIn={0} \u0435\u043B\u0435\u043C\u0435\u043D\u0442\u0430 \u043D\u0435 \u043C\u043E\u0433\u0443 \u0441\u0435 \u043F\u0440\u0438\u043C\u0435\u043D\u0438\u0442\u0438 \u0443 {1} +Slave.WindowsSlave=\u041E\u0432\u043E \u0458\u0435 \u0430\u0433\u0435\u043D\u0442 \u0437\u0430 Windows +UpdateCenter.DownloadButNotActivated=\u0423\u0441\u043F\u0435\u0448\u043D\u043E \u043F\u0440\u0435\u0443\u0437\u0438\u043C\u0430\u045A\u0435. \u041F\u043E\u0447\u0435\u045B\u0435 \u0434\u0430 \u0440\u0430\u0434\u0438 \u043F\u043E\u0441\u043B\u0435 \u0441\u043B\u0435\u0434\u0435\u045B\u0435\u0433 \u043F\u043E\u043A\u0440\u0435\u0442\u0430\u045A\u0430. +UpdateCenter.n_a=\u041D\u0435\u043C\u0430 +View.Permissions.Title=\u041F\u0440\u0435\u0433\u043B\u0435\u0434 +View.CreatePermission.Description=\u0414\u0430\u0458\u0435 \u043F\u0440\u0430\u0432\u043E \u043A\u043E\u0440\u0438\u043D\u0438\u0446\u0438\u043C\u0430 \u0434\u0430 \u043A\u0440\u0435\u0438\u0440\u0430\u0458\u0443 \u043D\u043E\u0432\u0430 \u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0430. +View.DeletePermission.Description=\u0414\u0430\u0458\u0435 \u043F\u0440\u0430\u0432\u043E \u043A\u043E\u0440\u0438\u043D\u0438\u0446\u0438\u043C\u0430 \u0434\u0430 \u0431\u0440\u0438\u0448\u0443 \u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0435. +View.ConfigurePermission.Description=\u0414\u0430\u0458\u0435 \u043F\u0440\u0430\u0432\u043E \u043A\u043E\u0440\u0438\u043D\u0438\u0446\u0438\u043C\u0430 \u0434\u0430 \u043C\u0435\u045A\u0430\u0458\u0443 \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 \u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0430. +View.ReadPermission.Description=\u0414\u0430\u0458\u0435 \u043F\u0440\u0430\u0432\u043E \u043A\u043E\u0440\u0438\u043D\u0438\u0446\u0438\u043C\u0430 \u0434\u0430 \u0434\u043E\u0441\u0442\u0443\u043F\u0435 \u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0438\u043C\u0430. +View.MissingMode=\u0412\u0440\u0441\u0442\u0430 \u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0430 \u043D\u0438\u0458\u0435 \u0438\u0437\u0430\u0431\u0440\u0430\u043D\u043E +UpdateCenter.Status.CheckingInternet=\u041F\u0440\u043E\u0432\u0435\u0440\u0430 \u0432\u0435\u0437\u043E\u043C \u0441\u0430 \u0438\u043D\u0442\u0435\u0440\u043D\u0435\u0442\u043E\u043C +UpdateCenter.Status.CheckingJavaNet=\u041F\u0440\u043E\u0432\u0435\u0440\u0430 \u0432\u0435\u0437\u043E\u043C \u0441\u0430 \u0446\u0435\u043D\u0442\u0430\u0440 \u0437\u0430 a\u0436\u0443\u0440\u0438\u0440\u0430\u045A\u0435 +UpdateCenter.Status.Success=\u0423\u0441\u043F\u0435\u0445 +UpdateCenter.Status.UnknownHostException=\u041D\u0435\u0443\u0441\u043F\u0435\u0448\u043D\u0430 \u043F\u0440\u043E\u0432\u0435\u0440\u0430 \u0430\u0434\u0440\u0435\u0441\u0435 {0}. \ +\u041C\u043E\u0436\u0434\u0430 \u043C\u043E\u0440\u0430\u0442\u0435 \u043F\u043E\u0441\u0442\u0430\u0432\u0438\u0442\u0438 HTTP proxy? +UpdateCenter.Status.ConnectionFailed=\u041D\u0435\u0443\u0441\u043F\u0435\u0448\u043D\u043E \u043F\u043E\u0432\u0435\u0437\u0438\u0432\u0430\u045A\u0435 \u0441\u0430 {0}. \ +\u041C\u043E\u0436\u0434\u0430 \u043C\u043E\u0440\u0430\u0442\u0435 \u043F\u043E\u0441\u0442\u0430\u0432\u0438\u0442\u0438 HTTP proxy? +UpdateCenter.init=\u0418\u043D\u0438\u0446\u0438\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u0458\u0430 \u0446\u0435\u043D\u0442\u0440\u0430 \u0437\u0430 \u0430\u0436\u0443\u0440\u0438\u0440\u0430\u045A\u0435 +UpdateCenter.PluginCategory.builder=\u0410\u043B\u0430\u0442\u0438 \u0437\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0443 +UpdateCenter.PluginCategory.buildwrapper=\u0421\u043A\u0440\u0438\u043F\u0442 \u043E\u043C\u043E\u0442\u0430\u0447\u0438 \u0437\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0443 +UpdateCenter.PluginCategory.cli=\u0418\u043D\u0442\u0435\u0440\u0444\u0435\u0458\u0441 \u043D\u0430 \u043A\u043E\u043C\u0430\u043D\u0434\u043D\u043E\u0458 \u043B\u0438\u043D\u0438\u0458\u0438 +UpdateCenter.PluginCategory.cloud=\u041F\u0440\u043E\u0432\u0430\u0458\u0434\u0435\u0440\u0438 cloud \u0441\u0435\u0440\u0432\u0438\u0441\u0435 +UpdateCenter.PluginCategory.listview-column=\u041F\u0440\u0435\u0433\u043B\u0435\u0434 \u0441\u043F\u0438\u0441\u0430\u043A\u0430 \u043F\u043E \u043A\u043E\u043B\u043E\u043D\u0438\u043C\u0430 +UpdateCenter.PluginCategory.misc=\u0420\u0430\u0437\u043D\u043E +UpdateCenter.PluginCategory.notifier=\u041E\u0431\u0430\u0432\u0435\u0448\u0442\u0435\u045A\u0430 \u043E \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0438 +UpdateCenter.PluginCategory.page-decorator=\u0414\u0435\u043A\u043E\u0440\u0430\u0446\u0438\u0458\u0430 \u0437\u0430 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0435 +UpdateCenter.PluginCategory.parameter=\u041F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0438 \u0437\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0443 +UpdateCenter.PluginCategory.post-build=\u0414\u043E\u0434\u0430\u0442\u043D\u0435 \u0430\u043A\u0446\u0438\u0458\u0435 \u043F\u043E\u0441\u043B\u0435 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 +UpdateCenter.PluginCategory.runcondition=\u0423\u0441\u043B\u043E\u0432\u0438 \u0437\u0430 \u0438\u0437\u0432\u0440\u0448\u0430\u0432\u0430\u045A\u0435 +UpdateCenter.PluginCategory.ui=\u041A\u043E\u0440\u0438\u0441\u043D\u0438\u0447\u043A\u0438 \u0438\u043D\u0442\u0435\u0440\u0444\u0435\u0458\u0441 +UpdateCenter.PluginCategory.upload=\u041F\u0440\u0435\u0443\u0437\u0438\u043C\u0430\u045A\u0435 \u0430\u0440\u0442\u0435\u0444\u0430\u043A\u0442\u0438 +UpdateCenter.PluginCategory.user=\u0410\u0443\u0442\u0435\u043D\u0442\u0438\u043A\u0430\u0446\u0438\u0458\u0430 \u0438 \u0443\u043F\u0440\u0430\u0432\u0459\u0430\u045A\u0435 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u0446\u0438\u043C\u0430 +UpdateCenter.PluginCategory.view=\u041F\u0440\u0435\u0433\u043B\u0435\u0434\u0438 +UpdateCenter.PluginCategory.must-be-labeled=\u0431\u0435\u0437 \u043A\u0430\u0442\u0435\u0433\u043E\u0440\u0438\u0458\u0435 +UpdateCenter.PluginCategory.unrecognized=\u0420\u0430\u0437\u043D\u043E ({0}) +Permalink.LastBuild=\u041F\u043E\u0441\u043B\u0435\u0434\u043D\u043E \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 +Permalink.LastStableBuild=\u041F\u043E\u0441\u043B\u0435\u0434\u043D\u043E \u0441\u0442\u0430\u0431\u0438\u043B\u043D\u043E \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 +Permalink.LastUnstableBuild=\u041F\u043E\u0441\u043B\u0435\u0434\u043D\u043E \u043D\u0435\u0441\u0442\u0430\u0431\u0438\u043B\u043D\u043E \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 +Permalink.LastUnsuccessfulBuild=\u041F\u043E\u0441\u043B\u0435\u0434\u043D\u043E \u043D\u0435\u0443\u0441\u043F\u0435\u0448\u043D\u043E \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 +Permalink.LastSuccessfulBuild=\u041F\u043E\u0441\u043B\u0435\u0434\u043D\u043E \u0443\u0441\u043F\u0435\u0448\u043D\u043E \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 +Permalink.LastFailedBuild=\u041F\u043E\u0441\u043B\u0435\u0434\u043D\u043E \u043D\u0435\u0443\u0441\u043F\u0435\u0448\u043D\u043E \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 +Permalink.LastCompletedBuild=\u041F\u043E\u0441\u043B\u0435\u0434\u043D\u043E \u0437\u0430\u0432\u0440\u0448\u0435\u043D\u043E \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 +ParameterAction.DisplayName=\u041F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0438 +ParametersDefinitionProperty.DisplayName=\u041E\u0432\u0430\u0458 \u043F\u0440\u043E\u0458\u0435\u043A\u0430\u0442 \u0438\u043C\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0438 +StringParameterDefinition.DisplayName=\u041D\u0438\u0437 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0430\u0440 +TextParameterDefinition.DisplayName=\u0422\u0435\u043A\u0441\u0442 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0430\u0440 +FileParameterDefinition.DisplayName=\u0414\u0430\u0442\u043E\u0442\u0435\u043A\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0430\u0440 +BooleanParameterDefinition.DisplayName=\u0411\u0437\u043B\u043E\u0432 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0430\u0440 +ChoiceParameterDefinition.DisplayName=\u0421\u043F\u0438\u0441\u0430\u043A \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0430\u0440 +ChoiceParameterDefinition.MissingChoices=\u041F\u043E\u0442\u0440\u0435\u0431\u043D\u043E \u0458\u0435 \u0443\u043D\u0435\u0442\u0438 \u0432\u0440\u0435\u0434\u043D\u043E\u0441\u0442\u0438. +PasswordParameterDefinition.DisplayName=\u041B\u043E\u0437\u0438\u043D\u043A\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0430\u0440 +RunParameterDefinition.DisplayName=\u041F\u0430\u0440\u0430\u043C\u0435\u0442\u0430\u0440 \u0437\u0430 \u0438\u0437\u0432\u0440\u0448\u0435\u045A\u0435 +Node.BecauseNodeIsReserved={0} \u0458\u0435 \u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u0430\u043D\u043E \u0437\u0430 \u0437\u0430\u0434\u0430\u0442\u043A\u0435 \u0441\u0430 \u043E\u0434\u0433\u043E\u0432\u0430\u0440\u0430\u0458\u0443\u045B\u043E\u0458 \u043B\u0430\u0431\u0435\u043B\u0438 +Node.BecauseNodeIsNotAcceptingTasks={0} \u043D\u0435 \u043F\u0440\u0438\u043C\u0430 \u0437\u0430\u0434\u0430\u0442\u043A\u0435 +Node.LabelMissing={0} \u043D\u0435\u043C\u0430 \u043B\u0430\u0431\u0435\u043B\u0443 {1} +Node.LackingBuildPermission={0} \u043D\u0435\u043C\u0430 \u043F\u0440\u0430\u0432\u043E \u0434\u0430 \u0441\u0435 \u0438\u0437\u0432\u0440\u0448\u0430\u0432\u0430 \u043D\u0430 {1} +Node.Mode.EXCLUSIVE=\u0418\u0437\u0433\u0440\u0430\u0434\u0438 \u0441\u0430\u043C\u043E \u0437\u0430\u0434\u0430\u0442\u043A\u0435 \u0441\u0430 \u043B\u0430\u0431\u0435\u043B\u043E\u043C \u043A\u043E\u0458\u0430 \u043E\u0434\u0433\u043E\u0432\u0430\u0440\u0430 \u043E\u0432\u043E\u0458 \u043C\u0430\u0448\u0438\u043D\u0438 +Node.Mode.NORMAL=\u041A\u043E\u0440\u0438\u0441\u0442\u0438\u0442\u0435 \u043E\u0432\u0443 \u043C\u0430\u0448\u0438\u043D\u0443 \u043A\u043E\u043B\u0438\u043A\u043E \u0433\u043E\u0434 \u043C\u043E\u0436\u0435\u0442\u0435 +ListView.DisplayName=\u0421\u043F\u0438\u0441\u0447\u0435\u043D\u0438 \u043F\u0440\u0435\u0433\u043B\u0435\u0434 +MyView.DisplayName=\u041C\u043E\u0458 \u043F\u0440\u0435\u0433\u043B\u0435\u0434 +LoadStatistics.Legends.DefinedExecutors=\u0414\u0435\u0444\u043D\u0438\u0441\u0430\u043D\u0435 \u043C\u0430\u0448\u0438\u043D\u0435-\u0438\u0437\u0432\u043E\u0452\u0430\u0447\u0438 +LoadStatistics.Legends.ConnectingExecutors=\u041F\u043E\u0432\u0435\u0437\u0443\u0458\u0435 \u043C\u0430\u0448\u0438\u043D\u0435-\u0438\u0437\u0432\u043E\u0452\u0430\u0447\u0435 +LoadStatistics.Legends.OnlineExecutors=\u041C\u0430\u0448\u0438\u043D\u0435-\u0438\u0437\u0432\u043E\u0452\u0430\u0447\u0438 \u043D\u0430 \u043C\u0440\u0435\u0436\u0438 +LoadStatistics.Legends.TotalExecutors=\u0423\u043A\u0443\u043F\u043D\u043E \u043C\u0430\u0448\u0438\u043D\u0435-\u0438\u0437\u0432\u043E\u0452\u0430\u0447\u0430 +LoadStatistics.Legends.BusyExecutors=\u0417\u0430\u0443\u0437\u0435\u0442\u0435 \u043C\u0430\u0448\u0438\u043D\u0435-\u0438\u0437\u0432\u043E\u0452\u0430\u0447\u0438 +LoadStatistics.Legends.IdleExecutors=\u0421\u043B\u043E\u0431\u043E\u0434\u043D\u0435 \u043C\u0430\u0448\u0438\u043D\u0435-\u0438\u0437\u0432\u043E\u0452\u0430\u0447\u0438 +LoadStatistics.Legends.AvailableExecutors=\u0414\u043E\u0441\u0442\u0443\u043F\u043D\u0435 \u043C\u0430\u0448\u0438\u043D\u0435-\u0438\u0437\u0432\u043E\u0452\u0430\u0447\u0438 +LoadStatistics.Legends.QueueLength=\u0414\u0443\u0436\u0438\u043D\u0430 \u0440\u0435\u0434\u0430 +Cause.LegacyCodeCause.ShortDescription=\u0421\u0442\u0430\u0440\u0438 \u043A\u043E\u0434 \u0458\u0435 \u0437\u0430\u043F\u043E\u0447\u0435\u043E \u043E\u0432\u0430\u0458 \u0437\u0430\u0434\u0430\u0442\u0430\u043A - \u043D\u0435\u0434\u043E\u0441\u0442\u0430\u0458\u0435 \u0440\u0430\u0437\u043B\u043E\u0433. +Cause.UpstreamCause.ShortDescription=\u041F\u043E\u043A\u0440\u0435\u043D\u0443\u0442\u043E \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u043E\u043C "{0}" \u0438\u0437\u0433\u0440\u0430\u0434\u043D\u0438 \u0431\u0440\u043E\u0458 {1} +Cause.UpstreamCause.CausedBy=\u043F\u0440\u0432\u043E\u0431\u0438\u0442\u043D\u043E \u0437\u0431\u043E\u0433: +Cause.UserCause.ShortDescription=\u041F\u043E\u043A\u0440\u0435\u043D\u0443\u0442\u043E \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u043A\u043E\u043C {0} +Cause.UserIdCause.ShortDescription=\u041F\u043E\u043A\u0440\u0435\u043D\u0443\u0442\u043E \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u043A\u043E\u043C {0} +Cause.RemoteCause.ShortDescription=\u041F\u043E\u043A\u0440\u0435\u043D\u0443\u0442\u043E \u0443\u0434\u0430\u0459\u0435\u043D\u043E\u043C \u043C\u0430\u0448\u0438\u043D\u043E\u043C {0} +Cause.RemoteCause.ShortDescriptionWithNote=\u041F\u043E\u043A\u0440\u0435\u043D\u0443\u0442\u043E \u0443\u0434\u0430\u0459\u0435\u043D\u043E\u043C \u043C\u0430\u0448\u0438\u043D\u043E\u043C {0} \u0441\u0430 \u0431\u0435\u043B\u0435\u0448\u043A\u043E\u043C: {0} +ProxyView.NoSuchViewExists=\u0413\u043B\u043E\u0431\u0430\u043B\u043D\u0438 \u043F\u0440\u0435\u0433\u043B\u0435\u0434 {0} \u043D\u0435 \u043F\u043E\u0441\u0442\u043E\u0458\u0438 +ProxyView.DisplayName=\u0423\u043A\u0459\u0443\u0447\u0438 \u0433\u043B\u043E\u0431\u0430\u043B\u043D\u0438 \u043F\u0440\u0435\u0433\u043B\u0435\u0434 +MyViewsProperty.DisplayName=\u041C\u043E\u0458\u0438 \u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0438 +MyViewsProperty.GlobalAction.DisplayName=\u041C\u043E\u0458\u0438 \u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0438 +MyViewsProperty.ViewExistsCheck.NotExist=\u041F\u0440\u0435\u0433\u043B\u0435\u0434 \u0441\u0430 \u0438\u043C\u0435\u043D\u043E\u043C {0} \u043D\u0435 \u043F\u043E\u0441\u0442\u043E\u0458\u0438 +MyViewsProperty.ViewExistsCheck.AlreadyExists=\u041F\u0440\u0435\u0433\u043B\u0435\u0434 \u0441\u0430 \u0438\u043C\u0435\u043D\u043E\u043C {0} \u0432\u0435\u045B \u043F\u043E\u0441\u0442\u043E\u0458\u0438 +CLI.restart.shortDescription=\u041F\u043E\u043D\u043E\u0432\u043E \u043F\u043E\u043A\u0440\u0435\u043D\u0438 Jenkins +CLI.safe-restart.shortDescription=\u0411\u0435\u0437\u0431\u0435\u0434\u043D\u043E \u043F\u043E\u043D\u043E\u0432\u043E \u043F\u043E\u043A\u0440\u0435\u043D\u0438 Jenkins +CLI.keep-build.shortDescription=\u041E\u0437\u043D\u0430\u0447\u0438\u0442\u0435 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0443 \u0434\u0430 \u0458\u0435 \u0434\u0443\u0433\u043E\u0442\u0440\u0430\u0458\u043D\u043E \u0441\u0430\u0447\u0443\u0432\u0430\u0442\u0435 +BuildAuthorizationToken.InvalidTokenProvided=\u0417\u0430\u0434\u0430\u0442\u0438 \u0442\u043E\u043A\u0435\u043D \u0458\u0435 \u043D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u0430\u043D +Jenkins.CheckDisplayName.NameNotUniqueWarning=\u0418\u043C\u0435 "{0}", \u0441\u0435 \u0432\u0435\u045B \u043A\u043E\u0440\u0438\u0441\u0442\u0438 \u043A\u0430\u043E \u0438\u043C\u0435 \u0437\u0430\u0434\u0430\u0442\u0430\u043A\u0430, \u0448\u0442\u043E \u043C\u043E\u0436\u0435 \u0434\u043E\u0432\u0435\u0441\u0442\u0438 \u0434\u043E \u0437\u0431\u0443\u045A\u0443\u0458\u0443\u045B\u0430 \u0440\u0435\u0437\u0443\u043B\u0442\u0430\u0442\u0430 \u043F\u0440\u0435\u0433\u0440\u0430\u0442\u0435. +Jenkins.CheckDisplayName.DisplayNameNotUniqueWarning=\u0418\u043C\u0435 "{0}", \u0441\u0435 \u0432\u0435\u045B \u043A\u043E\u0440\u0438\u0441\u0442\u0438 \u0434\u0440\u0443\u0433\u0438\u043C \u0437\u0430\u0434\u0430\u0442\u0430\u043A\u043E\u043C, \u0448\u0442\u043E \u043C\u043E\u0436\u0435 \u0434\u043E\u0432\u0435\u0441\u0442\u0438 \u0434\u043E \u0437\u0431\u0443\u045A\u0443\u0458\u0443\u045B\u0430 \u0440\u0435\u0437\u0443\u043B\u0442\u0430\u0442\u0430 \u043F\u0440\u0435\u0433\u0440\u0430\u0442\u0435. +Jenkins.NotAllowedName="{0}" \u0458\u0435 \u043D\u0435\u0434\u043E\u0437\u0432\u043E\u0459\u0435\u043D\u043E \u0438\u043C\u0435 +Jenkins.IsRestarting=Jenkins \u0441\u0435 \u043F\u043E\u043D\u043E\u0432\u043E \u043F\u043E\u043A\u0440\u0435\u045B\u0435 +User.IllegalUsername=\u041D\u0435 \u043C\u043E\u0436\u0435\u0442\u0435 \u043A\u043E\u0440\u0438\u0441\u0442\u0438\u0442\u0438 "{0}" \u0437\u0430 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u0447\u043A\u043E \u0438\u043C\u0435 \u0438\u0437 \u0431\u0435\u0437\u0431\u0435\u0434\u043D\u043E\u0441\u043D\u0438\u0445 \u0440\u0430\u0437\u043B\u043E\u0433\u0430. +User.IllegalFullname=\u041D\u0435 \u043C\u043E\u0436\u0435\u0442\u0435 \u043A\u043E\u0440\u0438\u0441\u0442\u0438\u0442\u0438 "{0}" \u0437\u0430 \u043F\u0443\u043D\u043E \u0438\u043C\u0435 \u0438\u0437 \u0431\u0435\u0437\u0431\u0435\u0434\u043D\u043E\u0441\u043D\u0438\u0445 \u0440\u0430\u0437\u043B\u043E\u0433\u0430. +Hudson.NoParamsSpecified=\u041D\u0438\u0441\u0443 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0438 \u0437\u0430 \u043E\u0432\u0430\u0458 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0438\u0437\u043E\u0432\u0430\u043D\u043E \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 +CLI.delete-job.shortDescription=\u0423\u043A\u043B\u043E\u043D\u0438 \u0437\u0430\u0434\u0430\u0442\u0430\u043A +CLI.reload-job.shortDescription=\u041F\u043E\u043D\u043E\u0432\u043E \u0443\u0447\u0438\u0442\u0430\u0458 \u0437\u0430\u0434\u0430\u0442\u0430\u043A \u0438\u0437 \u0434\u0438\u0441\u043A\u0430 +CLI.delete-node.shortDescription=\u0423\u043A\u043B\u043E\u043D\u0438 \u0437\u0430\u0434\u0430\u0442\u0430\u043A +CLI.disconnect-node.shortDescription=\u041F\u0440\u0435\u043A\u0438\u043D\u0438 \u0432\u0435\u0437\u0443 \u0441\u0430 \u043C\u0430\u0448\u0438\u043D\u043E\u043C +CLI.connect-node.shortDescription=\u041F\u043E\u0432\u0435\u0436\u0438 \u0441\u0430 \u043C\u0430\u0448\u0438\u043D\u043E\u043C +CLI.offline-node.shortDescription= +Hudson.NotADirectory={0} \u043D\u0438\u0458\u0435 \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0458\u0443\u043C \ No newline at end of file diff --git a/core/src/main/resources/hudson/model/Messages_zh_CN.properties b/core/src/main/resources/hudson/model/Messages_zh_CN.properties index 1d07150da1dd3b8f0f677bcd3ca39a6bde929c19..2dd933f56c3f5d71bf088262784e91a63d9d095b 100644 --- a/core/src/main/resources/hudson/model/Messages_zh_CN.properties +++ b/core/src/main/resources/hudson/model/Messages_zh_CN.properties @@ -100,8 +100,8 @@ Hudson.NotANegativeNumber=Not a negative number Hudson.NotUsesUTF8ToDecodeURL=\ Your container doesn''t use UTF-8 to decode URLs. If you use non-ASCII characters as a job name etc, \ this will cause problems. \ - See Containers and \ - Tomcat i18n for more details. + See Containers and \ + Tomcat i18n for more details. Hudson.AdministerPermission.Description=\ This permission grants the ability to make system-wide configuration changes, \ as well as perform highly sensitive operations that amounts to full local system access \ diff --git a/core/src/main/resources/hudson/model/Messages_zh_TW.properties b/core/src/main/resources/hudson/model/Messages_zh_TW.properties index 2ffc39e21fd0b0d66b8dc09af5da1b6a4e8da174..9fb229cc07ad72d8b6f191b8e609d8d68d592ccc 100644 --- a/core/src/main/resources/hudson/model/Messages_zh_TW.properties +++ b/core/src/main/resources/hudson/model/Messages_zh_TW.properties @@ -117,8 +117,8 @@ Hudson.NotANonNegativeNumber=\u4e0d\u80fd\u70ba\u8ca0\u6578 Hudson.NotANegativeNumber=\u4e0d\u662f\u8ca0\u6578 Hudson.NotUsesUTF8ToDecodeURL=\ \u60a8\u7684\u5bb9\u5668\u4e0d\u662f\u4f7f\u7528 UTF-8 \u89e3\u8b6f URL\u3002\u5982\u679c\u60a8\u5728\u4f5c\u696d\u7b49\u540d\u7a31\u4e2d\u4f7f\u7528\u4e86\u975e ASCII \u5b57\u5143\uff0c\u53ef\u80fd\u6703\u9020\u6210\u554f\u984c\u3002\ - \u8acb\u53c3\u8003 Container \u53ca \ - Tomcat i18n \u8cc7\u6599\u3002 + \u8acb\u53c3\u8003 Container \u53ca \ + Tomcat i18n \u8cc7\u6599\u3002 Hudson.AdministerPermission.Description=\ \u6388\u8207\u8b8a\u66f4\u6574\u500b\u7cfb\u7d71\u8a2d\u5b9a\u7684\u6b0a\u9650\u3002\ \u5305\u62ec\u57f7\u884c\u9ad8\u5ea6\u654f\u611f\u7684\u4f5c\u696d\uff0c\u751a\u81f3\u53ef\u4ee5\u5b58\u53d6\u6574\u500b\u672c\u5730\u7cfb\u7d71 \ diff --git a/core/src/main/resources/hudson/model/MyView/newViewDetail_sr.properties b/core/src/main/resources/hudson/model/MyView/newViewDetail_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..f0a62a8baabe166d1008f93a6f0359b73902f12a --- /dev/null +++ b/core/src/main/resources/hudson/model/MyView/newViewDetail_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +blurb=\u041E\u0432\u0430 \u043F\u0440\u0435\u0437\u0435\u043D\u0442\u0430\u0446\u0438\u0458\u0430 \u045B\u0435 \u0441\u0435 \u0430\u0443\u0442\u043E\u043C\u0430\u0442\u0441\u043A\u0438 \u043F\u0440\u0438\u043A\u0430\u0437\u0438\u0432\u0430\u0442\u0438 \u0437\u0430 \u0441\u0432\u0435 \u0437\u0430\u0434\u0430\u0442\u043A\u0435 \u0437\u0430 \u043A\u043E\u0458\u0435 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u043A \u0438\u043C\u0430 \u043F\u0440\u0438\u0441\u0442\u0443\u043F. diff --git a/core/src/main/resources/hudson/model/MyView/noJob_ru.properties b/core/src/main/resources/hudson/model/MyView/noJob_ru.properties new file mode 100644 index 0000000000000000000000000000000000000000..87a09862b4213b24465679f404ae83daab21688e --- /dev/null +++ b/core/src/main/resources/hudson/model/MyView/noJob_ru.properties @@ -0,0 +1,2 @@ +# This view has no jobs. +blurb=\u0414\u0430\u043d\u043d\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0437\u0430\u0434\u0430\u0447. diff --git a/core/src/main/resources/hudson/model/MyView/noJob_sr.properties b/core/src/main/resources/hudson/model/MyView/noJob_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..bad4b3bbeff533b1ff600fe653e0d290bf947730 --- /dev/null +++ b/core/src/main/resources/hudson/model/MyView/noJob_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +blurb=\u041E\u0432\u0430\u0458 \u043F\u0440\u0435\u0433\u043B\u0435\u0434 \u043D\u0435\u043C\u0430 \u0437\u0430\u0434\u0430\u0442\u0430\u043A\u0430. diff --git a/core/src/main/resources/hudson/model/MyViewsProperty/config_de.properties b/core/src/main/resources/hudson/model/MyViewsProperty/config_de.properties index 27f8470a90c7e662a9f347fad15599760d1b0572..c1696ffbf7785727846160b899c4e82ddfdbffe4 100644 --- a/core/src/main/resources/hudson/model/MyViewsProperty/config_de.properties +++ b/core/src/main/resources/hudson/model/MyViewsProperty/config_de.properties @@ -1,24 +1,24 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Simon Wiest -# -# 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. - -Default\ View=Standardansicht +# The MIT License +# +# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Simon Wiest +# +# 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. + +Default\ View=Standardansicht description=Die Ansicht wird als Vorgabe ausgewhlt, wenn der Anwender seine privaten Ansichten ffnet. \ No newline at end of file diff --git a/core/src/main/resources/hudson/model/MyViewsProperty/config_sr.properties b/core/src/main/resources/hudson/model/MyViewsProperty/config_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..0d21018daff85ed8610104ac00e1efd2fd05ddca --- /dev/null +++ b/core/src/main/resources/hudson/model/MyViewsProperty/config_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Default\ View=\u0421\u0442\u0430\u043D\u0434\u0430\u0440\u0434\u043D\u0438 \u043F\u0440\u0435\u0433\u043B\u0435\u0434 +description=\u041F\u0440\u0435\u0433\u043B\u0435\u0434 \u0458\u0435 \u0438\u0437\u0430\u0431\u0440\u0430\u043D \u043A\u0430\u0434\u0430 \u0441\u0435 \u0438\u0434\u0435 \u043D\u0430 \u043F\u0440\u0438\u0432\u0430\u0442\u043D\u0430 \u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0430 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u043A\u0430 diff --git a/core/src/main/resources/hudson/model/MyViewsProperty/newView_de.properties b/core/src/main/resources/hudson/model/MyViewsProperty/newView_de.properties index 5b3a61d6aee418e2300842f5c9e1d02bb948721a..6784ce2341ea7f47fd07437b864074cb4484cc3f 100644 --- a/core/src/main/resources/hudson/model/MyViewsProperty/newView_de.properties +++ b/core/src/main/resources/hudson/model/MyViewsProperty/newView_de.properties @@ -1,23 +1,23 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Simon Wiest -# -# 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\ name=Name der Ansicht +# The MIT License +# +# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Simon Wiest +# +# 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\ name=Name der Ansicht diff --git a/core/src/main/resources/hudson/model/MyViewsProperty/newView_sr.properties b/core/src/main/resources/hudson/model/MyViewsProperty/newView_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..14b8d5c30fff08a52195fd985618cb6c187405d4 --- /dev/null +++ b/core/src/main/resources/hudson/model/MyViewsProperty/newView_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +View\ name=\u0418\u043C\u0435 \u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0430 diff --git a/core/src/main/resources/hudson/model/NoFingerprintMatch/index_sr.properties b/core/src/main/resources/hudson/model/NoFingerprintMatch/index_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..fadf596940065e95a461869063e751d3b72dabbf --- /dev/null +++ b/core/src/main/resources/hudson/model/NoFingerprintMatch/index_sr.properties @@ -0,0 +1,8 @@ +# This file is under the MIT License by authors + +No\ matching\ record\ found=\u041D\u0435 \u043E\u0434\u0433\u043E\u0432\u0430\u0440\u0430 \u043D\u0438 \u0458\u0435\u0434\u043D\u043E\u043C \u043E\u0434 \u0437\u0430\u0431\u0435\u043B\u0435\u0436\u0435\u043D\u0438\u0445 \u043F\u043E\u0434\u0430\u0442\u0430\u043A\u0430. +Back\ to\ Dashboard=\u041D\u0430\u0437\u0430\u0434 \u043D\u0430 \u043A\u043E\u043D\u0442\u0440\u043E\u043B\u043D\u0443 \u043F\u0430\u043D\u0435\u043B\u0443 +description=\u041E\u0442\u0438\u0441\u0430\u043A {0} \u043D\u0435 \u043E\u0434\u0433\u043E\u0432\u0430\u0440\u0430 \u043D\u0438 \u0458\u0435\u0434\u043D\u043E\u043C \u043E\u0434 \u0437\u0430\u0431\u0435\u043B\u0435\u0436\u0435\u043D\u0438\u0445 \u043F\u043E\u0434\u0430\u0442\u0430\u043A\u0430. +cause.1=\u041C\u043E\u0433\u0443\u045B\u0435 \u0458\u0435 \u0434\u0430 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0430 \u043D\u0438\u0458\u0435 \u043D\u0430\u043F\u0440\u0430\u0432\u0459\u0435\u043D\u0430 \u0443 Jenkins.\ +\u041C\u043E\u0436\u0435 \u0431\u0438\u0442\u0438 \u0434\u0430 \u0458\u0435 \u0438\u0437\u0433\u0440\u0430\u0452\u0435\u043D\u043E \u043D\u0430 \u043B\u043E\u043A\u0430\u043B\u043D\u043E\u0458 \u043C\u0430\u0448\u0438\u043D\u0438 \u043D\u0435\u043A\u043E\u0433 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u043A\u0430. +cause.2=\u041C\u043E\u0436\u0434\u0430 \u043D\u0438\u0441\u0443 \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u0438 \u0434\u043E\u0431\u0440\u043E \u043F\u043E\u0441\u0442\u0430\u0432\u0459\u0435\u043D\u0438, \u0437\u0431\u043E\u0433 \u0447\u0435\u0433\u0430 \u043E\u0442\u0438\u0441\u0446\u0438 \u043D\u0435\u043C\u043E\u0433\u0443 \u0431\u0438\u0442\u0438 \u0441\u0430\u0447\u0443\u0432\u0430\u043D\u0438. \u041C\u043E\u043B\u0438\u043C\u043E \u0432\u0430\u0441 \u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0430\u0458\u0442\u0435 \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430. diff --git a/core/src/main/resources/hudson/model/Node/help-labelString_zh_CN.html b/core/src/main/resources/hudson/model/Node/help-labelString_zh_CN.html index e45d74fc00db4a5c525ed9bdad4c9d1bc30d31df..63e825a3b3a60c4fd93663e36920ea06ad83e469 100644 --- a/core/src/main/resources/hudson/model/Node/help-labelString_zh_CN.html +++ b/core/src/main/resources/hudson/model/Node/help-labelString_zh_CN.html @@ -1,7 +1,7 @@ -
        - 标记(又叫做标签)用来对多节点分组,标记之间用空格分隔.例如'refression java6'将会把一个节点标记上'regression'和'java6'. - -

        - 举例来说,如果你有多个Windows系统的构建节点并且你的Job也需要在Windows系统上运行,那么你可以配置所有的Windows系统节点都标记为'windows', - 然后把Job也标记为'windows'.这样的话你的Job就不会运行在除了Windows节点以外的其它节点之上了. +

        + 标记(又叫做标签)用来对多节点分组,标记之间用空格分隔.例如'refression java6'将会把一个节点标记上'regression'和'java6'. + +

        + 举例来说,如果你有多个Windows系统的构建节点并且你的Job也需要在Windows系统上运行,那么你可以配置所有的Windows系统节点都标记为'windows', + 然后把Job也标记为'windows'.这样的话你的Job就不会运行在除了Windows节点以外的其它节点之上了.

        \ No newline at end of file diff --git a/core/src/main/resources/hudson/model/Node/help-numExecutors_zh_CN.html b/core/src/main/resources/hudson/model/Node/help-numExecutors_zh_CN.html index 9f66f26bc6aa0ecff6dacd8e55a1cbc789c0b95a..a77b70de8eb835d77998532dca26d010a7f7795e 100644 --- a/core/src/main/resources/hudson/model/Node/help-numExecutors_zh_CN.html +++ b/core/src/main/resources/hudson/model/Node/help-numExecutors_zh_CN.html @@ -1,11 +1,11 @@ -
        - 这个值控制着Jenkins并发构建的数量. - 因此这个值会影响Jenkins系统的负载压力. - 使用处理器个数作为其值会是比较好的选择. - -

        - 增大这个值会使每个构建的运行时间更长,但是这能够增大整体的构建数量,因为当一个项目在等待I/O时它允许CPU去构建另一个项目. - -

        - 设置这个值为0对于从Jenkins移除一个失效的从节点非常有用,并且不会丢失配置信息。 -

        +
        + 这个值控制着Jenkins并发构建的数量. + 因此这个值会影响Jenkins系统的负载压力. + 使用处理器个数作为其值会是比较好的选择. + +

        + 增大这个值会使每个构建的运行时间更长,但是这能够增大整体的构建数量,因为当一个项目在等待I/O时它允许CPU去构建另一个项目. + +

        + 设置这个值为0对于从Jenkins移除一个失效的从节点非常有用,并且不会丢失配置信息。 +

        diff --git a/core/src/main/resources/hudson/model/ParametersAction/index.jelly b/core/src/main/resources/hudson/model/ParametersAction/index.jelly index 72ed664c447665a08eaea60229fc43f8c5ff69dd..ae4fadf983b0ada0783348dddd7c996dd822223b 100644 --- a/core/src/main/resources/hudson/model/ParametersAction/index.jelly +++ b/core/src/main/resources/hudson/model/ParametersAction/index.jelly @@ -40,6 +40,7 @@ THE SOFTWARE.
        ${%Parameters}
        + Execute concurrent builds if necessary option is enabled.

        - See the Parameterized Builds wiki page for more information about + See the Parameterized Builds documentation for more information about this feature. diff --git a/core/src/main/resources/hudson/model/ParametersDefinitionProperty/help_de.html b/core/src/main/resources/hudson/model/ParametersDefinitionProperty/help_de.html index 0a558a6774e6eb29178fc422c6f1a43a141ef2ee..15fb51e81c59513ac26b15bc24b85d5a8320ac24 100644 --- a/core/src/main/resources/hudson/model/ParametersDefinitionProperty/help_de.html +++ b/core/src/main/resources/hudson/model/ParametersDefinitionProperty/help_de.html @@ -10,6 +10,6 @@ nach Namen unterschieden. Sie können daher auch mehrere Parameter verwenden, solange diese unterschiedliche Namen tragen.

        - Im Jenkins Wiki + Auf der Jenkins website finden Sie weitere Informationen über parametrisierte Builds. diff --git a/core/src/main/resources/hudson/model/ParametersDefinitionProperty/help_fr.html b/core/src/main/resources/hudson/model/ParametersDefinitionProperty/help_fr.html index 63ad1585bb669111d09735a4a3d7e0fd788f00e7..589f9d10ddc7dbae8ab9da8b3646dbec35a7ee94 100644 --- a/core/src/main/resources/hudson/model/ParametersDefinitionProperty/help_fr.html +++ b/core/src/main/resources/hudson/model/ParametersDefinitionProperty/help_fr.html @@ -1,14 +1,14 @@ 

        - Il est parfois pratique de "paramètriser" certaines automatisations, en demandant des informations + Il est parfois pratique de rendre paramétrables certaines automatisations, en demandant des informations à l'utilisateur. Par exemple, vous pourriez proposer un job de test à la demande, où l'utilisateur peut soumettre un fichier zip des binaires à tester.

        - Cette section configure les paramètres que prend votre build. Les paramètres sont identifiés par leurs - noms. Vous pouvez donc avoir des multiples paramètres, du moment qu'ils ont des noms distincts. + Cette section configure les paramètres que prend votre build. Les paramètres sont identifiés par leur + nom. Vous pouvez donc avoir de multiples paramètres, s'ils ont bien des noms distincts.

        - Consultez cette page Wiki + Consultez cette page pour plus de discussions autour de cette fonctionnalité.

        diff --git a/core/src/main/resources/hudson/model/ParametersDefinitionProperty/help_ja.html b/core/src/main/resources/hudson/model/ParametersDefinitionProperty/help_ja.html index 429b1a3c3cb1caf27d10b39bd35a6522ab255d64..86a0381cf4e21fbdf593018b52b459334a815dad 100644 --- a/core/src/main/resources/hudson/model/ParametersDefinitionProperty/help_ja.html +++ b/core/src/main/resources/hudson/model/ParametersDefinitionProperty/help_ja.html @@ -7,5 +7,5 @@ ここでは、ビルドが必要とするパラメータを設定します。パラメータは名前で識別するので、異なる名前を使用すれば複数のパラメータを使用できます。

        - この機能の詳細については、Wikiの項目を参照してください。 + この機能の詳細については、Wikiの項目を参照してください。 diff --git a/core/src/main/resources/hudson/model/ParametersDefinitionProperty/help_tr.html b/core/src/main/resources/hudson/model/ParametersDefinitionProperty/help_tr.html index a89669c4c56423e24d1bdfcbc3b4ab8e98dfd233..5b885ac6a6d56dae0b6e64962e5174d8b842f279 100644 --- a/core/src/main/resources/hudson/model/ParametersDefinitionProperty/help_tr.html +++ b/core/src/main/resources/hudson/model/ParametersDefinitionProperty/help_tr.html @@ -9,6 +9,6 @@ by their names, and so you can have multiple parameters provided that they have different names.

        - See the Wiki topic + See the Jenkins site for more discussions about this feature. diff --git a/core/src/main/resources/hudson/model/ParametersDefinitionProperty/help_zh_TW.html b/core/src/main/resources/hudson/model/ParametersDefinitionProperty/help_zh_TW.html index 8ee9be6a2e02e9150177f6ca3dff040f4f68e2e5..050c733cb8558fff162c81a50adf29f363cd98c0 100644 --- a/core/src/main/resources/hudson/model/ParametersDefinitionProperty/help_zh_TW.html +++ b/core/src/main/resources/hudson/model/ParametersDefinitionProperty/help_zh_TW.html @@ -7,6 +7,6 @@ 參數之間是以名稱來區隔,所以如果您要用到多個參數,請指定不同的名稱。

        - 請參考這篇 Wiki + 請參考這篇 Wiki 條目有關本功能的更多討論。 diff --git a/core/src/main/resources/hudson/model/ParametersDefinitionProperty/index.jelly b/core/src/main/resources/hudson/model/ParametersDefinitionProperty/index.jelly index d91f088dcb1a89389593cbb9d8b5ef51b89043a5..a166f87dc8f1cad89ce7921fa0f1295360c5b104 100644 --- a/core/src/main/resources/hudson/model/ParametersDefinitionProperty/index.jelly +++ b/core/src/main/resources/hudson/model/ParametersDefinitionProperty/index.jelly @@ -45,6 +45,7 @@ THE SOFTWARE. +

        diff --git a/core/src/main/resources/hudson/model/ParametersDefinitionProperty/index_sr.properties b/core/src/main/resources/hudson/model/ParametersDefinitionProperty/index_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..a8a3c1a60a6826dac2ccb86612edfc68166af9f3 --- /dev/null +++ b/core/src/main/resources/hudson/model/ParametersDefinitionProperty/index_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +LOADING=\u0423\u0427\u0418\u0422\u0410\u0412\u0410\u040A\u0415 +description=\u041E\u0432\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 \u0437\u0430\u0445\u0442\u0435\u0432\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0435: +Build=\u0418\u0437\u0433\u0440\u0430\u0434\u045A\u0430 diff --git a/core/src/main/resources/hudson/model/PasswordParameterDefinition/config_pl.properties b/core/src/main/resources/hudson/model/PasswordParameterDefinition/config_pl.properties new file mode 100644 index 0000000000000000000000000000000000000000..18604ca79dd6ac0a67c9c24c619a2cc1175f2117 --- /dev/null +++ b/core/src/main/resources/hudson/model/PasswordParameterDefinition/config_pl.properties @@ -0,0 +1,24 @@ +# The MIT License +# +# Copyright (c) 2016, Damian Szczepanik +# +# 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. +Name=Nazwa +Default\ Value=Domy\u015Blne has\u0142o +Description=Opis diff --git a/core/src/main/resources/hudson/model/PasswordParameterDefinition/config_sr.properties b/core/src/main/resources/hudson/model/PasswordParameterDefinition/config_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..9d202ad38b4ee7215971ef685c426eac55ac5c1c --- /dev/null +++ b/core/src/main/resources/hudson/model/PasswordParameterDefinition/config_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +Name=\u0418\u043C\u0435 +Default\ Value= +Description=\u041E\u043F\u0438\u0441 diff --git a/core/src/main/resources/hudson/model/PasswordParameterDefinition/index.jelly b/core/src/main/resources/hudson/model/PasswordParameterDefinition/index.jelly index 81b8c0190ae2a9bca17389a5205e2723999564d6..fc247a19fd397741f6242f0d1aec038780c0c982 100644 --- a/core/src/main/resources/hudson/model/PasswordParameterDefinition/index.jelly +++ b/core/src/main/resources/hudson/model/PasswordParameterDefinition/index.jelly @@ -26,7 +26,8 @@ THE SOFTWARE. - + +
        diff --git a/core/src/main/resources/hudson/model/PasswordParameterValue/value.jelly b/core/src/main/resources/hudson/model/PasswordParameterValue/value.jelly index d1a142f2dbf886c3b79007748c2c6346231f57e1..e4a5007730747ea7303fec27db4c6ba5d5ea2be5 100644 --- a/core/src/main/resources/hudson/model/PasswordParameterValue/value.jelly +++ b/core/src/main/resources/hudson/model/PasswordParameterValue/value.jelly @@ -26,7 +26,8 @@ THE SOFTWARE. - + + \ No newline at end of file diff --git a/core/src/main/resources/hudson/model/PermalinkProjectAction/Permalink/link_sr.properties b/core/src/main/resources/hudson/model/PermalinkProjectAction/Permalink/link_sr.properties index bdde2cdba969b97e91c8cc0abb2f1c88122cca3c..dde884e8fe859f8e6fea6c488a4fecf33bfd18bf 100644 --- a/core/src/main/resources/hudson/model/PermalinkProjectAction/Permalink/link_sr.properties +++ b/core/src/main/resources/hudson/model/PermalinkProjectAction/Permalink/link_sr.properties @@ -1,3 +1,3 @@ # This file is under the MIT License by authors -format={0}({1}), {2} pre +format={0}({1}), {2} \u043F\u0440\u0435 diff --git a/core/src/main/resources/hudson/model/ProxyView/configure-entries_de.properties b/core/src/main/resources/hudson/model/ProxyView/configure-entries_de.properties index 5222cc089fee446a84e4bc2205871f2428b65aab..a206e6c6db9581a6be8b9ae754086cfc2861a842 100644 --- a/core/src/main/resources/hudson/model/ProxyView/configure-entries_de.properties +++ b/core/src/main/resources/hudson/model/ProxyView/configure-entries_de.properties @@ -1,25 +1,25 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Simon Wiest -# -# 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\ name=Name der Ansicht -The\ name\ of\ a\ global\ view\ that\ will\ be\ shown.=\ - Name einer globalen Ansicht, der angezeigt wird. +# The MIT License +# +# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Simon Wiest +# +# 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\ name=Name der Ansicht +The\ name\ of\ a\ global\ view\ that\ will\ be\ shown.=\ + Name einer globalen Ansicht, der angezeigt wird. diff --git a/core/src/main/resources/hudson/model/ProxyView/configure-entries_pl.properties b/core/src/main/resources/hudson/model/ProxyView/configure-entries_pl.properties new file mode 100644 index 0000000000000000000000000000000000000000..da8020acd31cbb7f2c4a25c3261bbe61344092ff --- /dev/null +++ b/core/src/main/resources/hudson/model/ProxyView/configure-entries_pl.properties @@ -0,0 +1,23 @@ +# The MIT License +# +# Copyright (c) 2017, Damian Szczepanik +# +# 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. +The\ name\ of\ a\ global\ view\ that\ will\ be\ shown.=Nazwa globalnego widoku, kt\u00F3ra b\u0119dzie wy\u015Bwietlana +View\ name=Nazwa widoku diff --git a/core/src/main/resources/hudson/model/ProxyView/configure-entries_ru.properties b/core/src/main/resources/hudson/model/ProxyView/configure-entries_ru.properties new file mode 100644 index 0000000000000000000000000000000000000000..487139ac098738ac8e4ac2596075c3c8a8d3b5e3 --- /dev/null +++ b/core/src/main/resources/hudson/model/ProxyView/configure-entries_ru.properties @@ -0,0 +1,2 @@ +The\ name\ of\ a\ global\ view\ that\ will\ be\ shown.=\u0418\u043c\u044f \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u043e. +View\ name=\u0418\u043c\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f diff --git a/core/src/main/resources/hudson/model/ProxyView/configure-entries_sr.properties b/core/src/main/resources/hudson/model/ProxyView/configure-entries_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..6cb8749ad81cc5c9589e2d8e2dbf3611cb0ebd19 --- /dev/null +++ b/core/src/main/resources/hudson/model/ProxyView/configure-entries_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +View\ name=\u0418\u043C\u0435 \u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0430 +The\ name\ of\ a\ global\ view\ that\ will\ be\ shown.=\u0418\u043C\u0435 \u0433\u043B\u043E\u0431\u0430\u043B\u043D\u043E\u0433 \u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0430 \u043A\u043E\u0458\u0438 \u045B\u0435 \u0431\u0438\u0442\u0438 \u043F\u0440\u0438\u043A\u0430\u0437\u0430\u043D. diff --git a/core/src/main/resources/hudson/model/ProxyView/newViewDetail_de.properties b/core/src/main/resources/hudson/model/ProxyView/newViewDetail_de.properties index 984d1a11b0d7604eb8d829e58844eb074225eb7d..8e833e78bfc5b86a59dcef22c5d16320b8ec1cf9 100644 --- a/core/src/main/resources/hudson/model/ProxyView/newViewDetail_de.properties +++ b/core/src/main/resources/hudson/model/ProxyView/newViewDetail_de.properties @@ -1,24 +1,24 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Simon Wiest -# -# 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. - -Shows\ the\ content\ of\ a\ global\ view.=\ +# The MIT License +# +# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Simon Wiest +# +# 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. + +Shows\ the\ content\ of\ a\ global\ view.=\ Zeigt den Inhalt einer globalen Ansicht. \ No newline at end of file diff --git a/core/src/main/resources/hudson/model/ProxyView/newViewDetail_sr.properties b/core/src/main/resources/hudson/model/ProxyView/newViewDetail_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..b38fb5f6e69d5a2395baa1268eddecfde9ad6c3c --- /dev/null +++ b/core/src/main/resources/hudson/model/ProxyView/newViewDetail_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Shows\ the\ content\ of\ a\ global\ view.=\u041F\u0440\u0438\u043A\u0430\u0437\u0443\u0458\u0435 \u0441\u0430\u0434\u0440\u0436\u0430\u0458 \u0433\u043B\u0430\u0432\u043D\u043E\u0433 \u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0430 + diff --git a/core/src/main/resources/hudson/model/Run/KeepLogBuildBadge/badge_sr.properties b/core/src/main/resources/hudson/model/Run/KeepLogBuildBadge/badge_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..bdd27859e3648113fabeab67b7f68c1bc50aef88 --- /dev/null +++ b/core/src/main/resources/hudson/model/Run/KeepLogBuildBadge/badge_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Keep\ this\ build\ forever=\u0417\u0430\u043F\u0430\u043C\u0442\u0438 \u043E\u0432\u0443 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0443 \u0437\u0430\u0443\u0432\u0435\u043A diff --git a/core/src/main/resources/hudson/model/Run/artifacts-index_sr.properties b/core/src/main/resources/hudson/model/Run/artifacts-index_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..ed4de01fde7ef5216cdc493545f19f9e4e9ac742 --- /dev/null +++ b/core/src/main/resources/hudson/model/Run/artifacts-index_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Build\ Artifacts=\u0410\u0440\u0442\u0435\u0444\u0430\u043A\u0442\u0438 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 diff --git a/core/src/main/resources/hudson/model/Run/configure_sr.properties b/core/src/main/resources/hudson/model/Run/configure_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..6fffe044fdec08c34825c2c2537113dd19048f4f --- /dev/null +++ b/core/src/main/resources/hudson/model/Run/configure_sr.properties @@ -0,0 +1,6 @@ +# This file is under the MIT License by authors + +LOADING=\u0423\u0427\u0418\u0422\u0410\u0412\u0410\u040A\u0415 +DisplayName=\u0418\u043C\u0435 \u0437\u0430 \u043F\u0440\u0438\u043A\u0430\u0437 +Description=\u041E\u043F\u0438\u0441 +Save=\u0421\u0430\u0447\u0443\u0432\u0430\u0458 diff --git a/core/src/main/resources/hudson/model/Run/confirmDelete_sr.properties b/core/src/main/resources/hudson/model/Run/confirmDelete_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..79339b25a8d75dd2e4e53b0618245ddb0335c43c --- /dev/null +++ b/core/src/main/resources/hudson/model/Run/confirmDelete_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +Warning=\u0423\u043F\u043E\u0437\u043E\u0440\u0435\u045A\u0435 +Yes=\u0414\u0430 +Are\ you\ sure\ about\ deleting\ the\ build?=\u0414\u0430 \u043B\u0438 \u0441\u0442\u0435 \u0441\u0438\u0433\u0443\u0440\u043D\u0438 \u0434\u0430 \u0436\u0435\u043B\u0438\u0442\u0435 \u0434\u0430 \u0443\u043A\u043B\u043E\u043D\u0438\u0442\u0435 \u043E\u0432\u0443 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0443? diff --git a/core/src/main/resources/hudson/model/Run/console_pl.properties b/core/src/main/resources/hudson/model/Run/console_pl.properties index 5e82220e612cb898a8473222571e76578e676b88..138b0e72ed6c9a040d141ebbbf2515057e206a71 100644 --- a/core/src/main/resources/hudson/model/Run/console_pl.properties +++ b/core/src/main/resources/hudson/model/Run/console_pl.properties @@ -1,6 +1,6 @@ # The MIT License # -# Copyright (c) 2004-2010, Sun Microsystems, Inc. +# Copyright (c) 2004-2016, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributors # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -21,5 +21,4 @@ # THE SOFTWARE. Console\ Output=Logi konsoli -View\ as\ plain\ text=Poka\u017C jako tekst niesformatowany skipSome=Pomini\u0119to {0,number,integer} KB.. Poka\u017C wszystko diff --git a/core/src/main/resources/hudson/model/Run/console_sr.properties b/core/src/main/resources/hudson/model/Run/console_sr.properties index c4c0552d2851007ad6f1fa6e8fd2c12e3aab49eb..3e24c621d1ec455dc8602b94d65e6245a592acdc 100644 --- a/core/src/main/resources/hudson/model/Run/console_sr.properties +++ b/core/src/main/resources/hudson/model/Run/console_sr.properties @@ -1,4 +1,5 @@ # This file is under the MIT License by authors -Console\ Output=Ispis konzole -View\ as\ plain\ text=Vidi kao obi\u010Dan tekst +Console\ Output=\u0418\u0441\u0445\u043E\u0434 \u0438\u0437 \u043A\u043E\u043D\u0437\u043E\u043B\u0435 +View\ as\ plain\ text=\u041F\u0440\u0435\u0433\u043B\u0435\u0434 \u043E\u0431\u0438\u0447\u043D\u043E\u0433 \u0442\u0435\u043A\u0441\u0442\u0430 +skipSome=\u041F\u0440\u0435\u0441\u043A\u0430\u0447\u0435 {0,number,integer} KB.. \u041A\u043E\u043C\u043F\u043B\u0435\u0442\u0430\u043D \u0436\u0443\u0440\u043D\u0430\u043B diff --git a/core/src/main/resources/hudson/model/Run/delete-retry_sr.properties b/core/src/main/resources/hudson/model/Run/delete-retry_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..d5454cf7ecc162c2b43a4bc949bd72b23e1f7318 --- /dev/null +++ b/core/src/main/resources/hudson/model/Run/delete-retry_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +Retry\ delete=\u041F\u043E\u043A\u0443\u0448\u0430\u0458 \u0431\u0440\u0438\u0441\u0430\u045A\u0435 \u043F\u043E\u043D\u043E\u0432\u043E +Show\ reason=\u041F\u0440\u0438\u043A\u0430\u0436\u0438 \u0440\u0430\u0437\u043B\u043E\u0433 +Not\ successful=\u041D\u0435\u0443\u0441\u043F\u0435\u0448\u043D\u043E diff --git a/core/src/main/resources/hudson/model/Run/delete_eu.properties b/core/src/main/resources/hudson/model/Run/delete_eu.properties index 8aeecb7cf23cfb91aff2b21c72880c37cb0fb79e..e2969c5d6ee81155f9a500b635f1279ecc59bea3 100644 --- a/core/src/main/resources/hudson/model/Run/delete_eu.properties +++ b/core/src/main/resources/hudson/model/Run/delete_eu.properties @@ -1,3 +1,3 @@ # This file is under the MIT License by authors -Delete\ this\ build=Kompilazioa ezabatu +Delete\ this\ build=Konpilazioa ezabatu diff --git a/core/src/main/resources/hudson/model/Run/delete_sr.properties b/core/src/main/resources/hudson/model/Run/delete_sr.properties index b5ac4708b170019884b2232d2b6cd6a2b9de0489..50398669a83ff5c45fc9a65268ee3fec376c5449 100644 --- a/core/src/main/resources/hudson/model/Run/delete_sr.properties +++ b/core/src/main/resources/hudson/model/Run/delete_sr.properties @@ -1,3 +1,3 @@ # This file is under the MIT License by authors -Delete\ this\ build=Obrisi build +Delete\ this\ build=\u0423\u043A\u043B\u043E\u043D\u0438 \u043E\u0432\u0443 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0443 diff --git a/core/src/main/resources/hudson/model/Run/logKeep_pl.properties b/core/src/main/resources/hudson/model/Run/logKeep_pl.properties index 6b14a6a1a07f21a13a91fae0faa0e89380628d3a..17cce8de954cec9a7cd314240fda1dd0548720aa 100644 --- a/core/src/main/resources/hudson/model/Run/logKeep_pl.properties +++ b/core/src/main/resources/hudson/model/Run/logKeep_pl.properties @@ -1,6 +1,6 @@ # The MIT License # -# Copyright (c) 2004-2010, Sun Microsystems, Inc. +# Copyright (c) 2004-2016, Sun Microsystems, Inc, Damian Szczepanik # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -19,5 +19,4 @@ # 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. - -Keep\ this\ build\ forever=Zchowaj to wykonanie +Keep\ this\ build\ forever=Zachowaj to zadanie diff --git a/core/src/main/resources/hudson/model/Run/logKeep_sr.properties b/core/src/main/resources/hudson/model/Run/logKeep_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..9c069ff8dff40d6500f622898e284aa87d42d793 --- /dev/null +++ b/core/src/main/resources/hudson/model/Run/logKeep_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +Don't\ keep\ this\ build\ forever=\u041D\u0435\u043C\u043E\u0458 \u0437\u0430\u0434\u0440\u0436\u0430\u0442\u0438 \u043E\u0432\u0443 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0443 +Keep\ this\ build\ forever=\u0417\u0430\u0434\u0440\u0436\u0438 \u043E\u0432\u0443 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0443 +Don''t\ keep\ this\ build\ forever=\u041D\u0435\u043C\u043E\u0458 \u0437\u0430\u0434\u0440\u0436\u0430\u0442\u0438 \u043E\u0432\u0443 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0443 diff --git a/core/src/main/resources/hudson/model/RunParameterDefinition/config_pl.properties b/core/src/main/resources/hudson/model/RunParameterDefinition/config_pl.properties new file mode 100644 index 0000000000000000000000000000000000000000..7b9a58280381a14b57c42d0401c8886a792057ae --- /dev/null +++ b/core/src/main/resources/hudson/model/RunParameterDefinition/config_pl.properties @@ -0,0 +1,29 @@ +# The MIT License +# +# Copyright (c) 2016, Damiani Szczepanik +# +# 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. +Filter=Filtr +Completed\ Builds\ Only=Tylko zadania zako\u0144czone +Successful\ Builds\ Only=Tylko zadania zako\u0144czone sukcesem +Project=Projekt +Name=Nazwa +All\ Builds=Wszystkie zadania +Stable\ Builds\ Only=Tylko stabilne zadania +Description=Opis diff --git a/core/src/main/resources/hudson/model/RunParameterDefinition/config_sr.properties b/core/src/main/resources/hudson/model/RunParameterDefinition/config_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..0f48747b5adc43813e160680d33536a67096363b --- /dev/null +++ b/core/src/main/resources/hudson/model/RunParameterDefinition/config_sr.properties @@ -0,0 +1,10 @@ +# This file is under the MIT License by authors + +Name=\u0418\u043C\u0435 +Project=\u041F\u0440\u043E\u0458\u0435\u043A\u0430\u0442 +Description=\u041E\u043F\u0438\u0441 +Filter=\u0424\u0438\u043B\u0442\u0435\u0440 +All\ Builds=\u0421\u0432\u0435 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 +Completed\ Builds\ Only=\u0421\u0430\u043C\u043E \u0437\u0430\u0432\u0440\u0448\u0435\u043D\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 +Successful\ Builds\ Only=\u0421\u0430\u043C\u043E \u0443\u0441\u043F\u0435\u0448\u043D\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 +Stable\ Builds\ Only=\u0421\u0430\u043C\u043E \u0441\u0442\u0430\u0431\u0438\u043B\u043D\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 diff --git a/core/src/main/resources/hudson/model/RunParameterDefinition/index.jelly b/core/src/main/resources/hudson/model/RunParameterDefinition/index.jelly index 62dbc444695eeda4fdede21d448bbc958894f5bf..db37d683d3e60dfce2fbfccbb698b239d39236f0 100644 --- a/core/src/main/resources/hudson/model/RunParameterDefinition/index.jelly +++ b/core/src/main/resources/hudson/model/RunParameterDefinition/index.jelly @@ -26,7 +26,8 @@ THE SOFTWARE. - + +
        diff --git a/core/src/main/resources/hudson/model/StringParameterValue/value.jelly b/core/src/main/resources/hudson/model/StringParameterValue/value.jelly index 961a583d2920cdd2663ae7aef7a2a9646f70dcfa..e3de9ff09a34026b96b498a0ab889bc7b85762b4 100644 --- a/core/src/main/resources/hudson/model/StringParameterValue/value.jelly +++ b/core/src/main/resources/hudson/model/StringParameterValue/value.jelly @@ -26,7 +26,8 @@ THE SOFTWARE. - + + \ No newline at end of file diff --git a/core/src/main/resources/hudson/model/TaskAction/log_sr.properties b/core/src/main/resources/hudson/model/TaskAction/log_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..9f1c8091f3f190584b6d80762824f66dae0fb98c --- /dev/null +++ b/core/src/main/resources/hudson/model/TaskAction/log_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Clear\ error\ to\ retry=\u0418\u0437\u0431\u0440\u0438\u0448\u0438 \u0433\u0440\u0435\u0448\u043A\u0443 \u0438 \u043F\u043E\u043D\u043E\u0432\u043E \u043F\u043E\u043A\u0443\u0448\u0430\u0458 diff --git a/core/src/main/resources/hudson/model/TextParameterDefinition/config_pl.properties b/core/src/main/resources/hudson/model/TextParameterDefinition/config_pl.properties new file mode 100644 index 0000000000000000000000000000000000000000..f825b49123faabb9119767e56ee9da726d1065d0 --- /dev/null +++ b/core/src/main/resources/hudson/model/TextParameterDefinition/config_pl.properties @@ -0,0 +1,24 @@ +# The MIT License +# +# Copyright (c) 2016, Damian Szczepanik +# +# 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. +Name=Nazwa +Default\ Value=Domy\u015Blna warto\u015B\u0107 +Description=Opis diff --git a/core/src/main/resources/hudson/model/TextParameterDefinition/config_sr.properties b/core/src/main/resources/hudson/model/TextParameterDefinition/config_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..cf61857320cdf09d347e042b898d227464304114 --- /dev/null +++ b/core/src/main/resources/hudson/model/TextParameterDefinition/config_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +Name=\u0418\u043C\u0435 +Default\ Value=\u041F\u043E\u0434\u0440\u0430\u0437\u0443\u043C\u0435\u0432\u0430\u043D\u0430 \u0432\u0440\u0435\u0434\u043D\u043E\u0441\u0442 +Description=\u041E\u043F\u0438\u0441 diff --git a/core/src/main/resources/hudson/model/TextParameterDefinition/index.jelly b/core/src/main/resources/hudson/model/TextParameterDefinition/index.jelly index fa19ca26ba96653646bbd5bb1326be0b83405b75..87e48fd16b8b7ae89e0c4a93a84fd8eb35135728 100644 --- a/core/src/main/resources/hudson/model/TextParameterDefinition/index.jelly +++ b/core/src/main/resources/hudson/model/TextParameterDefinition/index.jelly @@ -24,7 +24,8 @@ THE SOFTWARE. --> - + +
        diff --git a/core/src/main/resources/hudson/model/TextParameterValue/value.jelly b/core/src/main/resources/hudson/model/TextParameterValue/value.jelly index 5c089e0ac0eae43e60744e094384eeed5b663108..8ae92827ade16c6d764956730c079ab372f6c397 100644 --- a/core/src/main/resources/hudson/model/TextParameterValue/value.jelly +++ b/core/src/main/resources/hudson/model/TextParameterValue/value.jelly @@ -26,7 +26,8 @@ THE SOFTWARE. - + + \ No newline at end of file diff --git a/core/src/main/resources/hudson/model/TreeView/sidepanel2_sr.properties b/core/src/main/resources/hudson/model/TreeView/sidepanel2_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..f8ec299e020f6eb33f50a540d14d21a6d7cfde3b --- /dev/null +++ b/core/src/main/resources/hudson/model/TreeView/sidepanel2_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +New\ View=\u041D\u043E\u0432\u0438 \u043F\u0440\u0435\u0433\u043B\u0435\u0434 diff --git a/core/src/main/resources/hudson/model/UpdateCenter/ConnectionCheckJob/row_sr.properties b/core/src/main/resources/hudson/model/UpdateCenter/ConnectionCheckJob/row_sr.properties index fa1e2190e2a1567c2902e80825e1b0d2d293780d..05cfddd60fb4ef6900ba6253dec69eb74cff472d 100644 --- a/core/src/main/resources/hudson/model/UpdateCenter/ConnectionCheckJob/row_sr.properties +++ b/core/src/main/resources/hudson/model/UpdateCenter/ConnectionCheckJob/row_sr.properties @@ -1,3 +1,3 @@ # This file is under the MIT License by authors -Preparation=Priprema +Preparation=\u041F\u0440\u0438\u043F\u0440\u0435\u043C\u0430\u045A\u0435 diff --git a/core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_ru.properties b/core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_ru.properties new file mode 100644 index 0000000000000000000000000000000000000000..0995f00f6c1289d39811b735375821e961e5925c --- /dev/null +++ b/core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_ru.properties @@ -0,0 +1,26 @@ +# The MIT License +# +# Copyright (c) 2004-, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributors +# +# 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. + +NewVersionAvailable=\u0414\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u043d\u043e\u0432\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f +Retry=\u041f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u044c +UpgradeComplete=\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u043e +UpgradeFailed=\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c diff --git a/core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_sr.properties b/core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..c5eac1c6208bfe11b8992059ec3cc67ccf50c47a --- /dev/null +++ b/core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_sr.properties @@ -0,0 +1,9 @@ +# This file is under the MIT License by authors + +UpgradeComplete=\u0410\u0436\u0443\u0440\u0438\u0440\u0430\u045A\u0435 \u0458\u0435 \u0433\u043E\u0442\u043E\u0432\u043E +UpgradeCompleteRestartNotSupported=\u0410\u0436\u0443\u0440\u0438\u0440\u0430\u045A\u0435 \u0458\u0435 \u0433\u043E\u0442\u043E\u0432\u043E, \u0430\u043B\u0438 \u043D\u0438\u0458\u0435 \u043C\u043E\u0433\u0443\u045B\u0435 \u043F\u043E\u043D\u043E\u0432\u043E \u043F\u043E\u043A\u0440\u0435\u0442\u0430\u045A\u0435. +UpgradeFailed=\u0410\u0436\u0443\u0440\u0438\u0440\u0430\u045A\u0435 \u0458\u0435 \u043D\u0435\u0443\u0441\u043F\u0435\u0448\u043D\u043E +Retry=\u041F\u043E\u043A\u0443\u0448\u0430\u0458 \u043F\u043E\u043D\u043E\u0432\u043E +UpgradeProgress=\u041D\u0430\u043F\u0440\u0435\u0434\u0430\u043A \u0430\u0436\u0443\u0440\u0438\u0440\u0430\u045A\u0430 +NewVersionAvailable=\u0418\u043C\u0430 \u043D\u043E\u0432\u0430 \u0432\u0435\u0440\u0437\u0438\u0458\u0430 +Or\ Upgrade\ Automatically=\u0438\u043B\u0438 \u0430\u0436\u0443\u0440\u0438\u0440\u0430\u0458 \u0430\u0443\u0442\u043E\u043C\u0430\u0442\u0441\u043A\u043E diff --git a/core/src/main/resources/hudson/model/UpdateCenter/DownloadJob/Failure/status_sr.properties b/core/src/main/resources/hudson/model/UpdateCenter/DownloadJob/Failure/status_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..08ab00907c71b78a41b29889c939518eb8d92f9c --- /dev/null +++ b/core/src/main/resources/hudson/model/UpdateCenter/DownloadJob/Failure/status_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Failure=\u0413\u0440\u0435\u0448\u043A\u0430 +Details=\u0414\u0435\u0442\u0430\u0459\u0438 diff --git a/core/src/main/resources/hudson/model/UpdateCenter/DownloadJob/Installing/status_sr.properties b/core/src/main/resources/hudson/model/UpdateCenter/DownloadJob/Installing/status_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..f9195b9f58e4401d0955412e87159a09e568223f --- /dev/null +++ b/core/src/main/resources/hudson/model/UpdateCenter/DownloadJob/Installing/status_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Installing=\u0418\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u0430 diff --git a/core/src/main/resources/hudson/model/UpdateCenter/DownloadJob/Pending/status_sr.properties b/core/src/main/resources/hudson/model/UpdateCenter/DownloadJob/Pending/status_sr.properties index baf65f0336f049e5bf10a83f92bbf2e7c1585179..cf0838acf528c4a923cbcfc821b88453cd708849 100644 --- a/core/src/main/resources/hudson/model/UpdateCenter/DownloadJob/Pending/status_sr.properties +++ b/core/src/main/resources/hudson/model/UpdateCenter/DownloadJob/Pending/status_sr.properties @@ -1,3 +1,3 @@ # This file is under the MIT License by authors -Pending=U toku +Pending=\u0423 \u0442\u043E\u043A\u0443 diff --git a/core/src/main/resources/hudson/model/UpdateCenter/DownloadJob/Success/status_sr.properties b/core/src/main/resources/hudson/model/UpdateCenter/DownloadJob/Success/status_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..66d22b692af99cea0939fe26f38b15044e8ce145 --- /dev/null +++ b/core/src/main/resources/hudson/model/UpdateCenter/DownloadJob/Success/status_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Success=\u0423\u0441\u043F\u0435\u0448\u043D\u043E diff --git a/core/src/main/resources/hudson/model/UpdateCenter/EnableJob/row_sr.properties b/core/src/main/resources/hudson/model/UpdateCenter/EnableJob/row_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..3af25ed5fbf53c6f83f82478b1651df22a7f2176 --- /dev/null +++ b/core/src/main/resources/hudson/model/UpdateCenter/EnableJob/row_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Enabled\ Dependency=\u041E\u043C\u043E\u0433\u0443\u045B\u0435\u043D\u0430 \u0437\u0430\u0432\u0438\u0441\u043D\u0430 \u043C\u043E\u0434\u0443\u043B\u0430 diff --git a/core/src/main/resources/hudson/model/UpdateCenter/NoOpJob/row_pl.properties b/core/src/main/resources/hudson/model/UpdateCenter/NoOpJob/row_pl.properties new file mode 100644 index 0000000000000000000000000000000000000000..44f44ba29296b81e78c3643ead568f67545ba29c --- /dev/null +++ b/core/src/main/resources/hudson/model/UpdateCenter/NoOpJob/row_pl.properties @@ -0,0 +1,22 @@ +# The MIT License +# +# Copyright (c) 2017, Damian Szczepanik +# +# 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. +Already\ Installed=Ju\u017C zainstalowano diff --git a/core/src/main/resources/hudson/model/UpdateCenter/NoOpJob/row_ru.properties b/core/src/main/resources/hudson/model/UpdateCenter/NoOpJob/row_ru.properties new file mode 100644 index 0000000000000000000000000000000000000000..e2a00fa012c120999e077a2b1b144031adfdc0b0 --- /dev/null +++ b/core/src/main/resources/hudson/model/UpdateCenter/NoOpJob/row_ru.properties @@ -0,0 +1,23 @@ +# The MIT License +# +# Copyright (c) 2004-, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributors +# +# 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. + +Already\ Installed=\u0423\u0436\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e \ No newline at end of file diff --git a/core/src/main/resources/hudson/model/UpdateCenter/NoOpJob/row_sr.properties b/core/src/main/resources/hudson/model/UpdateCenter/NoOpJob/row_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..c9523af58af1af95a6710ad2c2bc14a089d3de12 --- /dev/null +++ b/core/src/main/resources/hudson/model/UpdateCenter/NoOpJob/row_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Already\ Installed=\u0412\u0435\u045B \u0438\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u043D\u043E diff --git a/core/src/main/resources/hudson/model/UpdateCenter/RestartJenkinsJob/Canceled/status_sr.properties b/core/src/main/resources/hudson/model/UpdateCenter/RestartJenkinsJob/Canceled/status_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..efa35bc645facadd3beea5309dff454831dcc9f3 --- /dev/null +++ b/core/src/main/resources/hudson/model/UpdateCenter/RestartJenkinsJob/Canceled/status_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Canceled=\u041E\u0442\u043A\u0430\u0437\u0430\u043D\u043E diff --git a/core/src/main/resources/lib/form/apply_es.properties b/core/src/main/resources/hudson/model/UpdateCenter/RestartJenkinsJob/Failure/status_ru.properties similarity index 93% rename from core/src/main/resources/lib/form/apply_es.properties rename to core/src/main/resources/hudson/model/UpdateCenter/RestartJenkinsJob/Failure/status_ru.properties index 2fd7068288eb6cc5c1d4971df02afd646e4a2d9e..742c133e614c872e088d321fc720468a81746eab 100644 --- a/core/src/main/resources/lib/form/apply_es.properties +++ b/core/src/main/resources/hudson/model/UpdateCenter/RestartJenkinsJob/Failure/status_ru.properties @@ -1,6 +1,6 @@ # The MIT License # -# Copyright (c) 2004-, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributers +# Copyright (c) 2004-, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributors # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -20,4 +20,4 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Apply=Aplicar los cambios +Failure=\u041e\u0448\u0438\u0431\u043a\u0430 \ No newline at end of file diff --git a/core/src/main/resources/hudson/model/UpdateCenter/RestartJenkinsJob/Failure/status_sr.properties b/core/src/main/resources/hudson/model/UpdateCenter/RestartJenkinsJob/Failure/status_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..17c0cafed8bfd6890aa42d37fe755c5eda6def75 --- /dev/null +++ b/core/src/main/resources/hudson/model/UpdateCenter/RestartJenkinsJob/Failure/status_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Failure=\u0413\u0440\u0435\u0448\u043A\u0430 diff --git a/core/src/main/resources/hudson/model/UpdateCenter/RestartJenkinsJob/Pending/status_sr.properties b/core/src/main/resources/hudson/model/UpdateCenter/RestartJenkinsJob/Pending/status_sr.properties index baf65f0336f049e5bf10a83f92bbf2e7c1585179..cf0838acf528c4a923cbcfc821b88453cd708849 100644 --- a/core/src/main/resources/hudson/model/UpdateCenter/RestartJenkinsJob/Pending/status_sr.properties +++ b/core/src/main/resources/hudson/model/UpdateCenter/RestartJenkinsJob/Pending/status_sr.properties @@ -1,3 +1,3 @@ # This file is under the MIT License by authors -Pending=U toku +Pending=\u0423 \u0442\u043E\u043A\u0443 diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_sl.properties b/core/src/main/resources/hudson/model/UpdateCenter/RestartJenkinsJob/Running/status_sr.properties similarity index 51% rename from core/src/main/resources/hudson/views/BuildButtonColumn/column_sl.properties rename to core/src/main/resources/hudson/model/UpdateCenter/RestartJenkinsJob/Running/status_sr.properties index 1038c11c9147ff65085a5ef3b8fcb1dfa4080c7a..7775a5ee2afa4610063a9394ab8c0a46e6c421cc 100644 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_sl.properties +++ b/core/src/main/resources/hudson/model/UpdateCenter/RestartJenkinsJob/Running/status_sr.properties @@ -1,3 +1,3 @@ # This file is under the MIT License by authors -Schedule_a_build=Na\u010Drtuj build\u003a {0} +Running=\u0412\u0440\u0448\u0438 \u0441\u0435 diff --git a/core/src/main/resources/hudson/model/UpdateCenter/RestartJenkinsJob/row_sr.properties b/core/src/main/resources/hudson/model/UpdateCenter/RestartJenkinsJob/row_sr.properties index 5ff318c3cfb5c8b4168f645a1994df7d1b7b5c78..0797fb4ce944137dcd526bb39ccb178484b70bf6 100644 --- a/core/src/main/resources/hudson/model/UpdateCenter/RestartJenkinsJob/row_sr.properties +++ b/core/src/main/resources/hudson/model/UpdateCenter/RestartJenkinsJob/row_sr.properties @@ -1,3 +1,3 @@ # This file is under the MIT License by authors -Restarting\ Jenkins=Restart Jenkins-a +Restarting\ Jenkins=\u041F\u043E\u043D\u043E\u0432\u043E \u043F\u043E\u043A\u0440\u0435\u0442\u0430\u045A\u0435 Jenkins diff --git a/core/src/main/resources/hudson/model/UpdateCenter/body_sr.properties b/core/src/main/resources/hudson/model/UpdateCenter/body_sr.properties index fc0d020534f965dac25486b71963a3851d364877..d91543fb320bcda8fc85b439a1586b240c57995e 100644 --- a/core/src/main/resources/hudson/model/UpdateCenter/body_sr.properties +++ b/core/src/main/resources/hudson/model/UpdateCenter/body_sr.properties @@ -1,5 +1,5 @@ # This file is under the MIT License by authors -Go\ back\ to\ the\ top\ page=Povratak na vrh strane -warning=Restartujte Jenkins kada se zavr\u0161i instalacija i nema job-ova koji su u toku -you\ can\ start\ using\ the\ installed\ plugins\ right\ away=Mo\u017Eete po\u010Deti da koristite instalirani dodatak odmah +Go\ back\ to\ the\ top\ page=\u041F\u043E\u0432\u0440\u0430\u0442\u0430\u043A +warning=\u041F\u043E\u043D\u043E\u0432\u043E \u043F\u043E\u043A\u0440\u0435\u043D\u0438\u0442\u0435 Jenkins \u043A\u0430\u0434\u0430 \u0431\u0443\u0434\u0435 \u0441\u0435 \u0437\u0430\u0432\u0440\u0448\u0438\u043B\u0430 \u0438\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u0430 \u0438 \u043D\u0435 \u0431\u0443\u0434\u0435 \u0431\u0438\u043B\u043E \u0437\u0430\u0434\u0430\u0442\u0430\u043A\u0430 \u0443 \u0442\u043E\u043A\u0443 +you\ can\ start\ using\ the\ installed\ plugins\ right\ away=\u041C\u043E\u0436\u0435\u0442\u0435 \u043E\u0434\u043C\u0430\u0445 \u043F\u043E\u0447\u0435\u0442\u0438 \u0434\u0430 \u043A\u043E\u0440\u0438\u0441\u0442\u0438\u0442\u0435 \u0438\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u043D\u0435 \u043C\u043E\u0434\u0443\u043B\u0435 diff --git a/core/src/main/resources/hudson/model/UpdateCenter/index_pl.properties b/core/src/main/resources/hudson/model/UpdateCenter/index_pl.properties index df69a1766b3b3dde170ab0e61badd6d910e9c170..401d01232eefc5c7c4ce0c72d9695396d6a23bbd 100644 --- a/core/src/main/resources/hudson/model/UpdateCenter/index_pl.properties +++ b/core/src/main/resources/hudson/model/UpdateCenter/index_pl.properties @@ -1,6 +1,6 @@ # The MIT License # -# Copyright (c) 2004-2010, Sun Microsystems, Inc. +# Copyright (c) 2004-2016, Sun Microsystems, Inc., Damian Szczepanik # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -21,3 +21,4 @@ # THE SOFTWARE. Installing\ Plugins/Upgrades=Instalowanie wtyczek i aktualizacji +Update\ Center=Centrum aktualizacji diff --git a/core/src/main/resources/hudson/model/UpdateCenter/index_ru.properties b/core/src/main/resources/hudson/model/UpdateCenter/index_ru.properties index 5ed90c00783687b65c62bc6070cf828618a8728a..7c6b4e96d5a5e624068420ed655878fee1cb93b0 100644 --- a/core/src/main/resources/hudson/model/UpdateCenter/index_ru.properties +++ b/core/src/main/resources/hudson/model/UpdateCenter/index_ru.properties @@ -1,23 +1,2 @@ -# The MIT License -# -# Copyright (c) 2004-2010, Sun Microsystems, Inc. -# -# 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. - -Installing\ Plugins/Upgrades=\u0423\u0441\u0442\u0430\u043D\u043E\u0432\u043A\u0430/\u043E\u0431\u043D\u043E\u0432\u043B\u0435\u043D\u0438\u0435 \u043F\u043B\u0430\u0433\u0438\u043D\u043E\u0432 +Installing\ Plugins/Upgrades=\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430/\u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432 +Update\ Center=\u0426\u0435\u043d\u0442\u0440 \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0439 diff --git a/core/src/main/resources/hudson/model/UpdateCenter/index_sr.properties b/core/src/main/resources/hudson/model/UpdateCenter/index_sr.properties index 22d5060384d5bf285cda51d20dbae81ba993e5c6..8832564b2b9ce2172051b1da7f809384f2c22416 100644 --- a/core/src/main/resources/hudson/model/UpdateCenter/index_sr.properties +++ b/core/src/main/resources/hudson/model/UpdateCenter/index_sr.properties @@ -1,3 +1,4 @@ # This file is under the MIT License by authors -Installing\ Plugins/Upgrades=Instalacija dodataka/nadogradnja +Update\ Center=\u0426\u0435\u043D\u0442\u0430\u0440 \u0437\u0430 \u0430\u0436\u0443\u0440\u0438\u0440\u0430\u045A\u0435 +Installing\ Plugins/Upgrades=\u0418\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u0430 \u043C\u043E\u0434\u0443\u043B\u0435 \u0438 \u043D\u0430\u0434\u0433\u0440\u0430\u0434\u045A\u0435 diff --git a/core/src/main/resources/hudson/model/UpdateCenter/sidepanel_sr.properties b/core/src/main/resources/hudson/model/UpdateCenter/sidepanel_sr.properties index a82734d03eb7ebf549ace1f4184283b32e7a2e5f..b2340e67976a89d618e357e659e5e89eb3bd01e7 100644 --- a/core/src/main/resources/hudson/model/UpdateCenter/sidepanel_sr.properties +++ b/core/src/main/resources/hudson/model/UpdateCenter/sidepanel_sr.properties @@ -1,5 +1,5 @@ # This file is under the MIT License by authors -Back\ to\ Dashboard=Povratak na po\u010Detnu stranu -Manage\ Jenkins=Upravljanje Jenkins-om -Manage\ Plugins=Upravljanje dodacima +Manage\ Jenkins=\u0423\u043F\u0440\u0430\u0432\u0459\u0430\u045A\u0435 Jenkins-\u043E\u043C +Manage\ Plugins=\u0423\u043F\u0440\u0430\u0432\u0459\u0430\u045A\u0435 \u043C\u043E\u0434\u0443\u043B\u0438\u043C\u0430 +Back\ to\ Dashboard=\u041D\u0430\u0437\u0430\u0434 \u043A\u0430 \u043A\u043E\u043D\u0442\u0440\u043E\u043B\u043D\u0443 \u043F\u0430\u043D\u0435\u043B\u0443 diff --git a/core/src/main/resources/hudson/model/UsageStatistics/global.groovy b/core/src/main/resources/hudson/model/UsageStatistics/global.groovy index 32428c95c32f20df6658f3b675b9b76418247709..34785a89f36ec29e9604098606b977276769af07 100644 --- a/core/src/main/resources/hudson/model/UsageStatistics/global.groovy +++ b/core/src/main/resources/hudson/model/UsageStatistics/global.groovy @@ -2,4 +2,6 @@ package hudson.model.UsageStatistics; def f=namespace(lib.FormTagLib) -f.optionalBlock( field:"usageStatisticsCollected", checked:app.usageStatisticsCollected, title:_("statsBlurb")) +f.section(title: _("Usage Statistics")) { + f.optionalBlock(field: "usageStatisticsCollected", checked: app.usageStatisticsCollected, title: _("statsBlurb")) +} diff --git a/core/src/main/resources/hudson/model/UsageStatistics/global_sr.properties b/core/src/main/resources/hudson/model/UsageStatistics/global_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..0d9545b6dc9acd505a943a5ea510de689a3fc042 --- /dev/null +++ b/core/src/main/resources/hudson/model/UsageStatistics/global_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +statsBlurb=\u041F\u043E\u043C\u043E\u0437\u0438 \u043D\u0430\u043C \u0434\u0430 \u043F\u043E\u0431\u043E\u0459\u0448\u0430\u043C\u043E Jenkins \u0448\u0430\u0459\u0435\u045B\u0438 \u0430\u043D\u043E\u043D\u0438\u043C\u043D\u0435 \u043F\u043E\u0434\u0430\u0442\u043A\u0435 \u043E \u043A\u043E\u0440\u0438\u0448\u045B\u0435\u045A\u0443 \u0438 \u0438\u0437\u0432\u0435\u0448\u0442\u0430\u0458\u0435 \u043E \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0438\u043C\u0430 Jenkins \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u0443. \ No newline at end of file diff --git a/core/src/main/resources/hudson/model/User/builds_sr.properties b/core/src/main/resources/hudson/model/User/builds_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..debfdbad945d6a20fb4c198f6ee0c8d595483014 --- /dev/null +++ b/core/src/main/resources/hudson/model/User/builds_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +title=\u0418\u0437\u0433\u0440\u0430\u0434\u045A\u0435 \u0437\u0430 {0} diff --git a/core/src/main/resources/hudson/model/User/configure_pl.properties b/core/src/main/resources/hudson/model/User/configure_pl.properties index 9f7991a2af4424bcc48327005d6bb70a42b4f5cc..ee7056f22e608cd62a6a1997e681114cbbc94f7f 100644 --- a/core/src/main/resources/hudson/model/User/configure_pl.properties +++ b/core/src/main/resources/hudson/model/User/configure_pl.properties @@ -1,4 +1,27 @@ -# This file is under the MIT License by authors +# The MIT License +# +# Copyright (c) 2004-2016, Sun Microsystems, Damian Szczepanik +# +# 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. Description=Opis Full\ name=Twoje imi\u0119 i nazwisko +# User \u2018{0}\u2019 Configuration +title=Konfiguracja u\u017Cytkownika \u2018{0}\u2019 +Save=Zapisz diff --git a/core/src/main/resources/hudson/model/User/configure_sr.properties b/core/src/main/resources/hudson/model/User/configure_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..c7fb0bbcca5c093fa9fd7d05b1396c95944af712 --- /dev/null +++ b/core/src/main/resources/hudson/model/User/configure_sr.properties @@ -0,0 +1,6 @@ +# This file is under the MIT License by authors + +title=\u041F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u043A\u0430 \u2018{0}\u2019 +Full\ name=\u0418\u043C\u0435 \u0438 \u043F\u0440\u0435\u0437\u0438\u043C\u0435 +Description=\u041E\u043F\u0438\u0441 +Save=\u0421\u0430\u0447\u0443\u0432\u0430\u0458 diff --git a/core/src/main/resources/hudson/model/User/delete_de.properties b/core/src/main/resources/hudson/model/User/delete_de.properties index 65cf14106f0edf288696977f5af77edbbd95a34f..2adbdfd815addde8d4bd1588f851444ce904722d 100644 --- a/core/src/main/resources/hudson/model/User/delete_de.properties +++ b/core/src/main/resources/hudson/model/User/delete_de.properties @@ -1,25 +1,25 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Simon Wiest -# -# 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. - -Are\ you\ sure\ about\ deleting\ the\ user\ from\ Jenkins?=\ - Mchten Sie den Benutzer wirklich lschen? -Yes=Ja +# The MIT License +# +# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Simon Wiest +# +# 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. + +Are\ you\ sure\ about\ deleting\ the\ user\ from\ Jenkins?=\ + Mchten Sie den Benutzer wirklich lschen? +Yes=Ja diff --git a/core/src/main/resources/hudson/model/User/delete_sr.properties b/core/src/main/resources/hudson/model/User/delete_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..24274a814edff5c8bf7732080b36b02f6670fa5a --- /dev/null +++ b/core/src/main/resources/hudson/model/User/delete_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Are\ you\ sure\ about\ deleting\ the\ user\ from\ Jenkins?=\u0414\u0430 \u043B\u0438 \u0436\u0435\u043B\u0438\u0442\u0435 \u0434\u0430 \u0443\u043A\u043B\u043E\u043D\u0438\u0442\u0435 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u043A\u0430 \u0441\u0430 Jenkins? +Yes=\u0414\u0430 diff --git a/core/src/main/resources/hudson/model/User/index_es.properties b/core/src/main/resources/hudson/model/User/index_es.properties index 1e459022c5cc21ac54f0f1dba8ad826bef734f1d..e11bdca7c5ae418640cfc22dca356a0d9241d763 100644 --- a/core/src/main/resources/hudson/model/User/index_es.properties +++ b/core/src/main/resources/hudson/model/User/index_es.properties @@ -20,4 +20,4 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Jenkins\ User\ Id=Id de Usuario Jerkins +Jenkins\ User\ Id=Id de Usuario Jenkins diff --git a/core/src/main/resources/hudson/model/User/index_sr.properties b/core/src/main/resources/hudson/model/User/index_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..02d60641847924e326e2fe3c293e13520424ab09 --- /dev/null +++ b/core/src/main/resources/hudson/model/User/index_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Groups=\u0413\u0440\u0443\u043F\u0435 +Jenkins\ User\ Id=Jenkins \u0438\u0434\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0446\u0438\u043E\u043D\u0438 \u0431\u0440\u043E\u0458 diff --git a/core/src/main/resources/hudson/model/User/sidepanel_eu.properties b/core/src/main/resources/hudson/model/User/sidepanel_eu.properties index 2f485ef3a4de9229f9b534013e93544807183798..a8e0793ff1e7e1d6da39659984271782a041de5a 100644 --- a/core/src/main/resources/hudson/model/User/sidepanel_eu.properties +++ b/core/src/main/resources/hudson/model/User/sidepanel_eu.properties @@ -4,4 +4,4 @@ Builds=Kompilazioak Configure=Itxuratu My\ Views=Nire Begiak People=Jendea -Status=Estatus +Status=Egoera diff --git a/core/src/main/resources/hudson/model/User/sidepanel_pl.properties b/core/src/main/resources/hudson/model/User/sidepanel_pl.properties index 5cfaa27c4a5f3fc6a70e286b168ca95d41bca29f..aaf743f998aaeb2d61ae2568398d2c6e1bb2aa15 100644 --- a/core/src/main/resources/hudson/model/User/sidepanel_pl.properties +++ b/core/src/main/resources/hudson/model/User/sidepanel_pl.properties @@ -1,7 +1,27 @@ -# This file is under the MIT License by authors +# The MIT License +# +# Copyright (c) 2004-2016, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributors +# +# 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. Builds=Zadania Configure=Konfiguracja Delete=Usu\u0144 -My\ Views=Moje widoki People=U\u017Cytkownicy +Status=Status diff --git a/core/src/main/resources/hudson/model/User/sidepanel_sr.properties b/core/src/main/resources/hudson/model/User/sidepanel_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..c7bf9e97cb812eaf9ac4d2f65a3e655291a85d36 --- /dev/null +++ b/core/src/main/resources/hudson/model/User/sidepanel_sr.properties @@ -0,0 +1,8 @@ +# This file is under the MIT License by authors + +People=\u041A\u043E\u0440\u0438\u0441\u043D\u0438\u0446\u0438 +Status=\u0421\u0442\u0430\u045A\u0435 +Builds=\u0418\u0437\u0433\u0440\u0430\u0434\u045Ae +Configure=\u041F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 +Delete=\u0423\u043A\u043B\u043E\u043D\u0438 +My\ Views=\u041C\u043E\u0458\u0438 \u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0438 diff --git a/core/src/main/resources/hudson/model/View/AsynchPeople/index_pl.properties b/core/src/main/resources/hudson/model/View/AsynchPeople/index_pl.properties index 0c78d03b5ab3f64b4a56acef58cd5aa50faa3cae..253a5acf3e58e86ae50792a8f2668f4df1259d5b 100644 --- a/core/src/main/resources/hudson/model/View/AsynchPeople/index_pl.properties +++ b/core/src/main/resources/hudson/model/View/AsynchPeople/index_pl.properties @@ -1,6 +1,6 @@ # The MIT License # -# Copyright (c) 2004-2010, Sun Microsystems, Inc. +# Copyright (c) 2004-2016, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributors # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -20,7 +20,6 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Last\ Active=Ostatnio aktywny Name=Nazwa On=Na People=U\u017Cytkownicy diff --git a/core/src/main/resources/hudson/model/View/AsynchPeople/index_sr.properties b/core/src/main/resources/hudson/model/View/AsynchPeople/index_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..a44ab2742a405a3f9ef102fb9e492a1ce97a8671 --- /dev/null +++ b/core/src/main/resources/hudson/model/View/AsynchPeople/index_sr.properties @@ -0,0 +1,10 @@ +# This file is under the MIT License by authors + +People=\u041A\u043E\u0440\u0438\u0441\u043D\u0438\u0446\u0438 +blurb=\u0422\u0430\u0431\u0435\u043B\u0430 \u0441\u0432\u0438\u0445 Jenkins \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u043A\u0430, \u0443\u043A\u0459\u0443\u0447\u0443\u0458\u0443\u045B\u0438 \u0441\u0432\u0435 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u043A\u0435 \u043A\u043E\u0458e \u0441\u0438\u0441\u0442\u0435\u043C \u0430\u0443\u0442\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0446\u0438\u0458\u0435 \u043C\u043E\u0436\u0435 \u043D\u0430\u0432\u0435\u0441\u0442\u0438, \u0438 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u0446\u0438 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438 \u0443 \u043A\u043E\u043C\u0438\u0442-\u043F\u043E\u0440\u0443\u043A\u0430\u043C\u0430 \u0435\u0432\u0438\u0434\u0435\u043D\u0442\u0438\u0440\u0430\u043D\u0438 \u0443 \u0434\u043D\u0435\u0432\u043D\u0438\u043A\u0430\u043C\u0430 \u043F\u0440\u043E\u043C\u0435\u043D\u0430. +User\ Id=\u0418\u0434\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0446\u0438\u043E\u043D\u0438 \u0431\u0440\u043E\u0458 +Name=\u0418\u043C\u0435 +Last\ Commit\ Activity=\u0417\u0430\u0434\u045A\u0435 \u0430\u043A\u0442\u0438\u0432\u0430\u043D +On=\u043D\u0430 +All\ People=\u0421\u0432\u0438 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u0446\u0438 +Last\ Active=\u0417\u0430\u0434\u045A\u0430 \u0430\u043A\u0442\u0438\u0432\u043D\u043E\u0441\u0442 diff --git a/core/src/main/resources/hudson/model/View/People/index_eu.properties b/core/src/main/resources/hudson/model/View/People/index_eu.properties index e366a8bd48ed730938b96a451f94c7a66bbfd95b..01b5e6988e7ace3d71758800be8802547ceef62e 100644 --- a/core/src/main/resources/hudson/model/View/People/index_eu.properties +++ b/core/src/main/resources/hudson/model/View/People/index_eu.properties @@ -1,3 +1,3 @@ # This file is under the MIT License by authors -People=Gendea +People=Jendea diff --git a/core/src/main/resources/hudson/model/View/People/index_sr.properties b/core/src/main/resources/hudson/model/View/People/index_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..b2ba8ffa19ffe354c0d0d1bb541a9b2382df8e43 --- /dev/null +++ b/core/src/main/resources/hudson/model/View/People/index_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +People=\u041A\u043E\u0440\u0438\u0441\u043D\u0438\u0446\u0438 +Moved\ to\ asyncPeople=\u041F\u0440\u0435\u043C\u0435\u0448\u045B\u0435\u043D\u043E \u043D\u0430 asyncPeople diff --git a/core/src/main/resources/hudson/model/View/builds_sr.properties b/core/src/main/resources/hudson/model/View/builds_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..e8da756a6969d908fdd6681bc6e8aae222eb4437 --- /dev/null +++ b/core/src/main/resources/hudson/model/View/builds_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +buildHistory=\u0418\u0441\u0442\u043E\u0440\u0438\u0458\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 {0} +Export\ as\ plain\ XML=\u0418\u0437\u0432\u0435\u0437\u0438 \u0443 \u0441\u0442\u0430\u043D\u0434\u0430\u0440\u0434\u043D\u043E\u043C XML \u0444\u043E\u0440\u043C\u0430\u0442\u0443 diff --git a/core/src/main/resources/hudson/model/View/configure.jelly b/core/src/main/resources/hudson/model/View/configure.jelly index 11d4ea1f8635a734d4a812b5bcc2cccc4e05123f..ac3f9f91c5b4a2ee0a1cbcc5ee5dfd50da9effeb 100644 --- a/core/src/main/resources/hudson/model/View/configure.jelly +++ b/core/src/main/resources/hudson/model/View/configure.jelly @@ -1,7 +1,7 @@ + + + + + diff --git a/core/src/main/resources/hudson/model/View/newJob_pl.properties b/core/src/main/resources/hudson/model/View/newJob_pl.properties index 98a5d8467b8edc53479e46d2bff278c41869e33e..fe4e02142456f9e243bf774e64f5e16cfc8ca6ce 100644 --- a/core/src/main/resources/hudson/model/View/newJob_pl.properties +++ b/core/src/main/resources/hudson/model/View/newJob_pl.properties @@ -1,6 +1,6 @@ # The MIT License # -# Copyright (c) 2004-2010, Sun Microsystems, Inc. +# Copyright (c) 2004-2016, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributors # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -21,7 +21,6 @@ # THE SOFTWARE. NewJob=Nowy {0} -JobName=Nazwa {0} ItemName.help=Pole wymagane ItemName.label=Podaj nazw\u0119 projektu ItemName.validation.required=To pole nie mo\u017Ce by\u0107 puste, podaj nazw\u0119 projektu @@ -29,4 +28,3 @@ ItemType.validation.required=Wybierz rodzaj projektu CopyOption.placeholder=Podaj nazw\u0119 CopyOption.description=Je\u015Bli chcesz stworzy\u0107 nowy projekt na podstawie istniej\u0105cego, mo\u017Cesz u\u017Cy\u0107 tej opcji CopyOption.label=Kopiuj z -CopyExisting=Kopiuj z istniej\u0105cego {0} diff --git a/core/src/main/resources/hudson/model/View/newJob_ru.properties b/core/src/main/resources/hudson/model/View/newJob_ru.properties index f5facf11210e4e39fdc1ef46678af1b95f772331..601d6f33654aead5ec740426a75e6a591ca52b44 100644 --- a/core/src/main/resources/hudson/model/View/newJob_ru.properties +++ b/core/src/main/resources/hudson/model/View/newJob_ru.properties @@ -1,24 +1,13 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Mike Salnikov -# -# 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. +CopyExisting=\u041a\u043e\u043f\u0438\u044f \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e {0}''\u0430 -CopyExisting=\u041A\u043E\u043F\u0438\u044F \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044E\u0449\u0435\u0433\u043E {0}''\u0430 -JobName=\u0418\u043C\u044F {0}''\u0430 +CopyOption.description=\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u044d\u0442\u0443 \u043e\u043f\u0446\u0438\u044e, \u0435\u0441\u043b\u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0441\u043e\u0437\u0434\u0430\u0442\u044c Item \u0438\u0437 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e +CopyOption.label=\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0437 +CopyOption.placeholder=\u0418\u043c\u044f + +ItemName.help=\u041e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043f\u043e\u043b\u0435 +ItemName.label=\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0438\u043c\u044f Item''\u0430 +ItemName.validation.required=\u041f\u043e\u043b\u0435 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0443\u0441\u0442\u044b\u043c, \u0432\u0432\u0435\u0434\u0438\u0442\u0435 \u0438\u043c\u044f + +ItemType.validation.required=\u0423\u043a\u0430\u0436\u0438\u0442\u0435 \u0442\u0438\u043f \u044d\u043b\u0435\u043c\u0435\u043d\u0442''\u0430 +JobName=\u0418\u043c\u044f {0}''\u0430 +NewJob=\u041d\u043e\u0432\u044b\u0439 {0} diff --git a/core/src/main/resources/hudson/model/View/newJob_sr.properties b/core/src/main/resources/hudson/model/View/newJob_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..8431e7c839d1128abb2d0cf9073b92957636f1de --- /dev/null +++ b/core/src/main/resources/hudson/model/View/newJob_sr.properties @@ -0,0 +1,13 @@ +# This file is under the MIT License by authors + +NewJob=\u041D\u043E\u0432\u0430 {0} +ItemName.label=\u0423\u043D\u0435\u0441\u0438\u0442\u0435 \u0438\u043C\u0435 \u043E\u0431\u0458\u0435\u043A\u0442\u0430 +ItemName.help=\u041E\u0431\u0430\u0432\u0435\u0437\u043D\u043E \u043F\u043E\u0459\u0435 +ItemName.validation.required=\u041F\u043E\u0459\u0435 \u043D\u0435 \u043C\u043E\u0436\u0435 \u0431\u0438\u0442\u0438 \u043F\u0440\u0430\u0437\u043D\u043E. \u0423\u043D\u0435\u0441\u0438\u0442\u0435 \u0432\u0430\u0436\u0435\u045B\u0435 \u0438\u043C\u0435. +ItemType.validation.required=\u0423\u043D\u0435\u0441\u0438\u0442\u0435 \u0442\u0438\u043F \u043E\u0431\u0458\u0435\u043A\u0442\u0430 +CopyOption.description=\u043E\u0432\u043E \u0432\u0430\u043C \u043E\u043C\u043E\u0433\u0443\u045B\u0430\u0432\u0430 \u0434\u0430 \u043A\u0440\u0435\u0438\u0440\u0430\u0442\u0435 \u043D\u043E\u0432\u0438 \u043E\u0431\u0458\u0435\u043A\u0430\u0442 \u043D\u0430 \u043E\u0441\u043D\u043E\u0432\u0443 \u043F\u043E\u0441\u0442\u043E\u0458\u0435\u045B\u0435\u0433. +CopyOption.label=\u041A\u043E\u043F\u0438\u0440\u0430\u0458 \u043E\u0434 +CopyOption.placeholder=\u0423\u043D\u0435\u0448\u0435\u043D\u043E \u0438\u043C\u0435 \u045B\u0435 \u0441\u0435 \u0430\u0443\u0442\u043E\u043C\u0430\u0442\u0441\u043A\u0438 \u0434\u043E\u043F\u0438\u0441\u0430\u043D\u043E +JobName=\u041D\u0430\u0437\u0438\u0432 {0} +CopyExisting=\u041A\u043E\u043F\u0438\u0440\u0430\u0458 \u043F\u043E\u0441\u0442\u043E\u0458\u0435\u045B\u0435\u0433 {0} +Copy\ from= diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_ar.properties b/core/src/main/resources/hudson/model/View/noJob_pl.properties similarity index 80% rename from core/src/main/resources/hudson/views/BuildButtonColumn/column_ar.properties rename to core/src/main/resources/hudson/model/View/noJob_pl.properties index ecd7fa7c47f75c24b8d89ca78d3bab78da069994..671c916980a567b529327abd7f71b00e399cf1a6 100644 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_ar.properties +++ b/core/src/main/resources/hudson/model/View/noJob_pl.properties @@ -1,6 +1,6 @@ # The MIT License # -# Copyright (c) 2004-2010, Sun Microsystems, Inc. +# Copyright (c) 2017, Damian Szczepanik # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -19,6 +19,5 @@ # 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=\u0627\u0644\u0628\u0646\u0627\u0621 \u0645\u0642\u0631\u0631 -Schedule_a_build=\u062A\u062D\u062F\u064A\u062F \u0645\u0648\u0639\u062F \u0644\u0644\u0628\u0646\u0627\u0621\u003a {0} +description_1=Ten widok nie ma przypisanych projekt\u00F3w. +description_2=Mo\u017Cesz doda\u0107 istniej\u0105ce projekty do tego widoku lub stworzy\u0107 dla niego nowe. diff --git a/core/src/main/resources/hudson/model/View/noJob_sr.properties b/core/src/main/resources/hudson/model/View/noJob_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..48fa3dc5f4fdb3b7e4dce2d670ce7ff0c743a90d --- /dev/null +++ b/core/src/main/resources/hudson/model/View/noJob_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +description_1=\u041D\u0435 \u043F\u043E\u0441\u0442\u043E\u0458\u0438 \u043D\u0438 \u0458\u0435\u0434\u0430\u043D \u0437\u0430\u0434\u0430\u0442\u0430\u043A \u0437\u0430 \u043E\u0432\u0430\u0458 \u043F\u0440\u0435\u0433\u043B\u0435\u0434. +description_2=\u041C\u043E\u0436\u0435\u0442\u0435 \u0434\u043E\u0434\u0430\u0442\u0438 \u043F\u043E\u0441\u0442\u043E\u0458\u0435\u045B\u0430 \u0437\u0430\u0434\u0430\u0442\u0430\u043A\u0430 \u043D\u0430 \u043E\u0432\u043E\u043C \u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0443 \u0438\u043B\u0438 \u043A\u0440\u0435\u0438\u0440\u0430\u0458\u0442\u0435 \u043D\u043E\u0432\u0438 \u0437\u0430\u0434\u0430\u0442\u0430\u043A \u0437\u0430 \u043E\u0432\u0435 \u0432\u0440\u0441\u0442\u0435. diff --git a/core/src/main/resources/hudson/model/View/sidepanel_lt.properties b/core/src/main/resources/hudson/model/View/sidepanel_lt.properties index b2a588be6f658a60223879ea7224528d11526cf2..e4ed86f9dcd90d5f00a7c05efa5009453d196015 100644 --- a/core/src/main/resources/hudson/model/View/sidepanel_lt.properties +++ b/core/src/main/resources/hudson/model/View/sidepanel_lt.properties @@ -1,9 +1,9 @@ -# /jenkins-core/src/main/resources/hudson/model/View/sidepanel_lt.properties - -Build\ History=U\u017Eduo\u010Di\u0173 istorija -Check\ File\ Fingerprint=Tikrinti failo antspaud\u0105 -Delete\ View=I\u0161trinti skilt\u012F -Edit\ View=Redaguoti skilt\u012F -NewJob=Naujas {0} -People=\u017Dmon\u0117s -Project\ Relationship=Projekto S\u0105ry\u0161iai +# /jenkins-core/src/main/resources/hudson/model/View/sidepanel_lt.properties + +Build\ History=U\u017Eduo\u010Di\u0173 istorija +Check\ File\ Fingerprint=Tikrinti failo antspaud\u0105 +Delete\ View=I\u0161trinti skilt\u012F +Edit\ View=Redaguoti skilt\u012F +NewJob=Naujas {0} +People=\u017Dmon\u0117s +Project\ Relationship=Projekto S\u0105ry\u0161iai diff --git a/core/src/main/resources/hudson/model/View/sidepanel_pl.properties b/core/src/main/resources/hudson/model/View/sidepanel_pl.properties index c911ad469a087efb715d8f47cbdf4f530f6d8ab5..d600f794c6b1e42dde443c57accd9e28f9fb1c8f 100644 --- a/core/src/main/resources/hudson/model/View/sidepanel_pl.properties +++ b/core/src/main/resources/hudson/model/View/sidepanel_pl.properties @@ -1,6 +1,6 @@ # The MIT License # -# Copyright (c) 2004-2010, Sun Microsystems, Inc. +# Copyright (c) 2004-2016, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributors # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -24,8 +24,6 @@ Build\ History=Historia zada\u0144 Check\ File\ Fingerprint=Sprawd\u017A odcisk palca pliku Delete\ View=Usu\u0144 widok Edit\ View=Edytuj widok -Manage\ Jenkins= -New\ Job=Nowe zadanie NewJob=Nowy {0} People=U\u017Cytkownicy Project\ Relationship=Projekty powi\u0105zane diff --git a/core/src/main/resources/hudson/model/View/sidepanel_sl.properties b/core/src/main/resources/hudson/model/View/sidepanel_sl.properties index a0a85ee14cd4995023553d88125b4b47ac71782d..c3342f4d67bb2378a80a7a940da9244a765f950d 100644 --- a/core/src/main/resources/hudson/model/View/sidepanel_sl.properties +++ b/core/src/main/resources/hudson/model/View/sidepanel_sl.properties @@ -21,9 +21,7 @@ # THE SOFTWARE. Build\ History=Zgodovina prevajanja -Check\ File\ Fingerprint=Otisci guza Delete\ View=Izbri\u0161i pogled Edit\ View=Uredi pogled NewJob=Nov People=Uporabniki -Project\ Relationship=With my ass diff --git a/core/src/main/resources/hudson/model/View/sidepanel_sr.properties b/core/src/main/resources/hudson/model/View/sidepanel_sr.properties index 0564fcdb0e6f8e55f670a08210ca5dd3c6246508..9e96c154ad099b8597e2c0cfd99b9e5c6568176b 100644 --- a/core/src/main/resources/hudson/model/View/sidepanel_sr.properties +++ b/core/src/main/resources/hudson/model/View/sidepanel_sr.properties @@ -20,9 +20,11 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Build\ History=Istorija Gradnje -Check\ File\ Fingerprint=Proveri verziju fajla -Edit\ View=\u0418\u0437\u043C\u0435\u043D\u0438 \u043F\u043E\u0433\u043B\u0435\u0434 -NewJob=\u041D\u043E\u0432\u043E{0} -People=\u0409\u0443\u0434\u0438 -Project\ Relationship=Veze projekta +Build\ History=\u0418\u0441\u0442\u043E\u0440\u0438\u0458\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 +Check\ File\ Fingerprint=\u041F\u0440\u043E\u0432\u0435\u0440\u0438 \u043E\u0442\u0438\u0441\u0430\u043A \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0435 +Edit\ View=\u0423\u0440\u0435\u0434\u0438 \u043F\u043E\u0433\u043B\u0435\u0434 +NewJob=\u041D\u043E\u0432\u0438 {0} +People=\u041A\u043E\u0440\u0438\u0441\u043D\u0438\u0446\u0438 +Project\ Relationship=\u0412\u0435\u0437\u0435 \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u0430 +Delete\ View=\u0423\u043A\u043B\u043E\u043D\u0438 \u043F\u0440\u0435\u0433\u043B\u0435\u0434 +Manage\ Jenkins=\u0423\u043F\u0440\u0430\u0432\u0459\u0430\u045A\u0435 Jenkins-\u043E\u043C diff --git a/core/src/main/resources/hudson/model/labels/LabelAtom/configure_sr.properties b/core/src/main/resources/hudson/model/labels/LabelAtom/configure_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..80aa26570b8c60b2817f4201a1f260c10b6a639b --- /dev/null +++ b/core/src/main/resources/hudson/model/labels/LabelAtom/configure_sr.properties @@ -0,0 +1,6 @@ +# This file is under the MIT License by authors + +title={0} \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 +Name=\u0418\u043C\u0435 +Description=\u041E\u043F\u0438\u0441 +Save=\u0421\u0430\u0447\u0443\u0432\u0430\u0458 diff --git a/core/src/main/resources/hudson/model/queue/CauseOfBlockage/BecauseLabelIsBusy/summary_sr.properties b/core/src/main/resources/hudson/model/queue/CauseOfBlockage/BecauseLabelIsBusy/summary_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..f7db17964297bc4eed66b393d60173f8a83dc2a7 --- /dev/null +++ b/core/src/main/resources/hudson/model/queue/CauseOfBlockage/BecauseLabelIsBusy/summary_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +description=\u0427\u0435\u043A\u0430\u045A\u0435 \u043D\u0430 \u0441\u043B\u0435\u0434\u0435\u045B\u0435\u0433 \u0441\u043B\u043E\u0431\u043E\u0434\u043D\u043E\u0433 \u0438\u0437\u0432\u0440\u0448\u0438\u0442\u0435\u0459\u0430 \u043D\u0430 {0} \ No newline at end of file diff --git a/core/src/main/resources/hudson/model/queue/CauseOfBlockage/BecauseLabelIsOffline/summary_sr.properties b/core/src/main/resources/hudson/model/queue/CauseOfBlockage/BecauseLabelIsOffline/summary_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..7329a5ac921280d1663e3b36a2eeb127bb5cbead --- /dev/null +++ b/core/src/main/resources/hudson/model/queue/CauseOfBlockage/BecauseLabelIsOffline/summary_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +description=\u0421\u0432\u0435 \u043C\u0430\u0448\u0438\u043D\u0435 \u043F\u043E\u0434 \u043B\u0430\u0431\u0435\u043B\u043E\u043C \u2018{0}\u2019 \u0441\u0443 \u0432\u0430\u043D \u043C\u0440\u0435\u0436\u0435 +description_no_nodes=\u041D\u0435\u043C\u0430 \u043C\u0430\u0448\u0438\u043D\u0430 \u043F\u043E\u0434 \u043B\u0430\u0431\u0435\u043B\u043E\u043C \u2018{0}\u2019 \ No newline at end of file diff --git a/core/src/main/resources/hudson/model/queue/CauseOfBlockage/BecauseNodeIsBusy/summary_sr.properties b/core/src/main/resources/hudson/model/queue/CauseOfBlockage/BecauseNodeIsBusy/summary_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..1d9d648042e85b90d23824f0586c6c0e33985cf6 --- /dev/null +++ b/core/src/main/resources/hudson/model/queue/CauseOfBlockage/BecauseNodeIsBusy/summary_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +description=\u0427\u0435\u043A\u0430 \u0441\u0435 \u043D\u0430 \u0441\u043B\u0435\u0434\u0435\u045B\u0435\u0433 \u0441\u043B\u043E\u0431\u043E\u0434\u043D\u043E\u0433 \u0438\u0437\u0432\u0440\u0448\u0438\u0442\u0435\u0459\u0430 \u043D\u0430 {0} \ No newline at end of file diff --git a/core/src/main/resources/hudson/model/queue/CauseOfBlockage/BecauseNodeIsOffline/summary_sr.properties b/core/src/main/resources/hudson/model/queue/CauseOfBlockage/BecauseNodeIsOffline/summary_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..1359469323066be2ce2d18751f4cface24af3a58 --- /dev/null +++ b/core/src/main/resources/hudson/model/queue/CauseOfBlockage/BecauseNodeIsOffline/summary_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +description={0} \u0458\u0435 \u0432\u0430\u043D \u043D\u0440\u0435\u0436\u0435 \ No newline at end of file diff --git a/core/src/main/resources/hudson/model/queue/Messages_de.properties b/core/src/main/resources/hudson/model/queue/Messages_de.properties index 0225d821ab5413482312a40ab4ab277c0fedb258..5eeedc6b3e3b3161f2852dd083c4123381d7c5a7 100644 --- a/core/src/main/resources/hudson/model/queue/Messages_de.properties +++ b/core/src/main/resources/hudson/model/queue/Messages_de.properties @@ -1,23 +1,23 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Simon Wiest -# -# 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. - +# The MIT License +# +# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Simon Wiest +# +# 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. + QueueSorter.installDefaultQueueSorter=Installiere Default-Sortierung der Build-Warteschlage (build queue) \ No newline at end of file diff --git a/core/src/main/resources/hudson/model/queue/Messages_sr.properties b/core/src/main/resources/hudson/model/queue/Messages_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..db51451ccdab1d6dbebcae999479ee31c9fb92f2 --- /dev/null +++ b/core/src/main/resources/hudson/model/queue/Messages_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +QueueSorter.installDefaultQueueSorter=\u0418\u043D\u0441\u0442\u0430\u043B\u0430\u043B\u0438\u0440\u0430\u045A\u0435 \u0441\u0442\u0430\u043D\u0434\u0430\u0440\u0434\u043D\u0443 \u043C\u043E\u0434\u0443\u043B\u0443 \u0437\u0430 \u0441\u043E\u0440\u0442\u0438\u0440\u0430\u045A\u0435 \u0440\u0435\u0434\u0430 \ No newline at end of file diff --git a/core/src/main/resources/hudson/node_monitors/AbstractDiskSpaceMonitor/config_de.properties b/core/src/main/resources/hudson/node_monitors/AbstractDiskSpaceMonitor/config_de.properties index 48606462b2080f0c1044a63e43473644c79d7b7b..753ce023dd4ad7196de62b22fe3bf0ac78ff3a5b 100644 --- a/core/src/main/resources/hudson/node_monitors/AbstractDiskSpaceMonitor/config_de.properties +++ b/core/src/main/resources/hudson/node_monitors/AbstractDiskSpaceMonitor/config_de.properties @@ -1,23 +1,23 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Simon Wiest -# -# 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. - +# The MIT License +# +# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Simon Wiest +# +# 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. + Free\ Space\ Threshold=Freier Plattenplatz Mindestgrenze \ No newline at end of file diff --git a/core/src/main/resources/hudson/node_monitors/AbstractDiskSpaceMonitor/config_pl.properties b/core/src/main/resources/hudson/node_monitors/AbstractDiskSpaceMonitor/config_pl.properties new file mode 100644 index 0000000000000000000000000000000000000000..422343bc7eddde9505221b9336d9fa6f3b31ad1f --- /dev/null +++ b/core/src/main/resources/hudson/node_monitors/AbstractDiskSpaceMonitor/config_pl.properties @@ -0,0 +1,22 @@ +# The MIT License +# +# Copyright (c) 2016, Damian Szczepanik +# +# 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. +Free\ Space\ Threshold=Dolny pr\u00F3g wolnego miejsca diff --git a/core/src/main/resources/hudson/node_monitors/AbstractDiskSpaceMonitor/config_sr.properties b/core/src/main/resources/hudson/node_monitors/AbstractDiskSpaceMonitor/config_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..940d8318b297ce6453464911cce357b9d01a520b --- /dev/null +++ b/core/src/main/resources/hudson/node_monitors/AbstractDiskSpaceMonitor/config_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Free\ Space\ Threshold=\u0413\u0440\u0430\u043D\u0438\u0447\u043D\u0430 \u0432\u0440\u0435\u0434\u043D\u043E\u0441\u0442 \u043F\u0440\u0430\u0437\u043D\u043E\u0433 \u043F\u0440\u043E\u0441\u0442\u043E\u0440\u0430 diff --git a/core/src/main/resources/hudson/node_monitors/Messages.properties b/core/src/main/resources/hudson/node_monitors/Messages.properties index 4b46e200b1a65846f9a93b3e224cfa16f16d9d74..de3cbca0a86f82b5d42b02d5fef5ac1d8b0348ee 100644 --- a/core/src/main/resources/hudson/node_monitors/Messages.properties +++ b/core/src/main/resources/hudson/node_monitors/Messages.properties @@ -32,3 +32,4 @@ SwapSpaceMonitor.DisplayName=Free Swap Space TemporarySpaceMonitor.DisplayName=Free Temp Space AbstractNodeMonitorDescriptor.NoDataYet=Not yet DiskSpaceMonitorDescriptor.DiskSpace.FreeSpaceTooLow=Disk space is too low. Only {0}GB left on {1}. +MonitorMarkedNodeOffline.DisplayName=Node Marked Offline Due to Health Check diff --git a/core/src/main/resources/hudson/node_monitors/Messages_sr.properties b/core/src/main/resources/hudson/node_monitors/Messages_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..fa6d7a521dba90b88132081f4f14095a3aed6381 --- /dev/null +++ b/core/src/main/resources/hudson/node_monitors/Messages_sr.properties @@ -0,0 +1,14 @@ +# This file is under the MIT License by authors + +ArchitectureMonitor.DisplayName=\u0410\u0440\u0445\u0438\u0442\u0435\u043A\u0442\u0443\u0440\u0430 +ClockMonitor.DisplayName=\u0420\u0430\u0437\u043B\u0438\u043A\u0430 \u0443 \u0441\u0430\u0442\u0443 +DiskSpaceMonitor.MarkedOffline=\u041F\u0440\u0438\u0432\u0440\u0435\u043C\u0435\u043D\u043E \u043E\u043D\u0435\u043C\u043E\u0433\u0443\u045B\u0443\u0458\u0435 "{0}" \u2014 \u043D\u0435\u043C\u0430 \u0434\u043E\u0432\u043E\u0459\u043D\u043E \u043F\u0440\u043E\u0441\u0442\u043E\u0440\u0430 \u043D\u0430 \u0434\u0438\u0441\u043A\u0443 +DiskSpaceMonitor.MarkedOnline=\u0423\u043A\u0459\u0443\u0447\u0443\u0458\u0435 "{0}" \u2014 \u043E\u043F\u0435\u0442 \u043F\u043E\u0441\u0442\u043E\u0458\u0438 \u0434\u043E\u0432\u043E\u0459\u043D\u043E \u043F\u0440\u043E\u0441\u0442\u043E\u0440\u0430 \u043D\u0430 \u0434\u0438\u0441\u043A\u0443 +DiskSpaceMonitor.DisplayName=\u0421\u043B\u043E\u0431\u043E\u0434\u043D\u043E\u0433 \u043F\u0440\u043E\u0441\u0442\u043E\u0440\u0430 \u043D\u0430 \u0434\u0438\u0441\u043A\u0443 +ResponseTimeMonitor.DisplayName=\u0412\u0440\u0435\u043C\u0435 \u0437\u0430 \u043E\u0434\u0433\u043E\u0432\u043E\u0440 +ResponseTimeMonitor.MarkedOffline=\u041F\u0440\u0438\u0432\u0440\u0435\u043C\u0435\u043D\u043E \u043E\u043D\u0435\u043C\u043E\u0433\u0443\u045B\u0443\u0458\u0435 "{0}" \u2014 \u043D\u0435\u043C\u0430 \u043E\u0434\u0433\u043E\u0432\u043E\u0440\u0430 +ResponseTimeMonitor.TimeOut=\u0418\u0437\u0441\u0442\u043A\u043B\u043E \u0432\u0440\u0435\u043C\u0435 \u0437\u0430 \u043F\u043E\u0441\u043B\u0435\u0434\u045A\u0438 \u043F\u043E\u043A\u0443\u0448\u0430\u0458 "{0}" +SwapSpaceMonitor.DisplayName=\u0421\u043B\u043E\u0431\u043E\u0434\u043D\u043E\u0433 \u043F\u0440\u043E\u0441\u0442\u043E\u0440\u0430 \u0437\u0430 \u0437\u0430\u043C\u0435\u043D\u043E\u043C \u043F\u0440\u043E\u0441\u0442\u043E\u0440\u0443 +TemporarySpaceMonitor.DisplayName=\u0421\u043B\u043E\u0431\u043E\u0434\u043D\u043E\u0433 \u043F\u0440\u043E\u0441\u0442\u043E\u0440\u0430 \u0437\u0430 \u043F\u0440\u0438\u0432\u0440\u0435\u043C\u0435\u043D\u043E\u043C \u043F\u0440\u043E\u0441\u0442\u043E\u0440\u0443 +AbstractNodeMonitorDescriptor.NoDataYet=\u041D\u0435\u043C\u0430 \u043F\u043E\u0434\u0430\u0442\u0430\u043A\u0430 +DiskSpaceMonitorDescriptor.DiskSpace.FreeSpaceTooLow=\u041D\u0435\u043C\u0430 \u0434\u043E\u0432\u043E\u0459\u043D\u043E \u043F\u0440\u043E\u0441\u0442\u043E\u0440\u0430 \u043D\u0430 \u0434\u0438\u0441\u043A\u0443. {1} \u043E\u0441\u0442\u0430\u0458\u0435 \u0441\u0430\u043C\u043E {0}GB. \ No newline at end of file diff --git a/core/src/main/resources/hudson/node_monitors/MonitorMarkedNodeOffline/message_sr.properties b/core/src/main/resources/hudson/node_monitors/MonitorMarkedNodeOffline/message_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..d3c410a95f0cd17c80ccccd2775535f52a70b576 --- /dev/null +++ b/core/src/main/resources/hudson/node_monitors/MonitorMarkedNodeOffline/message_sr.properties @@ -0,0 +1,6 @@ +# This file is under the MIT License by authors + +blurb=Jenkins \u043F\u0440\u0435\u043A\u0438\u043D\u0443\u043E \u0432\u0435\u0437\u0443 \u0441\u0430 \u043D\u0435\u043A\u0438\u043C \u0430\u0433\u0435\u043D\u0442\u0438\u043C\u0430 \u0437\u0430\u0448\u0442\u043E \u045A\u0435\u043D\u0435 \u0437\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0435\u043D\u0435 \u043C\u0435\u0442\u0440\u0438\u043A\u0435 \u0441\u0443 \u043F\u0430\u043B\u0435 \u0438\u0441\u043F\u043E\u0434 \u043F\u0440\u0430\u0433\u0430. \ + \u0410\u043A\u043E \u043D\u0435\u0431\u0438 \u0436\u0435\u043B\u0435\u043B\u0438 Jenkins \u0442\u0430\u043A\u043E \u0434\u0430 \u0434\u0435\u043B\u0443\u0458\u0435, \ + \u043F\u043E\u0434\u0435\u0441\u0438. +Dismiss=\u041E\u0442\u043A\u0430\u0436\u0438 diff --git a/core/src/main/resources/hudson/node_monitors/ResponseTimeMonitor/Data/cause_de.properties b/core/src/main/resources/hudson/node_monitors/ResponseTimeMonitor/Data/cause_de.properties index bf651a59d8da7e60f8497528468837f57d8bdeef..c001d0bf65d0d67abcfeba44d43a5b97122cd5d6 100644 --- a/core/src/main/resources/hudson/node_monitors/ResponseTimeMonitor/Data/cause_de.properties +++ b/core/src/main/resources/hudson/node_monitors/ResponseTimeMonitor/Data/cause_de.properties @@ -1,23 +1,23 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Simon Wiest -# -# 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. -Ping\ response\ time\ is\ too\ long\ or\ timed\ out.=\ +# The MIT License +# +# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Simon Wiest +# +# 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. +Ping\ response\ time\ is\ too\ long\ or\ timed\ out.=\ Ping-Anwortzeit zu gro bzw. Time-out aufgetreten. \ No newline at end of file diff --git a/core/src/main/resources/hudson/node_monitors/ResponseTimeMonitor/Data/cause_sr.properties b/core/src/main/resources/hudson/node_monitors/ResponseTimeMonitor/Data/cause_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..56ff2e35b04feb8e27ffef3439ee82461193641d --- /dev/null +++ b/core/src/main/resources/hudson/node_monitors/ResponseTimeMonitor/Data/cause_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Ping\ response\ time\ is\ too\ long\ or\ timed\ out.=\u0414\u043E\u0437\u0432\u043E\u0459\u0435\u043D\u043E \u0432\u0440\u0435\u043C\u0435 \u043E\u0434\u0430\u0437\u0438\u0432\u0430\u045A\u0430 \u043D\u0430 Ping \u043A\u043E\u043C\u0430\u043D\u0434\u0438 \u0458\u0435 \u0438\u0437\u0441\u0442\u0435\u043A\u043B\u043E. diff --git a/core/src/main/resources/hudson/os/solaris/ZFSInstaller/MigrationCompleteNotice/message_sr.properties b/core/src/main/resources/hudson/os/solaris/ZFSInstaller/MigrationCompleteNotice/message_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..9e3eacf551499e98dd16d31c980f1526c11976b4 --- /dev/null +++ b/core/src/main/resources/hudson/os/solaris/ZFSInstaller/MigrationCompleteNotice/message_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Data\ was\ successfully\ migrated\ to\ ZFS.=\u041F\u043E\u0434\u0430\u0446\u0438 \u0441\u0443 \u0443\u0441\u043F\u0435\u0448\u043D\u043E \u043C\u0438\u0433\u0440\u0438\u0440\u0430\u043D\u0438 \u043D\u0430 ZFS. +OK=\u0423\u0440\u0435\u0434\u0443 diff --git a/core/src/main/resources/hudson/os/solaris/ZFSInstaller/MigrationFailedNotice/index_sr.properties b/core/src/main/resources/hudson/os/solaris/ZFSInstaller/MigrationFailedNotice/index_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..2e14a7b16912d3134418c9e4a9e9ae2fc7b54951 --- /dev/null +++ b/core/src/main/resources/hudson/os/solaris/ZFSInstaller/MigrationFailedNotice/index_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +ZFS\ Migration\ Problem=\u041F\u0440\u043E\u0431\u043B\u0435\u043C \u043C\u0438\u0433\u0440\u0438\u0440\u0430\u045A\u0430 \u043D\u0430 ZFS. diff --git a/core/src/main/resources/hudson/os/solaris/ZFSInstaller/MigrationFailedNotice/message.jelly b/core/src/main/resources/hudson/os/solaris/ZFSInstaller/MigrationFailedNotice/message.jelly index 9ea4de36431872df8df48db4df1a0d0a7cfd2e3b..b2ff365c9fde457a8d63014ece23355fee9d98cb 100644 --- a/core/src/main/resources/hudson/os/solaris/ZFSInstaller/MigrationFailedNotice/message.jelly +++ b/core/src/main/resources/hudson/os/solaris/ZFSInstaller/MigrationFailedNotice/message.jelly @@ -26,6 +26,6 @@ THE SOFTWARE. \ No newline at end of file diff --git a/core/src/main/resources/hudson/os/solaris/ZFSInstaller/MigrationFailedNotice/message_sr.properties b/core/src/main/resources/hudson/os/solaris/ZFSInstaller/MigrationFailedNotice/message_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..cd7d1ff15e9de694a049ef85f5fe428d6f166a67 --- /dev/null +++ b/core/src/main/resources/hudson/os/solaris/ZFSInstaller/MigrationFailedNotice/message_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +ZFS\ migration\ failed.=\u041C\u0438\u0458\u0435 \u043C\u043E\u0433\u043B\u043E \u043C\u0438\u0433\u0440\u0438\u0440\u0430\u0442\u0438 \u043D\u0430 ZFS. +See\ the\ log\ for\ more\ details=\u041F\u0440\u0435\u0433\u043B\u0435\u0434\u0430\u0458\u0442\u0435 \u0436\u0443\u0440\u043D\u0430\u043B \u0433\u0434\u0435 \u0438\u043C\u0430 \u0432\u0438\u0448\u0435 \u0434\u0435\u0442\u0430\u0459\u0430. diff --git a/core/src/main/resources/hudson/os/solaris/ZFSInstaller/askRootPassword_sr.properties b/core/src/main/resources/hudson/os/solaris/ZFSInstaller/askRootPassword_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..d80a5a2c5d99d3664d3b68f7ae16e5e8e7d7a6e9 --- /dev/null +++ b/core/src/main/resources/hudson/os/solaris/ZFSInstaller/askRootPassword_sr.properties @@ -0,0 +1,9 @@ +# This file is under the MIT License by authors + +Permission\ Denied= +blurb=\u0418\u0437\u0433\u043B\u0435\u0434\u0430 \u0434\u0430 \u0442\u0440\u0435\u043D\u0443\u0442\u043D\u0438 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u043A \u043D\u0435\u043C\u0430 \u0434\u043E\u0432\u043E\u0459\u043D\u0430 \u043F\u0440\u0430\u0432\u0430 \u0434\u0430 \u043A\u0440\u0435\u0438\u0440\u0430 \u0441\u0438\u0441\u0442\u0435\u043C \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0430 ZFS. \ + \u041C\u043E\u043B\u0438\u043C\u043E \u0432\u0430\u0441, \u0443\u043D\u0435\u0441\u0438\u0442\u0435 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u0447\u043A\u043E \u0438\u043C\u0435 \u0438 \u043B\u043E\u0437\u0438\u043D\u043A\u0443 \u043A\u043E\u0458\u0430 \u0438\u043C\u0430 \u0434\u043E\u0432\u043E\u0459\u043D\u043E \u043F\u0440\u0438\u0441\u0442\u0443\u043F\u0430, \u043A\u0430\u043E \u043D\u0430 \u043F\u0440\u0438\u043C\u0435\u0440 root. +Username=\u041A\u043E\u0440\u0438\u0441\u043D\u0438\u0447\u043A\u043E \u0438\u043C\u0435 +Password=\u041B\u043E\u0437\u0438\u043D\u043A\u0430 +OK=\u0423\u0440\u0435\u0434\u0443 +See\ errors...=\u041F\u0440\u0435\u0433\u043B\u0435\u0434\u0430\u0458\u0442\u0435 \u0433\u0440\u0435\u0448\u043A\u0435... diff --git a/core/src/main/resources/hudson/os/solaris/ZFSInstaller/confirm_sr.properties b/core/src/main/resources/hudson/os/solaris/ZFSInstaller/confirm_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..e71c90500f94de20ba505619097fa47375ac3b6e --- /dev/null +++ b/core/src/main/resources/hudson/os/solaris/ZFSInstaller/confirm_sr.properties @@ -0,0 +1,11 @@ +# This file is under the MIT License by authors + +ZFS\ file\ system\ creation=\u041A\u0440\u0435\u0438\u0440\u0430\u045A\u0435 \u0441\u0438\u0441\u0442\u0435\u043C \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0430 ZFS +blurb=Jenkins \u045B\u0435 \u0438\u0437\u0432\u0440\u0448\u0438\u0442\u0438 \u043D\u0430\u0440\u0435\u0434\u043D\u0435 \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u0458\u0435 \u0434\u0430 \u0432\u0430\u043C \u043C\u0438\u0433\u0440\u0438\u0440\u0430 \u043F\u043E\u0434\u0430\u0442\u043A\u0435 \u043D\u0430 \u0441\u0438\u0441\u0442\u0435\u043C \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0430 ZFS. +You\ will\ need\ the\ root\ password\ of\ the\ system\ to\ do\ this.=\u041F\u043E\u0442\u0440\u0435\u0431\u043D\u043E \u0458\u0435 \u0443\u043D\u0435\u0442\u0438 root \u043B\u043E\u0437\u0438\u043D\u043A\u0443 \u0441\u0438\u0441\u0442\u0435\u043C\u0430 +Restart\ itself\ so\ that\ the\ migration\ can\ be\ done\ without\ worrying\ about\ concurrent\ data\ modifications=\u041F\u043E\u043D\u043E\u0432\u043E \u043F\u043E\u043A\u0440\u0435\u0442\u0430\u045A\u0435, \u0442\u0430\u043A\u043E \u0434\u0430 \u0441\u0435 \u043C\u0438\u0433\u0440\u0430\u0446\u0438\u0458\u0430 \u043C\u043E\u0436\u0435 \u0438\u0437\u0432\u0440\u0448\u0438\u0442\u0438 \u0431\u0435\u0437 \u0431\u0440\u0438\u0433\u0435 \u043E \u0438\u0441\u0442\u043E\u0432\u0440\u0435\u043C\u0435\u043D\u0438\u0445 \u043F\u0440\u043E\u043C\u0435\u043D\u0430 \u043F\u043E\u0434\u0430\u0442\u0430\u043A\u0430 +create=\u041A\u0440\u0435\u0438\u0440\u0430\u0458 \u043D\u043E\u0432\u0438 \u0441\u0438\u0441\u0442\u0435\u043C \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0430 ZFS {0} \u0438 \u043A\u043E\u043F\u0438\u0440\u0430\u0458 \u0443 \u045A\u0435\u0433\u0430 \u0441\u0432\u0435 \u043F\u043E\u0434\u0430\u0442\u043A\u0435 +rename=\u041F\u0440\u0435\u0438\u043C\u0435\u043D\u0443\u0458 {0} \u0443 {0}.backup +mount=\u041C\u043E\u043D\u0442\u0438\u0440\u0430\u0458 \u043D\u043E\u0432\u0438 \u0441\u0438\u0441\u0442\u0435\u043C \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0430 ZFS \u043D\u0430 {0} +delete=\u0418\u0437\u0431\u0440\u0438\u0448\u0438 {0}.backup +Start\ migration=\u041F\u043E\u0447\u043D\u0438 \u043C\u0438\u0433\u0440\u0430\u0446\u0438\u0458\u0443 diff --git a/core/src/main/resources/hudson/os/solaris/ZFSInstaller/message_sr.properties b/core/src/main/resources/hudson/os/solaris/ZFSInstaller/message_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..2959bbffe98c1ecdf4adca538c710aefd6f0bb24 --- /dev/null +++ b/core/src/main/resources/hudson/os/solaris/ZFSInstaller/message_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +blurb=\u0412\u0438 \u0440\u0430\u0434\u0438\u0442\u0435 \u043D\u0430 Solaris \u043C\u0430\u0448\u0438\u043D\u0438. \u0414\u0430\u043B\u0438 \u0432\u0438 \u0445\u0442\u0435\u043B\u0438 Jenkins \u0434\u0430 \u043A\u0440\u0435\u0438\u0440\u0430 \u0441\u0438\u0441\u0442\u0435\u043C \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0430 ZFS \u0437\u0430 \u0432\u0430\u0441 \u0434\u0430 \u0431\u0438 \u0441\u0442\u0435 \u0438\u0437\u0432\u0443\u045B\u0438 \u043C\u0430\u043A\u0441\u0438\u043C\u0443\u043C \u0438\u0437 Solaris? +Yes,\ please=\u041C\u043E\u043B\u0438\u043C \u043B\u0435\u043F\u043E +No,\ thank\ you=\u041D\u0435 \u0445\u0432\u0430\u043B\u0430 \ No newline at end of file diff --git a/core/src/main/resources/hudson/scheduler/Messages_sr.properties b/core/src/main/resources/hudson/scheduler/Messages_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..5b115ec973bd9695f0ae1de4bb87897b92d78ca9 --- /dev/null +++ b/core/src/main/resources/hudson/scheduler/Messages_sr.properties @@ -0,0 +1,9 @@ +# This file is under the MIT License by authors + +BaseParser.StartEndReversed=\u0414\u0430 \u043B\u0438\u0441\u0442\u0435 \u0438\u043C\u0430\u043B\u0438 \u0443 \u0432\u0438\u0434\u0443 {0}-{1}? +BaseParser.MustBePositive=\u041A\u043E\u0440\u0430\u043A \u043C\u043E\u0440\u0430 \u0431\u0438\u0442\u0438 \u043F\u043E\u0437\u0438\u0442\u0438\u0432\u0430\u043D \u0431\u0440\u043E\u0458, \u0430 \u043D\u0435 {0} +CronTab.do_you_really_mean_every_minute_when_you=\u0414\u0430\u043B\u0438 \u0437\u0430\u0438\u0441\u0442\u0430 \u043C\u0438\u0441\u043B\u0438\u0442\u0435 "\u0441\u0432\u0430\u043A\u0438 \u043C\u0438\u043D\u0443\u0442"? \u041C\u043E\u0436\u0434\u0430 \u0441\u0442\u0435 \u043D\u0430\u043C\u0435\u0440\u0430\u0432\u0430\u043B\u0438 "{1}" - \u0458\u0435\u0434\u043D\u043E\u043C \u0441\u0432\u0430\u043A\u0438 \u0441\u0430\u0442. +BaseParser.OutOfRange={0} \u0458\u0435 \u043F\u043E\u0433\u0440\u0435\u0448\u043D\u0430 \u0432\u0440\u0435\u0434\u043D\u043E\u0441\u0442. \u0422\u0440\u0435\u0431\u0430\u043B\u043E \u0431\u0438 \u0431\u0438\u0442\u0438 \u0438\u0437\u043C\u0435\u0452\u0443 {1} \u0438 {2} +CronTab.short_cycles_in_the_day_of_month_field_w=\u041A\u0440\u0430\u0442\u043A\u0438 \u0446\u0438\u043A\u043B\u0443\u0441\u0438 \u043F\u043E\u0441\u0442\u0430\u0432\u0459\u0435\u043D\u0438 \u0443 \u043F\u043E\u0459\u0443 "\u0434\u0430\u043D \u0443 \u043C\u0435\u0441\u0435\u0446\u0443" \u045B\u0435 \u0441\u0435 \u0447\u0443\u0434\u043D\u043E \u043F\u043E\u043D\u0430\u0448\u0430\u0442\u0438 \u043D\u0430 \u043A\u0440\u0430\u0458\u0443 \u043C\u0435\u0441\u0435\u0446\u0430 +CronTab.spread_load_evenly_by_using_rather_than_=\u0420\u0430\u0441\u043F\u043E\u0434\u0435\u043B\u0438 \u0442\u0435\u0440\u0435\u0442 \u043F\u043E\u0434\u0458\u0435\u0434\u043D\u0430\u043A\u043E \u043F\u043E\u043C\u043E\u045B\u0443 "{0}" \u0430 \u043D\u0435 "{1}" +CronTabList.InvalidInput=\u041D\u0435\u0438\u0441\u043F\u0440\u0430\u0432\u0430\u043D \u0443\u043D\u043E\u0441: "{0}": {1} \ No newline at end of file diff --git a/core/src/main/resources/hudson/scm/AbstractScmTagAction/inProgress_sr.properties b/core/src/main/resources/hudson/scm/AbstractScmTagAction/inProgress_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..976cb8df33473d5266e68d7c0dcfc811f6d77830 --- /dev/null +++ b/core/src/main/resources/hudson/scm/AbstractScmTagAction/inProgress_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Tagging\ is\ in\ progress\:=\u041E\u0437\u043D\u0430\u0447\u0430\u0432\u0430\u045A\u0435 \u0458\u0435 \u0443 \u0442\u043E\u043A\u0443 diff --git a/core/src/main/resources/hudson/scm/EmptyChangeLogSet/digest_sr.properties b/core/src/main/resources/hudson/scm/EmptyChangeLogSet/digest_sr.properties index 3e8a8d487a7e5e7ab8de9d04006147aa506a8c3e..38f676ba23dd9d33f7e80c744d268061cf9bca1d 100644 --- a/core/src/main/resources/hudson/scm/EmptyChangeLogSet/digest_sr.properties +++ b/core/src/main/resources/hudson/scm/EmptyChangeLogSet/digest_sr.properties @@ -1,3 +1,3 @@ # This file is under the MIT License by authors -No\ changes.=Broj promena +No\ changes.=\u041D\u0435\u043C\u0430 \u043F\u0440\u043E\u043C\u0435\u043D\u0430. diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_nl.properties b/core/src/main/resources/hudson/scm/Messages_pl.properties similarity index 81% rename from core/src/main/resources/hudson/views/BuildButtonColumn/column_nl.properties rename to core/src/main/resources/hudson/scm/Messages_pl.properties index 3dfee37435428be952afc305ed6468ab5d2df332..89b69764f09207766524f5c92684fce0197375ce 100644 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_nl.properties +++ b/core/src/main/resources/hudson/scm/Messages_pl.properties @@ -1,6 +1,6 @@ # The MIT License # -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, id:sorokh, Martin Eigenbrodt +# Copyright (c) 2016, Damian Szczepanik # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -19,7 +19,6 @@ # 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 geplanned -Schedule_a_build=Plan een project voor {0} -Schedule_a_build_with_parameters=Plan een build met parameters voor {0} +NullSCM.DisplayName=Brak +SCM.Permissions.Title=Repozytorium kodu +SCM.TagPermission.Description=To uprawnienie pozwala u\u017Cytkownikom tworzy\u0107w repozytorium kodu etykiety dla danego budowania. diff --git a/core/src/main/resources/hudson/scm/Messages_sr.properties b/core/src/main/resources/hudson/scm/Messages_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..da10fd769e58a9e36736ccb2785edbb3853ec9b7 --- /dev/null +++ b/core/src/main/resources/hudson/scm/Messages_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +NullSCM.DisplayName=\u041D\u0435\u043C\u0430 +SCM.Permissions.Title=\u0421\u0438\u0441\u0442\u0435\u043C \u0437\u0430 \u0443\u043F\u0440\u0430\u0432\u0459\u0430\u045A\u0435 \u0438\u0437\u0432\u043E\u0440\u043D\u043E\u043C \u043A\u043E\u0434\u0443 +SCM.TagPermission.Description=\u0414\u0430\u0458\u0435 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u0446\u0438\u043C\u0430 \u043F\u0440\u0432\u043E \u0434\u0430 \u043A\u0440\u0435\u0438\u0440\u0430\u0458\u0443 \u043D\u043E\u0432\u0443 \u043E\u0437\u043D\u0430\u043A\u0443 \u0443 \u0441\u043F\u0440\u0435\u043C\u0438\u0448\u0442\u0443 \u0434\u0430\u0442\u0435 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435. \ No newline at end of file diff --git a/core/src/main/resources/hudson/scm/SCM/project-changes.jelly b/core/src/main/resources/hudson/scm/SCM/project-changes.jelly index 95b864d7d8fb7f016e637c40f6de63dc993209ff..3d18b3ab359b1b6ebf18938697a0757486f07780 100644 --- a/core/src/main/resources/hudson/scm/SCM/project-changes.jelly +++ b/core/src/main/resources/hudson/scm/SCM/project-changes.jelly @@ -26,7 +26,7 @@ THE SOFTWARE. This view is used to render the project change list like /job//changes While this default implementation can work with any SCM, - subclass may provide diffent implementation to present implementation-specific + subclass may provide different implementation to present implementation-specific information. The 'builds' variable contains the collection of AbstractBuild objects diff --git a/core/src/main/resources/hudson/scm/SCM/project-changes_sr.properties b/core/src/main/resources/hudson/scm/SCM/project-changes_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..26d67578580eddb8471f45ef7afe8ad258a4abe6 --- /dev/null +++ b/core/src/main/resources/hudson/scm/SCM/project-changes_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +detail=\u0434\u0435\u0442\u0430\u0459\u0438 +No\ changes\ in\ any\ of\ the\ builds.=\u041D\u0435\u043C\u0430 \u043F\u0440\u043E\u043C\u0435\u043D\u0430 \u0443 \u0431\u0438\u043B\u043E \u043A\u043E\u0458\u0438\u043C \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430. +No\ builds.=\u041D\u0435\u043C\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430. diff --git a/core/src/main/resources/hudson/search/Messages_pl.properties b/core/src/main/resources/hudson/search/Messages_pl.properties new file mode 100644 index 0000000000000000000000000000000000000000..831dc71a9510474ab5ecabf29214fd0d3ced6cd3 --- /dev/null +++ b/core/src/main/resources/hudson/search/Messages_pl.properties @@ -0,0 +1,23 @@ +# The MIT License +# +# Copyright (c) 2016, Damian Szczepanik +# +# 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. +# Setting for search +UserSearchProperty.DisplayName=Ustawienia wyszukiwania diff --git a/core/src/main/resources/hudson/search/Messages_sr.properties b/core/src/main/resources/hudson/search/Messages_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..3fc20ed360eeb34be6967690485c72769141ca22 --- /dev/null +++ b/core/src/main/resources/hudson/search/Messages_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +UserSearchProperty.DisplayName=\u041E\u043F\u0446\u0438\u0458\u0435 \u043F\u0440\u0435\u0442\u0440\u0430\u0433\u0435 \ No newline at end of file diff --git a/core/src/main/resources/hudson/search/Search/search-failed.jelly b/core/src/main/resources/hudson/search/Search/search-failed.jelly index 332a4e72f41550fc7faaad4cf73d25d74c41bff3..df50cd1a4ff949fa02ca27e1323bb4df3c8ba678 100644 --- a/core/src/main/resources/hudson/search/Search/search-failed.jelly +++ b/core/src/main/resources/hudson/search/Search/search-failed.jelly @@ -43,13 +43,13 @@ THE SOFTWARE.
        1. - ${i.path} + ${i.path}
        - result has been truncated, see 20 more + result has been truncated, see 20 more diff --git a/core/src/main/resources/hudson/search/Search/search-failed_de.properties b/core/src/main/resources/hudson/search/Search/search-failed_de.properties index 04a859cfaa1736ec721eda977f00149ec0aac33b..5e617081e6b932ace81c1dc587f188df248ed57e 100644 --- a/core/src/main/resources/hudson/search/Search/search-failed_de.properties +++ b/core/src/main/resources/hudson/search/Search/search-failed_de.properties @@ -1,24 +1,24 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Simon Wiest -# -# 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. - -Nothing\ seems\ to\ match.=Keine Treffer gefunden. +# The MIT License +# +# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Simon Wiest +# +# 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. + +Nothing\ seems\ to\ match.=Keine Treffer gefunden. Search\ for=Suche nach \ No newline at end of file diff --git a/core/src/main/resources/hudson/search/Search/search-failed_sr.properties b/core/src/main/resources/hudson/search/Search/search-failed_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..58e74d554313f26e1f4a504931a2808a220108c5 --- /dev/null +++ b/core/src/main/resources/hudson/search/Search/search-failed_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Search\ for=\u041F\u043E\u0442\u0440\u0430\u0436\u0438 +Nothing\ seems\ to\ match.=\u041D\u0435\u043C\u0430 \u0440\u0435\u0437\u0443\u043B\u0442\u0430\u0442\u0430 diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_cs.properties b/core/src/main/resources/hudson/search/UserSearchProperty/config_pl.properties similarity index 88% rename from core/src/main/resources/hudson/views/BuildButtonColumn/column_cs.properties rename to core/src/main/resources/hudson/search/UserSearchProperty/config_pl.properties index b4c7da1f5f1e9f4cb0fb47d7cf13430589434b3d..735587317926fa4f6c28050722c4e7c5552a495d 100644 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_cs.properties +++ b/core/src/main/resources/hudson/search/UserSearchProperty/config_pl.properties @@ -1,6 +1,6 @@ # The MIT License # -# Copyright (c) 2004-2010, Sun Microsystems, Inc. +# Copyright (c) 2016, Damian Szczepanik # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -20,5 +20,5 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Build_scheduled=Build napl\u00E1nov\u00E1n -Schedule_a_build=Napl\u00E1novat build pro {0} +Case-sensitivity=Wielko\u015B\u0107 liter +Insensitive\ search\ tool=Pomi\u0144 wielko\u015B\u0107 litler diff --git a/core/src/main/resources/hudson/search/UserSearchProperty/config_sr.properties b/core/src/main/resources/hudson/search/UserSearchProperty/config_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..144ad7dde6a4dceee45a15b5e753147040401077 --- /dev/null +++ b/core/src/main/resources/hudson/search/UserSearchProperty/config_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Case-sensitivity=\u041E\u0441\u0435\u0442\u0459\u0438\u0432\u043E \u043D\u0430 \u0432\u0435\u043B\u0438\u043A\u0430 \u0438 \u043C\u0430\u043B\u0430 \u0441\u043B\u043E\u0432\u0430 +Insensitive\ search\ tool=\u0410\u043B\u0430\u0442 \u0437\u0430 \u043F\u0440\u0435\u0442\u0440\u0430\u0433\u0443 \u043D\u0435\u043E\u0441\u0435\u0442\u0459\u0438\u0432 \u043D\u0430 \u0432\u0435\u043B\u0438\u043A\u0430 \u0438 \u043C\u0430\u043B\u0430 \u0441\u043B\u043E\u0432\u0430 diff --git a/core/src/main/resources/hudson/security/AuthorizationStrategy/Unsecured/help_zh_CN.html b/core/src/main/resources/hudson/security/AuthorizationStrategy/Unsecured/help_zh_CN.html index 764b333cb1e2da7d92e6320003b5a15028f89222..c505cde8bd54adc4ef652af3647d776dfdafc22e 100644 --- a/core/src/main/resources/hudson/security/AuthorizationStrategy/Unsecured/help_zh_CN.html +++ b/core/src/main/resources/hudson/security/AuthorizationStrategy/Unsecured/help_zh_CN.html @@ -1,7 +1,7 @@ -
        - 不执行任何授权,任何人都能完全控制Jenkins,这包括没有登录的匿名用户. - -

        - 这种情况对于可信任的环境(比如公司内网)非常有用,或者你只是使用授权做一些个性化的支持.这样的话,如果某人想快速的更改Jenkins,他就能够避免被强制登录. - +

        + 不执行任何授权,任何人都能完全控制Jenkins,这包括没有登录的匿名用户. + +

        + 这种情况对于可信任的环境(比如公司内网)非常有用,或者你只是使用授权做一些个性化的支持.这样的话,如果某人想快速的更改Jenkins,他就能够避免被强制登录. +

        \ No newline at end of file diff --git a/core/src/main/resources/hudson/security/FederatedLoginService/UnclaimedIdentityException/error_sr.properties b/core/src/main/resources/hudson/security/FederatedLoginService/UnclaimedIdentityException/error_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..53c32244ac8f179c7dcf69dc96b79cdf1cacfe78 --- /dev/null +++ b/core/src/main/resources/hudson/security/FederatedLoginService/UnclaimedIdentityException/error_sr.properties @@ -0,0 +1,8 @@ +# This file is under the MIT License by authors + +loginError=\u0413\u0440\u0435\u0448\u043A\u0430 \u043F\u0440\u0438\u0458\u0430\u0432\u0435: {0} \u043D\u0435\u043C\u0430 \u0430\u0441\u043E\u0446\u0438\u0458\u0430\u0446\u0438\u0458\u0435 +blurb={0} "{1}" \u043D\u0438\u0458\u0435 \u043F\u043E\u0432\u0435\u0437\u0430\u043D\u043E \u0441\u0430 \u0431\u0438\u043B\u043E \u043A\u043E\u0458\u0438\u043C Jenkins \u043D\u0430\u043B\u043E\u0433\u043E\u043C. \ + \u0410\u043A\u043E \u0432\u0435\u045B \u0438\u043C\u0430\u0433\u0435 \u043D\u0430\u043B\u043E\u0433 \u0438 \u043F\u043E\u043A\u0443\u0448\u0430\u0432\u0430\u0442\u0435 \u0434\u0430 \u043F\u043E\u0432\u0435\u0436\u0435\u0442\u0435 {0} \u0441 \u045A\u0438\u043C, \ + \u043E\u0432\u043E \u043D\u0438\u0458\u0435 \u043F\u0440\u0430\u0432\u043E \u043C\u0435\u0441\u0442\u043E \u0437\u0430 \u0442\u043E. \u0420\u0430\u0434\u0438\u0458\u0435
        1. Login
        2. \u041A\u043B\u0438\u043A\u043D\u0438\u0442\u0435 \u043D\u0430 \u0432\u0430\u0448\u0435 \u0438\u043C\u0435
        3. \u041A\u043B\u0438\u043A\u043D\u0438\u0442\u0435 \u043D\u0430 "\u0423\u0440\u0435\u0434\u0438" \u043B\u0438\u043D\u043A, \u0438 \ +
        4. \u043F\u043E\u0432\u0435\u0436\u0438\u0442\u0435 \u043D\u043E\u0432\u0438 {0} \u0441\u0430 \u0442\u0435 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0435
        + diff --git a/core/src/main/resources/hudson/security/FullControlOnceLoggedInAuthorizationStrategy/config_sr.properties b/core/src/main/resources/hudson/security/FullControlOnceLoggedInAuthorizationStrategy/config_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..4037369d9798f35bb149e6eea535f6b83118a636 --- /dev/null +++ b/core/src/main/resources/hudson/security/FullControlOnceLoggedInAuthorizationStrategy/config_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Allow\ anonymous\ read\ access=\u0414\u043E\u0437\u0432\u043E\u043B\u0438 \u043F\u0440\u0438\u0441\u0442\u0443\u043F \u0430\u043D\u043E\u043D\u0438\u043C\u043D\u0438\u043C \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u0446\u0438\u043C\u0430 diff --git a/core/src/main/resources/hudson/security/FullControlOnceLoggedInAuthorizationStrategy/help_zh_CN.html b/core/src/main/resources/hudson/security/FullControlOnceLoggedInAuthorizationStrategy/help_zh_CN.html index 454c73eb129bbd4cf775d3850c8b2638eab98d46..5be288ecc6122b4b8417e115d55db47531b9e3f3 100644 --- a/core/src/main/resources/hudson/security/FullControlOnceLoggedInAuthorizationStrategy/help_zh_CN.html +++ b/core/src/main/resources/hudson/security/FullControlOnceLoggedInAuthorizationStrategy/help_zh_CN.html @@ -1,6 +1,6 @@ -
        - 这种授权模式下,每个登录用户都持有对Jenkins的全部控制权限.只有匿名用户没有全部控制权,匿名用户只有查看权限. - -

        - 这种授权模式的好处是强制用户登录后才能执行操作,这样你可以随时记录谁都做了什么操作.这种设置也适用于公共使用的Jenkins,只有你信任的人才拥有账户. +

        + 这种授权模式下,每个登录用户都持有对Jenkins的全部控制权限.只有匿名用户没有全部控制权,匿名用户只有查看权限. + +

        + 这种授权模式的好处是强制用户登录后才能执行操作,这样你可以随时记录谁都做了什么操作.这种设置也适用于公共使用的Jenkins,只有你信任的人才拥有账户.

        \ No newline at end of file diff --git a/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/config_sr.properties b/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/config_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..5d8616dadac63e0781789bf7418a10706436fdd4 --- /dev/null +++ b/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/config_sr.properties @@ -0,0 +1,23 @@ +# This file is under the MIT License by authors + +Default\ view=\u0421\u0442\u0430\u043D\u0434\u0430\u0440\u0434\u043D\u0438 \u043F\u0440\u0435\u0433\u043B\u0435\u0434 +Home\ directory=\u0413\u043B\u0430\u0432\u043D\u0438 \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0458\u0443\u043C +System\ Message=\u0414\u043E\u0431\u0440\u043E\u0434\u043E\u0448\u043B\u0438 +LOADING=\u0423\u0427\u0418\u0422\u0410\u0412\u0410\u040A\u0415 +statsBlurb=\u041F\u043E\u0448\u0430\u0459\u0438 \u0430\u043D\u043E\u043D\u0438\u043C\u043D\u0435 \u043F\u043E\u0434\u0430\u0442\u043A\u0435 \u043E \u043A\u043E\u0440\u0438\u0448\u045B\u0435\u045A\u0443 \u0438 \u0438\u0437\u0432\u0435\u0448\u0442\u0430\u0458\u0438 \u043E \u0433\u0440\u0435\u0448\u043A\u0430\u043C\u0430 Jenkins-\u0430. +Global\ properties=\u0413\u043B\u043E\u0431\u0430\u043B\u043D\u0435 \u043F\u043E\u0441\u0442\u0430\u0432\u043A\u0435 +Views\ Tab\ Bar=\u041F\u0440\u0435\u0433\u043B\u0435\u0434\u0438 +My\ Views\ Tab\ Bar=\u041C\u043E\u0458\u0438 \u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0438 +name=\u0438\u043C\u0435 +JDKs=JDK-\u043E\u0432\u0438 +JDK\ installations=JDK \u0438\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u0435 +List\ of\ JDK\ installations\ on\ this\ system=\u0421\u043F\u0438\u0441\u0430\u043A JDK \u0438\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u0435 \u043D\u0430 \u043E\u0432\u043E\u043C \u0441\u0438\u0441\u0442\u0435\u043C\u0443 +no.such.JDK=\u041D\u0435 \u043F\u043E\u0441\u0442\u043E\u0458\u0438 \u0442\u0430\u043A\u0430\u0432 JDK +Configure\ System=\u041F\u043E\u0441\u0442\u0430\u0432\u0438 \u0441\u0438\u0441\u0442\u0435\u043C +Master/Slave\ Support=\u041F\u043E\u0434\u0440\u0448\u043A\u0435 \u0433\u043B\u0430\u0432\u043D\u0438\u043C \u0438 \u043F\u043E\u043C\u043E\u045B\u043D\u0438\u043C \u043C\u0430\u0448\u0438\u043D\u0430\u043C\u0430 +Slaves=\u041F\u043E\u043C\u043E\u045B\u043D\u0438 +slaves.description=\u0421\u043F\u0438\u0441\u0430\u043A \u043F\u043E\u043C\u043E\u045B\u043D\u0438\u0445 \u043C\u0430\u0448\u0438\u043D\u0430 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043E\u0432\u0430\u043D\u0438 \u043D\u0430 \u0433\u043B\u0430\u0432\u043D\u043E\u0458 Jenkins \u043C\u0430\u0448\u0438\u043D\u0438. \u0417\u0430\u0434\u0430\u0446\u0438 \u043C\u043E\u0433\u0443 \u0431\u0438\u0442\u0438 \u043F\u043E\u0434\u0435\u0448\u0435\u043D\u0438 \u0434\u0430 \u0431\u0443\u0434\u0443 \u0438\u0437\u0432\u0440\u0448\u0435\u043D\u0438 \u043D\u0430 \u043F\u043E\u043C\u043E\u045B\u043D\u0438\u043C \u043C\u0430\u0448\u0438\u043D\u0430\u043C\u0430. +launch\ command=\u041A\u043E\u043C\u0430\u043D\u0434\u0430 \u0437\u0430 \u043F\u043E\u043A\u0440\u0435\u0442\u0430\u045A\u0435 +description=\u041E\u043F\u0438\u0441 +usage=\u0423\u043F\u043E\u0442\u0440\u0435\u0431\u0430 +remote\ FS\ root=\u041A\u043E\u0440\u0435\u043D \u0443\u0434\u0430\u0459\u0435\u043D\u043E\u0433 \u0441\u0438\u0441\u0442\u0435\u043C \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0430 \ No newline at end of file diff --git a/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-slaveAgentPort.html b/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-slaveAgentPort.html index 69a4760025cdde9e6c01846525ac0a5ce504088c..8681f55f8f4553c43f8502a5f4b94a6bc3520fdc 100644 --- a/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-slaveAgentPort.html +++ b/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-slaveAgentPort.html @@ -1,7 +1,7 @@
        - Jenkins uses a TCP port to communicate with agent agents launched via JNLP. + Jenkins uses a TCP port to communicate with agents launched via JNLP. Normally this port is chosen randomly to avoid collisions, but this would make securing the system difficult. If you are not using JNLP agents, it's recommend to disable this TCP port. Alternatively, you can specify the fixed port number so that you can configure your firewall accordingly. -
        \ No newline at end of file +
        diff --git a/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-useSecurity.html b/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-useSecurity.html index f90210098f9b618f086bc6daf2dc3db23002936f..6ededf98ffdec100a8004127f56928f5a08ac57d 100644 --- a/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-useSecurity.html +++ b/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-useSecurity.html @@ -1,20 +1,15 @@
        - If enabled, you have to login with a username and a password that has the "admin" role - before changing the configuration or running a new build (look for the "login" link - at the top right portion of the page). - Configuration of user accounts is specific to the web container you are using. - (For example, in Tomcat, by default, it looks for $TOMCAT_HOME/conf/tomcat-users.xml) -

        - If you are using Jenkins in an intranet (or other "trusted" environment), it's usually - desirable to leave this checkbox off, so that each project developer can configure their own - project without bothering you. + Enabling security allows configuring authentication (how people can identify themselves) and authorization (what + permissions they get). +

        - If you are exposing Jenkins to the internet, you must turn this on. Jenkins launches - processes, so insecure Jenkins is a sure way of being hacked. + A number of options are built in. Please note that granting significant permissions to anonymous users, or allowing + users to sign up and granting permissions to all authenticated users, does not actually increase security. +

        - For more information about security and Jenkins, see - this document. -

        \ No newline at end of file + For more information about security and Jenkins, see + this document. +
        diff --git a/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-useSecurity_de.html b/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-useSecurity_de.html index e8f634147446236050ff6a7fc1f14a283236fb35..80c921f2d13202fc36ea4824322e3e4a8d66cc76 100644 --- a/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-useSecurity_de.html +++ b/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-useSecurity_de.html @@ -20,5 +20,5 @@

        Weitere Informationen zum Thema "Sicherheit und Jenkins" finden Sie - hier. -

        \ No newline at end of file + hier. +
        diff --git a/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-useSecurity_fr.html b/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-useSecurity_fr.html index 3c10b0ecb22ba658846c3c6abe9d12f32ee28f2b..ab0092207d30ea860dd04f3f1761f5d3748e07ef 100644 --- a/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-useSecurity_fr.html +++ b/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-useSecurity_fr.html @@ -18,5 +18,5 @@

        Pour plus d'informations sur la sécurité dans Jenkins, voir - ce document. -

        \ No newline at end of file + ce document. + diff --git a/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-useSecurity_ja.html b/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-useSecurity_ja.html index 397f50f1f639347ba14044f3ccfaad8495e1e218..2b1d388bf7f50d4c36f5da67f0181311a604bd20 100644 --- a/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-useSecurity_ja.html +++ b/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-useSecurity_ja.html @@ -12,5 +12,5 @@ 有効でないままJenkinsのプロセスを起動すると、Jenkinsはハックされてしまいます。

        Jenkins のセキュリティの詳細については, - このドキュメントを参照してください。 - \ No newline at end of file + このドキュメントを参照してください。 + diff --git a/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-useSecurity_pt_BR.html b/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-useSecurity_pt_BR.html index f2dbfd9673ae9a7d45a01749d785ffe79d5e7b23..59d6eef5d0584926004d573218cfa0681318763b 100644 --- a/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-useSecurity_pt_BR.html +++ b/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-useSecurity_pt_BR.html @@ -16,5 +16,5 @@

        Para mais informações sobre segurança e Jenkins, veja - este documento. + este documento. diff --git a/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-useSecurity_ru.html b/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-useSecurity_ru.html index 2d97434a060fdecc1a15e8dbebb12f6ce71cedd2..e068efd717d5b76ca864d26aa9409e9d7350f006 100644 --- a/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-useSecurity_ru.html +++ b/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-useSecurity_ru.html @@ -18,5 +18,5 @@

        Для получения дополнительной информации о безопасности в Jenkins, прочтите - этот документ. - \ No newline at end of file + этот документ. + diff --git a/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-useSecurity_tr.html b/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-useSecurity_tr.html index e708863197eadd26680c1fab91084c8423a2486a..651dab0aefd18a019726fddf9ba79d5dedd05ec8 100644 --- a/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-useSecurity_tr.html +++ b/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-useSecurity_tr.html @@ -15,6 +15,6 @@ düşünürseniz, güvenlik ayarı olamayan bir Jenkins, hacklenmenin kesin bir yoludur.

        - Güvenlik ile ilgili daha fazla bilgiyi bu dokümanda + Güvenlik ile ilgili daha fazla bilgiyi bu dokümanda bulabilirsiniz. - \ No newline at end of file + diff --git a/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-useSecurity_zh_CN.html b/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-useSecurity_zh_CN.html index 471c6f7ade1d5af880a86b5d49eee07eb3d90596..2da32916106343bca00248c75fd20eeae4227828 100644 --- a/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-useSecurity_zh_CN.html +++ b/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-useSecurity_zh_CN.html @@ -10,5 +10,5 @@

        更多Jenkins安全相关信息,请看 - 这个文档. - \ No newline at end of file + 这个文档. + diff --git a/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-useSecurity_zh_TW.html b/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-useSecurity_zh_TW.html index bc7cb3249b99f96fa890fc4174cf5c5d5fa5f2be..290ec69bbd733be5a5482d79b36cc0201d2074ce 100644 --- a/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-useSecurity_zh_TW.html +++ b/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/help-useSecurity_zh_TW.html @@ -13,6 +13,6 @@ Jenkins 會啟動處理序,所以不安全的 Jenkins 肯定是被駭的好路子。

        - 參考這份文件, + 參考這份文件, 可以看到更多有關安全性及 Jenkins 的資訊。 - \ No newline at end of file + diff --git a/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/index.groovy b/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/index.groovy index e56f86720c710d9b477022d874721cd1e5cfddaf..f082a3fce5e3d94e9d565f37752ed6e7faf681f6 100644 --- a/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/index.groovy +++ b/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/index.groovy @@ -26,8 +26,18 @@ l.layout(norefresh:true, permission:app.ADMINISTER, title:my.displayName, csscla set("descriptor", my.descriptor); f.optionalBlock( field:"useSecurity", title:_("Enable security"), checked:app.useSecurity) { - f.entry (title:_("TCP port for JNLP agents"), field:"slaveAgentPort") { - f.serverTcpPort() + f.entry(title: _("TCP port for JNLP agents"), field: "slaveAgentPort") { + if (my.slaveAgentPortEnforced) { + if (my.slaveAgentPort == -1) { + text(_("slaveAgentPortEnforcedDisabled")) + } else if (my.slaveAgentPort == 0) { + text(_("slaveAgentPortEnforcedRandom")) + } else { + text(_("slaveAgentPortEnforced", my.slaveAgentPort)) + } + } else { + f.serverTcpPort() + } } f.advanced(title: _("Agent protocols"), align:"left") { f.entry(title: _("Agent protocols")) { diff --git a/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/index.properties b/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/index.properties new file mode 100644 index 0000000000000000000000000000000000000000..4c959311a8f28ad3ea271a517aa8eefdd2b5d896 --- /dev/null +++ b/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/index.properties @@ -0,0 +1,3 @@ +slaveAgentPortEnforced=enforced to {0,number,#} on startup through system property. +slaveAgentPortEnforcedRandom=enforced to random port on startup through system property. +slaveAgentPortEnforcedDisabled=disabled on startup through system property. diff --git a/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/index_es.properties b/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/index_es.properties index 5a6e60cccb5678de434bbd0f7ec14cfff788a296..87d48443d5a2e4f1be760a5a3142f7c5180769d5 100644 --- a/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/index_es.properties +++ b/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/index_es.properties @@ -25,6 +25,6 @@ Enable\ security=Activar seguridad TCP\ port\ for\ JNLP\ agents=Puerto TCP de JNLP para los agentes en los nodos secundarios Markup\ Formatter= Access\ Control=Control de acceso -Security\ Realm=Seguuridad +Security\ Realm=Seguridad Authorization=Autorizaci\u00F3n Save=Guardar diff --git a/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/index_sr.properties b/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/index_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..abb41de481cbc87bc18d3bbbb483fe6ec2004009 --- /dev/null +++ b/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/index_sr.properties @@ -0,0 +1,11 @@ +# This file is under the MIT License by authors + +LOADING=\u0423\u0427\u0418\u0422\u0410\u0412\u0410\u040A\u0415 +Enable\ security=\u0423\u043A\u0459\u0443\u0447\u0438 \u0441\u0438\u0441\u0442\u0435\u043C \u0431\u0435\u0437\u0431\u0435\u0434\u043D\u043E\u0441\u0442\u0438 +Markup\ Formatter=\u0424\u043E\u0440\u043C\u0430\u0442\u0435\u0440 \u0437\u0430 Markup +Access\ Control=\u041A\u043E\u043D\u0442\u0440\u043E\u043B\u0430 \u043F\u0440\u0438\u0441\u0442\u0443\u043F\u0435 +Security\ Realm=\u041E\u0431\u043B\u0430\u0441\u0442 \u0431\u0435\u0437\u0431\u0435\u0434\u043D\u043E\u0441\u0442\u0438 (Realm) +Authorization=\u041E\u0432\u043B\u0430\u0448\u045B\u0435\u045A\u0435 +Save=\u0421\u0430\u0447\u0443\u0432\u0430\u0458 +Disable\ remember\ me=\u0418\u0441\u043A\u0459\u0443\u0447\u0438 \u043E\u0434\u043B\u0438\u043A\u0443 "\u0437\u0430\u043F\u0430\u043C\u0442\u0438 \u043C\u0435" +TCP\ port\ for\ JNLP\ agents=\u041F\u043E\u0440\u0442 TCP \u0437\u0430 JNLP \u0430\u0433\u0435\u043D\u0442\u0435 \ No newline at end of file diff --git a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/Details/config_pl.properties b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/Details/config_pl.properties new file mode 100644 index 0000000000000000000000000000000000000000..5470171053b38a16b37140e8c15928365fc38a30 --- /dev/null +++ b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/Details/config_pl.properties @@ -0,0 +1,23 @@ +# The MIT License +# +# Copyright (c) 2017, Damian Szczepanik +# +# 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. +Password=Has\u0142o +Confirm\ Password=Powt\u00F3rz has\u0142o diff --git a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/Details/config_sr.properties b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/Details/config_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..681f4b037d9f5f8a7907123624689c7b13d15e97 --- /dev/null +++ b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/Details/config_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Password=\u041B\u043E\u0437\u0438\u043D\u043A\u0430 +Confirm\ Password=\u041F\u043E\u0442\u0432\u0440\u0434\u0438\u0442\u0435 \u043B\u043E\u0437\u0438\u043D\u043A\u0443 diff --git a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/_entryForm_pl.properties b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/_entryForm_pl.properties index 789580f522d7ac99df05080a14da4fa42b200a07..cefd8b87958f21c0e1e26ec39289df3cecb78f23 100644 --- a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/_entryForm_pl.properties +++ b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/_entryForm_pl.properties @@ -1,6 +1,25 @@ -# This file is under the MIT License by authors +# The MIT License +# +# Copyright (c) 2004-2016, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributors +# +# 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. -Sign\ up=Zarejestruj si\u0119 Confirm\ password=Powt\u00F3rz has\u0142o E-mail\ address=Adres e-mail Full\ name=Pe\u0142na nazwa diff --git a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/_entryForm_sr.properties b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/_entryForm_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..661b93a0e3135cf90b95a2b6893631ef16e289ce --- /dev/null +++ b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/_entryForm_sr.properties @@ -0,0 +1,9 @@ +# This file is under the MIT License by authors + +Username=\u041A\u043E\u0440\u0438\u0441\u043D\u0438\u0447\u043A\u043E \u0438\u043C\u0435 +Password=\u041B\u043E\u0437\u0438\u043D\u043A\u0430 +Confirm\ password=\u041F\u043E\u0442\u0432\u0440\u0434\u0438\u0442\u0435 \u043B\u043E\u0437\u0438\u043D\u043A\u0443 +Full\ name=\u0418\u043C\u0435 \u0438 \u043F\u0440\u0435\u0437\u0438\u043C\u0435 +Enter\ text\ as\ shown=\u0423\u043D\u0435\u0441\u0438\u0442\u0435 \u0442\u0435\u043A\u0441\u0442 \u043A\u0430\u043A\u043E \u0458\u0435 \u043F\u0440\u0438\u043A\u0430\u0437\u0430\u043D +E-mail\ address=\u0410\u0434\u0440\u0435\u0441\u0430 \u0435-\u043F\u043E\u0448\u0442\u0435 +Sign\ up=\u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0458\u0430 diff --git a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/addUser_sr.properties b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/addUser_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..a1eb18f901895a5af60e94979cda052ca8c8a24d --- /dev/null +++ b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/addUser_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Create\ User=\u041A\u0440\u0435\u0438\u0440\u0430\u0458 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u043A\u0430 diff --git a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/config_sr.properties b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/config_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..7da135998fcefbd98cadf4c946d520af22f88db3 --- /dev/null +++ b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/config_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +Enable\ captcha\ on\ sign\ up=\u0422\u0440\u0430\u0436\u0438 Captcha \u043F\u0440\u0438\u043B\u0438\u043A\u043E\u043C \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0458\u0435 +Captcha\ Support=\u041F\u043E\u0434\u0440\u0448\u043A\u0430 \u0437\u0430 Captcha +Allow\ users\ to\ sign\ up=\u0414\u043E\u0437\u0432\u043E\u043B\u0438 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u0446\u0438\u043C\u0430 \u0434\u0430 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0443\u0458\u0443 diff --git a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/firstUser_sr.properties b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/firstUser_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..ac2c4ccf6ad349e419f1f0b7f548bf78aba8cbce --- /dev/null +++ b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/firstUser_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Create\ First\ Admin\ User=\u041A\u0440\u0435\u0438\u0440\u0430\u0458 \u043F\u0440\u0432\u043E\u0433 \u0430\u0434\u043C\u0438\u043D\u0438\u0441\u0442\u0440\u0430\u0442\u043E\u0440\u0430 diff --git a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/help-allowsSignup.html b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/help-allowsSignup.html index 124f422cbad3ac502b12b1e9380f83c02dec579d..cb7b6fa7f1ae7795c937780dde005ae6c2c29afe 100644 --- a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/help-allowsSignup.html +++ b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/help-allowsSignup.html @@ -7,5 +7,5 @@

        By default, Jenkins does not use captcha verification if the user creates an account by themself. If you'd like to enable captcha verification, install a captcha support plugin, e.g. the Jenkins - JCaptcha Plugin. + JCaptcha Plugin. diff --git a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/help-allowsSignup_bg.html b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/help-allowsSignup_bg.html index daa6a4ffd632b2e7bcfed6cba35997ef61ce0d7a..686e4f9b81c6ffe14a3f2e5d27550ec81fdd4e33 100644 --- a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/help-allowsSignup_bg.html +++ b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/help-allowsSignup_bg.html @@ -9,6 +9,6 @@ Стандартно Jenkins не използва графична защита, че човек, а не скрипт създава регистрацията. Ако такава функционалност ви трябва, инсталирайте съответната приставка, напр. - JCaptcha + JCaptcha Plugin. diff --git a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/help-allowsSignup_zh_TW.html b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/help-allowsSignup_zh_TW.html index e2535f2729b17e59e91c42bc2cbe39fa5c3f2e11..81d911bda1f7ae09c73bbd82340741692fad43f3 100644 --- a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/help-allowsSignup_zh_TW.html +++ b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/help-allowsSignup_zh_TW.html @@ -6,5 +6,5 @@

        預設情況下,Jenkins 不會使用 CAPTCHA 驗證使用者帳號是不是由真的人建立。 如果您想要使用 CAPTCHA 驗證機制,請安裝 CAPTCHA 外掛程式,例如 Jenkins - JCaptcha Plugin。 + JCaptcha Plugin。 diff --git a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/help_zh_CN.html b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/help_zh_CN.html index 5967d98f9ade94f91e07594c700d9f92a7d0c676..754a47f59cc02a5f667d8222f32b9f83c35a0f98 100644 --- a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/help_zh_CN.html +++ b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/help_zh_CN.html @@ -1,5 +1,5 @@ -

        - 使用Hudson自己的用户列表验证, - 而不是外部系统代理. - 这适用于没有用户数据库小范围的设定. +
        + 使用Hudson自己的用户列表验证, + 而不是外部系统代理. + 这适用于没有用户数据库小范围的设定.
        \ No newline at end of file diff --git a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/index_es.properties b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/index_es.properties index 5d03bc6eafef34ea8d7f0aa000dcc391736ec5f1..8c5b73e2c0ed9a8349c8e0913871ae849a2831f4 100644 --- a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/index_es.properties +++ b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/index_es.properties @@ -21,7 +21,7 @@ # THE SOFTWARE. blurb=\ - Estos usuarios pueden entrar en Jenkins. Este es un subconjunto de esta list, \ + Estos usuarios pueden entrar en Jenkins. Este es un subconjunto de esta lista, \ que tambien incluyen usuarios creados autom\u00e1ticamente porque hayan hecho ''commits'' a proyectos. \ Los usuarios creados autom\u00e1ticamente no tienen acceso directo a Jenkins. Name=Nombre diff --git a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/index_pl.properties b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/index_pl.properties new file mode 100644 index 0000000000000000000000000000000000000000..1d1ea78072327d65825eefaad98c34204f08cd71 --- /dev/null +++ b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/index_pl.properties @@ -0,0 +1,25 @@ +# The MIT License +# +# Copyright (c) 2016, Damian Szczepanik +# +# 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. +Users=U\u017Cytkownicy +# These users can log into Jenkins. This is a sub set of this list, \ +Name=Nazwa +User\ Id=Identyfikator diff --git a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/index_sr.properties b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/index_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..ee02493ef6d4d9fe61e94fa4b4c77bf2380cd322 --- /dev/null +++ b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/index_sr.properties @@ -0,0 +1,8 @@ +# This file is under the MIT License by authors + +Users=\u041A\u043E\u0440\u0438\u0441\u043D\u0438\u0446\u0438 +blurb=\ +\u041E\u0432\u0438 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u0432\u0438 \u043C\u043E\u0433\u0443 \u0441\u0435 \u043F\u0440\u0438\u0458\u0430\u0432\u0438\u0442\u0438 \u043D\u0430 Jenkins, \u0448\u0442\u043E \u0458\u0435 \u043F\u043E\u0434\u0441\u043A\u0443\u043F \u043E\u0432\u043E\u0433 \u0441\u043F\u0438\u0441\u043A\u0430, \ +\u043A\u043E\u0458\u0438 \u0441\u0430\u0434\u0440\u0436\u0438 \u0438 \u0430\u0443\u0442\u043E\u043C\u0430\u0442\u0441\u043A\u0438-\u043A\u0440\u0435\u0438\u0440\u0430\u043D\u0435 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u043A\u0435 \u0431\u0435\u0437 \u043A\u0438\u0440\u0435\u043A\u043D\u043E\u0433 \u043F\u0440\u0438\u0441\u0442\u0443\u043F\u0430 \u043D\u0430 Jenkins. +User\ Id=\u0418\u0434\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0446\u0438\u043E\u043D\u0438 \u0431\u0440\u043E\u0458 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u043A\u0430 +Name=\u0418\u043C\u0435 diff --git a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/loginLink_sr.properties b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/loginLink_sr.properties index 35c26ea458054a9e4dfe2d747c766c9284502766..a98e2bb9c38d5b2ae07fd8e58354defa7b662af3 100644 --- a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/loginLink_sr.properties +++ b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/loginLink_sr.properties @@ -1,3 +1,3 @@ # This file is under the MIT License by authors -sign\ up=\u043D\u0430\u043F\u0440\u0430\u0432\u0438 \u043D\u0430\u043B\u043E\u0433 +sign\ up=\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0458\u0430 diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_da.properties b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/sidepanel_pl.properties similarity index 86% rename from core/src/main/resources/hudson/views/BuildButtonColumn/column_da.properties rename to core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/sidepanel_pl.properties index 35a096259a7abdd3063e7238a814c691694db21c..3dbafb505c116be68796a462013d0e70ae6c2987 100644 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_da.properties +++ b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/sidepanel_pl.properties @@ -1,6 +1,6 @@ # The MIT License # -# Copyright (c) 2004-2010, Sun Microsystems, Inc. Kohsuke Kawaguchi. Knud Poulsen. +# Copyright (c) 2016, Damian Szczepanik # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -19,6 +19,6 @@ # 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=Byg er planlagt -Schedule_a_build=Planl\u00E6g et byggeri til {0} +Back\ to\ Dashboard=Powr\u00F3t do tablicy +Manage\ Jenkins=Zarz\u0105dzaj Jenkinsem +Create\ User=Stw\u00F3rz u\u017Cytkownika diff --git a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/sidepanel_sr.properties b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/sidepanel_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..13d517fbbc5202f3d4e4a562355414341fb7a37b --- /dev/null +++ b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/sidepanel_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +Manage\ Jenkins=\u0423\u043F\u0440\u0430\u0432\u0459\u0430\u045A\u0435 Jenkins-\u043E\u043C +Create\ User=\u041A\u0440\u0435\u0438\u0440\u0430\u0458 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u043A\u0430 +Back\ to\ Dashboard=\u041D\u0430\u0437\u0430\u0434 \u043A\u0430 \u043A\u043E\u043D\u0442\u0440\u043E\u043B\u043D\u0443 \u043F\u0430\u043D\u0435\u043B\u0443 diff --git a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/signupWithFederatedIdentity_sr.properties b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/signupWithFederatedIdentity_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..f1315accaf12589e0d1c0c3898e550040396dff4 --- /dev/null +++ b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/signupWithFederatedIdentity_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Sign\ up=\u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0458\u0430 diff --git a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/signup_sr.properties b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/signup_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..f1315accaf12589e0d1c0c3898e550040396dff4 --- /dev/null +++ b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/signup_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Sign\ up=\u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0458\u0430 diff --git a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/success_sr.properties b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/success_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..e27a6feb9293ea45ec807da6fd3cd9dacd3a043e --- /dev/null +++ b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/success_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Success=\u0423\u0441\u043F\u0435\u0448\u043D\u043E +description=\u041F\u0440\u0438\u0458\u0430\u0432\u0459\u0435\u043D\u0438 \u0441\u0442\u0435. \u041D\u0430\u0437\u0430\u0434 \u043A\u0430 \u0433\u043B\u0430\u0432\u043D\u043E\u0458 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0438. diff --git a/core/src/main/resources/hudson/security/LegacyAuthorizationStrategy/help_zh_CN.html b/core/src/main/resources/hudson/security/LegacyAuthorizationStrategy/help_zh_CN.html index 368bdbd2f1bd324293d74f2b494cad4a1f33d372..6b6133460e875a080c80092342560e910efae4d4 100644 --- a/core/src/main/resources/hudson/security/LegacyAuthorizationStrategy/help_zh_CN.html +++ b/core/src/main/resources/hudson/security/LegacyAuthorizationStrategy/help_zh_CN.html @@ -1,4 +1,4 @@ -
        - 适用于Jenkins1.164以前的版本.也就是说,如果你是"admin"角色,那么你将拥有Jenkins的一切控制权,其它角色(包括匿名用户) - 只有查看权限. +
        + 适用于Jenkins1.164以前的版本.也就是说,如果你是"admin"角色,那么你将拥有Jenkins的一切控制权,其它角色(包括匿名用户) + 只有查看权限.
        \ No newline at end of file diff --git a/core/src/main/resources/hudson/security/LegacySecurityRealm/config_sr.properties b/core/src/main/resources/hudson/security/LegacySecurityRealm/config_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..d76a9217726af8f1e21cf2dc5a2a2488c4324722 --- /dev/null +++ b/core/src/main/resources/hudson/security/LegacySecurityRealm/config_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Unprotected\ URLs=\u041D\u0435\u0437\u0430\u0448\u0442\u0438\u045B\u0435\u043D\u0435 URL \u0430\u0434\u0440\u0435\u0441\u0435 +blurb=\u041E\u0432\u043E\u0458 \u0430\u0434\u0440\u0435\u0441\u0438, \u043A\u0430\u043E \u0438 \u043E\u0441\u0442\u0430\u043B\u0438\u043C \u0441\u0430 \u0434\u043E\u0434\u0430\u0442\u043D\u043E\u0458 \u0446\u0440\u0442\u0438 "/" \u043D\u0430 \u043A\u0440\u0430\u0458\u0443, \u043D\u0438\u0458\u0435 \u043F\u043E\u0442\u0440\u0435\u0431\u043D\u043E \u0430\u0443\u0442\u0435\u043D\u0442\u0438\u043A\u0430\u0446\u0438\u0458\u0430. \u0410\u043A\u043E \u0458\u0435 \u0442\u043E \u043C\u043E\u0433\u0443\u045B\u0435, \u043D\u0430\u043C\u0435\u0441\u0442\u0438 \u043A\u043E\u043D\u0442\u0435\u0458\u043D\u0435\u0440 \u0434\u0430 \u0434\u0438\u0440\u0435\u043A\u0442\u043D\u043E \u043F\u0440\u0435\u043D\u043E\u0441\u0438 \u0437\u0430\u0445\u0442\u0435\u0432\u0435 \u043D\u0430 Jenkins \u0431\u0435\u0437 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0458\u0435. diff --git a/core/src/main/resources/hudson/security/LegacySecurityRealm/help_zh_CN.html b/core/src/main/resources/hudson/security/LegacySecurityRealm/help_zh_CN.html index eac120de565a27bb6d9fc3df702dc130de4b566d..666444d94b5c80ba6ac6191da88ea7da1bd89ea3 100644 --- a/core/src/main/resources/hudson/security/LegacySecurityRealm/help_zh_CN.html +++ b/core/src/main/resources/hudson/security/LegacySecurityRealm/help_zh_CN.html @@ -1,13 +1,13 @@ -
        - 使用Servlet容器认证用户,遵循Servlet规范. - 这是Jenkins1.163版本遗留的历史.这主要对下列情况非常有用: - -
          -
        1. - 你使用1.164之前版本的Jenkins并且愿意继续使用. -
        2. -
        3. - 你已经在你的容器上配置了很好的安全域,并且宁愿Jenkins继续使用它.(有些容器提供更好的文档或者能够定制实现用户的安全域) -
        4. -
        +
        + 使用Servlet容器认证用户,遵循Servlet规范. + 这是Jenkins1.163版本遗留的历史.这主要对下列情况非常有用: + +
          +
        1. + 你使用1.164之前版本的Jenkins并且愿意继续使用. +
        2. +
        3. + 你已经在你的容器上配置了很好的安全域,并且宁愿Jenkins继续使用它.(有些容器提供更好的文档或者能够定制实现用户的安全域) +
        4. +
        \ No newline at end of file diff --git a/core/src/main/resources/hudson/security/Messages_pl.properties b/core/src/main/resources/hudson/security/Messages_pl.properties index 347024e6a586fcc06fef985f97d165b6d19a3db1..ec181ceb9a1cb26ce7fe8769ca76b6f5229e6dfa 100644 --- a/core/src/main/resources/hudson/security/Messages_pl.properties +++ b/core/src/main/resources/hudson/security/Messages_pl.properties @@ -1,6 +1,6 @@ # The MIT License # -# Copyright (c) 2016, Damian Szczepanik +# Copyright (c) 2004-2017, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributors # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -19,5 +19,12 @@ # 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. -GlobalSecurityConfiguration.DisplayName=Konfiguracja globalnych zabezpiecze\u0144 -GlobalSecurityConfiguration.Description=Bezpiecze\u0144stwo Jenkinsa: okre\u015Bl, kto ma dost\u0119p i mo\u017Ce u\u017Cywa\u0107 systemu. +# Manage Users +HudsonPrivateSecurityRealm.ManageUserLinks.DisplayName=Zarz\u0105dzaj u\u017Cytkownikami +# LDAP +LDAPSecurityRealm.DisplayName=LDAP +# Create/delete/modify users that can log in to this Jenkins +HudsonPrivateSecurityRealm.ManageUserLinks.Description=Dodawaj, usuwaj i modyfikuj u\u017Cytkownik\u00F3w, kt\u00F3rzy mog\u0105 si\u0119 logowa\u0107 do Jenkinsa +GlobalSecurityConfiguration.DisplayName=Konfiguruj ustawienia bezpiecze\u0144stwa +GlobalSecurityConfiguration.Description=Zabezpiecz Jenkinsa, decyduj, kto ma do niego dost\u0119p. +HudsonPrivateSecurityRealm.Details.DisplayName=Has\u0142o diff --git a/core/src/main/resources/hudson/security/Messages_sr.properties b/core/src/main/resources/hudson/security/Messages_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..0e944f27fb8cd18f9d84260b6ebb631c5e35eb02 --- /dev/null +++ b/core/src/main/resources/hudson/security/Messages_sr.properties @@ -0,0 +1,36 @@ +# This file is under the MIT License by authors + +GlobalSecurityConfiguration.DisplayName=\u0421\u0438\u0433\u0443\u0440\u043D\u043E\u0441\u043D\u0430 \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 +GlobalSecurityConfiguration.Description=\u041E\u0431\u0435\u0437\u0431\u0435\u0434\u0438 Jenkins \u2014 \u043A\u043E \u0438\u043C\u0430 \u043F\u0440\u0438\u0441\u0442\u0443\u043F \u0441\u0438\u0441\u0442\u0435\u043C\u0443. +HudsonPrivateSecurityRealm.WouldYouLikeToSignUp=\u041E\u0432\u0430\u0458 {0} {1} \u0458\u0435 \u043D\u043E\u0432\u043E Jenkins-\u0443. \u0414\u0430\u043B\u0438 \u0436\u0435\u043B\u0438\u0442\u0435 \u0434\u0430 \u0441\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0443\u0458\u0435\u0442\u0435? +LegacyAuthorizationStrategy.DisplayName=\u0421\u0442\u0430\u0440\u0438 \u0440\u0435\u0436\u0438\u043C +HudsonPrivateSecurityRealm.DisplayName=\u0411\u0430\u0437\u0430 \u043F\u043E\u0434\u0430\u0442\u0430\u043A\u0430 \u0437\u0430 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u043A\u0435 \u0443\u043D\u0443\u0442\u0430\u0440 Jenkins +HudsonPrivateSecurityRealm.Details.DisplayName=\u041B\u043E\u0437\u0438\u043D\u043A\u0430 +HudsonPrivateSecurityRealm.Details.PasswordError=\u041B\u043E\u0437\u0438\u043D\u043A\u0435 \u0441\u0435 \u043D\u0435 \u043F\u043E\u043A\u043B\u0430\u043F\u0430\u0458\u0443. \u041C\u043E\u043B\u0438\u043C\u043E \u0432\u0430\u0441, \u0443\u043D\u0435\u0441\u0438\u0442\u0435 \u043F\u043E\u043D\u043E\u0432\u043E. +HudsonPrivateSecurityRealm.ManageUserLinks.DisplayName=\u0423\u043F\u0440\u0430\u0432\u0459\u0430\u045A\u0435 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u0446\u0438\u043C\u0430 +HudsonPrivateSecurityRealm.ManageUserLinks.Description=\ \u041A\u0440\u0435\u0438\u0440\u0430\u0458/\u0438\u0437\u0431\u0440\u0438\u0448\u0438/\u0443\u0440\u0435\u0434\u0438 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u043A\u0435 \u0441\u0430 \u043F\u0440\u0438\u0441\u0442\u0443\u043F\u043E\u043C \u043D\u0430 Jenkins +HudsonPrivateSecurityRealm.CreateAccount.TextNotMatchWordInImage=\u0422\u0435\u043A\u0441\u0442 \u043D\u0435 \u043E\u0434\u0433\u043E\u0432\u0430\u0440\u0430 \u0440\u0435\u045B \u043F\u043E\u043A\u0430\u0437\u0430\u043D \u0441\u043B\u0438\u043A\u043E\u043C +HudsonPrivateSecurityRealm.CreateAccount.PasswordNotMatch=\u041B\u043E\u0437\u0438\u043D\u043A\u0430 \u0441\u0435 \u043D\u0435 \u043F\u043E\u043A\u043B\u0430\u043F\u0430 +HudsonPrivateSecurityRealm.CreateAccount.PasswordRequired=\u041B\u043E\u0437\u0438\u043D\u043A\u0430 \u0458\u0435 \u043E\u0431\u0430\u0432\u0435\u0437\u043D\u0430 +HudsonPrivateSecurityRealm.CreateAccount.UserNameRequired=\u041A\u043E\u0440\u0438\u0441\u043D\u0438\u0447\u043A\u043E \u0438\u043C\u0435 \u0458\u0435 \u043E\u0431\u0430\u0432\u0435\u0437\u043D\u043E +HudsonPrivateSecurityRealm.CreateAccount.InvalidEmailAddress=\u041D\u0435\u0432\u0430\u0436\u0435\u045B\u0430 \u0430\u0434\u0440\u0435\u0441\u0430 \u0435-\u043F\u043E\u0448\u0442\u0435 +HudsonPrivateSecurityRealm.CreateAccount.UserNameAlreadyTaken=\u041A\u043E\u0440\u0438\u0441\u043D\u0438\u0447\u043A\u043E \u0438\u043C\u0435 \u0458\u0435 \u0432\u0435\u045B \u0437\u0430\u0443\u0437\u0435\u0442\u043E +FullControlOnceLoggedInAuthorizationStrategy.DisplayName=\u041F\u0440\u0438\u0458\u0430\u0432\u0459\u0435\u043D\u0438 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u0446\u0438 \u043C\u043E\u0433\u0443 \u0441\u0432\u0435 +AuthorizationStrategy.DisplayName=\u0421\u0432\u0438 \u043C\u043E\u0433\u0443 \u0441\u0432\u0435 +LDAPSecurityRealm.DisplayName=LDAP +LDAPSecurityRealm.SyntaxOfServerField=\u0428\u0430\u0431\u043B\u043E\u043D \u0441\u0435\u0440\u0432\u0435\u0440 \u043F\u043E\u0459\u0443 \u0458\u0435 \u0421\u0415\u0420\u0412\u0415\u0420 \u0438\u043B\u0438 \u0421\u0415\u0420\u0412\u0415\u0420:\u041F\u041E\u0420\u0422 or ldaps://\u0421\u0415\u0420\u0412\u0415\u0420[:\u041F\u041E\u0420\u0422] +LDAPSecurityRealm.UnknownHost=\u041D\u0435\u043F\u043E\u0437\u043D\u0430\u0442\u0438 \u0445\u043E\u0441\u0442: {0} +LDAPSecurityRealm.UnableToConnect=\u041D\u0438\u0458\u0435 \u043C\u043E\u0433\u0443\u045B\u0435 \u0441\u0435 \u043F\u043E\u0432\u0435\u0437\u0430\u0442\u0438 \u043D\u0430 {0} : {1} +LDAPSecurityRealm.InvalidPortNumber=\u041D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u0430\u043D \u0431\u0440\u043E\u0458 \u043F\u043E\u0440\u0442\u0430 +LegacySecurityRealm.Displayname=\u0414\u0435\u043B\u0435\u0433\u0438\u0440\u0430\u0458 \u0441\u0435\u0440\u0432\u043B\u0435\u0442 \u043A\u043E\u043D\u0442\u0435\u0458\u043D\u0435\u0440\u0443 +UserDetailsServiceProxy.UnableToQuery=\u041D\u0438\u0458\u0435 \u043C\u043E\u0433\u0443\u045B\u0435 \u043F\u0440\u043E\u0458\u0430\u045B\u0438 \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0458\u0443 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u043A\u0430: {0} +PAMSecurityRealm.DisplayName=\u0411\u0430\u0437\u0430 \u043F\u043E\u0434\u0430\u0442\u0430\u043A\u0430 \u043E \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u0446\u0438\u043C\u0430/\u0433\u0440\u0443\u043F\u0430 \u043D\u0430 Unix +PAMSecurityRealm.ReadPermission=Jenkins \u0431\u0438 \u0442\u0440\u0435\u0431\u0430\u043E \u0434\u0430 \u0431\u0443\u0434\u0435 \u0443 \u0441\u0442\u0430\u045A\u0443 \u0434\u0430 \u0443\u0447\u0438\u0442\u0430 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0443 "/etc/shadow". +PAMSecurityRealm.BelongToGroup={0} \u043C\u043E\u0440\u0430 \u043F\u0440\u0438\u043F\u0430\u0434\u0430\u0442\u0438 \u0433\u0440\u0443\u043F\u0438 {1} \u0434\u0430 \u0431\u0438 \u0443\u0447\u0438\u0442\u0430\u043E /etc/shadow +PAMSecurityRealm.RunAsUserOrBelongToGroupAndChmod=Jenkins \u0442\u0440\u0435\u0431\u0430 \u0431\u0438\u0442\u0438 \u043F\u043E\u043A\u0440\u0435\u043D\u0443\u0442 \u043A\u0430\u043E {0} \u0438\u043B\u0438 {1} \u0442\u0440\u0435\u0431\u0430 \u043F\u0438\u0440\u0430\u0434\u0430\u0442\u0438 \u0433\u0440\u0443\u043F\u0438 {2} \u0438 \u2018chmod g+r /etc/shadow\u2019 \u0442\u0440\u0435\u0431\u0430 \u0431\u0438\u0442\u0438 \u0438\u0437\u0432\u0440\u0448\u0435\u043D\u043E \u0434\u0430 \u0431\u0438 Jenkins \u0443\u0447\u0438\u0442\u0430\u043E /etc/shadow +PAMSecurityRealm.Success=\u0423\u0441\u043F\u0435\u0448\u043D\u043E +PAMSecurityRealm.User=\u041A\u043E\u0440\u0438\u0441\u043D\u0438\u043A '{0}' +PAMSecurityRealm.Uid=\u0418\u0434\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0446\u0438\u043E\u043D\u0438 \u0431\u0440\u043E\u0458 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u043A\u0430: {0} +PAMSecurityRealm.CurrentUser=\u0422\u0440\u0435\u043D\u0443\u0442\u043D\u0438 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u043A +Permission.Permissions.Title=\u041D/\u0414 +AccessDeniedException2.MissingPermission={0} \u0444\u0430\u043B\u0438 \u043E\u0432\u043B\u0430\u0448\u045B\u0435\u045A\u0435 {1} \ No newline at end of file diff --git a/core/src/main/resources/hudson/security/Messages_zh_CN.properties b/core/src/main/resources/hudson/security/Messages_zh_CN.properties index a69de52c6a64dbe61012e10ba4dbe025d128172e..aeedb5f01c14271ea5c2499bccac1cd01c0f64d9 100644 --- a/core/src/main/resources/hudson/security/Messages_zh_CN.properties +++ b/core/src/main/resources/hudson/security/Messages_zh_CN.properties @@ -1,59 +1,59 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Eric Lefevre-Ardant, Seiji Sogabe -# -# 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. - -LegacyAuthorizationStrategy.DisplayName=\u9057\u7559\u6a21\u5f0f - -HudsonPrivateSecurityRealm.DisplayName=Jenkins\u4e13\u6709\u7528\u6237\u6570\u636e\u5e93 -HudsonPrivateSecurityRealm.Details.DisplayName=\u5bc6\u7801 -HudsonPrivateSecurityRealm.Details.PasswordError=\ - \u786e\u8ba4\u5bc6\u7801\u4e0e\u7b2c\u4e00\u6b21\u8f93\u5165\u7684\u4e0d\u4e00\u81f4. \ - \u8bf7\u786e\u8ba4\u4e24\u6b21\u5bc6\u7801\u8f93\u5165\u76f8\u540c. -HudsonPrivateSecurityRealm.ManageUserLinks.DisplayName=\u7ba1\u7406\u7528\u6237 -HudsonPrivateSecurityRealm.ManageUserLinks.Description=\u521b\u5efa/\u5220\u9664/\u4fee\u6539Jenkins\u7528\u6237 - -FullControlOnceLoggedInAuthorizationStrategy.DisplayName=\u767b\u5f55\u7528\u6237\u53ef\u4ee5\u505a\u4efb\u4f55\u4e8b - -AuthorizationStrategy.DisplayName=\u4efb\u4f55\u7528\u6237\u53ef\u4ee5\u505a\u4efb\u4f55\u4e8b(\u6ca1\u6709\u4efb\u4f55\u9650\u5236) - -LDAPSecurityRealm.DisplayName=LDAP -LDAPSecurityRealm.SyntaxOfServerField=Syntax of server field is SERVER or SERVER:PORT or ldaps://SERVER[:PORT] -LDAPSecurityRealm.UnknownHost=Unknown host: {0} -LDAPSecurityRealm.UnableToConnect=Unable to connect to {0} : {1} -LDAPSecurityRealm.InvalidPortNumber=Invalid port number - -LegacySecurityRealm.Displayname=Servlet\u5bb9\u5668\u4ee3\u7406 - -UserDetailsServiceProxy.UnableToQuery=\u6ca1\u6709\u68c0\u7d22\u5230\u8fd9\u4e2a\u7528\u6237\u4fe1\u606f: {0} - -PAMSecurityRealm.DisplayName=Unix\u7528\u6237/\u7ec4\u6570\u636e\u5e93 -PAMSecurityRealm.ReadPermission=Jenkins\u9700\u8981\u6709/etc/shadow\u8bfb\u7684\u6743\u9650 -PAMSecurityRealm.BelongToGroup={0}\u5fc5\u987b\u5c5e\u4e8e{1}\u7ec4\u6765\u8bfb\u53d6/etc/shadow -PAMSecurityRealm.RunAsUserOrBelongToGroupAndChmod=\ - Either Jenkins needs to run as {0} or {1} needs to belong to group {2} and ''chmod g+r /etc/shadow'' needs to be done to enable Jenkins to read /etc/shadow -PAMSecurityRealm.Success=\u6210\u529f -PAMSecurityRealm.User=\u7528\u6237 ''{0}'' -PAMSecurityRealm.CurrentUser=\u5f53\u524d\u7528\u6237 -PAMSecurityRealm.Uid=uid: {0} - -# not in use -Permission.Permissions.Title=N/A -AccessDeniedException2.MissingPermission={0}\u6ca1\u6709{1}\u6743\u9650 +# The MIT License +# +# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Eric Lefevre-Ardant, Seiji Sogabe +# +# 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. + +LegacyAuthorizationStrategy.DisplayName=\u9057\u7559\u6a21\u5f0f + +HudsonPrivateSecurityRealm.DisplayName=Jenkins\u4e13\u6709\u7528\u6237\u6570\u636e\u5e93 +HudsonPrivateSecurityRealm.Details.DisplayName=\u5bc6\u7801 +HudsonPrivateSecurityRealm.Details.PasswordError=\ + \u786e\u8ba4\u5bc6\u7801\u4e0e\u7b2c\u4e00\u6b21\u8f93\u5165\u7684\u4e0d\u4e00\u81f4. \ + \u8bf7\u786e\u8ba4\u4e24\u6b21\u5bc6\u7801\u8f93\u5165\u76f8\u540c. +HudsonPrivateSecurityRealm.ManageUserLinks.DisplayName=\u7ba1\u7406\u7528\u6237 +HudsonPrivateSecurityRealm.ManageUserLinks.Description=\u521b\u5efa/\u5220\u9664/\u4fee\u6539Jenkins\u7528\u6237 + +FullControlOnceLoggedInAuthorizationStrategy.DisplayName=\u767b\u5f55\u7528\u6237\u53ef\u4ee5\u505a\u4efb\u4f55\u4e8b + +AuthorizationStrategy.DisplayName=\u4efb\u4f55\u7528\u6237\u53ef\u4ee5\u505a\u4efb\u4f55\u4e8b(\u6ca1\u6709\u4efb\u4f55\u9650\u5236) + +LDAPSecurityRealm.DisplayName=LDAP +LDAPSecurityRealm.SyntaxOfServerField=Syntax of server field is SERVER or SERVER:PORT or ldaps://SERVER[:PORT] +LDAPSecurityRealm.UnknownHost=Unknown host: {0} +LDAPSecurityRealm.UnableToConnect=Unable to connect to {0} : {1} +LDAPSecurityRealm.InvalidPortNumber=Invalid port number + +LegacySecurityRealm.Displayname=Servlet\u5bb9\u5668\u4ee3\u7406 + +UserDetailsServiceProxy.UnableToQuery=\u6ca1\u6709\u68c0\u7d22\u5230\u8fd9\u4e2a\u7528\u6237\u4fe1\u606f: {0} + +PAMSecurityRealm.DisplayName=Unix\u7528\u6237/\u7ec4\u6570\u636e\u5e93 +PAMSecurityRealm.ReadPermission=Jenkins\u9700\u8981\u6709/etc/shadow\u8bfb\u7684\u6743\u9650 +PAMSecurityRealm.BelongToGroup={0}\u5fc5\u987b\u5c5e\u4e8e{1}\u7ec4\u6765\u8bfb\u53d6/etc/shadow +PAMSecurityRealm.RunAsUserOrBelongToGroupAndChmod=\ + Either Jenkins needs to run as {0} or {1} needs to belong to group {2} and ''chmod g+r /etc/shadow'' needs to be done to enable Jenkins to read /etc/shadow +PAMSecurityRealm.Success=\u6210\u529f +PAMSecurityRealm.User=\u7528\u6237 ''{0}'' +PAMSecurityRealm.CurrentUser=\u5f53\u524d\u7528\u6237 +PAMSecurityRealm.Uid=uid: {0} + +# not in use +Permission.Permissions.Title=N/A +AccessDeniedException2.MissingPermission={0}\u6ca1\u6709{1}\u6743\u9650 diff --git a/core/src/main/resources/hudson/security/SecurityRealm/loginLink_sr.properties b/core/src/main/resources/hudson/security/SecurityRealm/loginLink_sr.properties index d57edbe1596c5720c5239d8f0f8b3cf2ae38c86b..c7e7a1693ed818feeb9746e42b3dec95098fb470 100644 --- a/core/src/main/resources/hudson/security/SecurityRealm/loginLink_sr.properties +++ b/core/src/main/resources/hudson/security/SecurityRealm/loginLink_sr.properties @@ -1,3 +1,3 @@ # This file is under the MIT License by authors -login=Prijavi se +login=\u041F\u0440\u0438\u0458\u0430\u0432\u0438 \u0441\u0435 diff --git a/core/src/main/resources/hudson/security/SecurityRealm/signup_sr.properties b/core/src/main/resources/hudson/security/SecurityRealm/signup_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..b84ffe86ae4cfbcb0ec2b576b3186802314c1954 --- /dev/null +++ b/core/src/main/resources/hudson/security/SecurityRealm/signup_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +Signup\ not\ supported=\u041F\u0440\u0438\u0458\u0430\u0432\u0430 \u043D\u0438\u0458\u0435 \u043C\u043E\u0433\u0443\u045B\u0435 +Sign\ up=\u041F\u0440\u0438\u0458\u0430\u0432\u0438 \u0441\u0435 +This\ is\ not\ supported\ in\ the\ current\ configuration.=\u041D\u0438\u0458\u0435 \u043F\u043E\u0434\u0440\u0436\u0430\u043D\u043E \u0437\u0430 \u0442\u0435\u043A\u0443\u045B\u0443 \u043A\u043E\u043D\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0458\u0443 diff --git a/core/src/main/resources/hudson/security/csrf/DefaultCrumbIssuer/config_sr.properties b/core/src/main/resources/hudson/security/csrf/DefaultCrumbIssuer/config_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..28f532fc9e5289979365484fc00dc05852520f45 --- /dev/null +++ b/core/src/main/resources/hudson/security/csrf/DefaultCrumbIssuer/config_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Enable\ proxy\ compatibility=\u041E\u043C\u043E\u0433\u0443\u045B\u0438 \u043A\u043E\u043C\u043F\u0430\u0442\u0438\u0431\u0438\u043B\u0438\u043D\u043E\u0441\u0442 proxy-\u0430 diff --git a/core/src/main/resources/hudson/security/csrf/GlobalCrumbIssuerConfiguration/config_sr.properties b/core/src/main/resources/hudson/security/csrf/GlobalCrumbIssuerConfiguration/config_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..e81a8855eac1824cc63e19e9902323323f47e10b --- /dev/null +++ b/core/src/main/resources/hudson/security/csrf/GlobalCrumbIssuerConfiguration/config_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +Prevent\ Cross\ Site\ Request\ Forgery\ exploits=\u0421\u043F\u0440\u0435\u0447\u0438 Cross Site Request Forgery \u043F\u0440\u043E\u0432\u0430\u043B\u0435 +Crumbs=\u041C\u0440\u0432\u0438\u0446\u0435 +Crumb\ Algorithm=\u0410\u043B\u0433\u043E\u0440\u0438\u0442\u0430\u043C \u043C\u0440\u0432\u0438\u0446\u0430 \ No newline at end of file diff --git a/core/src/main/resources/hudson/security/csrf/Messages_sr.properties b/core/src/main/resources/hudson/security/csrf/Messages_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..b67ab3e3df42129c13d5f416e0ea888b0e2525ce --- /dev/null +++ b/core/src/main/resources/hudson/security/csrf/Messages_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +DefaultCrumbIssuer.DisplayName=\u0421\u0442\u0430\u043D\u0434\u0430\u0440\u0434\u043D\u0438 \u0438\u0437\u0434\u0430\u0432\u0430\u0447 \u043C\u0440\u0432\u0438\u0446\u0430 \ No newline at end of file diff --git a/core/src/main/resources/hudson/slaves/CommandConnector/config_sr.properties b/core/src/main/resources/hudson/slaves/CommandConnector/config_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..67a16da6ab6c0c3496e316b353bf41ad98ec2e99 --- /dev/null +++ b/core/src/main/resources/hudson/slaves/CommandConnector/config_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Launch\ command=\u0418\u0437\u0432\u0440\u0448\u0438 \u043F\u0440\u043E\u0433\u0440\u0430\u043C \ No newline at end of file diff --git a/core/src/main/resources/hudson/slaves/CommandLauncher/config_sr.properties b/core/src/main/resources/hudson/slaves/CommandLauncher/config_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..f7053d115b3b9fc20527432f3615086f9eb5cb8b --- /dev/null +++ b/core/src/main/resources/hudson/slaves/CommandLauncher/config_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Launch\ command=\u041A\u043E\u043C\u0430\u043D\u0434\u0430 \u0437\u0430 \u043F\u043E\u043A\u0440\u0435\u0442\u0430\u045A\u0435 diff --git a/core/src/main/resources/hudson/slaves/CommandLauncher/help_sr.properties b/core/src/main/resources/hudson/slaves/CommandLauncher/help_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..1f0dde07739dabebc261922fc594c560b4db6f52 --- /dev/null +++ b/core/src/main/resources/hudson/slaves/CommandLauncher/help_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +blurb=\u041F\u043E\u043A\u0440\u0435\u043D\u0435 \u0430\u0433\u0435\u043D\u0442\u0430 \u0442\u0430\u043A\u043E \u0448\u0442\u043E Jenkins \u0438\u0437\u0432\u0440\u0448\u0438 \u043A\u043E\u043C\u0430\u043D\u0434\u0443 \u0441\u0430 \u0433\u043B\u0430\u0432\u043D\u0435 \u043C\u0430\u0448\u0438\u043D\u0435. \u041A\u043E\u0440\u0438\u0441\u0442\u0438\u0442\u0435 \u043E\u0432\u0443 \u043E\u043F\u0446\u0438\u0458\u0443 \u043A\u0430\u0434 \u0433\u043E\u0434 \u0433\u043B\u0430\u0432\u043D\u0430 \u043C\u0430\u0448\u0438\u043D\u0430 \u0458\u0435 \u0443 \u0441\u0442\u0430\u045A\u0443 \u0434\u0430 \u0438\u0437\u0432\u0440\u0448\u0438 \u043F\u0440\u043E\u0446\u0435\u0441 \u043D\u0430 \u0434\u0440\u0443\u0433\u043E\u0458 \u043C\u0430\u0448\u0438\u043D\u0438, \u043D\u043F\u0440. \u043F\u0440\u0435\u043A\u043E SSH \u0438\u043B\u0438 RSH. diff --git a/core/src/main/resources/hudson/slaves/ComputerLauncher/main_sr.properties b/core/src/main/resources/hudson/slaves/ComputerLauncher/main_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..23f7fceb55abd588e379e5fed687044ea740dbcf --- /dev/null +++ b/core/src/main/resources/hudson/slaves/ComputerLauncher/main_sr.properties @@ -0,0 +1,7 @@ +# This file is under the MIT License by authors + +launchingDescription=\u041E\u0432\u0430 \u043C\u0430\u0448\u0438\u043D\u0430 \u0441\u0435 \u043F\u043E\u043A\u0440\u0435\u045B\u0435 +See\ log\ for\ more\ details=\u041F\u0440\u0435\u0433\u043B\u0435\u0434\u0430\u0458\u0442\u0435 \u0436\u0443\u0440\u043D\u0430\u043B \u0437\u0430 \u0432\u0438\u0448\u0435 \u0434\u0435\u0442\u0430\u0459\u0430 +Relaunch\ agent=\u041F\u043E\u043D\u043E\u0432\u043E \u043F\u043E\u043A\u0440\u0435\u043D\u0438 \u0430\u0433\u0435\u043D\u0442 +Launch\ agent=\u041F\u043E\u043A\u0440\u0435\u043D\u0438 \u0430\u0433\u0435\u043D\u0442 +description=\u041E\u0432\u0430 \u043C\u0430\u0448\u0438\u043D\u0430 \u045B\u0435 \u0431\u0438\u0442\u0438 \u043F\u043E\u043A\u0440\u0435\u043D\u0443\u0442\u0430. diff --git a/core/src/main/resources/hudson/slaves/DelegatingComputerLauncher/config_sr.properties b/core/src/main/resources/hudson/slaves/DelegatingComputerLauncher/config_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..147ac620f18b6184b4922674a1ce155506121653 --- /dev/null +++ b/core/src/main/resources/hudson/slaves/DelegatingComputerLauncher/config_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Actual\ launch\ method=\u041C\u0435\u0442\u043E\u0434 \u043F\u043E\u043A\u0440\u0435\u0442\u0430\u045A\u0430 diff --git a/core/src/main/resources/hudson/slaves/DumbSlave/configure-entries_sr.properties b/core/src/main/resources/hudson/slaves/DumbSlave/configure-entries_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..080510945b9c451fdab2b21ba227d1ce88edd614 --- /dev/null +++ b/core/src/main/resources/hudson/slaves/DumbSlave/configure-entries_sr.properties @@ -0,0 +1,18 @@ +# This file is under the MIT License by authors + +Description=\u041E\u043F\u0438\u0441 +\#\ of\ executors=\u0431\u0440\u043E\u0458 \u0438\u0437\u0432\u0440\u0448\u0438\u0442\u0435\u0459\u0430 +Remote\ root\ directory=\u0423\u0434\u0430\u0459\u0435\u043D\u0438 \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0458\u0443\u043C \u043A\u043E\u0440\u0435\u043D\u0430 +Labels=\u041B\u0430\u0431\u0435\u043B\u0435 +Launch\ method=\u041C\u0435\u0442\u043E\u0434 \u043F\u043E\u043A\u0440\u0435\u0442\u0430\u045A\u0430 +Availability=\u0414\u043E\u0441\u0442\u0443\u043F\u043D\u043E\u0441\u0442 +Node\ Properties=\u041F\u043E\u0441\u0442\u0430\u0432\u043A\u0435 \u043C\u0430\u0448\u0438\u043D\u0435 +Master=\u0413\u043B\u0430\u0432\u043D\u0430 +Name=\u0418\u043C\u0435 +This\ Jenkins\ server=\u041E\u0432\u0430 Jenkins \u043C\u0430\u0448\u0438\u043D\u0430 +Local\ FS\ root=\u041A\u043E\u0440\u0435\u043D \u043B\u043E\u043A\u0430\u043B\u043D\u043E\u0433 \u0441\u0438\u0441\u0442\u0435\u043C\u0430 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0430 +Name\ is\ mandatory=\u0418\u043C\u0435 \u0458\u0435 \u043E\u0431\u0430\u0432\u0435\u0437\u043D\u043E +Number\ of\ executors\ is\ mandatory.=\u0411\u0440\u043E\u0458 \u0438\u0437\u0432\u0440\u0448\u0438\u0442\u0435\u0459\u0430 \u0458\u0435 \u043E\u0431\u0430\u0432\u0435\u0437\u043D\u043E +Remote\ directory\ is\ mandatory.=\u0423\u0434\u0430\u0459\u0435\u043D\u0438 \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0458\u0443\u043C \u043A\u043E\u0440\u0435\u043D\u0430 \u0458\u0435 \u043E\u0431\u0430\u0432\u0435\u0437\u043D\u043E +Usage=\u0423\u043F\u043E\u0442\u0440\u0435\u0431\u0430 +Save=\u0421\u0430\u0447\u0443\u0432\u0430\u0458 diff --git a/core/src/main/resources/hudson/slaves/DumbSlave/newInstanceDetail_sr.properties b/core/src/main/resources/hudson/slaves/DumbSlave/newInstanceDetail_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..6b58ffb55f2387a366ba08dce5127f0f598b56bd --- /dev/null +++ b/core/src/main/resources/hudson/slaves/DumbSlave/newInstanceDetail_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +detail=\ +\u0414\u043E\u0434\u0430 \u043E\u0431\u0438\u0447\u0430\u043D, \u0442\u0440\u0430\u0458\u043D\u0438 \u0430\u0433\u0435\u043D\u0442 Jenkins-\u0443. \u0422\u0440\u0430\u0458\u043D\u043E \u0458\u0435 \u0437\u0430\u0448\u0442\u043E \u043D\u0435\u0434\u0430\u0458\u0435 \u0432\u0435\u045B\u0438 \u043D\u0438\u0432\u043E \u0438\u043D\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0458\u0435 \u0441\u0430 \u043E\u0432\u0438\u043C \u0430\u0433\u0435\u043D\u0442\u0438\u043C\u0430, \u043A\u0430\u043E \u0434\u0438\u043D\u0430\u043C\u0438\u0447\u043D\u043E \u0441\u043D\u0430\u0431\u0434\u0435\u0432\u0430\u045A\u0435. \u0418\u0437\u0430\u0431\u0435\u0440\u0438\u0442\u0435 \u043E\u0432\u043E \u0430\u043A\u043E \u0434\u0440\u0443\u0433\u0435 \u0432\u0440\u0441\u0442\u0435 \u0430\u0433\u0435\u043D\u0430\u0442\u0430 \u043D\u0435 \u043E\u0434\u0433\u043E\u0432\u0430\u0440\u0430\u0458\u0443 — \u043D\u043F\u0440. \u043A\u0430\u0442 \u0434\u043E\u0434\u0430\u0458\u0435\u0442\u0435 \u0440\u0430\u0447\u0443\u043D\u0430\u0440 \u0438\u043B\u0438 \u0432\u0438\u0440\u0442\u0443\u0435\u043B\u043D\u0435 \u043C\u0430\u0448\u0438\u043D\u0435 \u0441\u043F\u043E\u0459\u043E\u043C Jenkins-\u0430. diff --git a/core/src/main/resources/hudson/slaves/EnvironmentVariablesNodeProperty/config_sr.properties b/core/src/main/resources/hudson/slaves/EnvironmentVariablesNodeProperty/config_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..a656ba685a96f4f732f557b722f37d24f19780cd --- /dev/null +++ b/core/src/main/resources/hudson/slaves/EnvironmentVariablesNodeProperty/config_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +List\ of\ variables=\u0421\u043F\u0438\u0441\u0430\u043A \u043F\u0440\u043E\u043C\u0435\u043D\u0459\u0438\u0432\u0430 +Name=\u0418\u043C\u0435 +Value=\u0412\u0440\u0435\u0434\u043D\u043E\u0441\u0442 diff --git a/core/src/main/resources/hudson/slaves/JNLPLauncher/config_sr.properties b/core/src/main/resources/hudson/slaves/JNLPLauncher/config_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..f33e2853a0de8ed3b651a8b914f2f3ba5b5f6849 --- /dev/null +++ b/core/src/main/resources/hudson/slaves/JNLPLauncher/config_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Tunnel\ connection\ through=\u041F\u043E\u0432\u0435\u0436\u0438 \u043F\u043E\u043C\u043E\u045B\u0435\u043C \u0442\u0443\u043D\u0435\u043B\u0430 +JVM\ options=JVM \u043E\u043F\u0446\u0438\u0458\u0435 diff --git a/core/src/main/resources/hudson/slaves/JNLPLauncher/help.properties b/core/src/main/resources/hudson/slaves/JNLPLauncher/help.properties index 6d4dfb1b47a9e8c4d228d078ebac2ea2921e4f2f..2b2bb03e0499f296ed0b121871a64e7f37e3f613 100644 --- a/core/src/main/resources/hudson/slaves/JNLPLauncher/help.properties +++ b/core/src/main/resources/hudson/slaves/JNLPLauncher/help.properties @@ -25,7 +25,7 @@ blurb=Allows an agent to be launched using Java Web Start.
        \ + \u0423 \u0442\u043E\u043C \u0441\u043B\u0443\u0447\u0430\u0458\u0443, JNLP \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0430 \u043C\u043E\u0440\u0430 \u0431\u0438\u0442\u0438 \u043E\u0442\u0432\u043E\u0440\u0435\u043D\u0430 \u043D\u0430 \u043C\u0430\u0448\u0438\u043D\u0438 \u0430\u0433\u0435\u043D\u0442\u0430, \u043A\u043E\u0458\u0430 \u045B\u0435 \u0431\u0438\u0442\u0438 \ + \u043F\u043E\u0432\u0435\u0436\u0435\u043D\u0430 TCP \u0432\u0435\u0437\u043E\u043C \u043D\u0430 Jenkins \u043C\u0430\u0441\u0442\u0435\u0440.
        \ + \u0410\u0433\u0435\u043D\u0442 \u043D\u0435 \u043C\u043E\u0440\u0430 \u0431\u0438\u0442\u0438 \u0434\u043E\u0441\u0442\u0443\u043F\u0430\u043D \u043C\u0430\u0441\u0442\u0435\u0440\u043E\u043C; \u0430\u0433\u0435\u043D\u0442 \ + \u0458\u0435\u0434\u0438\u043D\u043E \u043C\u043E\u0440\u0430 \u0431\u0438\u0442\u0438 \u0443 \u0441\u0442\u0430\u045A\u0443 \u0434\u0430 \u043D\u0430\u0452\u0435 \u043C\u0430\u0441\u0442\u0435\u0440\u0430. \u0410\u043A\u043E \u0441\u0442\u0435 \u043E\u043C\u043E\u0433\u0443\u045B\u0438\u043B\u0438 \u0431\u0435\u0437\u0431\u0435\u0434\u043D\u0438 \u0440\u0435\u0436\u0438\u043C \ + \u043D\u0430 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0438 \u041F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 \u0431\u0435\u0437\u0431\u0435\u0434\u043D\u043E\u0441\u0442\u0438, \u043C\u043E\u0436\u0435\u0442\u0435 \u043D\u0430\u0432\u0435\u0441\u0442\u0438 \u043F\u043E\u0440\u0442 \u043F\u0440\u0435\u043A\u043E \ + \u043A\u043E\u0458\u0435 \u045B\u0435 \u043C\u0430\u0441\u0442\u0435\u0440 Jenkins \u043C\u0430\u0448\u0438\u043D\u0430 \u0441\u043B\u0443\u0448\u0430\u0442\u0438 \u0437\u0430 \u0434\u043E\u043B\u0430\u0437\u0435\u045B\u0435 JNLP \u0432\u0435\u0437\u0435.
        \ + JNLP \u0430\u0433\u0435\u043D\u0442 \u045B\u0435 \u043F\u043E\u043A\u0440\u0435\u043D\u0443\u0442\u0438 \u0433\u0440\u0430\u0444\u0438\u0447\u043A\u0438 \u0438\u043D\u0442\u0435\u0440\u0444\u0435\u0458\u0441, \u043C\u0435\u0452\u0443\u0442\u0438\u043C \u043C\u043E\u0433\u0443\u045B\u0435 \u0458\u0435 \u043F\u043E\u043A\u0440\u0435\u043D\u0443\u0442\u0438 \ + JNLP \u0430\u0433\u0435\u043D\u0442\u0430 \u0431\u0435\u0437 \u0433\u0440\u0430\u0444\u0438\u0447\u043A\u043E\u0433 \u0438\u043D\u0442\u0435\u0440\u0444\u0435\u0438\u0458\u0441\u0430, \u043D\u043F\u0440. \u043A\u0430\u043E Windows \u0441\u0435\u0440\u0432\u0438\u0441. \ No newline at end of file diff --git a/core/src/main/resources/hudson/slaves/JNLPLauncher/main_sr.properties b/core/src/main/resources/hudson/slaves/JNLPLauncher/main_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..c3626b46510ecb0ca7ff43b93ff7770cd3387cb0 --- /dev/null +++ b/core/src/main/resources/hudson/slaves/JNLPLauncher/main_sr.properties @@ -0,0 +1,12 @@ +# This file is under the MIT License by authors + +slaveAgentPort.disabled=\u041F\u043E\u0440\u0442 TCP \u0437\u0430 JNLP \u0458\u0435 \u0437\u0430\u0442\u0432\u043E\u0440\u0435\u043D +configure.link.text=\u0418\u0442\u0438\u0442\u0435 \u043D\u0430 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0443 \u0437\u0430 \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 \u0431\u0435\u0437\u0431\u0435\u0434\u043D\u043E\u0441\u0442\u0438 \u0438 \u043F\u0440\u043E\u043C\u0435\u043D\u0438\u0442\u0435 \u0433\u0430 +Connect\ agent\ to\ Jenkins\ one\ of\ these\ ways\:=\u041F\u043E\u0432\u0435\u0436\u0438\u0442\u0435 \u0441\u0435 \u0441\u0430 Jenkins-\u043E\u043C \u043F\u0443\u0442\u0435\u043C: +launch\ agent=\u043F\u043E\u043A\u0440\u0435\u043D\u0438 \u0430\u0433\u0435\u043D\u0442\u0430 +Launch\ agent\ from\ browser=\u041F\u043E\u043A\u0440\u0435\u043D\u0438 \u0441\u0430 \u0432\u0435\u0431-\u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0430\u0447\u0430 +Run\ from\ agent\ command\ line\:=\u0418\u0437\u0432\u0440\u0448\u0438 \u0441\u0430 \u043A\u043E\u043C\u0430\u043D\u0434\u043D\u0435 \u043B\u0438\u043D\u0438\u0458\u0435: +Or\ if\ the\ agent\ is\ headless\:=\u0418\u043B\u0438, \u0430\u043A\u043E \u0430\u0433\u0435\u043D\u0442 \u043D\u0435 \u0438\u043C\u0430 \u0435\u043A\u0440\u0430\u043D\u0430 +Connected\ via\ JNLP\ agent.=\u041F\u043E\u0432\u0435\u0437\u0430\u043D\u043E \u043F\u0443\u0442\u0435\u043C JNLP \u0430\u0433\u0435\u043D\u0442\u0430. +Run\ from\ agent\ command\ line=\u0418\u0437\u0432\u0440\u0448\u0438 \u0441\u0430 \u043A\u043E\u043C\u0430\u043D\u0434\u043D\u0435 \u043B\u0438\u043D\u0438\u0458\u0435 +Connect\ agent\ to\ Jenkins\ one\ of\ these\ ways=\u041F\u043E\u0432\u0435\u0436\u0438\u0442\u0435 \u0441\u0435 \u0441\u0430 Jenkins-\u043E\u043C \u043F\u0443\u0442\u0435\u043C diff --git a/core/src/main/resources/hudson/slaves/Messages.properties b/core/src/main/resources/hudson/slaves/Messages.properties index c3a247c2846362e848247a233ed1346d2945e4b1..6143662cfa511a0eae01c0aa8bad9b45a06dc19c 100644 --- a/core/src/main/resources/hudson/slaves/Messages.properties +++ b/core/src/main/resources/hudson/slaves/Messages.properties @@ -37,7 +37,8 @@ SimpleScheduledRetentionStrategy.FinishedUpTime=Computer has finished its schedu SimpleScheduledRetentionStrategy.displayName=Take this agent online according to a schedule EnvironmentVariablesNodeProperty.displayName=Environment variables SlaveComputer.DisconnectedBy=Disconnected by {0}{1} -NodeDescripter.CheckName.Mandatory=Name is mandatory +NodeDescriptor.CheckName.Mandatory=Name is mandatory ComputerLauncher.NoJavaFound=Java version {0} was found but 1.6 or later is needed. ComputerLauncher.JavaVersionResult={0} -version returned {1}. -ComputerLauncher.UknownJavaVersion=Couldn\u2019t figure out the Java version of {0} +ComputerLauncher.UnknownJavaVersion=Couldn\u2019t figure out the Java version of {0} +Cloud.ProvisionPermission.Description=Provision new nodes diff --git a/core/src/main/resources/hudson/slaves/Messages_pl.properties b/core/src/main/resources/hudson/slaves/Messages_pl.properties new file mode 100644 index 0000000000000000000000000000000000000000..f09693fdf41d16fa33b9216a089d6a834cb75036 --- /dev/null +++ b/core/src/main/resources/hudson/slaves/Messages_pl.properties @@ -0,0 +1,23 @@ +# The MIT License +# +# Copyright (c) 2016, Damian Szczepanik +# +# 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. +# Environment variables +EnvironmentVariablesNodeProperty.displayName=Zmienne \u015Brodowiskowe diff --git a/core/src/main/resources/hudson/slaves/Messages_sr.properties b/core/src/main/resources/hudson/slaves/Messages_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..7c3235dec4fde016849efe32e30572d8186cc5d1 --- /dev/null +++ b/core/src/main/resources/hudson/slaves/Messages_sr.properties @@ -0,0 +1,24 @@ +# This file is under the MIT License by authors + +RetentionStrategy.Always.displayName=\u0414\u0440\u0436\u0438 \u043E\u0432\u043E\u0433 \u0430\u0433\u0435\u043D\u0442\u0430 \u043F\u043E\u0432\u0435\u0437\u0430\u043D\u043E\u0433 \u043A\u043E\u043B\u0438\u043A\u043E \u0433\u043E\u0434 \u043C\u043E\u0433\u0443\u045B\u0435 +RetentionStrategy.Demand.displayName=\u041F\u043E\u0432\u0435\u0436\u0438 \u043E\u0432\u043E\u0433 \u0430\u0433\u0435\u043D\u0442\u0430 \u043A\u0430\u0434\u0430 \u0431\u0443\u0434\u0435 \u0431\u0438\u043B\u043E \u043F\u043E\u0442\u0440\u0435\u0431\u043D\u043E, \u0430 \u043F\u0440\u0435\u043A\u0438\u043D\u0438 \u0432\u0435\u0437\u0443 \u043A\u0430\u0434\u0430 \u0437\u0430\u0441\u0442\u043E\u0458\u0438. +RetentionStrategy.Demand.OfflineIdle=\u041D\u0438\u0458\u0435 \u043F\u043E\u0432\u0435\u0437\u0430\u043D\u043E, \u0458\u0435\u0440 \u0458\u0435 \u043C\u0430\u0448\u0438\u043D\u0430 \u0437\u0430\u0441\u0442\u043E\u0458\u0430\u043D\u0430. \u0411\u0438\u045B\u0435 \u043F\u043E\u043A\u0440\u0435\u043D\u0443\u0442 \u043A\u0430\u0434\u0430 \u0431\u0443\u0434\u0435 \u0431\u0438\u043B\u043E \u043F\u043E\u0442\u0440\u0435\u0431\u043D\u043E. +CommandLauncher.displayName=\u041F\u043E\u043A\u0440\u0435\u043D\u0438 \u0430\u0433\u0435\u043D\u0442\u0430 \u0438\u0437\u0432\u0440\u0448\u0430\u0432\u0430\u045A\u0443 \u043A\u043E\u043C\u0430\u043D\u0434\u0435 \u043D\u0430 \u0433\u043B\u0430\u0432\u043D\u043E\u0458 \u043C\u0430\u0448\u0438\u043D\u0438 +JNLPLauncher.displayName=\u041F\u043E\u043A\u0440\u0435\u043D\u0438 \u0430\u0433\u0435\u043D\u0442\u0430 \u0441\u0430 Java Web Start +ComputerLauncher.unexpectedError=\u041D\u0435\u043E\u0447\u0435\u043A\u0438\u0432\u0430\u043D\u0430 \u0433\u0440\u0435\u0448\u043A\u0430 \u043F\u0440\u0438\u043B\u0438\u043A\u043E\u043C \u043F\u043E\u043A\u0440\u0435\u0442\u0430\u045A\u0435 \u0430\u0433\u0435\u043D\u0442\u0430. \u041E\u0432\u043E \u0458\u0435 \u0432\u0435\u0440\u043E\u0432\u0430\u0442\u043D\u043E \u0433\u0440\u0435\u0448\u043A\u0430 \u0443 Jenkins. +ComputerLauncher.abortedLaunch=\u041F\u0440\u043E\u0446\u0435\u0441 \u0437\u0430 \u043F\u043E\u043A\u0440\u0435\u0442\u0430\u045A\u0435 \u0430\u0433\u0435\u043D\u0442\u0430 \u0458\u0435 \u043F\u0440\u0435\u043A\u0438\u043D\u0443\u0442. +ConnectionActivityMonitor.OfflineCause=\u041F\u043E\u043D\u043E\u0432\u0459\u0435\u043D\u0438 \u043F\u043E\u043A\u0443\u0448\u0430\u0458\u0438 \u0434\u0430 \u0441\u0435 \u0441\u0442\u0443\u043F\u0438 \u043A\u043E\u043D\u0442\u0430\u043A\u0442 \u043F\u0440\u0435\u043A\u043E \u043A\u043E\u043C\u0430\u043D\u0434\u0435 "ping" \u0441\u0443 \u043D\u0435\u0443\u0441\u043F\u0435\u0448\u043D\u0438. +CommandLauncher.NoLaunchCommand=\u041D\u0438\u0458\u0435 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u043E \u043A\u043E\u043C\u0430\u043D\u0434\u0430 \u0437\u0430 \u043F\u043E\u043A\u0440\u0435\u0442\u0430\u045A\u0435. +DumbSlave.displayName=\u0421\u0442\u0430\u043B\u043D\u0438 \u0430\u0433\u0435\u043D\u0442 +NodeProvisioner.EmptyString= +OfflineCause.LaunchFailed=\u0410\u0433\u0435\u043D\u0442 \u043D\u0438\u0458\u0435 \u043F\u0440\u0438\u043A\u0459\u0443\u0447\u0435\u043D \u0458\u0435\u0440 Jenkins \u043D\u0438\u0458\u0435 \u0443\u0441\u043F\u0435\u043E \u0434\u0430 \u043F\u043E\u043A\u0440\u0435\u043D\u0435 \u043F\u0440\u043E\u0446\u0435\u0441 \u043D\u0430 \u045A\u0435\u0433\u0430. +OfflineCause.connection_was_broken_=\u0412\u0435\u0437\u0430 \u0458\u0435 \u043F\u0440\u0435\u043A\u0438\u043D\u0443\u0442\u0430: {0} +SimpleScheduledRetentionStrategy.FinishedUpTime=\u041C\u0430\u0448\u0438\u043D\u0430 \u0458\u0435 \u0437\u0430\u0432\u0440\u0448\u0438\u043B\u0430 \u043F\u043B\u0430\u043D\u0438\u0440\u0430\u043D\u043E \u0432\u0440\u0435\u043C\u0435 \u0440\u0430\u0434\u0430 +SimpleScheduledRetentionStrategy.displayName=\u041F\u043E\u0432\u0435\u0436\u0438 \u0430\u0433\u0435\u043D\u0442\u0430 \u043F\u0440\u0435\u043C\u0430 \u0440\u0430\u0441\u043F\u043E\u0440\u0435\u0434\u0443 +EnvironmentVariablesNodeProperty.displayName=\u0413\u043B\u043E\u0431\u0430\u043B\u043D\u0430 \u043F\u0440\u043E\u043C\u0435\u043D\u0459\u0438\u0432\u0430 +SlaveComputer.DisconnectedBy=\u041F\u0440\u0435\u043A\u0438\u043D\u0443\u0442\u0430 \u0432\u0435\u0437\u0430 \u043E\u0434 \u0441\u0442\u0440\u0430\u043D\u0435 {0}{1} +NodeDescripter.CheckName.Mandatory=\u0418\u043C\u0435 \u0458\u0435 \u043E\u0431\u0430\u0432\u0435\u0437\u043D\u043E +ComputerLauncher.NoJavaFound=\u041F\u0440\u043E\u043D\u0430\u0452\u0435\u043D\u043E \u0458\u0435 Java \u0432\u0435\u0440\u0437\u0438\u0458\u0430 {0}, \u043C\u0435\u0452\u0443\u0442\u0438\u043C \u043F\u043E\u0442\u0440\u0435\u0431\u043D\u043E \u0458\u0435 \u0432\u0435\u0440\u0437\u0438\u0458\u0430 1.6. +ComputerLauncher.JavaVersionResult=\u041A\u043E\u043C\u0430\u043D\u0434\u0430 {0} -version \u0458\u0435 \u0432\u0440\u0430\u0442\u0438\u043B\u043E {1}. +ComputerLauncher.UknownJavaVersion=\u041D\u0438\u0458\u0435 \u043C\u043E\u0433\u0443\u045B\u0435 \u043E\u0434\u0440\u0435\u0434\u0438\u0438\u0442\u0438 Java \u0432\u0435\u0440\u0437\u0438\u0458\u0443 {0} +Cloud.ProvisionPermission.Description=\u041E\u0434\u0440\u0435\u0434\u0438 \u043D\u043E\u0432\u0435 \u043C\u0430\u0448\u0438\u043D\u0435 \ No newline at end of file diff --git a/core/src/main/resources/hudson/slaves/OfflineCause/ChannelTermination/cause_de.properties b/core/src/main/resources/hudson/slaves/OfflineCause/ChannelTermination/cause_de.properties index 8bbec34fbf1dcb328c18194be64509e47853d728..70ae2479d6a2315220e63145e0c6fd5e2ab7e748 100644 --- a/core/src/main/resources/hudson/slaves/OfflineCause/ChannelTermination/cause_de.properties +++ b/core/src/main/resources/hudson/slaves/OfflineCause/ChannelTermination/cause_de.properties @@ -1,23 +1,23 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Seiji Sogabe, Simon Wiest -# -# 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. - +# The MIT License +# +# Copyright (c) 2004-2009, Sun Microsystems, Inc., Seiji Sogabe, Simon Wiest +# +# 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. + Connection\ was\ broken=Verbindung abgebrochen \ No newline at end of file diff --git a/core/src/main/resources/hudson/slaves/OfflineCause/ChannelTermination/cause_sr.properties b/core/src/main/resources/hudson/slaves/OfflineCause/ChannelTermination/cause_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..c90bb813262f987a28ec2f09f0ea24f854c42f81 --- /dev/null +++ b/core/src/main/resources/hudson/slaves/OfflineCause/ChannelTermination/cause_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Connection\ was\ broken=\u0412\u0435\u0437\u0430 \u0458\u0435 \u043F\u0440\u0435\u043A\u0438\u043D\u0443\u0442\u0430 diff --git a/core/src/main/resources/hudson/slaves/OfflineCause/LaunchFailed/cause_sr.properties b/core/src/main/resources/hudson/slaves/OfflineCause/LaunchFailed/cause_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..5095bc44ec1b20cac211f924b3180d486c211ba0 --- /dev/null +++ b/core/src/main/resources/hudson/slaves/OfflineCause/LaunchFailed/cause_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +See\ log\ for\ more\ details=\u041F\u0440\u0435\u0433\u043B\u0435\u0434\u0430\u0458\u0442\u0435 \u0436\u0443\u0440\u043D\u0430\u043B \u0437\u0430 \u0432\u0438\u0448\u0435 \u0434\u0435\u0442\u0430\u0459\u0430 diff --git a/core/src/main/resources/hudson/slaves/RetentionStrategy/Demand/config_sr.properties b/core/src/main/resources/hudson/slaves/RetentionStrategy/Demand/config_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..6e5107cd17cfe6b103d30bd6a889a0f6e59e9046 --- /dev/null +++ b/core/src/main/resources/hudson/slaves/RetentionStrategy/Demand/config_sr.properties @@ -0,0 +1,6 @@ +# This file is under the MIT License by authors + +In\ demand\ delay=\u041A\u0430\u0448\u045A\u0435\u045A\u0435 \u043D\u0430\u043A\u043E\u043D \u043F\u043E\u0441\u0442\u0430\u0432\u0459\u0430\u045A\u0430 \u0437\u0430\u0434\u0430\u0442\u043A\u0430 +In\ demand\ delay\ is\ mandatory\ and\ must\ be\ a\ number.=\u041A\u0430\u0448\u045A\u0435\u045A\u0435 \u043D\u0430\u043A\u043E\u043D \u043F\u043E\u0441\u0442\u0430\u0432\u0459\u0430\u045A\u0430 \u0437\u0430\u0434\u0430\u0442\u0430\u043A\u0430 \u043C\u043E\u0440\u0430 \u0431\u0438\u0442\u0438 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u043E. +Idle\ delay=\u041A\u0430\u0448\u045A\u0435\u045A\u0435 \u043D\u0430\u043A\u043E\u043D \u0437\u0430\u0432\u0440\u0448\u0435\u0442\u043A\u0430 +Idle\ delay\ is\ mandatory\ and\ must\ be\ a\ number.=\u041A\u0430\u0448\u045A\u0435\u045A\u0435 \u043D\u0430\u043A\u043E\u043D \u0437\u0430\u0432\u0440\u0448\u0435\u0442\u043A\u0430 \u043C\u043E\u0440\u0430 \u0431\u0438\u0442\u0438 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u043E. diff --git a/core/src/main/resources/hudson/slaves/RetentionStrategy/Scheduled/config_sr.properties b/core/src/main/resources/hudson/slaves/RetentionStrategy/Scheduled/config_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..b95c745f05aee69fdfdbeb423e77542da3458c87 --- /dev/null +++ b/core/src/main/resources/hudson/slaves/RetentionStrategy/Scheduled/config_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Startup\ Schedule=\u0420\u0430\u0441\u043F\u043E\u0440\u0435\u0434 \u043F\u043E\u043A\u0440\u0435\u0442\u0430\u045A\u0430 +Shutdown\ Schedule=\u0420\u0430\u0441\u043F\u043E\u0440\u0435\u0434 \u0433\u0430\u0448\u0435\u045A\u0430 diff --git a/core/src/main/resources/hudson/slaves/SimpleScheduledRetentionStrategy/config_sr.properties b/core/src/main/resources/hudson/slaves/SimpleScheduledRetentionStrategy/config_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..4a372ed19400c05dce9b0cc8f5b1453db4402fc1 --- /dev/null +++ b/core/src/main/resources/hudson/slaves/SimpleScheduledRetentionStrategy/config_sr.properties @@ -0,0 +1,7 @@ +# This file is under the MIT License by authors + +Startup\ Schedule=\u0420\u0430\u0441\u043F\u043E\u0440\u0435\u0434 \u043F\u043E\u043A\u0440\u0435\u0442\u0430\u045A\u0430 +Scheduled\ Uptime=\u0420\u0430\u0441\u043F\u043E\u0440\u0435\u0434 \u0432\u0440\u0435\u043C\u0435\u043D\u0430 \u043D\u0435\u043F\u0440\u0435\u043A\u0438\u0434\u043D\u043E\u0433 \u0440\u0430\u0434\u0430 +uptime.description=\u041A\u043E\u043B\u0438\u043A\u043E \u043C\u0438\u043D\u0443\u0442\u0430 \u045B\u0435 \u0441\u0435 \u043E\u0434\u0440\u0436\u0430\u0432\u0430\u0442\u0438 \u0432\u0435\u0437\u0443 \u0441\u0430 \u043C\u0430\u0448\u0438\u043D\u043E\u043C. \u0410\u043A\u043E \u043F\u0440\u0435\u043A\u043E\u0440\u0430\u0447\u0443\u0458\u0435 \u0440\u0430\u0441\u043F\u043E\u0440\u0435\u0434 \u043F\u043E\u043A\u0440\u0435\u0442\u0430\u045A\u0430, \u043E\u043D\u0434\u0430 \u045B\u0435 \u043C\u0430\u0448\u0438\u043D\u0430 \u043E\u0441\u0442\u0430\u0442\u0438 \u043F\u043E\u0432\u0435\u0437\u0430\u043D\u0430. +Scheduled\ Uptime\ is\ mandatory\ and\ must\ be\ a\ number.= +Keep\ online\ while\ jobs\ are\ running=\u041E\u0434\u0440\u0436\u0438 \u0432\u0435\u0437\u0443 \u0434\u043E\u043A \u0441\u0435 \u0438\u0437\u0432\u0440\u0448\u0430\u0432\u0430\u0458\u0443 \u0437\u0430\u0434\u0430\u0446\u0438 diff --git a/core/src/main/resources/hudson/slaves/SlaveComputer/disconnect_sr.properties b/core/src/main/resources/hudson/slaves/SlaveComputer/disconnect_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..8dd7d8cc41e09cfddd71ec4eeca90d876be31680 --- /dev/null +++ b/core/src/main/resources/hudson/slaves/SlaveComputer/disconnect_sr.properties @@ -0,0 +1,6 @@ +# This file is under the MIT License by authors + +disconnect=\u043F\u0440\u0435\u043A\u0438\u043D\u0438 \u0432\u0435\u0437\u0443 +Are\ you\ sure\ about\ disconnecting?=\u0414\u0430 \u043B\u0438 \u0441\u0442\u0435 \u0441\u0438\u0433\u0443\u0440\u043D\u0438 \u0434\u0430 \u0436\u0435\u0438\u043B\u0438\u0442\u0435 \u0434\u0430 \u043F\u0440\u0435\u043A\u0438\u043D\u0435\u0442\u0435 \u0432\u0435\u0437\u0443? +Yes=\u0414\u0430 +blurb=\u041C\u043E\u0436\u0435\u0442\u0435 \u043E\u043F\u0446\u0438\u043E\u043D\u043E \u043D\u0430\u0432\u0435\u0441\u0442\u0430 \u0440\u0430\u0437\u043B\u043E\u0433 \u0437\u0430\u0448\u0442\u043E \u0441\u0435 \u043F\u0440\u0435\u043A\u0438\u0434\u0430 \u0432\u0435\u0437\u0430: diff --git a/core/src/main/resources/hudson/slaves/SlaveComputer/log_sr.properties b/core/src/main/resources/hudson/slaves/SlaveComputer/log_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..342f76eea2c02c11e790cbdbcc839e2bcf664d9f --- /dev/null +++ b/core/src/main/resources/hudson/slaves/SlaveComputer/log_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Log\ Records=\u0416\u0443\u0440\u043D\u0430\u043B \u043F\u043E\u0434\u0430\u0446\u0438 \ No newline at end of file diff --git a/core/src/main/resources/hudson/slaves/SlaveComputer/sidepanel2_sr.properties b/core/src/main/resources/hudson/slaves/SlaveComputer/sidepanel2_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..072ff6db922c12bd1bed8b8182ae3f0999992860 --- /dev/null +++ b/core/src/main/resources/hudson/slaves/SlaveComputer/sidepanel2_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +Log=\u0416\u0443\u0440\u043D\u0430\u043B +System\ Information=\u0418\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0458\u0435 \u043E \u0441\u0438\u0441\u0442\u0435\u043C\u0443 +Disconnect=\u041F\u0440\u0435\u043A\u0438\u043D\u0438 \u0432\u0435\u0437\u0443 diff --git a/core/src/main/resources/hudson/slaves/SlaveComputer/sidepanel_sr.properties b/core/src/main/resources/hudson/slaves/SlaveComputer/sidepanel_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..5986eb659ef0f052be6ed5a5629c916bd0409b57 --- /dev/null +++ b/core/src/main/resources/hudson/slaves/SlaveComputer/sidepanel_sr.properties @@ -0,0 +1,8 @@ +# This file is under the MIT License by authors + +System\ Information=\u0418\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0458\u0435 \u043E \u0441\u0438\u0441\u0442\u0435\u043C\u0443 +Back\ to\ List=\u041D\u0430\u0437\u0430\u0434 \u043A\u0430 \u0441\u043F\u0438\u0441\u043A\u0443 +Status=\u0421\u0442\u0430\u045A\u0435 +Log=\u0416\u0443\u0440\u043D\u0430\u043B +Disconnect=\u041F\u0440\u0435\u043A\u0438\u043D\u0438 \u0432\u0435\u0437\u0443 +Build\ History=\u0418\u0441\u0442\u043E\u0440\u0438\u0458\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 \ No newline at end of file diff --git a/core/src/main/resources/hudson/slaves/SlaveComputer/slave-agent.jnlp.jelly b/core/src/main/resources/hudson/slaves/SlaveComputer/slave-agent.jnlp.jelly index 3d15dbb245bd5f2125356059f482f98a1165fa4d..aff376cb8af2d79c16d1c3abb245df417a2149a7 100644 --- a/core/src/main/resources/hudson/slaves/SlaveComputer/slave-agent.jnlp.jelly +++ b/core/src/main/resources/hudson/slaves/SlaveComputer/slave-agent.jnlp.jelly @@ -57,7 +57,6 @@ THE SOFTWARE. - diff --git a/core/src/main/resources/hudson/slaves/SlaveComputer/systemInfo_sr.properties b/core/src/main/resources/hudson/slaves/SlaveComputer/systemInfo_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..a5f7432961709b0955223c6b87bba81f3bdd2da6 --- /dev/null +++ b/core/src/main/resources/hudson/slaves/SlaveComputer/systemInfo_sr.properties @@ -0,0 +1,8 @@ +# This file is under the MIT License by authors + +System\ Information=\u0418\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0458\u0435 \u043E \u0441\u0438\u0441\u0442\u0435\u043C\u0443 +System\ Information\ is\ unavailable\ when\ agent\ is\ offline.=\u041D\u0438\u0458\u0435 \u043C\u043E\u0433\u0443\u045B\u0435 \u0443\u0447\u0438\u0442\u0430\u0442\u0438 \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0458\u0435 \u043E \u0441\u0438\u0441\u0442\u0435\u043C\u0443 \u043A\u0430\u0434 \u0458\u0435 \u043C\u0430\u0448\u043D\u0438\u0430 \u043D\u0435\u043F\u043E\u0432\u0435\u0437\u0430\u043D\u0430. +System\ Information\ is\ unavailable\ when\ slave\ is\ offline.=\u041D\u0438\u0458\u0435 \u043C\u043E\u0433\u0443\u045B\u0435 \u0443\u0447\u0438\u0442\u0430\u0442\u0438 \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0458\u0435 \u043E \u0441\u0438\u0441\u0442\u0435\u043C\u0443 \u043A\u0430\u0434 \u0458\u0435 \u043F\u043E\u043C\u043E\u045B\u043D\u0430 \u043C\u0430\u0448\u043D\u0438\u0430 \u043D\u0435\u043F\u043E\u0432\u0435\u0437\u0430\u043D\u0430. +System\ Properties=\u041F\u043E\u0441\u0442\u0430\u0432\u043A\u0435 \u0441\u0438\u0441\u0442\u0435\u043C\u0430 +Environment\ Variables=\u0413\u043B\u043E\u0431\u0430\u043B\u043D\u0435 \u043F\u0440\u043E\u043C\u0435\u043D\u0459\u0438\u0432\u0435 +Thread\ Dump=\u0414\u0435\u043F\u043E\u043D\u0438\u0458\u0430 \u043D\u0438\u0442\u043E\u0432\u0430 diff --git a/core/src/main/resources/hudson/slaves/SlaveComputer/threadDump_de.properties b/core/src/main/resources/hudson/slaves/SlaveComputer/threadDump_de.properties index 6dc1884ce59426e72f0c73f655c1f6b4acd8e3d9..11b66c852d16e4003bf412268fe5b080195a94dc 100644 --- a/core/src/main/resources/hudson/slaves/SlaveComputer/threadDump_de.properties +++ b/core/src/main/resources/hudson/slaves/SlaveComputer/threadDump_de.properties @@ -1,23 +1,23 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Simon Wiest -# -# 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 CONNEC - -title={0} Thread Dump -Thread\ Dump=Thread Dump +# The MIT License +# +# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Simon Wiest +# +# 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 CONNEC + +title={0} Thread Dump +Thread\ Dump=Thread Dump diff --git a/core/src/main/resources/hudson/slaves/SlaveComputer/threadDump_sr.properties b/core/src/main/resources/hudson/slaves/SlaveComputer/threadDump_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..59ba3a01f64d01682935dfd97ecf4fdb516b0ba9 --- /dev/null +++ b/core/src/main/resources/hudson/slaves/SlaveComputer/threadDump_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +title={0} \u0414\u0435\u043F\u043E\u043D\u0438\u0458\u0430 \u043D\u0438\u0442\u043E\u0432\u0430 +Thread\ Dump={0} \u0414\u0435\u043F\u043E\u043D\u0438\u0458\u0430 \u043D\u0438\u0442\u043E\u0432\u0430 diff --git a/core/src/main/resources/hudson/tasks/ArtifactArchiver/config_pl.properties b/core/src/main/resources/hudson/tasks/ArtifactArchiver/config_pl.properties index 3752d192fa74fd5b3cc09d5d2a502a2ab0d65c51..75d09b7600c68e7f15a4beb685b43fa393e10449 100644 --- a/core/src/main/resources/hudson/tasks/ArtifactArchiver/config_pl.properties +++ b/core/src/main/resources/hudson/tasks/ArtifactArchiver/config_pl.properties @@ -1,6 +1,6 @@ # The MIT License # -# Copyright 2014 Jesse Glick. +# Copyright 2014-2016 Jesse Glick, Damian Szczepanik # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -20,4 +20,14 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Fingerprint\ all\ archived\ artifacts=Odcisk palca wszystkich zarchiwizowanych artefakt\u00f3w +Fingerprint\ all\ archived\ artifacts=Odcisk palca wszystkich zarchiwizowanych artefakt\u00F3w +Files\ to\ archive=Pliki do zarchiwizowania +# Do not fail build if archiving returns nothing +allowEmptyArchive=Nie oznaczaj zadania niepowodzeniem, je\u015Bli nie odnaleziono plik\u00F3w do zarchiwizowania +Excludes=Pliki do pomini\u0119cia +# Treat include and exclude patterns as case sensitive +caseSensitive=Uwzgl\u0119dniaj wielko\u015B\u0107 liter przy filtrowaniu plik\u00F3w do zarchiwizowania +# Archive artifacts only if build is successful +onlyIfSuccessful=Archiwizuj pliki tylko, je\u015Bli zadanie zako\u0144czy\u0142o si\u0119 powodzeniem +# Use default excludes +defaultExcludes=U\u017Cywaj domy\u015Blnego filtru dla plik\u00F3w, kt\u00F3re nale\u017Cy pomin\u0105\u0107 diff --git a/core/src/main/resources/hudson/tasks/ArtifactArchiver/config_sr.properties b/core/src/main/resources/hudson/tasks/ArtifactArchiver/config_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..09d2f6b36348493159abb1cd99b9b3fb7a8a1530 --- /dev/null +++ b/core/src/main/resources/hudson/tasks/ArtifactArchiver/config_sr.properties @@ -0,0 +1,9 @@ +# This file is under the MIT License by authors + +Files\ to\ archive=\u0414\u0430\u0442\u043E\u0442\u0435\u043A\u0435 \u0437\u0430 \u0430\u0440\u0445\u0438\u0432\u0430\u045A\u0435 +Excludes=\u0418\u0437\u0441\u043A\u0459\u0443\u0447\u0435\u045A\u0430 +allowEmptyArchive=\u041D\u0435\u043C\u043E\u0458 \u043E\u043A\u043E\u043D\u0447\u0430\u0442\u0438 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0443 \u0430\u043A\u043E \u0430\u0440\u0445\u0438\u0432\u0430\u0442\u043E\u0440 \u043D\u0435 \u0443\u0441\u043F\u0435 +onlyIfSuccessful=\u0410\u0440\u0445\u0438\u0432\u0438\u0440\u0430\u0458 \u0430\u0440\u0442\u0435\u0444\u0430\u043A\u0442\u0435 \u0441\u0430\u043C\u043E \u043A\u0430\u0434\u0430 \u0458\u0435 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 \u0443\u0441\u043F\u0435\u0448\u043D\u0430 +Fingerprint\ all\ archived\ artifacts=\u0423\u0437\u043C\u0438 \u043E\u0442\u0438\u0441\u043A\u0435 \u0441\u0432\u0438\u0445 \u0430\u0440\u0445\u0438\u0432\u0438\u0440\u0430\u043D\u0438\u043C \u0430\u0440\u0442\u0435\u0444\u0430\u043A\u0442\u0438\u043C\u0430 +defaultExcludes=\u041A\u043E\u0440\u0438\u0441\u0442\u0438 \u0443\u043E\u0431\u0438\u0447\u0430\u0458\u0435\u043D\u0430 \u0438\u0437\u0443\u0437\u0438\u043C\u0430\u045A\u0430 +caseSensitive=\u0422\u0440\u0435\u0442\u0438\u0440\u0430\u0458 \u043F\u0435\u043B\u0438\u043A\u0430 \u0438 \u043C\u0430\u043B\u0430 \u0441\u043B\u043E\u0432\u0430 \u043F\u043E \u0438\u0437\u0443\u0437\u0438\u043C\u0430\u045A\u0430 \u0438 \u0443\u0437\u0438\u043C\u0430\u045A\u0430 \u0448\u0430\u0431\u043B\u043E\u043D\u0435 \u0458\u0435\u0434\u043D\u0430\u0438\u043C diff --git a/core/src/main/resources/hudson/tasks/ArtifactArchiver/help-defaultExcludes_sr.properties b/core/src/main/resources/hudson/tasks/ArtifactArchiver/help-defaultExcludes_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..1ca86e02143950b1835a0525a02dbdaaf25644e6 --- /dev/null +++ b/core/src/main/resources/hudson/tasks/ArtifactArchiver/help-defaultExcludes_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +p1=\u0410\u0440\u0445\u0438\u0432\u0430\u0442\u043E\u0440 \u0430\u0440\u0442\u0435\u0444\u0430\u043A\u0442\u0438 \u043A\u043E\u0440\u0438\u0441\u0442\u0438 Ant org.apache.tools.ant.DirectoryScanner, \u0448\u0442\u043E \u0438\u0441\u043A\u0459\u0443\u0447\u0443\u0458\u0435 \u043D\u0430\u0440\u0435\u0434\u043D\u0435 \u0448\u0430\u0431\u043B\u043E\u043D\u0435: +p2=\u041E\u0432\u0430 \u043E\u043F\u0446\u0438\u0458\u0430 \u043F\u0440\u0443\u0436\u0438 \u043C\u043E\u0433\u0443\u045B\u043D\u043E\u0441\u0442 \u0434\u0430 \u0441\u0435 \u0443\u043A\u0459\u0443\u0447\u0435 \u0438\u043B\u0438 \u0438\u0441\u043A\u0459\u0443\u0447\u0435 Ant \u0438\u0437\u0443\u0437\u0438\u043C\u0430\u045A\u0430. \ No newline at end of file diff --git a/core/src/main/resources/hudson/tasks/BatchFile/config.jelly b/core/src/main/resources/hudson/tasks/BatchFile/config.jelly index 35e5f89c41f8d4e87cee4fe4ddda4607cc91727f..19fbdcef646d218856ddb69b2dff12fd7bedf283 100644 --- a/core/src/main/resources/hudson/tasks/BatchFile/config.jelly +++ b/core/src/main/resources/hudson/tasks/BatchFile/config.jelly @@ -28,4 +28,9 @@ THE SOFTWARE. description="${%description(rootURL)}"> + + + + + diff --git a/core/src/main/resources/hudson/tasks/BatchFile/config_sr.properties b/core/src/main/resources/hudson/tasks/BatchFile/config_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..cccacf6fa85480cab21e00a57e4d91af7633de8a --- /dev/null +++ b/core/src/main/resources/hudson/tasks/BatchFile/config_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Command=\u041A\u043E\u043C\u0430\u043D\u0434\u0430 +description=\u041F\u0440\u0435\u0433\u043B\u0435\u0434\u0430\u0458 \u0441\u043F\u0438\u0441\u0430\u043A \u043F\u0440\u043E\u043C\u0435\u043D\u0459\u0438\u0432\u0430 diff --git a/core/src/main/resources/hudson/tasks/BatchFile/help-unstableReturn.html b/core/src/main/resources/hudson/tasks/BatchFile/help-unstableReturn.html new file mode 100644 index 0000000000000000000000000000000000000000..0ee113e9e0c52d48a06f7b2406e64d7b9d00c80d --- /dev/null +++ b/core/src/main/resources/hudson/tasks/BatchFile/help-unstableReturn.html @@ -0,0 +1,9 @@ +
        + If set, the batch errorlevel result that will be interpreted as an unstable build result. + If the final errorlevel matches the value, the build results will be set to unstable and + next steps will be continued. Supported values match the widest errorlevel range for Windows + like systems. In Windows NT4 and beyond the ERRORLEVEL is stored as a four byte, signed integer, + yielding maximum and minimum values of 2147483647 and -2147483648, respectively. Older versions + of Windows use 2 bytes. DOS like systems use single byte, yielding errorlevels between 0-255. + The value 0 is ignored and does not make the build unstable to keep the default behaviour consistent. +
        diff --git a/core/src/main/resources/hudson/tasks/BuildTrigger/config_de.properties b/core/src/main/resources/hudson/tasks/BuildTrigger/config_de.properties index 1f56a5b8c6adcdaf44a82231fc304dd8ab6e8062..76d3309d9099c06ff1fff01da5e1012ed9a43476 100644 --- a/core/src/main/resources/hudson/tasks/BuildTrigger/config_de.properties +++ b/core/src/main/resources/hudson/tasks/BuildTrigger/config_de.properties @@ -1,26 +1,26 @@ -# The MIT License -# -# Copyright (c) 2004-2015, Sun Microsystems, Inc., Kohsuke Kawaguchi, Simon Wiest -# -# 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. - -Projects\ to\ build=Zu bauende Projekte -Trigger\ only\ if\ build\ is\ stable=Nur auslsen, wenn der Build stabil ist -Trigger\ even\ if\ the\ build\ is\ unstable=Auslsen, selbst wenn der Build instabil ist +# The MIT License +# +# Copyright (c) 2004-2015, Sun Microsystems, Inc., Kohsuke Kawaguchi, Simon Wiest +# +# 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. + +Projects\ to\ build=Zu bauende Projekte +Trigger\ only\ if\ build\ is\ stable=Nur auslsen, wenn der Build stabil ist +Trigger\ even\ if\ the\ build\ is\ unstable=Auslsen, selbst wenn der Build instabil ist Trigger\ even\ if\ the\ build\ fails=Auslsen, selbst wenn der Build fehlschlgt \ No newline at end of file diff --git a/core/src/main/resources/hudson/tasks/BuildTrigger/config_sr.properties b/core/src/main/resources/hudson/tasks/BuildTrigger/config_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..0065e35dc1fbe08bed686f135821bf303299bb41 --- /dev/null +++ b/core/src/main/resources/hudson/tasks/BuildTrigger/config_sr.properties @@ -0,0 +1,6 @@ +# This file is under the MIT License by authors + +Trigger\ only\ if\ build\ is\ stable=\u0418\u0437\u0430\u0437\u043E\u0432\u0438 \u0441\u0430\u043C\u043E \u0430\u043A\u043E \u0458\u0435 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 \u0441\u0442\u0430\u0431\u0438\u043B\u043D\u0430 +Trigger\ even\ if\ the\ build\ is\ unstable=\u0418\u0437\u0430\u0437\u043E\u0432\u0438 \u0447\u0430\u043A \u0438 \u0430\u043A\u043E \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 \u0458\u0435 \u043D\u0435\u0441\u0442\u0430\u0431\u0438\u043B\u043D\u0430 +Trigger\ even\ if\ the\ build\ fails=\u0418\u0437\u0430\u0437\u043E\u0432\u0438 \u0447\u0430\u043A \u0438 \u0430\u043A\u043E \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 \u043D\u0435\u0431\u0443\u0434\u0435 \u0443\u0441\u043F\u0435\u043B\u0430 +Projects\ to\ build=\u041F\u0440\u043E\u0458\u0435\u043A\u0442\u0438 \u0437\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0443 diff --git a/core/src/main/resources/hudson/tasks/Fingerprinter/FingerprintAction/index_sr.properties b/core/src/main/resources/hudson/tasks/Fingerprinter/FingerprintAction/index_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..2af320ae8fa9fc3a91676e825625f9ca1b62b96c --- /dev/null +++ b/core/src/main/resources/hudson/tasks/Fingerprinter/FingerprintAction/index_sr.properties @@ -0,0 +1,9 @@ +# This file is under the MIT License by authors + +Recorded\ Fingerprints=\u0417\u0430\u0431\u0435\u043B\u0435\u0436\u0435\u043D\u0435 \u043E\u0441\u0442\u0438\u0441\u043A\u0435 +File=\u0414\u0430\u0442\u043E\u0442\u0435\u043A\u0430 +Original\ owner=\u041E\u0440\u0438\u0433\u0438\u043D\u0430\u043B\u043D\u0438 \u0432\u043B\u0430\u0441\u043D\u0438\u043A +Age=\u0421\u0442\u0430\u0440\u043E\u0441\u0442 +outside\ Jenkins=\u0441\u043F\u043E\u0459\u043E\u043C Jenkins-\u0430 +this\ build=\u043E\u0432\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 +more\ details=\u0414\u0435\u0442\u0430\u0459\u0438 \ No newline at end of file diff --git a/core/src/main/resources/hudson/tasks/Fingerprinter/config_sr.properties b/core/src/main/resources/hudson/tasks/Fingerprinter/config_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..0c97635891ca966630bafa58c07a5a50a7b7de9b --- /dev/null +++ b/core/src/main/resources/hudson/tasks/Fingerprinter/config_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Files\ to\ fingerprint=\u0414\u0430\u0442\u043E\u0442\u0435\u043A\u0435 \u0437\u0430 \u043E\u0442\u0438\u0441\u0430\u043A diff --git a/core/src/main/resources/hudson/tasks/Fingerprinter/help.html b/core/src/main/resources/hudson/tasks/Fingerprinter/help.html index b84d67f0c3125df8d0d933c5bdcbfd5674e88613..cdbcdd57c89ba07435ffee33fb8d578b31e41db5 100644 --- a/core/src/main/resources/hudson/tasks/Fingerprinter/help.html +++ b/core/src/main/resources/hudson/tasks/Fingerprinter/help.html @@ -26,6 +26,6 @@ is used) need to use this and record fingerprints.

        - See this document + See this document for more details.

        diff --git a/core/src/main/resources/hudson/tasks/Fingerprinter/help_de.html b/core/src/main/resources/hudson/tasks/Fingerprinter/help_de.html index a605400804debdc7aa9fd5c302255a53c0780422..5416a582857f4e29ffc66e828f695222054a32bb 100644 --- a/core/src/main/resources/hudson/tasks/Fingerprinter/help_de.html +++ b/core/src/main/resources/hudson/tasks/Fingerprinter/help_de.html @@ -27,5 +27,5 @@ Projekt, in dem eine Datei produziert wird, sondern alle Projekte, welche die Datei verwenden) diese Funktion verenden und Fingerabdrücke aufzeichnen.

        - Weitere Informationen (auf Englisch) + Weitere Informationen (auf Englisch)

        diff --git a/core/src/main/resources/hudson/tasks/Fingerprinter/help_fr.html b/core/src/main/resources/hudson/tasks/Fingerprinter/help_fr.html index 0a353d46feabf8f2e8701b58a8c3a695dc161fe6..ab9fadd307163a3979c3b687527bc2858ab0eb26 100644 --- a/core/src/main/resources/hudson/tasks/Fingerprinter/help_fr.html +++ b/core/src/main/resources/hudson/tasks/Fingerprinter/help_fr.html @@ -33,6 +33,6 @@

        Voir - ce document + ce document pour plus de details.

        diff --git a/core/src/main/resources/hudson/tasks/Fingerprinter/help_ja.html b/core/src/main/resources/hudson/tasks/Fingerprinter/help_ja.html index 6f4e235eb30f2f80b1988579aba342fc55754d4e..373c21c411dda07ad84fecc97882228435de1a1a 100644 --- a/core/src/main/resources/hudson/tasks/Fingerprinter/help_ja.html +++ b/core/src/main/resources/hudson/tasks/Fingerprinter/help_ja.html @@ -26,7 +26,7 @@ ファイルを利用するプロジェクト)すべてで,ファイル指紋を記録する必要があります。

        より詳しくは - このドキュメントを + このドキュメントを 参照してください。 diff --git a/core/src/main/resources/hudson/tasks/Fingerprinter/help_pt_BR.html b/core/src/main/resources/hudson/tasks/Fingerprinter/help_pt_BR.html index 6087ebb004e1a242d0abc840c05d6fde99ea8909..5c113191f7be82d1d715f0646d02c350f786f19c 100644 --- a/core/src/main/resources/hudson/tasks/Fingerprinter/help_pt_BR.html +++ b/core/src/main/resources/hudson/tasks/Fingerprinter/help_pt_BR.html @@ -26,6 +26,6 @@ é usado) necessitam usar isto e gravar os fingerprints.

        - Veja esta documentação + Veja esta documentação para mais detalhes. diff --git a/core/src/main/resources/hudson/tasks/Fingerprinter/help_ru.html b/core/src/main/resources/hudson/tasks/Fingerprinter/help_ru.html index 60aecef37a03524498f173fd1d2eecebfedb9766..057832d20c67288655d8694beb4bc2a26cda5959 100644 --- a/core/src/main/resources/hudson/tasks/Fingerprinter/help_ru.html +++ b/core/src/main/resources/hudson/tasks/Fingerprinter/help_ru.html @@ -26,6 +26,6 @@ должны также включить эту опцию и сохранять свои отпечатки.

        - Прочтите этот документ + Прочтите этот документ если вы хотите узнать больше. diff --git a/core/src/main/resources/hudson/tasks/Fingerprinter/help_tr.html b/core/src/main/resources/hudson/tasks/Fingerprinter/help_tr.html index 8464d5a98a7749cff2730ebe11cd5a7a090652c5..36e010f00d4271bed915467d9619dc700de2fbc8 100644 --- a/core/src/main/resources/hudson/tasks/Fingerprinter/help_tr.html +++ b/core/src/main/resources/hudson/tasks/Fingerprinter/help_tr.html @@ -25,5 +25,5 @@ aynı zamanda bu dosyayı kullanan projelerin de) bunu kullanması ve parmakizlerini kaydetmesi gereklidir.

        - Daha fazla bilgi için lütfen tıklayın + Daha fazla bilgi için lütfen tıklayın diff --git a/core/src/main/resources/hudson/tasks/Fingerprinter/help_zh_TW.html b/core/src/main/resources/hudson/tasks/Fingerprinter/help_zh_TW.html index 87133e07f0ca180bcb971ad47c8caf5c4995bf6f..b38287df9e3c5f5c98dbb0fb3be6775dc1273552 100644 --- a/core/src/main/resources/hudson/tasks/Fingerprinter/help_zh_TW.html +++ b/core/src/main/resources/hudson/tasks/Fingerprinter/help_zh_TW.html @@ -24,5 +24,5 @@ 都要開啟指紋記錄功能。

        - 詳情請參考這份文件。 + 詳情請參考這份文件。 diff --git a/core/src/main/resources/hudson/tasks/LogRotator/config_pl.properties b/core/src/main/resources/hudson/tasks/LogRotator/config_pl.properties index c52764d1741f8d18a912ae70f168de88048be22f..ff13ee9006df17a7fc434d80b3ac0875e709e1b0 100644 --- a/core/src/main/resources/hudson/tasks/LogRotator/config_pl.properties +++ b/core/src/main/resources/hudson/tasks/LogRotator/config_pl.properties @@ -1,7 +1,30 @@ -# This file is under the MIT License by authors +# The MIT License +# +# Copyright (c) 2004-2016, Sun Microsystems, Damian Szczepanik +# +# 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. Days\ to\ keep\ artifacts=Ilo\u015B\u0107 dni przechowywania artefaktu -Days\ to\ keep\ builds=Ilo\u015B\u0107 dni przechowywania zada\u0144 -Max\ #\ of\ builds\ to\ keep=Maksymalna ilo\u015B\u0107 przechowywanych zada\u0144 -if\ not\ empty,\ build\ records\ are\ only\ kept\ up\ to\ this\ number\ of\ days=Je\u015Bli nie jest puste, zadania s\u0105 przechowywane podan\u0105 ilo\u015B\u0107 dni +Days\ to\ keep\ builds=Maksymalny czas przechowywania w dniach +if\ not\ empty,\ build\ records\ are\ only\ kept\ up\ to\ this\ number\ of\ days=Je\u015Bli nie jest puste, zadania s\u0105 przechowywane tyle dni, ile podano if\ not\ empty,\ only\ up\ to\ this\ number\ of\ build\ records\ are\ kept=Je\u015Bli nie jest puste, przechowywanych jest tyle zada\u0144, ile podano +Max\ \#\ of\ builds\ to\ keep\ with\ artifacts=Maksymalna ilo\u015B\u0107 zada\u0144 przechowywanych z artefaktami +if\ not\ empty,\ only\ up\ to\ this\ number\ of\ builds\ have\ their\ artifacts\ retained=Je\u015Bli nie jest puste, przechowywanych jest tyle zada\u0144 z artefaktami, ile podano +if\ not\ empty,\ artifacts\ from\ builds\ older\ than\ this\ number\ of\ days\ will\ be\ deleted,\ but\ the\ logs,\ history,\ reports,\ etc\ for\ the\ build\ will\ be\ kept=Je\u015Bli nie jest puste, artefakty z zada\u0144 starsze ni\u017C podana ilo\u015B\u0107 dni b\u0119d\u0105 usuni\u0119te, ale rejestr zdarze\u0144, historia, raporty itp b\u0119d\u0105 zachowane +Max\ \#\ of\ builds\ to\ keep=Maksymalna ilo\u015B\u0107 zada\u0144 do przechowania diff --git a/core/src/main/resources/hudson/tasks/LogRotator/config_sr.properties b/core/src/main/resources/hudson/tasks/LogRotator/config_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..60ccb45301a83d175466af95215560639ea8e40f --- /dev/null +++ b/core/src/main/resources/hudson/tasks/LogRotator/config_sr.properties @@ -0,0 +1,10 @@ +# This file is under the MIT License by authors + +Days\ to\ keep\ builds=\u0411\u0440\u043E\u0458 \u0434\u0430\u043D\u0430 \u0437\u0430 \u0447\u0443\u0432\u0430\u045A\u0435 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 +if\ not\ empty,\ build\ records\ are\ only\ kept\ up\ to\ this\ number\ of\ days=\u0410\u043A\u043E \u0458\u0435 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u043E, \u0431\u0440\u043E\u0458 \u0434\u0430\u043D\u0430 \u0437\u0430 \u0447\u0443\u0432\u0430\u045A\u0435 \u0438\u0441\u043A\u0430\u0437\u0435 \u043E \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0438. +Max\ \#\ of\ builds\ to\ keep=\u041A\u043E\u043B\u0438\u043A\u043E \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 \u0437\u0430 \u0447\u0443\u0432\u0430\u045A\u0435 +if\ not\ empty,\ only\ up\ to\ this\ number\ of\ build\ records\ are\ kept=\u0410\u043A\u043E \u0458\u0435 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u043E, \u0431\u0440\u043E\u0458 \u0437\u0430\u043F\u0438\u0441\u0430 \u043E \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0438 \u0437\u0430 \u0447\u0443\u0432\u0430\u045A\u0435. +if\ not\ empty,\ artifacts\ from\ builds\ older\ than\ this\ number\ of\ days\ will\ be\ deleted,\ but\ the\ logs,\ history,\ reports,\ etc\ for\ the\ build\ will\ be\ kept= +Max\ \#\ of\ builds\ to\ keep\ with\ artifacts=\u041C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u0430\u043D \u0431\u0440\u043E\u0458 \u0438\u0437\u0433\u0440\u0430\u045A\u0430 \u043A\u043E\u0458\u0430 \u045B\u0435 \u0431\u0438\u0442\u0438 \u0441\u0430\u0447\u0443\u0432\u0430\u043D\u0430 \u0437\u0430\u0458\u0435\u0434\u043D\u043E \u0441\u0430 \u0430\u0440\u0442\u0435\u0444\u0430\u043A\u0442\u0438\u043C\u0430 +if\ not\ empty,\ only\ up\ to\ this\ number\ of\ builds\ have\ their\ artifacts\ retained=\u0410\u043A\u043E \u0458\u0435 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u043E, \u0431\u0440\u043E\u0458 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 \u0447\u0438\u0458\u0438 \u0430\u0440\u0442\u0435\u0444\u0430\u043A\u0442\u0438 \u045B\u0435 \u0431\u0438\u0442\u0438 \u0441\u0430\u0447\u0443\u0432\u0430\u045A\u0438. +Days\ to\ keep\ artifacts=\u041A\u043E\u043B\u0438\u043A\u043E \u0434\u0430\u043D\u0430 \u0434\u0430 \u0441\u0435 \u0447\u0443\u0432\u0430\u0458\u0443 \u0430\u0440\u0442\u0435\u0444\u0430\u043A\u0442\u0438 diff --git a/core/src/main/resources/hudson/tasks/Maven/MavenInstallation/config_sr.properties b/core/src/main/resources/hudson/tasks/Maven/MavenInstallation/config_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..2fbb8bde38001bf90e43c02d70be99315bd965fa --- /dev/null +++ b/core/src/main/resources/hudson/tasks/Maven/MavenInstallation/config_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Name=\u0418\u043C\u0435 diff --git a/core/src/main/resources/hudson/tasks/Maven/config_sr.properties b/core/src/main/resources/hudson/tasks/Maven/config_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..670a5b13eaaf981358cb4d6e855fa47848dbfc27 --- /dev/null +++ b/core/src/main/resources/hudson/tasks/Maven/config_sr.properties @@ -0,0 +1,12 @@ +# This file is under the MIT License by authors + +Maven\ Version=\u0412\u0435\u0440\u0437\u0438\u0458\u0430 Maven-\u0430 +Default=\u0421\u0442\u0430\u043D\u0434\u0430\u0440\u0434\u043D\u043E +Goals=\u0426\u0438\u0459\u0435\u0432\u0438 +POM=POM +Properties=\u041F\u043E\u0441\u0442\u0430\u0432\u043A\u0435 +JVM\ Options=\u041F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 JVM +Inject\ build\ variables=\u0423\u0431\u0430\u0446\u0438\u0432\u0430\u045A\u0435 \u043F\u0440\u043E\u043C\u0435\u043D\u0459\u0438\u0432\u0430 \u0437\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0443 +Use\ private\ Maven\ repository=\u041A\u043E\u0440\u0438\u0441\u0442\u0438 \u043F\u0440\u0438\u0432\u0430\u0442\u043D\u043E Maven \u0441\u043F\u0440\u0435\u043C\u0438\u0448\u0442\u0435 +Settings\ file=\u0414\u0430\u0442\u043E\u0442\u0435\u043A\u0430 \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 +Global\ Settings\ file=\u0414\u0430\u0442\u043E\u0442\u0435\u043A\u0430 \u0433\u043B\u043E\u0431\u0430\u043B\u043D\u0438\u0445 \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 diff --git a/core/src/main/resources/hudson/tasks/Maven/help_sr.properties b/core/src/main/resources/hudson/tasks/Maven/help_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..c1657bcbbf13dda58cf8b4c61afe22c1f98e81f1 --- /dev/null +++ b/core/src/main/resources/hudson/tasks/Maven/help_sr.properties @@ -0,0 +1,6 @@ +# This file is under the MIT License by authors + +para1=\u0417\u0430 \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u0435 \u043A\u043E\u0458\u0438 \u043A\u043E\u0440\u0438\u0441\u0442\u0435 \u0441\u0438\u0441\u0442\u0435\u043C \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 Maven. \u041E\u0432\u043E \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0435 \u045B\u0435 \u0443\u043A\u0430\u0437\u0430\u0442\u0438 \u0434\u0430 Jenkins \u043A\u043E\u0440\u0438\u0441\u0442\u0438 Maven \u0441\u0430 \u0434\u0430\u0442\u0438\u043C \u0446\u0438\u0459\u0435\u0432\u0438\u043C\u0430 \u0438 \u043E\u043F\u0446\u0438\u0458\u0430\u043C\u0430. \u0410\u043A\u043E Maven \u0437\u0430\u0432\u0440\u0448\u0438 \u0441\u0430 \u043D\u0435\u043D\u0443\u043B\u043D\u0438\u043C \u043A\u043E\u0434\u043E\u043C, \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 \u045B\u0435 \u0441\u0435 \u0441\u043C\u0430\u0442\u0440\u0430\u0442\u0438 \u043D\u0435\u0443\u0441\u043F\u0435\u043D\u043E\u0433. \u041C\u0435\u0452\u0443\u0442\u0438\u043C \u043D\u0435\u043A\u0435 \u0432\u0435\u0440\u0437\u0438\u0458\u0435 Maven \u0438\u043C\u0430\u0458\u0443 \u0433\u0440\u0435\u0448\u043A\u0443 \u043A\u043E\u0458\u0430 \u0432\u0440\u0430\u045B\u0430 \u043F\u043E\u0433\u0440\u0435\u0448\u0430\u043D \u043A\u043E\u0434 \u043F\u043E \u0437\u0430\u0432\u0440\u0448\u0435\u0442\u043A\u0443. +para2=Jenkins \u043F\u0440\u0435\u043D\u0435\u0441\u0435 \ + \u0440\u0430\u0437\u043D\u0430 \u043F\u0440\u043E\u043C\u0435\u043D\u0459\u0438\u0432\u0430 Maven-\u0443, \u043A\u043E\u0458\u0430 \u0441\u0443 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0430 \u043F\u043E \u0448\u0430\u0431\u043B\u043E\u043D\u0443 "$'{'env.VARIABLENAME}". +para3=\u0422\u0435 \u0438\u0441\u0442\u0435 \u043F\u0440\u043E\u043C\u0435\u043D\u0459\u0438\u0432\u0435 \u043C\u043E\u0433\u0443 \u0441\u0435 \u043A\u043E\u0440\u0438\u0441\u0442\u0438 \u043F\u0440\u0435\u043A\u043E \u043A\u043E\u043C\u0430\u043D\u0434\u043D\u0435 \u043B\u0438\u043D\u0438\u0458\u0435 (\u0430\u043A\u043E \u043F\u043E\u0437\u043E\u0432\u0435\u0442\u0435 Maven \u0441\u0430 \u043A\u043E\u043C\u0430\u043D\u0434\u043D\u0435 \u043B\u0438\u043D\u0438\u0458\u0435). \u041D\u0430 \u043F\u0440\u0438\u043C\u0435\u0440, \u043C\u043E\u0436\u0435\u0442\u0435 \u0434\u0430 \u043E\u0434\u0440\u0435\u0434\u0438\u0442\u0435 diff --git a/core/src/main/resources/hudson/tasks/Messages.properties b/core/src/main/resources/hudson/tasks/Messages.properties index 1cc86c71d77f73b0e12555335b1bd8cefeb65942..67417b1e72bef9796a38504657503246b2803d98 100644 --- a/core/src/main/resources/hudson/tasks/Messages.properties +++ b/core/src/main/resources/hudson/tasks/Messages.properties @@ -39,6 +39,8 @@ If you really did mean to archive all the files in the workspace, please specify ArtifactArchiver.NoMatchFound=No artifacts found that match the file pattern "{0}". Configuration error? BatchFile.DisplayName=Execute Windows batch command +BatchFile.invalid_exit_code_range=Invalid errorlevel value: {0}. Check help section +BatchFile.invalid_exit_code_zero=ERRORLEVEL zero is ignored and does not make the build unstable BuildTrigger.Disabled={0} is disabled. Triggering skipped BuildTrigger.DisplayName=Build other projects @@ -81,3 +83,5 @@ Maven.NotMavenDirectory={0} doesn\u2019t look like a Maven directory Maven.NoExecutable=Couldn\u2019t find any executable in {0} Shell.DisplayName=Execute shell +Shell.invalid_exit_code_range=Invalid exit code value: {0}. Check help section +Shell.invalid_exit_code_zero=Exit code zero is ignored and does not make the build unstable \ No newline at end of file diff --git a/core/src/main/resources/hudson/tasks/Messages_pl.properties b/core/src/main/resources/hudson/tasks/Messages_pl.properties new file mode 100644 index 0000000000000000000000000000000000000000..f685a33f96230aa1aab0d97a026fa660befc80ad --- /dev/null +++ b/core/src/main/resources/hudson/tasks/Messages_pl.properties @@ -0,0 +1,26 @@ +# The MIT License +# +# Copyright (c) 2016, Damian Szczepanik +# +# 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. +BuildTrigger.NoProjectSpecified=Nie podano \u017Cadnego projektu +BuildTrigger.NoSuchProject=Nie odnaleziono projektu ''{0}''. Czy chodzi\u0142o o ''{1}''? +ArtifactArchiver.NoIncludes=\ +ArtifactArchiver.DisplayName=Zachowaj w artifactory +BuildTrigger.DisplayName=Uruchom inne zadania \ No newline at end of file diff --git a/core/src/main/resources/hudson/tasks/Messages_sr.properties b/core/src/main/resources/hudson/tasks/Messages_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..a5eee350c3bbf8259165e4e464d3a62ed3a2a2c8 --- /dev/null +++ b/core/src/main/resources/hudson/tasks/Messages_sr.properties @@ -0,0 +1,55 @@ +# This file is under the MIT License by authors + +Ant.DisplayName=\u041F\u043E\u043A\u0440\u0435\u043D\u0438 Ant +Ant.ExecFailed=\u0438\u0437\u0431\u0440\u0448\u0430\u0432\u0430\u045A\u0435 \u043A\u043E\u043C\u0430\u043D\u0434\u0435 \u043D\u0438\u0458\u0435 \u0443\u0441\u043F\u0435\u043B\u043E. +Ant.ExecutableNotFound=\u0423 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u043E\u0458 \u0438\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u0438 Ant "{0}" \u043D\u0438\u0458\u0435 \u043F\u0440\u043E\u043D\u0430\u0452\u0435\u043D\u043E \u043A\u043E\u043C\u0430\u043D\u0434\u0430. +Ant.GlobalConfigNeeded=\u041F\u043E\u043A\u0443\u0448\u0430\u0458\u0442\u0435 \u043F\u043E\u043D\u043E\u0432\u043E \u0434\u0430 \u043D\u0430\u0432\u0435\u0434\u0435\u0442\u0435 \u043B\u043E\u043A\u0430\u0446\u0438\u0458\u0443 Ant \u0438\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u0435. +Ant.NotADirectory={0} \u043D\u0438\u0458\u0435 \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0458\u0443\u043C +Ant.NotAntDirectory={0} \u043D\u0438\u0458\u0435 \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0458\u0443\u043C \u0437\u0430 Ant +Ant.ProjectConfigNeeded=\u041F\u043E\u043A\u0443\u0448\u0430\u0458\u0442\u0435 \u0434\u0430 \u043F\u043E\u043D\u043E\u0432\u043E \u043F\u043E\u0441\u0442\u0430\u0432\u0438\u0442\u0435 \u0437\u0430\u0434\u0430\u0442\u0430\u043A \u0434\u0430 \u0438\u0437\u0430\u0431\u0435\u0440\u0435\u0442\u0435 \u043C\u0435\u0441\u0442\u043E \u0438\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u0435 Ant. +ArtifactArchiver.ARCHIVING_ARTIFACTS=\u0410\u0440\u0445\u0438\u0432\u0438\u0440\u0430\u045A\u0435 \u0430\u0440\u0442\u0435\u0444\u0430\u043A\u0442\u0438 +ArtifactArchiver.DisplayName=\u0410\u0440\u0445\u0438\u0432\u0438\u0440\u0430\u0458 \u0430\u0440\u0442\u0435\u0444\u0430\u043A\u0442\u0438 +ArtifactArchiver.SkipBecauseOnlyIfSuccessful=\u041F\u0440\u0435\u0441\u043A\u043E\u045B\u0430\u0432\u0430 \u0430\u0440\u0445\u0438\u0432\u0438\u0440\u0430\u045A\u0435 \u0437\u0430\u0448\u0442\u043E \u0458\u0435 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 \u043D\u0435\u0443\u0441\u043F\u0435\u0448\u043D\u0430 +ArtifactArchiver.FailedToArchive=\u041D\u0435\u0443\u0441\u043F\u0440\u0435\u0448\u043D\u043E \u0430\u0440\u0445\u0438\u0432\u0438\u0440\u0430\u045A\u0435 \u0430\u0440\u0442\u0435\u0444\u0430\u043A\u0442\u0438: {0} +ArtifactArchiver.NoIncludes=\u041D\u0435\u043C\u0430 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438\u0445 \u043F\u0440\u0435\u0434\u043C\u0435\u0442\u0430 \u0437\u0430 \u0430\u0440\u0445\u0438\u0432\u0438\u0440\u0430\u045A\u0435.\n\ +\u0418\u0437\u0433\u043B\u0435\u0434\u0430 \u0434\u0430 \u043D\u0438\u0441\u0442\u0435 \u043D\u0430\u0432\u0435\u043B\u0438 \u0448\u0430\u0431\u043B\u043E\u043D \u0438\u043C\u0435\u043D\u0430 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0435. \u041C\u043E\u043B\u0438\u043C\u043E \u0432\u0430\u0441, \u0432\u0440\u0430\u0442\u0438\u0442\u0435 \u0441\u0435 \u043D\u0430 \u0442\u0430\u0458 \u0435\u043A\u0440\u0430\u043D \u0438 \u0443\u043D\u0435\u0441\u0438\u0442\u0435 \u0433\u0430.\n\ +\u0410\u043A\u043E \u0437\u0430\u0438\u0441\u0442\u0430 \u0436\u0435\u043B\u0438\u0442\u0435 \u0434\u0430 \u0430\u0440\u0445\u0438\u0432\u0438\u0440\u0430 \u0441\u0432\u0435 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0435 \u0443 \u0440\u0430\u0434\u043D\u043E\u043C \u043F\u0440\u043E\u0441\u0442\u043E\u0440\u0443, \u0443\u043D\u0435\u0441\u0438\u0442\u0435 "**" +ArtifactArchiver.NoMatchFound=\u041D\u0438 \u0458\u0435\u0434\u0430\u043D \u0430\u0440\u0442\u0435\u0444\u0430\u043A\u0442 \u0441\u0435 \u043D\u0435 \u043F\u043E\u043A\u043B\u0430\u043F\u0430 \u0441\u0430 \u0448\u0430\u0431\u043B\u043E\u043D\u043E\u043C "{0}". \u0414\u0430\u043B\u0438 \u0438\u043C\u0430 \u0433\u0440\u0435\u0448\u0430\u043A\u0430 \u0443 \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0443? +BatchFile.DisplayName=\u0418\u0437\u0432\u0440\u0448\u0438 Windows \u043A\u043E\u043C\u0430\u043D\u0434\u0443 +BuildTrigger.Disabled={0} \u0458\u0435 \u043E\u0431\u0443\u0441\u0442\u0430\u0432\u0459\u0435\u043D\u043E \u0438 \u043D\u0435\u043C\u043E\u0436\u0435 \u0441\u0435 \u0438\u0437\u0430\u0437\u043E\u0432\u0430\u0442\u0438 +BuildTrigger.DisplayName=\u0418\u0437\u0433\u0440\u0430\u0434\u0438 \u0434\u0440\u0443\u0433\u0435 \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u0435 +BuildTrigger.InQueue={0} \u0458\u0435 \u0432\u0435\u045B \u0443 \u0440\u0435\u0434\u0443 +BuildTrigger.NoSuchProject=\u041D\u0435\u043C\u0430 \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u0430 ''{0}''. \u0414\u0430\u043B\u0438 \u0441\u0442\u0435 \u043C\u0438\u0441\u043B\u0438\u043B\u0438 ''{1}''? +BuildTrigger.NoProjectSpecified=\u041D\u0438\u0458\u0435 \u043D\u0430\u0432\u0435\u0434\u0435\u043D \u043F\u0440\u043E\u0458\u0435\u043A\u0430\u0442 +BuildTrigger.NotBuildable={0} \u043D\u0435\u043C\u043E\u0436\u0435 \u0441\u0435 \u0438\u0437\u0433\u0440\u0430\u0434\u0438\u0442\u0438 +BuildTrigger.Triggering=\u041F\u043E\u0447\u0438\u045A\u0435 \u043D\u043E\u0432\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 \u0437\u0430 {0} +BuildTrigger.ok_ancestor_is_null=\u041D\u0435\u043F\u043E\u0437\u043D\u0430\u0442 \u0440\u043E\u0434\u0438\u0442\u0435\u043B/\u043A\u043E\u043D\u0442\u0435\u043A\u0441\u0442: \u043D\u0430\u0432\u0435\u0434\u0435\u043D \u043F\u0440\u043E\u0458\u0435\u043A\u0430\u0442 \u043D\u0435\u043C\u043E\u0436\u0435 \u0431\u0438\u0442\u0438 \u043F\u0440\u043E\u0432\u0435\u0440\u0435\u043D +BuildTrigger.warning_access_control_for_builds_in_glo=\u0423\u043F\u043E\u0437\u043E\u0440\u0435\u045A\u0435: \u043F\u043E\u0459\u0435 '\u041A\u043E\u043D\u0442\u0440\u043E\u043B\u0430 \u043F\u0440\u0438\u0441\u0442\u0443\u043F\u0430' \u0443 \u043E\u043F\u0448\u0442\u0438\u043C \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0438\u043C\u0430 \u0431\u0435\u0437\u0431\u0435\u0434\u043D\u043E\u0441\u0442\u0438 \u043D\u0438\u0458\u0435 \u0438\u0441\u043F\u0443\u045A\u0435\u043Do. \u041A\u043E\u0440\u0438\u0441\u0442\u0438\u045B\u0435 \u0441\u0435 \u0441\u0442\u0430\u0440\u043E \u043F\u043E\u043D\u0430\u0448\u0430\u045A\u0435 \u043A\u043E\u0458\u0435 \u0434\u043E\u0437\u0432\u043E\u0459\u0430\u0432\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0443 \u0441\u0432\u0438\u0445 \u0437\u0430\u0434\u0430\u0442\u0430\u043A\u0430 \u043A\u043E\u0458\u0435 \u0437\u0430\u0432\u0438\u0441\u0435 \u043E\u0434 \u043E\u0432\u0435. +BuildTrigger.warning_this_build_has_no_associated_aut=\u0423\u043F\u043E\u0437\u043E\u0440\u0435\u045A\u0435: \u043E\u0432\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 \u043D\u0435\u043C\u0430 \u043A\u0430\u043D\u0430\u043B \u0430\u0443\u0442\u0435\u043D\u0442\u0438\u043A\u0430\u0446\u0438\u0435, \u043F\u0430 \u045B\u0435 \u0434\u043E\u0437\u0432\u043E\u043B\u0435 \u043D\u0435\u0434\u043E\u0441\u0442\u0430\u0458\u0430\u0442\u0438 \u0438 \u043E\u043D\u0438 \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u0438 \u043A\u043E\u0458\u0438 \u0437\u0430\u0432\u0438\u0441\u0435 \u043E\u0434 \u043E\u0432\u0435 \u0430 \u043D\u0438\u0441\u0443 \u0432\u0438\u0434\u0459\u0438\u0432\u0438 \u0430\u043D\u043E\u043D\u0438\u043C\u043D\u0438\u043C \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u0446\u0438\u043C\u0430, \u045B\u0435 \u0431\u0438\u0442\u0438 \u043F\u0440\u0435\u0441\u043A\u043E\u045B\u0435\u043D\u0438. +BuildTrigger.you_have_no_permission_to_build_=\u041D\u0435\u043C\u0430\u0442\u0435 \u043F\u0440\u0430\u0432\u043E \u0434\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u0438\u0442\u0435 {0} +CommandInterpreter.CommandFailed=\u0418\u0437\u0432\u0440\u0448\u0430\u0432\u0430\u045A\u0435 \u043A\u043E\u043C\u0430\u043D\u0434\u0435 \u043D\u0438\u0458\u0435 \u0443\u0441\u043F\u0435\u043B\u043E +CommandInterpreter.UnableToDelete=\u041D\u0438\u0458\u0435 \u043C\u043E\u0433\u0443\u045B\u0435 \u0438\u0437\u0431\u0440\u0438\u0441\u0430\u0442\u0438 \u0441\u043A\u0440\u0438\u043F\u0442 {0} +CommandInterpreter.UnableToProduceScript=\u041D\u0438\u0458\u0435 \u043C\u043E\u0433\u0443\u045B\u0435 \u043A\u0440\u0435\u0438\u0440\u0430\u0442\u0438 \u0441\u043A\u0440\u0438\u043F\u0442 {0} +Fingerprinter.Aborted=\u041F\u0440\u0435\u043A\u0438\u043D\u0443\u0442\u043E +Fingerprinter.Action.DisplayName=\u041F\u0440\u0435\u0433\u043B\u0435\u0434 \u0434\u0438\u0433\u0438\u0442\u0430\u043B\u043D\u0438\u0445 \u043E\u0442\u0438\u0441\u0430\u043A\u0430 +Fingerprinter.DigestFailed=\u041D\u0438\u0458\u0435 \u0443\u0441\u043F\u0435\u043B\u043E \u043E\u0431\u0440\u0430\u0447\u0443\u043D \u043D\u0430 \u0434\u0438\u0433\u0438\u0442\u0430\u043B\u043D\u043E\u043C \u043E\u0442\u0438\u0441\u043A\u0443 {0} +Fingerprinter.DisplayName=\u0421\u043D\u0438\u043C\u0438 \u0434\u0438\u0433\u0438\u0442\u0430\u043B\u043D\u0435 \u043E\u0442\u0438\u0441\u043A\u0435 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0430 \u0434\u0430 \u043F\u0440\u0430\u0442\u0438\u0442\u0435 \u045A\u0438\u0445\u043E\u0432\u0443 \u0443\u043F\u043E\u0442\u0435\u0431\u0440\u0443 +BuildTrigger.warning_you_have_no_plugins_providing_ac=\u0423\u043F\u043E\u0437\u043E\u0440\u0435\u045A\u0435: \u043D\u0435\u043C\u0430\u0442\u0435 \u043C\u043E\u0434\u0443\u043B\u0435 \u043A\u043E\u0458\u0435 \u0434\u0435\u043B\u0435 \u043F\u0440\u0438\u0441\u0442\u0443\u043F, \u043F\u0430 \u0441\u0435 \u0432\u0440\u0430\u045B\u0430 \u043D\u0430\u0437\u0430\u0434 \u043D\u0430 \u0440\u0435\u0436\u0438\u043C \u043A\u043E\u0458\u0438 \u0438\u0437\u0430\u0437\u0438\u0432\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0443 \u0438\u0437\u0432\u0438\u0441\u043D\u0438\u0445 \u0437\u0430\u0434\u0430\u0442\u0430\u043A\u0430. +Fingerprinter.Failed=\u041D\u0435\u0443\u0441\u043F\u0435\u0448\u043D\u043E \u0441\u043D\u0438\u043C\u0430\u045A\u0435 \u0434\u0438\u0433\u0438\u0442\u0430\u043B\u043D\u0438\u0445 \u043E\u0442\u0438\u0441\u043A\u0430 +Fingerprinter.FailedFor=\u041D\u0435\u0443\u0441\u043F\u0435\u0448\u043D\u043E \u0441\u043D\u0438\u043C\u0430\u045A\u0435 \u0434\u0438\u0433\u0438\u0442\u0430\u043B\u043D\u0438\u0443 \u043E\u0442\u0438\u0441\u043A\u0443 \u0437\u0430 {0} +Fingerprinter.Recording=\u0421\u043D\u0438\u043C\u0430\u045A\u0435 \u0434\u0438\u0433\u0438\u0442\u0430\u043B\u043D\u0438\u0445 \u043E\u0442\u0438\u0441\u043A\u0430 +InstallFromApache=\u0418\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u045A\u0435 \u043E\u0434 \u0441\u0430\u0438\u0442\u0430 Apache +JavadocArchiver.DisplayName=\u041F\u0443\u0431\u043B\u0438\u043A\u0443\u0458\u0442\u0435 Javadoc +JavadocArchiver.DisplayName.Javadoc=Javadoc +JavadocArchiver.DisplayName.Generic=\u0414\u043E\u043A\u0443\u043C\u0435\u043D\u0442 +TestJavadocArchiver.DisplayName.Javadoc=Test Javadoc +JavadocArchiver.NoMatchFound=\u041D\u0438\u0458\u0435 \u043F\u0440\u043E\u043D\u0430\u0452\u0435\u043D Javadoc {0}: {1} +JavadocArchiver.Publishing=\u041F\u0443\u0431\u043B\u0438\u043A\u043E\u0432\u0430\u045A\u0435 Javadoc +JavadocArchiver.UnableToCopy=Javadoc \u043D\u0435\u043C\u043E\u0436\u0435 \u0431\u0438\u0442\u0438 \u0438\u0441\u043A\u043E\u043F\u0438\u0440\u0430\u043D \u043E\u0434 {0} \u043D\u0430 {1} +Maven.DisplayName=\u0418\u0437\u0432\u0440\u0448\u0438 \u0432\u0440\u0445\u043E\u0432\u043D\u0435 Maven \u0446\u0438\u0459\u0435\u0432\u0435 +Maven.ExecFailed=\u0438\u0437\u0432\u0440\u0448\u0430\u0432\u0430\u045A\u0435 \u043A\u043E\u043C\u0430\u043D\u0434\u0435 \u0458\u0435 \u043D\u0435\u0443\u0441\u043F\u0435\u0448\u043D\u043E +Maven.NotMavenDirectory={0} \u043D\u0435 \u043B\u0438\u0447\u0438 \u043D\u0430 Maven \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0458\u0443\u043C +Maven.NoExecutable=\u041D\u0438\u0458\u0435 \u043F\u0440\u043E\u043D\u0430\u0452\u0435\u043D\u043E \u0438\u0437\u0432\u0440\u0448\u043D\u0430 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0430 \u0443 {0} +Shell.DisplayName=\u0418\u0437\u0432\u0440\u0448\u0438 shell \u043A\u043E\u043C\u0430\u043D\u0434\u0443 +Maven.NotADirectory={0} \u043D\u0438\u0458\u0435 \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0458\u0443\u043C +Indien= \ No newline at end of file diff --git a/core/src/main/resources/hudson/tasks/Shell/config.groovy b/core/src/main/resources/hudson/tasks/Shell/config.groovy index 3e81fb53d44e2344e43687acabae6b4f0c81d85b..58c4880bf22ffecd7f705e8eeb18addc32c335e2 100644 --- a/core/src/main/resources/hudson/tasks/Shell/config.groovy +++ b/core/src/main/resources/hudson/tasks/Shell/config.groovy @@ -27,3 +27,10 @@ f=namespace(lib.FormTagLib) f.entry(title:_("Command"),description:_("description",rootURL)) { f.textarea(name: "command", value: instance?.command, class: "fixed-width", 'codemirror-mode': 'shell', 'codemirror-config': "mode: 'text/x-sh'") } + +f.advanced() { + f.entry(title:_("Exit code to set build unstable"), field: "unstableReturn") { + f.number(clazz:"positive-number", value: instance?.unstableReturn, min:1, max:255, step:1) + } + +} diff --git a/core/src/main/resources/hudson/tasks/Shell/config.properties b/core/src/main/resources/hudson/tasks/Shell/config.properties index 5918ee6a1abad32630f30d40ae2c1a95e000c199..0d7b36f4a5a187009b57a54bbcab48a69a31434b 100644 --- a/core/src/main/resources/hudson/tasks/Shell/config.properties +++ b/core/src/main/resources/hudson/tasks/Shell/config.properties @@ -20,4 +20,4 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -description=See the list of available environment variables \ No newline at end of file +description=See the list of available environment variables diff --git a/core/src/main/resources/hudson/tasks/Shell/config_sr.properties b/core/src/main/resources/hudson/tasks/Shell/config_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..1b4980ff65f0b0cb6022d17b6023366771e0455d --- /dev/null +++ b/core/src/main/resources/hudson/tasks/Shell/config_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +description=\u041F\u0440\u0435\u0433\u043B\u0435\u0434\u0430\u0458\u0442\u0435 \u0441\u043F\u0438\u0441\u0430\u043A \u043F\u0440\u043E\u043C\u0435\u043D\u0459\u0438\u0432\u0430 +Command=\u041A\u043E\u043C\u0430\u043D\u0434\u0430 \ No newline at end of file diff --git a/core/src/main/resources/hudson/tasks/Shell/global_sr.properties b/core/src/main/resources/hudson/tasks/Shell/global_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..aa7f83e47ac5d202177f531b0b894e3aff2fc950 --- /dev/null +++ b/core/src/main/resources/hudson/tasks/Shell/global_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Shell=\u0409\u0443\u0441\u043A\u0430 +Shell\ executable=\u041F\u0443\u0442 \u0434\u043E \u0459\u0443\u0441\u043A\u0435 \ No newline at end of file diff --git a/core/src/main/resources/hudson/tasks/Shell/help-unstableReturn.html b/core/src/main/resources/hudson/tasks/Shell/help-unstableReturn.html new file mode 100644 index 0000000000000000000000000000000000000000..bc6426fa3dfb02a2e8e09105f0b368d91b04e16c --- /dev/null +++ b/core/src/main/resources/hudson/tasks/Shell/help-unstableReturn.html @@ -0,0 +1,5 @@ +

        + If set, the shell exit code that will be interpreted as an unstable build result. If the exit code matches the value, + the build results will be set to 'unstable' and next steps will be continued. On Unix-like it is a value between 0-255. + The value 0 is ignored and does not make the build unstable to keep the default behaviour consistent. +
        diff --git a/core/src/main/resources/hudson/tools/AbstractCommandInstaller/config_sr.properties b/core/src/main/resources/hudson/tools/AbstractCommandInstaller/config_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..de532cad164042ca3914b5615f757736977827b3 --- /dev/null +++ b/core/src/main/resources/hudson/tools/AbstractCommandInstaller/config_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Command=\u041A\u043E\u043C\u0430\u043D\u0434\u0430 +Tool\ Home=\u0413\u043B\u0430\u0432\u043D\u0438 \u043A\u0430\u0442\u0430\u043B\u043E\u0433 \u0430\u043B\u0430\u0442\u0430 diff --git a/core/src/main/resources/hudson/tools/AbstractCommandInstaller/help-command_zh_CN.html b/core/src/main/resources/hudson/tools/AbstractCommandInstaller/help-command_zh_CN.html index c98784a54c59154132a3f9025fca166eca29c9ce..648904897aafeba41d67c4d63c6001f6924a6419 100644 --- a/core/src/main/resources/hudson/tools/AbstractCommandInstaller/help-command_zh_CN.html +++ b/core/src/main/resources/hudson/tools/AbstractCommandInstaller/help-command_zh_CN.html @@ -1,4 +1,4 @@ -
        - 在子节点上使用命令安装工具, - 命令会一直运行,如果工具已经安装了,就要这个命令迅速的运行完成并且没有任何操作. -
        +
        + 在子节点上使用命令安装工具, + 命令会一直运行,如果工具已经安装了,就要这个命令迅速的运行完成并且没有任何操作. +
        diff --git a/core/src/main/resources/hudson/tools/AbstractCommandInstaller/help-toolHome_zh_CN.html b/core/src/main/resources/hudson/tools/AbstractCommandInstaller/help-toolHome_zh_CN.html index 870a2b330d82ea874e2a9cecf6a26e5bb724278c..133842fd340b837a07baf02dd4e74266a2fa4fdd 100644 --- a/core/src/main/resources/hudson/tools/AbstractCommandInstaller/help-toolHome_zh_CN.html +++ b/core/src/main/resources/hudson/tools/AbstractCommandInstaller/help-toolHome_zh_CN.html @@ -1,4 +1,4 @@ -
        - 安装工具的目录. - (如果需要吧工具解压到磁盘上,可能是一个绝对路径.) -
        +
        + 安装工具的目录. + (如果需要吧工具解压到磁盘上,可能是一个绝对路径.) +
        diff --git a/core/src/main/resources/hudson/tools/AbstractCommandInstaller/help_zh_CN.html b/core/src/main/resources/hudson/tools/AbstractCommandInstaller/help_zh_CN.html index c11feb02928847de48e1f5160451e55945586e5b..1815c2a214098114382ada648d8627e352757393 100644 --- a/core/src/main/resources/hudson/tools/AbstractCommandInstaller/help_zh_CN.html +++ b/core/src/main/resources/hudson/tools/AbstractCommandInstaller/help_zh_CN.html @@ -1,21 +1,21 @@ -

        - 运行Shell命令来安装你选择的工具.用Ubunte举例, - 假设Jenkins用户在/etc/sudoers内: -

        -
        sudo apt-get --yes install openjdk-6-jdk
        -

        - (这个例子中指定 /usr/lib/jvm/java-6-openjdk 作为工具安装目录.) -

        -

        - 其它情况的例子,在(x86) Linux下安装JDK6, - 你可以使用DLJ: -

        -
        bin=jdk-6u13-dlj-linux-i586.bin
        -if [ \! -f $bin ]
        -then
        -    wget --no-verbose http://download.java.net/dlj/binaries/$bin
        -    sh $bin --unpack --accept-license
        -fi
        -

        - (这个例子中指定 jdk1.6.0_13 作为安装目录DLJ:.) -

        +

        + 运行Shell命令来安装你选择的工具.用Ubunte举例, + 假设Jenkins用户在/etc/sudoers内: +

        +
        sudo apt-get --yes install openjdk-6-jdk
        +

        + (这个例子中指定 /usr/lib/jvm/java-6-openjdk 作为工具安装目录.) +

        +

        + 其它情况的例子,在(x86) Linux下安装JDK6, + 你可以使用DLJ: +

        +
        bin=jdk-6u13-dlj-linux-i586.bin
        +if [ \! -f $bin ]
        +then
        +    wget --no-verbose http://download.java.net/dlj/binaries/$bin
        +    sh $bin --unpack --accept-license
        +fi
        +

        + (这个例子中指定 jdk1.6.0_13 作为安装目录DLJ:.) +

        diff --git a/core/src/main/resources/hudson/tools/DownloadFromUrlInstaller/config_sr.properties b/core/src/main/resources/hudson/tools/DownloadFromUrlInstaller/config_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..b1e0ab0aa0c5230304c692af0438d41657c31ce7 --- /dev/null +++ b/core/src/main/resources/hudson/tools/DownloadFromUrlInstaller/config_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Version=\u0412\u0435\u0440\u0437\u0438\u0458\u0430 diff --git a/core/src/main/resources/hudson/tools/InstallSourceProperty/config_de.properties b/core/src/main/resources/hudson/tools/InstallSourceProperty/config_de.properties index 1c6dbf61f9a22d64dc6d2d630a994bbd8674471c..2e5b756d0d2c5592eb1ce43fa1fdbae5ed08539c 100644 --- a/core/src/main/resources/hudson/tools/InstallSourceProperty/config_de.properties +++ b/core/src/main/resources/hudson/tools/InstallSourceProperty/config_de.properties @@ -1,24 +1,24 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Simon Wiest -# -# 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. - -Add\ Installer=Installationsverfahren hinzufgen +# The MIT License +# +# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Simon Wiest +# +# 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. + +Add\ Installer=Installationsverfahren hinzufgen Delete\ Installer=Installationsverfahren entfernen \ No newline at end of file diff --git a/core/src/main/resources/hudson/tools/InstallSourceProperty/config_sr.properties b/core/src/main/resources/hudson/tools/InstallSourceProperty/config_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..0e2e34192b93f02e1f9dda2dc40b94e1f35b3b72 --- /dev/null +++ b/core/src/main/resources/hudson/tools/InstallSourceProperty/config_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Delete\ Installer=\u0423\u043A\u043B\u043E\u043D\u0438 \u0438\u043D\u0441\u0442\u0430\u043B\u0430\u0442\u043E\u0440 +Add\ Installer=\u0414\u043E\u0434\u0430\u0458\u0442\u0435 \u0438\u043D\u0441\u0442\u0430\u043B\u0430\u0442\u043E\u0440 diff --git a/core/src/main/resources/hudson/tools/InstallSourceProperty/config_zh_CN.properties b/core/src/main/resources/hudson/tools/InstallSourceProperty/config_zh_CN.properties index b7378656a38f7815a980412e92919418579c6bcc..e349cd159c34d1691bef536ccd4ff54ad82012fc 100644 --- a/core/src/main/resources/hudson/tools/InstallSourceProperty/config_zh_CN.properties +++ b/core/src/main/resources/hudson/tools/InstallSourceProperty/config_zh_CN.properties @@ -1,24 +1,24 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Simon Wiest -# -# 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. - -Add\ Installer=\u65b0\u589e\u5b89\u88c5 +# The MIT License +# +# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Simon Wiest +# +# 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. + +Add\ Installer=\u65b0\u589e\u5b89\u88c5 Delete\ Installer=\u5220\u9664\u5b89\u88c5 \ No newline at end of file diff --git a/core/src/main/resources/hudson/tools/JDKInstaller/DescriptorImpl/credentialOK_sr.properties b/core/src/main/resources/hudson/tools/JDKInstaller/DescriptorImpl/credentialOK_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..fef7da675572e9d473493dd306b3dec4e8d50790 --- /dev/null +++ b/core/src/main/resources/hudson/tools/JDKInstaller/DescriptorImpl/credentialOK_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Credential\ is\ saved=\u0421\u0430\u0447\u0443\u0432\u0430\u043D\u043E \u0458\u0435 \u0430\u043A\u0440\u0435\u0434\u0438\u0442\u0438\u0432\u0430\u0442 +Close=\u0417\u0430\u0432\u0440\u0448\u0438 diff --git a/core/src/main/resources/hudson/tools/JDKInstaller/DescriptorImpl/enterCredential.properties b/core/src/main/resources/hudson/tools/JDKInstaller/DescriptorImpl/enterCredential.properties index 677be849089a933b85725468b8c28fef24d0b2e2..b71d56349f14c94cd79fd93af63cbc8848d1ab52 100644 --- a/core/src/main/resources/hudson/tools/JDKInstaller/DescriptorImpl/enterCredential.properties +++ b/core/src/main/resources/hudson/tools/JDKInstaller/DescriptorImpl/enterCredential.properties @@ -20,4 +20,4 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -description=To access older versions of JDK, you need to have Oracle Account. \ No newline at end of file +description=To access older versions of JDK, you need to have Oracle Account. \ No newline at end of file diff --git a/core/src/main/resources/hudson/tools/JDKInstaller/DescriptorImpl/enterCredential_de.properties b/core/src/main/resources/hudson/tools/JDKInstaller/DescriptorImpl/enterCredential_de.properties index f3146f3e65147ef410f1bf20ea2b31d43ff4b05f..672bfce5c0063883939954a91adc151952e40f31 100644 --- a/core/src/main/resources/hudson/tools/JDKInstaller/DescriptorImpl/enterCredential_de.properties +++ b/core/src/main/resources/hudson/tools/JDKInstaller/DescriptorImpl/enterCredential_de.properties @@ -4,4 +4,4 @@ Enter\ Your\ Oracle\ Account=Bitte Oracle-Account eintragen OK=Ok Password=Passwort Username=Benutzername -description=Um \u00E4ltere Versionen des JDKs zu erlangen, ben\u00F6tigen Sie einen Oracle Account. +description=Um \u00E4ltere Versionen des JDKs zu erlangen, ben\u00F6tigen Sie einen Oracle Account. diff --git a/core/src/main/resources/hudson/tools/JDKInstaller/DescriptorImpl/enterCredential_es.properties b/core/src/main/resources/hudson/tools/JDKInstaller/DescriptorImpl/enterCredential_es.properties index ef8b59b2ce4eba493215ceb9d411b98bec1795ea..7d6223c69f9bb5199dab10f1720526526b73a11d 100644 --- a/core/src/main/resources/hudson/tools/JDKInstaller/DescriptorImpl/enterCredential_es.properties +++ b/core/src/main/resources/hudson/tools/JDKInstaller/DescriptorImpl/enterCredential_es.properties @@ -22,7 +22,7 @@ Password=Contrasea Username=Usuario -# To access older versions of JDK, you need to have Oracle Account. -description=Desafortunadamente Oracle exige que para descargar antiguas versiones del JDK uses una Cuenta de Oracle. +# To access older versions of JDK, you need to have Oracle Account. +description=Desafortunadamente Oracle exige que para descargar antiguas versiones del JDK uses una Cuenta de Oracle. Enter\ Your\ Oracle\ Account=Introduce un usuario y contrasea vlidos OK=Aceptar diff --git a/core/src/main/resources/hudson/tools/JDKInstaller/DescriptorImpl/enterCredential_ja.properties b/core/src/main/resources/hudson/tools/JDKInstaller/DescriptorImpl/enterCredential_ja.properties index a223567c493bdf42e9f4b52907459e5be386e523..219b0f812778a17d2a85ba0c4fc4c316389a74c1 100644 --- a/core/src/main/resources/hudson/tools/JDKInstaller/DescriptorImpl/enterCredential_ja.properties +++ b/core/src/main/resources/hudson/tools/JDKInstaller/DescriptorImpl/enterCredential_ja.properties @@ -24,5 +24,5 @@ Enter\ Your\ Oracle\ Account=Oracle\u30a2\u30ab\u30a6\u30f3\u30c8\u306e\u5165\u5 Username=\u30e6\u30fc\u30b6\u540d Password=\u30d1\u30b9\u30ef\u30fc\u30c9 description=\ - JDK\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3059\u308b\u306b\u306f\u3001Oracle\u306e\u30a2\u30ab\u30a6\u30f3\u30c8\u304c\u5fc5\u8981\u3067\u3059\u3002 + JDK\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3059\u308b\u306b\u306f\u3001Oracle\u306e\u30a2\u30ab\u30a6\u30f3\u30c8\u304c\u5fc5\u8981\u3067\u3059\u3002 OK=OK diff --git a/core/src/main/resources/hudson/tools/JDKInstaller/DescriptorImpl/enterCredential_pt_BR.properties b/core/src/main/resources/hudson/tools/JDKInstaller/DescriptorImpl/enterCredential_pt_BR.properties index b02b3afbb5cda8b5701f6eed13304ba377caa280..92d284a3511d8524e91b5911c48c227e8cd2e342 100644 --- a/core/src/main/resources/hudson/tools/JDKInstaller/DescriptorImpl/enterCredential_pt_BR.properties +++ b/core/src/main/resources/hudson/tools/JDKInstaller/DescriptorImpl/enterCredential_pt_BR.properties @@ -24,5 +24,5 @@ Username=Usu\u00e1rio Password=Senha OK=OK Enter\ Your\ Oracle\ Account=Informe sua conta da Oracle -# To access older versions of JDK, you need to have Oracle Account. -description=Para acessar vers\u00f5es antigas do JDK, voc\u00ea deve possuir uma conta da Oracle. +# To access older versions of JDK, you need to have Oracle Account. +description=Para acessar vers\u00f5es antigas do JDK, voc\u00ea deve possuir uma conta da Oracle. diff --git a/core/src/main/resources/hudson/tools/JDKInstaller/DescriptorImpl/enterCredential_sr.properties b/core/src/main/resources/hudson/tools/JDKInstaller/DescriptorImpl/enterCredential_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..c77ad735c4501ffe448c1e9988b503e216f6add9 --- /dev/null +++ b/core/src/main/resources/hudson/tools/JDKInstaller/DescriptorImpl/enterCredential_sr.properties @@ -0,0 +1,7 @@ +# This file is under the MIT License by authors + +Enter\ Your\ Oracle\ Account=\u0423\u043D\u0435\u0441\u0438\u0442\u0435 \u0432\u0430\u0448 Oracle \u043D\u0430\u043B\u043E\u0433 +description=\u0414\u0430 \u043F\u0440\u0438\u0441\u0442\u0443\u043F\u0438\u0442\u0435 \u0441\u0442\u0430\u0440\u0438\u0458\u0438\u043C \u0432\u0435\u0440\u0437\u0438\u0458\u0430\u043C\u0430 JDK, \u043C\u043E\u0440\u0430\u0442\u0435 \u0438\u043C\u0430\u0442\u0438 Oracle \u043D\u0430\u043B\u043E\u0433. +Username=\u041A\u043E\u0440\u0438\u0441\u043D\u0438\u0447\u043A\u043E \u0438\u043C\u0435 +Password=\u041B\u043E\u0437\u0438\u043D\u043A\u0430 +OK=\u0423\u0440\u0435\u0434\u0443 diff --git a/core/src/main/resources/hudson/tools/JDKInstaller/DescriptorImpl/enterCredential_zh_TW.properties b/core/src/main/resources/hudson/tools/JDKInstaller/DescriptorImpl/enterCredential_zh_TW.properties index 96e6a016e9d9f135fab18a37c4e39004dd767fa3..a3262debbe5edf35fddeda7e5a2c2587d30ab3b3 100644 --- a/core/src/main/resources/hudson/tools/JDKInstaller/DescriptorImpl/enterCredential_zh_TW.properties +++ b/core/src/main/resources/hudson/tools/JDKInstaller/DescriptorImpl/enterCredential_zh_TW.properties @@ -21,7 +21,7 @@ # THE SOFTWARE. Enter\ Your\ Oracle\ Account=\u8f38\u5165\u60a8\u7684 Oracle \u5e33\u865f -description=\u60a8\u8981\u6709 Oracle \u5e33\u865f\u624d\u80fd\u62ff\u5230\u820a\u7248 JDK\u3002 +description=\u60a8\u8981\u6709 Oracle \u5e33\u865f\u624d\u80fd\u62ff\u5230\u820a\u7248 JDK\u3002 Username=\u4f7f\u7528\u8005\u540d\u7a31 Password=\u5bc6\u78bc OK=\u78ba\u5b9a diff --git a/core/src/main/resources/hudson/tools/JDKInstaller/config_sr.properties b/core/src/main/resources/hudson/tools/JDKInstaller/config_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..5d1762543aff2701514aa739d2ab9c6559362fb3 --- /dev/null +++ b/core/src/main/resources/hudson/tools/JDKInstaller/config_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Version=\u0412\u0435\u0440\u0437\u0438\u0458\u0430 +I\ agree\ to\ the\ Java\ SE\ Development\ Kit\ License\ Agreement=\u041F\u0440\u0438\u0441\u0442\u0430\u0458\u0435\u043C \u043D\u0430 \u0443\u0433\u043E\u0432\u043E\u0440 \u043E \u043B\u0438\u0446\u0435\u043D\u0446\u0438 Java SE Development Kit diff --git a/core/src/main/resources/hudson/tools/Messages.properties b/core/src/main/resources/hudson/tools/Messages.properties index dabfa4c840386fb9d626ccd2c72fc3afbdfc03e9..a59e064de78dec0a38f361709807922d7bebcb47 100644 --- a/core/src/main/resources/hudson/tools/Messages.properties +++ b/core/src/main/resources/hudson/tools/Messages.properties @@ -37,3 +37,4 @@ JDKInstaller.DescriptorImpl.displayName=Install from java.sun.com JDKInstaller.DescriptorImpl.doCheckId=Define JDK ID JDKInstaller.DescriptorImpl.doCheckAcceptLicense=You must agree to the license to download the JDK. ToolDescriptor.NotADirectory={0} is not a directory on the Jenkins master (but perhaps it exists on some agents) +CannotBeInstalled=Installer "{0}" cannot be used to install "{1}" on the node "{2}" diff --git a/core/src/main/resources/hudson/tools/Messages_pl.properties b/core/src/main/resources/hudson/tools/Messages_pl.properties new file mode 100644 index 0000000000000000000000000000000000000000..6668add87103bdee77156bdc47acb3760e6962d8 --- /dev/null +++ b/core/src/main/resources/hudson/tools/Messages_pl.properties @@ -0,0 +1,23 @@ +# The MIT License +# +# Copyright (c) 2016, Damian Szczepanik +# +# 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. +# Tool Locations +ToolLocationNodeProperty.displayName=Lokalizacja narz\u0119dzi diff --git a/core/src/main/resources/hudson/tools/Messages_sr.properties b/core/src/main/resources/hudson/tools/Messages_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..4266f9e1801f13cc0a909213e70fc21fbbc4d36e --- /dev/null +++ b/core/src/main/resources/hudson/tools/Messages_sr.properties @@ -0,0 +1,19 @@ +# This file is under the MIT License by authors + +ToolLocationNodeProperty.displayName=\u041B\u043E\u043A\u0430\u0446\u0438\u0458\u0435 \u0430\u043B\u0430\u0442\u0430 +CommandInstaller.DescriptorImpl.displayName=\u0418\u0437\u0432\u0440\u0448\u0438 shell \u043A\u043E\u043C\u0430\u043D\u0434\u0443 +CommandInstaller.no_command=\u041C\u043E\u0440\u0430\u0442\u0435 \u043D\u0430\u0432\u0435\u0441\u0442\u0438 \u043A\u043E\u043C\u0430\u043D\u0434\u0443 \u0437\u0430 \u0438\u0437\u0432\u0440\u0448\u0430\u0432\u0430\u045A\u0435 +CommandInstaller.no_toolHome=\u041C\u043E\u0440\u0430\u0442\u0435 \u043D\u0430\u0432\u0435\u0441\u0442\u0438 \u0433\u043B\u0430\u0432\u043D\u0438 \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0458\u0443\u043C \u0437\u0430 \u0430\u043B\u0430\u0442\u0435. +BatchCommandInstaller.DescriptorImpl.displayName=\u0418\u0437\u0432\u0440\u0448\u0438 batch \u043A\u043E\u043C\u0430\u043D\u0434\u0443 +JDKInstaller.FailedToInstallJDK=\u0418\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u045A\u0435 JDK \u043D\u0438\u0458\u0435 \u0443\u0441\u043F\u0435\u043B\u043E. Exit code={0} +JDKInstaller.RequireOracleAccount=\u0418\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u045A\u0435 JDK-\u0430 \u0437\u0430\u0445\u0442\u0435\u0432\u0430 Oracle \u043D\u0430\u043B\u043E\u0433. \u041C\u043E\u043B\u0438\u043C\u043E \u0443\u043D\u0435\u0441\u0438\u0442\u0435 \u043A\u043E\u0440\u0438\u0438\u0441\u043D\u0438\u0447\u043A\u043E \u0438\u043C\u0435/\u043B\u043E\u0437\u0438\u043D\u043A\u0443 +JDKInstaller.UnableToInstallUntilLicenseAccepted=\u041C\u043E\u0440\u0430\u0442\u0435 \u043F\u0440\u0438\u0445\u0432\u0430\u0442\u0438\u0442\u0438 \u043B\u0438\u0446\u0435\u043D\u0446\u0443 \u0437\u0430 \u0430\u0443\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u043A\u0443 \u0438\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u0443 JDK-\u0430. +ZipExtractionInstaller.DescriptorImpl.displayName=\u0420\u0430\u0441\u043A\u043F\u0430\u043A\u0443\u0458 *.zip/*.tar.gz +ZipExtractionInstaller.malformed_url=\u041D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u043D\u0430 URL \u0430\u0434\u0440\u0435\u0441\u0430. +ZipExtractionInstaller.bad_connection=\u0421\u0435\u0440\u0432\u0435\u0440 \u0458\u0435 \u043E\u0434\u0431\u0438\u043E \u043F\u043E\u0432\u0435\u0437\u0438\u0432\u0430\u045A\u0435. +ZipExtractionInstaller.could_not_connect=\u041D\u0438\u0458\u0435 \u043C\u043E\u0433\u043B\u043E \u0443\u0441\u043F\u043E\u0441\u0442\u0430\u0432\u0438\u0442\u0438 \u0432\u0435\u0437\u0443 \u0441\u0430 URL-\u0430\u0434\u0440\u0435\u0441\u043E\u043C. +InstallSourceProperty.DescriptorImpl.displayName=\u0418\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u0458 \u0430\u0443\u0442\u043E\u043C\u0430\u0442\u0441\u043A\u043E +JDKInstaller.DescriptorImpl.displayName=\u0418\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u0458 \u0441\u0430 \u0430\u0434\u0440\u0435\u0441\u0435 java.sun.com +JDKInstaller.DescriptorImpl.doCheckId=\u041D\u0430\u0432\u0435\u0434\u0438 JDK ID +JDKInstaller.DescriptorImpl.doCheckAcceptLicense=\u041C\u043E\u0440\u0430\u0442\u0435 \u043F\u0440\u0438\u0445\u0432\u0430\u0442\u0438\u0442\u0438 \u043B\u0438\u0446\u0435\u043D\u0446\u0443 \u0434\u0430 \u043F\u0440\u0435\u0443\u0437\u043C\u0435\u0442\u0435 JDK. +ToolDescriptor.NotADirectory={0} \u043D\u0438\u0458\u0435 \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0458\u0443\u043C \u043D\u0430 Jenkins \u043C\u0430\u0448\u0438\u043D\u0438 (\u0430\u043B\u0438 \u043C\u043E\u0433\u0443\u045B\u0435 \u0434\u0430 \u043F\u043E\u0441\u0442\u043E\u0458\u0438 \u043D\u0430 \u043D\u0435\u043A\u0438\u043C \u043E\u0434 \u0430\u0433\u0435\u043D\u0430\u0442\u0430) \ No newline at end of file diff --git a/core/src/main/resources/hudson/tools/Messages_zh_CN.properties b/core/src/main/resources/hudson/tools/Messages_zh_CN.properties index 2bec02c1b1036826d1512ee8b5890374e2d3f6ec..e580a8cdbfdf35bb916a03c7ff0e35dcfd77219f 100644 --- a/core/src/main/resources/hudson/tools/Messages_zh_CN.properties +++ b/core/src/main/resources/hudson/tools/Messages_zh_CN.properties @@ -1,36 +1,36 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Seiji Sogabe -# -# 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. - -ToolLocationNodeProperty.displayName=Tool Locations -CommandInstaller.DescriptorImpl.displayName=\u8fd0\u884c\u547d\u4ee4 -CommandInstaller.no_command=\u5fc5\u987b\u63d0\u4f9b\u4e00\u4e2a\u8fd0\u884c\u547d\u4ee4. -CommandInstaller.no_toolHome=\u5fc5\u987b\u63d0\u4f9b\u4e00\u4e2a\u5de5\u5177\u6839\u76ee\u5f55. -JDKInstaller.FailedToInstallJDK=\u5b89\u88c5JDK\u5931\u8d25. \u9519\u8bef\u4ee3\u7801={0} -JDKInstaller.UnableToInstallUntilLicenseAccepted=\u6ca1\u6709\u63a5\u53d7\u8bb8\u53ef\u4e4b\u524d\u4e0d\u80fd\u591f\u81ea\u52a8\u5b89\u88c5. -ZipExtractionInstaller.DescriptorImpl.displayName=\u89e3\u538b *.zip/*.tar.gz -ZipExtractionInstaller.bad_connection=\u670d\u52a1\u5668\u62d2\u7edd\u94fe\u63a5. -ZipExtractionInstaller.malformed_url=\u9519\u8bef\u7684URL. -ZipExtractionInstaller.could_not_connect=\u4e0d\u80fd\u94fe\u63a5URL. -InstallSourceProperty.DescriptorImpl.displayName=\u81ea\u52a8\u5b89\u88c5 -JDKInstaller.DescriptorImpl.displayName=\u4ece java.sun.com\u5b89\u88c5 -JDKInstaller.DescriptorImpl.doCheckId=\u5b9a\u4e49JDK ID +# The MIT License +# +# Copyright (c) 2004-2009, Sun Microsystems, Inc., Seiji Sogabe +# +# 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. + +ToolLocationNodeProperty.displayName=Tool Locations +CommandInstaller.DescriptorImpl.displayName=\u8fd0\u884c\u547d\u4ee4 +CommandInstaller.no_command=\u5fc5\u987b\u63d0\u4f9b\u4e00\u4e2a\u8fd0\u884c\u547d\u4ee4. +CommandInstaller.no_toolHome=\u5fc5\u987b\u63d0\u4f9b\u4e00\u4e2a\u5de5\u5177\u6839\u76ee\u5f55. +JDKInstaller.FailedToInstallJDK=\u5b89\u88c5JDK\u5931\u8d25. \u9519\u8bef\u4ee3\u7801={0} +JDKInstaller.UnableToInstallUntilLicenseAccepted=\u6ca1\u6709\u63a5\u53d7\u8bb8\u53ef\u4e4b\u524d\u4e0d\u80fd\u591f\u81ea\u52a8\u5b89\u88c5. +ZipExtractionInstaller.DescriptorImpl.displayName=\u89e3\u538b *.zip/*.tar.gz +ZipExtractionInstaller.bad_connection=\u670d\u52a1\u5668\u62d2\u7edd\u94fe\u63a5. +ZipExtractionInstaller.malformed_url=\u9519\u8bef\u7684URL. +ZipExtractionInstaller.could_not_connect=\u4e0d\u80fd\u94fe\u63a5URL. +InstallSourceProperty.DescriptorImpl.displayName=\u81ea\u52a8\u5b89\u88c5 +JDKInstaller.DescriptorImpl.displayName=\u4ece java.sun.com\u5b89\u88c5 +JDKInstaller.DescriptorImpl.doCheckId=\u5b9a\u4e49JDK ID JDKInstaller.DescriptorImpl.doCheckAcceptLicense=\u4f60\u5fc5\u987b\u63a5\u53d7\u8bb8\u53ef\u624d\u80fd\u4e0b\u8f7dJDK. \ No newline at end of file diff --git a/core/src/main/resources/hudson/tools/ToolInstallation/config_sr.properties b/core/src/main/resources/hudson/tools/ToolInstallation/config_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..43f1c62da537908e9df3c48c18f610413f97dee2 --- /dev/null +++ b/core/src/main/resources/hudson/tools/ToolInstallation/config_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Name=\u0418\u043C\u0435 +Installation\ directory=\u0414\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0458\u0443\u043C \u0438\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u0435 diff --git a/core/src/main/resources/hudson/tools/ToolInstallation/global_sr.properties b/core/src/main/resources/hudson/tools/ToolInstallation/global_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..29ed2bdfe933b09d45e961cfc95a619a8eb5813e --- /dev/null +++ b/core/src/main/resources/hudson/tools/ToolInstallation/global_sr.properties @@ -0,0 +1,6 @@ +# This file is under the MIT License by authors + +title={0} \u0438\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u0435 +description=\u0421\u043F\u0438\u0441\u0430\u043A {0} \u0438\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u0430 \u043D\u0430 \u043E\u0432\u043E\u043C \u0441\u0438\u0441\u0442\u0435\u043C\u0443 +label.add=\u0414\u043E\u0434\u0430\u0458 {0} +label.delete=\u0423\u043A\u043B\u043E\u043D\u0438 {0} diff --git a/core/src/main/resources/hudson/tools/ToolLocationNodeProperty/config_sr.properties b/core/src/main/resources/hudson/tools/ToolLocationNodeProperty/config_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..75b78b9087645bed789acb2668c963df21d1dc9d --- /dev/null +++ b/core/src/main/resources/hudson/tools/ToolLocationNodeProperty/config_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +List\ of\ tool\ locations=\u0421\u043F\u0438\u0441\u0430\u043A \u043B\u043E\u043A\u0430\u0446\u0438\u0458\u0435 \u0430\u043B\u0430\u0442\u0430 +Name=\u0418\u043C\u0435 +Home=\u0413\u043B\u0430\u0432\u043D\u0430 \u0441\u0442\u0440\u0430\u043D\u0430 diff --git a/core/src/main/resources/hudson/tools/ZipExtractionInstaller/config_sr.properties b/core/src/main/resources/hudson/tools/ZipExtractionInstaller/config_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..5e571ab0d946787af58e4f3b7035628508e1c46a --- /dev/null +++ b/core/src/main/resources/hudson/tools/ZipExtractionInstaller/config_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Download\ URL\ for\ binary\ archive=URL-\u0430\u0434\u0440\u0435\u0441\u0430 \u0437\u0430 \u043F\u0440\u0435\u0443\u0437\u0438\u043C\u0430\u045A\u0435 \u0430\u0440\u0445\u0438\u0432\u0443 +Subdirectory\ of\ extracted\ archive=\u041F\u043E\u0434\u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0458\u0443\u043C \u0440\u0430\u0441\u043F\u0430\u043A\u043E\u0432\u0430\u043D\u0435 \u0430\u0440\u0445\u0438\u0432\u0435 diff --git a/core/src/main/resources/hudson/tools/ZipExtractionInstaller/help-subdir_zh_CN.html b/core/src/main/resources/hudson/tools/ZipExtractionInstaller/help-subdir_zh_CN.html index 078d18a7e51b843844159b2558cac40f421b56fe..2bd6d150d189bea6d3026a451a0ff3590b3218a1 100644 --- a/core/src/main/resources/hudson/tools/ZipExtractionInstaller/help-subdir_zh_CN.html +++ b/core/src/main/resources/hudson/tools/ZipExtractionInstaller/help-subdir_zh_CN.html @@ -1,3 +1,3 @@ -
        - 可选子目录,用来放置下载文件和解压文件的目录。 -
        +
        + 可选子目录,用来放置下载文件和解压文件的目录。 +
        diff --git a/core/src/main/resources/hudson/tools/ZipExtractionInstaller/help-url_zh_CN.html b/core/src/main/resources/hudson/tools/ZipExtractionInstaller/help-url_zh_CN.html index f7c2dfcbfc582dcdf8d528a6c7566283671fadff..1f1fe1d8c0db170c558237e24f4743da66b41d88 100644 --- a/core/src/main/resources/hudson/tools/ZipExtractionInstaller/help-url_zh_CN.html +++ b/core/src/main/resources/hudson/tools/ZipExtractionInstaller/help-url_zh_CN.html @@ -1,5 +1,5 @@ -
        - 从URL下载的工具包(二进制)应该是一个ZIP文件或者GZip压缩过的TAR文件. - 服务器上的时间戳会比对本地版本(如果有的话),所以你可以轻松的发布升级. - URL必须从Jenkins的主节点访问,但是不需要从子节点访问. -
        +
        + 从URL下载的工具包(二进制)应该是一个ZIP文件或者GZip压缩过的TAR文件. + 服务器上的时间戳会比对本地版本(如果有的话),所以你可以轻松的发布升级. + URL必须从Jenkins的主节点访问,但是不需要从子节点访问. +
        diff --git a/core/src/main/resources/hudson/tools/ZipExtractionInstaller/help_zh_CN.html b/core/src/main/resources/hudson/tools/ZipExtractionInstaller/help_zh_CN.html index 07d98d5b0dc8225c8886d15f3b68f36f879d9e58..a8a451caf2ae0283fd820142f7acf248c82e5902 100644 --- a/core/src/main/resources/hudson/tools/ZipExtractionInstaller/help_zh_CN.html +++ b/core/src/main/resources/hudson/tools/ZipExtractionInstaller/help_zh_CN.html @@ -1,6 +1,6 @@ -
        - 下载工具包并安装在Jenkins下的工作目录中. - 例如:http://apache.promopeddler.com/ant/binaries/apache-ant-1.7.1-bin.zip - (选择离你最近的镜像服务器) - 并指定一个子目录apache-ant-1.7.1. -
        +
        + 下载工具包并安装在Jenkins下的工作目录中. + 例如:http://apache.promopeddler.com/ant/binaries/apache-ant-1.7.1-bin.zip + (选择离你最近的镜像服务器) + 并指定一个子目录apache-ant-1.7.1. +
        diff --git a/core/src/main/resources/hudson/tools/label_sr.properties b/core/src/main/resources/hudson/tools/label_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..33f28373715a29a2ea7637dd0d3f67422d43f7b4 --- /dev/null +++ b/core/src/main/resources/hudson/tools/label_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Label=\u041B\u0430\u0431\u0435\u043B\u0430 diff --git a/core/src/main/resources/hudson/triggers/Messages.properties b/core/src/main/resources/hudson/triggers/Messages.properties index b883be434fbc5c8eef51c597d8dfe9cfd07367ca..3b6e1a42538040d126e45df2caaa1b407f446dce 100644 --- a/core/src/main/resources/hudson/triggers/Messages.properties +++ b/core/src/main/resources/hudson/triggers/Messages.properties @@ -23,10 +23,15 @@ SCMTrigger.DisplayName=Poll SCM SCMTrigger.getDisplayName={0} Polling Log SCMTrigger.BuildAction.DisplayName=Polling Log +SCMTrigger.no_schedules_no_hooks=Post commit hooks are being ignored and no schedules so will never run due to SCM changes +SCMTrigger.no_schedules_hooks=No schedules so will only run due to SCM changes if triggered by a post-commit hook SCMTrigger.SCMTriggerCause.ShortDescription=Started by an SCM change TimerTrigger.DisplayName=Build periodically TimerTrigger.MissingWhitespace=You appear to be missing whitespace between * and *. TimerTrigger.no_schedules_so_will_never_run=No schedules so will never run TimerTrigger.TimerTriggerCause.ShortDescription=Started by timer TimerTrigger.would_last_have_run_at_would_next_run_at=Would last have run at {0}; would next run at {1}. +TimerTrigger.the_specified_cron_tab_is_rare_or_impossible=This schedule will match dates only rarely (e.g. February 29) or \ + never (e.g. June 31), so this job may be triggered very rarely, if at all. Trigger.init=Initializing timer for triggers +SCMTrigger.AdministrativeMonitorImpl.DisplayName=Too Many SCM Polling Threads diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_de.properties b/core/src/main/resources/hudson/triggers/Messages_pl.properties similarity index 54% rename from core/src/main/resources/hudson/views/BuildButtonColumn/column_de.properties rename to core/src/main/resources/hudson/triggers/Messages_pl.properties index a85db0e735d233ef0ad271e77bc90722897db994..68191b91ca6f26464ac4d9133e9c741ab6582fd0 100644 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_de.properties +++ b/core/src/main/resources/hudson/triggers/Messages_pl.properties @@ -1,6 +1,6 @@ # The MIT License # -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Simon Wiest, Martin Eigenbrodt +# Copyright (c) 2016, Damian Szczepanik # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -19,7 +19,14 @@ # 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 geplant -Schedule_a_build=Build planen f\u00FCr {0} -Schedule_a_build_with_parameters=Build mit Parametern planen f\u00FCr {0} +SCMTrigger.DisplayName=Pobierz z repozytorium kodu +SCMTrigger.getDisplayName={0} Rejestr pobrania z repozytorium kodu +SCMTrigger.BuildAction.DisplayName=Rejestr pobrania z repozytorium kodu +SCMTrigger.SCMTriggerCause.ShortDescription=Uruchomione przez zmian\u0119 w repozytorium kodu +TimerTrigger.DisplayName=Buduj cyklicznie +TimerTrigger.MissingWhitespace=Wygl\u0105da, \u017Ce brakuje odst\u0119pu mi\u0119dzy * a *. +TimerTrigger.no_schedules_so_will_never_run=Brak harmonogramu, wi\u0119c nie zostanie nigdy uruchomiony +TimerTrigger.TimerTriggerCause.ShortDescription=Uruchomione przez zegar +TimerTrigger.would_last_have_run_at_would_next_run_at=Ostatnio uruchomione o {0}; kolejne uruchomienie o {1}. +Trigger.init=Inicjalizowanie zegara dla wyzwalaczy +SCMTrigger.AdministrativeMonitorImpl.DisplayName=Zbyt wiele w\u0105tk\u00F3w repozytorium kodu diff --git a/core/src/main/resources/hudson/triggers/Messages_ru.properties b/core/src/main/resources/hudson/triggers/Messages_ru.properties index af16907aa59b9fbd4e4153126ae83517f26694d8..6a9f38a647c482f7f8c6d09cadcd72abe7852ab4 100644 --- a/core/src/main/resources/hudson/triggers/Messages_ru.properties +++ b/core/src/main/resources/hudson/triggers/Messages_ru.properties @@ -1,24 +1,13 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Mike Salnikov -# -# 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. - +SCMTrigger.AdministrativeMonitorImpl.DisplayName=\u0421\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u043e\u0432 \u043e\u043f\u0440\u043e\u0441\u0430 SCM +SCMTrigger.BuildAction.DisplayName=\u041b\u043e\u0433 \u043e\u043f\u0440\u043e\u0441\u0430 SCMTrigger.DisplayName=\u041e\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0442\u044c SCM \u043e\u0431 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u0445 -TimerTrigger.DisplayName=\u0421\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438 \ No newline at end of file +SCMTrigger.SCMTriggerCause.ShortDescription=\u0417\u0430\u043f\u0443\u0449\u0435\u043d \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435\u043c \u0432 SCM +SCMTrigger.getDisplayName=\u041b\u043e\u0433 \u043e\u043f\u0440\u043e\u0441\u0430 {0} + +TimerTrigger.DisplayName=\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438 +TimerTrigger.MissingWhitespace=\u041f\u043e\u0445\u043e\u0436\u0435, \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442 \u043f\u0440\u043e\u0431\u0435\u043b\u0430 \u043c\u0435\u0436\u0434\u0443 * \u0438 *. +TimerTrigger.TimerTriggerCause.ShortDescription=\u0417\u0430\u043f\u0443\u0449\u0435\u043d \u043f\u043e \u0442\u0430\u0439\u043c\u0435\u0440\u0443 +TimerTrigger.no_schedules_so_will_never_run=\u041d\u0435\u0442 \u0437\u0430\u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0437\u0430\u043f\u0443\u0441\u043a\u043e\u0432 +TimerTrigger.would_last_have_run_at_would_next_run_at=\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0437\u0430\u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0437\u0430\u043f\u0443\u0441\u043a: {0}; \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0437\u0430\u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0437\u0430\u043f\u0443\u0441\u043a: {1}. + +Trigger.init=\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u0439\u043c\u0435\u0440\u0430 \u0434\u043b\u044f \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u043e\u0432 diff --git a/core/src/main/resources/hudson/triggers/Messages_sr.properties b/core/src/main/resources/hudson/triggers/Messages_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..bae7a834ffdf1c7e5e670c9fd98fdee0d5d2c8ca --- /dev/null +++ b/core/src/main/resources/hudson/triggers/Messages_sr.properties @@ -0,0 +1,12 @@ +# This file is under the MIT License by authors + +SCMTrigger.DisplayName=\u0410\u043D\u043A\u0435\u0442\u0438\u0440\u0430\u0458 \u0441\u0438\u0441\u0442\u0435\u043C \u0443\u043F\u0440\u0430\u0432\u0459\u0430\u045A\u0435 \u0438\u0437\u0432\u043E\u0440\u043D\u043E\u0433 \u043A\u043E\u0434\u0430 +SCMTrigger.getDisplayName=\u0416\u0443\u0440\u043D\u0430\u043B \u0430\u043D\u043A\u0435\u0442\u0438\u0440\u0430\u045A\u0430 {0} +SCMTrigger.BuildAction.DisplayName=\u0416\u0443\u0440\u043D\u0430\u043B \u0430\u043D\u043A\u0435\u0442\u0438\u0440\u0430\u045A\u0430 +SCMTrigger.SCMTriggerCause.ShortDescription=\u041F\u043E\u043A\u0440\u0435\u043D\u0443\u0442\u043E \u043D\u0430\u043A\u043E\u043D \u043F\u0440\u043E\u043C\u0435\u043D\u0438 \u0443 \u0441\u0438\u0441\u0442\u0435\u043C\u0443 \u0443\u043F\u0440\u0430\u0432\u0459\u0430\u045A\u0435 \u0438\u0437\u0431\u043E\u0440\u043D\u043E\u0433 \u043A\u043E\u0434\u0430 +TimerTrigger.DisplayName=\u041F\u0435\u0440\u0438\u043E\u0434\u0438\u0447\u043D\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 +TimerTrigger.MissingWhitespace=\u0418\u043C\u0430 \u043F\u0440\u0430\u0437\u043D\u043E\u0433 \u043C\u0435\u0441\u0442\u0430 \u0438\u0437\u043C\u0435\u0452\u0443 * \u0437\u043D\u0430\u043A\u043E\u0432\u0430. +TimerTrigger.no_schedules_so_will_never_run=\u041D\u0435\u043C\u0430 \u0440\u0430\u0441\u043F\u043E\u0440\u0435\u0434\u0430, \u043D\u0435\u045B\u0435 \u0441\u0435 \u043D\u0438\u0448\u0442\u0430 \u0438\u0437\u0432\u0440\u0448\u0438\u0442\u0438 +TimerTrigger.TimerTriggerCause.ShortDescription=\u041F\u043E\u0447\u0435\u0442\u043E \u0448\u0442\u043E\u043F\u0435\u0440\u0438\u0446\u043E\u043C +TimerTrigger.would_last_have_run_at_would_next_run_at=\u041F\u0440\u0435\u0442\u0445\u043E\u0434\u043D\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 \u0431\u0438 \u0431\u0438\u043B\u0430 {0}. \u0421\u043B\u0435\u0434\u0435\u045B\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 \u0431\u0438 \u0441\u043B\u0435\u0434\u0435\u043B\u043E {1}. +Trigger.init=\u0421\u0442\u0430\u0440\u0442\u043E\u0432\u0430\u045A\u0435 \u0448\u0442\u043E\u043F\u0435\u0440\u0438\u0446\u0435 \ No newline at end of file diff --git a/core/src/main/resources/hudson/triggers/SCMTrigger/AdministrativeMonitorImpl/message.jelly b/core/src/main/resources/hudson/triggers/SCMTrigger/AdministrativeMonitorImpl/message.jelly index 462f3cd455f0289025c30a401d88fb887c8738df..cb63cf539b7266dcfa06427983ee5edad642e3b1 100644 --- a/core/src/main/resources/hudson/triggers/SCMTrigger/AdministrativeMonitorImpl/message.jelly +++ b/core/src/main/resources/hudson/triggers/SCMTrigger/AdministrativeMonitorImpl/message.jelly @@ -24,5 +24,5 @@ THE SOFTWARE.
        - ${%blurb} + ${%blurb(rootURL)}
        \ No newline at end of file diff --git a/core/src/main/resources/hudson/triggers/SCMTrigger/AdministrativeMonitorImpl/message.properties b/core/src/main/resources/hudson/triggers/SCMTrigger/AdministrativeMonitorImpl/message.properties index a92bb1b0f1632f34bec134e6bc5067a50d9a72e2..408f1cfe1e6751da3b812a16b37eeab1f987dc58 100644 --- a/core/src/main/resources/hudson/triggers/SCMTrigger/AdministrativeMonitorImpl/message.properties +++ b/core/src/main/resources/hudson/triggers/SCMTrigger/AdministrativeMonitorImpl/message.properties @@ -22,5 +22,5 @@ blurb=There are more SCM polling activities scheduled than handled, so \ the threads are not keeping up with the demands. \ - Check if your polling is \ + Check if your polling is \ hanging, and/or increase the number of threads if necessary. diff --git a/core/src/main/resources/hudson/triggers/SCMTrigger/AdministrativeMonitorImpl/message_de.properties b/core/src/main/resources/hudson/triggers/SCMTrigger/AdministrativeMonitorImpl/message_de.properties index 6b641227dc4156b4fb33d90336aa57bcae09d534..cce915419e9e6ebaf3d832b41254ee647590fbb8 100644 --- a/core/src/main/resources/hudson/triggers/SCMTrigger/AdministrativeMonitorImpl/message_de.properties +++ b/core/src/main/resources/hudson/triggers/SCMTrigger/AdministrativeMonitorImpl/message_de.properties @@ -1,5 +1,5 @@ blurb=\ Es sind mehr SCM-Abfragen geplant als bearbeitet werden knnen. \ - berprfen Sie, ob \ + berprfen Sie, ob \ SCM-Abfragen hngengeblieben sind, und/oder erhhen Sie gegebenenfalls die \ Anzahl an Threads.. diff --git a/core/src/main/resources/hudson/triggers/SCMTrigger/AdministrativeMonitorImpl/message_es.properties b/core/src/main/resources/hudson/triggers/SCMTrigger/AdministrativeMonitorImpl/message_es.properties index 50d4bf0a9db847dd1b7885cd7b71e0d7cd825ccb..4d1985ea751d30f110644653c1a655233978f841 100644 --- a/core/src/main/resources/hudson/triggers/SCMTrigger/AdministrativeMonitorImpl/message_es.properties +++ b/core/src/main/resources/hudson/triggers/SCMTrigger/AdministrativeMonitorImpl/message_es.properties @@ -22,7 +22,7 @@ blurb=Hay ms peticiones sobre los repositorios en la cola, que en proceso, \ esto puede significar que el numero de hilos (threads) no sea suficiente para la demanda exigida. \ - Comprueba que la cola de peticiones no est \ + Comprueba que la cola de peticiones no est \ colgada, y/o aumenta el numero de hilos (threads) si fuera necesario. diff --git a/core/src/main/resources/hudson/triggers/SCMTrigger/AdministrativeMonitorImpl/message_ja.properties b/core/src/main/resources/hudson/triggers/SCMTrigger/AdministrativeMonitorImpl/message_ja.properties index 1c25dfc04d0d56233767660902a4013124cbcc74..3dd9681894784afab5f2e8fa052e8daa4654e85f 100644 --- a/core/src/main/resources/hudson/triggers/SCMTrigger/AdministrativeMonitorImpl/message_ja.properties +++ b/core/src/main/resources/hudson/triggers/SCMTrigger/AdministrativeMonitorImpl/message_ja.properties @@ -22,4 +22,4 @@ blurb=\ SCM\u306e\u30dd\u30fc\u30ea\u30f3\u30b0\u304c\u51e6\u7406\u3067\u304d\u308b\u80fd\u529b\u4ee5\u4e0a\u306b\u30b9\u30b1\u30b8\u30e5\u30fc\u30eb\u3055\u308c\u3066\u3044\u308b\u305f\u3081\u3001\u30b9\u30ec\u30c3\u30c9\u304c\u8981\u6c42\u306b\u5bfe\u5fdc\u3067\u304d\u3066\u3044\u307e\u305b\u3093\u3002 \ - \u30dd\u30fc\u30ea\u30f3\u30b0\u304c\u30cf\u30f3\u30b0\u30a2\u30c3\u30d7\u3057\u3066\u3044\u306a\u3044\u304b\u78ba\u8a8d\u3057\u3066\u3001\u5fc5\u8981\u3067\u3042\u308c\u3070\u30b9\u30ec\u30c3\u30c9\u6570\u3092\u5897\u3084\u3057\u3066\u304f\u3060\u3055\u3044\u3002. + \u30dd\u30fc\u30ea\u30f3\u30b0\u304c\u30cf\u30f3\u30b0\u30a2\u30c3\u30d7\u3057\u3066\u3044\u306a\u3044\u304b\u78ba\u8a8d\u3057\u3066\u3001\u5fc5\u8981\u3067\u3042\u308c\u3070\u30b9\u30ec\u30c3\u30c9\u6570\u3092\u5897\u3084\u3057\u3066\u304f\u3060\u3055\u3044\u3002. diff --git a/core/src/main/resources/hudson/triggers/SCMTrigger/AdministrativeMonitorImpl/message_pt_BR.properties b/core/src/main/resources/hudson/triggers/SCMTrigger/AdministrativeMonitorImpl/message_pt_BR.properties index fc3eddddecaa50f50a8351dffc2816f4ba54cbc5..abfbedfc5ade65015b806d8872b39d8af0d0de8b 100644 --- a/core/src/main/resources/hudson/triggers/SCMTrigger/AdministrativeMonitorImpl/message_pt_BR.properties +++ b/core/src/main/resources/hudson/triggers/SCMTrigger/AdministrativeMonitorImpl/message_pt_BR.properties @@ -24,5 +24,5 @@ # the threads are not keeping up with the demands. \ # Check if your polling is \ # hanging, and/or increase the number of threads if necessary. -blurb=Existem mais atividades de verifica\u00E7\u00E3o de SCM agendadas do que gerenciadas, por isso as threads n\u00E3o est\u00E3o acompanhando as demandas. Verifique se as verifica\u00E7\u00F5es est\u00E3o pendentes e aumente o n\u00FAmero de threads se necess\u00E1rio. +blurb=Existem mais atividades de verifica\u00E7\u00E3o de SCM agendadas do que gerenciadas, por isso as threads n\u00E3o est\u00E3o acompanhando as demandas. Verifique se as verifica\u00E7\u00F5es est\u00E3o pendentes e aumente o n\u00FAmero de threads se necess\u00E1rio. diff --git a/core/src/main/resources/hudson/triggers/SCMTrigger/AdministrativeMonitorImpl/message_sr.properties b/core/src/main/resources/hudson/triggers/SCMTrigger/AdministrativeMonitorImpl/message_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..8f04dad6a131ac1d3f0e5c2eb1141aa7cc61d7e4 --- /dev/null +++ b/core/src/main/resources/hudson/triggers/SCMTrigger/AdministrativeMonitorImpl/message_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +blurb=\u041D\u0435\u043C\u0430 \u0434\u043E\u0432\u043E\u0459\u043D\u043E \u043D\u0438\u0442\u043E\u0432\u0430 \u0437\u0430 \u0442\u0440\u0435\u043D\u0443\u0442\u043D\u0438 \u0431\u0440\u043E\u0458 \u0430\u043D\u043A\u0435\u0442\u0438\u0440\u0430\u045A\u0430 \u0441\u0438\u0441\u0442\u0435\u043C\u0430 \u0437\u0430 \u0443\u043F\u0440\u0430\u0432\u0459\u0430\u045A\u0435 \u0438\u0437\u0432\u043E\u0440\u043D\u043E\u0433 \u043A\u043E\u0434\u0430.\u041F\u0440\u043E\u0432\u0435\u0440\u0438\u0442\u0435 \u0434\u0430 \u0430\u043D\u043A\u0435\u0442\u0438\u0440\u0430\u045A\u0435 \u043D\u0438\u0458\u0435 \u0438\u0437\u0432\u0438\u0441\u0438\u043B\u043E, \u0438 \u043F\u043E\u0432\u0435\u045B\u0430\u0458\u0442\u0435 \u0432\u0440\u043E\u0458 \u043D\u0438\u0442\u043E\u0432\u0430 \u0430\u043A\u043E \u0458\u0435 \u043F\u043E\u0442\u0440\u0435\u0431\u043D\u043E. diff --git a/core/src/main/resources/hudson/triggers/SCMTrigger/AdministrativeMonitorImpl/message_zh_TW.properties b/core/src/main/resources/hudson/triggers/SCMTrigger/AdministrativeMonitorImpl/message_zh_TW.properties index 246bc3fbfeaea0fcea41e3cae1d8189d9a9f195a..a94992b95a64343ecff739399d99dcc42bad9ffb 100644 --- a/core/src/main/resources/hudson/triggers/SCMTrigger/AdministrativeMonitorImpl/message_zh_TW.properties +++ b/core/src/main/resources/hudson/triggers/SCMTrigger/AdministrativeMonitorImpl/message_zh_TW.properties @@ -21,5 +21,5 @@ # THE SOFTWARE. blurb=\u6392\u5b9a\u7684 SCM \u8f2a\u8a62\u6d3b\u52d5\u6bd4\u88ab\u8655\u7406\u7684\u9084\u8981\u591a\uff0cThread \u6578\u91cf\u8ddf\u4e0d\u4e0a\u9700\u6c42\u91cf\u3002\ - \ + \ \u6aa2\u67e5\u60a8\u7684\u8f2a\u8a62\u4f5c\u696d\u662f\u4e0d\u662f\u5361\u4f4f\u4e86\uff0c\u6216\u8996\u60c5\u6cc1\u589e\u52a0 Thread \u6578\u76ee\u3002 diff --git a/core/src/main/resources/hudson/triggers/SCMTrigger/BuildAction/index_sr.properties b/core/src/main/resources/hudson/triggers/SCMTrigger/BuildAction/index_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..f43b5d6be0c928f22a475c8c55944778269a1fd5 --- /dev/null +++ b/core/src/main/resources/hudson/triggers/SCMTrigger/BuildAction/index_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +Polling\ Log=\u0416\u0443\u0440\u043D\u0430\u043B \u0430\u043D\u043A\u0435\u0442\u0438\u0440\u0430\u045A\u0430 +View\ as\ plain\ text=\u041F\u0440\u0435\u0433\u043B\u0435\u0434\u0430\u0458 \u043A\u0430\u043E \u043E\u0431\u0438\u0447\u0430\u043D \u0442\u0435\u043A\u0441\u0442 +blurb=\u041D\u0430 \u043E\u0432\u043E\u0458 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0438 \u0441\u0435 \u043D\u0430\u043B\u0430\u0436\u0438 \u0436\u0443\u0440\u043D\u0430\u043B \u0430\u043D\u043A\u0435\u0442\u0438\u0440\u0430\u045A\u0430 \u043A\u043E\u0458\u0438 \u0458\u0435 \u0438\u0437\u0430\u0437\u0432\u0430\u043E \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0443. diff --git a/core/src/main/resources/hudson/triggers/SCMTrigger/DescriptorImpl/index_sr.properties b/core/src/main/resources/hudson/triggers/SCMTrigger/DescriptorImpl/index_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..2e80cfed42c3f455444ec0ef29e09c2ac01647e6 --- /dev/null +++ b/core/src/main/resources/hudson/triggers/SCMTrigger/DescriptorImpl/index_sr.properties @@ -0,0 +1,8 @@ +# This file is under the MIT License by authors + +Current\ SCM\ Polling\ Activities=\u0422\u0440\u0435\u043D\u0443\u0442\u043D\u043E \u0430\u043D\u043A\u0435\u0442\u0438\u0440\u0430\u045A\u0435 \u0441\u0438\u0441\u0442\u0435\u043C\u0430 \u0443\u043F\u0440\u0430\u0432\u0459\u0430\u045A\u0435 \u0438\u0437\u0432\u043E\u0440\u043D\u043E\u0433 \u043A\u043E\u0434\u0430 +clogged= +No\ polling\ activity\ is\ in\ progress.=\u041D\u0435\u043C\u0430 \u0442\u0435\u043A\u0443\u045B\u0435\u0433 \u0430\u043D\u043A\u0435\u0442\u0438\u0440\u0430\u045A\u0430. +The\ following\ polling\ activities\ are\ currently\ in\ progress\:=\u0422\u0440\u0435\u043D\u0443\u0442\u043D\u043E \u0430\u043D\u043A\u0435\u0442\u0438\u0440\u0430\u045A\u0435: +Project=\u041F\u0440\u043E\u0458\u0435\u043A\u0430\u0442 +Running\ for=\u0423 \u0442\u043E\u043A\u0443 \u043E\u0434 diff --git a/core/src/main/resources/hudson/triggers/SCMTrigger/SCMAction/index_sr.properties b/core/src/main/resources/hudson/triggers/SCMTrigger/SCMAction/index_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..200fb78789e5e90cfc19ccb4e3d5ac428d87c43e --- /dev/null +++ b/core/src/main/resources/hudson/triggers/SCMTrigger/SCMAction/index_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +title={0} +Polling\ has\ not\ run\ yet.=\u0410\u043D\u043A\u0435\u0442\u0438\u0440\u0430\u045A\u0435 \u043D\u0438\u0458\u0435 \u0458\u043E\u0448 \u0438\u0437\u0432\u0435\u0434\u0435\u043D\u043E diff --git a/core/src/main/resources/hudson/triggers/SCMTrigger/config.jelly b/core/src/main/resources/hudson/triggers/SCMTrigger/config.jelly index d9d8f944427587ef8527a7a0f61c2a9688a7c062..5eeba93429e3331b950d85ede036ca41214a6ab4 100644 --- a/core/src/main/resources/hudson/triggers/SCMTrigger/config.jelly +++ b/core/src/main/resources/hudson/triggers/SCMTrigger/config.jelly @@ -25,7 +25,7 @@ THE SOFTWARE. - + diff --git a/core/src/main/resources/lib/form/apply_ja.properties b/core/src/main/resources/hudson/triggers/SCMTrigger/config_pl.properties similarity index 94% rename from core/src/main/resources/lib/form/apply_ja.properties rename to core/src/main/resources/hudson/triggers/SCMTrigger/config_pl.properties index 5ff38bec76e47dfe7955aa2d4e7b2aa8b0c2fd94..ce553b93e066d2a952de71fc09c55453699d7e82 100644 --- a/core/src/main/resources/lib/form/apply_ja.properties +++ b/core/src/main/resources/hudson/triggers/SCMTrigger/config_pl.properties @@ -1,6 +1,6 @@ # The MIT License # -# Copyright (c) 2012, Kohsuke Kawaguchi, +# Copyright (c) 2016, Damian Szczepanik # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -19,6 +19,4 @@ # 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. - -Apply=\u9069\u7528 - +Schedule=Harmonogram diff --git a/core/src/main/resources/hudson/triggers/SCMTrigger/config_sr.properties b/core/src/main/resources/hudson/triggers/SCMTrigger/config_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..197650f6bc511431da3cd74a5a0e53266f07ab0c --- /dev/null +++ b/core/src/main/resources/hudson/triggers/SCMTrigger/config_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Schedule=\u0420\u0430\u0441\u043F\u043E\u0440\u0435\u0434 +Ignore\ post-commit\ hooks=\u0418\u0437\u0433\u043D\u043E\u0440\u0438\u0448\u0438 \u043F\u043E\u0441\u043B\u0435 \u043A\u043E\u043C\u0438\u0442\u043D\u0435 hook-\u043E\u0432\u0435 diff --git a/core/src/main/resources/hudson/triggers/SCMTrigger/global_sr.properties b/core/src/main/resources/hudson/triggers/SCMTrigger/global_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..bf10b5aeb8f6e1b313b994c113658a1cd47b0651 --- /dev/null +++ b/core/src/main/resources/hudson/triggers/SCMTrigger/global_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +SCM\ Polling=\u0410\u043D\u043A\u0435\u0442\u0438\u0440\u0430\u045A\u0435 \u0441\u0438\u0441\u0442\u0435\u043C\u0430 \u0443\u043F\u0440\u0430\u0432\u0459\u0430\u045A\u0435 \u0438\u0437\u0432\u043E\u0440\u043D\u043E\u0433 \u043A\u043E\u0434\u0430 +Max\ #\ of\ concurrent\ polling=\u041C\u0430\u043A\u0441. \u0431\u0440\u043E\u0458 \u043F\u0430\u0440\u0430\u043B\u0435\u043B\u043D\u043E\u0433 \u0430\u043D\u043A\u0435\u0442\u0438\u0440\u0430\u045A\u0430 diff --git a/core/src/main/resources/hudson/triggers/SCMTrigger/help.html b/core/src/main/resources/hudson/triggers/SCMTrigger/help.html index bc1da6300c4f5c9be917a73a2cff23b72736803a..f4243eb26fbcd7d5d3bcfb3ad860a6c9f447f6e5 100644 --- a/core/src/main/resources/hudson/triggers/SCMTrigger/help.html +++ b/core/src/main/resources/hudson/triggers/SCMTrigger/help.html @@ -5,5 +5,5 @@ Note that this is going to be an expensive operation for CVS, as every polling requires Jenkins to scan the entire workspace and verify it with the server. Consider setting up a "push" trigger to avoid this overhead, as described in - this document + this document diff --git a/core/src/main/resources/hudson/triggers/SCMTrigger/help_de.html b/core/src/main/resources/hudson/triggers/SCMTrigger/help_de.html index 60ec679775b8e75223bfe71ab19f769f334233f7..ec159cbc7a9d963ff7580266175c1abdea60203d 100644 --- a/core/src/main/resources/hudson/triggers/SCMTrigger/help_de.html +++ b/core/src/main/resources/hudson/triggers/SCMTrigger/help_de.html @@ -7,6 +7,6 @@ ressourcenintensive Operation darstellt, da Jenkins bei jeder Abfrage den kompletten Arbeitsbereich überprüfen und mit dem CVS-Server abgleichen muss. Ziehen Sie daher alternativ einen "Push"-Auslöser in Betracht, wie er in - diesem Dokument beschrieben + diesem Dokument beschrieben wird. diff --git a/core/src/main/resources/hudson/triggers/SCMTrigger/help_fr.html b/core/src/main/resources/hudson/triggers/SCMTrigger/help_fr.html index e8a9b9c1d2d031d277b1590f84bc7c412575beb0..0804b0992ec91514430669822967d013568feacd 100644 --- a/core/src/main/resources/hudson/triggers/SCMTrigger/help_fr.html +++ b/core/src/main/resources/hudson/triggers/SCMTrigger/help_fr.html @@ -3,10 +3,10 @@ version.

        - Notez que cette opération est consommatrice de ressources pour CVS, + Notez que cette opération est consommatrice de ressources pour le SCM, car chaque scrutation signifie que Jenkins va scanner l'ensemble du workspace et le comparer avec le serveur. Envisagez d'utiliser un trigger de type 'push' pour éviter cette surcharge, comme décrit dans - ce document. + ce document. diff --git a/core/src/main/resources/hudson/triggers/SCMTrigger/help_ja.html b/core/src/main/resources/hudson/triggers/SCMTrigger/help_ja.html index 4be674d0a0bee2243d1ae5ca31f24c418cf92ac2..6e94ae93ca9931c9def95731a33b35621d782155 100644 --- a/core/src/main/resources/hudson/triggers/SCMTrigger/help_ja.html +++ b/core/src/main/resources/hudson/triggers/SCMTrigger/help_ja.html @@ -5,6 +5,6 @@ ポーリング毎に、Jenkinsはワークスペースをスキャンしてサーバーと検証する必要があるので、 CVSにとって負荷の高い操作ということに注意してください。 このオーバーヘッドを避けるために、 - このドキュメントにあるように、 + このドキュメントにあるように、 "push"トリガーの設定を検討してください。 diff --git a/core/src/main/resources/hudson/triggers/SCMTrigger/help_pt_BR.html b/core/src/main/resources/hudson/triggers/SCMTrigger/help_pt_BR.html index ffbfbca42fdcdd75fd9daa2588cce257e84315b4..9de5639081ada3ba4575da190cacacf42b6dc0dc 100644 --- a/core/src/main/resources/hudson/triggers/SCMTrigger/help_pt_BR.html +++ b/core/src/main/resources/hudson/triggers/SCMTrigger/help_pt_BR.html @@ -5,5 +5,5 @@ Note que isto vai ser uma operação custosa para o CVS, como toda consulta requer que o Jenkins examine o workspace inteiro e verifique-o com o servidor. Considere configurar um disparador de construção periódico ("Construir periodicamente") para evitar esta sobrecarga, como descrito - nesta documentação + nesta documentação diff --git a/core/src/main/resources/hudson/triggers/SCMTrigger/help_ru.html b/core/src/main/resources/hudson/triggers/SCMTrigger/help_ru.html index 9b3a4a550f634c711f48bcd82d90c5f4d0ac2592..459ed73f0c0bbca156cfdce36d4a8ae7db046d24 100644 --- a/core/src/main/resources/hudson/triggers/SCMTrigger/help_ru.html +++ b/core/src/main/resources/hudson/triggers/SCMTrigger/help_ru.html @@ -6,5 +6,5 @@ на SCM, так как каждый опрос представляет собой сканирование сборочной директории и сверка содержимого с данными на сервере. Лучшим вариантом будет настройка вашей SCM на инициацию сборки при внесении в неё изменений, как описано - в этом документе. + в этом документе. diff --git a/core/src/main/resources/hudson/triggers/SCMTrigger/help_tr.html b/core/src/main/resources/hudson/triggers/SCMTrigger/help_tr.html index a03b8733d05e66e2b84090032fc3cd248e0236a9..f2fb31adf406552863bb196da60832ffb92ce8ea 100644 --- a/core/src/main/resources/hudson/triggers/SCMTrigger/help_tr.html +++ b/core/src/main/resources/hudson/triggers/SCMTrigger/help_tr.html @@ -4,6 +4,6 @@

        Unutmayın, bu işlem CVS için biraz yüklü olacaktır, çünkü her kontrolde Jenkins tüm çalışma alanını tarayacak ve bunu CVS sunucusu ile karşılaştıracaktır. - Bunun yerine bu dokümanda anlatıldığı gibi + Bunun yerine bu dokümanda anlatıldığı gibi "push" tetikleyicisini ayarlayın. diff --git a/core/src/main/resources/hudson/triggers/SCMTrigger/help_zh_TW.html b/core/src/main/resources/hudson/triggers/SCMTrigger/help_zh_TW.html index ea6c91cd2d436184cd9771396972cbdcd7e68868..75edc639e210260950592fae3185a756455d6812 100644 --- a/core/src/main/resources/hudson/triggers/SCMTrigger/help_zh_TW.html +++ b/core/src/main/resources/hudson/triggers/SCMTrigger/help_zh_TW.html @@ -3,6 +3,6 @@

        請注意,這對 CVS 而言代價很高,每次輪詢 Jenkins 都要掃描整個工作區,並與伺服器比對。 - 建議參考這份文件設定 + 建議參考這份文件設定 "push" 觸發程序,避免額外負擔。 diff --git a/core/src/main/resources/hudson/views/JobColumn/columnHeader_pl.properties b/core/src/main/resources/hudson/triggers/TimerTrigger/config_pl.properties similarity index 94% rename from core/src/main/resources/hudson/views/JobColumn/columnHeader_pl.properties rename to core/src/main/resources/hudson/triggers/TimerTrigger/config_pl.properties index 77f02c61ead12390af15905876aef653ba8e527d..ce553b93e066d2a952de71fc09c55453699d7e82 100644 --- a/core/src/main/resources/hudson/views/JobColumn/columnHeader_pl.properties +++ b/core/src/main/resources/hudson/triggers/TimerTrigger/config_pl.properties @@ -1,6 +1,6 @@ # The MIT License # -# Copyright (c) 2004-2010, Sun Microsystems, Inc. +# Copyright (c) 2016, Damian Szczepanik # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -19,5 +19,4 @@ # 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. - -Job=Zadanie +Schedule=Harmonogram diff --git a/core/src/main/resources/hudson/triggers/TimerTrigger/config_sr.properties b/core/src/main/resources/hudson/triggers/TimerTrigger/config_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..04f58629e45cdf8407174d4a27da32c5ff2e0ec1 --- /dev/null +++ b/core/src/main/resources/hudson/triggers/TimerTrigger/config_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Schedule=\u0420\u0430\u0441\u043F\u043E\u0440\u0435\u0434 diff --git a/core/src/main/resources/hudson/triggers/TimerTrigger/help.html b/core/src/main/resources/hudson/triggers/TimerTrigger/help.html index 2317422c3105686803f0741782071291f5113687..2cfdb20b5c4480dbf0d70e0e30cbe9d9d9cc0c11 100644 --- a/core/src/main/resources/hudson/triggers/TimerTrigger/help.html +++ b/core/src/main/resources/hudson/triggers/TimerTrigger/help.html @@ -11,7 +11,7 @@ this feature. However, the point of continuous integration is to start a build as soon as a change is made, to provide a quick feedback to the change. To do that you need to - hook up SCM change notification to Jenkins. + hook up SCM change notification to Jenkins.

        So, before using this feature, stop and ask yourself if this is really what you want. diff --git a/core/src/main/resources/hudson/triggers/TimerTrigger/help_de.html b/core/src/main/resources/hudson/triggers/TimerTrigger/help_de.html index 24e6c7f2335182a81c356e321610139f384a4181..446b3928a27a6a20a41afc9bee3f2faafef89cb2 100644 --- a/core/src/main/resources/hudson/triggers/TimerTrigger/help_de.html +++ b/core/src/main/resources/hudson/triggers/TimerTrigger/help_de.html @@ -12,7 +12,7 @@ kontinuierlichen Integration liegt jedoch darin, einen neuen Build zu starten, sobald eine Änderung im Code vorgenommen wurde, um möglichst schnell eine Rückmeldung zu bekommen. Dazu müssen sie eine - Änderungsabfrage (SCM change + Änderungsabfrage (SCM change notification) in Jenkins einrichten.

        diff --git a/core/src/main/resources/hudson/triggers/TimerTrigger/help_fr.html b/core/src/main/resources/hudson/triggers/TimerTrigger/help_fr.html index 79a3de804ca3b620335b5dc02db53ca62ffb8ed7..80ae28b35cffbd121832c8283b7d805956ca4708 100644 --- a/core/src/main/resources/hudson/triggers/TimerTrigger/help_fr.html +++ b/core/src/main/resources/hudson/triggers/TimerTrigger/help_fr.html @@ -4,18 +4,18 @@ afin d'exécuter le projet périodiquement.

        - Cette fonction est prévue principalement pour utiliser Jenkins comme un + Cette fonction est prévue principalement pour utiliser Jenkins en remplacement de cron. Elle n'est pas faite pour la construction continue de projets logiciel. Quand quelqu'un débute avec l'intégration continue, il est souvent tellement habitué à l'idée d'un lancement de build toutes les nuits ou toutes les semaines, qu'il préfère utiliser cette fonctionnalité. - Néanmoins, l'intérêt de l'intégration continue est de lancer une build à + Néanmoins, l'intérêt de l'intégration continue est de lancer un build à chaque changement dans la base de code, afin de donner un retour rapide sur ce changement. Pour cela, vous devez - associer la notification des changements de l'outil de gestion de version à Jenkins.. + associer la notification des changements de l'outil de gestion de version à Jenkins..

        Donc, avant d'utiliser cette fonctionnalité, demandez-vous si c'est bien diff --git a/core/src/main/resources/hudson/triggers/TimerTrigger/help_ja.html b/core/src/main/resources/hudson/triggers/TimerTrigger/help_ja.html index f5f5393cff068af81e08c9468e40306940455c83..a11c40031bb7d4b04c794feffecb85652085fc97 100644 --- a/core/src/main/resources/hudson/triggers/TimerTrigger/help_ja.html +++ b/core/src/main/resources/hudson/triggers/TimerTrigger/help_ja.html @@ -10,7 +10,7 @@ この機能を使用します。しかしながら、継続的インテグレーションのポイントは、 変更したらすぐにビルドを開始し、変更へのフィードバックをすばやくすることです。 そうするには、 - SCMの変更通知をJenkinsに中継する必要があります。 + SCMの変更通知をJenkinsに中継する必要があります。

        上記の通り、この機能を使用する前に、この機能が本当にあなたが必要とするものなのか、 diff --git a/core/src/main/resources/hudson/triggers/TimerTrigger/help_pt_BR.html b/core/src/main/resources/hudson/triggers/TimerTrigger/help_pt_BR.html index b83f673b38e8d7b96f241099f50b1afdde8700c6..9c8cc68dba74abc4f624c411840b5f5292897421 100644 --- a/core/src/main/resources/hudson/triggers/TimerTrigger/help_pt_BR.html +++ b/core/src/main/resources/hudson/triggers/TimerTrigger/help_pt_BR.html @@ -11,7 +11,7 @@ usam esta funcionalidade. Porém, o ponto principal da integração contínua é iniciar uma construção tão logo uma mudança seja feita, para fornecer um feedback rápido sobre a mudança. Para fazer isto você precisa - ligar a notificação de mudança do SCM ao Jenkins.. + ligar a notificação de mudança do SCM ao Jenkins..

        Assim, antes de usar esta funcionalidade, pare e pergunte a si mesmo se isto é o que realmente você quer. diff --git a/core/src/main/resources/hudson/triggers/TimerTrigger/help_ru.html b/core/src/main/resources/hudson/triggers/TimerTrigger/help_ru.html index 91c0eb2289fd22be79ade92beb9036ddbbb1c8ba..28e0eece9b8f2e603ab6b62237e2878c8ee892f4 100644 --- a/core/src/main/resources/hudson/triggers/TimerTrigger/help_ru.html +++ b/core/src/main/resources/hudson/triggers/TimerTrigger/help_ru.html @@ -14,7 +14,7 @@ ࠧࠡ��稪��. �⮡� ��������� Jenkins �뫮 ������ ⠪��, ����ன� - �����饭�� �� ��஭� SCM. + �����饭�� �� ��஭� SCM.

        ��������, ��। ⥬ ��� �ᯮ�짮���� ��� �㭪��, ��⠭������ � ���� ᥡ�, diff --git a/core/src/main/resources/hudson/triggers/TimerTrigger/help_tr.html b/core/src/main/resources/hudson/triggers/TimerTrigger/help_tr.html index b8782162b051357ef3816d55826d7d7de515b5c5..8d257bd71c6777cb65c77493b790890254a79eae 100644 --- a/core/src/main/resources/hudson/triggers/TimerTrigger/help_tr.html +++ b/core/src/main/resources/hudson/triggers/TimerTrigger/help_tr.html @@ -10,7 +10,7 @@ planlanabilir. Bu özellik de bu amaç için kullanılabilse de, sürekli entegrasyonun asıl noktasının herhangi bir değişiklik olur olmaz yapılandırmanın başlatılması olduğu ve bu değişikliğe ait geri bildirimin çabucak verilmesi gerektiği unutulmamalıdır. - Bunun için SCM değişikliklerini Jenkins'a bildirecek mekanizmanın + Bunun için SCM değişikliklerini Jenkins'a bildirecek mekanizmanın ayarlanması gerekir.

        Yani, bu özelliği kullanmadan önce yapmak istediğinizin bu yöntem ile mi yapılması gerektiğini sorgulayın. diff --git a/core/src/main/resources/hudson/triggers/TimerTrigger/help_zh_TW.html b/core/src/main/resources/hudson/triggers/TimerTrigger/help_zh_TW.html index 806fefbadd2d3362e2219587852cd54db351b9eb..0809ad1abb342b3f15fe1fa1855748ef162cffbc 100644 --- a/core/src/main/resources/hudson/triggers/TimerTrigger/help_zh_TW.html +++ b/core/src/main/resources/hudson/triggers/TimerTrigger/help_zh_TW.html @@ -6,7 +6,7 @@ 大家第一次接觸持續整合 (Continuous Integration; CI) 時,常會有 Nightly 或 Weekly 建置的刻板印象,認為就該用這個功能為建置挑個良辰吉時。 但是,CI 的中心思想是個仁...不是啦,CI 的中心思想是在異動後盡快建置,讓大家馬上就能知道這次變更所造成的影響。 - 要達到這個目的,可以讓 SCM 在異動後主動通知 Jenkins。 + 要達到這個目的,可以讓 SCM 在異動後主動通知 Jenkins

        所以,在使用這個功能前,先停下來問問自己: 「我到底想要幹嘛?」 diff --git a/core/src/main/resources/hudson/util/AWTProblem/index.properties b/core/src/main/resources/hudson/util/AWTProblem/index.properties index af43e1ac98b62105f50a66bdadae7ffa7b1fa33e..817ba2c967c4dd57cd1133df7d21e7ecb8fada4b 100644 --- a/core/src/main/resources/hudson/util/AWTProblem/index.properties +++ b/core/src/main/resources/hudson/util/AWTProblem/index.properties @@ -20,4 +20,4 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -errorMessage=AWT is not properly configured on this server. Perhaps you need to run your container with "-Djava.awt.headless=true"? See also: https://wiki.jenkins-ci.org/display/JENKINS/Jenkins+got+java.awt.headless+problem +errorMessage=AWT is not properly configured on this server. Perhaps you need to run your container with "-Djava.awt.headless=true"? See also: https://jenkins.io/redirect/troubleshooting/java.awt.headless diff --git a/core/src/main/resources/hudson/util/AWTProblem/index_sr.properties b/core/src/main/resources/hudson/util/AWTProblem/index_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..41e88a682a4399a701591b711b96be91c23b5a7d --- /dev/null +++ b/core/src/main/resources/hudson/util/AWTProblem/index_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Error=\u0413\u0440\u0435\u0448\u043A\u0430 +errorMessage=AWT \u043D\u0438\u0458\u0435 \u043F\u0440\u0430\u0432\u0438\u043B\u043D\u043E \u043F\u043E\u0441\u0442\u0430\u0432\u0459\u0435\u043D\u043E \u043D\u0430 \u043E\u0432\u043E\u0458 \u043C\u0430\u0448\u0438\u043D\u0438. \u041C\u043E\u0436\u0434\u0430 \u0431\u0438 \u0442\u0440\u0435\u0431\u0430\u043B\u0438 \u043F\u043E\u0447\u0435\u0442\u0438 \u043A\u043E\u043D\u0442\u0435\u0458\u043D\u0435\u0440\u0435 \u0441\u0430 \u043E\u043F\u0446\u0438\u0458\u043E\u043C "-Djava.awt.headless=true"? \u0418\u0441\u0442\u043E \u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0430\u0458\u0442\u0435: https://jenkins.io/redirect/troubleshooting/java.awt.headless diff --git a/core/src/main/resources/hudson/util/AdministrativeError/message.jelly b/core/src/main/resources/hudson/util/AdministrativeError/message.jelly index bb30dc1ee7fc93a7b085ef794a744d6aa0d138b7..3b48c00afbd3035e3b57cc95d5ec44891d7c13f4 100644 --- a/core/src/main/resources/hudson/util/AdministrativeError/message.jelly +++ b/core/src/main/resources/hudson/util/AdministrativeError/message.jelly @@ -26,6 +26,6 @@ THE SOFTWARE.

        \ No newline at end of file diff --git a/core/src/main/resources/hudson/util/AdministrativeError/message_de.properties b/core/src/main/resources/hudson/util/AdministrativeError/message_de.properties index 2b27281eccf0e97dc49f8da3b77e60e70554443e..c216359fe65298792a8b172e9b554aedd2777e96 100644 --- a/core/src/main/resources/hudson/util/AdministrativeError/message_de.properties +++ b/core/src/main/resources/hudson/util/AdministrativeError/message_de.properties @@ -1,23 +1,23 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Simon Wiest -# -# 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. - +# The MIT License +# +# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Simon Wiest +# +# 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. + See\ the\ log\ for\ more\ details=Im Protokoll knnen weitere Hinweise stehen. \ No newline at end of file diff --git a/core/src/main/resources/hudson/util/AdministrativeError/message_sr.properties b/core/src/main/resources/hudson/util/AdministrativeError/message_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..7b02204db79c0ef5191c339e392f9b2bbed698c7 --- /dev/null +++ b/core/src/main/resources/hudson/util/AdministrativeError/message_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +See\ the\ log\ for\ more\ details=\u041F\u0440\u0435\u0433\u043B\u0435\u0434\u0430\u0458\u0442\u0435 \u0436\u0443\u0440\u043D\u0430\u043B \u0437\u0430 \u0458\u043E\u0448 \u0434\u0435\u0442\u0430\u0459\u0430 diff --git a/core/src/main/resources/hudson/util/DoubleLaunchChecker/index_sr.properties b/core/src/main/resources/hudson/util/DoubleLaunchChecker/index_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..d250950537cae703f6ee1bb9b51e1cba86a6225f --- /dev/null +++ b/core/src/main/resources/hudson/util/DoubleLaunchChecker/index_sr.properties @@ -0,0 +1,7 @@ +# This file is under the MIT License by authors + +Error=\u0413\u0440\u0435\u0448\u043A\u0430 +message=Jenkins \u0458\u0435 \u043E\u0442\u043A\u0440\u0438\u043E \u0434\u0430 \u0441\u0442\u0435 \u043F\u043E\u043A\u0440\u0435\u043D\u0443\u043B\u0438 \u0432\u0438\u0448\u0435 \u0438\u043D\u0441\u0442\u0430\u043D\u0446\u0430 Jenkins-\u0430 \u043A\u043E\u0458\u0435 \u0434\u0435\u043B\u0435 \u0438\u0441\u0442\u0438 \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0458\u0443\u043C "{0}". \u0414\u0430 \u043D\u0435\u0431\u0438 \u0431\u0438\u043B\u043E \u0447\u0443\u0434\u043D\u043E\u0433 \u043F\u043E\u043D\u0430\u0448\u0430\u045A\u0430 Jenkins-\u0430 \u0438\u0441\u043F\u0440\u0430\u0432\u0438\u0442\u0435 \u043F\u0440\u043E\u0431\u043B\u0435\u043C \u043E\u0434\u043C\u0430\u0445. +This\ Jenkins=\u041E\u0432\u0430\u0458 Jenkins +Other\ Jenkins=\u0414\u0440\u0443\u0433\u0438 Jenkins +label=\u0418\u0437\u0433\u043D\u043E\u0440\u0438\u0448\u0438 \u043F\u0440\u043E\u0431\u043B\u0435\u043C \u0438 \u043D\u0430\u0441\u0442\u0430\u0432\u0438 \u043A\u043E\u0440\u0438\u0448\u045B\u0435\u045A\u0435\u043C Jenkins-\u0430. diff --git a/core/src/main/resources/hudson/util/HudsonFailedToLoad/index_pl.properties b/core/src/main/resources/hudson/util/HudsonFailedToLoad/index_pl.properties new file mode 100644 index 0000000000000000000000000000000000000000..b7180e6120de4f850bd646a8cc10357e2c64ed1e --- /dev/null +++ b/core/src/main/resources/hudson/util/HudsonFailedToLoad/index_pl.properties @@ -0,0 +1,22 @@ +# The MIT License +# +# Copyright (c) 2017, Damian Szczepanik +# +# 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. +Error=Wyst\u0105pi\u0142 b\u0142\u0105d diff --git a/core/src/main/resources/hudson/util/HudsonFailedToLoad/index_sr.properties b/core/src/main/resources/hudson/util/HudsonFailedToLoad/index_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..eabbc4121e5d2db79760cfd41634218d6ab3e7e6 --- /dev/null +++ b/core/src/main/resources/hudson/util/HudsonFailedToLoad/index_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Error=\u0413\u0440\u0435\u0448\u043A\u0430 diff --git a/core/src/main/resources/hudson/util/HudsonIsLoading/index_sr.properties b/core/src/main/resources/hudson/util/HudsonIsLoading/index_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..50eaf9d58e86f7ad736ff112ae4537e22e960b9e --- /dev/null +++ b/core/src/main/resources/hudson/util/HudsonIsLoading/index_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Your\ browser\ will\ reload\ automatically\ when\ Jenkins\ is\ ready.=\u0412\u0430\u0448 \u0432\u0435\u0431-\u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0430\u0447 \u045B\u0435 \u0441\u0435 \u0430\u0443\u0442\u043E\u043C\u0430\u0442\u0441\u043A\u0438 \u043E\u0441\u0432\u0435\u0436\u0438\u0442\u0438 \u043A\u0430\u0434\u0430 \u0431\u0443\u0434\u0435 Jenkins \u0431\u0438\u043E \u0441\u043F\u0440\u0435\u043C\u0430\u043D. +Please\ wait\ while\ Jenkins\ is\ getting\ ready\ to\ work=\u041C\u043E\u043B\u0438\u043C\u043E \u0432\u0430\u0441, \u0441\u0430\u0447\u0435\u043A\u0430\u0458\u0442\u0435 \u0434\u043E\u043A \u0441\u0435 Jenkins \u043F\u0440\u0438\u043F\u0440\u0435\u043C\u0430. diff --git a/core/src/main/resources/hudson/util/HudsonIsRestarting/index_sr.properties b/core/src/main/resources/hudson/util/HudsonIsRestarting/index_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..4e15203825ee374211cf74c10edb6822a5d784e1 --- /dev/null +++ b/core/src/main/resources/hudson/util/HudsonIsRestarting/index_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Please\ wait\ while\ Jenkins\ is\ restarting=\u041C\u043E\u043B\u0438\u043C\u043E \u0432\u0430\u0441, \u0441\u0430\u0447\u0435\u043A\u0430\u0458\u0442\u0435 \u0434\u043E\u043A \u0441\u0435 \u043F\u043E\u043D\u043E\u0432\u043E \u043F\u043E\u043A\u0440\u0435\u045B\u0435 Jenkins. +Your\ browser\ will\ reload\ automatically\ when\ Jenkins\ is\ ready.=\u0412\u0430\u0448 \u0432\u0435\u0431-\u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0430\u0447 \u045B\u0435 \u0441\u0435 \u0430\u0443\u0442\u043E\u043C\u0430\u0442\u0441\u043A\u0438 \u043E\u0441\u0432\u0435\u0436\u0438\u0442\u0438 \u043A\u0430\u0434\u0430 \u0431\u0443\u0434\u0435 Jenkins \u0431\u0438\u043E \u0441\u043F\u0440\u0435\u043C\u0430\u043D. diff --git a/core/src/main/resources/hudson/util/IncompatibleAntVersionDetected/index_sr.properties b/core/src/main/resources/hudson/util/IncompatibleAntVersionDetected/index_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..05bb055a5f0db4cbee370efdb0515d76abbc92e6 --- /dev/null +++ b/core/src/main/resources/hudson/util/IncompatibleAntVersionDetected/index_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +Error=\u0413\u0440\u0435\u0448\u043A\u0430 +errorMessage=Jenkins \u0458\u0435 \u043E\u0442\u043A\u0440\u0438\u043E \u0434\u0430 \u0432\u0430\u0448 \u043A\u043E\u043D\u0442\u0435\u0458\u043D\u0435\u0440 \u043D\u0435 \u043F\u043E\u0434\u0440\u0436\u0430\u0432\u0430 Ant\ +(Ant \u043A\u043B\u0430\u0441\u0435 \u0443\u0447\u0438\u0442\u0430\u043D\u0435 \u043E\u0434 {0}) diff --git a/core/src/main/resources/hudson/util/IncompatibleServletVersionDetected/index_sr.properties b/core/src/main/resources/hudson/util/IncompatibleServletVersionDetected/index_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..09631cb8e93f865ffe1e858201f4ab4647dcdffb --- /dev/null +++ b/core/src/main/resources/hudson/util/IncompatibleServletVersionDetected/index_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +Error=\u0413\u0440\u0435\u0448\u043A\u0430 +errorMessage=Jenkins \u0458\u0435 \u043E\u0442\u043A\u0440\u0438\u043E \u0434\u0430 \u0432\u0430\u0448 \u043A\u043E\u043D\u0442\u0435\u0458\u043D\u0435\u0440 \u043D\u0435 \u043F\u043E\u0434\u0440\u0436\u0430\u0432\u0430 Servlet 2.4\ +(API \u0441\u0435\u0440\u0432\u043B\u0435\u0442\u0430 \u0443\u0447\u0438\u0442\u0430\u043D\u043E \u043E\u0434 {0}) diff --git a/core/src/main/resources/hudson/util/IncompatibleVMDetected/index_de.properties b/core/src/main/resources/hudson/util/IncompatibleVMDetected/index_de.properties index 6ddf791bee7fc28f2ff7e6086e248cff5e5a9600..5b55c0c15ebf7b50a75970b5f281d34adbce3a26 100644 --- a/core/src/main/resources/hudson/util/IncompatibleVMDetected/index_de.properties +++ b/core/src/main/resources/hudson/util/IncompatibleVMDetected/index_de.properties @@ -1,33 +1,33 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Seiji Sogabe, Simon Wiest -# -# 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. - -Error=Fehler -OS\ Name=Betriebssystem -VM\ Name=VM Name -Vendor=Hersteller -Version=Version -Detected\ JVM=Gefundene JVM -errorMessage=\ - Die gefundene Java Virtual Machine (JVM) wird von Jenkins nicht untersttzt. \ - Jenkins ist auf die Bibliothek XStream angewiesen, welche aber nicht mit der \ - gefundenen JVM funktioniert. \ - Mehr dazu... +# The MIT License +# +# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Seiji Sogabe, Simon Wiest +# +# 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. + +Error=Fehler +OS\ Name=Betriebssystem +VM\ Name=VM Name +Vendor=Hersteller +Version=Version +Detected\ JVM=Gefundene JVM +errorMessage=\ + Die gefundene Java Virtual Machine (JVM) wird von Jenkins nicht untersttzt. \ + Jenkins ist auf die Bibliothek XStream angewiesen, welche aber nicht mit der \ + gefundenen JVM funktioniert. \ + Mehr dazu... diff --git a/core/src/main/resources/hudson/util/IncompatibleVMDetected/index_sr.properties b/core/src/main/resources/hudson/util/IncompatibleVMDetected/index_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..c969814074eca5d21854f53be466666155719d1d --- /dev/null +++ b/core/src/main/resources/hudson/util/IncompatibleVMDetected/index_sr.properties @@ -0,0 +1,10 @@ +# This file is under the MIT License by authors + +Error=\u0413\u0440\u0435\u0448\u043A\u0430 +errorMessage=Jenkins \u0458\u0435 \u043F\u0440\u043E\u043D\u0430\u0448\u0430\u043E \u0434\u0430 \u0432\u0430\u0448\u0430 JVM \u043D\u0438\u0458\u0435 \u043F\u043E\u0434\u0440\u0436\u0430\u043D\u0430, \u0437\u0431\u043E\u0433 \u043D\u0435\u043A\u0438\u0445 \u0431\u0438\u0431\u043B\u0438\u043E\u0442\u0435\u043A\u0430 \u043E\u0434 \u043A\u043E\u0458\u0435 Jenkins \u0437\u0430\u0432\u0438\u0441\u0438.\ +\u041F\u0440\u0435\u0433\u043B\u0435\u0434\u0430\u0458\u0442\u0435 this FAQ \u0433\u0434\u0435 \u0438\u043C\u0430 \u0432\u0438\u043F\u0435 \u0434\u0435\u0442\u0430\u0459\u0430. +Detected\ JVM= +Vendor=\u041F\u0440\u043E\u0438\u0437\u0432\u043E\u0452\u0430\u0447 +Version=\u0412\u0435\u0440\u0437\u0438\u0458\u0430 +VM\ Name=\u0418\u043C\u0435 \u0432\u0438\u0440\u0442\u0443\u0435\u043B\u043D\u0435 \u043C\u0430\u0448\u0438\u043D\u0435 +OS\ Name=\u0418\u043C\u0435 \u043E\u043F\u0435\u0440\u0430\u0442\u0438\u0432\u043D\u043E\u0433 \u0441\u0438\u0441\u0442\u0435\u043C\u0430 diff --git a/core/src/main/resources/hudson/util/InsufficientPermissionDetected/index.properties b/core/src/main/resources/hudson/util/InsufficientPermissionDetected/index.properties index 2b3a0363502f3b932d6da2313a190be0e1b4b2ba..e9337d5940d0affbe4b2f47fec2febe2273ceda2 100644 --- a/core/src/main/resources/hudson/util/InsufficientPermissionDetected/index.properties +++ b/core/src/main/resources/hudson/util/InsufficientPermissionDetected/index.properties @@ -29,5 +29,5 @@ errorMessage.1=\ way to fix the problem is simply to turn the security manager off. errorMessage.2=\ For how to turn off security manager in your container, refer to \ - \ + \ Container-specific documentations of Jenkins. diff --git a/core/src/main/resources/hudson/util/InsufficientPermissionDetected/index_de.properties b/core/src/main/resources/hudson/util/InsufficientPermissionDetected/index_de.properties index 23904e44e7da5649f269d08d33d21e96e62eca89..80bf4d81877dc20b51e6187ffc900e847764d7fa 100644 --- a/core/src/main/resources/hudson/util/InsufficientPermissionDetected/index_de.properties +++ b/core/src/main/resources/hudson/util/InsufficientPermissionDetected/index_de.properties @@ -1,33 +1,33 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Simon Wiest -# -# 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. - -Error=Fehler -errorMessage.1=\ - Jenkins scheint nicht gengend Ausfhrungsrechte zu besitzen (vgl. untenstehenden \ - Stacktrace). Eine hufige Ursache dafr ist ein aktivierter Security Manager. \ - Ist dieser absichtlich aktiviert, mssen Sie Jenkins ausreichende Ausfhrungsrechte \ - zuteilen. Falls nicht (oder Sie keinen blassen Schimmer haben, was ein "Security \ - Manager" ist), ist es am Einfachsten, den Security Manager abzuschalten. -errorMessage.2=\ - Wie Sie den Security Manager Ihres Web-Containers abschalten, entnehmen Sie \ - der containerspezifischen \ - Jenkins-Dokumentation. +# The MIT License +# +# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Simon Wiest +# +# 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. + +Error=Fehler +errorMessage.1=\ + Jenkins scheint nicht gengend Ausfhrungsrechte zu besitzen (vgl. untenstehenden \ + Stacktrace). Eine hufige Ursache dafr ist ein aktivierter Security Manager. \ + Ist dieser absichtlich aktiviert, mssen Sie Jenkins ausreichende Ausfhrungsrechte \ + zuteilen. Falls nicht (oder Sie keinen blassen Schimmer haben, was ein "Security \ + Manager" ist), ist es am Einfachsten, den Security Manager abzuschalten. +errorMessage.2=\ + Wie Sie den Security Manager Ihres Web-Containers abschalten, entnehmen Sie \ + der containerspezifischen \ + Jenkins-Dokumentation. diff --git a/core/src/main/resources/hudson/util/InsufficientPermissionDetected/index_es.properties b/core/src/main/resources/hudson/util/InsufficientPermissionDetected/index_es.properties index 066f6b967bb28d8672b781ebe4b5473d91bce9a5..ec945dcc8675037a959c621302ff2b3fc31df8dd 100644 --- a/core/src/main/resources/hudson/util/InsufficientPermissionDetected/index_es.properties +++ b/core/src/main/resources/hudson/util/InsufficientPermissionDetected/index_es.properties @@ -24,7 +24,7 @@ errorMessage.1=\ Se ha detectado que Jenkins no tiene suficientes permisos para ejecutarse. \ Probablemente pueda ser que el ''security manager'' de tu contenedor de ''servlet'' est activado. errorMessage.2=\ - Echa un vistazo a \ + Echa un vistazo a \ Container-specific documentations para saber cmo desactivar esta restriccin. Error=Error diff --git a/core/src/main/resources/hudson/util/InsufficientPermissionDetected/index_ja.properties b/core/src/main/resources/hudson/util/InsufficientPermissionDetected/index_ja.properties index 867969217058a621cc3e9c8b1060dbe6f621c322..ae3a8711670e1661f5078641358a4584fd2d5c20 100644 --- a/core/src/main/resources/hudson/util/InsufficientPermissionDetected/index_ja.properties +++ b/core/src/main/resources/hudson/util/InsufficientPermissionDetected/index_ja.properties @@ -29,5 +29,5 @@ errorMessage.1=\ \u30BB\u30AD\u30E5\u30EA\u30C6\u30A3\u30DE\u30CD\u30FC\u30B8\u30E3\u30FC\u3092\u7121\u52B9\u306B\u3057\u3066\u3057\u307E\u3046\u306E\u304C\u4E00\u756A\u7C21\u5358\u3067\u3059\u3002 errorMessage.2=\ \u4F7F\u7528\u3057\u3066\u3044\u308B\u30B3\u30F3\u30C6\u30CA\u30FC\u3067\u306E\u30BB\u30AD\u30E5\u30EA\u30C6\u30A3\u30DE\u30CD\u30FC\u30B8\u30E3\u30FC\u306E\u7121\u52B9\u5316\u306E\u65B9\u6CD5 \u306B\u3064\u3044\u3066\u306F\u3001\ - \ + \ Container-specific documentations\u3092\u53C2\u7167\u3057\u3066\u304F\u3060\u3055\u3044\u3002 diff --git a/core/src/main/resources/hudson/util/InsufficientPermissionDetected/index_pt_BR.properties b/core/src/main/resources/hudson/util/InsufficientPermissionDetected/index_pt_BR.properties index c1090b7185e10f385b8dc5aa23219d39967ed950..2f5904304a4cfd37205ef82ba7e39f254cc3f7eb 100644 --- a/core/src/main/resources/hudson/util/InsufficientPermissionDetected/index_pt_BR.properties +++ b/core/src/main/resources/hudson/util/InsufficientPermissionDetected/index_pt_BR.properties @@ -34,7 +34,7 @@ de seguran\u00e7a, poder\u00e1 desativ\u00e1-lo. Error=Erro # \ # For how to turn off security manager in your container, refer to \ -# \ +# \ # Container-specific documentations of Jenkins. errorMessage.2=Para desativar o gerenciador de seguran\u00e7a, \ Documenta\u00e7\u00e3o especifica sobre containers do Jenkins diff --git a/core/src/main/resources/hudson/util/InsufficientPermissionDetected/index_sr.properties b/core/src/main/resources/hudson/util/InsufficientPermissionDetected/index_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..011f3bd6120f7fece1ba6649e204e790f4b17bc4 --- /dev/null +++ b/core/src/main/resources/hudson/util/InsufficientPermissionDetected/index_sr.properties @@ -0,0 +1,8 @@ +# This file is under the MIT License by authors + +Error=\u0413\u0440\u0435\u0448\u043A\u0430 +errorMessage.1=Jenkins je \u043E\u0442\u043A\u0440\u0438o \u0434\u0430 \u043D\u0435\u043C\u0430 \u043E\u0432\u043B\u0430\u0448\u045B\u0435\u045A\u0435 \u0434\u0430 \u0441\u0435 \u0438\u0437\u0432\u0440\u0448\u0430\u0432\u0430, \u0435\u0432\u0438\u0434\u0435\u043D\u0442\u0438\u0440\u0430\u043D\u043E \u043F\u0440\u0430\u0442\u0435\u045B\u043E\u0458 \u0442\u0440\u0430\u0441\u0438 \u0441\u0442\u0435\u043A\u043E\u043C. \u0412\u0435\u0440\u043E\u0432\u0430\u0442\u043D\u043E \u0458\u0435 \u0437\u0431\u043E\u0433 \u043D\u0435\u043A\u043E\u0433 \u043D\u0430\u0434\u0437\u043E\u0440\u043D\u043E\u0433 \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u0430, \u043A\u043E\u0458\u0438 \u0431\u0438 \u0442\u0440\u0435\u0431\u043E \u0434\u0430 \u0441\u0435 \u043F\u043E\u0434\u0435\u0441\u0438 \u0438\u043B\u0438 \u0438\u0441\u043A\u0459\u0443\u0447\u0438. +errorMessage.2=\u0423\u043F\u0443\u0441\u0442\u0432\u043E \u043A\u0430\u043A\u043E \u0443\u0433\u0430\u0441\u0438\u0442\u0438 security manager \u0443 \u0432\u0430\u0448\u0435\u043C \u043A\u043E\u043D\u0442\u0435\u0458\u043D\u0435\u0440\u0443 \u0441\u0435 \u043D\u0430\u043B\u0430\u0437\u0438 \u0443 \u0447\u043B\u0430\u043D\u043A\u0443 \ + \ + \u0414\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0430\u0446\u0438\u0458\u0430 \u043A\u043E\u043D\u0442\u0435\u0458\u043D\u0435\u0440\u0430 \u0443 Jenkins-\u0443. +de= diff --git a/core/src/main/resources/hudson/util/InsufficientPermissionDetected/index_zh_TW.properties b/core/src/main/resources/hudson/util/InsufficientPermissionDetected/index_zh_TW.properties index ba7f9a6deda85204ac1abcdb05d5df7e94465773..dd369fb349d6da48302b2a5c666541f0002660a5 100644 --- a/core/src/main/resources/hudson/util/InsufficientPermissionDetected/index_zh_TW.properties +++ b/core/src/main/resources/hudson/util/InsufficientPermissionDetected/index_zh_TW.properties @@ -28,5 +28,5 @@ errorMessage.1=\ \u8981\u662f\u60a8\u9023 Security Manager \u662f\u4ec0\u9ebc\u90fd\u4e0d\u77e5\u9053\uff0c\u6700\u7c21\u55ae\u7684\u8655\u7406\u65b9\u6cd5\u5c31\u662f\u628a\u5b83\u95dc\u6389\u3002 errorMessage.2=\ \u95dc\u9589\u60a8 Container \u7684 Security Manager \u7684\u65b9\u6cd5\u53ef\u4ee5\u53c3\u8003 Jenkins \u7684 \ - \ + \ Container \u76f8\u95dc\u6587\u4ef6\u3002 diff --git a/core/src/main/resources/hudson/util/JNADoublyLoaded/index.properties b/core/src/main/resources/hudson/util/JNADoublyLoaded/index.properties index ddf728cf8345708e64990d4a5905a1c4eaefdf77..cf8fe45ca348e0a7cc751358cb6c2d80d401a42f 100644 --- a/core/src/main/resources/hudson/util/JNADoublyLoaded/index.properties +++ b/core/src/main/resources/hudson/util/JNADoublyLoaded/index.properties @@ -21,4 +21,4 @@ # THE SOFTWARE. blurb=Another instance of JNA is already loaded in another classloader, thereby making it impossible for Jenkins \ - to load its own copy. See Wiki for more details. + to load its own copy. See Wiki for more details. diff --git a/core/src/main/resources/hudson/util/JNADoublyLoaded/index_de.properties b/core/src/main/resources/hudson/util/JNADoublyLoaded/index_de.properties index 1db31ab5b94683c4ae8c08a7153e6821abe80915..c043e4f426af51ef0c3e26b564ddfdda8e1fe553 100644 --- a/core/src/main/resources/hudson/util/JNADoublyLoaded/index_de.properties +++ b/core/src/main/resources/hudson/util/JNADoublyLoaded/index_de.properties @@ -24,5 +24,5 @@ Failed\ to\ load\ JNA=Java Native Access (JNA) konnte nicht geladen werden blurb=\ Eine JNA-Instanz wurde bereits von einem anderen Classloader geladen. \ Dies hindert Jenkins daran, seine eigene JNA-Instanz zu laden. \ - Mehr... + Mehr... diff --git a/core/src/main/resources/hudson/util/JNADoublyLoaded/index_es.properties b/core/src/main/resources/hudson/util/JNADoublyLoaded/index_es.properties index abf2dd43d0f43cd250061f8ffe04f28dd03d4dcf..f04bc938f6ee111a2e135acee961bd1c125d1191 100644 --- a/core/src/main/resources/hudson/util/JNADoublyLoaded/index_es.properties +++ b/core/src/main/resources/hudson/util/JNADoublyLoaded/index_es.properties @@ -21,5 +21,5 @@ # THE SOFTWARE. blurb=Otra instancia de JNA est en ejecucin, echa un vistazo a esta \ - pagina para ver mas detalles. + pagina para ver mas detalles. Failed\ to\ load\ JNA=Fallo al cargar JNA diff --git a/core/src/main/resources/hudson/util/JNADoublyLoaded/index_ja.properties b/core/src/main/resources/hudson/util/JNADoublyLoaded/index_ja.properties index de457be680ff5c1cad6f9b57cc4d82ea62ec531b..fb66f542ea6889004a30b76338041a9fd78d430f 100644 --- a/core/src/main/resources/hudson/util/JNADoublyLoaded/index_ja.properties +++ b/core/src/main/resources/hudson/util/JNADoublyLoaded/index_ja.properties @@ -22,4 +22,4 @@ Failed\ to\ load\ JNA=Java Native Access (JNA) \u306E\u30ED\u30FC\u30C9\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002 blurb=\u5225\u306E\u30AF\u30E9\u30B9\u30ED\u30FC\u30C0\u30FC\u304CJNA\u306E\u30A4\u30F3\u30B9\u30BF\u30F3\u30B9\u3092\u65E2\u306B\u30ED\u30FC\u30C9\u3057\u3066\u3044\u307E\u3059\u3002\u305D\u306E\u305F\u3081\u3001Jenkins\u304C\u30ED\u30FC\u30C9\u3059\u308B\u3053\u3068\u304C\u3067\u304D\u307E\u305B\u3093\u3002\ - \u8A73\u7D30\u306F\u3001Wiki\u3092\u53C2\u7167\u3057\u3066\u304F\u3060\u3055\u3044\u3002 + \u8A73\u7D30\u306F\u3001Wiki\u3092\u53C2\u7167\u3057\u3066\u304F\u3060\u3055\u3044\u3002 diff --git a/core/src/main/resources/hudson/util/JNADoublyLoaded/index_pt_BR.properties b/core/src/main/resources/hudson/util/JNADoublyLoaded/index_pt_BR.properties index 02cc07bbdac9f0607e7e92022c7e1647cb0c4204..8238947faa20545f2c5e8c13ceb542fbdec9fe1d 100644 --- a/core/src/main/resources/hudson/util/JNADoublyLoaded/index_pt_BR.properties +++ b/core/src/main/resources/hudson/util/JNADoublyLoaded/index_pt_BR.properties @@ -22,6 +22,6 @@ Failed\ to\ load\ JNA= # Another instance of JNA is already loaded in another classloader, thereby making it impossible for Jenkins \ -# to load its own copy. See Wiki for more details. +# to load its own copy. See Wiki for more details. blurb=Outra inst\u00e2ncia do JNA j\u00e1 est\u00e1 carregada em outro Classloader, impossibilitando ao Jenkins \ diff --git a/core/src/main/resources/hudson/util/JNADoublyLoaded/index_sr.properties b/core/src/main/resources/hudson/util/JNADoublyLoaded/index_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..89c5a8befb816d83e6c3179652ae60585533dccc --- /dev/null +++ b/core/src/main/resources/hudson/util/JNADoublyLoaded/index_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Failed\ to\ load\ JNA=\u041D\u0438\u0458\u0435 \u043C\u043E\u0433\u043B\u043E \u0443\u0447\u0438\u0442\u0430\u0442\u0438 JNA +blurb=\u0414\u0440\u0443\u0433\u0430 \u0438\u043D\u0441\u0442\u0430\u043D\u0446\u0430 JNA \u0458\u0435 \u0432\u0435\u045B \u0443\u0447\u0438\u0442\u0430\u043D\u0430 \u0443 classloader, \u043F\u043E\u0442\u043E\u043C Jenkins \u043D\u0435\u043C\u043E\u0436\u0435 \u0443\u0447\u0438\u0442\u0430\u0442\u0438 \u0441\u0432\u043E\u0458\u0443 \u043A\u043E\u043F\u0438\u0458\u0443. \u041F\u0440\u0435\u0433\u043B\u0435\u0434\u0430\u0458\u0442\u0435 \u0412\u0438\u043A\u0438 \u0437\u0430 \u0432\u0438\u0448\u0435 \u0434\u0435\u0442\u0430\u0459\u0430. diff --git a/core/src/main/resources/hudson/util/JNADoublyLoaded/index_zh_TW.properties b/core/src/main/resources/hudson/util/JNADoublyLoaded/index_zh_TW.properties index 7508e81be4b1e2c3ca2635e697471dc01388d410..9d12da7613fdbbdb0a9bd9741a799ec67ab7104e 100644 --- a/core/src/main/resources/hudson/util/JNADoublyLoaded/index_zh_TW.properties +++ b/core/src/main/resources/hudson/util/JNADoublyLoaded/index_zh_TW.properties @@ -23,4 +23,4 @@ Failed\ to\ load\ JNA=JNA \u8f09\u5165\u5931\u6557 blurb=\ \u5df2\u7d93\u6709\u5176\u4ed6 ClassLoader \u8f09\u5165\u4e86 JNA\uff0cJenkins \u56e0\u6b64\u7121\u6cd5\u8f09\u5165\u81ea\u5df1\u7684\u7248\u672c\u3002\ - \u8acb\u53c3\u8003 Wiki \u4e0a\u7684\u8a73\u7d30\u8cc7\u6599\u3002 + \u8acb\u53c3\u8003 Wiki \u4e0a\u7684\u8a73\u7d30\u8cc7\u6599\u3002 diff --git a/core/src/main/resources/hudson/util/JenkinsReloadFailed/index_sr.properties b/core/src/main/resources/hudson/util/JenkinsReloadFailed/index_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..2a99f9eb88d6b9bbd5d963e270fcd3a4faf5c8ac --- /dev/null +++ b/core/src/main/resources/hudson/util/JenkinsReloadFailed/index_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Error=\u0413\u0440\u0435\u0448\u043A\u0430 +msg=Jenkins \u0458\u0435 \u0431\u0438\u043E \u043F\u0440\u0435\u043A\u0438\u043D\u0443\u0442 \u0434\u043E\u043A \u0458\u0435 \u043F\u043E\u043D\u043E\u0432\u043E \u0438\u0447\u0438\u0442\u0430\u0432\u0430\u043E \u043F\u043E\u0442\u0430\u043A\u0435 \u0441\u0430 \u0434\u0438\u0441\u043A\u0430, \u0438 \u043F\u043E\u0442\u043E\u043C \u0442\u043E\u0433\u0430 \u0458\u0435 \u0441\u0442\u0430\u043E \u0434\u0430 \u0431\u0438 \u0441\u0435 \u0441\u043F\u0440\u0435\u0447\u0438\u043B\u043E \u0433\u0443\u0431\u0438\u0442\u0430\u043A \u043F\u043E\u0434\u0430\u0442\u0430\u043A\u0430. \u041C\u043E\u043B\u0438\u043C\u043E \u0432\u0430\u0441, \u043F\u043E\u043D\u043E\u0432\u043E \u043F\u043E\u043A\u0440\u0435\u043D\u0438\u0442\u0435 Jenkins. \ No newline at end of file diff --git a/core/src/main/resources/hudson/util/Messages_pl.properties b/core/src/main/resources/hudson/util/Messages_pl.properties new file mode 100644 index 0000000000000000000000000000000000000000..9f4d414f74abc3b10b7e0ac1b948a3ab364594c6 --- /dev/null +++ b/core/src/main/resources/hudson/util/Messages_pl.properties @@ -0,0 +1,26 @@ +# The MIT License +# +# Copyright (c) 2004-2017, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributors +# +# 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. +ClockDifference.InSync=Zsynchronizowany +ClockDifference.Failed=Nie uda\u0142o si\u0119 zweryfikowa\u0107 +HttpResponses.Saved=Zapisano +FormValidation.ValidateRequired=Wymagane +FormValidation.Error.Details=(wy\u015Bwietl szczeg\u00F3\u0142y) diff --git a/core/src/main/resources/hudson/util/Messages_sr.properties b/core/src/main/resources/hudson/util/Messages_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..a813bf1695eef8857567f0c9726bf6a9d63503bf --- /dev/null +++ b/core/src/main/resources/hudson/util/Messages_sr.properties @@ -0,0 +1,10 @@ +# This file is under the MIT License by authors + +ClockDifference.InSync=\u0421\u0438\u043D\u0445\u0440\u043E\u043D\u0438\u0437\u043E\u0432\u0430\u043D\u043E +ClockDifference.Ahead={0} \u0438\u0441\u043F\u0440\u0435\u0434 +ClockDifference.Behind={0} \u0438\u0437\u0430 +ClockDifference.Failed=\u041F\u0440\u043E\u0432\u0435\u0440\u0430 \u043D\u0438\u0458\u0435 \u0443\u0441\u043F\u0435\u043B\u0430. +FormFieldValidator.did_not_manage_to_validate_may_be_too_sl=\u041F\u0440\u043E\u0432\u0435\u0440\u0430 {0} \u043D\u0438\u0458\u0435 \u0443\u0441\u043F\u0435\u043B\u043E. \u041C\u043E\u0433\u0443\u045B\u0435 \u0458\u0435 \u0434\u0430 Jenkins \u043D\u0438\u0458\u0435 \u0434\u043E\u0432\u043E\u0459\u043D\u043E \u0431\u0440\u0437. +FormValidation.Error.Details=(\u043F\u0440\u0438\u0434\u0430\u0436\u0438 \u0434\u0435\u0442\u0430\u0459\u0435) +FormValidation.ValidateRequired=\u041E\u0431\u0430\u0432\u0435\u0437\u043D\u043E +HttpResponses.Saved=\u0421\u0430\u0447\u0443\u0432\u0430\u043D\u043E \ No newline at end of file diff --git a/core/src/main/resources/hudson/util/NoHomeDir/index.properties b/core/src/main/resources/hudson/util/NoHomeDir/index.properties index e389ec998adc075b7c15539523a4bd11a446ef74..c54b6adbcc2207f486bbeb39ca9581e7e68cfdd4 100644 --- a/core/src/main/resources/hudson/util/NoHomeDir/index.properties +++ b/core/src/main/resources/hudson/util/NoHomeDir/index.properties @@ -25,6 +25,6 @@ errorMessage.1=\ errorMessage.2=\ To change the home directory, use JENKINS_HOME environment variable or set the \ JENKINS_HOME system property. \ - See Container-specific documentation \ + See Container-specific documentation \ for more details of how to do this. diff --git a/core/src/main/resources/hudson/util/NoHomeDir/index_de.properties b/core/src/main/resources/hudson/util/NoHomeDir/index_de.properties index c834d9aa69debb583a6a485f37c2cf2a87c61bdb..df884cff8400755a2d4984a2abd46e1c39673788 100644 --- a/core/src/main/resources/hudson/util/NoHomeDir/index_de.properties +++ b/core/src/main/resources/hudson/util/NoHomeDir/index_de.properties @@ -1,32 +1,32 @@ -# The MIT License -# -# Copyright (c) 2004-2010, Sun Microsystems, Inc., Kohsuke Kawaguchi, Simon Wiest -# -# 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. - -Error=Fehler -errorMessage.1=\ - Das Stammverzeichnis ''{0}'' konnte nicht angelegt werden. In den meisten Fllen ist \ - dies ein Dateirechte-Problem. -errorMessage.2=\ - Um das Stammverzeichnis zu ndern, verwenden Sie die Umgebungsvariable JENKINS_HOME \ - oder die Java-Systemeigenschaft JENKINS_HOME. Weitere Details entnehmen Sie \ - der containerspezifischen \ - Jenkins-Dokumentation. - +# The MIT License +# +# Copyright (c) 2004-2010, Sun Microsystems, Inc., Kohsuke Kawaguchi, Simon Wiest +# +# 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. + +Error=Fehler +errorMessage.1=\ + Das Stammverzeichnis ''{0}'' konnte nicht angelegt werden. In den meisten Fllen ist \ + dies ein Dateirechte-Problem. +errorMessage.2=\ + Um das Stammverzeichnis zu ndern, verwenden Sie die Umgebungsvariable JENKINS_HOME \ + oder die Java-Systemeigenschaft JENKINS_HOME. Weitere Details entnehmen Sie \ + der containerspezifischen \ + Jenkins-Dokumentation. + diff --git a/core/src/main/resources/hudson/util/NoHomeDir/index_es.properties b/core/src/main/resources/hudson/util/NoHomeDir/index_es.properties index 3aa1b32d84166bff0eacb0b7dcdca7c5058cd672..2cdd09a469d5de9c7ced719bb2474de9ed58a821 100644 --- a/core/src/main/resources/hudson/util/NoHomeDir/index_es.properties +++ b/core/src/main/resources/hudson/util/NoHomeDir/index_es.properties @@ -24,6 +24,6 @@ errorMessage.1=\ No fu posible crear el directorio principal ''{0}''. Normalmente es un problema de permisos. errorMessage.2=\ Para cambiar el directorio principal usa la variable de entorno JENKINS_HOME \ - Tienes mas detalles de cmo hacerlo en: Container-specific documentation + Tienes mas detalles de cmo hacerlo en: Container-specific documentation Error=Error diff --git a/core/src/main/resources/hudson/util/NoHomeDir/index_ja.properties b/core/src/main/resources/hudson/util/NoHomeDir/index_ja.properties index 253da02eef438e15fe51c5047d48b854af4f80c4..9a4622cb1c32a7102507c360587be69e45021e24 100644 --- a/core/src/main/resources/hudson/util/NoHomeDir/index_ja.properties +++ b/core/src/main/resources/hudson/util/NoHomeDir/index_ja.properties @@ -26,7 +26,7 @@ errorMessage.1=\ errorMessage.2=\ \u30DB\u30FC\u30E0\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u3092\u5909\u66F4\u3059\u308B\u306B\u306F\u3001\u74B0\u5883\u5909\u6570\u306EJENKINS_HOME\u304B\u3001\u30B7\u30B9\u30C6\u30E0\u30D7\u30ED\u30D1\u30C6\u30A3\u306E \ JENKINS_HOME\u3092\u8A2D\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002\ - \u8A2D\u5B9A\u65B9\u6CD5\u306B\u3064\u3044\u3066\u306F\u3001Container-specific documentation \ + \u8A2D\u5B9A\u65B9\u6CD5\u306B\u3064\u3044\u3066\u306F\u3001Container-specific documentation \ \u3092\u53C2\u7167\u3057\u3066\u304F\u3060\u3055\u3044\u3002 diff --git a/core/src/main/resources/hudson/util/NoHomeDir/index_pt_BR.properties b/core/src/main/resources/hudson/util/NoHomeDir/index_pt_BR.properties index bc1d89c225c9f506df282970b85e5417eec02ca0..ea8295abc9c8b9d473adeb0d471b21ee3ca595a6 100644 --- a/core/src/main/resources/hudson/util/NoHomeDir/index_pt_BR.properties +++ b/core/src/main/resources/hudson/util/NoHomeDir/index_pt_BR.properties @@ -25,8 +25,8 @@ Error=Erro errorMessage.1=N\u00e3o foi poss\u00edvel criar o diret\u00f3rio principal "{0}". Provavelmente um por problema de permiss\u00e3o. # To change the home directory, use JENKINS_HOME environment variable or set the \ # JENKINS_HOME system property. \ -# See Container-specific documentation \ +# See Container-specific documentation \ # for more details of how to do this. errorMessage.2= Para mudar o diret\u00f3rio principal, use a vari\u00e1vel de ambiente JENKINS_HOME \ - Veja a documenta\u00e7\u00e3o especifica para o servidor \ + Veja a documenta\u00e7\u00e3o especifica para o servidor \ para mais detalhes de como fazer isto. diff --git a/core/src/main/resources/hudson/util/NoHomeDir/index_sr.properties b/core/src/main/resources/hudson/util/NoHomeDir/index_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..57863766bfeb0d97e006ef102f79f8050aa47a68 --- /dev/null +++ b/core/src/main/resources/hudson/util/NoHomeDir/index_sr.properties @@ -0,0 +1,9 @@ +# This file is under the MIT License by authors + +Error=\u0413\u0440\u0435\u0448\u043A\u0430 +errorMessage.1=\u041D\u0438\u0458\u0435 \u043C\u043E\u0433\u0443\u045B\u0435 \u043A\u0440\u0435\u0438\u0440\u0430\u0442\u0438 \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0458\u0443\u043C \u2018{0}\u2019, \u0432\u0435\u0440\u043E\u0432\u0430\u0442\u043D\u043E \u0437\u0431\u043E\u0433 \u043D\u0435\u0434\u043E\u0441\u0442\u0430\u0442\u043A\u0430 \u043F\u0440\u0430\u0432\u0430. +errorMessage.2=\ + \u0414\u0430 \u043F\u0440\u043E\u043C\u0435\u043D\u0438\u0442\u0435 \u0433\u043B\u0430\u0432\u043D\u0438 \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0458\u0443\u043C, \u043A\u043E\u0440\u0438\u0441\u0442\u0438\u0442\u0435 JENKINS_HOME \u043F\u0440\u043E\u043C\u0435\u043D\u0459\u0438\u0432\u0443 \u0438\u043B\u0438 \ + JENKINS_HOME \u0441\u0438\u0441\u0442\u0435\u043C\u0441\u043A\u0443 \u043F\u043E\u0441\u0442\u0430\u0432\u043A\u0443. \ + \u041F\u0440\u043E\u0447\u0438\u0442\u0430\u0458\u0442\u0435 \u0414\u043E\u043A\u0443\u043C\u0435\u043D\u0442\u0430\u0446\u0438\u0458\u0443 \u043E \u043A\u043E\u043D\u0442\u0435\u0458\u043D\u0435\u0440\u0438\u043C\u0430 \ + \u0437\u0430 \u0458\u043E\u0448 \u0434\u0435\u0442\u0430\u0459\u0430. \ No newline at end of file diff --git a/core/src/main/resources/hudson/util/NoHomeDir/index_zh_TW.properties b/core/src/main/resources/hudson/util/NoHomeDir/index_zh_TW.properties index 2ea36193a27041f0297b95724a1bd09bea331486..9ffa047ddcfcc312345bc9b0837cd02853bd08f9 100644 --- a/core/src/main/resources/hudson/util/NoHomeDir/index_zh_TW.properties +++ b/core/src/main/resources/hudson/util/NoHomeDir/index_zh_TW.properties @@ -26,4 +26,4 @@ errorMessage.1=\ errorMessage.2=\ \u8981\u4fee\u6539\u4e3b\u76ee\u9304\uff0c\u8acb\u8a2d\u5b9a JENKINS_HOME \u74b0\u5883\u8b8a\u6578\u6216 JENKINS_HOME \u7cfb\u7d71\u5c6c\u6027\u3002\ \u8a73\u7d30\u4f5c\u6cd5\u8acb\u53c3\u8003 \ - Container \u76f8\u95dc\u6587\u4ef6\u3002 + Container \u76f8\u95dc\u6587\u4ef6\u3002 diff --git a/core/src/main/resources/hudson/util/NoTempDir/index_sr.properties b/core/src/main/resources/hudson/util/NoTempDir/index_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..b4cd0a780b197673274e1296d5e39c05be428134 --- /dev/null +++ b/core/src/main/resources/hudson/util/NoTempDir/index_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +Error=\u0413\u0440\u0435\u0448\u043A\u0430 +description=\ + \u041D\u0438\u0458\u0435 \u043C\u043E\u0433\u0443\u045B\u0435 \u043A\u0440\u0435\u0438\u0440\u0430\u0442\u0438 \u043F\u0440\u0438\u0432\u0440\u0435\u043C\u0435\u043D\u0443 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0443, \u0432\u0435\u0440\u043E\u0432\u0430\u0442\u043D\u043E \u0437\u0431\u043E\u0433 \u043B\u043E\u0448\u0430 \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A \u043A\u043E\u043D\u0442\u0435\u0458\u043D\u0435\u0440\u043E\u043C. JVM \u043A\u043E\u0440\u0438\u0441\u0442\u0438 "{0}" \u0437\u0430 \u043F\u0440\u0438\u0432\u0440\u0435\u043C\u0435\u043D\u0438 \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0458\u0443\u043C. \u0414\u0430\u043B\u0438 \u043F\u043E\u0441\u0442\u043E\u0458\u0438, \u0438 \u0434\u0430\u043B\u0438 \u0458\u0435 \u043C\u043E\u0433\u0443\u045B\u0435 \u043F\u0438\u0441\u0430\u0442\u0438 \u043F\u043E \u045A\u0435\u043C\u0443? diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column.jelly b/core/src/main/resources/hudson/views/BuildButtonColumn/column.jelly index 48b22533fbd1672b66009858a8c42b83383c2470..f57d537f2e58c8c6821a7fe214fdff08c1a5781a 100644 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column.jelly +++ b/core/src/main/resources/hudson/views/BuildButtonColumn/column.jelly @@ -30,11 +30,11 @@ THE SOFTWARE. - + - + @@ -46,7 +46,7 @@ THE SOFTWARE. diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column.properties b/core/src/main/resources/hudson/views/BuildButtonColumn/column.properties index 9557233e6b7bf393c9b2541b88d3fe9498ffd4d7..bf14a6abb2dbc9c0f170f713f3701118f379e2bc 100644 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column.properties +++ b/core/src/main/resources/hudson/views/BuildButtonColumn/column.properties @@ -20,6 +20,6 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Build_scheduled=Build scheduled -Schedule_a_build=Schedule a build for {0} -Schedule_a_build_with_parameters=Schedule a build with parameters for {0} +Task_scheduled={0} scheduled +Schedule_a_task=Schedule a {1} for {0} +Schedule_a_task_with_parameters=Schedule a {1} with parameters for {0} diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_es.properties b/core/src/main/resources/hudson/views/BuildButtonColumn/column_es.properties deleted file mode 100644 index 039c98f4bff8b94540955c2f2d34bde3a46eac52..0000000000000000000000000000000000000000 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_es.properties +++ /dev/null @@ -1,25 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2010, Sun Microsystems, Inc. -# -# 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 programada -Schedule_a_build=Programar una construcci\u00F3n de {0} -Schedule_a_build_with_parameters=Planificar una construcci\u00F3n con parametros de {0} diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_es_AR.properties b/core/src/main/resources/hudson/views/BuildButtonColumn/column_es_AR.properties deleted file mode 100644 index 014de880f19c86952d61d7bd5a699030565fe02f..0000000000000000000000000000000000000000 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_es_AR.properties +++ /dev/null @@ -1,4 +0,0 @@ -# This file is under the MIT License by authors - -Build_scheduled=Corrida en espera -Schedule_a_build=Activar una corrida de {0} diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_et.properties b/core/src/main/resources/hudson/views/BuildButtonColumn/column_et.properties deleted file mode 100644 index 689c082d1c0d860af040f9872eca80416c1fdc72..0000000000000000000000000000000000000000 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_et.properties +++ /dev/null @@ -1,4 +0,0 @@ -# This file is under the MIT License by authors - -Build_scheduled=Ehitus planeeritud -Schedule_a_build=Plaani uus t\u00F6\u00F6\u003a {0} diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_eu.properties b/core/src/main/resources/hudson/views/BuildButtonColumn/column_eu.properties deleted file mode 100644 index 7d21004037a2faf671d7157d31f105738ee31088..0000000000000000000000000000000000000000 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_eu.properties +++ /dev/null @@ -1,4 +0,0 @@ -# This file is under the MIT License by authors - -Build_scheduled=Exekuzioa planifikatu da -Schedule_a_build=Eraikuntza antolatu\u003a {0} diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_fr.properties b/core/src/main/resources/hudson/views/BuildButtonColumn/column_fr.properties deleted file mode 100644 index 3ae8f854b6bec9a03d4fcd77e273ff5cd8529451..0000000000000000000000000000000000000000 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_fr.properties +++ /dev/null @@ -1,26 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Eric Lefevre-Ardant, Martin Eigenbrodt -# -# 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=Prochaines ex\u00E9cutions - -Schedule_a_build=Programmer une construction pour {0} -Schedule_a_build_with_parameters=Planifier une construction avec des param\u00E8tres pour {0} diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_ga_IE.properties b/core/src/main/resources/hudson/views/BuildButtonColumn/column_ga_IE.properties deleted file mode 100644 index 73e43fa66bc8d06d26a9d50ff73fe4c91daff831..0000000000000000000000000000000000000000 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_ga_IE.properties +++ /dev/null @@ -1,3 +0,0 @@ -# This file is under the MIT License by authors - -Schedule_a_build=Sceideal t\u00F3g\u00E1il\u003a {0} diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_he.properties b/core/src/main/resources/hudson/views/BuildButtonColumn/column_he.properties deleted file mode 100644 index 16e0cef6b33089b3cdab0503a2fb989206ef79d5..0000000000000000000000000000000000000000 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_he.properties +++ /dev/null @@ -1,25 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2010, Sun Microsystems, Inc. -# -# 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=\u05D1\u05E0\u05D9\u05D4 \u05DE\u05EA\u05D5\u05D6\u05DE\u05E0\u05EA -Schedule_a_build=\u05EA\u05D6\u05DE\u05DF \u05D1\u05E0\u05D9\u05D4\u003a {0} -Schedule_a_build_with_parameters=\u05EA\u05D6\u05DE\u05DF \u05D1\u05E0\u05D9\u05D4 \u05E2\u05DD \u05E4\u05E8\u05DE\u05D8\u05E8\u05D9\u05DD\u003a {0} diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_hi_IN.properties b/core/src/main/resources/hudson/views/BuildButtonColumn/column_hi_IN.properties deleted file mode 100644 index 5e60575fecb889c000853db8cad6763e6d6fc2f7..0000000000000000000000000000000000000000 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_hi_IN.properties +++ /dev/null @@ -1,3 +0,0 @@ -# This file is under the MIT License by authors - -Schedule_a_build=Build \u0915\u0940 \u0938\u092E\u092F \u0938\u093E\u0930\u0923\u0940 \u092C\u0928\u093E\u092F\u0947\u003a {0} diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_id.properties b/core/src/main/resources/hudson/views/BuildButtonColumn/column_id.properties deleted file mode 100644 index 72dbfb41f9c33a557e3e6dcd45843c301a0a0c98..0000000000000000000000000000000000000000 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_id.properties +++ /dev/null @@ -1,4 +0,0 @@ -# This file is under the MIT License by authors - -Build_scheduled=Pekerjaan terjadwal -Schedule_a_build=Jadwalkan pekerjaan\u003a {0} diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_it.properties b/core/src/main/resources/hudson/views/BuildButtonColumn/column_it.properties deleted file mode 100644 index 7f47abbc68a5209d242e840eda72742f3b12249c..0000000000000000000000000000000000000000 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_it.properties +++ /dev/null @@ -1,25 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2010, Sun Microsystems, Inc. -# -# 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 pianificata -Schedule_a_build=Pianifica una build per {0} -Schedule_a_build_with_parameters=Pianifica una build personalizzata per {0} diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_ja.properties b/core/src/main/resources/hudson/views/BuildButtonColumn/column_ja.properties deleted file mode 100644 index ba9f00f5dd46933e15599faf675d6aa924d91c5b..0000000000000000000000000000000000000000 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_ja.properties +++ /dev/null @@ -1,25 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2013, Sun Microsystems, Inc., Kohsuke Kawaguchi, Seiji Sogabe, id:cactusman, Martin Eigenbrodt -# -# 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. - -Schedule_a_build=\u30d3\u30eb\u30c9\u5b9f\u884c\u003a {0} -Schedule_a_build_with_parameters=\u30d1\u30e9\u30e1\u30fc\u30bf\u4ed8\u304d\u30d3\u30eb\u30c9\u5b9f\u884c\u003a {0} -Build_scheduled=\u30d3\u30eb\u30c9\u306f\u30b9\u30b1\u30b8\u30e5\u30fc\u30eb\u3055\u308c\u307e\u3057\u305f\u3002 diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_kn.properties b/core/src/main/resources/hudson/views/BuildButtonColumn/column_kn.properties deleted file mode 100644 index 3b703fea3d55c943beb6071f4ab1c196c438e344..0000000000000000000000000000000000000000 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_kn.properties +++ /dev/null @@ -1,4 +0,0 @@ -# This file is under the MIT License by authors - -Build_scheduled=\u0CA8\u0CBF\u0C97\u0CA6\u0CBF\u0CA4 \u0CA8\u0CBF\u0CB0\u0CCD\u0CAE\u0CBE\u0CA3 \u003a {0} -Schedule_a_build=\u0C92\u0C82\u0CA6\u0CC1 \u0CA8\u0CBF\u0CB0\u0CCD\u0CAE\u0CBE\u0CA3 \u0CB5\u0CC6\u0CD5\u0CB3\u0CBE\u0CAA\u0C9F\u0CCD\u0C9F\u0CBF\u003a {0} diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_ko.properties b/core/src/main/resources/hudson/views/BuildButtonColumn/column_ko.properties deleted file mode 100644 index d97a057e194cbde3fe9fff23cbac830a7c73185d..0000000000000000000000000000000000000000 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_ko.properties +++ /dev/null @@ -1,24 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Sung Kim, id:cactusman, Martin Eigenbrodt -# -# 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=\uBE4C\uB4DC\uAC00 \uC608\uC57D\uB418\uC5C8\uC2B5\uB2C8\uB2E4. -Schedule_a_build=\uBE4C\uB4DC \uC989\uC2DC \uC2E4\uD589\u003a {0} diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_lt.properties b/core/src/main/resources/hudson/views/BuildButtonColumn/column_lt.properties deleted file mode 100644 index 9194f2a4646082c2fb4b1dfc580b07563a72d705..0000000000000000000000000000000000000000 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_lt.properties +++ /dev/null @@ -1,25 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2010, Sun Microsystems, Inc. -# -# 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=U\u017Eduotis suplanuota -Schedule_a_build=Paruo\u0161ti vykdymui: {0} -#Schedule_a_build_with_parameters= diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_lv.properties b/core/src/main/resources/hudson/views/BuildButtonColumn/column_lv.properties deleted file mode 100644 index c539dc58807eca61a08d2feef3e296c319bf8c13..0000000000000000000000000000000000000000 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_lv.properties +++ /dev/null @@ -1,25 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2010, Sun Microsystems, Inc. -# -# 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 -Schedule_a_build=Iepl\u0101not b\u016Bv\u0113jumu\u003a {0} -Schedule_a_build_with_parameters=Iepl\u0101not parametriz\u0113tu b\u016Bv\u0113jumu\u003a {0} diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_mk.properties b/core/src/main/resources/hudson/views/BuildButtonColumn/column_mk.properties deleted file mode 100644 index f57328abaf96403e97a717c358ff4f0d719084b3..0000000000000000000000000000000000000000 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_mk.properties +++ /dev/null @@ -1,3 +0,0 @@ -# This file is under the MIT License by authors - -Schedule_a_build=\u0417\u0430\u043A\u0430\u0436\u0438 build-\u0430\u045A\u0435\u003a {0} diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_mr.properties b/core/src/main/resources/hudson/views/BuildButtonColumn/column_mr.properties deleted file mode 100644 index b29f7be1cd83b342f0777de2064a45298c893668..0000000000000000000000000000000000000000 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_mr.properties +++ /dev/null @@ -1,23 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2010, Sun Microsystems, Inc. -# -# 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. - -Schedule_a_build=\u092A\u0941\u0922\u0940\u0932 \u092C\u093E\u0902\u0927\u094D\u0915\u093E\u092E\u091A\u0940 \u0935\u0947\u0933 \u0920\u0930\u0935\u093E\u003a {0} diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_pl.properties b/core/src/main/resources/hudson/views/BuildButtonColumn/column_pl.properties deleted file mode 100644 index 3179ca1b18ec7ed99e425a39228c720f7c715387..0000000000000000000000000000000000000000 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_pl.properties +++ /dev/null @@ -1,25 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2010, Sun Microsystems, Inc. -# -# 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=Zadanie zosta\u0142o zaplanowane -Schedule_a_build=Dodaj zadanie do kolejki dla {0} -Schedule_a_build_with_parameters=Uruchom z parametrami dla {0} diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_pt_BR.properties b/core/src/main/resources/hudson/views/BuildButtonColumn/column_pt_BR.properties deleted file mode 100644 index 04959a2886aeaf07f7b4b90b51e70cba8a457400..0000000000000000000000000000000000000000 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_pt_BR.properties +++ /dev/null @@ -1,27 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, -# Reginaldo L. Russinholi, Martin Eigenbrodt, Cleiber Silva, Fernando Boaglio, -# Bruno Meneguello -# -# 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=Builds agendados -Schedule_a_build=Agendar um build\u003a {0} -Schedule_a_build_with_parameters=Agendar compila\u00e7\u00e3o com par\u00e2metros\u003a {0} diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_pt_PT.properties b/core/src/main/resources/hudson/views/BuildButtonColumn/column_pt_PT.properties deleted file mode 100644 index e23e3567c34574bbd4db8adc91cbaf7e4b45998f..0000000000000000000000000000000000000000 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_pt_PT.properties +++ /dev/null @@ -1,25 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2010, Sun Microsystems, Inc. -# -# 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=Compila\u00E7\u00E3o agendada -Schedule_a_build=Agendar uma compila\u00E7\u00E3o\u003a {0} -Schedule_a_build_with_parameters=Agendar compila\u00E7\u00E3o com par\u00E2metros\u003a {0} diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_ro.properties b/core/src/main/resources/hudson/views/BuildButtonColumn/column_ro.properties deleted file mode 100644 index b461a98be284a04e8b94e70b8596dc7de70168c8..0000000000000000000000000000000000000000 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_ro.properties +++ /dev/null @@ -1,24 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2010, Sun Microsystems, Inc. -# -# 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 -Schedule_a_build=Programeaz\u0103 un build pentru {0} diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_ru.properties b/core/src/main/resources/hudson/views/BuildButtonColumn/column_ru.properties deleted file mode 100644 index ff02568785e49052df923b06ff80ba034cf82332..0000000000000000000000000000000000000000 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_ru.properties +++ /dev/null @@ -1,27 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Mike Salnikov, Martin Eigenbrodt -# -# 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=\u0421\u0431\u043e\u0440\u043a\u0430 \u0437\u0430\u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0430 - -!!! NB Change my previsous translation of this field to this value!!! -Schedule_a_build=\u0417\u0430\u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0431\u043e\u0440\u043a\u0443\u003a {0} -Schedule_a_build_with_parameters=\u0417\u0430\u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0431\u043e\u0440\u043a\u0443 \u0441 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438\u003a {0} diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_sk.properties b/core/src/main/resources/hudson/views/BuildButtonColumn/column_sk.properties deleted file mode 100644 index 6dde922e369186590ddd1575badb80a1edd28f0d..0000000000000000000000000000000000000000 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_sk.properties +++ /dev/null @@ -1,25 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2010, Sun Microsystems, Inc. -# -# 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=Napl\u00E1novan\u00E9 zostavenia -Schedule_a_build=Napl\u00E1nuj zostavenie pre {0} -Schedule_a_build_with_parameters=Napl\u00E1nuj zostavenie s parametrami pre {0} diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_sr.properties b/core/src/main/resources/hudson/views/BuildButtonColumn/column_sr.properties deleted file mode 100644 index 98c763b42ce4280a77c7f6bec05e9523f67bb62a..0000000000000000000000000000000000000000 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_sr.properties +++ /dev/null @@ -1,4 +0,0 @@ -# This file is under the MIT License by authors - -Build_scheduled=Plan pokretanja -Schedule_a_build=Zaka\u017Ei gradnju \u0437\u0430 {0} diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_sv_SE.properties b/core/src/main/resources/hudson/views/BuildButtonColumn/column_sv_SE.properties deleted file mode 100644 index 1b20eb77db88c6a6b75b0c842c81f974fe589fc8..0000000000000000000000000000000000000000 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_sv_SE.properties +++ /dev/null @@ -1,25 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2010, Sun Microsystems, Inc. -# -# 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=Bygge schemalagt -Schedule_a_build=Schemal\u00E4gg ett bygge f\u00FCr {0} -Schedule_a_build_with_parameters=Schemal\u00E4gg ett bygge med parametrar f\u00FCr {0} diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_te.properties b/core/src/main/resources/hudson/views/BuildButtonColumn/column_te.properties deleted file mode 100644 index f8a5ebae595475d21e8e3821c4867c4e71040a76..0000000000000000000000000000000000000000 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_te.properties +++ /dev/null @@ -1,4 +0,0 @@ -# This file is under the MIT License by authors - -Build_scheduled=Build varusa kramamu lo unchabadinadi -Schedule_a_build=Build ni varusa kramamu lo pettumu\u003a {0} diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_tr.properties b/core/src/main/resources/hudson/views/BuildButtonColumn/column_tr.properties deleted file mode 100644 index bbfd79a2061fce1c60cc74a605778de8606565c2..0000000000000000000000000000000000000000 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_tr.properties +++ /dev/null @@ -1,25 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Oguz Dag, Martin Eigenbrodt -# -# 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=Yap\u0131land\u0131rma planland\u0131 -Schedule_a_build=Bir\ yap\u0131land\u0131rma\ planla\u003a {0} -Schedule_a_build_with_parameters=Parametreli yap\u0131land\u0131rma planla\u003a {0} diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_uk.properties b/core/src/main/resources/hudson/views/BuildButtonColumn/column_uk.properties deleted file mode 100644 index 506c29ee130434f7acae8cf752e4b59fd68f7572..0000000000000000000000000000000000000000 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_uk.properties +++ /dev/null @@ -1,24 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2010, Sun Microsystems, Inc. -# -# 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\u0431\u0456\u0440\u043A\u0438 \u0437\u0430\u043F\u043B\u0430\u043D\u043E\u0432\u0430\u043D\u0430 -Schedule_a_build=\u0417\u0430\u043F\u043B\u0430\u043D\u0443\u0432\u0430\u0442\u0438 \u043F\u043E\u0431\u0443\u0434\u043E\u0432\u0443\u003a {0} diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_zh_CN.properties b/core/src/main/resources/hudson/views/BuildButtonColumn/column_zh_CN.properties deleted file mode 100644 index c5222b638b6e2fff56fbeed2447e7bfa010ff4c8..0000000000000000000000000000000000000000 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_zh_CN.properties +++ /dev/null @@ -1,25 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2010, Sun Microsystems, Inc. -# -# 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=\u6784\u5EFA\u8BA1\u5212 -Schedule_a_build=\u8ba1\u5212\u4e00\u6b21\u6784\u5efa\u003a {0} -Schedule_a_build_with_parameters=\u8BA1\u5212\u4E00\u6B21\u5E26\u53C2\u6570\u7684\u6784\u5EFA\u003a {0} diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_zh_TW.properties b/core/src/main/resources/hudson/views/BuildButtonColumn/column_zh_TW.properties deleted file mode 100644 index fc76ede1fd470e2f550680499b5d1b8786293850..0000000000000000000000000000000000000000 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_zh_TW.properties +++ /dev/null @@ -1,25 +0,0 @@ -# The MIT License -# -# Copyright (c) 2004-2010, Sun Microsystems, Inc. -# -# 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. - -Schedule_a_build=\u6392\u7a0b\u5efa\u7f6e\u4f5c\u696d -Build_scheduled=\u5efa\u7f6e\u5df2\u52a0\u9032\u6392\u7a0b\u003a {0} -Schedule_a_build_with_parameters=\u53C3\u6578\u5316\u5EFA\u7F6E\u003a {0} diff --git a/core/src/main/resources/hudson/views/DefaultMyViewsTabBar/myViewTabs.jelly b/core/src/main/resources/hudson/views/DefaultMyViewsTabBar/myViewTabs.jelly index 10b55865f6aef2cf8ce977f243f4b32a87362a0c..e49686bf358c1081a0432af8452f4c83839d9002 100644 --- a/core/src/main/resources/hudson/views/DefaultMyViewsTabBar/myViewTabs.jelly +++ b/core/src/main/resources/hudson/views/DefaultMyViewsTabBar/myViewTabs.jelly @@ -26,8 +26,8 @@ THE SOFTWARE. - - + + - - + +
        - - + +
        diff --git a/core/src/main/resources/hudson/widgets/HistoryWidget/entry.properties b/core/src/main/resources/hudson/widgets/HistoryWidget/entry.properties new file mode 100644 index 0000000000000000000000000000000000000000..6aa3af4cc19b3750c49d1c803ab7b18c9f7551c5 --- /dev/null +++ b/core/src/main/resources/hudson/widgets/HistoryWidget/entry.properties @@ -0,0 +1 @@ +confirm=Are you sure you want to abort {0}? diff --git a/core/src/main/resources/hudson/widgets/HistoryWidget/entry_sr.properties b/core/src/main/resources/hudson/widgets/HistoryWidget/entry_sr.properties index 1695ebc85e80a6304df2939da855403a729a27c9..c44ac8dff6a868776511419ed5a3dcb34f6fb73f 100644 --- a/core/src/main/resources/hudson/widgets/HistoryWidget/entry_sr.properties +++ b/core/src/main/resources/hudson/widgets/HistoryWidget/entry_sr.properties @@ -1,3 +1,4 @@ # This file is under the MIT License by authors -Console\ Output=Konzolni Output +confirm=\u0414\u0430 \u043B\u0438 \u0436\u0435\u043B\u0438\u0442\u0435 \u0434\u0430 \u043E\u0442\u043A\u0430\u0436\u0435\u0442\u0435 \u043F\u043B\u0430\u043D\u0438\u0440\u0430\u043D\u0443 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0443 {0}? +Console\ Output=\u041A\u043E\u043D\u0437\u043E\u043B\u043D\u0438 \u0438\u0441\u0445\u043E\u0434 diff --git a/core/src/main/resources/hudson/widgets/HistoryWidget/index.jelly b/core/src/main/resources/hudson/widgets/HistoryWidget/index.jelly index fbb461b9ce3d87db46d140a2f3ac62271b7cb801..b4ffcd388584e4272b98c3f7f5e8980ac123fde4 100644 --- a/core/src/main/resources/hudson/widgets/HistoryWidget/index.jelly +++ b/core/src/main/resources/hudson/widgets/HistoryWidget/index.jelly @@ -119,6 +119,6 @@ THE SOFTWARE.
        diff --git a/core/src/main/resources/hudson/widgets/HistoryWidget/index_ca.properties b/core/src/main/resources/hudson/widgets/HistoryWidget/index_ca.properties index e1a3bacfbf3a5d0be7e7f48c80bd9f0fccd34580..6c691a2a9b12f215f37aefe30dbb798868ef6071 100644 --- a/core/src/main/resources/hudson/widgets/HistoryWidget/index_ca.properties +++ b/core/src/main/resources/hudson/widgets/HistoryWidget/index_ca.properties @@ -20,7 +20,7 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -More\ ...=Mes... +More\ ...=M\u00E9s... for\ all=per a tot for\ failures=per a les fallades trend=tend\u00E8ncia diff --git a/core/src/main/resources/hudson/widgets/HistoryWidget/index_pl.properties b/core/src/main/resources/hudson/widgets/HistoryWidget/index_pl.properties index 7e8a35df856c71e215874ffa6f21dc7ff53c1be8..5bae63c7f74bb45054f53d80c530100bcd74e5eb 100644 --- a/core/src/main/resources/hudson/widgets/HistoryWidget/index_pl.properties +++ b/core/src/main/resources/hudson/widgets/HistoryWidget/index_pl.properties @@ -1,6 +1,6 @@ # The MIT License # -# Copyright (c) 2004-2010, Sun Microsystems, Inc. +# Copyright (c) 2004-2016, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributors # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -20,6 +20,8 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -More\ ...=Wi\u0119cej ... for\ all=Dla wszystkich for\ failures=dla nieudanych +Clear=wyszy\u015B\u0107 +trend=trend +find=szukaj diff --git a/core/src/main/resources/hudson/widgets/HistoryWidget/index_sr.properties b/core/src/main/resources/hudson/widgets/HistoryWidget/index_sr.properties index 7c753aa453a0ccabfd8f3b3fb5961e6ac41ef2f3..f3e3827619ab97300caa7489638f81de77ba40d1 100644 --- a/core/src/main/resources/hudson/widgets/HistoryWidget/index_sr.properties +++ b/core/src/main/resources/hudson/widgets/HistoryWidget/index_sr.properties @@ -1,5 +1,8 @@ # This file is under the MIT License by authors -More\ ...=Vi\u0161e -for\ all=za sve -for\ failures=za otkaze +for\ all=\u0437\u0430 \u0441\u0432\u0435 +for\ failures=\u0437\u0430 \u043D\u0435\u0443\u0441\u043F\u0435\u0448\u043D\u0438\u0435 +trend=\u0442\u0440\u0435\u043D\u0434 +Clear=\u0418\u0437\u0431\u0440\u0438\u0448\u0438 +find=\u043F\u043E\u0442\u0440\u0430\u0436\u0438 +More\ ...=\u0412\u0438\u0448\u0435 diff --git a/core/src/main/resources/hudson/widgets/Messages_sr.properties b/core/src/main/resources/hudson/widgets/Messages_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..ba1355710a585afc9a6e407ad387c75a5b57172c --- /dev/null +++ b/core/src/main/resources/hudson/widgets/Messages_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +BuildHistoryWidget.DisplayName=\u0418\u0441\u0442\u043E\u0440\u0438\u0458\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 \ No newline at end of file diff --git a/core/src/main/resources/jenkins/diagnosis/HsErrPidList/index.properties b/core/src/main/resources/jenkins/diagnosis/HsErrPidList/index.properties index d7049c659a135c0a45262a3174162b47aaf79fa4..6417ea3d5b01d2c15a8cff54892b0923b2fb6317 100644 --- a/core/src/main/resources/jenkins/diagnosis/HsErrPidList/index.properties +++ b/core/src/main/resources/jenkins/diagnosis/HsErrPidList/index.properties @@ -1,5 +1,5 @@ blurb=The following JVM crash reports are found for this Jenkins instance. \ - If you think this is a problem in Jenkins, please
        report it. \ + If you think this is a problem in Jenkins, please report it. \ Jenkins relies on some heuristics to find these files. For more reliable discovery, please consider adding \ -XX:ErrorFile=/path/to/hs_err_pid%p.log as your JVM argument. ago={0} ago \ No newline at end of file diff --git a/core/src/main/resources/jenkins/diagnosis/HsErrPidList/index_ja.properties b/core/src/main/resources/jenkins/diagnosis/HsErrPidList/index_ja.properties index 87ab4dcf68d75edbd5c8e10bda7246a588754f53..5c8c783f41ec0744f90a091a419859524865b4e5 100644 --- a/core/src/main/resources/jenkins/diagnosis/HsErrPidList/index_ja.properties +++ b/core/src/main/resources/jenkins/diagnosis/HsErrPidList/index_ja.properties @@ -25,7 +25,7 @@ Name=\u540d\u524d Date=\u5e74\u6708\u65e5 Delete=\u524a\u9664 blurb=Jenkins\u306eJVM\u30af\u30e9\u30c3\u30b7\u30e5\u30ec\u30dd\u30fc\u30c8\u304c\u898b\u3064\u304b\u308a\u307e\u3057\u305f\u3002\ - Jenkins\u306e\u554f\u984c\u3067\u3042\u308c\u3070\u3001\u5831\u544a\u3057\u3066\u304f\u3060\u3055\u3044\u3002 \ + Jenkins\u306e\u554f\u984c\u3067\u3042\u308c\u3070\u3001\u5831\u544a\u3057\u3066\u304f\u3060\u3055\u3044\u3002 \ Jenkins relies on some heuristics to find these files. \u3088\u308a\u6b63\u78ba\u306b\u898b\u3064\u3051\u308b\u306b\u306f\u3001\ JVM\u30aa\u30d7\u30b7\u30e7\u30f3\u306b-XX:ErrorFile=/path/to/hs_err_pid%p.log\u3092\u8ffd\u52a0\u3057\u3066\u304f\u3060\u3055\u3044\u3002 ago={0} \u524d \ No newline at end of file diff --git a/core/src/main/resources/jenkins/diagnosis/HsErrPidList/index_lt.properties b/core/src/main/resources/jenkins/diagnosis/HsErrPidList/index_lt.properties index dbb4cf4fdd7a36b4b51cc5073b817eff4650eaf3..ee0f9a71063dc6cad3cb04c80247440e74f766ab 100644 --- a/core/src/main/resources/jenkins/diagnosis/HsErrPidList/index_lt.properties +++ b/core/src/main/resources/jenkins/diagnosis/HsErrPidList/index_lt.properties @@ -1,5 +1,5 @@ blurb=\u0160ios JVM l\u016b\u017eimo ataskaitos rastos \u0161iame Jenkinse. \ - Jei manote, kad problema Jenkinse, pra\u0161ome apie tai prane\u0161ti. \ + Jei manote, kad problema Jenkinse, pra\u0161ome apie tai prane\u0161ti. \ Jenkinsas remiasi heuristika ie\u0161kodamas \u0161i\u0173 fail\u0173. Patikimesniam aptikimui galite prid\u0117ti \ -XX:ErrorFile=/path/to/hs_err_pid%p.log kaip j\u016bs\u0173 JVM argument\u0105. ago=prie\u0161 {0} diff --git a/core/src/main/resources/jenkins/diagnosis/HsErrPidList/index_pt_BR.properties b/core/src/main/resources/jenkins/diagnosis/HsErrPidList/index_pt_BR.properties index 4a71982704b407f1d335951abd7c836eb034a34f..9015d61b2531b4c71093d88161fb065f5ab220de 100644 --- a/core/src/main/resources/jenkins/diagnosis/HsErrPidList/index_pt_BR.properties +++ b/core/src/main/resources/jenkins/diagnosis/HsErrPidList/index_pt_BR.properties @@ -21,11 +21,11 @@ # THE SOFTWARE. # The following JVM crash reports are found for this Jenkins instance. \ -# If you think this is a problem in Jenkins, please report it. \ +# If you think this is a problem in Jenkins, please report it. \ # Jenkins relies on some heuristics to find these files. For more reliable discovery, please consider adding \ # -XX:ErrorFile=/path/to/hs_err_pid%p.log as your JVM argument. blurb=Os seguintes relat\u00f3rios de erro da JVM foram encontrados para esta inst\u00e2ncia do Jenkins. \ - Caso voc\u00ea acredite que este seja um problema no Jenkins, por favor reporte. \ + Caso voc\u00ea acredite que este seja um problema no Jenkins, por favor reporte. \ O Jenkins depende de algumas heuristicas para encontrar estes arquivos. Para uma descoberta mais garantida, \ por favor considere adicionar -XX:ErrorFile=/caminho/para/hs_err_pid%p.log como argumento para sua JVM. Delete=Excluir diff --git a/core/src/main/resources/jenkins/diagnosis/HsErrPidList/index_sr.properties b/core/src/main/resources/jenkins/diagnosis/HsErrPidList/index_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..6e2c57314e7ce1f4e08fd7624809d6b2c5aae1ff --- /dev/null +++ b/core/src/main/resources/jenkins/diagnosis/HsErrPidList/index_sr.properties @@ -0,0 +1,11 @@ +# This file is under the MIT License by authors + +Java\ VM\ Crash\ Reports=\u0418\u0437\u0432\u0435\u0448\u0440\u0430\u0458\u0438 JVM \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0438\u043C\u0430 +blurb=\u041D\u0430\u0452\u0435\u043D\u0438 \u0441\u0443 \u0438\u0437\u0432\u0435\u0448\u0440\u0430\u0458\u0438 JVM \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0438\u043C\u0430 \u0437\u0430 \u043E\u0432\u0443 Jenkins \u043C\u0430\u0448\u0438\u043D\u0443. \ + \u0410\u043A\u043E \u043C\u0438\u0441\u043B\u0438\u0442\u0435 \u0434\u0430 \u0441\u0442\u0435 \u043D\u0430\u0448\u043B\u0438 \u043F\u0440\u043E\u0431\u043B\u0435\u043C \u0441\u0430 Jenkins-\u043E\u043C, \u043C\u043E\u043B\u0438\u043C\u043E \u043F\u0440\u0438\u0458\u0430\u0432\u0438 \u0433\u0430. \ + Jenkins \u043A\u043E\u0440\u0438\u0441\u0442\u0438 \u043D\u0435\u043A\u043E\u043B\u0438\u043A\u043E \u0445\u0435\u0443\u0440\u0438\u0441\u0442\u0438\u043A\u0435 \u0434\u0430 \u043F\u0440\u043E\u043D\u0430\u0452\u0435 \u043E\u0432\u0435 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0435. \u041A\u043E\u0440\u0438\u0441\u0442\u0438\u0442\u0435 JVM \u043E\u043F\u0446\u0438\u0458\u0443 \ + -XX:ErrorFile=/path/to/hs_err_pid%p.log \u0437\u0430 \u043F\u043E\u0443\u0437\u0434\u0430\u043D\u0438\u0458\u0435 \u043F\u0440\u0435\u0442\u0440\u0430\u0436\u0438\u0432\u0430\u045A\u0435. +Name=\u0418\u043C\u0435 +Date=\u0414\u0430\u0442\u0443\u043C +ago=\u043F\u0440\u0435 {0} +Delete=\u0418\u0437\u0431\u0440\u0438\u0448\u0438 diff --git a/core/src/main/resources/jenkins/diagnosis/HsErrPidList/message_sr.properties b/core/src/main/resources/jenkins/diagnosis/HsErrPidList/message_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..e58a04dbd01d60ed4bb092a05aaf7c46cefe7f86 --- /dev/null +++ b/core/src/main/resources/jenkins/diagnosis/HsErrPidList/message_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +blurb=Jenkins \u0458\u0435 \u043F\u0440\u0435\u0441\u0442\u0430\u043E \u0434\u0430 \u0440\u0430\u0434\u0438. \u041C\u043E\u043B\u0438\u043C\u043E \u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0430\u0458\u0442\u0435 \u0436\u0443\u0440\u043D\u0430\u043B. diff --git a/core/src/main/resources/jenkins/diagnostics/CompletedInitializationMonitor/message.jelly b/core/src/main/resources/jenkins/diagnostics/CompletedInitializationMonitor/message.jelly new file mode 100644 index 0000000000000000000000000000000000000000..585677dc13020d407bd4d424b36ef46d36f9dcea --- /dev/null +++ b/core/src/main/resources/jenkins/diagnostics/CompletedInitializationMonitor/message.jelly @@ -0,0 +1,11 @@ + + +
        + ${%Warning!} + ${%blurb(app.initLevel)} + ${%Example: usage of} @Initializer(after = InitMilestone.COMPLETED) ${%in a plugin} + (${%See documentation}). + ${%Please} ${%report a bug} ${%in the Jenkins bugtracker}. + +
        +
        diff --git a/core/src/main/resources/jenkins/diagnostics/CompletedInitializationMonitor/message.properties b/core/src/main/resources/jenkins/diagnostics/CompletedInitializationMonitor/message.properties new file mode 100644 index 0000000000000000000000000000000000000000..c34fa2df469d857f2db20092ca270de69aba3f5e --- /dev/null +++ b/core/src/main/resources/jenkins/diagnostics/CompletedInitializationMonitor/message.properties @@ -0,0 +1,6 @@ +blurb= Jenkins initialization has not reached the COMPLETED initialization milestone after the configuration reload. \ + Current state is: \"{0}\". \ + Such invalid state may cause undefined incorrect behavior of Jenkins plugins. \ + It is likely an issue with the jenkins initialization or reloading task graph. + + diff --git a/core/src/main/resources/jenkins/diagnostics/CompletedInitializationMonitor/message_sr.properties b/core/src/main/resources/jenkins/diagnostics/CompletedInitializationMonitor/message_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..8635ae34b570fad63316b5f00913409cf73df0e5 --- /dev/null +++ b/core/src/main/resources/jenkins/diagnostics/CompletedInitializationMonitor/message_sr.properties @@ -0,0 +1,12 @@ +# This file is under the MIT License by authors + +Warning!=\u0423\u043F\u043E\u0437\u043E\u0440\u0435\u045A\u0435! +blurb=\u0418\u043D\u0438\u0446\u0438\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u0458\u0430 Jenkins-\u0430 \u043D\u0438\u0458\u0435 \u0434\u043E\u0441\u0442\u0438\u0433\u043B\u043E \u0434\u043E \u0444\u0430\u0437\u0435 COMPLETED \u043F\u043E\u0441\u043B\u0435 \u043F\u043E\u043D\u043E\u0432\u043E\u0433 \u0443\u0447\u0438\u0442\u0430\u045A\u0435 \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430. \ + \u0422\u0440\u0435\u043D\u0443\u0442\u043D\u043E \u0441\u0442\u0430\u045A\u0435 \u0458\u0435: "{0}". \ + \u041E\u0432\u0430\u043A\u0432\u043E \u043D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u043D\u043E \u0441\u0442\u0430\u045A\u0435 \u043C\u043E\u0436\u0435 \u0434\u043E\u0432\u0435\u0441\u0442\u0438 \u0434\u043E \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0430 \u0441\u0430 Jenkins \u043C\u043E\u0434\u0443\u043B\u0438\u043C\u0430. \ + \u0412\u0435\u0440\u043E\u0432\u0430\u0442\u043D\u043E \u0438\u043C\u0430 \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0430 \u0441\u0430 \u0438\u043D\u0438\u0446\u0438\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u0458\u043E\u043C \u0438\u043B\u0438 \u0443\u0447\u0438\u0442\u0430\u045A\u0430 task graph. +Example\:\ usage\ of=\u041F\u0440\u0438\u043C\u0435\u0440: +in\ a\ plugin=\u0443 \u043C\u043E\u0434\u0443\u043B\u0438 +Please=\u041C\u043E\u043B\u0438\u043C\u043E \u0432\u0430\u0441, +report\ a\ bug=\u043F\u0440\u0438\u0432\u0430\u0458\u0438 \u0433\u0440\u0435\u0448\u043A\u0443 +in\ the\ Jenkins\ bugtracker=\u043D\u0430 \u0441\u0438\u0441\u0442\u0435\u043C \u0437\u0430 \u043F\u0440\u0430\u045B\u0435\u045A\u0435 \u0433\u0440\u0435\u0448\u0430\u043A\u0430 diff --git a/core/src/main/resources/jenkins/diagnostics/Messages.properties b/core/src/main/resources/jenkins/diagnostics/Messages.properties new file mode 100644 index 0000000000000000000000000000000000000000..38362ae234a080525b6e242188ddf4a589b5a575 --- /dev/null +++ b/core/src/main/resources/jenkins/diagnostics/Messages.properties @@ -0,0 +1,3 @@ +CompletedInitializationMonitor.DisplayName=Jenkins Initialization Monitor +SecurityIsOffMonitor.DisplayName=Disabled Security +URICheckEncodingMonitor.DisplayName=Check URI Encoding diff --git a/core/src/main/resources/jenkins/diagnostics/SecurityIsOffMonitor/message.properties b/core/src/main/resources/jenkins/diagnostics/SecurityIsOffMonitor/message.properties index 8f9e0d816eaade3d499cd136c6f1c51d3fe55d6d..2766958d4edf3b3820fdfe5aa7ca4748acf3a4ed 100644 --- a/core/src/main/resources/jenkins/diagnostics/SecurityIsOffMonitor/message.properties +++ b/core/src/main/resources/jenkins/diagnostics/SecurityIsOffMonitor/message.properties @@ -21,5 +21,5 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. # -blurb=Unsecured Jenkins allows anyone on the network to launch processes on your behalf. \ - Consider at least enabling authentication to discourage misuse. \ No newline at end of file +blurb=Jenkins is currently unsecured and allows anyone on the network to launch processes on your behalf. \ + It is recommended to set up security and to limit anonymous access even on private networks. diff --git a/core/src/main/resources/jenkins/diagnostics/SecurityIsOffMonitor/message_sr.properties b/core/src/main/resources/jenkins/diagnostics/SecurityIsOffMonitor/message_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..170a58076ae490438bdfecb49d5a763f8f8eaac3 --- /dev/null +++ b/core/src/main/resources/jenkins/diagnostics/SecurityIsOffMonitor/message_sr.properties @@ -0,0 +1,6 @@ +# This file is under the MIT License by authors + +Setup\ Security=\u041F\u043E\u0441\u0442\u0430\u0432\u0438 \u0431\u0435\u0437\u0431\u0435\u0434\u043D\u043E\u0441\u0442 +Dismiss=\u041E\u0442\u043A\u0430\u0436\u0438 +blurb=\u041D\u0435\u043E\u0431\u0435\u0437\u0431\u0435\u0436\u0435\u043D\u0435 \u0438\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u0435 Jenkins-\u0430 \u0434\u0430\u0458\u0435 \u0431\u0438\u043B\u043E \u043A\u043E\u043C\u0435 \u043D\u0430 \u043C\u0440\u0435\u0436\u0438 \u043F\u0440\u0438\u0441\u0442\u0443\u043F \u043F\u043E\u043A\u0440\u0435\u0442\u0430\u045A\u0443 \u0437\u0430\u0434\u0430\u0442\u0430\u043A\u0430. \ + \u0422\u0440\u0435\u0431\u0430\u043B\u043E \u0431\u0438 \u0431\u0430\u0440\u0435\u043C \u0443\u043A\u0459\u0443\u0447\u0438\u0442\u0438 \u0430\u0443\u0442\u0435\u043D\u0442\u0438\u043A\u0430\u0446\u0438\u0458\u0443 \u0434\u0430 \u0441\u0435 \u043F\u0440\u0435\u0447\u0438 \u0437\u043B\u043E\u0443\u043F\u043E\u0442\u0440\u0435\u0431\u0430. diff --git a/core/src/main/resources/jenkins/diagnostics/URICheckEncodingMonitor/message.jelly b/core/src/main/resources/jenkins/diagnostics/URICheckEncodingMonitor/message.jelly new file mode 100644 index 0000000000000000000000000000000000000000..cb5cb59c60f127dab585d1a9928f603e4e7736dd --- /dev/null +++ b/core/src/main/resources/jenkins/diagnostics/URICheckEncodingMonitor/message.jelly @@ -0,0 +1,16 @@ + + + + + + + diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_bg.properties b/core/src/main/resources/jenkins/install/SetupWizard/authenticate-security-token_pl.properties similarity index 52% rename from core/src/main/resources/hudson/views/BuildButtonColumn/column_bg.properties rename to core/src/main/resources/jenkins/install/SetupWizard/authenticate-security-token_pl.properties index c201dceb91173b32ca47f8b1894aaecd0aaad58e..4ec407750d0c5ce851aa4ccc5f268750c2bdaf55 100644 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_bg.properties +++ b/core/src/main/resources/jenkins/install/SetupWizard/authenticate-security-token_pl.properties @@ -1,6 +1,6 @@ # The MIT License # -# Bulgarian translation: Copyright (c) 2015, 2016, Alexander Shopov +# Copyright (c) 2017, Damian Szczepanik # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -19,10 +19,12 @@ # 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\u043e \u0438\u0437\u0433\u0440\u0430\u0436\u0434\u0430\u043d\u0435 -Schedule_a_build=\ - \u041d\u0430\u0441\u0440\u043e\u0447\u0432\u0430\u043d\u0435 \u043d\u0430 \u0438\u0437\u0433\u0440\u0430\u0436\u0434\u0430\u043d\u0435 \u043d\u0430 \u201e{0}\u201c -Schedule_a_build_with_parameters=\ - \u041d\u0430\u0441\u0440\u043e\u0447\u0432\u0430\u043d\u0435 \u043d\u0430 \u0438\u0437\u0433\u0440\u0430\u0436\u0434\u0430\u043d\u0435 \u043d\u0430 \u201e{0}\u201c \u0441 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438 +authenticate-security-token.getting.started=Zaczynamy +authenticate-security-token.unlock.jenkins=Odblokuj Jenkinsa +jenkins.install.findSecurityTokenMessage=Aby zapewni\u0107, \u017Ce Jenkins jest bezpiecznie uruchomiony przez administratora, \ +has\u0142o zosta\u0142o zapisane do pliku log\u00F3w (nie masz pewno\u015Bci, gdzie go znale\u017A\u0107?) oraz w pliku na serwerze:

        {0}

        +authenticate-security-token.copy.password=Skopiuj has\u0142o z jednej z powy\u017Cszych lokalizacji i wklej poni\u017Cej. +authenticate-security-token.error=B\u0142\u0105d: +authenticate-security-token.password.incorrect=Has\u0142o nie jest poprawne, sprawd\u017A ponownie celem wprowadzenia poprawnego has\u0142a +authenticate-security-token.password.administrator=Has\u0142o administratorskie: +authenticate-security-token.continue=Kontynuuj diff --git a/core/src/main/resources/jenkins/install/SetupWizard/authenticate-security-token_sr.properties b/core/src/main/resources/jenkins/install/SetupWizard/authenticate-security-token_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..de25ba64e87f38cb5ffd96d85d5c639c21989c86 --- /dev/null +++ b/core/src/main/resources/jenkins/install/SetupWizard/authenticate-security-token_sr.properties @@ -0,0 +1,11 @@ +# This file is under the MIT License by authors + +authenticate-security-token.getting.started=\u041F\u043E\u0447\u0435\u0442\u0430\u043A +authenticate-security-token.unlock.jenkins=\u041E\u0442\u043A\u0459\u0443\u0447\u0430\u0458 Jenkins +jenkins.install.findSecurityTokenMessage=\u0414\u0430 \u0431\u0443\u0434\u0435 \u0431\u0438\u043E \u043F\u0440\u0438\u0441\u0442\u0443\u043F Jenkins-\u0443 \u043E\u0431\u0435\u0437\u0431\u0435\u0452\u0435\u043D, \ +\u043B\u043E\u0437\u0438\u043D\u043A\u0430 \u0458\u0435 \u0431\u0438\u043B\u0430 \u0438\u0437\u043F\u0438\u0441\u0430\u043D\u0430 \u0436\u0443\u0440\u043D\u0430\u043B\u0443 (\u043D\u0438\u0441\u0442\u0435 \u0441\u0438\u0433\u0443\u0440\u043D\u0438 \u0433\u0434\u0435 \u0441\u0435 \u0442\u043E \u043D\u0430\u043B\u0430\u0437\u0438?) \u0438 \u0443 \u043E\u0432\u043E\u0458 \u0434\u0430\u0442\u043E\u0442\u0435\u0446\u0438 \u043D\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0443:

        {0}

        +authenticate-security-token.copy.password=\u041C\u043E\u043B\u0438\u043C\u043E \u0438\u0441\u043A\u043E\u043F\u0438\u0440\u0430\u0458\u0442\u0435 \u043B\u043E\u0437\u0438\u043D\u043A\u0443 \u0441\u0430 \u0458\u0435\u0434\u043D\u0443 \u043E\u0434 \u0442\u0438\u0445 \u043B\u043E\u043A\u0430\u0446\u0438\u0458\u0430 \u0438 \u0443\u0431\u0430\u0446\u0438\u0458\u0435 \u0443 \u043E\u0434\u0433\u043E\u0432\u0430\u0440\u0443\u0458\u0443\u045B\u0435 \u043F\u043E\u0459\u0435. +authenticate-security-token.error=\u0413\u0420\u0415\u0428\u041A\u0410: +authenticate-security-token.password.incorrect=\u041D\u0430\u0432\u0435\u0434\u0435\u043D\u0430 \u043B\u043E\u0437\u0438\u043D\u043A\u0430 \u0441\u0435 \u043D\u0435 \u043F\u043E\u043A\u043B\u0430\u043F\u0430, \u043C\u043E\u043B\u0438\u043C\u043E \u0432\u0430\u0441 \u043F\u043E\u0442\u0440\u0430\u0436\u0438\u0442\u0435 \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0443 \u0437\u0430 \u0442\u0430\u0447\u043D\u0443 \u043B\u043E\u0437\u0438\u043D\u043A\u0443. +authenticate-security-token.password.administrator=\u041B\u043E\u0437\u0438\u043D\u043A\u0430 \u0430\u0434\u043C\u0438\u043D\u0438\u0441\u0442\u0440\u0430\u0442\u043E\u0440\u0430 +authenticate-security-token.continue=\u041D\u0430\u0441\u0442\u0430\u0432\u0438 diff --git a/core/src/main/resources/jenkins/install/SetupWizard/proxy-configuration_sr.properties b/core/src/main/resources/jenkins/install/SetupWizard/proxy-configuration_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..c3ca81a7f1c20405ebe88161965fcb9a03089714 --- /dev/null +++ b/core/src/main/resources/jenkins/install/SetupWizard/proxy-configuration_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +HTTP\ Proxy\ Configuration=\u041F\u043E\u0441\u0442\u0430\u0432\u0459\u0430\u045A\u0435 HTTP Proxy-\u0430 diff --git a/core/src/main/resources/hudson/widgets/BuildHistoryWidget/entries_pl.properties b/core/src/main/resources/jenkins/install/SetupWizard/setupWizardFirstUser_pl.properties similarity index 91% rename from core/src/main/resources/hudson/widgets/BuildHistoryWidget/entries_pl.properties rename to core/src/main/resources/jenkins/install/SetupWizard/setupWizardFirstUser_pl.properties index e306eb89d1040bdf666dc8c0260347683941c378..12f565e07d090c594e0f62409dd084446bc762f8 100644 --- a/core/src/main/resources/hudson/widgets/BuildHistoryWidget/entries_pl.properties +++ b/core/src/main/resources/jenkins/install/SetupWizard/setupWizardFirstUser_pl.properties @@ -1,6 +1,6 @@ # The MIT License # -# Copyright (c) 2004-2010, Sun Microsystems, Inc. +# Copyright (c) 2017, Damian Szczepanik # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -19,6 +19,4 @@ # 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. - -cancel\ this\ build=anuluj build -pending=oczekiwanie +Create\ First\ Admin\ User=Stw\u00F3rz pierwszego administratora diff --git a/core/src/main/resources/jenkins/install/SetupWizard/setupWizardFirstUser_sr.properties b/core/src/main/resources/jenkins/install/SetupWizard/setupWizardFirstUser_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..6d39904f8d076c404ab83c42cb5462edb91c6c6a --- /dev/null +++ b/core/src/main/resources/jenkins/install/SetupWizard/setupWizardFirstUser_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Create\ First\ Admin\ User=\u041A\u0440\u0435\u0438\u0440\u0430\u0458\u0442\u0435 \u043F\u0440\u0432\u043E\u0433 \u0430\u0434\u043C\u0438\u043D\u0438\u0441\u0442\u0440\u0430\u0442\u043E\u0440\u0430 diff --git a/core/src/main/resources/jenkins/install/UpgradeWizard/client-scripts_sr.properties b/core/src/main/resources/jenkins/install/UpgradeWizard/client-scripts_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..454c68e0dde419df848047cf8263c38f8f1eb8b2 --- /dev/null +++ b/core/src/main/resources/jenkins/install/UpgradeWizard/client-scripts_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +msg.before=\u0414\u043E\u0431\u0440\u043E\u0434\u043E\u0448\u043B\u0438 \u043D\u0430 Jenkins 2!\u0020 +msg.link=\u0410\u0436\u0443\u0440\u0438\u0440\u0430\u0458 \u0441\u0430\u0434\u0430 +msg.after=\u0020 \u0434\u0430 \u0437\u0430\u0434\u043E\u0431\u0438\u0458\u0435\u0442\u0435 \u043D\u043E\u0432\u0435 \u043E\u0434\u043B\u0438\u043A\u0435 \ No newline at end of file diff --git a/core/src/main/resources/jenkins/install/pluginSetupWizard.properties b/core/src/main/resources/jenkins/install/pluginSetupWizard.properties index ef580f1a7a8b8110dec000a54e2c85daa7e3e240..1c2e7091802e81084d09001d495ba19188804170 100644 --- a/core/src/main/resources/jenkins/install/pluginSetupWizard.properties +++ b/core/src/main/resources/jenkins/install/pluginSetupWizard.properties @@ -10,29 +10,32 @@ installWizard_offline_title=Offline installWizard_offline_message=This Jenkins instance appears to be offline. \

        \ For information about installing Jenkins without an internet connection, see the \ -Offline Jenkins Installation Documentation.

        \ +Offline Jenkins Installation Documentation.

        \ You may choose to continue by configuring a proxy or skipping plugin installation. \

        installWizard_error_header=An error occurred installWizard_error_message=An error occurred during installation: installWizard_error_connection=Unable to connect to Jenkins +installWizard_error_restartNotSupported=Restart is not supported, please manually restart this instance installWizard_installCustom_title=Getting Started installWizard_installCustom_selectAll=All installWizard_installCustom_selectNone=None installWizard_installCustom_selectRecommended=Suggested installWizard_installCustom_selected=Selected installWizard_installCustom_dependenciesPrefix=Dependencies -installWizard_installCustom_pluginListDesc=Note that the full list of plugins is not shown here. Additional plugins can be installed in the Plugin Manager once the initial setup is complete. See the Wiki for more information. +installWizard_installCustom_pluginListDesc=Note that the full list of plugins is not shown here. Additional plugins can be installed in the Plugin Manager once the initial setup is complete. See the Wiki for more information. installWizard_goBack=Back installWizard_goInstall=Install installWizard_installing_title=Getting Started installWizard_installing_detailsLink=Details... installWizard_installComplete_title=Getting Started installWizard_installComplete_banner=Jenkins is ready! +installWizard_installComplete_bannerRestart=Jenkins is almost ready! installWizard_pluginsInstalled_message=Your plugin installations are complete. installWizard_installComplete_message=Your Jenkins setup is complete. installWizard_installComplete_finishButtonLabel=Start using Jenkins -installWizard_installComplete_restartRequiredMessage=Some plugins require Jenkins to be restarted. +installWizard_installComplete_installComplete_restartRequiredMessage=Your Jenkins setup is complete, but some plugins require Jenkins to be restarted. +installWizard_installComplete_installComplete_restartRequiredNotSupportedMessage=Your Jenkins setup is complete, but some plugins require Jenkins to be restarted and it appears this instance does not support an automated restart. Please manually restart your instance now to complete installation. installWizard_installComplete_restartLabel=Restart installWizard_installIncomplete_title=Resume Installation installWizard_installIncomplete_banner=Resume Installation diff --git a/core/src/main/resources/jenkins/install/pluginSetupWizard_fr.properties b/core/src/main/resources/jenkins/install/pluginSetupWizard_fr.properties index a4fdaf9bf909e2ab7bfe68c2548cd0f726df7412..9f95c1be1f35d04ba4fcca1bd475ed8b7ab7c82a 100644 --- a/core/src/main/resources/jenkins/install/pluginSetupWizard_fr.properties +++ b/core/src/main/resources/jenkins/install/pluginSetupWizard_fr.properties @@ -11,7 +11,7 @@ installWizard_offline_title=Hors-ligne installWizard_offline_message=Cette instance Jenkins a l\'air d\'\u00eatre hors-ligne. \

        \ Pour des informations relatives \u00e0 l\'installation de Jenkins sans acc\u00e8s Internet, voir la \ -Documentation \ +Documentation \ d'Installation hors-ligne de Jenkins.

        \ Vous pouvez continuer en configurant un serveur proxy ou en sautant l\'installation des plugins. \

        @@ -26,7 +26,7 @@ installWizard_installCustom_selected=S\u00e9lectionn\u00e9s installWizard_installCustom_dependenciesPrefix=D\u00e9pendances installWizard_installCustom_pluginListDesc=Notez que la liste compl\u00e8te des plugins n\'est pas affich\u00e9e ici. \ Des plugins additionnels peuvent \u00eatre install\u00e9s depuis le Plugin Manager une fois la \ -configuration initiale termin\u00e9e. Voir le Wiki pour plus d\'informations. +configuration initiale termin\u00e9e. Voir le Wiki pour plus d\'informations. installWizard_goBack=Retour installWizard_goInstall=Installer installWizard_installing_title=Installation en cours... diff --git a/core/src/main/resources/jenkins/install/pluginSetupWizard_lt.properties b/core/src/main/resources/jenkins/install/pluginSetupWizard_lt.properties index 37e1d4bef2d53a5f5f8db6fec233f98cbca2e594..5f7b5ec1fe8d94bf51fbb418946d240427ed7f6b 100644 --- a/core/src/main/resources/jenkins/install/pluginSetupWizard_lt.properties +++ b/core/src/main/resources/jenkins/install/pluginSetupWizard_lt.properties @@ -10,7 +10,7 @@ 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.

        \ +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 @@ -22,7 +22,7 @@ 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_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 diff --git a/core/src/main/resources/jenkins/install/pluginSetupWizard_sr.properties b/core/src/main/resources/jenkins/install/pluginSetupWizard_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..23f5e061f7baffdcf809f0a91e08330311bb156b --- /dev/null +++ b/core/src/main/resources/jenkins/install/pluginSetupWizard_sr.properties @@ -0,0 +1,74 @@ +# This file is under the MIT License by authors + +installWizard_welcomePanel_title=\u041F\u043E\u0447\u0435\u0442\u0430\u043A +installWizard_welcomePanel_banner=\u041F\u0440\u0438\u0440\u0435\u0434\u0438 Jenkins +installWizard_welcomePanel_message=\u041C\u043E\u0434\u0443\u043B\u0435 \u043F\u0440\u043E\u0448\u0438\u0440\u0443\u0458\u0443 \u0444\u0443\u043D\u043A\u0446\u0438\u043E\u043D\u0430\u043B\u043D\u043E\u0441\u0442 Jenkins-\u0430 \u0441\u0430 \u0434\u043E\u0434\u0430\u0442\u043D\u0438\u043C \u043E\u0434\u043B\u0438\u043A\u0430\u043C\u0430 \u043A\u043E\u0458\u0438 \u043F\u043E\u0434\u0440\u0436\u0430\u0432\u0430\u0458\u0443 \u0440\u0430\u0437\u043D\u0435 \u0443\u043F\u043E\u0442\u0440\u0435\u0431\u0435. +installWizard_jenkinsVersionTitle=Jenkins +installWizard_offline_title=\u0412\u0430\u043D \u043C\u0440\u0435\u0436\u0435 +installWizard_offline_message=Jenkins \u0442\u0440\u0435\u043D\u0443\u0442\u043D\u043E \u0440\u0430\u0434\u0438 \u0432\u0430\u043D \u043C\u0440\u0435\u0436\u0435.\ +

        \ +\u0414\u0430 \u0431\u0438 \u0441\u0442\u0435 \u0438\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u043B\u0438 Jenkins \u0431\u0435\u0437 \u0438\u043D\u0442\u0435\u0440\u043D\u0435\u0442 \u0432\u0435\u0437\u043E\u043C, \u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0430\u0458\u0442\u0435 \ +\u0412\u0430\u043D-\u043C\u0440\u0435\u0436\u043D\u0430 Jenkins \u0438\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u0430.

        \ +\u041C\u043E\u0436\u0435\u0442\u0435 \u043D\u0430\u0441\u0442\u0430\u0432\u0438\u0442\u0438 \u043F\u043E\u0441\u0442\u0430\u0432\u0459\u0430\u0458\u0443\u0447\u0438 proxy \u0438\u043B\u0438 \u043F\u0440\u0435\u0441\u043A\u0430\u043A\u0430\u045A\u0435\u043C \u0438\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u0438 \u043C\u043E\u0434\u0443\u043B\u0430. \ +

        +installWizard_error_header=\u0414\u043E\u0448\u043B\u043E \u0458\u0435 \u0434\u043E \u0433\u0440\u0435\u0448\u043A\u0435 +installWizard_error_message=\u0414\u043E\u0448\u043B\u043E \u0458\u0435 \u0434\u043E \u0433\u0440\u0435\u0448\u043A\u0435 \u0442\u043E\u043A\u043E\u043C \u0438\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u0435: +installWizard_error_connection=\u041D\u0438\u0458\u0435 \u043C\u043E\u0433\u0443\u045B\u0435 \u043F\u043E\u0432\u0435\u0437\u0430\u0442\u0438 \u0441\u0430 Jenkins-\u043E\u043C +installWizard_error_restartNotSupported=\u041F\u043E\u0448\u0442\u043E \u0430\u0443\u0442\u043E\u043C\u0430\u0442\u0441\u043A\u043E \u043F\u043E\u043D\u043E\u0432\u043E \u043F\u043E\u043A\u0440\u0435\u0442\u0430\u045A\u0435 \u043D\u0438\u0458\u0435 \u043F\u043E\u0434\u0440\u0436\u0430\u043D\u043E, \u043F\u043E\u043D\u043E\u0432\u043E \u043F\u043E\u043A\u0440\u0435\u043D\u0438\u0442\u0435 \u043C\u0430\u0448\u0438\u043D\u0443 \u0440\u0443\u0447\u043D\u043E. +installWizard_installCustom_title=\u041F\u043E\u0447\u0435\u0442\u0430\u043A +installWizard_installCustom_selectAll=\u0421\u0432\u0435 +installWizard_installCustom_selectNone=\u041D\u0438\u0448\u0442\u0430 +installWizard_installCustom_selectRecommended=\u041F\u0440\u0435\u0434\u043B\u043E\u0436\u0435\u043D\u043E +installWizard_installCustom_selected=\u0418\u0437\u0430\u0431\u0440\u0430\u043D\u043E +installWizard_installCustom_dependenciesPrefix=\u0417\u0430\u0432\u0438\u0441\u043D\u043E\u0441\u0442\u0438 +installWizard_installCustom_pluginListDesc=\u041A\u043E\u043C\u043F\u043B\u0435\u0442\u0430\u043D \u043D\u0438\u0437 \u043C\u043E\u0434\u0443\u043B\u0430 \u043D\u0438\u0458\u0435 \u043F\u0440\u0438\u043A\u0430\u0437\u0430\u043D\u043E. \u0414\u043E\u0434\u0430\u0442\u043D\u0435 \u043C\u043E\u0434\u0443\u043B\u0435 \u043C\u043E\u0433\u0443 \u0431\u0438\u0442\u0438 \u0438\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u043D\u0438 \u0441\u0430 \u0423\u043F\u0440\u0430\u0432\u0459\u0430\u0447\u0435\u043C \u043C\u043E\u0434\u0443\u043B\u0430. \u041F\u0440\u0435\u0433\u043B\u0435\u0434\u0430\u0458\u0442\u0435 \u0412\u0438\u043A\u0438 \u0437\u0430 \u0432\u0438\u0448\u0435 \u0434\u0435\u0442\u0430\u0459\u0430. +installWizard_goBack=\u041D\u0430\u0437\u0430\u0434 +installWizard_goInstall=\u0418\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u0458 +installWizard_installing_title=\u041F\u043E\u0447\u0435\u0442\u0430\u043A +installWizard_installing_detailsLink=\u0414\u0435\u0442\u0430\u0459\u0438... +installWizard_installComplete_title=\u041F\u043E\u0447\u0435\u0442\u0430\u043A +installWizard_installComplete_banner=Jenkins \u0458\u0435 \u0441\u043F\u0440\u0435\u043C\u0430\u043D! +installWizard_installComplete_bannerRestart=Jenkins \u0458\u0435 \u0441\u043A\u043E\u0440\u043E \u0441\u043F\u0440\u0435\u043C\u0430\u043D! +installWizard_pluginsInstalled_message=\u0418\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u0430 \u043C\u043E\u0434\u0443\u043B\u0430 \u0458\u0435 \u0433\u043E\u0442\u043E\u0432\u043E. +installWizard_installComplete_message=\u0418\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u0430 Jenkins-\u0430 \u0458\u0435 \u0433\u043E\u0442\u043E\u0432\u043E. +installWizard_installComplete_finishButtonLabel=\u041F\u043E\u0447\u043D\u0438\u0442\u0435 \u0434\u0430 \u043A\u043E\u0440\u0438\u0441\u0442\u0438\u0442\u0435 Jenkins +installWizard_installComplete_installComplete_restartRequiredMessage=\u0418\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u0430 Jenkins-\u0430 \u0458\u0435 \u0433\u043E\u0442\u043E\u0432\u043E, \u043C\u0435\u0452\u0443\u0442\u0438\u043C \u043D\u0435\u043A\u0435 \u043C\u043E\u0434\u0443\u043B\u0435 \u0442\u0440\u0430\u0436\u0435 \u0434\u0430 \u0441\u0435 \u043F\u043E\u043D\u043E\u0432\u043E \u043F\u043E\u043A\u0435\u0440\u0435\u043D\u0435 Jenkins. +installWizard_installComplete_installComplete_restartRequiredNotSupportedMessage=\u0418\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u0430 Jenkins-\u0430 \u0458\u0435 \u0433\u043E\u0442\u043E\u0432\u043E, \u043C\u0435\u0452\u0443\u0442\u0438\u043C \u043D\u0435\u043A\u0435 \u043C\u043E\u0434\u0443\u043B\u0435 \u0442\u0440\u0430\u0436\u0435 \u0434\u0430 \u0441\u0435 \u043F\u043E\u043D\u043E\u0432\u043E \u043F\u043E\u043A\u0435\u0440\u0435\u043D\u0435 Jenkins. \u041F\u043E\u0448\u0442\u043E \u0430\u0443\u0442\u043E\u043C\u0430\u0442\u0441\u043A\u043E \u043F\u043E\u043D\u043E\u0432\u043E \u043F\u043E\u043A\u0440\u0435\u0442\u0430\u045A\u0435 \u043D\u0438\u0458\u0435 \u043F\u043E\u0434\u0440\u0436\u0430\u043D\u043E, \u043F\u043E\u043D\u043E\u0432\u043E \u043F\u043E\u043A\u0440\u0435\u043D\u0438\u0442\u0435 \u043C\u0430\u0448\u0438\u043D\u0443 \u0440\u0443\u0447\u043D\u043E. +installWizard_installComplete_restartRequiredMessage=\u041D\u0435\u043A\u0435 \u043C\u043E\u0434\u0443\u043B\u0435 \u0442\u0440\u0430\u0436\u0435 \u0434\u0430 \u0441\u0435 \u043F\u043E\u043D\u043E\u0432\u043E \u043F\u043E\u043A\u0435\u0440\u0435\u043D\u0435 Jenkins. +installWizard_installComplete_restartLabel=\u041F\u043E\u043A\u0440\u0435\u043D\u0438 \u043F\u043E\u043D\u043E\u0432\u043E +installWizard_installIncomplete_title=\u041D\u0430\u0441\u0442\u0430\u0432\u0438 \u0441\u0430 \u0438\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u043E\u043C +installWizard_installIncomplete_banner=\u041D\u0430\u0441\u0442\u0430\u0432\u0438 \u0441\u0430 \u0438\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u043E\u043C +installWizard_installIncomplete_message= +installWizard_saveFirstUser=\u0421\u0430\u0447\u0443\u0432\u0430\u0458 \u0438 \u043D\u0430\u0441\u0442\u0430\u0432\u0438 +installWizard_skipFirstUser=\u041D\u0430\u0441\u0442\u0430\u0432\u0438 \u0441\u0430 \u0430\u0434\u043C\u0438\u043D\u0438\u0441\u0442\u0440\u0430\u0442\u043E\u0440\u0441\u043A\u0438\u043C \u043D\u0430\u043B\u043E\u0433\u043E\u043C +installWizard_firstUserSkippedMessage=
        \ +\u041F\u0440\u0435\u0441\u043A\u043E\u0447\u0438\u043B\u0438 \u0441\u0442\u0435 \u043A\u0440\u0435\u0438\u0440\u0430\u045A\u0435\u043C \u0430\u0434\u043C\u0438\u043D\u0438\u0441\u0442\u0440\u0430\u0442\u0438\u0432\u043E\u0433 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u043A\u0430. \u041F\u0440\u0438\u0458\u0430\u0432\u0438\u0442\u0435 \u0441\u0435 \u043A\u0430\u043A\u043E \u0448\u0442\u043E \u045B\u0435 \u0442\u0435 \u043A\u043E\u0440\u0438\u0441\u0442\u0438\u0442\u0438 \u0438\u043C\u0435: 'admin' \u0438 \u043B\u043E\u0437\u0438\u043D\u043A\u0443 \u043A\u043E\u0458\u0443 \u0441\u0442\u0435 \u043A\u043E\u0440\u0438\u0441\u0442\u0438\u043B\u0438 \u0438\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u043E\u043C.\ +
        +installWizard_addFirstUser_title=\u041F\u043E\u0447\u0435\u0442\u0430\u043A +installWizard_configureProxy_label=\u041F\u043E\u0441\u0442\u0430\u0432\u0438 Proxy \u0441\u0435\u0440\u0432\u0435\u0440 +installWizard_configureProxy_save= +installWizard_gettingStarted_title= +installWizard_saveSecurity=\u0421\u0430\u0447\u0443\u0432\u0430\u0458 \u0438 \u043D\u0430\u0441\u0442\u0430\u0432\u0438 +installWizard_skipPluginInstallations=\u041F\u0440\u0435\u0441\u043A\u043E\u0447\u0438 \u0438\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u0443 \u043C\u043E\u0434\u0443\u043B\u0430 +installWizard_installIncomplete_dependenciesLabel=\u0417\u0430\u0432\u0438\u0441\u043D\u043E\u0441\u0442\u0438 +installWizard_installingConsole_dependencyIndicatorNote=** - \u043F\u043E\u0442\u0440\u0435\u0431\u043D\u0430 \u0437\u0430\u0432\u0438\u0441\u043D\u043E\u0441\u0442 +installWizard_websiteLinkLabel=\u0421\u0442\u0440\u0430\u043D\u0438\u0446\u0430 +installWizard_pluginInstallFailure_title=\u0413\u0440\u0435\u0448\u043A\u0435 \u0438\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u043E\u043C +installWizard_pluginInstallFailure_message=\u041D\u0435\u043A\u0435 \u043C\u043E\u0434\u0443\u043B\u0435 \u043D\u0438\u0441\u0443 \u0443\u0441\u043F\u0435\u0448\u043D\u043E \u0438\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u043D\u0435. \u041C\u043E\u0436\u0435\u0442\u0435 \u043F\u043E\u043A\u0443\u0448\u0430\u0442\u0438 \u043F\u043E\u043D\u043E\u0432\u043E \u0434\u0430 \u0438\u0445 \u0438\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u0442\u0435 \u0438\u043B\u0438 \u043D\u0430\u0441\u0442\u0430\u0432\u0438\u0442\u0438. +installWizard_continue=\u041D\u0430\u0441\u0442\u0430\u0432\u0438 +installWizard_retry=\u041F\u043E\u043A\u0443\u0448\u0430\u0458 \u043F\u043E\u043D\u043E\u0432\u043E +installWizard_upgradePanel_title=\u0410\u0436\u0443\u0440\u0438\u0440\u0430\u0458 +installWizard_upgradePanel_banner=\u0414\u043E\u0431\u0440\u043E\u0434\u043E\u0448\u043B\u0438 \u043D\u0430 Jenkins {0}! +installWizard_upgradePanel_message=Jenkins {0} \u0438\u043C\u0430 \u043D\u0435\u043A\u0435 \u043E\u0434\u043B\u0438\u0447\u043D\u0435 \u043D\u043E\u0432\u0435 \u043E\u0434\u043B\u0438\u043Ae \u043A\u043E\u0458\u0435 \u043C\u0438\u0441\u043B\u0438\u043C\u043E \u0434\u0430 \u0432\u0430\u043C \u045B\u0435 \u0441\u0435 \u0441\u0432\u0438\u0452\u0430\u0442\u0438. \u0418\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u0458\u0442\u0435 \u043E\u0432\u0435 \u0434\u043E\u0434\u0430\u0442\u043D\u0435 \u043C\u043E\u0434\u0443\u043B\u0435 \u0448\u0442\u043E \u043F\u0440\u0435! +installWizard_upgradePanel_skipRecommendedPlugins=\u041D\u0435 \u0445\u0432\u0430\u043B\u0430 +installWizard_upgradeComplete_title=\u0410\u0436\u0443\u0440\u0438\u0440\u0430\u0458 +installWizard_pluginsInstalled_banner=\u0414\u043E\u0431\u0440\u043E\u0434\u043E\u0448\u043B\u0438 \u043D\u0430 Jenkins {0}! +installWizard_upgradeComplete_message=\u0427\u0435\u0441\u0442\u0438\u0442\u0430\u043C\u043E! \u0410\u0436\u0443\u0440\u0438\u0440\u0430\u043B\u0438 \u0441\u0442\u0435 Jenkins \u043D\u0430 \u0432\u0435\u0440\u0437\u0438\u0458\u0443 {0}.

        \u041F\u0440\u043E\u0447\u0438\u0442\u0430\u0458\u0442\u0435 \u0458\u043E\u0448 \u043D\u0430 Jenkins \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0438! +installWizard_upgradeSkipped_title=\u0410\u0436\u0443\u0440\u0438\u0440\u0430\u0458 +installWizard_upgradeSkipped_banner=\u041E\u0434\u043B\u0438\u043A\u0435 \u043A\u043E\u0458\u0435 \u043D\u0438\u0441\u0443 \u0438\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u043D\u0435 +installWizard_upgradeSkipped_message=

        \u043F\u0440\u0435\u0434\u043B\u043E\u0436\u0438\u0435 \u043C\u043E\u0434\u0443\u043B\u0435 \u043D\u0435\u045B\u0435 \u0431\u0438\u0442\u0438 \u0438\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u043D\u0435.
        \ +

        \u0410\u043A\u043E \u0441\u0442\u0435 \u043F\u0440\u0435\u0434\u043E\u043C\u0438\u0441\u043B\u0438\u0442\u0435, \u043C\u043E\u0436\u0435\u0442\u0435 \u0438\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u0442\u0438 \u043D\u043E\u0432\u0435 \u043C\u043E\u0434\u0443\u043B\u0435 \u0441\u0430 \u0423\u043F\u0440\u0430\u0432\u0459\u0430\u0447\u0435\u043C \u043C\u043E\u0434\u0443\u043B\u0430.

        \ +

        \u041F\u0440\u043E\u0447\u0438\u0442\u0430\u0458\u0442\u0435 \u043A\u0430\u043A\u043E \u043C\u043E\u0434\u0443\u043B\u0435 \u0443\u0441\u0430\u0432\u0440\u0448\u0430\u0432\u0430\u0458\u0443 Jenkins \ +\u043D\u0430 Jenkins \u0441\u0442\u0430\u043D\u0438\u0446\u0438.

        +installWizard_upgrading_title=\u0418\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u045A\u0435 \u043C\u043E\u0434\u0443\u043B\u0430 +installWizard_upgradeComplete_finishButtonLabel=\u0417\u0430\u0432\u0440\u0448\u0438 \ No newline at end of file diff --git a/core/src/main/resources/jenkins/management/AdministrativeMonitorsConfiguration/config.groovy b/core/src/main/resources/jenkins/management/AdministrativeMonitorsConfiguration/config.groovy new file mode 100644 index 0000000000000000000000000000000000000000..45d24deae4f9f11334579430f2eb41ce5b4364a7 --- /dev/null +++ b/core/src/main/resources/jenkins/management/AdministrativeMonitorsConfiguration/config.groovy @@ -0,0 +1,55 @@ +/* + * The MIT License + * + * Copyright (c) 2016, CloudBees, Inc. + * + * 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.management.AdministrativeMonitorsConfiguration + +import hudson.model.AdministrativeMonitor + +f = namespace(lib.FormTagLib) +st = namespace("jelly:stapler") + +f.section(title: _("Administrative monitors configuration")) { + f.advanced(title: _("Administrative monitors")) { + f.entry(title: _("Enabled administrative monitors")) { + p(_("blurb")) + table(width: "100%") { + for (AdministrativeMonitor am : AdministrativeMonitor.all()) { + f.block() { + f.checkbox(name: "administrativeMonitor", + title: am.displayName, + checked: am.enabled, + json: am.id); + } + tr() { + td(colspan: "2"); + td(class: "setting-description") { + st.include(from: am, page: "description", optional: true); + } + td(); + } + } + } + } + } +} diff --git a/core/src/main/resources/jenkins/management/AdministrativeMonitorsConfiguration/config.properties b/core/src/main/resources/jenkins/management/AdministrativeMonitorsConfiguration/config.properties new file mode 100644 index 0000000000000000000000000000000000000000..84ba3c092b5ec94e17892b0ac16c800ee37184e6 --- /dev/null +++ b/core/src/main/resources/jenkins/management/AdministrativeMonitorsConfiguration/config.properties @@ -0,0 +1,5 @@ +blurb = Administrative monitors are warnings shown to Jenkins administrators \ + about the state of the Jenkins instance. It is generally strongly \ + recommended to keep all administrative monitors enabled, but if you are \ + not interested in specific warnings, uncheck them here to permanently \ + hide them. diff --git a/core/src/main/resources/jenkins/management/AdministrativeMonitorsDecorator/footer.jelly b/core/src/main/resources/jenkins/management/AdministrativeMonitorsDecorator/footer.jelly new file mode 100644 index 0000000000000000000000000000000000000000..c4809218dec257646ce9985d08ce84fb10a3dd5f --- /dev/null +++ b/core/src/main/resources/jenkins/management/AdministrativeMonitorsDecorator/footer.jelly @@ -0,0 +1,47 @@ + + + + + + + + + diff --git a/core/src/main/resources/jenkins/management/AdministrativeMonitorsDecorator/footer.properties b/core/src/main/resources/jenkins/management/AdministrativeMonitorsDecorator/footer.properties new file mode 100644 index 0000000000000000000000000000000000000000..60f6fe569480c5a58b2b391b1c5c96d075c485c8 --- /dev/null +++ b/core/src/main/resources/jenkins/management/AdministrativeMonitorsDecorator/footer.properties @@ -0,0 +1 @@ +tooltip=There are {0} active administrative monitors. \ No newline at end of file diff --git a/core/src/main/resources/jenkins/management/AdministrativeMonitorsDecorator/footer_pl.properties b/core/src/main/resources/jenkins/management/AdministrativeMonitorsDecorator/footer_pl.properties new file mode 100644 index 0000000000000000000000000000000000000000..573e01739bfdfa934251810fa442ca83717d0040 --- /dev/null +++ b/core/src/main/resources/jenkins/management/AdministrativeMonitorsDecorator/footer_pl.properties @@ -0,0 +1,24 @@ +# The MIT License +# +# Copyright (c) 2016-2017, Damian Szczepanik +# +# 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. +# There are {0} active administrative monitors. +tooltip=Znaleziono {0} aktywnych powiadomie\u0144 dla administrator\u00F3w +Manage\ Jenkins=Zarz\u0105dzaj Jenkinsem diff --git a/core/src/main/resources/jenkins/management/AdministrativeMonitorsDecorator/resources.css b/core/src/main/resources/jenkins/management/AdministrativeMonitorsDecorator/resources.css new file mode 100644 index 0000000000000000000000000000000000000000..21aad475e01a8b3548446f09f89c929633250ddd --- /dev/null +++ b/core/src/main/resources/jenkins/management/AdministrativeMonitorsDecorator/resources.css @@ -0,0 +1,70 @@ +#visible-am-container { + float: right; +} +#visible-am-button { + text-align: center; + font-size: 20px; + font-weight: bold; + background-color: #e01716; + color: #fff;; + margin: 0; + line-height: 40px; + text-decoration: none; + min-width: 2em; + display: inline-block; + position: relative; + transition: all .1s; +} +#visible-am-button:hover, #visible-am-button:focus, #visible-am-button:active { + background: #e23635; +} +#visible-am-container.visible #visible-am-button { + box-shadow: inset 0px 1px 14px rgba(0,0,0,.5); +} +#visible-am-container div#visible-am-list { + position: absolute; + top: 35px; + right: 2%; + margin-left:2%; + height: auto; + z-index: 0; + padding: 2em; + border: 1px solid #aa; + text-align: left; + display: block; + background-color: #fff; + border-radius: 5px; + box-shadow: 0 7px 20px rgba(0,0,0,.1); + transition: all .15s cubic-bezier(.84,.03,.21,.96); + opacity: 0; + transform: scale(0); +} +#visible-am-container.visible div#visible-am-list { + opacity: 1; + transform: scale(1); + z-index: 1000; +} +#visible-am-container #visible-am-button:after { + content: ''; + display: inline-block; + position: absolute; + bottom: -5px; + left: 32%; + width: 0; + height: 0; + border-left: 7px solid transparent; + border-right: 7px solid transparent; + border-bottom: 7px solid #fff; + opacity: 0; + transition: all .05s; +} +#visible-am-container.visible #visible-am-button:after { + opacity: 1; + bottom: 4px; + transition: all .25s; +} +#visible-am-container .am-message { + display: block; + line-height: 1.4em; + margin-bottom: 1.4em; +} \ No newline at end of file diff --git a/core/src/main/resources/jenkins/management/AdministrativeMonitorsDecorator/resources.js b/core/src/main/resources/jenkins/management/AdministrativeMonitorsDecorator/resources.js new file mode 100644 index 0000000000000000000000000000000000000000..a11957cfea9b6c21110dca0a74d70437d7487edf --- /dev/null +++ b/core/src/main/resources/jenkins/management/AdministrativeMonitorsDecorator/resources.js @@ -0,0 +1,39 @@ +function amCloser(e) { + var list = document.getElementById('visible-am-list'); + var el = e.target; + while (el) { + if (el === list) { + return; // clicked in the list + } + el = el.parentElement; + } + hideVisibleAmList(); +}; +function amEscCloser(e) { + if (e.keyCode == 27) { + amCloser(e); + } +}; +function amContainer() { + return document.getElementById('visible-am-container'); +}; +function hideVisibleAmList(e) { + amContainer().classList.remove('visible'); + document.removeEventListener('click', amCloser); + document.removeEventListener('keydown', amEscCloser); +} +function showVisibleAmList(e) { + amContainer().classList.add('visible'); + setTimeout(function() { + document.addEventListener('click', amCloser); + document.addEventListener('keydown', amEscCloser); + }, 1); +} +function toggleVisibleAmList(e) { + if (amContainer().classList.contains('visible')) { + hideVisibleAmList(e); + } else { + showVisibleAmList(e); + } + e.preventDefault(); +} \ No newline at end of file diff --git a/core/src/main/resources/jenkins/management/Messages.properties b/core/src/main/resources/jenkins/management/Messages.properties index ff1761da0f5e5e58846981e55ea041e7b3d8f8a9..9913ab66d28ffbf30f008a5b5359ce374ac5941e 100644 --- a/core/src/main/resources/jenkins/management/Messages.properties +++ b/core/src/main/resources/jenkins/management/Messages.properties @@ -56,3 +56,5 @@ NodesLink.Description=Add, remove, control and monitor the various nodes that Je ShutdownLink.DisplayName_prepare=Prepare for Shutdown ShutdownLink.DisplayName_cancel=Cancel Shutdown ShutdownLink.Description=Stops executing new builds, so that the system can be eventually shut down safely. + +AdministrativeMonitorsDecorator.DisplayName=Administrative Monitors Notifier diff --git a/core/src/main/resources/jenkins/management/Messages_pl.properties b/core/src/main/resources/jenkins/management/Messages_pl.properties index 0193fb3c76e90c6b8783d405e786fcca88ddd5d2..bae564f04c786bfad970ece5f1698f9cf87b9231 100644 --- a/core/src/main/resources/jenkins/management/Messages_pl.properties +++ b/core/src/main/resources/jenkins/management/Messages_pl.properties @@ -1,7 +1,6 @@ -# # The MIT License # -# Copyright (c) 2012, CloudBees, Intl., Nicolas De loof +# Copyright (c) 2012-2016, CloudBees, Intl., Nicolas De loof, Damian Szczepanik # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -20,7 +19,6 @@ # 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. -# ConfigureLink.DisplayName=Skonfiguruj system ConfigureLink.Description=Konfiguruj ustawienia globalne i \u015Bcie\u017Cki. @@ -53,3 +51,7 @@ NodesLink.Description=Dodawaj, usuwaj, kontroluj i monitoruj r\u00F3\u017Cne w\u ShutdownLink.DisplayName_prepare=Przygotuj do wy\u0142\u0105czenia ShutdownLink.DisplayName_cancel=Anuluj wy\u0142\u0105czenie ShutdownLink.Description=Zatrzyma wykonanie nowych build\u00F3w, tak by system m\u00F3g\u0142by\u0107 bezpiecznie wy\u0142\u0105czony. +# Global Tool Configuration +ConfigureTools.DisplayName=Globalne narz\u0119dzia do konfiguracji +# Configure tools, their locations and automatic installers. +ConfigureTools.Description=Konfiguruj narz\u0119dzia, \u015Bcie\u017Cki do nich i automatyczne instalatory diff --git a/core/src/main/resources/jenkins/management/Messages_sr.properties b/core/src/main/resources/jenkins/management/Messages_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..276429a4ad27305c3a32f57347b9c36813092206 --- /dev/null +++ b/core/src/main/resources/jenkins/management/Messages_sr.properties @@ -0,0 +1,26 @@ +# This file is under the MIT License by authors + +ConfigureLink.DisplayName=\u041F\u043E\u0441\u0442\u0430\u0432\u0438 \u0441\u0438\u0441\u0442\u0435\u043C\u0441\u043A\u0430 \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 +ConfigureLink.Description=\u041E\u0431\u0448\u0442\u0430 \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 \u0438 \u043F\u0443\u0442\u0435\u0432\u0438. +ConfigureTools.DisplayName=\u041E\u0431\u0448\u0442\u0435 \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0435 \u0430\u043B\u0430\u0442\u0430 +ConfigureTools.Description=\u041F\u043E\u0441\u0442\u0430\u0432\u0438 \u0430\u043B\u0430\u0442\u0435, \u043B\u043E\u043A\u0430\u0446\u0438\u0458\u0435, \u0438 \u0430\u0443\u0442\u043E\u043C\u0430\u0442\u0441\u043A\u0443 \u0438\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u0458\u0443 +ReloadLink.DisplayName=\u041F\u043E\u043D\u043E\u0432\u043E \u0443\u0447\u0438\u0442\u0430\u0458 \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 \u0441\u0430 \u0434\u0438\u0441\u043A\u0430 +ReloadLink.Description=\u0418\u0437\u0431\u0440\u0438\u0448\u0438 \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 \u0441\u0430 \u043C\u0435\u043C\u043E\u0440\u0438\u0458\u0435 \u0438 \u0443\u0447\u0438\u0442\u0430\u0458 \u0441\u0430 \u0434\u0438\u0441\u043A\u0430.\n \u041A\u043E\u0440\u0438\u0441\u043D\u043E \u043A\u0430\u0434\u0430 \u0441\u0442\u0435 \u043F\u0440\u043E\u043C\u0435\u043D\u0438\u043B\u0438 \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 \u0434\u0438\u0440\u0435\u043A\u0442\u043D\u043E \u043D\u0430 \u0434\u0438\u0441\u043A\u0443. +PluginsLink.Description=\u0414\u043E\u0434\u0430\u0458\u0442\u0435, \u0443\u043A\u043B\u043E\u043D\u0438\u0442\u0435, \u0438\u043B\u0438 \u043E\u043D\u0435\u043C\u043E\u0433\u0443\u045B\u0438\u0442\u0435 \u043C\u043E\u0434\u0443\u043B\u0435 \u043A\u043E\u0458\u0435 \u043F\u0440\u043E\u0448\u0438\u0440\u0443\u0458\u0443 \u043C\u043E\u0433\u0443\u045B\u043D\u043E\u0441\u0442\u0435 Jenkins-\u0430. +PluginsLink.DisplayName=\u041F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0435 \u043C\u043E\u0434\u0443\u043B\u0430 +SystemInfoLink.DisplayName=\u0418\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0458\u0435 \u043E \u0441\u0438\u0441\u0442\u0435\u043C\u0443 +SystemInfoLink.Description=\u041F\u0440\u0438\u043A\u0430\u0437\u0443\u0458\u0435 \u0440\u0430\u0437\u043D\u0443 \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0458\u0443 \u043E \u0441\u0438\u0441\u0442\u0435\u043C\u0443 \u0434\u0430 \u0431\u0443 \u043F\u043E\u043C\u0430\u0433\u0430\u043B\u043E \u0441\u0430 \u0440\u0435\u0448\u0430\u0432\u0430\u045A\u0435\u043C \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0438\u043C\u0430. +SystemLogLink.DisplayName=\u0416\u0443\u0440\u043D\u0430\u043B \u0441\u0438\u0441\u0442\u0435\u043C\u0430 +SystemLogLink.Description=\u0416\u0443\u0440\u043D\u0430\u043B \u0441\u0438\u0441\u0442\u0435\u043C\u0430 \u0437\u0430\u043F\u0438\u0441\u0443\u0458\u0435 \u0438\u0441\u0445\u043E\u0434 java.util.logging \u043A\u043E\u0458\u0438 \u0441\u0435 \u043E\u0434\u043D\u043E\u0441\u0438 \u043D\u0430 Jenkins. +StatisticsLink.DisplayName=\u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043A\u0435 \u043E \u043E\u043F\u0442\u0435\u0440\u0435\u045B\u0435\u045A\u0443 +StatisticsLink.Description=\u041F\u0440\u043E\u0432\u0435\u0440\u0438\u0442\u0435 \u043E\u043F\u0442\u0435\u0440\u0435\u045B\u0435\u045A\u0435 \u043D\u0430\u0434 \u0440\u0435\u0441\u0443\u0440\u0441\u0438\u043C\u0430 \u0434\u0430 \u0431\u0438 \u0441\u0442\u0435 \u043E\u0434\u0440\u0435\u0434\u0438\u043B\u0438 \u0430\u043A\u043E \u0458\u0435 \u043F\u043E\u0442\u0440\u0435\u0431\u043D\u043E \u0432\u0438\u0448\u0435 \u043C\u0430\u0448\u0438\u043D\u0430 \u0437\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0443. +CliLink.Description=\u0414\u043E\u0441\u0442\u0443\u043F\u0438\u0442\u0435 \u0438 \u0443\u043F\u0440\u0430\u0432\u0459\u0430\u0458\u0442\u0435 Jenkins-\u043E\u043C \u0441\u0430 \u043A\u043E\u043C\u0430\u043D\u0434\u043D\u0435 \u043B\u0438\u043D\u0438\u0458\u0435 \u0438\u043B\u0438 \u0441\u043A\u0440\u0438\u043F\u0442\u043E\u043C. +CliLink.DisplayName=Jenkins \u0441\u0430 \u043A\u043E\u043C\u0430\u043D\u0434\u043D\u0435 \u043B\u0438\u043D\u0438\u0458\u0435 +ConsoleLink.DisplayName=\u041A\u043E\u043D\u0437\u043E\u043B\u0430 +ConsoleLink.Description=\u0418\u0437\u0432\u0440\u0448\u0430\u0432\u0430 \u0441\u043A\u0440\u0438\u043F\u0442\u043E\u0432\u0435 \u0437\u0430 \u0430\u0434\u043C\u0438\u043D\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0458\u0443 \u0438 \u043E\u0442\u043A\u0440\u0438\u0432\u0430\u045A\u0435 \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0430. +NodesLink.DisplayName=\u0423\u043F\u0440\u0430\u0432\u0438 \u043C\u0430\u0448\u0438\u043D\u0430\u043C\u0430 +NodesLink.Description=\u0414\u043E\u0434\u0430\u0458\u0442\u0435, \u0443\u043A\u043B\u043E\u043D\u0438\u0442\u0435, \u0438 \u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0430\u0458\u0442\u0435 \u043C\u0430\u0448\u0438\u043D\u0435 \u043D\u0430 \u043A\u0438\u043C \u0441\u0435 \u0438\u0437\u0432\u0440\u0448\u0430\u0432\u0430\u0458\u0443 \u0437\u0430\u0434\u0430\u0446\u0438. +ShutdownLink.DisplayName_prepare=\u041F\u0440\u0438\u043F\u0440\u0435\u043C\u0438 \u0437\u0430 \u0433\u0430\u0448\u0435\u045A\u0435 +ShutdownLink.Description=\u0417\u0430\u0443\u0441\u0442\u0430\u0432\u0438 \u0438\u0437\u0432\u0440\u0448\u0430\u0432\u0430\u045A\u0435 \u043D\u043E\u0432\u0438\u0445 \u0437\u0430\u0434\u0430\u0442\u0430\u043A\u0430, \u0434\u0430 \u0431\u0438 \u0441\u0438\u0441\u0442\u0435\u043C \u043C\u043E\u0433\u0430\u043E \u0431\u0438\u0442\u0438 \u0431\u0435\u0437\u0431\u0435\u0434\u043D\u043E \u0438\u0441\u043A\u0459\u0443\u0447\u0435\u043D. +ShutdownLink.DisplayName_cancel=\u041E\u0442\u043A\u0430\u0436\u0438 \u0433\u0430\u0448\u0435\u045A\u0435 +Manage\ Jenkins=\u0423\u043F\u0440\u0430\u0432\u0459\u0430\u045A\u0435 Jenkins-\u043E\u043C \ No newline at end of file diff --git a/core/src/main/resources/jenkins/management/PluginsLink/info_sr.properties b/core/src/main/resources/jenkins/management/PluginsLink/info_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..0182d883887045a76fb84fe9f883ed0b7639fdf4 --- /dev/null +++ b/core/src/main/resources/jenkins/management/PluginsLink/info_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +updates\ available=\u0418\u043C\u0430 \u043D\u043E\u0432\u0438\u0445 \u043D\u0430\u0434\u0433\u0440\u0430\u0434\u045A\u0430 diff --git a/core/src/main/resources/jenkins/model/BuildDiscarderProperty/config-details_pl.properties b/core/src/main/resources/jenkins/model/BuildDiscarderProperty/config-details_pl.properties new file mode 100644 index 0000000000000000000000000000000000000000..ec1e22b953f1fca7f0cc43effc36b7424a94831a --- /dev/null +++ b/core/src/main/resources/jenkins/model/BuildDiscarderProperty/config-details_pl.properties @@ -0,0 +1,22 @@ +# The MIT License +# +# Copyright (c) 2016, Damian Szczepanik +# +# 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. +Strategy=Strategia diff --git a/core/src/main/resources/jenkins/model/BuildDiscarderProperty/config-details_sr.properties b/core/src/main/resources/jenkins/model/BuildDiscarderProperty/config-details_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..a0f4b42884f54a098f6f5107abc201bfeaba1d55 --- /dev/null +++ b/core/src/main/resources/jenkins/model/BuildDiscarderProperty/config-details_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Strategy=\u0420\u0435\u0436\u0438\u043C diff --git a/core/src/main/resources/jenkins/model/CauseOfInterruption/UserInterruption/summary.groovy b/core/src/main/resources/jenkins/model/CauseOfInterruption/UserInterruption/summary.groovy index ec48cb9efaf362b6b4e0defe98c1f9c8e889172d..b75b2386f95bfcb7aaf612ec9f2a95f333255b65 100644 --- a/core/src/main/resources/jenkins/model/CauseOfInterruption/UserInterruption/summary.groovy +++ b/core/src/main/resources/jenkins/model/CauseOfInterruption/UserInterruption/summary.groovy @@ -1,4 +1,9 @@ package jenkins.model.CauseOfInterruption.UserInterruption; // by default we just print the short description. -raw(_("blurb",my.user.fullName, rootURL+'/'+my.user.url)) \ No newline at end of file +def user = my.userOrNull +if (user != null) { + raw(_("blurb", user.fullName, rootURL+'/'+user.url)) +} else { + raw(_("userNotFound", my.userId)) +} diff --git a/core/src/main/resources/jenkins/model/CauseOfInterruption/UserInterruption/summary.properties b/core/src/main/resources/jenkins/model/CauseOfInterruption/UserInterruption/summary.properties index 1f1f63c2bced9e8dcbda322ad0c3d6127ab5f4c4..1ada7d261b140d9a47bbaa4da7cdffd44a4b9b8e 100644 --- a/core/src/main/resources/jenkins/model/CauseOfInterruption/UserInterruption/summary.properties +++ b/core/src/main/resources/jenkins/model/CauseOfInterruption/UserInterruption/summary.properties @@ -1 +1,2 @@ -blurb=Aborted by user {0} \ No newline at end of file +blurb=Aborted by user {0} +userNotFound=Aborted by user {0} diff --git a/core/src/main/resources/jenkins/model/CauseOfInterruption/UserInterruption/summary_ja.properties b/core/src/main/resources/jenkins/model/CauseOfInterruption/UserInterruption/summary_ja.properties index e2d2051a6e1b5c013e972a401894689fff2e3a17..3cd254db98c9992dd0aa682f0c28c4106dd2b9da 100644 --- a/core/src/main/resources/jenkins/model/CauseOfInterruption/UserInterruption/summary_ja.properties +++ b/core/src/main/resources/jenkins/model/CauseOfInterruption/UserInterruption/summary_ja.properties @@ -1 +1,2 @@ -blurb=\u30e6\u30fc\u30b6\u30fc {0} \u306b\u3088\u308a\u4e2d\u65ad \ No newline at end of file +blurb=\u30e6\u30fc\u30b6\u30fc {0} \u306b\u3088\u308a\u4e2d\u65ad +userNotFound=\u30e6\u30fc\u30b6\u30fc {0} \u306b\u3088\u308a\u4e2d\u65ad diff --git a/core/src/main/resources/jenkins/model/CauseOfInterruption/UserInterruption/summary_pl.properties b/core/src/main/resources/jenkins/model/CauseOfInterruption/UserInterruption/summary_pl.properties index 0095ece665717b8c3e01065e4517b9530baa7cbc..d2c91f76b00ac81566300ef4844379c61cf9dadd 100644 --- a/core/src/main/resources/jenkins/model/CauseOfInterruption/UserInterruption/summary_pl.properties +++ b/core/src/main/resources/jenkins/model/CauseOfInterruption/UserInterruption/summary_pl.properties @@ -1 +1,2 @@ -blurb=Przerwane przez u\u017Cytkownika {0} \ No newline at end of file +blurb=Przerwane przez u\u017cytkownika {0} +userNotFound=Przerwane przez u\u017cytkownika {0} diff --git a/core/src/main/resources/jenkins/model/CauseOfInterruption/UserInterruption/summary_sr.properties b/core/src/main/resources/jenkins/model/CauseOfInterruption/UserInterruption/summary_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..a88ce0631cae526ce3dc5bf038f65a498bd59a6a --- /dev/null +++ b/core/src/main/resources/jenkins/model/CauseOfInterruption/UserInterruption/summary_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +blurb=\u041e\u0442\u043a\u0430\u0437\u0430\u043d\u043e \u043a\u043e\u0440\u0438\u0441\u043d\u0438\u043a\u043e\u043c {0} +userNotFound=\u041e\u0442\u043a\u0430\u0437\u0430\u043d\u043e \u043a\u043e\u0440\u0438\u0441\u043d\u0438\u043a\u043e\u043c {0} diff --git a/core/src/main/resources/jenkins/model/CauseOfInterruption/UserInterruption/summary_zh_TW.properties b/core/src/main/resources/jenkins/model/CauseOfInterruption/UserInterruption/summary_zh_TW.properties index db917957563b21c1f8043f882355428694831555..3b2ac62c063258e245c2815a36ef9baac269d8b5 100644 --- a/core/src/main/resources/jenkins/model/CauseOfInterruption/UserInterruption/summary_zh_TW.properties +++ b/core/src/main/resources/jenkins/model/CauseOfInterruption/UserInterruption/summary_zh_TW.properties @@ -22,3 +22,4 @@ # THE SOFTWARE. blurb=\u7531\u4f7f\u7528\u8005 {0} \u4e2d\u6b62 +userNotFound=\u7531\u4f7f\u7528\u8005 {0} \u4e2d\u6b62 diff --git a/core/src/main/resources/jenkins/model/CoreEnvironmentContributor/buildEnv_sr.properties b/core/src/main/resources/jenkins/model/CoreEnvironmentContributor/buildEnv_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..8772ef9dd5816fa629121bf83e8823d6fb440c94 --- /dev/null +++ b/core/src/main/resources/jenkins/model/CoreEnvironmentContributor/buildEnv_sr.properties @@ -0,0 +1,16 @@ +# This file is under the MIT License by authors + +BUILD_NUMBER.blurb=\u0422\u0440\u0435\u043D\u0443\u0442\u043D\u0438 \u0431\u0440\u043E\u0458 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435, \u043A\u0430\u043E \u043D\u043F\u0440. "153" +BUILD_ID.blurb=ID \u0442\u0440\u0435\u043D\u0443\u0442\u043D\u0435 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435, \u0438\u0434\u0435\u043D\u0442\u0438\u0447\u0430\u043D BUILD_NUMBER \u0437\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 \u043F\u043E\u0441\u043B\u0435 \u0432\u0435\u0440\u0437\u0438\u0458\u0435 1.597, \u0430 \u0448\u0430\u0431\u043B\u043E\u043D\u0443 YYYY-MM-DD_hh-mm-ss \u0437\u0430 \u0441\u0442\u0430\u0440\u0438\u0458\u0435 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435. +BUILD_DISPLAY_NAME.blurb=\u0418\u043C\u0435 \u0442\u0440\u0435\u043D\u0443\u0442\u043D\u0435 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435, \u0448\u0442\u043E \u0438\u043D\u0430\u0447\u0435 \u043B\u0438\u0447\u0438 \u043D\u0430 "#153". +JOB_NAME.blurb=\u0418\u043C\u0435 \u0437\u0430\u0434\u0430\u0442\u043A\u0430 \u0437\u0430 \u043E\u0432\u0443 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0443, \u043D\u043F\u0440. "foo" \u0438\u043B\u0438 "foo/bar". +JOB_BASE_NAME.blurb=\u041A\u0440\u0430\u0442\u043A\u043E \u0438\u043C\u0435 \u043E\u0434 \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u0430 \u0437\u0430 \u043E\u0432\u043E \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 (\u043D\u0435 \u043F\u0443\u043D\u043E \u043F\u0443\u0442\u0430\u045A\u0435), \u043D\u043F\u0440. "foo" for "bar/foo". +BUILD_TAG.blurb=\u041D\u0438\u0437 "jenkins-$'{'JOB_NAME}-$'{'BUILD_NUMBER}". \u0421\u0432\u0435 \u043A\u043E\u0441\u0435 \u0446\u0440\u0442\u0435 ('/') \u0443 JOB_NAME \u0441\u0443 \u0437\u0430\u043C\u0435\u045A\u0435\u043D\u0438 \u0446\u0440\u0442\u0438\u0446\u0430\u043C\u0430 ('-'). \u041F\u043E\u0433\u043E\u0434\u043D\u043E \u0458\u0435 \u0441\u0442\u0430\u0432\u0438\u0442\u0438 \u0443 resource, jar, \u0438\u0442\u0434. \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0435 \u0437\u0430. +EXECUTOR_NUMBER.blurb=\u0408\u0435\u0434\u0438\u043D\u0441\u0442\u0432\u0435\u043D\u0438 \u0431\u0440\u043E\u0458 \u043A\u043E\u0458\u0438 \u0438\u043D\u0434\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0443\u0458\u0435 \u0438\u0437\u0432\u0440\u0448\u0438\u0442\u0435\u0459\u0430 (\u043E\u0434 \u0438\u0437\u0432\u0440\u0448\u0438\u0442\u0435\u0459\u0430 \u043D\u0430 \u0438\u0441\u0442\u043E\u0458 \u043C\u0430\u0448\u0438\u043D\u0438) \u043E\u0432\u0435 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435. \u0411\u0440\u043E\u0458\u0430 \u0441\u043B\u0438\u0447\u0430\u043D \u043E\u0432\u043E\u043C\u0435, \u043A\u043E\u0458\u0438 \u043F\u043E\u0447\u0438\u045A\u0435 \u0441\u0430 0 \u0430 \u043D\u0435 1, \u0458\u0435 \u043F\u0440\u0438\u043A\u0430\u0437\u0430\u043D \u043F\u0440\u0438 "\u0441\u0442\u0430\u045A\u0435 \u0438\u0437\u0432\u0440\u0448\u0438\u0442\u0435\u0459\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435". +NODE_NAME.blurb=\u0418\u043C\u0435 \u0430\u0433\u0435\u043D\u0442\u0430 \u0430\u043A\u043E \u0441\u0435 \u0438\u0437\u0432\u0440\u0448\u0430\u0432\u0430 \u043D\u0430 \u0442\u0430\u043A\u0432\u043E\u0458 \u043C\u0430\u0448\u0438\u043D\u0438, \u0438\u043B\u0438 "master" \u0430\u043A\u043E \u043D\u0430 \u0442\u0430\u043A\u0432\u043E\u0458. +NODE_LABELS.blurb= +WORKSPACE.blurb=\u0420\u0430\u0437\u043C\u0430\u043A-\u043E\u0434\u0432\u043E\u0458\u0435\u043D\u0438 \u0441\u043F\u0438\u0441\u0430\u043A \u043B\u0430\u0431\u0435\u043B\u0430 \u0434\u043E\u0434\u0435\u0459\u0435\u043D\u043E \u043C\u0430\u0448\u0438\u043D\u0438. +JENKINS_HOME.blurb=\u041F\u0443\u043D\u043E \u043F\u0443\u0442\u0430\u045A\u0435 \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0458\u0443\u043C\u0443 \u0434\u043E\u0434\u0435\u0459\u0435\u043D\u043E \u0433\u043B\u0430\u0432\u043D\u043E\u0458 \u043C\u0430\u0448\u0438\u043D\u0438, \u0433\u0434\u0435 \u045B\u0435 Jenkins \u0447\u0443\u0432\u0430\u0442\u0438 \u0441\u0432\u043E\u0458\u0435 \u043F\u043E\u0434\u0430\u0442\u043A\u0435. +JENKINS_URL.blurb=\u041A\u043E\u043C\u043F\u043B\u0435\u0442\u043D\u0430 Jenkins URL-\u0430\u0434\u0440\u0435\u0441\u0430, \u043A\u0430\u043E http://server:port/jenkins/ (\u0441\u0430\u043C\u043E \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u043E \u0430\u043A\u043E \u0458\u0435 Jenkins URL \u043F\u043E\u0441\u0442\u0430\u0432\u0459\u0435\u043D\u043E \u0443 \u0441\u0438\u0441\u0442\u0435\u043C\u0441\u043A\u0438\u043C \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430) +BUILD_URL.blurb=\u041A\u043E\u043C\u043F\u043B\u0435\u0442\u043D\u0430 URL-\u0430\u0434\u0440\u0435\u0441\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435, \u043D\u043F\u0440. http://server:port/jenkins/job/foo/15/ (Jenkins URL \u043C\u043E\u0440\u0430 \u0431\u0438\u0442\u0438 \u043F\u043E\u0441\u0442\u0430\u0432\u0459\u0435\u043D\u043E) +JOB_URL.blurb=\u041A\u043E\u043C\u043F\u043B\u0435\u0442\u043D\u0430 URL-\u0430\u0434\u0440\u0435\u0441\u0430 \u0437\u0430\u0434\u0430\u0442\u043A\u0430, \u043D\u043F\u0440. http://server:port/jenkins/job/foo/ (Jenkins URL \u043C\u043E\u0440\u0430 \u0431\u0438\u0442\u0438 \u043F\u043E\u0441\u0442\u0430\u0432\u0459\u0435\u043D\u043E) \ No newline at end of file diff --git a/core/src/main/resources/jenkins/model/DownloadSettings/Warning/message_sr.properties b/core/src/main/resources/jenkins/model/DownloadSettings/Warning/message_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..e8fb16b532d010fb9f5563435cdb223dca5b2327 --- /dev/null +++ b/core/src/main/resources/jenkins/model/DownloadSettings/Warning/message_sr.properties @@ -0,0 +1,7 @@ +# This file is under the MIT License by authors + +blurb=\ + \u0422\u0440\u0435\u043D\u0443\u0442\u043D\u043E \u0432\u0435\u0431-\u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0430\u0447\u0435\u043C \u043F\u0440\u0435\u0443\u0437\u0438\u0430\u0442\u0435 \u043C\u0435\u0442\u0430\u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0435 \u043E Jenkins \u043C\u043E\u0434\u0443\u043B\u0438\u043C\u0430 \u0438 \u0430\u043B\u0430\u0442\u0438\u043C\u0430. \ + \u0418\u043C\u0430 \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0430\u0442\u0430 \u0441\u0430 \u043E\u0432\u0438\u043C \u043C\u0435\u0442\u043E\u0434\u043E\u043C, \u0438 \u043D\u0435 \u0441\u043C\u0430\u0442\u0440\u0430 \u0441\u0435 \u043F\u043E\u0442\u043F\u0443\u043D\u043E \u0441\u0438\u0433\u0443\u0440\u043D\u0438\u043C. \ + \u0420\u0430\u0437\u043C\u043E\u0442\u0440\u0438\u0442\u0435 \u043F\u0440\u0435\u0443\u0437\u0438\u043C\u0430\u045A\u0435 \u0441\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u043E\u043C. +Dismiss=\u041E\u0442\u043A\u0430\u0436\u0438 diff --git a/core/src/main/resources/jenkins/model/DownloadSettings/config_sr.properties b/core/src/main/resources/jenkins/model/DownloadSettings/config_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..76414275dddfa182587716623810ea00896f2cd5 --- /dev/null +++ b/core/src/main/resources/jenkins/model/DownloadSettings/config_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Use\ Browser=\u041A\u043E\u0440\u0438\u0441\u0442\u0438 \u0432\u0435\u0431-\u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0430\u0447 +Use\ browser\ for\ metadata\ download=\u041F\u0440\u0435\u0443\u0437\u0438\u043C\u0430\u0458 \u043C\u0435\u0442\u0430\u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0435 \u0432\u0435\u0431-\u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0430\u0447\u0435\u043C \ No newline at end of file diff --git a/core/src/main/resources/jenkins/model/GlobalCloudConfiguration/config_sr.properties b/core/src/main/resources/jenkins/model/GlobalCloudConfiguration/config_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..29a7fbccd48a0ecfc0adfc93139a7199d0d499e9 --- /dev/null +++ b/core/src/main/resources/jenkins/model/GlobalCloudConfiguration/config_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +Delete\ cloud=\u0423\u043A\u043B\u043E\u043D\u0438 cloud +Cloud=Cloud +Add\ a\ new\ cloud=\u0414\u043E\u0434\u0430\u0458 \u043D\u043E\u0432\u0438 cloud \ No newline at end of file diff --git a/core/src/main/resources/jenkins/model/GlobalNodePropertiesConfiguration/config_sr.properties b/core/src/main/resources/jenkins/model/GlobalNodePropertiesConfiguration/config_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..f3244eb9c96937e2d0ec21edb67755e153439341 --- /dev/null +++ b/core/src/main/resources/jenkins/model/GlobalNodePropertiesConfiguration/config_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Global\ properties=\u0413\u043B\u043E\u0431\u0430\u043B\u043D\u0430 \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 \ No newline at end of file diff --git a/core/src/main/resources/jenkins/model/GlobalProjectNamingStrategyConfiguration/config_sr.properties b/core/src/main/resources/jenkins/model/GlobalProjectNamingStrategyConfiguration/config_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..b8a5aa7afa74a18e35ecf4a58cfbabc588aad59f --- /dev/null +++ b/core/src/main/resources/jenkins/model/GlobalProjectNamingStrategyConfiguration/config_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +useNamingStrategy=\u041A\u043E\u0440\u0438\u0441\u0442\u0438 \u0448\u0435\u043C\u0443 \u0438\u043C\u0435\u043D\u043E\u0432\u0430\u045A\u0430 \u0437\u0430 \u043D\u0430\u0437\u0438\u0432 \u0437\u0430\u0434\u0430\u0442\u0430\u043A\u0430 +namingStrategyTitel=\u0428\u0435\u043C\u0430 \u0438\u043C\u0435\u043D\u043E\u0432\u0430\u045A\u0430 +strategy=\u0428\u0435\u043C\u0430 \ No newline at end of file diff --git a/core/src/main/resources/jenkins/model/GlobalQuietPeriodConfiguration/config_sr.properties b/core/src/main/resources/jenkins/model/GlobalQuietPeriodConfiguration/config_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..dd06cd0724c3b45e18356f64e95bf157941982c5 --- /dev/null +++ b/core/src/main/resources/jenkins/model/GlobalQuietPeriodConfiguration/config_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Quiet\ period=\u041F\u0435\u0440\u0438\u043E\u0434 \u045B\u0443\u0442\u0430\u045A\u0430 diff --git a/core/src/main/resources/jenkins/model/GlobalQuietPeriodConfiguration/help-quietPeriod.html b/core/src/main/resources/jenkins/model/GlobalQuietPeriodConfiguration/help-quietPeriod.html index 4beaab60a76463e39086b7cf6daa88bc1f37dee4..1012ea55afbcb679b6951c1305da55b11bc7b8f2 100644 --- a/core/src/main/resources/jenkins/model/GlobalQuietPeriodConfiguration/help-quietPeriod.html +++ b/core/src/main/resources/jenkins/model/GlobalQuietPeriodConfiguration/help-quietPeriod.html @@ -15,7 +15,7 @@ If a new build of this project is triggered while a build is already sitting in the queue, waiting for its quiet period to end, the quiet period will not be reset. The newly triggered build will not be added to the queue, unless - this project is parameterised and the build has different parameters to the + this project is parameterized and the build has different parameters to the build already in the queue.

        If this option is not checked, then the system-wide default value from the diff --git a/core/src/main/resources/jenkins/model/GlobalSCMRetryCountConfiguration/config_sr.properties b/core/src/main/resources/jenkins/model/GlobalSCMRetryCountConfiguration/config_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..583c36f8a6981229d0ca8fb037e8883da4ca04eb --- /dev/null +++ b/core/src/main/resources/jenkins/model/GlobalSCMRetryCountConfiguration/config_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +SCM\ checkout\ retry\ count=\u0411\u0440\u043E\u0458 \u043F\u043E\u043A\u0443\u0448\u0430\u0458\u0430 \u043F\u0440\u0435\u0443\u0437\u0438\u043C\u0430\u045A\u0435 \u0438\u0437\u0432\u043E\u0440\u043D\u043E\u0433 \u043A\u043E\u0434\u0430 \ No newline at end of file diff --git a/core/src/main/resources/jenkins/model/Jenkins/EnforceSlaveAgentPortAdministrativeMonitor/message.jelly b/core/src/main/resources/jenkins/model/Jenkins/EnforceSlaveAgentPortAdministrativeMonitor/message.jelly new file mode 100644 index 0000000000000000000000000000000000000000..bc2149f7529667ab145820eb68a84a4f14a222df --- /dev/null +++ b/core/src/main/resources/jenkins/model/Jenkins/EnforceSlaveAgentPortAdministrativeMonitor/message.jelly @@ -0,0 +1,34 @@ + + + +

        + ${%description(it.systemPropertyName, it.expectedPort)} + +
        + +
        + +
        +
        diff --git a/core/src/main/resources/jenkins/model/Jenkins/EnforceSlaveAgentPortAdministrativeMonitor/message.properties b/core/src/main/resources/jenkins/model/Jenkins/EnforceSlaveAgentPortAdministrativeMonitor/message.properties new file mode 100644 index 0000000000000000000000000000000000000000..e4f6f0fd8c5ca473867295db5fec2f9658826165 --- /dev/null +++ b/core/src/main/resources/jenkins/model/Jenkins/EnforceSlaveAgentPortAdministrativeMonitor/message.properties @@ -0,0 +1,2 @@ +description=JNLP Agent Port has been changed but was specified through system property {0} on startup. Its value will be reset to {1,number,#} on restart. +reset=Reset to {0,number,#} diff --git a/core/src/main/resources/jenkins/model/Jenkins/MasterComputer/configure_ru.properties b/core/src/main/resources/jenkins/model/Jenkins/MasterComputer/configure_ru.properties index 96ccad842c759e5f67ab6dd830715a98a0386fce..9b7a6556f57fbbaf03d16c3fe892cc5548a7e8ff 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/MasterComputer/configure_ru.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/MasterComputer/configure_ru.properties @@ -21,6 +21,7 @@ # THE SOFTWARE. \#\ of\ executors=\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432-\u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u0435\u0439 +Description=\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 Labels=\u041c\u0435\u0442\u043a\u0438 Node\ Properties=\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0443\u0437\u043b\u0430 Save=\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c diff --git a/core/src/main/resources/jenkins/model/Jenkins/MasterComputer/configure_sr.properties b/core/src/main/resources/jenkins/model/Jenkins/MasterComputer/configure_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..7329797f439b498777c6825858cbd99e86f76b9c --- /dev/null +++ b/core/src/main/resources/jenkins/model/Jenkins/MasterComputer/configure_sr.properties @@ -0,0 +1,7 @@ +# This file is under the MIT License by authors + +Labels=\u041B\u0430\u0431\u0435\u043B\u0435 +Node\ Properties=\u041F\u043E\u0441\u0442\u0430\u0432\u043A\u0435 \u043C\u0430\u0448\u0438\u043D\u0435 +Save=\u0421\u0430\u0447\u0443\u0432\u0430\u0458 +\#\ of\ executors=\u0431\u0440\u043E\u0458 \u0438\u0437\u0432\u0440\u0448\u0438\u0442\u0435\u0459\u0430 +Description=\u041E\u043F\u0438\u0441 diff --git a/core/src/main/resources/jenkins/model/Jenkins/_cli_ko.properties b/core/src/main/resources/jenkins/model/Jenkins/_cli_ko.properties index 0a3081fdd17eb64b002bf721a872bb23415b5d52..f62b0bcd815d860d6933c88c822dbda2ffce1062 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/_cli_ko.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/_cli_ko.properties @@ -1,4 +1,4 @@ # This file is under the MIT License by authors Available\ Commands=\uC0AC\uC6A9\uAC00\uB2A5\uD55C \uBA85\uB839\uB4E4 -blurb=Jenkins\uC758 \uB2E4\uC591\uD55C \uAE30\uB2A5\uC744 command-line \uD234\uC744 \uC0AC\uC6A9\uD558\uC5EC \uC811\uADFC\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4. \uC774\uAE30\uB2A5\uC5D0 \uB300\uD55C \uB354 \uC790\uC138\uD55C \uB0B4\uC6A9\uC740\uC774 Wiki\uB97C \uBCF4\uC138\uC694. \uC2DC\uC791\uD558\uB824\uBA74, jenkins-cli.jar\uC744 \uB2E4\uC6B4\uB85C\uB4DC \uD55C\uB4A4 \uB2E4\uC74C\uACFC \uAC19\uC774 \uC2E4\uD589\uD569\uB2C8\uB2E4: +blurb=Jenkins\uC758 \uB2E4\uC591\uD55C \uAE30\uB2A5\uC744 command-line \uD234\uC744 \uC0AC\uC6A9\uD558\uC5EC \uC811\uADFC\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4. \uC774\uAE30\uB2A5\uC5D0 \uB300\uD55C \uB354 \uC790\uC138\uD55C \uB0B4\uC6A9\uC740\uC774 Wiki\uB97C \uBCF4\uC138\uC694. \uC2DC\uC791\uD558\uB824\uBA74, jenkins-cli.jar\uC744 \uB2E4\uC6B4\uB85C\uB4DC \uD55C\uB4A4 \uB2E4\uC74C\uACFC \uAC19\uC774 \uC2E4\uD589\uD569\uB2C8\uB2E4: diff --git a/core/src/main/resources/jenkins/model/Jenkins/_cli_sr.properties b/core/src/main/resources/jenkins/model/Jenkins/_cli_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..9eb1d202ee067eb6fe942fdc6bd0d5a404d41566 --- /dev/null +++ b/core/src/main/resources/jenkins/model/Jenkins/_cli_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Jenkins\ CLI=Jenkins \u0441\u0430 \u043A\u043E\u043C\u0430\u043D\u0434\u043D\u0435 \u043B\u0438\u043D\u0438\u0458\u0435 +Available\ Commands=\u0414\u043E\u0441\u0442\u0443\u043F\u043D\u0435 \u043A\u043E\u043C\u0430\u043D\u0434\u0435 \ No newline at end of file diff --git a/core/src/main/resources/jenkins/model/Jenkins/_cli_sv_SE.properties b/core/src/main/resources/jenkins/model/Jenkins/_cli_sv_SE.properties index cc07ca27c0d54fa5b68d9d4471da6244136f26cf..515acb75fc994c9838238a0d689f98404ac2a811 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/_cli_sv_SE.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/_cli_sv_SE.properties @@ -2,4 +2,4 @@ Available\ Commands=Tillg\u00E4ngliga kommandon Jenkins\ CLI=Jenkins CLI (kommandorads\u00E5tkomst) -blurb=Du kan komma \u00E5t diverse funktioner i Jenkins genom ett kommandoradsverktyg. Se Wikin f\u00F6r mer detaljer av den h\u00E4r funktionen. F\u00F6r att komma ig\u00E5ng, ladda ner jenkins-cli.jar och k\u00F6r enligt f\u00F6ljande: +blurb=Du kan komma \u00E5t diverse funktioner i Jenkins genom ett kommandoradsverktyg. Se Wikin f\u00F6r mer detaljer av den h\u00E4r funktionen. F\u00F6r att komma ig\u00E5ng, ladda ner jenkins-cli.jar och k\u00F6r enligt f\u00F6ljande: diff --git a/core/src/main/resources/jenkins/model/Jenkins/_restart_pl.properties b/core/src/main/resources/jenkins/model/Jenkins/_restart_pl.properties new file mode 100644 index 0000000000000000000000000000000000000000..e3cd86fa188f8f99f805289896e384e88ef3dd2b --- /dev/null +++ b/core/src/main/resources/jenkins/model/Jenkins/_restart_pl.properties @@ -0,0 +1,24 @@ +# The MIT License +# +# Copyright (c) 2017, Damian Szczepanik +# +# 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. +Are\ you\ sure\ about\ restarting\ Jenkins?=Czy na pewno chcesz ponownie uruchomi\u0107 Jenkinsa? +Yes=Tak +Jenkins\ cannot\ restart\ itself\ as\ currently\ configured.=Aktualna konfiguracja uniemo\u017Cliwia Jenkinsowi samodzielne ponowne uruchomienie. diff --git a/core/src/main/resources/jenkins/model/Jenkins/_restart_ru.properties b/core/src/main/resources/jenkins/model/Jenkins/_restart_ru.properties index a498e2f0dbfdc749560c6189b7032008fa92edd3..4307ac559364bb8456a4992eb9bde68d4edb4bf8 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/_restart_ru.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/_restart_ru.properties @@ -1,4 +1,5 @@ # This file is under the MIT License by authors -Are\ you\ sure\ about\ restarting\ Jenkins?=\u0412\u044B \u0443\u0432\u0435\u0440\u0435\u043D\u044B, \u0447\u0442\u043E \u0445\u043E\u0442\u0438\u0442\u0435 \u043F\u0435\u0440\u0435\u0437\u0430\u043F\u0443\u0441\u0442\u0438\u0442\u044C Jenkins? +Are\ you\ sure\ about\ restarting\ Jenkins?=\u0412\u044b \u0443\u0432\u0435\u0440\u0435\u043d\u044b, \u0447\u0442\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c Jenkins? Yes=\u0414\u0430 +Jenkins\ cannot\ restart\ itself\ as\ currently\ configured.=\u0421\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c, Jenkins \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c\u0441\u044f \u0441\u0430\u043c. \ No newline at end of file diff --git a/core/src/main/resources/jenkins/model/Jenkins/_restart_sr.properties b/core/src/main/resources/jenkins/model/Jenkins/_restart_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..fa62a6b2c3380c2555f06d7baacbe968062448b0 --- /dev/null +++ b/core/src/main/resources/jenkins/model/Jenkins/_restart_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +Are\ you\ sure\ about\ restarting\ Jenkins?=\u0414\u0430\u043B\u0438 \u0436\u0435\u043B\u0438\u0442\u0435 \u0434\u0430 \u043F\u043E\u043D\u043E\u0432\u043E \u043F\u043E\u043A\u0440\u0435\u043D\u0443\u0442\u0435 Jenkins? +Yes=\u0414\u0430 +Jenkins\ cannot\ restart\ itself\ as\ currently\ configured.=\u041D\u0435\u043C\u043E\u0436\u0435 \u043F\u043E\u043D\u043E\u0432\u043E \u043F\u043E\u043A\u0440\u0435\u043D\u0443\u0442\u0438 Jenkins \u043F\u043E \u043E\u0432\u0438\u043C \u043F\u043E\u0441\u0442\u0430\u0432\u0446\u0438\u043C\u0430 diff --git a/core/src/main/resources/jenkins/model/Jenkins/_safeRestart_ru.properties b/core/src/main/resources/jenkins/model/Jenkins/_safeRestart_ru.properties index 6bb8af1af1dd3ef9837e38a612036f87a1fd3f3b..2f018764b19fcfe155838f1da09016281b6d013e 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/_safeRestart_ru.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/_safeRestart_ru.properties @@ -1,4 +1,3 @@ -# This file is under the MIT License by authors - -Are\ you\ sure\ about\ restarting\ Jenkins?\ Jenkins\ will\ restart\ once\ all\ running\ jobs\ are\ finished.=\u0412\u044B \u0443\u0432\u0435\u0440\u0435\u043D\u044B \u043D\u0430 \u0441\u0447\u0435\u0442 \u043F\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u043A\u0438 Jenkins? Jenkins \u0431\u0443\u0434\u0435\u0442 \u043F\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043D, \u043A\u043E\u0433\u0434\u0430 \u0432\u0441\u0435 \u0437\u0430\u043F\u0443\u0449\u0435\u043D\u043D\u044B\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0442\u0441\u044F. +Are\ you\ sure\ about\ restarting\ Jenkins?\ Jenkins\ will\ restart\ once\ all\ running\ jobs\ are\ finished.=\u0412\u044b \u0443\u0432\u0435\u0440\u0435\u043d\u044b \u043d\u0430 \u0441\u0447\u0435\u0442 \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 Jenkins? Jenkins \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d, \u043a\u043e\u0433\u0434\u0430 \u0432\u0441\u0435 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0442\u0441\u044f. Yes=\u0414\u0430 +Jenkins\ cannot\ restart\ itself\ as\ currently\ configured.=\u0412 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 Jenkins \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c\u0441\u044f \u0441\u0430\u043c. \ No newline at end of file diff --git a/core/src/main/resources/jenkins/model/Jenkins/_safeRestart_sr.properties b/core/src/main/resources/jenkins/model/Jenkins/_safeRestart_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..430f57df18031ffddbe0713ff71decc9e492cfc4 --- /dev/null +++ b/core/src/main/resources/jenkins/model/Jenkins/_safeRestart_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +Are\ you\ sure\ about\ restarting\ Jenkins?\ Jenkins\ will\ restart\ once\ all\ running\ jobs\ are\ finished.=\u0414\u0430 \u043B\u0438 \u0436\u0435\u043B\u0438\u0442\u0435 \u0434\u0430 \u043F\u043E\u043D\u043E\u0432\u043E \u043F\u043E\u043A\u0440\u0435\u043D\u0435\u0442\u0435 Jenkins \u043A\u0430\u0434 \u0441\u0432\u0435 \u0442\u0435\u043A\u0443\u045B\u0435 \u043F\u043E\u0441\u043B\u043E\u0432\u0435 \u0431\u0443\u0434\u0443 \u0431\u0438\u043B\u0435 \u0433\u043E\u0442\u043E\u0432\u0435? +Yes=\u0414\u0430 +Jenkins\ cannot\ restart\ itself\ as\ currently\ configured.=\u041D\u0435\u043C\u043E\u0436\u0435 \u0441\u0435 \u043F\u043E\u043D\u043E\u0432\u043E \u043F\u043E\u043A\u0440\u0435\u043D\u0443\u0442\u0438 Jenkins \u0437\u0430 \u043E\u0432\u0438\u043C \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0438\u043C\u0430. diff --git a/core/src/main/resources/jenkins/model/Jenkins/accessDenied_ru.properties b/core/src/main/resources/jenkins/model/Jenkins/accessDenied_ru.properties new file mode 100644 index 0000000000000000000000000000000000000000..6606e23c61841ff5ffaecf3d75205afcb9ae956b --- /dev/null +++ b/core/src/main/resources/jenkins/model/Jenkins/accessDenied_ru.properties @@ -0,0 +1,24 @@ +# The MIT License +# +# Copyright (c) 2004-, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributors +# +# 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. + +Access\ Denied=\u0414\u043e\u0441\u0442\u0443\u043f \u0437\u0430\u043f\u0440\u0435\u0449\u0451\u043d +Jenkins\ Login=\u0412\u0445\u043e\u0434 \u0432 Jenkins \ No newline at end of file diff --git a/core/src/main/resources/jenkins/model/Jenkins/accessDenied_sr.properties b/core/src/main/resources/jenkins/model/Jenkins/accessDenied_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..5dc7a3e054e7f795713472732350e61dfc830f48 --- /dev/null +++ b/core/src/main/resources/jenkins/model/Jenkins/accessDenied_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Jenkins\ Login=\u041F\u0440\u0438\u0458\u0430\u0432\u0430 \u043D\u0430 Jenkins +Access\ Denied=\u041F\u0440\u0438\u0441\u0442\u0443\u043F \u043E\u0434\u0431\u0438\u0458\u0435\u043D diff --git a/core/src/main/resources/jenkins/model/Jenkins/configure_pl.properties b/core/src/main/resources/jenkins/model/Jenkins/configure_pl.properties index 52107feb39aee4181fb67e46b47060900f5b8ed3..2f392154fcd423e3b07b6d74bb59267309027ad0 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/configure_pl.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/configure_pl.properties @@ -1,7 +1,29 @@ -# This file is under the MIT License by authors - +# The MIT License +# +# Copyright (c) 2004-2017, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributors +# +# 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\ Record\ Root\ Directory=Katalog bazowy zadania budowy Home\ directory=Katalog domowy LOADING=Wczytywanie System\ Message=Komunikat systemowy Workspace\ Root\ Directory=Katalog bazowy przestrzeni roboczej +Save=Zapisz +Apply=Zastosuj +Configure\ System=Skonfiguruj system diff --git a/core/src/main/resources/jenkins/model/Jenkins/configure_ru.properties b/core/src/main/resources/jenkins/model/Jenkins/configure_ru.properties index ac73f79225f7875c043cbd82236621a08a2559ac..dd7942dd69ad8dfcd7f9b08675c5184158c5c133 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/configure_ru.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/configure_ru.properties @@ -1,28 +1,8 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Mike Salnikov -# -# 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. - +Apply=\u041f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c +Configure\ System=\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u044b Home\ directory=\u0414\u043e\u043c\u0430\u0448\u043d\u044f\u044f \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f -System\ Message=\u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b -Build\ Record\ Root\ Directory=\u041A\u043E\u0440\u043D\u0435\u0432\u0430\u044F \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u044F \u0437\u0430\u043F\u0438\u0441\u0438 \u0441\u0431\u043E\u0440\u043A\u0438 -Save=\u0421\u043E\u0445\u0440\u0430\u043D\u0438\u0442\u044C -Workspace\ Root\ Directory=\u041A\u043E\u0440\u043D\u0435\u0432\u0430\u044F \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u044F \u0440\u0430\u0431\u043E\u0447\u0435\u0439 \u043E\u0431\u043B\u0430\u0441\u0442\u0438 -LOADING=\u0417\u0410\u0413\u0420\u0423\u0417\u041A\u0410 +System\ Message=\u0421\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 +Build\ Record\ Root\ Directory=\u041a\u043e\u0440\u043d\u0435\u0432\u0430\u044f \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u0441\u0431\u043e\u0440\u043a\u0438 +Save=\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c +Workspace\ Root\ Directory=\u041a\u043e\u0440\u043d\u0435\u0432\u0430\u044f \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f \u0441\u0431\u043e\u0440\u043e\u043a +LOADING=\u0417\u0410\u0413\u0420\u0423\u0417\u041a\u0410 diff --git a/core/src/main/resources/jenkins/model/Jenkins/configure_sr.properties b/core/src/main/resources/jenkins/model/Jenkins/configure_sr.properties index ba97cef5b0f09abf3f280dd48f9d6c066d7a8cb5..c6e2ed92554df6c393065fa12d66bfaea9e13797 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/configure_sr.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/configure_sr.properties @@ -1,7 +1,10 @@ # This file is under the MIT License by authors -Build\ Record\ Root\ Directory=Osnovni direktorijum build rezultata -Home\ directory=Pocetni direktorijum -LOADING=Ucitavanje -System\ Message=Sistemska poruka -Workspace\ Root\ Directory=Osnovni direktorijum okruzenja +Build\ Record\ Root\ Directory=\u041E\u0441\u043D\u043E\u0432\u043D\u0438 \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0458\u0443\u043C \u0440\u0435\u0437\u0443\u043B\u0430\u0442\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 +Home\ directory=\u041F\u043E\u045B\u0435\u0442\u043D\u0438 \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0458\u0443\u043C +LOADING=\u0423\u0427\u0418\u0422\u0410\u0412\u0410\u040A\u0415 +System\ Message=\u0421\u0438\u0441\u0442\u0435\u043C\u0441\u043A\u0430 \u043F\u043E\u0440\u0443\u043A\u0430 +Workspace\ Root\ Directory=\u0413\u043B\u0430\u0432\u043D\u0438 \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0458\u0443\u043C \u0440\u0430\u0434\u043D\u043E\u0433 \u043F\u0440\u043E\u0441\u0442\u043E\u0440\u0430 +Configure\ System=\u041F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0435 \u0441\u0438\u0441\u0442\u0435\u043C\u043E\u043C +Save=\u0421\u0430\u0447\u0443\u0432\u0430\u0458 +Apply=\u041F\u0440\u0438\u043C\u0435\u043D\u0438 diff --git a/core/src/main/resources/jenkins/model/Jenkins/downgrade_sr.properties b/core/src/main/resources/jenkins/model/Jenkins/downgrade_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..d04470f1d0c87a9dc8374ed465f097b426c5cf8b --- /dev/null +++ b/core/src/main/resources/jenkins/model/Jenkins/downgrade_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +buttonText=\u0412\u0440\u0430\u0442\u0438 \u043D\u0430\u0437\u0430\u0434 \u043D\u0430 {0} +Restore\ the\ previous\ version\ of\ Jenkins=\u0412\u0440\u0430\u0442\u0438 \u043D\u0430 \u043F\u0440\u0435\u0442\u043D\u043E\u0434\u043D\u0443 \u0432\u0435\u0440\u0437\u0438\u0458\u0443 Jenkins-\u0430 diff --git a/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck.properties b/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck.properties index b51a3f3bfcab22f89c59bd4cafa36bb308bf12b1..f8e7628ab1836477e6760f732f0e88c93a7f7fa7 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck.properties @@ -24,4 +24,4 @@ description=\ Got a jar file but don\u2019t know which version it is?
        \ Find that out by checking the fingerprint against \ the database in Jenkins -fingerprint.link=https://wiki.jenkins-ci.org/display/JENKINS/Fingerprint +fingerprint.link=https://jenkins.io/redirect/fingerprint diff --git a/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_bg.properties b/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_bg.properties index 15765bd910f8b8f5fd2b402062bd94f7ac2bdfd3..f3c3260e49c569dc339ad6bd738971b8bc89fcfc 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_bg.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_bg.properties @@ -33,8 +33,8 @@ Check\ File\ Fingerprint=\ description=\ \u041d\u0435 \u0437\u043d\u0430\u0435\u0442\u0435 \u0432\u0435\u0440\u0441\u0438\u044f\u0442\u0430 \u043d\u0430 \u043d\u044f\u043a\u043e\u0439 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u0435\u043d \u201e.jar\u201c \u0444\u0430\u0439\u043b?
        \u041f\u0440\u043e\u0432\u0435\u0440\u0435\u0442\u0435 \u0437\u0430 \u0446\u0438\u0444\u0440\u043e\u0432\u0438\u044f \u043c\u0443 \u043e\u0442\u043f\u0435\u0447\u0430\u0442\u044a\u043a \u0432 \u0431\u0430\u0437\u0430\u0442\u0430 \u043d\u0430 Jenkins. -# https://wiki.jenkins-ci.org/display/JENKINS/Fingerprint +# https://jenkins.io/redirect/fingerprint fingerprint.link=\ - https://wiki.jenkins-ci.org/display/JENKINS/Fingerprint + https://jenkins.io/redirect/fingerprint more\ details=\ \u041e\u0449\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 diff --git a/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_cs.properties b/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_cs.properties index 5ed5ac44c3ab278074a0670e28f654185e3985cd..e31d158af49ae2918c6e3561462797a50040e1ab 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_cs.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_cs.properties @@ -5,5 +5,5 @@ Check\ File\ Fingerprint=Ov\u011B\u0159it otisk souboru File\ to\ check=Soubor k ov\u011B\u0159en\u00ED description=M\u00E1te jar soubor ale nev\u00EDte k jak\u00E9 verzi pat\u0159\u00ED?
        Ov\u011B\u0159te si jej v Jenkinsov\u011B datab\u00E1zi otisk\u016F -fingerprint.link=https://wiki.jenkins-ci.org/display/JENKINS/Fingerprint +fingerprint.link=https://jenkins.io/redirect/fingerprint more\ details=dal\u0161\u00ED informace diff --git a/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_da.properties b/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_da.properties index 4a824aea26f97262c71c91e9c133875bb4106a67..09123b219271537112a129ef35cf3cd2822432bf 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_da.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_da.properties @@ -22,7 +22,7 @@ Check\ File\ Fingerprint=Check filfingeraftryk File\ to\ check=Fil der skal checkes -fingerprint.link=https://wiki.jenkins-ci.org/display/JENKINS/Fingerprint +fingerprint.link=https://jenkins.io/redirect/fingerprint description=\ Har du f\u00e5et en jar fil, men ved ikke hvilken version den har?
        \ Find ud af det ved at checke imod filfingeraftryksdatabasen i Jenkins diff --git a/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_de.properties b/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_de.properties index f5ed8a4da03cb4044b5f474e62761020f4ba8bd8..2dad94b0b58e01f58d7b4e20cb0f9f13de780b83 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_de.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_de.properties @@ -27,4 +27,4 @@ more\ details=mehr... description=\ Die Version einer JAR-Datei lsst sich ber die von \ Jenkins gespeicherten Fingerabdrcke herausfinden. -fingerprint.link=https://wiki.jenkins-ci.org/display/JENKINS/Fingerprint +fingerprint.link=https://jenkins.io/redirect/fingerprint diff --git a/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_el.properties b/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_el.properties index 8f06b2f26533945d1a0813f727a89b1218ccf0c5..6d496604cc9f647febc82fd1a2f020ad1100fe56 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_el.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_el.properties @@ -4,5 +4,5 @@ Check=\u0388\u03BB\u03B5\u03B3\u03C7\u03BF\u03C2 Check\ File\ Fingerprint=\u0388\u03BB\u03B5\u03B3\u03C7\u03BF\u03C2 \u0391\u03C0\u03BF\u03C4\u03C5\u03C0\u03C9\u03BC\u03AC\u03C4\u03C9\u03BD \u0391\u03C1\u03C7\u03B5\u03AF\u03C9\u03BD File\ to\ check=\u0391\u03C1\u03C7\u03B5\u03AF\u03BF \u03C0\u03C1\u03BF\u03C2 \u03AD\u03BB\u03B5\u03B3\u03C7\u03BF description=\u0388\u03C7\u03B5\u03C4\u03B5 \u03BA\u03AC\u03C0\u03BF\u03B9\u03BF jar \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF \u03B1\u03BB\u03BB\u03AC \u03B4\u03B5\u03BD \u03BE\u03AD\u03C1\u03B5\u03C4\u03B5 \u03C4\u03BF\u03BD \u03B1\u03C1\u03B9\u03B8\u03BC\u03CC \u03AD\u03BA\u03B4\u03BF\u03C3\u03AE\u03C2 \u03C4\u03BF\u03C5;
        \u0392\u03C1\u03B5\u03AF\u03C4\u03B5 \u03C4\u03B7\u03BD \u03B5\u03BB\u03AD\u03B3\u03C7\u03BF\u03BD\u03C4\u03B1\u03C2 \u03C4\u03BF \u03C8\u03B7\u03C6\u03B9\u03B1\u03BA\u03CC \u03B1\u03C0\u03BF\u03C4\u03CD\u03C0\u03C9\u03BC\u03B1 \u03C4\u03BF\u03C5 \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF\u03C5 \u03BA\u03B1\u03B9 \u03C3\u03C5\u03B3\u03BA\u03C1\u03AF\u03BD\u03BF\u03BD\u03C4\u03AC\u03C2 \u03C4\u03BF \u03BC\u03B5 \u03C4\u03B7 \u03B2\u03AC\u03C3\u03B7 \u03B1\u03C0\u03BF\u03C4\u03C5\u03C0\u03C9\u03BC\u03AC\u03C4\u03C9\u03BD \u03C3\u03C4\u03BF Jenkins -fingerprint.link=https://wiki.jenkins-ci.org/display/JENKINS/Fingerprint +fingerprint.link=https://jenkins.io/redirect/fingerprint more\ details=\u03C0\u03B5\u03C1\u03B9\u03C3\u03C3\u03CC\u03C4\u03B5\u03C1\u03B5\u03C2 \u03BB\u03B5\u03C0\u03C4\u03BF\u03BC\u03AD\u03C1\u03B5\u03B9\u03B5\u03C2 diff --git a/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_es.properties b/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_es.properties index c00710f8db39e567660e9ce2d6ff2e32c11e2a53..1ea94a235ddcf74a107fec6c09133a1bbed698c2 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_es.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_es.properties @@ -23,7 +23,7 @@ description=\ Si tienes un fichero ''jar'' en tu disco duro del que desconoces su versin
        \ Puedes identificarlo enviandolo a Jenkins para que busque su firma en la base de datos de firmas registradas. -fingerprint.link=https://wiki.jenkins-ci.org/display/JENKINS/Fingerprint +fingerprint.link=https://jenkins.io/redirect/fingerprint File\ to\ check=Selecciona un fichero para comprobar Check=Comprobar Check\ File\ Fingerprint=Comprobar ficheros diff --git a/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_fr.properties b/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_fr.properties index e6d166f3d369a2bec758f3b951b2f5e03132ffb7..64b9adc2bf3924b51aa989b1aff3577deaf67ac7 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_fr.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_fr.properties @@ -24,5 +24,5 @@ Check\ File\ Fingerprint=V File\ to\ check=Fichier vrifier Check=Vrifier description=Vous avez un fichier jar mais vous ne connaissez pas sa version ?
        Vous pourrez la trouver en comparant l''empreinte num\u00E9rique avec celles dans la base de donn\u00E9es de Jenkins -fingerprint.link=https://wiki.jenkins-ci.org/display/JENKINS/Fingerprint +fingerprint.link=https://jenkins.io/redirect/fingerprint more\ details=plus de dtails diff --git a/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_ja.properties b/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_ja.properties index 641e36be554464ea54c0518a2bbc68808269cef2..3b43850a2c26c339805ee940cf1493a978855d21 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_ja.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_ja.properties @@ -27,4 +27,4 @@ description=\ jar\u30D5\u30A1\u30A4\u30EB\u3092\u53D6\u5F97\u3057\u305F\u306E\u306B\u3001\u3069\u306E\u30D0\u30FC\u30B8\u30E7\u30F3\u304B\u5206\u304B\u3089\u306A\u3044\u306E\u3067\u3059\u304B?
        \ Jenkins\u306E\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u3067\u30D5\u30A1\u30A4\u30EB\u6307\u7D0B\u3092\u30C1\u30A7\u30C3\u30AF\u3059\u308C\u3070\u3001\u5206\u304B\u308A\u307E\u3059\u3002 more\ details=\u8A73\u7D30 -fingerprint.link=http://wiki.jenkins-ci.org/display/JA/Fingerprint +fingerprint.link=https://jenkins.io/redirect/fingerprint diff --git a/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_lt.properties b/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_lt.properties index 7478165497b4de0217dffacb029238c3f8a832e3..cb3c706f659e3f40b8b449deac00bfed390ff4e0 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_lt.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_lt.properties @@ -1,7 +1,7 @@ description=\ Gavote jar fail\u0105 bet ne\u017einote, kokia jo versija?
        \ Su\u017einokite patikrindami antspaud\u0105 Jenkinso duomen\u0173 baz\u0117je -fingerprint.link=https://wiki.jenkins-ci.org/display/JENKINS/Fingerprint +fingerprint.link=https://jenkins.io/redirect/fingerprint Check=Tikrinti Check\ File\ Fingerprint=Tikrinti failo antspaud\u0105 more\ details=daugiau informacijos diff --git a/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_lv.properties b/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_lv.properties index 975749fb630db24512c60105f36cd3f60e0e2409..0f20c4fb474a07a946a5137e86ddc1dacaaccdad 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_lv.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_lv.properties @@ -24,5 +24,5 @@ Check=P\u0101rbaud\u012Bt Check\ File\ Fingerprint=P\u0101rbaude Faila Nospiedumam File\ to\ check=Fails, kuru p\u0101baud\u012Bt description=Ir *.jar fails, kuram nezini versiju?
        Uzzini to, p\u0101rbaudot pirkstu nospiedumu pret Jenkins datub\u0101zi. -fingerprint.link=https://wiki.jenkins-ci.org/display/JENKINS/Fingerprint +fingerprint.link=https://jenkins.io/redirect/fingerprint more\ details=vair\u0101k inform\u0101cijas diff --git a/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_nl.properties b/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_nl.properties index 5e41e8d23b1e490cadd1ec77c5e34cdaa3e5ea74..0b90844761b5b48c3ab7eb84e38e1d5fab2eb1f4 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_nl.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_nl.properties @@ -24,5 +24,5 @@ Check\ File\ Fingerprint=Controleer de vingerafdruk van bestanden File\ to\ check=Te controleren bestand Check=Controleren description=Heb je een jar-bestand waarvan je de versie niet weet?
        Vind de versie door de vingerafdruk te controleren tegen de databank in Jenkins -fingerprint.link=https://wiki.jenkins-ci.org/display/JENKINS/Fingerprint +fingerprint.link=https://jenkins.io/redirect/fingerprint more\ details=meer details diff --git a/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_pl.properties b/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_pl.properties index b07d6409b6aace532d5f8d47e3834dfbd468264c..adf8853649fa212c75bd2b3e51b00aa803517a5a 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_pl.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_pl.properties @@ -24,5 +24,5 @@ Check=Sprawd\u017A Check\ File\ Fingerprint=Wyszukaj wyst\u0105pienia artefaktu File\ to\ check=Plik do sprawdzenia description=Masz plik ale nie wiesz w kt\u00F3rych zadaniach wyst\u0119puje?
        Wyszukaj je w bazie danych Jenkinsa. -fingerprint.link=https://wiki.jenkins-ci.org/display/JENKINS/Fingerprint +fingerprint.link=https://jenkins.io/redirect/fingerprint more\ details=wi\u0119cej detali diff --git a/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_pt_BR.properties b/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_pt_BR.properties index 65888e0336755c37432eca9bd532b128c023f2c1..54b45f3935c4612df46b941664b429c08591da8e 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_pt_BR.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_pt_BR.properties @@ -23,8 +23,8 @@ Check\ File\ Fingerprint=Verificar impress\u00E3o digital do arquivo File\ to\ check=Arquivo para verificar Check=Verificar -# https://wiki.jenkins-ci.org/display/JENKINS/Fingerprint -fingerprint.link=https://wiki.jenkins-ci.org/display/JENKINS/Fingerprint +# https://jenkins.io/redirect/fingerprint +fingerprint.link=https://jenkins.io/redirect/fingerprint # \ # Got a jar file but don''t know which version it is?
        \ # Find that out by checking the fingerprint against \ diff --git a/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_ru.properties b/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_ru.properties index 9866aee1883d81b8fc5ce7a7530152abd3a530f7..2bda6cc429ea36b01e04578a02b1da824e2563c8 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_ru.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_ru.properties @@ -24,5 +24,5 @@ Check\ File\ Fingerprint=\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c File\ to\ check=\u0424\u0430\u0439\u043b \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 Check=\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c description=\u041D\u0435 \u0437\u043D\u0430\u0435\u0442\u0435 \u0432\u0435\u0440\u0441\u0438\u044E Jar-\u0444\u0430\u0439\u043B\u0430?
        \u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044C \u0432\u0430\u0448 jar-\u0444\u0430\u0439\u043B \u0434\u043B\u044F \u0435\u0433\u043E \u0441\u0440\u0430\u0432\u043D\u0435\u043D\u0438\u044F \u0441 \u0431\u0430\u0437\u043E\u0439 \u043E\u0442\u043F\u0435\u0447\u0430\u0442\u043A\u043E\u0432 \u0444\u0430\u0439\u043B\u043E\u0432 Jenkins -fingerprint.link=https://wiki.jenkins-ci.org/display/JENKINS/Fingerprint +fingerprint.link=https://jenkins.io/redirect/fingerprint more\ details=\u0434\u043E\u043F\u043E\u043B\u043D\u0438\u0442\u0435\u043B\u044C\u043D\u0430\u044F \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u044F diff --git a/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_sk.properties b/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_sk.properties index 3d4ccea16d382e661f07f394899ff2f4c139a7ea..714bd48aa4b211f195965bacdc4ea7276852845a 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_sk.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_sk.properties @@ -3,5 +3,5 @@ Check=Skontroluj Check\ File\ Fingerprint=Skontroluj odtla\u010Dok s\u00FAboru File\ to\ check=S\u00FAbor na kontrolu -fingerprint.link=https://wiki.jenkins-ci.org/display/JENKINS/Fingerprint +fingerprint.link=https://jenkins.io/redirect/fingerprint more\ details=viac detailov diff --git a/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_sr.properties b/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..5e41956e636e75899f45d22ea2bc1f60e3a134d8 --- /dev/null +++ b/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_sr.properties @@ -0,0 +1,10 @@ +# This file is under the MIT License by authors + +Check\ File\ Fingerprint=\u041F\u0440\u043E\u0432\u0435\u0440\u0438 +description=\u041D\u0435\u0437\u043D\u0430\u0442\u0435 \u0432\u0435\u0440\u0437\u0438\u0458\u0443 \u043E\u0434 \u043D\u0435\u043A\u0435 '.jar' \u0430\u0440\u0445\u0438\u0432\u0435?
        \ +\u041F\u0440\u043E\u0432\u0435\u0440\u0438\u0442\u0435 \u043F\u043E \u0434\u0438\u0433\u0438\u0442\u0430\u043B\u043D\u043E\u043C \u043E\u0442\u0438\u0441\u043A\u0443. +fingerprint.link=https://jenkins.io/redirect/fingerprint +more\ details=\u0412\u0438\u0448\u0435 \u0434\u0435\u0442\u0430\u0459\u0430 +File\ to\ check=\u0410\u0440\u0445\u0438\u0432\u0430 \u0437\u0430 \u043F\u0440\u043E\u0432\u0435\u0440\u0438\u0432\u0430\u045A\u0435 +Check=\u041F\u0440\u043E\u0432\u0435\u0440\u0438 +Find=\u041F\u0440\u043E\u043D\u0430\u0452\u0438 diff --git a/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_sv_SE.properties b/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_sv_SE.properties index 4a8deba12d35c7627556a70cd8c8ea75e66cde3b..0e75e28d3964585286a067bf75aae5dfa597c62d 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_sv_SE.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_sv_SE.properties @@ -24,5 +24,5 @@ Check=Kontrollera Check\ File\ Fingerprint=Kontrollera filkontrollsumma File\ to\ check=Fil att kontrollera description=Har du en jar fil men vet inte vilket version den \u00E4r?
        Kontrollera det via kontrollsumman i Jenkins databas -fingerprint.link=https://wiki.jenkins-ci.org/display/JENKINS/Fingerprint +fingerprint.link=https://jenkins.io/redirect/fingerprint more\ details=mer detaljer diff --git a/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_zh_TW.properties b/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_zh_TW.properties index 7571b68fc055258271af5da8b318ac64b6b5d1a9..3258dafaee7ac407356aaacab6bbf594fa93747e 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_zh_TW.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_zh_TW.properties @@ -22,7 +22,7 @@ Check\ File\ Fingerprint=\u6aa2\u67e5\u6a94\u6848\u6307\u7d0b description=\u624B\u908A\u6709\u500B JAR \u6A94\uFF0C\u4F46\u662F\u537B\u4E0D\u77E5\u9053\u5B83\u5230\u5E95\u662F\u54EA\u4E00\u7248\u7684?
        \u900F\u904E\u6A94\u6848\u7684\u7279\u5FB5\u503C\u5230 Jenkins \u7684\u8CC7\u6599\u5EAB\u88E1\u627E\u770B\u770B\u5427 -fingerprint.link=https://wiki.jenkins-ci.org/display/JENKINS/Fingerprint +fingerprint.link=https://jenkins.io/redirect/fingerprint more\ details=\u8a73\u7d30\u8cc7\u6599 File\ to\ check=\u8981\u6aa2\u67e5\u7684\u6a94\u6848 Check=\u6aa2\u67e5 diff --git a/core/src/main/resources/jenkins/model/Jenkins/help-rawWorkspaceDir.html b/core/src/main/resources/jenkins/model/Jenkins/help-rawWorkspaceDir.html index 765f7464e00014a68f8d75756ed2297aa15c11d2..0249a88dd4804bc9b77b56dc2d5e3550193523d9 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/help-rawWorkspaceDir.html +++ b/core/src/main/resources/jenkins/model/Jenkins/help-rawWorkspaceDir.html @@ -26,5 +26,5 @@ page is saved, but note that Jenkins will not automatically migrate any data from the current workspace root directory.

        - The default value is ${ITEM_ROOTDIR}/workspace. + The default value is ${JENKINS_HOME}/workspace/${ITEM_FULLNAME}. diff --git a/core/src/main/resources/jenkins/model/Jenkins/help-rawWorkspaceDir_bg.html b/core/src/main/resources/jenkins/model/Jenkins/help-rawWorkspaceDir_bg.html index a6bd513f56b8bbc26a566d3f15328dfe1c7670c9..63c090bb308ba7920c99285be7c6f7b840b59e10 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/help-rawWorkspaceDir_bg.html +++ b/core/src/main/resources/jenkins/model/Jenkins/help-rawWorkspaceDir_bg.html @@ -26,5 +26,5 @@ страница с настройки. Jenkins няма автоматично да мигрира каквито и да е данни от текущата директория за изграждане.

        - Стандартната стойност е ${ITEM_ROOTDIR}/workspace. + Стандартната стойност е ${JENKINS_HOME}/workspace/${ITEM_FULLNAME}. diff --git a/core/src/main/resources/jenkins/model/Jenkins/help-rawWorkspaceDir_ja.html b/core/src/main/resources/jenkins/model/Jenkins/help-rawWorkspaceDir_ja.html index b5547fffe1f121f474a4a2a6e8d94a07a6740e76..6967b33ac69496b206f73384d4a3b4d85dc04ff0 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/help-rawWorkspaceDir_ja.html +++ b/core/src/main/resources/jenkins/model/Jenkins/help-rawWorkspaceDir_ja.html @@ -10,5 +10,5 @@

        この値を変更することで、ワークスペースをSSD、SCSIあるいはRAMディスク上にワークスペースを配置することができます。 - デフォルト値は、${ITEM_ROOTDIR}/workspaceです。 + デフォルト値は、${JENKINS_HOME}/workspace/${ITEM_FULLNAME}です。 diff --git a/core/src/main/resources/jenkins/model/Jenkins/legend_es.properties b/core/src/main/resources/jenkins/model/Jenkins/legend_es.properties index 4cf758e8d334c73eb9f0108a85fff3cb5b55bcc9..825dbb92b66140483d726d0672e7f5c0c5c19478 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/legend_es.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/legend_es.properties @@ -33,4 +33,4 @@ health-81plus=El estado de salud del proyecto supera el 80%. Puedes situar el ra health-00to20=El estado de salud del proyecto es inferior al 20%. Puedes situar el rat\u00F3n sobre el icono para ver una explicaci\u00F3n detallada. health-41to60=El estado de salud del proyecto est\u00E1 entre el 40% y el 60%. Puedes situar el rat\u00F3n sobre el icono para ver una explicaci\u00F3n detallada. health-21to40=El estado de salud del proyecto est\u00E1 entre el 20% y el 40%. Puedes situar el rat\u00F3n sobre el icono para ver una explicaci\u00F3n detallada. -health-61to80=El estado de salud del proyecto est\u00E1 entre el 80% y 80%. Puedes situar el rat\u00F3n sobre el icono para ver una explicaci\u00F3n detallada. +health-61to80=El estado de salud del proyecto est\u00E1 entre el 60% y 80%. Puedes situar el rat\u00F3n sobre el icono para ver una explicaci\u00F3n detallada. diff --git a/core/src/main/resources/jenkins/model/Jenkins/legend_pl.properties b/core/src/main/resources/jenkins/model/Jenkins/legend_pl.properties index 5b008064d984b2acfa8c1ca124d8acc08d5bce45..e4c1928f3a588a49fb7b5f6c69b602c847b68354 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/legend_pl.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/legend_pl.properties @@ -1,5 +1,24 @@ -# This file is under the MIT License by authors - +# The MIT License +# +# Copyright (c) 2013-2016, Sun Microsystems., Inc, Damian Szczepanik +# +# 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. blue=Ostatnie zadanie projektu zako\u0144czy\u0142o si\u0119 pomy\u015Blnie. blue_anime=Ostatnie zadanie projektu zako\u0144czy\u0142o si\u0119 pomy\u015Blnie. Nowa wersja jest w trakcie budowy. grey=Zadanie nie zosta\u0142o dotychczas zako\u0144czone lub jest wy\u0142\u0105czony. @@ -8,8 +27,8 @@ red=Ostatnie zadanie projektu nie powiod\u0142o si\u0119. red_anime=Ostatnie zadanie projektu nie powiod\u0142o si\u0119. Nowa wersja jest w trakcie budowy. yellow=Ostatnie zadanie projektu zako\u0144czy\u0142o si\u0119 pomy\u015Blnie, lecz wersja jest niestabilna. To oznaczenie stosowane jest dla projekt\u00F3w, w kt\u00F3rych testy zako\u0144czy\u0142y si\u0119 niepowodzeniem. yellow_anime=Ostatnie zadanie projektu zako\u0144czy\u0142o si\u0119 pomy\u015Blnie, lecz wersja jest niestabilna. Nowa wersja jest w trakcie budowy. -health-81plus=Budowanie zako\u0144czone pomy\u015Blnie w ponad 80 procent przypadk\u00F3w. Przesu\u0144 myszk\u0119 nad ikon\u0119 projektu, aby sprawdzi\u0107 szczeg\u00F3\u0142y. -health-61to80=Budowanie zako\u0144czone pomy\u015Blnie pomi\u0119dzy 60 a 80 procent przypadk\u00F3w. Przesu\u0144 myszk\u0119 nad ikon\u0119 projektu, aby sprawdzi\u0107 szczeg\u00F3\u0142y. -health-41to60=Budowanie zako\u0144czone pomy\u015Blnie pomi\u0119dzy 40 a 60 procent przypadk\u00F3w. Przesu\u0144 myszk\u0119 nad ikon\u0119 projektu, aby sprawdzi\u0107 szczeg\u00F3\u0142y. -health-21to40=Budowanie zako\u0144czone pomy\u015Blnie pomi\u0119dzy 20 a 40 procent przypadk\u00F3w. Przesu\u0144 myszk\u0119 nad ikon\u0119 projektu, aby sprawdzi\u0107 szczeg\u00F3\u0142y. -health-00to20=Budowanie zako\u0144czone pomy\u015Blnie w poni\u017Cej 20 procent przypadk\u00F3w. Przesu\u0144 myszk\u0119 nad ikon\u0119 projektu, aby sprawdzi\u0107 szczeg\u00F3\u0142y. +health-81plus=Zadanie zako\u0144czone pomy\u015Blnie w ponad 80 procent przypadk\u00F3w. Przesu\u0144 myszk\u0119 nad ikon\u0119 projektu, aby sprawdzi\u0107 szczeg\u00F3\u0142y. +health-61to80=Zadanie zako\u0144czone pomy\u015Blnie pomi\u0119dzy 60 a 80 procent przypadk\u00F3w. Przesu\u0144 myszk\u0119 nad ikon\u0119 projektu, aby sprawdzi\u0107 szczeg\u00F3\u0142y. +health-41to60=Zadanie zako\u0144czone pomy\u015Blnie pomi\u0119dzy 40 a 60 procent przypadk\u00F3w. Przesu\u0144 myszk\u0119 nad ikon\u0119 projektu, aby sprawdzi\u0107 szczeg\u00F3\u0142y. +health-21to40=Zadanie zako\u0144czone pomy\u015Blnie pomi\u0119dzy 20 a 40 procent przypadk\u00F3w. Przesu\u0144 myszk\u0119 nad ikon\u0119 projektu, aby sprawdzi\u0107 szczeg\u00F3\u0142y. +health-00to20=Zadanie zako\u0144czone pomy\u015Blnie w poni\u017Cej 20 procent przypadk\u00F3w. Przesu\u0144 myszk\u0119 nad ikon\u0119 projektu, aby sprawdzi\u0107 szczeg\u00F3\u0142y. diff --git a/core/src/main/resources/jenkins/model/Jenkins/legend_sr.properties b/core/src/main/resources/jenkins/model/Jenkins/legend_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..3397c9f26a67e367228f2e81b24e2d31775fbd6c --- /dev/null +++ b/core/src/main/resources/jenkins/model/Jenkins/legend_sr.properties @@ -0,0 +1,20 @@ +# This file is under the MIT License by authors + +grey=\u041F\u0440\u043E\u0458\u0435\u043A\u0430\u0442 \u043D\u0438\u0458\u0435 \u043F\u0440\u0435 \u0431\u0438\u0458\u043E \u0438\u0437\u0433\u0440\u0430\u0452\u0435\u043D, \u0438\u043B\u0438 \u0458\u0435 \u043F\u0440\u043E\u0458\u0435\u043A\u0430\u0442 \u043E\u043D\u0435\u043C\u043E\u0433\u0443\u045B\u0435\u043D. +grey_anime=\u041F\u0440\u0432\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u0430 \u0458\u0435 \u0443 \u0442\u043E\u043A\u0443 +blue=\u0417\u0430\u0434\u045A\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 \u0458\u0435 \u0431\u0438\u043B\u0430 \u0443\u0441\u043F\u0435\u0448\u043D\u0430 +blue_anime=\u0417\u0430\u0434\u045A\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 \u0458\u0435 \u0431\u0438\u043B\u0430 \u043D\u0435\u0443\u0441\u043F\u0435\u0448\u043D\u0430. \u041D\u043E\u0432\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 \u0458\u0435 \u0443 \u0442\u043E\u043A\u0443. +yellow=\u0417\u0430\u0434\u045A\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 \u0458\u0435 \u0443\u0441\u043F\u0435\u0448\u043D\u0430 \u0430\u043B\u0438 \u043D\u0435\u0441\u0442\u0430\u0431\u0438\u043B\u043D\u0430. \u041D\u0430\u0458\u0447\u0435\u0448\u045B\u0435 \u0441\u0435 \u0442\u043E \u0434\u0435\u0448\u0430\u0432\u0430 \u0437\u0431\u043E\u0433 \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0438\u043C\u0430 \u043F\u0440\u0438\u043B\u0438\u043A\u043E\u043C \u0442\u0435\u0441\u0442\u0438\u0440\u0430\u045A\u0430. +yellow_anime=\u0417\u0430\u0434\u045A\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 \u0458\u0435 \u0443\u0441\u043F\u0435\u0448\u043D\u0430 \u0430\u043B\u0438 \u043D\u0435\u0441\u0442\u0430\u0431\u0438\u043B\u043D\u0430. \u041D\u043E\u0432\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 \u0458\u0435 \u0443 \u0442\u043E\u043A\u0443. +red=\u0417\u0430\u0434\u045A\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 \u0458\u0435 \u043D\u0435\u0443\u0441\u043F\u0435\u0448\u043D\u0430. +red_anime=\u0417\u0430\u0434\u045A\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 \u0458\u0435 \u043D\u0435\u0443\u0441\u043F\u0435\u0448\u043D\u0430. \u041D\u043E\u0432\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 \u0458\u0435 \u0443 \u0442\u043E\u043A\u0443. +health-81plus=\u0417\u0434\u0440\u0430\u0432\u0459\u0435 \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u0430 \u0458\u0435 \u043F\u0440\u0435\u043A\u043E 80%. \u041F\u0440\u0438\u0432\u0443\u0446\u0438\u0442\u0435 \u043C\u0438\u0448 \u043F\u0440\u0435\u043A\u043E \u045A\u0435\u043D\u0435 \u0438\u043A\u043E\u043D\u0438\u0446\u0435 \u0437\u0430 \u0434\u0435\u0442\u0430\u0459\u043D\u0438\u0458\u0438 \u043E\u043F\u0438\u0441. +health-61to80=\u0417\u0434\u0440\u0430\u0432\u0459\u0435 \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u0430 \u0458\u0435 \u0438\u0437\u043C\u0435\u0452\u0443 60 \u0438 80%. \u041F\u0440\u0438\u0432\u0443\u0446\u0438\u0442\u0435 \u043C\u0438\u0448 \u043F\u0440\u0435\u043A\u043E \u045A\u0435\u043D\u0435 \u0438\u043A\u043E\u043D\u0438\u0446\u0435 \u0437\u0430 \u0434\u0435\u0442\u0430\u0459\u043D\u0438\u0458\u0438 \u043E\u043F\u0438\u0441. +health-41to60=\u0417\u0434\u0440\u0430\u0432\u0459\u0435 \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u0430 \u0458\u0435 \u0438\u0437\u043C\u0435\u0452\u0443 40 \u0438 60%. \u041F\u0440\u0438\u0432\u0443\u0446\u0438\u0442\u0435 \u043C\u0438\u0448 \u043F\u0440\u0435\u043A\u043E \u045A\u0435\u043D\u0435 \u0438\u043A\u043E\u043D\u0438\u0446\u0435 \u0437\u0430 \u0434\u0435\u0442\u0430\u0459\u043D\u0438\u0458\u0438 \u043E\u043F\u0438\u0441. +health-21to40=\u0417\u0434\u0440\u0430\u0432\u0459\u0435 \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u0430 \u0458\u0435 \u0438\u0437\u043C\u0435\u0452\u0443 20 \u0438 40%. \u041F\u0440\u0438\u0432\u0443\u0446\u0438\u0442\u0435 \u043C\u0438\u0448 \u043F\u0440\u0435\u043A\u043E \u045A\u0435\u043D\u0435 \u0438\u043A\u043E\u043D\u0438\u0446\u0435 \u0437\u0430 \u0434\u0435\u0442\u0430\u0459\u043D\u0438\u0458\u0438 \u043E\u043F\u0438\u0441. +health-00to20=\u0417\u0434\u0440\u0430\u0432\u0459\u0435 \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u0430 \u0458\u0435 \u0438\u0441\u043F\u043E\u0434 20%. \u041F\u0440\u0438\u0432\u0443\u0446\u0438\u0442\u0435 \u043C\u0438\u0448 \u043F\u0440\u0435\u043A\u043E \u045A\u0435\u043D\u0435 \u0438\u043A\u043E\u043D\u0438\u0446\u0435 \u0437\u0430 \u0434\u0435\u0442\u0430\u0459\u043D\u0438\u0458\u0438 \u043E\u043F\u0438\u0441. +health-00to19=\u0417\u0434\u0440\u0430\u0432\u0459\u0435 \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u0430 \u0458\u0435 \u0438\u0437\u043C\u0435\u0452\u0443 0 \u0438 20%. \u041F\u0440\u0438\u0432\u0443\u0446\u0438\u0442\u0435 \u043C\u0438\u0448 \u043F\u0440\u0435\u043A\u043E \u045A\u0435\u043D\u0435 \u0438\u043A\u043E\u043D\u0438\u0446\u0435 \u0437\u0430 \u0434\u0435\u0442\u0430\u0459\u043D\u0438\u0458\u0438 \u043E\u043F\u0438\u0441. +health-20to39=\u0417\u0434\u0440\u0430\u0432\u0459\u0435 \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u0430 \u0458\u0435 \u0438\u0437\u043C\u0435\u0452\u0443 20 \u0438 40%. \u041F\u0440\u0438\u0432\u0443\u0446\u0438\u0442\u0435 \u043C\u0438\u0448 \u043F\u0440\u0435\u043A\u043E \u045A\u0435\u043D\u0435 \u0438\u043A\u043E\u043D\u0438\u0446\u0435 \u0437\u0430 \u0434\u0435\u0442\u0430\u0459\u043D\u0438\u0458\u0438 \u043E\u043F\u0438\u0441. +health-40to59=\u0417\u0434\u0440\u0430\u0432\u0459\u0435 \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u0430 \u0458\u0435 \u0438\u0437\u043C\u0435\u0452\u0443 40 \u0438 60%. \u041F\u0440\u0438\u0432\u0443\u0446\u0438\u0442\u0435 \u043C\u0438\u0448 \u043F\u0440\u0435\u043A\u043E \u045A\u0435\u043D\u0435 \u0438\u043A\u043E\u043D\u0438\u0446\u0435 \u0437\u0430 \u0434\u0435\u0442\u0430\u0459\u043D\u0438\u0458\u0438 \u043E\u043F\u0438\u0441. +health-60to79=\u0417\u0434\u0440\u0430\u0432\u0459\u0435 \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u0430 \u0458\u0435 \u0438\u0437\u043C\u0435\u0452\u0443 60 \u0438 80%. \u041F\u0440\u0438\u0432\u0443\u0446\u0438\u0442\u0435 \u043C\u0438\u0448 \u043F\u0440\u0435\u043A\u043E \u045A\u0435\u043D\u0435 \u0438\u043A\u043E\u043D\u0438\u0446\u0435 \u0437\u0430 \u0434\u0435\u0442\u0430\u0459\u043D\u0438\u0458\u0438 \u043E\u043F\u0438\u0441. +health-80plus=\u0417\u0434\u0440\u0430\u0432\u0459\u0435 \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u0430 \u0458\u0435 \u043F\u0440\u0435\u043A\u043E 80%. \u041F\u0440\u0438\u0432\u0443\u0446\u0438\u0442\u0435 \u043C\u0438\u0448 \u043F\u0440\u0435\u043A\u043E \u045A\u0435\u043D\u0435 \u0438\u043A\u043E\u043D\u0438\u0446\u0435 \u0437\u0430 \u0434\u0435\u0442\u0430\u0459\u043D\u0438\u0458\u0438 \u043E\u043F\u0438\u0441. diff --git a/core/src/main/resources/jenkins/model/Jenkins/load-statistics_ru.properties b/core/src/main/resources/jenkins/model/Jenkins/load-statistics_ru.properties new file mode 100644 index 0000000000000000000000000000000000000000..42d8c5d4a93f30655bedf293dd38d7a0ab5d219e --- /dev/null +++ b/core/src/main/resources/jenkins/model/Jenkins/load-statistics_ru.properties @@ -0,0 +1 @@ +Load\ Statistics=\u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f diff --git a/core/src/main/resources/jenkins/model/Jenkins/load-statistics_sr.properties b/core/src/main/resources/jenkins/model/Jenkins/load-statistics_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..8c5dc1f569c0f039b1e16def515786c14bf05071 --- /dev/null +++ b/core/src/main/resources/jenkins/model/Jenkins/load-statistics_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Load\ Statistics=\u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043A\u0435 \u043E \u043E\u043F\u0442\u0435\u0440\u0435\u045B\u0435\u045A\u0443 diff --git a/core/src/main/resources/jenkins/model/Jenkins/loginError_ca.properties b/core/src/main/resources/jenkins/model/Jenkins/loginError_ca.properties index b15424ad739ee470346f127eae015db59c64d78a..467070c648ec54456f8c7b103c997b9b5d3a9dd8 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/loginError_ca.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/loginError_ca.properties @@ -1,3 +1,3 @@ # This file is under the MIT License by authors -Try\ again=Probar un altre cop +Try\ again=Provar un altre cop diff --git a/core/src/main/resources/jenkins/model/Jenkins/loginError_ru.properties b/core/src/main/resources/jenkins/model/Jenkins/loginError_ru.properties index f80e7f47fe021e60485d04a9ea76207c835a3a44..296dfea18edae61a54168d3631ef935bfa75a8bd 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/loginError_ru.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/loginError_ru.properties @@ -1,24 +1,5 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Mike Salnikov -# -# 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. - +If\ you\ are\ a\ system\ administrator\ and\ suspect\ this\ to\ be\ a\ configuration\ problem,\ see\ the\ server\ console\ output\ for\ more\ details.=\ + \u0415\u0441\u043b\u0438 \u0432\u044b \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440 \u0438 \u043f\u043e\u0434\u043e\u0437\u0440\u0435\u0432\u0430\u0435\u0442\u0435 \u043e\u0448\u0438\u0431\u043a\u0443 \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438, \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u0435\u0441\u044c \u043a \u0432\u044b\u0432\u043e\u0434\u0443 \u043a\u043e\u043d\u0441\u043e\u043b\u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u0430, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438. Invalid\ login\ information.\ Please\ try\ again.=\u041d\u0435\u0432\u0435\u0440\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u043d \u043b\u043e\u0433\u0438\u043d/\u043f\u0430\u0440\u043e\u043b\u044c. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u0435\u0449\u0435 \u0440\u0430\u0437. Try\ again=\u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u0435\u0449\u0435 \u0440\u0430\u0437 +Login\ Error=\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0432\u0445\u043e\u0434\u0435 diff --git a/core/src/main/resources/jenkins/model/Jenkins/loginError_sr.properties b/core/src/main/resources/jenkins/model/Jenkins/loginError_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..611539ab030b5a0e05ea9bc4295ebb2488f04ffd --- /dev/null +++ b/core/src/main/resources/jenkins/model/Jenkins/loginError_sr.properties @@ -0,0 +1,6 @@ +# This file is under the MIT License by authors + +Invalid\ login\ information.\ Please\ try\ again.=\u041D\u0435\u0432\u0430\u0436\u0435\u045B\u0435 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u0447\u043A\u043E \u0438\u043C\u0435 \u0438\u043B\u0438 \u043B\u043E\u0437\u0438\u043D\u043A\u0430. \u041F\u043E\u043A\u0443\u0448\u0430\u0458\u0442\u0435 \u043F\u043E\u043D\u043E\u0432\u043E. +Try\ again=\u041F\u043E\u043A\u0443\u0448\u0430\u0458\u0442\u0435 \u043E\u043F\u0435\u0442 +If\ you\ are\ a\ system\ administrator\ and\ suspect\ this\ to\ be\ a\ configuration\ problem,\ see\ the\ server\ console\ output\ for\ more\ details.=\u0410\u043A\u043E \u0441\u0442\u0435 \u0441\u0438\u0441\u0442\u0435\u043C\u0441\u043A\u0438 \u0430\u0434\u043C\u0438\u043D\u0438\u0441\u0442\u0440\u0430\u0442\u043E\u0440 \u0438 \u043C\u0438\u0441\u043B\u0438\u0442\u0435 \u0434\u0430 \u0458\u0435 \u043F\u0440\u043E\u0431\u043B\u0435\u043C \u0432\u0435\u0437\u0430\u043D \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0443, \u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0430\u0458\u0442\u0435 \u0418\u0441\u0445\u043E\u0434 \u0438\u0437 \u043A\u043E\u043D\u0437\u043E\u043B\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u0430. +Login\ Error=\u0413\u0440\u0435\u0448\u043A\u0430 \u043E\u043A\u043E \u043F\u0440\u0438\u0458\u0430\u0432\u0435 diff --git a/core/src/main/resources/jenkins/model/Jenkins/login_sr.properties b/core/src/main/resources/jenkins/model/Jenkins/login_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..b8805d268cb60bcec3c7724ee5026d19e3eeb7d0 --- /dev/null +++ b/core/src/main/resources/jenkins/model/Jenkins/login_sr.properties @@ -0,0 +1,7 @@ +# This file is under the MIT License by authors + +User=\u041A\u043E\u0440\u0438\u0441\u043D\u0438\u043A +Password=\u041B\u043E\u0437\u0438\u043D\u043A\u0430 +Remember\ me\ on\ this\ computer=\u0417\u0430\u043F\u0430\u043C\u0442\u0438 \u043C\u0435 \u043D\u0430 \u043E\u0432\u043E\u043C \u0440\u0430\u0447\u0443\u043D\u0430\u0440\u0443 +login=\u041F\u0440\u0438\u0458\u0430\u0432\u0438 \u0441\u0435 +signUp=\u041D\u0430\u043F\u0440\u0430\u0432\u0438\u0442\u0435 \u043D\u0430\u043B\u043E\u0433 \u0430\u043A\u043E \u0432\u0435\u045B \u043D\u0438\u0441\u0442\u0435. diff --git a/core/src/main/resources/jenkins/model/Jenkins/manage.jelly b/core/src/main/resources/jenkins/model/Jenkins/manage.jelly index 0769b65bd0a50d1435863ff01a75dc7be63d695e..ff56ce0eca55ef3bf54489541999d4c9c35cdc5c 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/manage.jelly +++ b/core/src/main/resources/jenkins/model/Jenkins/manage.jelly @@ -32,15 +32,15 @@ THE SOFTWARE. - ${taskTags!=null and attrs.contextMenu!='false' ? taskTags.add(href,iconUrl,title,requiresConfirmation,requiresConfirmation) : null} + ${taskTags!=null and attrs.contextMenu!='false' ? taskTags.add(href,iconUrl,title,post,requiresConfirmation) : null} + href="${requiresConfirmation || post ? null : href}" iconOnly="true">

        - @@ -55,7 +54,6 @@ THE SOFTWARE. - diff --git a/core/src/main/resources/jenkins/model/Jenkins/systemInfo_bg.properties b/core/src/main/resources/jenkins/model/Jenkins/systemInfo_bg.properties index fcafa62f632ecbb13a4c9e85f77d6fb9993614e8..bf6faaac091d5608fd1b02d0f5f891502ee9128a 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/systemInfo_bg.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/systemInfo_bg.properties @@ -40,7 +40,5 @@ Thread\ Dumps=\ \u0420\u0430\u0437\u0442\u043e\u0432\u0430\u0440\u0432\u0430\u043d\u0438\u044f \u043d\u0430 \u043d\u0438\u0448\u043a\u0438\u0442\u0435 Version=\ \u0412\u0435\u0440\u0441\u0438\u044f -Pinned=\ - \u041d\u0435\u043f\u0440\u043e\u043c\u0435\u043d\u044f\u0435\u043c\u0430 \u0432\u0435\u0440\u0441\u0438\u044f System\ Information=\ \u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0437\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0442\u0430 diff --git a/core/src/main/resources/jenkins/model/Jenkins/systemInfo_de.properties b/core/src/main/resources/jenkins/model/Jenkins/systemInfo_de.properties index 8a60d7efc04c456e42141a2929e2ffd19ead1424..fc2bd2cf3f55b726f8cc86ecd66e7e11a5881dd2 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/systemInfo_de.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/systemInfo_de.properties @@ -24,7 +24,6 @@ System\ Properties=Systemeigenschaften Environment\ Variables=Umgebungsvariablen Enabled=Aktiviert No\ plugins\ installed.=Keine Plugins installiert. -Pinned=Gesperrt Name=Name Plugins=Plugins Version=Version diff --git a/core/src/main/resources/jenkins/model/Jenkins/systemInfo_el.properties b/core/src/main/resources/jenkins/model/Jenkins/systemInfo_el.properties index bf8e0b8ab36e4cc5b6c0556850fce3bd3aca97fb..e6664ac87cfb3a2eba37398179b562ff361aa9ba 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/systemInfo_el.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/systemInfo_el.properties @@ -3,7 +3,6 @@ Enabled=\u0395\u03BD\u03B5\u03C1\u03B3\u03BF\u03C0\u03BF\u03B9\u03B7\u03BC\u03AD\u03BD\u03BF Environment\ Variables=\u039C\u03B5\u03C4\u03B1\u03B2\u03BB\u03B7\u03C4\u03AD\u03C2 \u03A0\u03B5\u03C1\u03B9\u03B2\u03AC\u03BB\u03BB\u03BF\u03BD\u03C4\u03BF\u03C2 Name=\u038C\u03BD\u03BF\u03BC\u03B1 -Pinned=\u039A\u03B1\u03C1\u03C6\u03B9\u03C4\u03C3\u03C9\u03BC\u03AD\u03BD\u03BF Plugins=\u03A0\u03C1\u03CC\u03C3\u03B8\u03B5\u03C4\u03B1 System\ Properties=\u039C\u03B5\u03C4\u03B1\u03B2\u03BB\u03B7\u03C4\u03AD\u03C2 \u03A3\u03C5\u03C3\u03C4\u03AE\u03BC\u03B1\u03C4\u03BF\u03C2 Version=\u0388\u03BA\u03B4\u03BF\u03C3\u03B7 diff --git a/core/src/main/resources/jenkins/model/Jenkins/systemInfo_es.properties b/core/src/main/resources/jenkins/model/Jenkins/systemInfo_es.properties index 3be54b1ec33ea1ac7808f052afa6a1160ddc3945..f5661dca26d35cf215275871c816e7a965243e42 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/systemInfo_es.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/systemInfo_es.properties @@ -25,7 +25,6 @@ Environment\ Variables=Variables de entorno Version=Versin Plugins=plugins No\ plugins\ installed.=No hay plugins instalados -Pinned=Fijado Name=Nombre Enabled=Activo System\ Information=Informacin del sistema diff --git a/core/src/main/resources/jenkins/model/Jenkins/systemInfo_fr.properties b/core/src/main/resources/jenkins/model/Jenkins/systemInfo_fr.properties index 4588c573759970352d5968cbc93a5129eb9bcb67..3a5d2f906494ed03c57925a625fe7e25425b4fc0 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/systemInfo_fr.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/systemInfo_fr.properties @@ -21,7 +21,6 @@ # THE SOFTWARE. Name=Nom -Pinned=Rep\u00E9r\u00E9 System\ Properties=Proprits systme Enabled=En effet Environment\ Variables=Variables d''environnement diff --git a/core/src/main/resources/jenkins/model/Jenkins/systemInfo_it.properties b/core/src/main/resources/jenkins/model/Jenkins/systemInfo_it.properties index 358b6eac5261d86b9a0ec03aec57df056e6d1fad..f22f5f1ac7e8bc44d174b4b5e69a75b5305d5af7 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/systemInfo_it.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/systemInfo_it.properties @@ -23,7 +23,6 @@ Enabled=Attivo Environment\ Variables=Variabili d''ambiente Name=Nome -Pinned=Fisso Plugins=Estensioni System\ Properties=Propriet\u00E0 di sistema Version=Versione diff --git a/core/src/main/resources/jenkins/model/Jenkins/systemInfo_ja.properties b/core/src/main/resources/jenkins/model/Jenkins/systemInfo_ja.properties index 49b8a4f79a41b02c8aa8a654460e1779a9a336ac..5db7ded37efca4afff4ce99954e53d384a984f36 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/systemInfo_ja.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/systemInfo_ja.properties @@ -28,5 +28,4 @@ No\ plugins\ installed.=\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3055\u308c\u3066\u Name=\u540d\u524d Version=\u30d0\u30fc\u30b8\u30e7\u30f3 Enabled=\u6709\u52b9\u5316 -Pinned=\u30d4\u30f3 Thread\ Dumps=\u30b9\u30ec\u30c3\u30c9\u30c0\u30f3\u30d7 diff --git a/core/src/main/resources/jenkins/model/Jenkins/systemInfo_ko.properties b/core/src/main/resources/jenkins/model/Jenkins/systemInfo_ko.properties index ca302f61572fa97c854c16d55c91c285643d17d9..15002250f6c7dc04817b97fb09154dafb0ba0fd9 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/systemInfo_ko.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/systemInfo_ko.properties @@ -23,7 +23,6 @@ Enabled=\uD65C\uC131\uD654 Environment\ Variables=\uD658\uACBD \uBCC0\uC218 Name=\uC774\uB984 -Pinned=\uACE0\uC815 Plugins=\uD50C\uB7EC\uADF8\uC778 System\ Properties=\uC2DC\uC2A4\uD15C \uC18D\uC131 Version=\uBC84\uC804 diff --git a/core/src/main/resources/jenkins/model/Jenkins/systemInfo_lt.properties b/core/src/main/resources/jenkins/model/Jenkins/systemInfo_lt.properties index 14d3ece4e9b7c46e058d36f4bb24f5b8be6ef516..3de2a8f72eb4ce0aea97d095a16b91e145c7a64c 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/systemInfo_lt.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/systemInfo_lt.properties @@ -1,6 +1,5 @@ threadDump_blurb=\u0160iame puslapyje rasite pagrindinio ir agent\u0173 gij\u0173 l\u016b\u017eimo informacij\u0105. No\ plugins\ installed.=N\u0117ra \u012fdiegt\u0173 pried\u0173. -Pinned=Prisegtas Name=Pavadinimas System\ Properties=Sistemos savyb\u0117s System\ Information=Sistemos informacija diff --git a/core/src/main/resources/jenkins/model/Jenkins/systemInfo_lv.properties b/core/src/main/resources/jenkins/model/Jenkins/systemInfo_lv.properties index b5374d7e766cf07e62c3889dd32f1d50a2f2670a..932f25c17dd79cad1a17b74aaa736e6ce31aed49 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/systemInfo_lv.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/systemInfo_lv.properties @@ -3,7 +3,6 @@ Enabled=Iesp\u0113jots Environment\ Variables=Vides Main\u012Bgie Name=Nosaukums -Pinned=Piesaist\u012Bts Plugins=Spraud\u0146i System\ Properties=Sist\u0113mas parametri Version=Versija diff --git a/core/src/main/resources/jenkins/model/Jenkins/systemInfo_pl.properties b/core/src/main/resources/jenkins/model/Jenkins/systemInfo_pl.properties index 96c85cb8bf81b75adfa0324887f43904d96b149e..215eb8c77bcac78c904677474c2fe67a8da72fe4 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/systemInfo_pl.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/systemInfo_pl.properties @@ -1,9 +1,29 @@ -# This file is under the MIT License by authors - +# The MIT License +# +# Copyright (c) 2013-2017, Kohsuke Kawaguchi, Damian Szczepanik +# +# 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. Enabled=W\u0142\u0105czony Environment\ Variables=Zmienne systemowe Name=Nazwa -Pinned=Przypi\u0119ty Plugins=Wtyczki System\ Properties=W\u0142a\u015Bciwo\u015Bci systemu Version=Wersja +threadDump_blurb=Otw\u00F3rz t\u0119 stron\u0119, aby sprawdzi\u0107 w\u0105tki dla mastera i agent\u00F3w. +Thread\ Dumps=Zrzut w\u0105tk\u00F3w diff --git a/core/src/main/resources/jenkins/model/Jenkins/systemInfo_pt_BR.properties b/core/src/main/resources/jenkins/model/Jenkins/systemInfo_pt_BR.properties index 0e7bcd03135d1eb829ffc2f17968d483608b8cbc..e9fea4ceafe8a1ca9e17f17f4f3ef3ce5cefdcd0 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/systemInfo_pt_BR.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/systemInfo_pt_BR.properties @@ -21,7 +21,6 @@ # THE SOFTWARE. Name=Nome -Pinned=Fixado Plugins=Plugins System\ Properties=Propriedades do sistema Enabled=Habilitado diff --git a/core/src/main/resources/jenkins/model/Jenkins/systemInfo_ru.properties b/core/src/main/resources/jenkins/model/Jenkins/systemInfo_ru.properties index db88258f9f48a88e5d431206d168637cebc4e5ec..3c05d3719e595e4c47962e5c910fd3315dd261fd 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/systemInfo_ru.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/systemInfo_ru.properties @@ -1,17 +1,17 @@ # The MIT License -# +# # Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Mike Salnikov -# +# # 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 @@ -20,10 +20,13 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Name=\u0418\u043C\u044F -Pinned=\u041F\u0440\u0438\u043A\u0440\u0435\u043F\u043B\u0435\u043D -Plugins=\u041F\u043B\u0430\u0433\u0438\u043D\u044B +Name=\u0418\u043c\u044f +Plugins=\u041f\u043b\u0430\u0433\u0438\u043d\u044b System\ Properties=\u0421\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u044b -Enabled=\u0410\u043A\u0442\u0438\u0432\u0435\u043D +Enabled=\u0410\u043a\u0442\u0438\u0432\u0435\u043d Environment\ Variables=\u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f -Version=\u0412\u0435\u0440\u0441\u0438\u044F +Version=\u0412\u0435\u0440\u0441\u0438\u044f +System\ Information=\u0421\u0438\u0441\u0442\u0435\u043c\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f +Thread\ Dumps=\u0414\u0430\u043c\u043f\u044b \u043f\u043e\u0442\u043e\u043a\u043e\u0432 +threadDump_blurb=\u0417\u0430\u0439\u0434\u0438\u0442\u0435 \u043d\u0430 \u044d\u0442\u0443 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0434\u0430\u043c\u043f\u044b \u043c\u0430\u0441\u0442\u0435\u0440\u0430 \u0438 \u0430\u0433\u0435\u043d\u0442\u043e\u0432. +No\ plugins\ installed.=\u041d\u0435\u0442 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432. \ No newline at end of file diff --git a/core/src/main/resources/jenkins/model/Jenkins/systemInfo_sr.properties b/core/src/main/resources/jenkins/model/Jenkins/systemInfo_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..9c8e87a46df132b3ef173c8b77bf8d8a5871f852 --- /dev/null +++ b/core/src/main/resources/jenkins/model/Jenkins/systemInfo_sr.properties @@ -0,0 +1,12 @@ +# This file is under the MIT License by authors + +System\ Information=\u0418\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0458\u0435 \u043E \u0441\u0438\u0441\u0442\u0435\u043C\u0443 +System\ Properties=\u0421\u0438\u0441\u0442\u0435\u043C\u0441\u043A\u0430 \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 +Environment\ Variables=\u041F\u0440\u043E\u043C\u0435\u043D\u0459\u0438\u0432\u0435 \u0441\u0440\u0435\u0434\u0438\u043D\u0435 +Plugins=\u041C\u043E\u0434\u0443\u043B\u0435 +No\ plugins\ installed.=\u041D\u0435\u043C\u0430 \u0438\u043D\u0441\u0442\u0430\u043B\u0438\u0440\u0430\u043D\u0438\u0445 \u043C\u043E\u0434\u0443\u043B\u0430. +Name=\u0418\u043C\u0435 +Version=\u0412\u0435\u0440\u0437\u0438\u0458\u0430 +Enabled=\u041E\u043C\u043E\u0433\u0443\u045B\u0435\u043D\u043E +Thread\ Dumps=\u0414\u0435\u043F\u043E\u043D\u0438\u0458a \u043D\u0438\u0442\u043E\u0432\u0430 +threadDump_blurb=\u041E\u0442\u0438\u0452\u0438\u0442\u0435 \u043D\u0430 \u043E\u0432\u0443 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0443 \u0434\u0430 \u0432\u0438\u0434\u0438\u0442\u0435 \u0434\u0435\u043F\u043E\u043D\u0438\u0458\u0435 \u043D\u0438\u0442\u043E\u0432\u0430 \u0433\u043B\u0430\u0432\u043D\u0438\u0445 \u0438 \u0430\u0433\u0435\u043D\u0442\u043D\u0438\u0445 \u043C\u0430\u0448\u0438\u043D\u0430. diff --git a/core/src/main/resources/jenkins/model/Jenkins/systemInfo_sv_SE.properties b/core/src/main/resources/jenkins/model/Jenkins/systemInfo_sv_SE.properties index a710373a0898f48f29f6f507de12b475ff1c4524..edee65f72b856ecdc1d67b7431b448b3ed595772 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/systemInfo_sv_SE.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/systemInfo_sv_SE.properties @@ -23,5 +23,4 @@ Enabled=Aktiverad Environment\ Variables=Milj\u00F6variabler Name=Namn -Pinned=Pinnad System\ Properties=Systemegenskaper diff --git a/core/src/main/resources/jenkins/model/Jenkins/systemInfo_uk.properties b/core/src/main/resources/jenkins/model/Jenkins/systemInfo_uk.properties index ec48c0b8feaa40f2b2c4a4bc1e77943558bbfe94..0cccc6a957686fc4b0a76a6a2e237d8d7411f772 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/systemInfo_uk.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/systemInfo_uk.properties @@ -3,7 +3,6 @@ Enabled=\u0423\u0432\u0456\u043C\u043A\u043D\u0435\u043D\u043E Environment\ Variables=\u0417\u043C\u0456\u043D\u043D\u0456 \u043E\u0442\u043E\u0447\u0435\u043D\u043D\u044F Name=\u041D\u0430\u0437\u0432\u0430 -Pinned=\u0417\u0430\u043A\u0440\u0456\u043F\u043B\u0435\u043D\u0438\u0439 Plugins=\u0414\u043E\u0434\u0430\u0442\u043A\u0438 System\ Properties=\u0421\u0438\u0441\u0442\u0435\u043C\u043D\u0456 \u0432\u043B\u0430\u0441\u0442\u0438\u0432\u043E\u0441\u0442\u0456 Version=\u0412\u0435\u0440\u0441\u0456\u044F diff --git a/core/src/main/resources/jenkins/model/Jenkins/systemInfo_zh_CN.properties b/core/src/main/resources/jenkins/model/Jenkins/systemInfo_zh_CN.properties index 7f43f1b0036d9f7d21781c083c02fcd2ecd46bf2..2693a973f33b0c4cd7523472159666b02ebbac83 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/systemInfo_zh_CN.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/systemInfo_zh_CN.properties @@ -23,7 +23,6 @@ Enabled=\u542F\u7528 Environment\ Variables=\u73AF\u5883\u53D8\u91CF Name=\u540D\u79F0 -Pinned=\u56FA\u5B9A Plugins=\u63D2\u4EF6 System\ Properties=\u7CFB\u7EDF\u5C5E\u6027 Version=\u7248\u672C diff --git a/core/src/main/resources/jenkins/model/Jenkins/systemInfo_zh_TW.properties b/core/src/main/resources/jenkins/model/Jenkins/systemInfo_zh_TW.properties index 85b258fb5377ca6443e6b2117ab9965a72b73f59..7739087e73cc5122cd3cdc2bd7d51766c9e21006 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/systemInfo_zh_TW.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/systemInfo_zh_TW.properties @@ -29,6 +29,5 @@ No\ plugins\ installed.=\u6c92\u6709\u5b89\u88dd\u5916\u639b\u7a0b\u5f0f\u3002 Enabled=\u555f\u7528\u72c0\u6cc1 Name=\u540d\u7a31 Version=\u7248\u672c -Pinned=\u5df2\u639b\u8f09 Thread\ Dumps=\u57f7\u884c\u7dd2\u50be\u5370 diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_ca.properties b/core/src/main/resources/jenkins/model/Jenkins/threadDump_ru.properties similarity index 80% rename from core/src/main/resources/hudson/views/BuildButtonColumn/column_ca.properties rename to core/src/main/resources/jenkins/model/Jenkins/threadDump_ru.properties index f951cfe05a0bde53c2af9fe4ef0e7418bd48c85a..0b9bf301eed104759d65126b57092b4905b62f79 100644 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_ca.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/threadDump_ru.properties @@ -1,6 +1,6 @@ # The MIT License # -# Copyright (c) 2004-2010, Sun Microsystems, Inc. +# Copyright (c) 2004-, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributors # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -20,6 +20,5 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Build_scheduled=S''ha planificat el muntatge -Schedule_a_build=Planifica un muntatge per {0} -Schedule_a_build_with_parameters=Planifica un muntatge amb par\u00E0metres per {0} +Thread\ dump=\u0414\u0430\u043c\u043f \u043f\u043e\u0442\u043e\u043a\u0430 +Thread\ Dump=\u0414\u0430\u043c\u043f \u043f\u043e\u0442\u043e\u043a\u0430 \ No newline at end of file diff --git a/core/src/main/resources/jenkins/model/Jenkins/threadDump_sr.properties b/core/src/main/resources/jenkins/model/Jenkins/threadDump_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..94dca418a99c4db663077313a9d5eca8e4665cef --- /dev/null +++ b/core/src/main/resources/jenkins/model/Jenkins/threadDump_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Thread\ dump=\u0414\u0435\u043F\u043E\u043D\u0438\u0458\u0430 \u043D\u0438\u0442\u043E\u0432\u0430 +Thread\ Dump=\u0414\u0435\u043F\u043E\u043D\u0438\u0458\u0430 \u043D\u0438\u0442\u043E\u0432\u0430 diff --git a/core/src/main/resources/jenkins/model/JenkinsLocationConfiguration/config_sr.properties b/core/src/main/resources/jenkins/model/JenkinsLocationConfiguration/config_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..4ce696abc88cee4e1e9595ae82b52b04c290dd82 --- /dev/null +++ b/core/src/main/resources/jenkins/model/JenkinsLocationConfiguration/config_sr.properties @@ -0,0 +1,6 @@ +# This file is under the MIT License by authors + +System\ Admin\ e-mail\ address=\u0410\u0434\u0440\u0435\u0441\u0430 \u0435-\u043F\u043E\u0448\u0442\u0435 \u0441\u0438\u0441\u0442\u0435\u043C\u0441\u043A\u043E\u0433 \u0430\u0434\u043C\u0438\u043D\u0438\u0441\u0442\u0440\u0430\u0442\u043E\u0440\u0430 +Jenkins\ URL=Jenkins URL-\u0430\u0434\u0440\u0435\u0441\u0430 +Sender\ E-mail\ Address=\u0410\u0434\u0440\u0435\u0441\u0430 \u0435-\u043F\u043E\u0448\u0442\u0435 \u043Fp\u043E\u0448\u0438\u0459\u0430\u043B\u0430\u0446a +Jenkins\ Location=Jenkins \u043B\u043E\u043A\u0430\u0446\u0438\u0458\u0430 \ No newline at end of file diff --git a/core/src/main/resources/jenkins/model/MasterBuildConfiguration/config_sr.properties b/core/src/main/resources/jenkins/model/MasterBuildConfiguration/config_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..57dfb3ee199efcf8004e2ccb505a97e35547f772 --- /dev/null +++ b/core/src/main/resources/jenkins/model/MasterBuildConfiguration/config_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Labels=\u041B\u0430\u0431\u0435\u043B\u0430 +\#\ of\ executors=\u0431\u0440\u043E\u0458 \u0438\u0437\u0432\u0440\u0448\u0438\u0442\u0435\u0459\u0430 \ No newline at end of file diff --git a/core/src/main/resources/jenkins/model/Messages.properties b/core/src/main/resources/jenkins/model/Messages.properties index a1bb72ffe1fa2ae8dd1fe96573cfd96b41b6327c..1b5a2455d1677be61f10b6d3ef56fdf99c9f0cd7 100644 --- a/core/src/main/resources/jenkins/model/Messages.properties +++ b/core/src/main/resources/jenkins/model/Messages.properties @@ -39,10 +39,8 @@ Hudson.ViewName=All Hudson.NotUsesUTF8ToDecodeURL=\ Your container doesn\u2019t use UTF-8 to decode URLs. If you use non-ASCII characters as a job name etc, \ this will cause problems. \ - See Containers and \ - Tomcat i18n for more details. + See Tomcat i18n for more details. Hudson.NodeDescription=the master Jenkins node -Hudson.NoParamsSpecified=No Parameters are specified for this parameterized build CLI.restart.shortDescription=Restart Jenkins. CLI.safe-restart.shortDescription=Safely restart Jenkins. @@ -68,3 +66,6 @@ ParameterizedJobMixIn.build_now=Build Now BlockedBecauseOfBuildInProgress.shortDescription=Build #{0} is already in progress{1} BlockedBecauseOfBuildInProgress.ETA=\ (ETA:{0}) BuildDiscarderProperty.displayName=Discard old builds + +DownloadSettings.Warning.DisplayName=Browser-based metadata download +EnforceSlaveAgentPortAdministrativeMonitor.displayName=Enforce JNLP Slave Agent Port diff --git a/core/src/main/resources/jenkins/model/Messages_bg.properties b/core/src/main/resources/jenkins/model/Messages_bg.properties index a8a78a17e3791ed7ceb505c15754e335733ae1cc..db1dee5ce7d17c7bcd1a49608d289f8e5d63a9e0 100644 --- a/core/src/main/resources/jenkins/model/Messages_bg.properties +++ b/core/src/main/resources/jenkins/model/Messages_bg.properties @@ -53,9 +53,7 @@ Hudson.NotUsesUTF8ToDecodeURL=\ \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u0430\u043d\u0435 \u043d\u0430 \u0430\u0434\u0440\u0435\u0441\u0438\u0442\u0435. \u0418\u0437\u043f\u043e\u043b\u0437\u0432\u0430\u043d\u0435\u0442\u043e \u043d\u0430 \u0437\u043d\u0430\u0446\u0438 \u0438\u0437\u0432\u044a\u043d ASCII \u0432 \u0438\u043c\u0435\u043d\u0430\u0442\u0430 \u043d\u0430 \u0437\u0430\u0434\u0430\u0447\u0438\ \u0438 \u0434\u0440. \u043c\u043e\u0436\u0435 \u0434\u0430 \u0434\u043e\u0432\u0435\u0434\u0435 \u0434\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0438. \u0417\u0430 \u043f\u043e\u0432\u0435\u0447\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043f\u043e\u0433\u043b\u0435\u0434\u043d\u0435\u0442\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u0430 \u0437\u0430\ \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0438\ - \u0438 \u0440\u0430\u0437\u0434\u0435\u043b\u0430 \u0437\u0430 \ + href="https://jenkins.io/redirect/troubleshooting/utf8-url-decoding">\ \u0438\u043d\u0442\u0435\u0440\u043d\u0430\u0446\u0438\u043e\u043d\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0430 Tomcat i18n. Hudson.NodeDescription=\ \u043e\u0441\u043d\u043e\u0432\u043d\u0438\u044f\u0442 \u043a\u043e\u043c\u043f\u044e\u0442\u044a\u0440 \u043d\u0430 Jenkins diff --git a/core/src/main/resources/jenkins/model/Messages_de.properties b/core/src/main/resources/jenkins/model/Messages_de.properties index e2c1e1664caa6137e7f257d92ebeb1432bfba1e9..7f137e474a0d56b76d1a77eb1e609c3f641f17aa 100644 --- a/core/src/main/resources/jenkins/model/Messages_de.properties +++ b/core/src/main/resources/jenkins/model/Messages_de.properties @@ -36,8 +36,7 @@ Hudson.ViewName=Alle Hudson.NotUsesUTF8ToDecodeURL=\ Ihr Container verwendet kein UTF-8, um URLs zu dekodieren. Falls Sie Nicht-ASCII-Zeichen \ in Jobnamen usw. verwenden, kann dies Probleme mit sich bringen. Beachten Sie bitte die Hinweise zu \ - Containern bzw. \ - Tomcat i18N). + Tomcat i18N). Hudson.ReadPermission.Description=\ Dieses Recht ist notwendig, um so gut wie alle Jenkins-Seiten aufzurufen. \ Dieses Recht ist dann n\u00fctzlich, wenn Sie anonymen Benutzern den Zugriff \ diff --git a/core/src/main/resources/jenkins/model/Messages_es.properties b/core/src/main/resources/jenkins/model/Messages_es.properties index ac1f233aed7749a5ab5796ec5c0c0a535a6dcde6..b4aae441fff42c33b11b9073fa4ab341e234e65e 100644 --- a/core/src/main/resources/jenkins/model/Messages_es.properties +++ b/core/src/main/resources/jenkins/model/Messages_es.properties @@ -35,8 +35,7 @@ Hudson.ViewName=Todo Hudson.NotUsesUTF8ToDecodeURL=\ El contenedor de servlets no usa UTF-8 para decodificar URLs. Esto causar\u00e1 problemas si se usan nombres \ con caracteres no ASCII. Echa un vistazo a \ - Containers y a \ - Tomcat i18n para mas detalles. + Tomcat i18n para mas detalles. Hudson.ReadPermission.Description=\ El permiso de lectura es necesario para visualizar casi todas las p\u00e1ginas de Jenkins.\ Este permiso es \u00fatil cuando se quiere que usuarios no autenticados puedan ver las p\u00e1ginas. \ diff --git a/core/src/main/resources/jenkins/model/Messages_fr.properties b/core/src/main/resources/jenkins/model/Messages_fr.properties index cdc3d673e9a9a22542987a19595e7fe471289bdc..580e44c5b423669d89aa38385581bc42f6eeb699 100644 --- a/core/src/main/resources/jenkins/model/Messages_fr.properties +++ b/core/src/main/resources/jenkins/model/Messages_fr.properties @@ -34,8 +34,7 @@ Hudson.ViewName=Tous Hudson.NotUsesUTF8ToDecodeURL=\ Votre conteneur n''utilise pas UTF-8 pour d\u00e9coder les URLs. Si vous utilisez des caract\u00e8res non-ASCII \ dans le nom d''un job ou autre, cela causera des probl\u00e8mes. \ - Consultez les pages sur les conteneurs et \ - sur Tomcat i18n pour plus de d\u00e9tails. + Consultez les pages sur les Tomcat i18n pour plus de d\u00e9tails. Hudson.ReadPermission.Description=\ Le droit en lecture est n\u00e9cessaire pour voir la plupart des pages de Jenkins. \ Ce droit est utile quand vous ne voulez pas que les utilisateurs non authentifi\u00e9s puissent voir les pages Jenkins \ @@ -48,6 +47,7 @@ Mailer.Localhost.Error=Veuillez configurer un nom d''h\u00f4te valide, au lieu d PatternProjectNamingStrategy.DisplayName=Pattern PatternProjectNamingStrategy.NamePatternRequired=Le nom de pattern est obligatoire PatternProjectNamingStrategy.NamePatternInvalidSyntax=La syntaxe de l''expression r\u00e9guli\u00e8re est invalide. +ParameterizedJobMixIn.build_with_parameters=Lancer un build avec des paramètres ParameterizedJobMixIn.build_now=Lancer un build BlockedBecauseOfBuildInProgress.shortDescription=Le build #{0} est d\u00e9j\u00e0 en cours {1} BlockedBecauseOfBuildInProgress.ETA=\ (fin pr\u00e9vue \u00e0 : {0}) diff --git a/core/src/main/resources/jenkins/model/Messages_ja.properties b/core/src/main/resources/jenkins/model/Messages_ja.properties index ffe68edd62ee083a6225a721ef0bd96084f645bc..43674614362570317725a5d1e967c64d381f5ab2 100644 --- a/core/src/main/resources/jenkins/model/Messages_ja.properties +++ b/core/src/main/resources/jenkins/model/Messages_ja.properties @@ -35,8 +35,7 @@ Hudson.ViewAlreadyExists="{0}"\u3068\u3044\u3046\u30d3\u30e5\u30fc\u306f\u65e2\u Hudson.ViewName=\u3059\u3079\u3066 Hudson.NotUsesUTF8ToDecodeURL=\ URL\u304cUTF-8\u3067\u30c7\u30b3\u30fc\u30c9\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002\u30b8\u30e7\u30d6\u540d\u306a\u3069\u306bnon-ASCII\u306a\u6587\u5b57\u3092\u4f7f\u7528\u3059\u308b\u5834\u5408\u306f\u3001\ - \u30b3\u30f3\u30c6\u30ca\u306e\u8a2d\u5b9a\u3084\ - Tomcat i18N\u3092\u53c2\u8003\u306b\u8a2d\u5b9a\u3057\u3066\u304f\u3060\u3055\u3044\u3002 + Tomcat i18N\u3092\u53c2\u8003\u306b\u8a2d\u5b9a\u3057\u3066\u304f\u3060\u3055\u3044\u3002 Hudson.ReadPermission.Description=\ \u53c2\u7167\u30d1\u30fc\u30df\u30c3\u30b7\u30e7\u30f3\u306f\u3001Jenkins\u306e\u307b\u307c\u3059\u3079\u3066\u306e\u753b\u9762\u3092\u53c2\u7167\u3059\u308b\u306e\u306b\u5fc5\u8981\u3067\u3059\u3002\ \u3053\u306e\u30d1\u30fc\u30df\u30c3\u30b7\u30e7\u30f3\u306f\u3001\u8a8d\u8a3c\u3055\u308c\u3066\u3044\u306a\u3044\u30e6\u30fc\u30b6\u30fc\u306b\u306fJenkins\u306e\u753b\u9762\u3092\u53c2\u7167\u3055\u305b\u305f\u304f\u306a\u3044\u5834\u5408\u306b\u4fbf\u5229\u3067\u3059\u3002\ diff --git a/core/src/main/resources/jenkins/model/Messages_pl.properties b/core/src/main/resources/jenkins/model/Messages_pl.properties index bd0c8dd435316de27eb1235fbb0142a55b05ca7f..5105a854b670377e663958b4e28f75346e64aecc 100644 --- a/core/src/main/resources/jenkins/model/Messages_pl.properties +++ b/core/src/main/resources/jenkins/model/Messages_pl.properties @@ -1,5 +1,28 @@ # The MIT License - +# +# Copyright (c) 2004-2016, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributors +# +# 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. BuildDiscarderProperty.displayName=Porzu\u0107 stare zadania ParameterizedJobMixIn.build_with_parameters=Uruchom z parametrami ParameterizedJobMixIn.build_now=Uruchom +# address not configured yet +Mailer.Address.Not.Configured=adres jeszcze nie jest skonfigurowany +# Please set a valid host name, instead of localhost +Mailer.Localhost.Error=Ustaw prawid\u0142ow\u0105 nazw\u0119 hosta, inn\u0105 ni\u017C localhost diff --git a/core/src/main/resources/jenkins/model/Messages_sr.properties b/core/src/main/resources/jenkins/model/Messages_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..ce97ae2691b570f4ea29945236bbe85a423dd68c --- /dev/null +++ b/core/src/main/resources/jenkins/model/Messages_sr.properties @@ -0,0 +1,42 @@ +# This file is under the MIT License by authors + +Hudson.BadPortNumber=\u041D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u0430\u043D \u0431\u0440\u043E\u0458 \u043F\u043E\u0440\u0442\u0430: {0} +Hudson.Computer.Caption=\u041C\u0430\u0441\u0442\u0435\u0440 +Hudson.ControlCodeNotAllowed=\u041A\u043E\u043D\u0442\u0440\u043E\u043B\u0438 \u043A\u043E\u0434 \u043D\u0438\u0458\u0435 \u0434\u043E\u0437\u0432\u043E\u0459\u0435\u043D: {0} +Hudson.Computer.DisplayName=\u043C\u0430\u0441\u0442\u0435\u0440 +Hudson.DisplayName=Jenkins +Hudson.NoJavaInPath=java \u043A\u043E\u043C\u0430\u043D\u0434\u0430 \u0441\u0435 \u043D\u0435 \u043D\u0430\u043B\u0430\u0437\u0438 \u0443 \u0432\u0430\u0448\u043E\u0458 PATH \u043F\u0440\u043E\u043C\u0435\u043D\u0459\u0438\u0432\u0438. \u041C\u043E\u0436\u0434\u0430 \u0442\u0440\u0435\u0431\u0430\u0442\u0435 \u0434\u0430 \u043F\u043E\u0441\u0442\u0430\u0432\u0438\u0442\u0435 JDK-\u043E\u0432\u0435? +Hudson.NoName=\u0418\u043C\u0435 \u043D\u0438\u0458\u0435 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u043E +Hudson.NodeBeingRemoved=\u0423\u043A\u043B\u0430\u045A\u0430\u045A\u0435 \u043C\u0430\u0448\u0438\u043D\u0435 \u0458\u0435 \u0443 \u0442\u043E\u043A\u0443 +Hudson.UnsafeChar=\u041E\u043F\u0430\u0441\u043D\u043E \u0458\u0435 \u043A\u043E\u0440\u0438\u0441\u0438\u0442\u0438 \u0437\u043D\u0430\u043A\u043E\u0432\u0435 \u043A\u0430\u043E ''{0}'' +Hudson.JobNameConventionNotApplyed=\u2018{0}\u2019 \u043D\u0435 \u043E\u0434\u0433\u043E\u0432\u0430\u0440\u0430 \u0448\u0430\u0431\u043B\u043E\u043D\u0443 \u0437\u0430 \u0437\u0430\u0434\u0430\u0442\u043A\u0435 {1} +Hudson.ViewAlreadyExists=\u041F\u0440\u0435\u0433\u043B\u0435\u0434 \u0441\u0430 \u0438\u043C\u0435\u043D\u043E\u043C \u2018{0}\u2019 \u0432\u0435\u045B \u043F\u043E\u0441\u0442\u043E\u0458\u0438 +Hudson.JobAlreadyExists=\u0417\u0430\u0434\u0430\u0442\u0430\u043A \u0441\u0430 \u0438\u043C\u0435\u043D\u043E\u043C \u2018{0}\u2019 \u0432\u0435\u045B \u043F\u043E\u0441\u0442\u043E\u0458\u0438 +Hudson.ViewName=\u0421\u0432\u0435 +Hudson.NotUsesUTF8ToDecodeURL=\u0412\u0430\u0448 \u043A\u043E\u043D\u0442\u0435\u0458\u043D\u0435\u0440 \u043D\u0435 \u043A\u043E\u0440\u0438\u0441\u0442 UTF-8 \u0437\u0430 \u0434\u0435\u043A\u043E\u0434\u0438\u0440\u0430\u045A\u0435 URL-\u0430\u0434\u0440\u0435\u0441\u0435. \u0410\u043A\u043E \u043A\u043E\u0440\u0438\u0441\u0442\u0438\u0442\u0435 \u043A\u0430\u0440\u0430\u043A\u0442\u0435\u0440\u0435 \u0432\u0430\u043D ASCII \u043D\u0438\u0437\u0430 \u0443 \u0438\u043C\u0435\u043D\u0443 \u0437\u0430\u0434\u0430\u0442\u0430\u043A\u0430, \u0438\u0442\u0434, \u043C\u043E\u0436\u0435 \u0438\u0437\u0430\u0437\u0432\u0430\u0442\u0438 \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0435. \u041E\u0442\u0438\u0452\u0438 \u0442\u0435 \u043D\u0430 \u041A\u043E\u043D\u0442\u0435\u0458\u043D\u0435\u0440\u0438 \u0438 \ + Tomcat i18n \u0437\u0430 \u0458\u043E\u0448 \u0434\u0435\u0442\u0430\u0459\u0430. +Hudson.NodeDescription=\u0433\u043B\u0430\u0432\u043D\u0430 Jenkins \u043C\u0430\u0448\u0438\u043D\u0430 +Hudson.NoParamsSpecified=\u041D\u0438\u0441\u0443 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0438 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0438 \u0437\u0430 \u043E\u0432\u0430\u0458 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0438\u0437\u043E\u0432\u0430\u043D\u043E \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 +CLI.restart.shortDescription=\u041F\u043E\u043D\u043E\u0432\u043E \u043F\u043E\u043A\u0440\u0435\u043D\u0438 Jenkins +CLI.safe-restart.shortDescription=\u0411\u0435\u0437\u0432\u0435\u0434\u043D\u043E \u043F\u043E\u043D\u043E\u0432\u043E \u043F\u043E\u043A\u0440\u0435\u043D\u0438 Jenkins-\u0430 +CLI.keep-build.shortDescription=\u0417\u0430\u0434\u0440\u0436\u0438 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0443 \u0437\u0430\u0443\u0432\u0435\u043A +CauseOfInterruption.ShortDescription=\u041E\u0434\u0443\u0441\u0442\u0430\u0432\u0459\u0435\u043D\u043E \u043E\u0434 \u0441\u0442\u0440\u0430\u043D\u0435 {0} +CLI.shutdown.shortDescription=\u041E\u0434\u043C\u0430\u0445 \u0437\u0430\u0443\u0441\u0442\u0430\u0432\u0438 Jenkins \u0441\u0435\u0440\u0432\u0435\u0440 +DefaultProjectNamingStrategy.DisplayName=\u0421\u0442\u0430\u043D\u0434\u0430\u0440\u0434\u043D\u043E +CLI.safe-shutdown.shortDescription=\ +\u041F\u0440\u0435\u0431\u0430\u0446\u0438 Jenkins \u0443 \u0442\u0438\u0445\u0438 \u0440\u0435\u0436\u0438\u043C, \u0447\u0435\u043A\u0430\u045B\u0435 \u0437\u0430\u0432\u0440\u0448\u045A\u0435\u0442\u0430\u043A \u0442\u0440\u0435\u043D\u0443\u0442\u043D\u0438\u0445 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 \u0430 \u043E\u043D\u0434\u0430 \u045B\u0435 \u0443\u0433\u0430\u0441\u0438\u0442\u0438 Jenkins. +IdStrategy.CaseInsensitive.DisplayName=\u0411\u0435\u0437 \u0440\u0430\u0437\u043B\u0438\u043A\u0435 \u0438\u0437\u043C\u0435\u045B\u0443 \u0432\u0435\u043B\u0438\u043A\u0438\u043C \u0438 \u043C\u0430\u043B\u0438\u043C \u0441\u043B\u043E\u0432\u0438\u043C\u0430 +IdStrategy.CaseSensitive.DisplayName=\u0421\u0430 \u0440\u0430\u0437\u043B\u0438\u043A\u043E\u043C \u0438\u0437\u043C\u0435\u045B\u0443 \u0432\u0435\u043B\u0438\u043A\u0438\u043C \u0438 \u043C\u0430\u043B\u0438\u043C \u0441\u043B\u043E\u0432\u0438\u043C\u0430 +IdStrategy.CaseSensitiveEmailAddress.DisplayName=\u0421\u0430 \u0440\u0430\u0437\u043B\u0438\u043A\u043E\u043C \u0438\u0437\u043C\u0435\u045B\u0443 \u0432\u0435\u043B\u0438\u043A\u0438\u043C \u0438 \u043C\u0430\u043B\u0438\u043C \u0441\u043B\u043E\u0432\u0438\u043C\u0430 (\u0430\u0434\u0440\u0435\u0441\u0430 \u0435-\u043F\u043E\u0448\u0442\u0435) +Mailer.Address.Not.Configured=\u0430\u0434\u0440\u0435\u0441\u0430 \u043D\u0438\u0458\u0435 \u0458\u043E\u0448 \u043D\u0430\u0432\u0435\u0434\u0435\u043D\u0430 +Mailer.Localhost.Error=\u041D\u0430\u0432\u0435\u0434\u0438\u0442\u0435 \u0434\u0440\u0443\u0433\u043E \u0438\u043C\u0435 \u0437\u0430 \u0445\u043E\u0441\u0442, \u0430 \u043D\u0435 "localhost" +PatternProjectNamingStrategy.DisplayName=\u0428\u0430\u0431\u043B\u043E\u043D +PatternProjectNamingStrategy.NamePatternRequired=\u041D\u0430\u0432\u0435\u0434\u0438\u0442\u0435 \u0448\u0430\u0431\u043B\u043E\u043D \u0438\u043C\u0435\u043D\u0443 +PatternProjectNamingStrategy.NamePatternInvalidSyntax=\u041D\u0435\u043F\u0440\u0430\u0432\u0438\u043B\u0430\u043D \u0440\u0435\u0433\u0443\u043B\u0430\u0440\u043D\u0438 \u0438\u0437\u0440\u0430\u0437 +ParameterizedJobMixIn.build_with_parameters=\u0418\u0437\u0433\u0440\u0430\u0434\u0438 \u0441\u0430 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0438\u043C\u0430 +ParameterizedJobMixIn.build_now=\u0418\u0437\u0433\u0440\u0430\u0434\u0438 \u0441\u0430\u0434\u0430 +BlockedBecauseOfBuildInProgress.shortDescription=\u0418\u0437\u0433\u0440\u0430\u0434\u045A\u0430 #{0} \u0458\u0435 \u0432\u0435\u045B \u0443 \u0442\u043E\u043A\u0443 {1} +BlockedBecauseOfBuildInProgress.ETA=\ (\u043E\u0441\u0442\u0430\u043B\u043E:{0}) +BuildDiscarderProperty.displayName=\u0418\u0437\u0431\u0440\u0438\u0448\u0438 \u0441\u0442\u0430\u0440\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 +Din= +vil= \ No newline at end of file diff --git a/core/src/main/resources/jenkins/model/Messages_zh_TW.properties b/core/src/main/resources/jenkins/model/Messages_zh_TW.properties index f6f91ac63fbe87b2d5e8d470ac3084d83ecb18a8..d67098e7cd0155322765c483db06f92ddc885b0d 100644 --- a/core/src/main/resources/jenkins/model/Messages_zh_TW.properties +++ b/core/src/main/resources/jenkins/model/Messages_zh_TW.properties @@ -35,8 +35,8 @@ Hudson.ViewAlreadyExists=\u5df2\u7d93\u6709\u53eb\u505a "{0}" \u7684\u8996\u666f Hudson.ViewName=\u5168\u90e8 Hudson.NotUsesUTF8ToDecodeURL=\ \u60a8\u7684\u5bb9\u5668\u4e0d\u662f\u4f7f\u7528 UTF-8 \u89e3\u8b6f URL\u3002\u5982\u679c\u60a8\u5728\u4f5c\u696d\u7b49\u540d\u7a31\u4e2d\u4f7f\u7528\u4e86\u975e ASCII \u5b57\u5143\uff0c\u53ef\u80fd\u6703\u9020\u6210\u554f\u984c\u3002\ - \u8acb\u53c3\u8003 Container \u53ca \ - Tomcat i18n \u8cc7\u6599\u3002 + \u8acb\u53c3\u8003 Container \u53ca \ + Tomcat i18n \u8cc7\u6599\u3002 Hudson.ReadPermission.Description=\ \u6709\u8b80\u53d6\u6b0a\u9650\u624d\u80fd\u770b\u5230 Jenkins \u7684\u5927\u90e8\u5206\u7db2\u9801\u3002\ \u5982\u679c\u60a8\u4e0d\u60f3\u8b93\u6c92\u901a\u904e\u9a57\u8b49\u7684\u4f7f\u7528\u8005\u770b\u5230 Jenkins \u7db2\u9801\uff0c\u8acb\u64a4\u92b7 anonymous \u4f7f\u7528\u8005\u7684\u6b0a\u9650\uff0c\ diff --git a/core/src/main/resources/jenkins/model/ProjectNamingStrategy/PatternProjectNamingStrategy/config_sr.properties b/core/src/main/resources/jenkins/model/ProjectNamingStrategy/PatternProjectNamingStrategy/config_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..20c36676bd023fe99b4fcade32cc4567dd774acf --- /dev/null +++ b/core/src/main/resources/jenkins/model/ProjectNamingStrategy/PatternProjectNamingStrategy/config_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +namePattern=\u0428\u0430\u0431\u043B\u043E\u043D \u0438\u043C\u0435\u043D\u0430 +description=\u041E\u043F\u0438\u0441 +forceExistingJobs=\u0444\u043E\u0440\u0441\u0438\u0440\u0430\u0458 \u043F\u043E\u0441\u0442\u043E\u0458\u0435\u045B\u0435 \u0437\u0430\u0434\u0430\u0442\u043A\u0435 \ No newline at end of file diff --git a/core/src/main/resources/jenkins/model/RunIdMigrator/UnmigrationInstruction/index.jelly b/core/src/main/resources/jenkins/model/RunIdMigrator/UnmigrationInstruction/index.jelly index 6385169b5dee33b39c778ca14c1769234d5040e9..bb1aa64e61aa2a4f29ceb080c36c22dd8857a2f5 100644 --- a/core/src/main/resources/jenkins/model/RunIdMigrator/UnmigrationInstruction/index.jelly +++ b/core/src/main/resources/jenkins/model/RunIdMigrator/UnmigrationInstruction/index.jelly @@ -28,8 +28,8 @@ THE SOFTWARE.

        - To reverse the effect of JENKINS-24380 fix, run the following command - on the server. See Wiki page + To reverse the effect of build record migration, run the following command + on the server. See documentation for more details:

        ${%Name} ${%Version} ${%Enabled}${%Pinned}
        diff --git a/core/src/main/resources/jenkins/model/RunIdMigrator/UnmigrationInstruction/index_sr.properties b/core/src/main/resources/jenkins/model/RunIdMigrator/UnmigrationInstruction/index_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..54c6d656480817716ee4ede665c048b134b5d354 --- /dev/null +++ b/core/src/main/resources/jenkins/model/RunIdMigrator/UnmigrationInstruction/index_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Copied=\u0418\u0441\u043A\u043E\u043F\u0438\u0440\u0430\u043D\u043E diff --git a/core/src/main/resources/jenkins/model/identity/IdentityRootAction/index_sr.properties b/core/src/main/resources/jenkins/model/identity/IdentityRootAction/index_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..58733a6ee4db87e49d13667d3fc2bc3d3ab362d6 --- /dev/null +++ b/core/src/main/resources/jenkins/model/identity/IdentityRootAction/index_sr.properties @@ -0,0 +1,8 @@ +# This file is under the MIT License by authors + +Instance\ Identity=\u0418\u0434\u0435\u043D\u0442\u0438\u0442\u0435\u0442 \u0438\u043D\u0441\u0442\u0430\u043D\u0446\u0435 +blurb=\u0421\u0432\u0430\u043A\u0430 \u0438\u043D\u0441\u0442\u0430\u043D\u0446\u0430 Jenkins-\u0430 \u0438\u043C\u0430 \u043F\u0430\u0440 \u043E\u0434 \u0458\u0430\u0432\u043D\u0435 \u0438 \u043F\u0440\u0438\u0432\u0430\u0442\u043D\u0435 \u043A\u0459\u0443\u0447\u0435\u0432\u0435 \u043A\u043E\u0458\u0435 \u0438\u0434\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0443\u0458\u0443 \u0442\u0443 \u043C\u0430\u0448\u0438\u043D\u0443. \ + \u0408\u0430\u0432\u043D\u0438 \u043A\u0459\u0443\u0447 \u0441\u0435 \u043F\u0440\u0438\u043A\u0430\u0437\u0443\u0458\u0435 X-Instance-Identity header \u043D\u0430 \u0432\u0435\u0431-\u0437\u0430\u0445\u0442\u0435\u0432\u0438\u043C\u0430 \u043F\u0440\u0435\u043C\u0430 Jenkins UI.\ + \u041C\u043E\u0436\u0435 \u0441\u0435 \u0438\u0441\u0442\u043E \u043D\u0430\u045B\u0438 \u043A\u0459\u0443\u0447 \u0438 \u0434\u0438\u0433\u0438\u0442\u0430\u043B\u0430\u043D \u043E\u0442\u0438\u0441\u0430\u043A \u043A\u0459\u0443\u0447\u0430 \u043D\u0430 \u043E\u0432\u043E\u0458 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0438. +Public\ Key=\u0408\u0430\u0432\u043D\u0438 \u043A\u0459\u0443\u0447 +Fingerprint=\u0414\u0438\u0433\u0438\u0442\u0430\u043B\u043D\u0438 \u043E\u0442\u0438\u0441\u0430\u043A diff --git a/core/src/main/resources/jenkins/model/item_category/Messages_sr.properties b/core/src/main/resources/jenkins/model/item_category/Messages_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..78be22c9781c814e3a66613e91f74f16627d8cdb --- /dev/null +++ b/core/src/main/resources/jenkins/model/item_category/Messages_sr.properties @@ -0,0 +1,8 @@ +# This file is under the MIT License by authors + +Uncategorized.DisplayName=\u041D\u0435\u043A\u0430\u0442\u0435\u0433\u043E\u0440\u0438\u0441\u0430\u043D\u043E +Uncategorized.Description=\u0412\u0440\u0441\u0442\u0435 \u0441\u0442\u0430\u0432\u043A\u0430 \u043A\u043E\u0458\u0435 \u043D\u0438\u0441\u0443 \u043A\u0430\u0442\u0435\u0433\u043E\u0440\u0438\u0441\u0430\u043D\u0438 \u043E\u0434 \u0441\u0442\u0440\u0430\u043D\u0435 \u043E\u0434\u0440\u0436\u0438\u0432\u0430\u0447\u0430 \u043C\u043E\u0434\u0443\u043B\u0435. +StandaloneProjects.DisplayName=\u0421\u0430\u043C\u043E\u0441\u0442\u0430\u043B\u043D\u0438 \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u0438 +StandaloneProjects.Description=\u041A\u0440\u0435\u0438\u0440\u0430\u0458\u0442\u0435 \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u0435 \u0441\u0430 \u0441\u0430\u043C\u043E\u0441\u0442\u0430\u043B\u043D\u0438\u043C \u043F\u043E\u0441\u0442\u0430\u0432\u043A\u0430\u043C\u0430 \u0438 \u0438\u0441\u0442\u043E\u0440\u0438\u0458\u043E\u043C. \u041E\u0432\u0430\u043A\u0432\u0438 \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u0438 \u043C\u043E\u0433\u0443 \u0431\u0438\u0442\u0438 \u043D\u0430 \u043D\u0430\u0458\u0432\u0438\u0448\u0435\u043C \u043D\u0438\u0432\u043E\u0443 \u0438\u043B\u0438 \u0433\u0440\u0443\u043F\u0438\u0441\u0430\u043D\u0438 \u0444\u043E\u043B\u0434\u0435\u0440\u0438\u043C\u0430. +NestedProjects.DisplayName=\u041F\u043E\u0434\u0440\u0435\u0452\u0435\u043D\u0438 \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u0438 +NestedProjects.Description=\u041A\u0440\u0435\u0438\u0440\u0430\u0458\u0442\u0435 \u043A\u0430\u0442\u0435\u0433\u043E\u0440\u0438\u0458\u0435 \u0438\u043B\u0438 \u0445\u0438\u0435\u0440\u0430\u0440\u0445\u0438\u0458\u0435 \u043F\u043E\u043C\u043E\u045B\u0443 \u0444\u043E\u043B\u0434\u0435\u0440\u0438\u043C\u0430, \u043A\u043E\u0458\u0438 \u043C\u043E\u0433\u0443 \u0431\u0438\u0442\u0438 \u0440\u0443\u0447\u043D\u043E \u0438\u043B\u0438 \u0430\u0443\u0442\u043E\u043C\u0430\u0442\u0441\u043A\u043E \u043A\u0440\u0435\u0438\u0440\u0430\u043D\u0438 \u043F\u0440\u0435\u043C\u0430 \u0441\u0430\u0447\u0443\u0432\u0430\u043D\u0438\u043C. diff --git a/core/src/main/resources/jenkins/model/queue/CompositeCauseOfBlockage/summary.jelly b/core/src/main/resources/jenkins/model/queue/CompositeCauseOfBlockage/summary.jelly new file mode 100644 index 0000000000000000000000000000000000000000..76fc4313b05a5a028c04bdeccb6021ac5d05cac7 --- /dev/null +++ b/core/src/main/resources/jenkins/model/queue/CompositeCauseOfBlockage/summary.jelly @@ -0,0 +1,32 @@ + + + + + + + ; + + + diff --git a/core/src/main/resources/jenkins/mvn/FilePathGlobalSettingsProvider/config_sr.properties b/core/src/main/resources/jenkins/mvn/FilePathGlobalSettingsProvider/config_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..79580f19b1649b276f2ec7ab73317087f6a9c22d --- /dev/null +++ b/core/src/main/resources/jenkins/mvn/FilePathGlobalSettingsProvider/config_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +File\ path=\u041F\u0443\u0442 \u0434\u043E \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0435 diff --git a/core/src/main/resources/jenkins/mvn/FilePathSettingsProvider/config_sr.properties b/core/src/main/resources/jenkins/mvn/FilePathSettingsProvider/config_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..79580f19b1649b276f2ec7ab73317087f6a9c22d --- /dev/null +++ b/core/src/main/resources/jenkins/mvn/FilePathSettingsProvider/config_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +File\ path=\u041F\u0443\u0442 \u0434\u043E \u0434\u0430\u0442\u043E\u0442\u0435\u043A\u0435 diff --git a/core/src/main/resources/jenkins/mvn/GlobalMavenConfig/config_sr.properties b/core/src/main/resources/jenkins/mvn/GlobalMavenConfig/config_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..56881420328f1f61ebe9a6639d8a4bc1847b7478 --- /dev/null +++ b/core/src/main/resources/jenkins/mvn/GlobalMavenConfig/config_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +Maven\ Configuration=\u041F\u043E\u0441\u0442\u0430\u0432\u0438 Maven +Default\ settings\ provider=\u041F\u0440\u043E\u0432\u0430\u0458\u0434\u0435\u0440 \u0441\u0442\u0430\u043D\u0434\u0430\u0440\u0434\u043D\u0438\u0445 \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0438\u043C\u0430 +Default\ global\ settings\ provider=\u041F\u0440\u043E\u0432\u0430\u0458\u0434\u0435\u0440 \u0441\u0442\u0430\u043D\u0434\u0430\u0440\u0434\u043D\u0438\u0445 \u0433\u043B\u043E\u0431\u0430\u043B\u043D\u0438\u043C \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0438\u043C\u0430 \ No newline at end of file diff --git a/core/src/main/resources/jenkins/mvn/Messages_sr.properties b/core/src/main/resources/jenkins/mvn/Messages_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..20d33fc6688ae333d4c0aa4bca5af284241ea5a8 --- /dev/null +++ b/core/src/main/resources/jenkins/mvn/Messages_sr.properties @@ -0,0 +1,6 @@ +# This file is under the MIT License by authors + +DefaultSettingsProvider.DisplayName=\u041A\u043E\u0440\u0438\u0441\u0442\u0438 \u0441\u0442\u0430\u043D\u0434\u0430\u0440\u0434\u043D\u0430 maven \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 +DefaultGlobalSettingsProvider.DisplayName=\u041A\u043E\u0440\u0438\u0441\u0442\u0438 \u0441\u0442\u0430\u043D\u0434\u0430\u0440\u0434\u043D\u0430 \u0433\u043B\u043E\u0431\u0430\u043B\u043D\u0430 maven \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 +FilePathGlobalSettingsProvider.DisplayName=\u0414\u0430\u0442\u043E\u0442\u0435\u043A\u0430 \u0433\u043B\u043E\u0431\u0430\u043B\u043D\u0438\u043C \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 \u0441\u0430 \u0434\u0438\u0441\u043A\u0430 +FilePathSettingsProvider.DisplayName=\u0414\u0430\u0442\u043E\u0442\u0435\u043A\u0430 \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 \u0441\u0430 \u0434\u0438\u0441\u043A\u0430 diff --git a/core/src/main/resources/jenkins/security/ApiTokenProperty/config_sr.properties b/core/src/main/resources/jenkins/security/ApiTokenProperty/config_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..e7ad742d80358e0000bb255996ec30a116a3532c --- /dev/null +++ b/core/src/main/resources/jenkins/security/ApiTokenProperty/config_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +Show\ API\ Token=\u041F\u0440\u0438\u043A\u0430\u0436\u0438 \u0410\u041F\u0418 \u0422\u043E\u043A\u0435\u043D +API\ Token=\u0410\u041F\u0418 \u0422\u043E\u043A\u0435\u043D +Change\ API\ Token=\u0423\u0440\u0435\u0434\u0438 \u0410\u041F\u0418 \u0422\u043E\u043A\u0435\u043D diff --git a/core/src/main/resources/jenkins/security/ApiTokenProperty/help-apiToken.html b/core/src/main/resources/jenkins/security/ApiTokenProperty/help-apiToken.html index a9dec4a07f3ab0d6e17912224d95848fb8719a85..52babf7ea822327209ae55a655260cd1b6f271d3 100644 --- a/core/src/main/resources/jenkins/security/ApiTokenProperty/help-apiToken.html +++ b/core/src/main/resources/jenkins/security/ApiTokenProperty/help-apiToken.html @@ -1,5 +1,5 @@
        This API token can be used for authenticating yourself in the REST API call. - See our wiki for more details. + See our wiki for more details. The API token should be protected like your password, as it allows other people to access Jenkins as you.
        \ No newline at end of file diff --git a/core/src/main/resources/jenkins/security/ApiTokenProperty/help-apiToken_ja.html b/core/src/main/resources/jenkins/security/ApiTokenProperty/help-apiToken_ja.html index 7def6fa51de9ad4e53205abe33262d05a7c2568a..a1c92c37d577c8f976aa4e0ca338336d929ac086 100644 --- a/core/src/main/resources/jenkins/security/ApiTokenProperty/help-apiToken_ja.html +++ b/core/src/main/resources/jenkins/security/ApiTokenProperty/help-apiToken_ja.html @@ -1,5 +1,5 @@
        APIトークンは、REST API使用時の認証に使用されます。 - 詳細はWikiを参照してください。 + 詳細はWikiを参照してください。 APIトークンはパスワードと同様に保護する必要があります。そうしないと、他人が詐称してJenkinsにアクセス可能になります。
        \ No newline at end of file diff --git a/core/src/main/resources/jenkins/security/ApiTokenProperty/help-apiToken_zh_TW.html b/core/src/main/resources/jenkins/security/ApiTokenProperty/help-apiToken_zh_TW.html index ea7097fea7675d947d4c6c35761e4a300a22b598..512564dd8aa84a7175395c30506b3745fedd9974 100644 --- a/core/src/main/resources/jenkins/security/ApiTokenProperty/help-apiToken_zh_TW.html +++ b/core/src/main/resources/jenkins/security/ApiTokenProperty/help-apiToken_zh_TW.html @@ -1,5 +1,5 @@
        您在呼叫 REST API 時要使用 API Token 驗證。 - 詳情請參考我們的 Wiki。 + 詳情請參考我們的 Wiki。 API Token 應該當做密碼一樣好好保管,因為有了它,其他人就能跟您一樣存取 Jenkins。
        \ No newline at end of file diff --git a/core/src/main/resources/jenkins/security/Messages.properties b/core/src/main/resources/jenkins/security/Messages.properties index e09dca3e79758277e4fc1be3e1a943366d9053c2..f0a98fb4a2978195bde2b4aad095bb2d06f36cc8 100644 --- a/core/src/main/resources/jenkins/security/Messages.properties +++ b/core/src/main/resources/jenkins/security/Messages.properties @@ -24,4 +24,5 @@ ApiTokenProperty.DisplayName=API Token ApiTokenProperty.ChangeToken.TokenIsHidden=Token is hidden ApiTokenProperty.ChangeToken.Success=
        Updated. See the new token in the field above
        ApiTokenProperty.ChangeToken.SuccessHidden=
        Updated. You need to login as the user to see the token
        -RekeySecretAdminMonitor.DisplayName=Re-keying \ No newline at end of file +RekeySecretAdminMonitor.DisplayName=Re-keying +UpdateSiteWarningsMonitor.DisplayName=Update Site Warnings diff --git a/core/src/main/resources/jenkins/security/Messages_sr.properties b/core/src/main/resources/jenkins/security/Messages_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..5e74fc20dd234d29c9f83993deee986651c8ea7b --- /dev/null +++ b/core/src/main/resources/jenkins/security/Messages_sr.properties @@ -0,0 +1,7 @@ +# This file is under the MIT License by authors + +ApiTokenProperty.DisplayName=\u0422\u043E\u043A\u0435\u043D \u0437\u0430 \u0410\u041F\u0418 +ApiTokenProperty.ChangeToken.TokenIsHidden=\u0422\u043E\u043A\u0435\u043D \u0458\u0435 \u0441\u0430\u043A\u0440\u0438\u0432\u0435\u043D +ApiTokenProperty.ChangeToken.Success=
        \u0410\u0436\u0443\u0440\u0438\u0440\u0430\u043D\u043E. \u041F\u0440\u043E\u0432\u0435\u0440\u0438\u0442\u0435 \u043D\u043E\u0432\u0438 \u0442\u043E\u043A\u0435\u043D \u043F\u0440\u0438\u043A\u0430\u0437\u0430\u043D \u0438\u0437\u043D\u0430\u0434.
        +ApiTokenProperty.ChangeToken.SuccessHidden=
        \u0410\u0436\u0443\u0440\u0438\u0440\u0430\u043D\u043E. \u041C\u043E\u0440\u0430\u0442\u0435 \u0441\u0435 \u043F\u0440\u0438\u0458\u0430\u0432\u0438\u0442\u0438 \u043A\u0430\u043E \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u043A \u0434\u0430 \u0431\u0438 \u043C\u043E\u0433\u043B\u0438 \u043F\u0440\u043E\u0432\u0435\u0440\u0438\u0442\u0438 \u0442\u043E\u043A\u0435\u043D.
        +RekeySecretAdminMonitor.DisplayName=\u041F\u043E\u043D\u043E\u0432\u043E \u0445\u0435\u0448\u0438\u0440\u0430\u045A\u0435 \ No newline at end of file diff --git a/core/src/main/resources/jenkins/security/RekeySecretAdminMonitor/message.properties b/core/src/main/resources/jenkins/security/RekeySecretAdminMonitor/message.properties index 2daf3f7e8fb04d121c47f3b5a1ce6b57e7b64292..1c4f0310fb5cd768d040aff5d08cf88c69f9160f 100644 --- a/core/src/main/resources/jenkins/security/RekeySecretAdminMonitor/message.properties +++ b/core/src/main/resources/jenkins/security/RekeySecretAdminMonitor/message.properties @@ -1,9 +1,9 @@ pleaseRekeyAsap=\ - Because of a security vulnerability discovered earlier, we need to \ + Because of a security vulnerability discovered earlier, we need to \ change the encryption key used to protect secrets in your configuration files on the disk. \ This process scans a large portion of your $JENKINS_HOME ({0}), \ find encrypted data, re-key them, which will take some time. \ - See this document for more implications about different ways of doing this \ + See this document for more implications about different ways of doing this \ (or not doing this.) This operation can be safely run in background, but cautious users \ are recommended to take backups. diff --git a/core/src/main/resources/jenkins/security/RekeySecretAdminMonitor/message_sr.properties b/core/src/main/resources/jenkins/security/RekeySecretAdminMonitor/message_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..02192317a7ab7f4a2680941923575d8c8c90571c --- /dev/null +++ b/core/src/main/resources/jenkins/security/RekeySecretAdminMonitor/message_sr.properties @@ -0,0 +1,19 @@ +# This file is under the MIT License by authors + +pleaseRekeyAsap=\ + \u0417\u0431\u043E\u0433 \u043E\u0442\u0440\u0438\u0432\u0435\u043D\u0435 \u0440\u0430\u045A\u0438\u0432\u043E\u0441\u0442\u0438, \u043C\u043E\u0440\u0430\u043C\u043E \ + \u043F\u0440\u043E\u043C\u0435\u043D\u0438\u0442\u0438 \u043A\u0459\u0443\u0447 \u0437\u0430 \u0448\u0438\u0444\u0440\u043E\u0432\u0430\u045A\u0435 \u0442\u0430\u0458\u043D\u0438 \u0434\u0430 \u0434\u0438\u0441\u043A\u0443. \ + \u0422\u0430\u0458 \u043F\u0440\u043E\u0446\u0435\u0441 \u043F\u0440\u0435\u0442\u0440\u0430\u0436\u0438 \u0432\u0435\u043B\u0438\u043A\u0438 \u0434\u0435\u043E \u0432\u0430\u0448\u0435\u0433 $JENKINS_HOME ({0}) \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0458\u0443\u043C\u0430, \ + \u0438 \u043F\u043E\u043D\u043E\u0432\u043E \u0438\u0437\u0433\u0440\u0430\u0447\u0443\u043D\u0430 \u0445\u0435\u0448 \u0437\u0430 \u043F\u0440\u043E\u043D\u0430\u0452\u0435\u043D\u0435 \u043F\u043E\u0434\u0430\u0442\u043A\u0435, \u0448\u0442\u043E \u043C\u043E\u0436\u0435 \u043F\u0440\u0438\u043B\u0438\u0447\u043D\u043E \u0434\u0443\u0433\u043E \u0442\u0440\u0430\u0458\u0430\u0442\u0438. \ + \u041F\u0440\u043E\u0447\u0438\u0442\u0430\u0458\u0442\u0435 \u043E\u0432\u0430\u0458 \u0434\u043E\u043A\u0443\u043C\u0435\u043D\u0442 \u0433\u0434\u0435 \u0441\u0435 \u043F\u0438\u0448\u0435 \u043E \u0432\u0438\u0448\u0435 \u0438\u043C\u043F\u043B\u0438\u043A\u0430\u0446\u0438\u0458\u0430 \u0438 \u0434\u0440\u0443\u0433\u0430\u0447\u0438\u0458\u0435 \u043D\u0430\u0447\u0438\u043D\u0435 \ + \u041E\u0432\u0430 \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u0458\u0430 \u0441\u0435 \u043C\u043E\u0436\u0435 \u0431\u0435\u0437\u0431\u0435\u0434\u043D\u043E \u0438\u0437\u0432\u0440\u0448\u0438\u0442\u0438 \u0443 \u043F\u043E\u0437\u0430\u0434\u0438\u043D\u0438, \u043C\u0435\u0452\u0443\u0442\u0438\u043C \u043E\u0431\u0430\u0437\u0440\u0438\u0432\u0438 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u0446\u0438 \ + \u0431\u0438 \u043C\u043E\u0433\u043B\u0438 \u043D\u0430\u043F\u0440\u0430\u0432\u0438\u0442\u0438 \u0440\u0435\u0437\u0435\u0440\u0432\u043D\u0435 \u043A\u043E\u043F\u0438\u0458\u0435 \u043F\u043E\u0434\u0430\u0446\u0438\u043C\u0430. + +rekeyInProgress=\u041F\u043E\u043D\u043E\u0432\u043E \u0445\u0435\u0448\u0438\u0440\u0430\u045A\u0435 \u0458\u0435 \u0443 \u0442\u043E\u043A\u0443. \u041C\u043E\u0436\u0435\u0442\u0435 \u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0430\u0458\u0442\u0438 \u0436\u0443\u0440\u043D\u0430\u043B. + +rekeySuccessful=\ + Secrets in your $JENKINS_HOME \u0458\u0435 \u0443\u0441\u043F\u0435\u0448\u043D\u043E \u0438\u0437\u0445\u0435\u0448\u0438\u0440\u0430\u043D\u043E. \ + \u041C\u043E\u043B\u0438\u043C\u043E \u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0430\u0458\u0442\u0435 \u0436\u0443\u0440\u043D\u0430\u043B, \u043F\u043E\u0442\u0432\u0440\u0434\u0438\u0442\u0435, \u0438 \u043D\u0430\u0441\u0442\u0430\u0432\u0438\u0442\u0435 \u0438\u043B\u0438 \u043F\u043E\u043D\u043E\u0432\u043E \u0438\u0437\u0432\u0440\u0448\u0438\u0442\u0435. + +rekeyHadProblems=\ + \u041F\u043E\u043D\u043E\u0432\u043E \u0445\u0435\u0448\u0438\u0440\u0430\u045A\u0435 \u0458\u0435 \u0433\u043E\u0442\u043E\u0432\u043E, \u043C\u0435\u0452\u0443\u0442\u0438\u043C \u0431\u0438\u043B\u043E \u0458\u0435 \u0433\u0440\u0435\u0448\u0430\u043A\u0430. \u041C\u043E\u043B\u0438\u043C\u043E \u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0430\u0458\u0442\u0435 \u0436\u0443\u0440\u043D\u0430\u043B. \ No newline at end of file diff --git a/core/src/main/resources/jenkins/security/RekeySecretAdminMonitor/message_zh_TW.properties b/core/src/main/resources/jenkins/security/RekeySecretAdminMonitor/message_zh_TW.properties index 6887c4f899cd087844eec3f7f508138455d958c7..4376595018502c0e19d28c11a0328ecbc2570094 100644 --- a/core/src/main/resources/jenkins/security/RekeySecretAdminMonitor/message_zh_TW.properties +++ b/core/src/main/resources/jenkins/security/RekeySecretAdminMonitor/message_zh_TW.properties @@ -21,10 +21,10 @@ # THE SOFTWARE. pleaseRekeyAsap=\ - \u70ba\u4e86\u4fee\u6b63\u5148\u524d\u767c\u73fe\u7684\u5b89\u5168\u6027\u5f31\u9ede\uff0c\ + \u70ba\u4e86\u4fee\u6b63\u5148\u524d\u767c\u73fe\u7684\u5b89\u5168\u6027\u5f31\u9ede\uff0c\ \u7528\u4f86\u4fdd\u8b77\u78c1\u789f\u4e0a\u542b\u6a5f\u654f\u8a2d\u5b9a\u6a94\u7684\u52a0\u5bc6\u91d1\u9470\u4e00\u5b9a\u8981\u66f4\u6539\u3002\ \u6574\u500b\u7a0b\u5e8f\u6703\u6383\u63cf\u60a8 $JENKINS_HOME ({0}) \u4e2d\u7684\u5927\u90e8\u5206\u6a94\u6848\uff0c\u627e\u51fa\u52a0\u5bc6\u7684\u8cc7\u6599\u91cd\u5957\u91d1\u9470\uff0c\u53ef\u80fd\u8981\u82b1\u4e0a\u4e0d\u5c11\u6642\u9593\u3002\ - \u9019\u4efd\u6587\u4ef6\u8aaa\u660e\u4e86\u5be6\u65bd (\u6216\u4ec0\u9ebc\u4e8b\u90fd\u4e0d\u505a) \u9019\u9805\u63aa\u65bd\u7684\u65b9\u6cd5\u53ca\u5f71\u97ff\u3002\ + \u9019\u4efd\u6587\u4ef6\u8aaa\u660e\u4e86\u5be6\u65bd (\u6216\u4ec0\u9ebc\u4e8b\u90fd\u4e0d\u505a) \u9019\u9805\u63aa\u65bd\u7684\u65b9\u6cd5\u53ca\u5f71\u97ff\u3002\ \u9019\u9805\u4f5c\u696d\u53ef\u4ee5\u5b89\u5168\u7684\u5728\u80cc\u666f\u57f7\u884c\uff0c\u4e0d\u904e\u5982\u679c\u60a8\u5f88\u8b39\u614e\uff0c\u5efa\u8b70\u60a8\u5148\u505a\u597d\u5099\u4efd\u3002 rekeyInProgress=\u91d1\u9470\u91cd\u5957\u4e2d\u3002\u60a8\u53ef\u4ee5\u67e5\u770b\u8a18\u9304\u3002 diff --git a/core/src/main/resources/jenkins/security/UpdateSiteWarningsConfiguration/config.groovy b/core/src/main/resources/jenkins/security/UpdateSiteWarningsConfiguration/config.groovy new file mode 100644 index 0000000000000000000000000000000000000000..ac82bf1891838da370792124a6c966aa0969c3fb --- /dev/null +++ b/core/src/main/resources/jenkins/security/UpdateSiteWarningsConfiguration/config.groovy @@ -0,0 +1,70 @@ +/* + * The MIT License + * + * Copyright (c) 2016, CloudBees, Inc. + * + * 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.security.UpdateSiteWarningsConfiguration + +f = namespace(lib.FormTagLib) +st = namespace("jelly:stapler") + +st.adjunct(includes: "jenkins.security.UpdateSiteWarningsConfiguration.style") + +def printEntry(warning, title, checked) { + f.block { + f.checkbox(name: warning.id, + title: title, + checked: checked, + class: 'hideWarnings'); + div(class: "setting-description") { + a(warning.url, href: warning.url) + } + } +} + +f.section(title:_("Hidden security warnings")) { + + f.advanced(title: _("Security warnings"), align:"left") { + f.block { + text(_("blurb")) + } + f.entry(title: _("Security warnings"), + help: '/descriptorByName/UpdateSiteWarningsConfiguration/help') { + table(width:"100%") { + + descriptor.applicableWarnings.each { warning -> + if (warning.type == hudson.model.UpdateSite.Warning.Type.CORE) { + printEntry(warning, + _("warning.core", warning.message), + !descriptor.isIgnored(warning)) + } + else if (warning.type == hudson.model.UpdateSite.Warning.Type.PLUGIN) { + def plugin = descriptor.getPlugin(warning) + printEntry(warning, + _("warning.plugin", plugin.displayName, warning.message), + !descriptor.isIgnored(warning)) + } + } + } + } + } +} diff --git a/core/src/main/resources/hudson/triggers/SCMTrigger/AdministrativeMonitorImpl/message_da.properties b/core/src/main/resources/jenkins/security/UpdateSiteWarningsConfiguration/config.properties similarity index 80% rename from core/src/main/resources/hudson/triggers/SCMTrigger/AdministrativeMonitorImpl/message_da.properties rename to core/src/main/resources/jenkins/security/UpdateSiteWarningsConfiguration/config.properties index 4b91ae81e285c610e5128c70df8c7d2b65da6d54..333445cd3f55d04fdad68413e2b9d5c64a64ee88 100644 --- a/core/src/main/resources/hudson/triggers/SCMTrigger/AdministrativeMonitorImpl/message_da.properties +++ b/core/src/main/resources/jenkins/security/UpdateSiteWarningsConfiguration/config.properties @@ -1,6 +1,6 @@ # The MIT License # -# Copyright (c) 2004-2010, Sun Microsystems, Inc. Kohsuke Kawaguchi. Knud Poulsen. +# Copyright (c) 2016, CloudBees, Inc. # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -20,5 +20,8 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -blurb=Der er flere kildekodestyrings (SCM) pollinger i k\u00f8 end systemet kan n\u00e5 at h\u00e5ndtere, s\u00e5 \ -tr\u00e5dene kan ikke f\u00f8lge med eftersp\u00f8rgslen. \ +warning.core = Jenkins core: {0} +warning.plugin = {0}: {1} + +blurb = This section allows you to disable warnings published on the update site. \ + Checked warnings are visible (the default), unchecked warnings are hidden. diff --git a/core/src/main/resources/jenkins/security/UpdateSiteWarningsConfiguration/help.html b/core/src/main/resources/jenkins/security/UpdateSiteWarningsConfiguration/help.html new file mode 100644 index 0000000000000000000000000000000000000000..1cb7b1df5d426ff875b5b05e071973536503885e --- /dev/null +++ b/core/src/main/resources/jenkins/security/UpdateSiteWarningsConfiguration/help.html @@ -0,0 +1,14 @@ +

        + This list contains all warnings relevant to currently installed components published by the configured update sites. + These are typically security-related. + Warnings that have been published but are not relevant to currently installed components (either because the affected component isn't installed, or an unaffected version is installed) are not shown here. +

        +

        + Checked entries (the default) are active, i.e. they're shown to administrators in an administrative monitor. + Entries can be unchecked to hide them. + This can be useful if you've evaluated a specific warning and are confident it does not apply to your environment or configuration, and continued use of the specified component does not constitute a security problem. +

        +

        + Please note that only specific warnings can be disabled; it is not possible to disable all warnings about a certain component. + If you wish to disable the display of warnings entirely, then you can disable the administrative monitor in Configure System. +

        diff --git a/core/src/main/resources/jenkins/security/UpdateSiteWarningsConfiguration/style.css b/core/src/main/resources/jenkins/security/UpdateSiteWarningsConfiguration/style.css new file mode 100644 index 0000000000000000000000000000000000000000..ff1dd9bb5ec4b03dd528550df62ff71dd1f7f089 --- /dev/null +++ b/core/src/main/resources/jenkins/security/UpdateSiteWarningsConfiguration/style.css @@ -0,0 +1,4 @@ +.hideWarnings:not(:checked) + label { + color: grey; + text-decoration: line-through; +} diff --git a/core/src/main/resources/jenkins/security/UpdateSiteWarningsMonitor/message.groovy b/core/src/main/resources/jenkins/security/UpdateSiteWarningsMonitor/message.groovy new file mode 100644 index 0000000000000000000000000000000000000000..09e9bfe161a335af50f14cb51f31c2372cf0c2dd --- /dev/null +++ b/core/src/main/resources/jenkins/security/UpdateSiteWarningsMonitor/message.groovy @@ -0,0 +1,77 @@ +/* + * The MIT License + * + * Copyright (c) 2016, CloudBees, Inc. + * + * 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.security.UpdateSiteWarningsMonitor + +def f = namespace(lib.FormTagLib) + +def listWarnings(warnings) { + warnings.each { warning -> + li { + a(warning.message, href: warning.url) + } + } +} + +def coreWarnings = my.activeCoreWarnings +def pluginWarnings = my.activePluginWarningsByPlugin + +div(class: "error") { + text(_("blurb")) + ul { + if (!coreWarnings.isEmpty()) { + li { + text(_("coreTitle", jenkins.model.Jenkins.version)) + ul { + listWarnings(coreWarnings) + } + } + } + + if (!pluginWarnings.isEmpty()) { + li { + pluginWarnings.each { plugin, warnings -> + a(_("pluginTitle", plugin.displayName, plugin.version), href: plugin.url) + + ul { + listWarnings(warnings) + } + } + } + } + } + + if (my.hasApplicableHiddenWarnings()) { + text(_("more")) + } +} + +form(method: "post", action: "${rootURL}/${it.url}/forward") { + div { + if (!pluginWarnings.isEmpty()) { + f.submit(name: 'fix', value: _("pluginManager.link")) + } + f.submit(name: 'configure', value: _("configureSecurity.link")) + } +} diff --git a/core/src/main/resources/jenkins/security/UpdateSiteWarningsMonitor/message.properties b/core/src/main/resources/jenkins/security/UpdateSiteWarningsMonitor/message.properties new file mode 100644 index 0000000000000000000000000000000000000000..35d33182f298088612131b234614789d69aa30bf --- /dev/null +++ b/core/src/main/resources/jenkins/security/UpdateSiteWarningsMonitor/message.properties @@ -0,0 +1,31 @@ +# The MIT License +# +# Copyright (c) 2016, CloudBees, Inc. +# +# 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. + +pluginTitle = {0} {1}: +coreTitle = Jenkins {0} core and libraries: + +blurb = Warnings have been published for the following currently installed components: +more = Additional warnings are hidden due to the current security configuration. + + +pluginManager.link = Go to plugin manager +configureSecurity.link = Configure which of these warnings are shown diff --git a/core/src/main/resources/jenkins/security/s2m/AdminCallableMonitor/message_sr.properties b/core/src/main/resources/jenkins/security/s2m/AdminCallableMonitor/message_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..e2deed27ee8912418fdd2df2e05e9239d7907bd1 --- /dev/null +++ b/core/src/main/resources/jenkins/security/s2m/AdminCallableMonitor/message_sr.properties @@ -0,0 +1,6 @@ +# This file is under the MIT License by authors + +Examine=\u041F\u0440\u0435\u0433\u043B\u0435\u0434\u0430\u0458 +Dismiss=\u041E\u0442\u043A\u0430\u0436\u0438 +blurb=Jenkins \u0458\u0435 \u043E\u0434\u0431\u0438\u0458\u043E \u043D\u0435\u043A\u0435 \u0430\u0433\u0435\u043D\u0442\u043E\u0432\u0435 \u043A\u043E\u043C\u0430\u043D\u0434\u0435, \u0437\u0430\u0448\u0442\u043E \u043D\u0438\u0458\u0435 \u0458\u0430\u0441\u043D\u043E \u0430\u043A\u043E \u0458\u0435 \u0434\u043E\u0437\u0432\u043E\u0459\u0435\u043D\u043E \u0430\u0433\u0435\u043D\u0442\u0438\u043C\u0430, \ + \u043C\u0435\u0452\u0443\u0442\u0438\u043C \u043E\u0432\u0430 \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u0458\u0430 \u0458\u0435 \u0432\u0435\u0440\u043E\u0432\u0430\u0442\u043D\u043E \u043F\u0440\u0435\u043A\u0438\u043D\u0443\u043B\u0430 \u043D\u0435\u043A\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430. \u0420\u0430\u0437\u043C\u0438\u0441\u043B\u0438\u0442\u0435 \u0430\u043A\u043E \u0431\u0438 \u043C\u043E\u0433\u043E \u0434\u043E\u0437\u0432\u043E\u043B\u0438\u0442\u0438 \u0430\u0433\u0435\u043D\u0442\u0438\u043C\u0430. diff --git a/core/src/main/resources/jenkins/security/s2m/AdminWhitelistRule/index.jelly b/core/src/main/resources/jenkins/security/s2m/AdminWhitelistRule/index.jelly index d4c181f80fda2aa43b65852acf78be29f51b0b7a..738fe7cf025c708d83762cd81107566e0428a5ec 100644 --- a/core/src/main/resources/jenkins/security/s2m/AdminWhitelistRule/index.jelly +++ b/core/src/main/resources/jenkins/security/s2m/AdminWhitelistRule/index.jelly @@ -36,7 +36,7 @@ THE SOFTWARE. as an administrator, you can mark commands as OK for agents to execute (aka "whitelisting".)

        - Please see the discussion of this feature to + Please see the discussion of this feature to understand the security implication of this.
        diff --git a/core/src/main/resources/jenkins/security/s2m/AdminWhitelistRule/index_sr.properties b/core/src/main/resources/jenkins/security/s2m/AdminWhitelistRule/index_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..605e8f9eda413db9aedff6a206b3087890c146ed --- /dev/null +++ b/core/src/main/resources/jenkins/security/s2m/AdminWhitelistRule/index_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +Whitelist= +Agent\ \u2192\ Master\ Access\ Control= +Update=\u0410\u0436\u0443\u0440\u0438\u0440\u0430\u0458 diff --git a/core/src/main/resources/jenkins/security/s2m/MasterKillSwitchConfiguration/config.groovy b/core/src/main/resources/jenkins/security/s2m/MasterKillSwitchConfiguration/config.groovy index bc95f575f703aefe3870c4ed367383ee7fc17ffd..b37406296801eeeb81c4ecffc0b0e930d982e30e 100644 --- a/core/src/main/resources/jenkins/security/s2m/MasterKillSwitchConfiguration/config.groovy +++ b/core/src/main/resources/jenkins/security/s2m/MasterKillSwitchConfiguration/config.groovy @@ -3,7 +3,7 @@ package jenkins.security.s2m.MasterKillSwitchConfiguration def f=namespace(lib.FormTagLib) if (instance.isRelevant()) { - f.optionalBlock(field:"masterToSlaveAccessControl", title:_("Enable Slave \u2192 Master Access Control")) { + f.optionalBlock(field:"masterToSlaveAccessControl", title:_("Enable Agent \u2192 Master Access Control")) { f.nested() { raw _("Rules can be tweaked here") } diff --git a/core/src/main/resources/jenkins/security/s2m/MasterKillSwitchConfiguration/help-masterToSlaveAccessControl.html b/core/src/main/resources/jenkins/security/s2m/MasterKillSwitchConfiguration/help-masterToSlaveAccessControl.html index e47019b266374c58635e9138cc622ca636d901d4..af45b305162aec2b4d926c424c832581ef5a3546 100644 --- a/core/src/main/resources/jenkins/security/s2m/MasterKillSwitchConfiguration/help-masterToSlaveAccessControl.html +++ b/core/src/main/resources/jenkins/security/s2m/MasterKillSwitchConfiguration/help-masterToSlaveAccessControl.html @@ -1,4 +1,4 @@
        - See Jenkins project website for discussion of this feature. + See Jenkins project website for discussion of this feature. We strongly recommend you enable this.
        diff --git a/core/src/main/resources/jenkins/security/s2m/MasterKillSwitchWarning/message.properties b/core/src/main/resources/jenkins/security/s2m/MasterKillSwitchWarning/message.properties index fe6e52c2b579164671b71a280806f8148ff1d976..48ec09a5dfeca1e9c03a9ffc817e1663a3d3310c 100644 --- a/core/src/main/resources/jenkins/security/s2m/MasterKillSwitchWarning/message.properties +++ b/core/src/main/resources/jenkins/security/s2m/MasterKillSwitchWarning/message.properties @@ -1,2 +1,2 @@ blurb=Agent to master security subsystem is currently off. \ - Please read the documentation and consider turning it on. \ No newline at end of file + Please read the documentation and consider turning it on. diff --git a/core/src/main/resources/jenkins/security/s2m/MasterKillSwitchWarning/message_pt_BR.properties b/core/src/main/resources/jenkins/security/s2m/MasterKillSwitchWarning/message_pt_BR.properties index 9fcd4e14738e21f58175a55e8b450ffb33e71cf1..bd5c7db99560479f1ead4d7e536e02b3bf07af2c 100644 --- a/core/src/main/resources/jenkins/security/s2m/MasterKillSwitchWarning/message_pt_BR.properties +++ b/core/src/main/resources/jenkins/security/s2m/MasterKillSwitchWarning/message_pt_BR.properties @@ -22,5 +22,5 @@ Examine= Dismiss= -# Please read the documentation and consider turning it on. - Por favor leia a documenta\u00e7\u00e3o e ligue novamente. +# Please read the documentation and consider turning it on. + Por favor leia a documenta\u00e7\u00e3o e ligue novamente. diff --git a/core/src/main/resources/jenkins/security/s2m/MasterKillSwitchWarning/message_sr.properties b/core/src/main/resources/jenkins/security/s2m/MasterKillSwitchWarning/message_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..41945798fed1fb14c591dc298a63d4d6ddcbe0f4 --- /dev/null +++ b/core/src/main/resources/jenkins/security/s2m/MasterKillSwitchWarning/message_sr.properties @@ -0,0 +1,6 @@ +# This file is under the MIT License by authors + +Examine= +Dismiss=\u041E\u0442\u043A\u0430\u0436\u0438 +blurb=\u0421\u0438\u0441\u0442\u0435\u043C \u043E\u0431\u0435\u0437\u0431\u0435\u0436\u0438\u0432\u0430\u045A\u0430 \u0432\u0435\u0437\u043E\u043C \u0438\u0437\u043C\u0435\u0452\u0443 \u0430\u0433\u0435\u043D\u0442\u0430 \u0438 \u043C\u0430\u0441\u0442\u0435\u0440\u0430 \u0458\u0435 \u0438\u0441\u043A\u0459\u0443\u0447\u0435\u043D. \ + \u041C\u043E\u043B\u0438\u043C\u043E \u0432\u0430\u0441, \u043F\u0440\u043E\u0447\u0438\u0442\u0430\u0458\u0442\u0435 \u0434\u043E\u043A\u043C\u0435\u043D\u0442\u0430\u0446\u0438\u0458\u0443 \u0438 \u0443\u043A\u0459\u0443\u0447\u0438\u0442\u0435 \u0430\u043A\u043E \u0432\u0430\u043C \u0458\u0435 \u043F\u043E\u0442\u0440\u0435\u0431\u043D\u043E. diff --git a/core/src/main/resources/jenkins/security/s2m/Messages.properties b/core/src/main/resources/jenkins/security/s2m/Messages.properties new file mode 100644 index 0000000000000000000000000000000000000000..25f919d28e4049c1280ba0a07d5f8330223f48bb --- /dev/null +++ b/core/src/main/resources/jenkins/security/s2m/Messages.properties @@ -0,0 +1,2 @@ +AdminCallableMonitor.DisplayName=Rejected Agent \u2192 Master Access Attempt +MasterKillSwitchWarning.DisplayName=Disabled Agent \u2192 Master Access Control diff --git a/core/src/main/resources/jenkins/security/s2m/callable.conf b/core/src/main/resources/jenkins/security/s2m/callable.conf index 070379c61f4673424bf96524db4578715d545fc4..cb8943df26292ba4f15ea0ff0660f61e2843da9c 100644 --- a/core/src/main/resources/jenkins/security/s2m/callable.conf +++ b/core/src/main/resources/jenkins/security/s2m/callable.conf @@ -5,7 +5,7 @@ # To whitelist other names, place *.conf files by other names into this folder. # This file gets overwritten every time Jenkins starts. # -# See http://jenkins-ci.org/security-144 for more details. +# See https://jenkins.io/redirect/security-144 for more details. # maven plugin hudson.maven.MavenBuildProxy$Filter$AsyncInvoker diff --git a/core/src/main/resources/jenkins/security/s2m/filepath-filter.conf b/core/src/main/resources/jenkins/security/s2m/filepath-filter.conf index c1883cc56295d1a4aa9940a04223fa989306a732..0905bd0ce8ba4507ee5f018634e2ad260c787fc0 100644 --- a/core/src/main/resources/jenkins/security/s2m/filepath-filter.conf +++ b/core/src/main/resources/jenkins/security/s2m/filepath-filter.conf @@ -7,7 +7,7 @@ # before parsed, so using a lower number allows you to override what we have here. This file # gets overwritten every time Jenkins starts. # -# See http://jenkins-ci.org/security-144 for more details. +# See https://jenkins.io/redirect/security-144 for more details. # This directory contains credentials, master encryption keys, and other sensitive information # that slaves have absolutely no business with. @@ -17,12 +17,15 @@ deny all /secrets($|/.*) # User content is publicly readable, so quite safe for slaves to read, too. # (The xunit plugin is known to read from here.) -# https://wiki.jenkins-ci.org/display/JENKINS/User+Content +# https://jenkins.io/redirect/user-content-directory allow read,stat /userContent($|/.*) # In the next rule we grant general access under build directories, so first we protect # the actual build record that Jenkins core reads, which nothing should be touching. deny all /build.xml +# Similarly for Pipeline build (WorkflowRun) metadata: +deny all /program.dat +deny all /workflow($|/.*) # Various plugins read/write files under build directories, so allow them all. # - git 1.x writes changelog.xml from the slave (2.x writes from the master so need not be listed) diff --git a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol/description.jelly b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol/description.jelly index d848342d48d194ad336aebbe55a2397ee493d251..55e2c974b5ba1050be718c322da2b72ff5d8cd2a 100644 --- a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol/description.jelly +++ b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol/description.jelly @@ -1,4 +1,4 @@ - ${%Accepts connections from remote clients so that they can be used as additional build agents} + ${%summary} diff --git a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol/description.properties b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol/description.properties new file mode 100644 index 0000000000000000000000000000000000000000..3422f1555312302959d5407484da8117a627ae20 --- /dev/null +++ b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol/description.properties @@ -0,0 +1,2 @@ +summary=Accepts connections from remote clients so that they can be used as additional build agents. \ + This protocol is unencrypted. diff --git a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol/description_sr.properties b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol/description_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..3f5c9d27c2c35524c42bb441d0ace2ef50ed349b --- /dev/null +++ b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol/description_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +summary=\u041f\u0440\u0438\u0445\u0432\u0430\u0442\u0430 \u0432\u0435\u0437\u0435 \u043e\u0434 \u043a\u043b\u0438\u0458\u0435\u043d\u0442\u0438\u043c\u0430 \u0434\u0430 \u0431\u0438 \u043c\u043e\u0433\u043b\u0438 \u0441\u0435 \u0443\u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0438 \u043a\u0430\u043e \u0434\u043e\u0434\u0430\u0442\u043d\u0435 \u0430\u0433\u0435\u043d\u0442\u0435 \u0437\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045a\u0443. diff --git a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol2/description.jelly b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol2/description.jelly index b3c0c584443270b51fbf6a8d68cad9ed9c6e3375..55e2c974b5ba1050be718c322da2b72ff5d8cd2a 100644 --- a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol2/description.jelly +++ b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol2/description.jelly @@ -1,4 +1,4 @@ - ${%Extends the version 1 protocol by adding a per-client cookie, so that we can detect a reconnection from the agent and take appropriate action} + ${%summary} diff --git a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol2/description.properties b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol2/description.properties new file mode 100644 index 0000000000000000000000000000000000000000..edb6b96c467ee96a5bda94e1893d5a6179d67b7d --- /dev/null +++ b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol2/description.properties @@ -0,0 +1,3 @@ +summary=Extends the version 1 protocol by adding a per-client cookie, \ +so that we can detect a reconnection from the agent and take appropriate action. \ +This protocol is unencrypted. diff --git a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol2/description_sr.properties b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol2/description_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..f96b74e2e01d05f3d82c3e61dd72c90ae96ab298 --- /dev/null +++ b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol2/description_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +summary=\u041d\u0430\u0434\u0433\u0440\u0430\u0452\u0443\u0458\u0435 \u0432\u0435\u0440\u0437\u0438\u0458\u0443 1 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 \u0434\u043e\u0434\u0430\u0432\u0430\u045b\u0438 cookie \u0441\u0432\u0430\u043a\u043e\u043c \u043a\u043b\u0438\u0458\u0435\u043d\u0442\u0443, \u0448\u0442\u043e \u043e\u043c\u043e\u0433\u0443\u0458\u0443\u045b\u0435 \u043f\u043e\u043d\u043e\u0432\u043e \u043f\u043e\u0432\u0435\u0437\u0438\u0432\u0430\u045a\u0435 \u0441\u0430 \u0430\u0433\u0435\u043d\u0442\u043e\u043c. diff --git a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol3/description.jelly b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol3/description.jelly index c052dfe335ebad1dd26214fe826cf02022197b42..55e2c974b5ba1050be718c322da2b72ff5d8cd2a 100644 --- a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol3/description.jelly +++ b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol3/description.jelly @@ -1,4 +1,4 @@ - ${%Extends the version 2 protocol by adding basic encryption but requires a thread per client} + ${%summary} diff --git a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol3/description.properties b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol3/description.properties new file mode 100644 index 0000000000000000000000000000000000000000..3e5d49de58e3d9175af7ca59eb1d596ed36020dd --- /dev/null +++ b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol3/description.properties @@ -0,0 +1,4 @@ +summary=Extends the version 2 protocol by adding basic encryption but requires a thread per client. \ + This protocol falls back to Java Web Start Agent Protocol/2 (unencrypted) when it can't create a secure connection. \ + This protocol is not recommended. \ + Use Java Web Start Agent Protocol/4 instead. diff --git a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol3/description_sr.properties b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol3/description_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..8c185f3e4bb71432552c7fc8e4e385e0fea6f7c7 --- /dev/null +++ b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol3/description_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors +#TODO: Summary is outdated, needs to be modified +summary=\u041d\u0430\u0434\u0433\u0440\u0430\u0452\u0443\u0458\u0435 \u0432\u0435\u0440\u0437\u0438\u0458\u0443 2 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 \u0434\u043e\u0434\u0430\u0432\u0430\u0458\u0443\u045b\u0438 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u045a\u0435 (\u043f\u043e\u0442\u0440\u0435\u0431\u043d\u043e \u0458\u0435\u0434\u0430\u043d \u043d\u0438\u0437 \u0437\u0430 \u0441\u0432\u0430\u043a\u043e\u0433 \u043a\u043b\u0438\u0458\u0435\u043d\u0442\u0430) diff --git a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol4/description.jelly b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol4/description.jelly new file mode 100644 index 0000000000000000000000000000000000000000..55e2c974b5ba1050be718c322da2b72ff5d8cd2a --- /dev/null +++ b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol4/description.jelly @@ -0,0 +1,4 @@ + + + ${%summary} + diff --git a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol4/description.properties b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol4/description.properties new file mode 100644 index 0000000000000000000000000000000000000000..9cf2b4b2f87d0d25087783f2f91cb62ea8133eb8 --- /dev/null +++ b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol4/description.properties @@ -0,0 +1 @@ +summary=A TLS secured connection between the master and the agent performed by TLS upgrade of the socket. diff --git a/core/src/main/resources/jenkins/slaves/Messages.properties b/core/src/main/resources/jenkins/slaves/Messages.properties index c66841c3089e4b10eaa807701821cdd8f5c400bc..6cdab92614506136a9ce3d6b5bed27aae19111fa 100644 --- a/core/src/main/resources/jenkins/slaves/Messages.properties +++ b/core/src/main/resources/jenkins/slaves/Messages.properties @@ -20,6 +20,7 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -JnlpSlaveAgentProtocol.displayName=Java Web Start Agent Protocol/1 -JnlpSlaveAgentProtocol2.displayName=Java Web Start Agent Protocol/2 -JnlpSlaveAgentProtocol3.displayName=Java Web Start Agent Protocol/3 +JnlpSlaveAgentProtocol.displayName=Java Web Start Agent Protocol/1 (unencrypted) +JnlpSlaveAgentProtocol2.displayName=Java Web Start Agent Protocol/2 (unencrypted) +JnlpSlaveAgentProtocol3.displayName=Java Web Start Agent Protocol/3 (basic encryption) +JnlpSlaveAgentProtocol4.displayName=Java Web Start Agent Protocol/4 (TLS encryption) diff --git a/core/src/main/resources/jenkins/slaves/systemInfo/Messages_ru.properties b/core/src/main/resources/jenkins/slaves/systemInfo/Messages_ru.properties index 558d5d1c798e33cc8c570f6aef4015c5d8ab2788..c623831dd27d3494e9e729c23bc0edaa528670fa 100644 --- a/core/src/main/resources/jenkins/slaves/systemInfo/Messages_ru.properties +++ b/core/src/main/resources/jenkins/slaves/systemInfo/Messages_ru.properties @@ -20,6 +20,7 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -EnvVarsSlaveInfo.DisplayName=\u041F\u0435\u0440\u0435\u043C\u0435\u043D\u043D\u044B\u0435 \u0441\u0440\u0435\u0434\u044B -SystemPropertySlaveInfo.DisplayName=\u0421\u0432\u043E\u0439\u0441\u0442\u0432\u0430 \u0441\u0438\u0441\u0442\u0435\u043C\u044B -ThreadDumpSlaveInfo.DisplayName=\u0414\u0430\u043C\u043F \u043F\u043E\u0442\u043E\u043A\u0430 +EnvVarsSlaveInfo.DisplayName=\u041f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0441\u0440\u0435\u0434\u044b +SystemPropertySlaveInfo.DisplayName=\u0421\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u044b +ThreadDumpSlaveInfo.DisplayName=\u0414\u0430\u043c\u043f \u043f\u043e\u0442\u043e\u043a\u0430 +ClassLoaderStatisticsSlaveInfo.DisplayName=\u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0430 \u0443\u0434\u0430\u043b\u0451\u043d\u043d\u043e\u0433\u043e Class Loader'\u0430 diff --git a/core/src/main/resources/jenkins/slaves/systemInfo/Messages_sr.properties b/core/src/main/resources/jenkins/slaves/systemInfo/Messages_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..e6738c3bfc378ce4020603545569e8713f3ce76e --- /dev/null +++ b/core/src/main/resources/jenkins/slaves/systemInfo/Messages_sr.properties @@ -0,0 +1,6 @@ +# This file is under the MIT License by authors + +SystemPropertySlaveInfo.DisplayName=\u0421\u0438\u0441\u0442\u0435\u043C\u0441\u0435 \u043F\u043E\u0441\u0442\u0430\u0432\u043A\u0435 +EnvVarsSlaveInfo.DisplayName=\u041F\u0440\u043E\u043C\u0435\u043D\u0459\u0438\u0432\u0435 \u043E\u043A\u043E\u043B\u0438\u043D\u0435 +ThreadDumpSlaveInfo.DisplayName=\u0414\u0435\u043F\u043E\u043D\u0438\u0458a \u043D\u0438\u0442\u043E\u0432\u0430 +ClassLoaderStatisticsSlaveInfo.DisplayName=\u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043A\u0435 \u0443\u0447\u0438\u0442\u0430\u045A\u0435 \u043A\u043B\u0430\u0441\u043E\u0432\u0430 \u0441\u0430 \u0434\u0430\u043B\u0435\u043A\u0430 diff --git a/core/src/main/resources/jenkins/tools/GlobalToolConfiguration/index_sr.properties b/core/src/main/resources/jenkins/tools/GlobalToolConfiguration/index_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..0d6d81f5bc032d679c36858df30e23c43818902c --- /dev/null +++ b/core/src/main/resources/jenkins/tools/GlobalToolConfiguration/index_sr.properties @@ -0,0 +1,6 @@ +# This file is under the MIT License by authors + +Back\ to\ Dashboard=\u041D\u0430\u0437\u0430\u0434 \u043A\u0430 \u043A\u043E\u043D\u0442\u0440\u043E\u043B\u043D\u0443 \u043F\u0430\u043D\u0435\u043B\u0443 +Manage\ Jenkins=\u0423\u043F\u0440\u0430\u0432\u0459\u0430\u045A\u0435 Jenkins-\u043E\u043C +Save=\u0421\u0430\u0447\u0443\u0432\u0430\u0458 +Apply=\u041F\u0440\u0438\u043C\u0435\u043D\u0438 \ No newline at end of file diff --git a/core/src/main/resources/hudson/views/BuildButtonColumn/column_fi.properties b/core/src/main/resources/jenkins/triggers/Messages_pl.properties similarity index 87% rename from core/src/main/resources/hudson/views/BuildButtonColumn/column_fi.properties rename to core/src/main/resources/jenkins/triggers/Messages_pl.properties index c29801ba3b57e7d0de90b0b34ef8c9f9c39972a9..68d7ca29cb311b1421feba9d370b11a731d5c808 100644 --- a/core/src/main/resources/hudson/views/BuildButtonColumn/column_fi.properties +++ b/core/src/main/resources/jenkins/triggers/Messages_pl.properties @@ -1,6 +1,6 @@ # The MIT License # -# Copyright (c) 2004-2010, Sun Microsystems, Inc. +# Copyright (c) 2016, Damian Szczepanik # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -19,6 +19,4 @@ # 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=Ajastettu buildi -Schedule_a_build=Aloita k\u00E4\u00E4nn\u00F6s\u003a {0} +ReverseBuildTrigger.build_after_other_projects_are_built=Uruchamiaj, gdy inne zadania zostan\u0105 zako\u0144czone diff --git a/core/src/main/resources/jenkins/triggers/Messages_sr.properties b/core/src/main/resources/jenkins/triggers/Messages_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..6a6c113a30ec36ab2c413c9bfc503176b529acab --- /dev/null +++ b/core/src/main/resources/jenkins/triggers/Messages_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +ReverseBuildTrigger.build_after_other_projects_are_built=\u0418\u0437\u0433\u0440\u0430\u0434\u0438 \u043F\u043E\u0441\u043B\u0435 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 \u0434\u0440\u0443\u0433\u0438\u0445 \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u0430 +SCMTriggerItem.PollingVetoed=\u0417\u0430\u0445\u0442\u0435\u0432\u0438 \u043F\u0440\u0435\u043C\u0430 \u0441\u0438\u0441\u0442\u0435\u043C\u0443 \u0443\u043F\u0440\u0430\u0432\u0459\u0430\u045A\u0430 \u0438\u0437\u0432\u043E\u0440\u043D\u043E\u0433 \u043A\u043E\u0434\u0430 \u0441\u0443 \u043F\u0440\u0438\u0432\u0440\u0435\u043C\u0435\u043D\u043E \u0441\u0443\u0441\u043F\u0435\u043D\u0434\u043E\u0432\u0430\u043D\u0438 \u043E\u0434 \u0441\u0442\u0440\u0430\u043D\u0435 {0}. +ReverseBuildTrigger.running_as_cannot_even_see_for_trigger_f=\u0418\u0437\u0431\u0440\u0448\u0430\u0432\u0430\u045A\u0435 \u043A\u0430\u043E {0} \u043D\u0435\u043C\u043E\u0436\u0435 \u043F\u0440\u0438\u0441\u0442\u0443\u043F\u0438\u0442\u0438 \u043D\u0438 {1} \u0437\u0430 \u0438\u0437\u0430\u0437\u0438\u0432\u0430\u045A\u0435 \u043E\u0434 {2} \ No newline at end of file diff --git a/core/src/main/resources/jenkins/triggers/ReverseBuildTrigger/config_de.properties b/core/src/main/resources/jenkins/triggers/ReverseBuildTrigger/config_de.properties index 764ba9822777472d82935c21773c929ff9a670d1..75c162d626ed101beed9f1ff21930db5b121934c 100644 --- a/core/src/main/resources/jenkins/triggers/ReverseBuildTrigger/config_de.properties +++ b/core/src/main/resources/jenkins/triggers/ReverseBuildTrigger/config_de.properties @@ -1,26 +1,26 @@ -# The MIT License -# -# Copyright (c) 2004-2015, Sun Microsystems, Inc., Kohsuke Kawaguchi, Simon Wiest -# -# 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. - -Projects\ to\ watch=Zu berwachende Projekte -Trigger\ only\ if\ build\ is\ stable=Nur auslsen, wenn der Build stabil ist -Trigger\ even\ if\ the\ build\ is\ unstable=Auslsen, selbst wenn der Build instabil ist +# The MIT License +# +# Copyright (c) 2004-2015, Sun Microsystems, Inc., Kohsuke Kawaguchi, Simon Wiest +# +# 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. + +Projects\ to\ watch=Zu berwachende Projekte +Trigger\ only\ if\ build\ is\ stable=Nur auslsen, wenn der Build stabil ist +Trigger\ even\ if\ the\ build\ is\ unstable=Auslsen, selbst wenn der Build instabil ist Trigger\ even\ if\ the\ build\ fails=Auslsen, selbst wenn der Build fehlschlgt \ No newline at end of file diff --git a/core/src/main/resources/jenkins/triggers/ReverseBuildTrigger/config_pl.properties b/core/src/main/resources/jenkins/triggers/ReverseBuildTrigger/config_pl.properties new file mode 100644 index 0000000000000000000000000000000000000000..1dc6324ab4868007215e1f617004b491748577f0 --- /dev/null +++ b/core/src/main/resources/jenkins/triggers/ReverseBuildTrigger/config_pl.properties @@ -0,0 +1,25 @@ +# The MIT License +# +# Copyright (c) 2016, Damian Szczepanik +# +# 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. +Trigger\ only\ if\ build\ is\ stable=Uruchamiaj tylko, je\u015Bli zadanie by\u0142o stabilne +Trigger\ even\ if\ the\ build\ is\ unstable=Uruchamiaj nawet, je\u015Bli zadanie by\u0142o niestabilne +Projects\ to\ watch=Obserwowane projekty +Trigger\ even\ if\ the\ build\ fails=Uruchamiaj nawet, je\u015Bli zadanie nie powiod\u0142o si\u0119 diff --git a/core/src/main/resources/jenkins/triggers/ReverseBuildTrigger/config_sr.properties b/core/src/main/resources/jenkins/triggers/ReverseBuildTrigger/config_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..37827874c80858e715ded39b7cc2eefb855cc07c --- /dev/null +++ b/core/src/main/resources/jenkins/triggers/ReverseBuildTrigger/config_sr.properties @@ -0,0 +1,6 @@ +# This file is under the MIT License by authors + +Trigger\ only\ if\ build\ is\ stable=\u041F\u043E\u043A\u0440\u0435\u043D\u0438 \u0441\u0430\u043C\u043E \u0430\u043A\u043E \u0458\u0435 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 \u0441\u0442\u0430\u0431\u0438\u043B\u043D\u0430 +Trigger\ even\ if\ the\ build\ is\ unstable=\u041F\u043E\u043A\u0440\u0435\u043D\u0438 \u0438 \u0430\u043A\u043E \u0458\u0435 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 \u043D\u0435\u0441\u0442\u0430\u0431\u0438\u043B\u043D\u0430 +Trigger\ even\ if\ the\ build\ fails=\u041F\u043E\u043A\u0440\u0435\u043D\u0438 \u0438 \u0430\u043A\u043E \u0458\u0435 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 \u043D\u0435\u0443\u0441\u043F\u0435\u0448\u043D\u0430 +Projects\ to\ watch=\u041F\u0440\u043E\u0458\u0435\u043A\u0442\u0435 \u043A\u043E\u0458\u0435 \u043F\u0440\u0430\u0442\u0438\u0442\u0435 diff --git a/core/src/main/resources/jenkins/widgets/HistoryPageFilter/queue-items_sr.properties b/core/src/main/resources/jenkins/widgets/HistoryPageFilter/queue-items_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..fc95a97d121885b3e15359a2c3a643ae9c44a07a --- /dev/null +++ b/core/src/main/resources/jenkins/widgets/HistoryPageFilter/queue-items_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +Expected\ build\ number=\u041E\u0447\u0435\u043A\u0438\u0432\u0430\u043D \u0431\u0440\u043E\u0458 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 +pending=\u0447\u0435\u043A\u0430\u045A\u0435 +cancel\ this\ build=\u043E\u0442\u043A\u0430\u0436\u0438 \u043E\u0432\u0443 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0443 diff --git a/core/src/main/resources/lib/form/advanced_pl.properties b/core/src/main/resources/lib/form/advanced_pl.properties index 9984dcd7782556e9cb1ca1c0f8396ee9255ad9de..d0bbf08b26aec7bf52de2946e43d161dd9fe975d 100644 --- a/core/src/main/resources/lib/form/advanced_pl.properties +++ b/core/src/main/resources/lib/form/advanced_pl.properties @@ -1,6 +1,6 @@ # The MIT License # -# Copyright (c) 2004-2010, Sun Microsystems, Inc. +# Copyright (c) 2004-2016, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributors # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -21,3 +21,5 @@ # THE SOFTWARE. Advanced=Zaawansowane +# One or more fields in this block have been edited. +customizedFields=Co najmniej jedno pole w tym bloku zosta\u0142o zmodyfikowane diff --git a/core/src/main/resources/lib/form/advanced_sr.properties b/core/src/main/resources/lib/form/advanced_sr.properties index a16b944ce5abc73f3b2fc09d405f3b9cb9388777..a30766522dca83576b731b7bb9fb1af656a0369e 100644 --- a/core/src/main/resources/lib/form/advanced_sr.properties +++ b/core/src/main/resources/lib/form/advanced_sr.properties @@ -1,3 +1,4 @@ # This file is under the MIT License by authors -Advanced=Napredno +Advanced=\u041D\u0430\u043F\u0440\u0435\u0434\u043D\u043E +customizedFields=\u0408\u0435\u0434\u043D\u043E \u0438\u043B\u0438 \u0432\u0438\u0448\u0435 \u043F\u043E\u0459\u0430 \u0443 \u043E\u0432\u043E\u0458 \u0458\u0435\u0434\u0438\u043D\u0438\u0446\u0438 \u0441\u0443 \u043F\u0440\u043E\u043C\u0435\u045A\u0435\u043D\u0430 diff --git a/core/src/main/resources/lib/form/apply_bg.properties b/core/src/main/resources/lib/form/apply_bg.properties deleted file mode 100644 index 673c532564ea1b5f2e5ec58a08134ed11b333d38..0000000000000000000000000000000000000000 --- a/core/src/main/resources/lib/form/apply_bg.properties +++ /dev/null @@ -1,24 +0,0 @@ -# The MIT License -# -# Bulgarian translation: Copyright (c) 2015, 2016, Alexander Shopov -# -# 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. - -Apply=\ - \u041f\u0440\u0438\u043b\u0430\u0433\u0430\u043d\u0435 diff --git a/core/src/main/resources/lib/form/apply_de.properties b/core/src/main/resources/lib/form/apply_de.properties deleted file mode 100644 index 28af2cf494aaa6ca467e0b8a1a8aff003f7f759c..0000000000000000000000000000000000000000 --- a/core/src/main/resources/lib/form/apply_de.properties +++ /dev/null @@ -1,23 +0,0 @@ -# The MIT License -# -# Copyright (c) 2012, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributers -# -# 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. - -Apply=bernehmen diff --git a/core/src/main/resources/lib/form/apply_fr.properties b/core/src/main/resources/lib/form/apply_fr.properties deleted file mode 100644 index 77842f0cc679e925a3e2aa321936687a8f66a780..0000000000000000000000000000000000000000 --- a/core/src/main/resources/lib/form/apply_fr.properties +++ /dev/null @@ -1,23 +0,0 @@ -# The MIT License -# -# Copyright (c) 2012, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributers -# -# 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. - -Apply=Appliquer diff --git a/core/src/main/resources/lib/form/apply_ko.properties b/core/src/main/resources/lib/form/apply_ko.properties deleted file mode 100644 index 25b121945a4112074072b897094179a62f85d541..0000000000000000000000000000000000000000 --- a/core/src/main/resources/lib/form/apply_ko.properties +++ /dev/null @@ -1,3 +0,0 @@ -# This file is under the MIT License by authors - -Apply=\uC801\uC6A9 diff --git a/core/src/main/resources/lib/form/apply_nl.properties b/core/src/main/resources/lib/form/apply_nl.properties deleted file mode 100644 index 4781a8fdb21978a39eb3782b3b3314503d18153c..0000000000000000000000000000000000000000 --- a/core/src/main/resources/lib/form/apply_nl.properties +++ /dev/null @@ -1,3 +0,0 @@ -# This file is under the MIT License by authors - -Apply=Toepassen diff --git a/core/src/main/resources/lib/form/apply_pl.properties b/core/src/main/resources/lib/form/apply_pl.properties deleted file mode 100644 index b7aa9252c514147dbe5698eac4f531ff3fa7d031..0000000000000000000000000000000000000000 --- a/core/src/main/resources/lib/form/apply_pl.properties +++ /dev/null @@ -1,3 +0,0 @@ -# This file is under the MIT License by authors - -Apply=Zastosuj diff --git a/core/src/main/resources/lib/form/apply_pt_BR.properties b/core/src/main/resources/lib/form/apply_pt_BR.properties deleted file mode 100644 index 90235e731c4584e8fa944111360ee358d03ccfab..0000000000000000000000000000000000000000 --- a/core/src/main/resources/lib/form/apply_pt_BR.properties +++ /dev/null @@ -1,3 +0,0 @@ -# This file is under the MIT License by authors - -Apply=Aplicar diff --git a/core/src/main/resources/lib/form/apply_ru.properties b/core/src/main/resources/lib/form/apply_ru.properties deleted file mode 100644 index 6c2bddec13b33048d543a60824a09a91098c7578..0000000000000000000000000000000000000000 --- a/core/src/main/resources/lib/form/apply_ru.properties +++ /dev/null @@ -1,3 +0,0 @@ -# This file is under the MIT License by authors - -Apply=\u041F\u0440\u0438\u043C\u0435\u043D\u0438\u0442\u044C diff --git a/core/src/main/resources/lib/form/apply_sk.properties b/core/src/main/resources/lib/form/apply_sk.properties deleted file mode 100644 index 0325a43d1d1862dd189b4d7702f496feae191746..0000000000000000000000000000000000000000 --- a/core/src/main/resources/lib/form/apply_sk.properties +++ /dev/null @@ -1,3 +0,0 @@ -# This file is under the MIT License by authors - -Apply=Pou\u017Ei diff --git a/core/src/main/resources/lib/form/apply_sv_SE.properties b/core/src/main/resources/lib/form/apply_sv_SE.properties deleted file mode 100644 index 578751a2b0cc8638a54761a9d6eb6100268438df..0000000000000000000000000000000000000000 --- a/core/src/main/resources/lib/form/apply_sv_SE.properties +++ /dev/null @@ -1,3 +0,0 @@ -# This file is under the MIT License by authors - -Apply=Verkst\u00E4ll diff --git a/core/src/main/resources/lib/form/apply_zh_CN.properties b/core/src/main/resources/lib/form/apply_zh_CN.properties deleted file mode 100644 index 18fe4b3fce53ca035855c7860883adb203a5dc5c..0000000000000000000000000000000000000000 --- a/core/src/main/resources/lib/form/apply_zh_CN.properties +++ /dev/null @@ -1,3 +0,0 @@ -# This file is under the MIT License by authors - -Apply=\u5E94\u7528 diff --git a/core/src/main/resources/lib/form/booleanRadio.jelly b/core/src/main/resources/lib/form/booleanRadio.jelly index ea8895231203cc088c64e09c0d2794ba0e9da6b6..2f9bca9b9b049bfe80f9910bef1a777587c87c09 100644 --- a/core/src/main/resources/lib/form/booleanRadio.jelly +++ b/core/src/main/resources/lib/form/booleanRadio.jelly @@ -1,47 +1,47 @@ - - - - - Binds a boolean field to two radio buttons that say Yes/No OK/Cancel Top/Bottom. - - - Databinding field. - - - Text to be displayed for the 'true' value. Defaults to 'Yes'. - - - Text to be displayed for the 'false' value. Defaults to 'No'. - - - - - - - - - - + + + + + Binds a boolean field to two radio buttons that say Yes/No OK/Cancel Top/Bottom. + + + Databinding field. + + + Text to be displayed for the 'true' value. Defaults to 'Yes'. + + + Text to be displayed for the 'false' value. Defaults to 'No'. + + + + + + + + + + diff --git a/core/src/main/resources/lib/form/booleanRadio_pl.properties b/core/src/main/resources/lib/form/booleanRadio_pl.properties new file mode 100644 index 0000000000000000000000000000000000000000..095e79de4a0288cb5a336da28121efa59895bc43 --- /dev/null +++ b/core/src/main/resources/lib/form/booleanRadio_pl.properties @@ -0,0 +1,23 @@ +# The MIT License +# +# Copyright (c) 2017, Damian Szczepanik +# +# 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. +Yes=Tak +No=Nie diff --git a/core/src/main/resources/lib/form/booleanRadio_sr.properties b/core/src/main/resources/lib/form/booleanRadio_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..a5a8a51739e1d4cc8731157efe2f2fe6ab604c4a --- /dev/null +++ b/core/src/main/resources/lib/form/booleanRadio_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Yes=\u0414\u0430 +No=\u041D\u0435 diff --git a/core/src/main/resources/lib/form/breadcrumb-config-outline_sr.properties b/core/src/main/resources/lib/form/breadcrumb-config-outline_sr.properties index bb8447c4cb3fd4b0247e3a5c480a3f8305199a0b..4e198232c753868d8e585530d67922a34e0bdc9c 100644 --- a/core/src/main/resources/lib/form/breadcrumb-config-outline_sr.properties +++ b/core/src/main/resources/lib/form/breadcrumb-config-outline_sr.properties @@ -1,3 +1,3 @@ # This file is under the MIT License by authors -configuration=konfiguracija +configuration=\u041F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 diff --git a/core/src/main/resources/lib/form/entry.jelly b/core/src/main/resources/lib/form/entry.jelly index 78e80aaf0cf553da4ef0f4edf2273b9204924db7..0b1c06d1f1a9ff54ffd3f54b077231d4dcda3259 100644 --- a/core/src/main/resources/lib/form/entry.jelly +++ b/core/src/main/resources/lib/form/entry.jelly @@ -32,6 +32,8 @@ THE SOFTWARE. Name of the entry. Think of this like a label for the control. + + This content is HTML (unless the boolean variable escapeEntryTitleAndDescription is set). Use h.escape if necessary. Used for the databinding. TBD. When this attribute @@ -46,6 +48,8 @@ THE SOFTWARE. This text shouldn't get too long, and in recent Hudson, this feature is somewhat de-emphasized, in favor of the inline foldable help page specified via @help. + + This content is HTML (unless the boolean variable escapeEntryTitleAndDescription is set). Use h.escape if necessary. URL to the HTML page. When this attribute is specified, the entry gets @@ -67,7 +71,7 @@ THE SOFTWARE.
        - + diff --git a/core/src/main/resources/lib/form/expandableTextbox.jelly b/core/src/main/resources/lib/form/expandableTextbox.jelly index 76c8c8982c35c4e9e93ca979a000ace8d732b473..ebc32ca70caee71fb4b857bcefc18c61831a7d9f 100644 --- a/core/src/main/resources/lib/form/expandableTextbox.jelly +++ b/core/src/main/resources/lib/form/expandableTextbox.jelly @@ -30,7 +30,7 @@ THE SOFTWARE. single-line textbox that can be expanded into a multi-line textarea. - This control is useful for a field that expects multiple whitespaec-separated tokens + This control is useful for a field that expects multiple whitespace-separated tokens (such as URLs, glob patterns, etc.) When the user only enters a few tokens, they can keep it as a single line to save space, but to enter a large number of values, this can be turned into textarea for better visibility. diff --git a/core/src/main/resources/lib/form/expandableTextbox_sr.properties b/core/src/main/resources/lib/form/expandableTextbox_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..6fd13550bc7b0a6311650018fdbcf4b763bc9ef0 --- /dev/null +++ b/core/src/main/resources/lib/form/expandableTextbox_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +tooltip=\ + \u041A\u043B\u0438\u043A\u043D\u0438\u0442\u0435 \u0434\u0430 \u0440\u0430\u0448\u0438\u0440\u0438\u0442\u0435 \u043D\u0435\u043A\u043E\u043B\u0438\u043A\u043E \u0440\u0435\u0434\u043E\u0432\u0430
        \u0433\u0434\u0435 \u043C\u043E\u0436\u0435\u0442\u0435 \u043A\u043E\u0440\u0438\u0441\u0442\u0438\u0442\u0438 \u043D\u043E\u0432\u0435 \u0440\u0435\u0434\u043E\u0432\u0435 \u0443\u043C\u0435\u0441\u0442\u043E \u043F\u0440\u0430\u0437\u043D\u043E\u0433 \u043F\u0440\u043E\u0441\u0442\u043E\u0440\u0430.
        \ + \u0414\u0430 \u0432\u0440\u0430\u0442\u0438\u0442\u0435 \u043D\u0430\u0437\u0430\u0434 \u043D\u0430 \u0458\u0435\u0434\u0430\u043D \u0440\u0435\u0434, \u043D\u0430\u043F\u0438\u0448\u0438\u0442\u0435 \u0441\u0432\u0435 \u0443 \u0458\u0435\u0434\u043D\u043E\u043C \u0440\u0435\u0434\u0443 \u0438 \u0441\u0430\u0447\u0443\u0432\u0430\u0458\u0442\u0435. diff --git a/core/src/main/resources/lib/form/helpArea_sr.properties b/core/src/main/resources/lib/form/helpArea_sr.properties index f54a6caaa9e3ef4a1fbc461fc0c08271d7f10081..14d2e9f9bbdd2d0a3802e94319a4030b092d1deb 100644 --- a/core/src/main/resources/lib/form/helpArea_sr.properties +++ b/core/src/main/resources/lib/form/helpArea_sr.properties @@ -1,3 +1,3 @@ # This file is under the MIT License by authors -Loading...=Ucitavanje... +Loading...=\u0423\u0447\u0438\u0442\u0430\u0432\u0430\u045A\u0435... diff --git a/core/src/main/resources/lib/form/helpLink_ru.properties b/core/src/main/resources/lib/form/helpLink_ru.properties new file mode 100644 index 0000000000000000000000000000000000000000..5c2fbd6a4a56cc3ad0e07bb974d7e77527a1a38c --- /dev/null +++ b/core/src/main/resources/lib/form/helpLink_ru.properties @@ -0,0 +1,23 @@ +# The MIT License +# +# Copyright (c) 2004-, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributors +# +# 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. + +Help\ for\ feature\:=\u041f\u043e\u043c\u043e\u0449\u044c \u0434\u043b\u044f: \ No newline at end of file diff --git a/core/src/main/resources/lib/form/helpLink_sr.properties b/core/src/main/resources/lib/form/helpLink_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..b0c8861c7db8690ec0bb0cf7091a2830d7baa5c6 --- /dev/null +++ b/core/src/main/resources/lib/form/helpLink_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Help\ for\ feature\:=\u041F\u043E\u043C\u043E\u045B \u043E\u043A\u043E \u043E\u0434\u043B\u0438\u043A\u0435: diff --git a/core/src/main/resources/lib/form/hetero-list/hetero-list.js b/core/src/main/resources/lib/form/hetero-list/hetero-list.js index c985e02a609ef1c55172f7a06a5a2b9c3b774c00..d9ada4f45f2425ad7dd90489a5c1da2c67b68b4c 100644 --- a/core/src/main/resources/lib/form/hetero-list/hetero-list.js +++ b/core/src/main/resources/lib/form/hetero-list/hetero-list.js @@ -121,7 +121,7 @@ Behaviour.specify("DIV.hetero-list-container", 'hetero-list', -100, function(e) }); if (e.hasClassName("one-each")) { - // does this container already has a ocnfigured instance of the specified descriptor ID? + // does this container already has a configured instance of the specified descriptor ID? function has(id) { return Prototype.Selector.find(e.childElements(),"DIV.repeated-chunk[descriptorId=\""+id+"\"]")!=null; } diff --git a/core/src/main/resources/lib/form/hetero-list_pl.properties b/core/src/main/resources/lib/form/hetero-list_pl.properties new file mode 100644 index 0000000000000000000000000000000000000000..173fe7ae1f85d0064fe12a22ef7099001a9f9bed --- /dev/null +++ b/core/src/main/resources/lib/form/hetero-list_pl.properties @@ -0,0 +1,22 @@ +# The MIT License +# +# Copyright (c) 2017, Damian Szczepanik +# +# 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. +Add=Dodaj diff --git a/core/src/main/resources/lib/form/hetero-list_sr.properties b/core/src/main/resources/lib/form/hetero-list_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..2ab9ef08a9f1f5a1f2ba06de2bd4ddc3b01b6ee4 --- /dev/null +++ b/core/src/main/resources/lib/form/hetero-list_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Add=\u0414\u043E\u0434\u0430\u0458 diff --git a/core/src/main/resources/lib/form/optionalProperty.jelly b/core/src/main/resources/lib/form/optionalProperty.jelly index cccf94e70cf57001db3a4c8de42d0d3e4f57bdbe..d27dcdf4a7f4fefce2d1f93326e68de465f0392f 100644 --- a/core/src/main/resources/lib/form/optionalProperty.jelly +++ b/core/src/main/resources/lib/form/optionalProperty.jelly @@ -1,46 +1,46 @@ - - - - - - Renders inline an optional single-value nested data-bound property of the current instance, - by using a <f:optionalBlock> - - This is useful when your object composes another data-bound object, and when that's optional, - where the absence of the value is signified as null (in which case the optionalBlock will be drawn unchecked), - and the presence of the value. - - - - - - - - - + + + + + + Renders inline an optional single-value nested data-bound property of the current instance, + by using a <f:optionalBlock> + + This is useful when your object composes another data-bound object, and when that's optional, + where the absence of the value is signified as null (in which case the optionalBlock will be drawn unchecked), + and the presence of the value. + + + + + + + + + \ No newline at end of file diff --git a/core/src/main/resources/lib/form/repeatableDeleteButton_sr.properties b/core/src/main/resources/lib/form/repeatableDeleteButton_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..0038ea61baf3efe147225da2f99a9bab2842bf68 --- /dev/null +++ b/core/src/main/resources/lib/form/repeatableDeleteButton_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Delete=\u0423\u043A\u043B\u043E\u043D\u0438 diff --git a/core/src/main/resources/lib/form/repeatable_sr.properties b/core/src/main/resources/lib/form/repeatable_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..2ab9ef08a9f1f5a1f2ba06de2bd4ddc3b01b6ee4 --- /dev/null +++ b/core/src/main/resources/lib/form/repeatable_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Add=\u0414\u043E\u0434\u0430\u0458 diff --git a/core/src/main/resources/lib/form/select/select.js b/core/src/main/resources/lib/form/select/select.js index 0f87d0bbf66e15b794121272edc70892a0f7cee3..8d0a7a51d6516934e35724e8b35681774d9fcf93 100644 --- a/core/src/main/resources/lib/form/select/select.js +++ b/core/src/main/resources/lib/form/select/select.js @@ -4,8 +4,13 @@ function updateListBox(listBox,url,config) { config = config || {}; config = object(config); var originalOnSuccess = config.onSuccess; - config.onSuccess = function(rsp) { - var l = $(listBox); + var l = $(listBox); + var status = findFollowingTR(listBox, "validation-error-area").firstChild.nextSibling; + if (status.firstChild && status.firstChild.getAttribute('data-select-ajax-error')) { + status.innerHTML = ""; + } + config.onSuccess = function (rsp) { + l.removeClassName("select-ajax-pending"); var currentSelection = l.value; // clear the contents @@ -30,13 +35,24 @@ function updateListBox(listBox,url,config) { if (originalOnSuccess!=undefined) originalOnSuccess(rsp); - }, - config.onFailure = function(rsp) { - // deleting values can result in the data loss, so let's not do that -// var l = $(listBox); -// l.options[0] = null; - } + }; + config.onFailure = function (rsp) { + l.removeClassName("select-ajax-pending"); + status.innerHTML = rsp.responseText; + if (status.firstChild) { + status.firstChild.setAttribute('data-select-ajax-error', 'true') + } + Behaviour.applySubtree(status); + // deleting values can result in the data loss, so let's not do that unless instructed + var header = rsp.getResponseHeader('X-Jenkins-Select-Error'); + if (header && "clear" === header.toLowerCase()) { + // clear the contents + while (l.length > 0) l.options[0] = null; + } + + }; + l.addClassName("select-ajax-pending"); new Ajax.Request(url, config); } @@ -82,4 +98,4 @@ Behaviour.specify("SELECT.select", 'select', 1000, function(e) { } }); }); -}); \ No newline at end of file +}); diff --git a/core/src/main/resources/lib/form/serverTcpPort_sr.properties b/core/src/main/resources/lib/form/serverTcpPort_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..132f0a20abbd29524da4e5c394149b2e9e81d654 --- /dev/null +++ b/core/src/main/resources/lib/form/serverTcpPort_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +Fixed=\u0421\u0442\u0430\u0442\u0438\u0447\u043A\u0438 +Random=\u0421\u043B\u0443\u0447\u0430\u0458\u043Do +Disable=\u041E\u043D\u0435\u043C\u043E\u0433\u0443\u045B\u0438 \ No newline at end of file diff --git a/core/src/main/resources/lib/form/slave-mode_sr.properties b/core/src/main/resources/lib/form/slave-mode_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..4ed411d3065a073de6516ab26102299a1d1ea3df --- /dev/null +++ b/core/src/main/resources/lib/form/slave-mode_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Usage=\u0423\u043F\u043E\u0442\u0440\u0435\u0431\u0430 diff --git a/core/src/main/resources/lib/form/textarea/textarea.css b/core/src/main/resources/lib/form/textarea/textarea.css new file mode 100644 index 0000000000000000000000000000000000000000..71300ae0e3c422c7172c4dcf1f54b9f58846c898 --- /dev/null +++ b/core/src/main/resources/lib/form/textarea/textarea.css @@ -0,0 +1,5 @@ +td.setting-main .CodeMirror { + display: table; + table-layout: fixed; + width: 100%; +} \ No newline at end of file diff --git a/core/src/main/resources/lib/form/textarea_sr.properties b/core/src/main/resources/lib/form/textarea_sr.properties index ac88bf0154fb3607f5f5ef569cb0738c9ca3e97a..632e5095701c94f16ab894785283fcf385184ae3 100644 --- a/core/src/main/resources/lib/form/textarea_sr.properties +++ b/core/src/main/resources/lib/form/textarea_sr.properties @@ -1,4 +1,4 @@ # This file is under the MIT License by authors -Hide\ preview=Ukloni prikaz -Preview=Prikazi +Preview=\u041F\u0440\u0435\u0433\u043B\u0435\u0434 +Hide\ preview=\u0421\u043A\u043B\u043E\u043D\u0438 \u043F\u0440\u0435\u0433\u043B\u0435\u0434 diff --git a/core/src/main/resources/lib/hudson/artifactList_ru.properties b/core/src/main/resources/lib/hudson/artifactList_ru.properties index d1ea2397d9f800e09d1f77d24549cb155f4c5638..10dcc10084a522a8d5ae20de011a921a46119ab8 100644 --- a/core/src/main/resources/lib/hudson/artifactList_ru.properties +++ b/core/src/main/resources/lib/hudson/artifactList_ru.properties @@ -1,3 +1,4 @@ -# This file is under the MIT License by authors - -View=\u041F\u043E\u0441\u043C\u043E\u0442\u0440\u0435\u0442\u044C +Collapse\ all=\u0421\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u0441\u0451 +Expand\ all=\u0420\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u0441\u0451 +View=\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c +view=\u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c diff --git a/core/src/main/resources/lib/hudson/artifactList_sr.properties b/core/src/main/resources/lib/hudson/artifactList_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..2d329d4e88985ad4c5dafcb94e8023579a3cc3dc --- /dev/null +++ b/core/src/main/resources/lib/hudson/artifactList_sr.properties @@ -0,0 +1,6 @@ +# This file is under the MIT License by authors + +view=\u043F\u0440\u0435\u0433\u043B\u0435\u0434 +Expand\ all=\u0420\u0430\u0448\u0438\u0440\u0438 \u0441\u0432\u0435 +Collapse\ all=\u0421\u043C\u0430\u045A\u0438 \u0441\u0432\u0435 +View=\u041F\u0440\u0435\u0433\u043B\u0435\u0434 diff --git a/core/src/main/resources/lib/hudson/buildCaption.jelly b/core/src/main/resources/lib/hudson/buildCaption.jelly index 80478e98d12cba4b477f1e31dd0336f16673961a..73610d33f1ecedea04334484a6ba8434914f1e47 100644 --- a/core/src/main/resources/lib/hudson/buildCaption.jelly +++ b/core/src/main/resources/lib/hudson/buildCaption.jelly @@ -37,7 +37,7 @@ THE SOFTWARE.
        - + @@ -78,7 +82,7 @@ THE SOFTWARE.
        - +
        diff --git a/core/src/main/resources/lib/hudson/buildCaption.properties b/core/src/main/resources/lib/hudson/buildCaption.properties new file mode 100644 index 0000000000000000000000000000000000000000..6aa3af4cc19b3750c49d1c803ab7b18c9f7551c5 --- /dev/null +++ b/core/src/main/resources/lib/hudson/buildCaption.properties @@ -0,0 +1 @@ +confirm=Are you sure you want to abort {0}? diff --git a/core/src/main/resources/lib/hudson/buildCaption_ca.properties b/core/src/main/resources/lib/hudson/buildCaption_ca.properties index b33e2f310f700fd26db23d201954d88ebaf98321..fd1d3aabd9bee60083dc5efc6d386274be265f72 100644 --- a/core/src/main/resources/lib/hudson/buildCaption_ca.properties +++ b/core/src/main/resources/lib/hudson/buildCaption_ca.properties @@ -1,4 +1,4 @@ # This file is under the MIT License by authors -Progress=Progres +Progress=Progr\u00E9s cancel=cancel\u00B7lar diff --git a/core/src/main/resources/lib/hudson/buildCaption_ru.properties b/core/src/main/resources/lib/hudson/buildCaption_ru.properties index fe905f5fa02590aa8247846fb4059c776f631bbb..a3c2131882c9d54d8e8a4e600c353264b94562d5 100644 --- a/core/src/main/resources/lib/hudson/buildCaption_ru.properties +++ b/core/src/main/resources/lib/hudson/buildCaption_ru.properties @@ -1,17 +1,17 @@ # The MIT License -# +# # Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Mike Salnikov -# +# # 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 @@ -21,4 +21,6 @@ # THE SOFTWARE. Progress=\u041f\u0440\u043e\u0433\u0440\u0435\u0441\u0441 -cancel=\u041E\u0442\u043C\u0435\u043D\u0438\u0442\u044C +cancel=\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c +# Are you sure you want to abort {0}? +confirm=\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u044c \ No newline at end of file diff --git a/core/src/main/resources/lib/hudson/buildCaption_sr.properties b/core/src/main/resources/lib/hudson/buildCaption_sr.properties index 566efd02da66541ff42d66ec12c4dfb21231e488..a702f8f59f52eff50003c4f54ee7d2c7075157d1 100644 --- a/core/src/main/resources/lib/hudson/buildCaption_sr.properties +++ b/core/src/main/resources/lib/hudson/buildCaption_sr.properties @@ -1,4 +1,5 @@ # This file is under the MIT License by authors -Progress=Progres -cancel=Prekini +Progress=\u041F\u0440\u043E\u0433\u0440\u0435\u0441 +cancel=\u041E\u0442\u043A\u0430\u0436\u0438 +confirm=\u0414\u0430 \u043B\u0438 \u0441\u0442\u0435 \u0441\u0438\u0433\u0443\u0440\u043D\u0438 \u0434\u0430 \u0436\u0435\u043B\u0438\u0442\u0435 \u0434\u0430 \u043E\u0434\u043A\u0430\u0436\u0435\u0442\u0435 {0}? diff --git a/core/src/main/resources/lib/hudson/buildHealth_sr.properties b/core/src/main/resources/lib/hudson/buildHealth_sr.properties index 49ee343c9b9d4f1e7a2de380c4a525242f8bee87..c55807b8b0ec9c4a7013dd0c3801a8c6226633bb 100644 --- a/core/src/main/resources/lib/hudson/buildHealth_sr.properties +++ b/core/src/main/resources/lib/hudson/buildHealth_sr.properties @@ -1,3 +1,3 @@ # This file is under the MIT License by authors -Description=Opis +Description=\u041E\u043F\u0438\u0441 diff --git a/core/src/main/resources/lib/hudson/buildListTable_pl.properties b/core/src/main/resources/lib/hudson/buildListTable_pl.properties index ef2f307708a2cebe2e72b9fe2025aae80b6422e8..dc0a5f6c9725ad9eb3c0f529571aa22c01579a85 100644 --- a/core/src/main/resources/lib/hudson/buildListTable_pl.properties +++ b/core/src/main/resources/lib/hudson/buildListTable_pl.properties @@ -1,6 +1,6 @@ # The MIT License # -# Copyright (c) 2004-2010, Sun Microsystems, Inc. +# Copyright (c) 2004-2017, Sun Microsystems, Inc., Damian Szczepanik # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -23,4 +23,5 @@ Build=Zadanie Click\ to\ center\ timeline\ on\ event=Kliknij aby wycentrowa\u0107 o\u015B czasu na zdarzeniu Console\ output=Logi konsoli -Time\ Since=Czasu temu +Time\ Since=Data +Status=Status diff --git a/core/src/main/resources/lib/hudson/buildListTable_sr.properties b/core/src/main/resources/lib/hudson/buildListTable_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..afee06dcd514bac221c6c57c1a05af32629cb0c5 --- /dev/null +++ b/core/src/main/resources/lib/hudson/buildListTable_sr.properties @@ -0,0 +1,7 @@ +# This file is under the MIT License by authors + +Click\ to\ center\ timeline\ on\ event=\u041A\u043B\u0438\u043A\u043D\u0438\u0442\u0435 \u0434\u0430 \u0446\u0435\u043D\u0442\u0440\u0438\u0440\u0430\u0442\u0435 \u0432\u0440\u0435\u043C\u0435\u043D\u0441\u043A\u0443 \u0442\u0440\u0430\u043A\u0443 \u043D\u0430 \u043E\u0434\u0440\u0435\u0452\u0435\u043D\u0438 \u0434\u043E\u0433\u0430\u0452\u0430\u0458. +Console\ output=\u0418\u0441\u0445\u043E\u0434 \u0438\u0437 \u043A\u043E\u043D\u0437\u043E\u043B\u0435 +Build=\u0418\u0437\u0433\u0440\u0430\u0434\u045A\u0430 +Time\ Since=\u0412\u0440\u0435\u043C\u0435 \u043E\u0434 +Status=\u0421\u0442\u0430\u045A\u0435 diff --git a/core/src/main/resources/lib/hudson/buildProgressBar_sr.properties b/core/src/main/resources/lib/hudson/buildProgressBar_sr.properties index cd6aa2f3b6df7fa7a9c5c6d88b6578077e62389d..77cb22b833bc93a681bea6fc0e151d91a1480eef 100644 --- a/core/src/main/resources/lib/hudson/buildProgressBar_sr.properties +++ b/core/src/main/resources/lib/hudson/buildProgressBar_sr.properties @@ -1,3 +1,3 @@ # This file is under the MIT License by authors -text=Zapo\u010Deto od {0}
        O\u010Dekivano preostalo vreme: {1} +text=\u0417\u0430\u043F\u043E\u0447\u0435\u0442\u043E \u043F\u0440\u0435 {0}
        \u041E\u0447\u0435\u043A\u0438\u0432\u0430\u043D\u043E \u043F\u0440\u0435\u043E\u0441\u0442\u0430\u043B\u043E \u0432\u0440\u0435\u043C\u0435: {1} \ No newline at end of file diff --git a/core/src/main/resources/lib/hudson/editableDescription_sr.properties b/core/src/main/resources/lib/hudson/editableDescription_sr.properties index 35b19cb549f4f46c69946d9e0b2efeacc9bf04c8..75a9a5080e84a426026f8296b04dd26cf5d153f2 100644 --- a/core/src/main/resources/lib/hudson/editableDescription_sr.properties +++ b/core/src/main/resources/lib/hudson/editableDescription_sr.properties @@ -1,3 +1,4 @@ # This file is under the MIT License by authors -add\ description=dodaj opis +add\ description=\u0434\u043E\u0434\u0430\u0458 \u043E\u043F\u0438\u0441 +edit\ description=\u0443\u0440\u0435\u0434\u0438 \u043E\u043F\u0438\u0441 diff --git a/core/src/main/resources/lib/hudson/executors.jelly b/core/src/main/resources/lib/hudson/executors.jelly index 99c4c5b77eb2aa6660804bf3086695e7378b233b..86f12dffc4969c9c836f59c621b0108f21cb8221 100644 --- a/core/src/main/resources/lib/hudson/executors.jelly +++ b/core/src/main/resources/lib/hudson/executors.jelly @@ -110,7 +110,7 @@ THE SOFTWARE. - + diff --git a/core/src/main/resources/lib/hudson/executors.properties b/core/src/main/resources/lib/hudson/executors.properties index 76d77a195cdcf13709955ce7994004d210b73a99..3d8ebc248ea37a6b9688d5221777e9c9d4a8aec7 100644 --- a/core/src/main/resources/lib/hudson/executors.properties +++ b/core/src/main/resources/lib/hudson/executors.properties @@ -1 +1,2 @@ -Computers=master{0,choice,0#|1# + {0,number} computer ({1} of {2} executors)|1< + {0,number} computers ({1} of {2} executors)} \ No newline at end of file +Computers=master{0,choice,0#|1# + {0,number} computer ({1} of {2} executors)|1< + {0,number} computers ({1} of {2} executors)} +confirm=Are you sure you want to abort {0}? diff --git a/core/src/main/resources/lib/hudson/executors_pl.properties b/core/src/main/resources/lib/hudson/executors_pl.properties index 015941013b35fbd7a3bea539c00fc25eb405090b..019f15b550ad4f0230688b77cabc7a4deb3cd436 100644 --- a/core/src/main/resources/lib/hudson/executors_pl.properties +++ b/core/src/main/resources/lib/hudson/executors_pl.properties @@ -1,6 +1,6 @@ # The MIT License # -# Copyright (c) 2004-2010, Sun Microsystems, Inc. +# Copyright (c) 2004-2016, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributors # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -21,8 +21,6 @@ # THE SOFTWARE. Build\ Executor\ Status=Status wykonawc\u00F3w zada\u0144 -Building=Buduje -Dead=Niedost\u0119pny Idle=Bezczynny Unknown\ Task=Nieznane zadanie offline=roz\u0142\u0105czony diff --git a/core/src/main/resources/lib/hudson/executors_ru.properties b/core/src/main/resources/lib/hudson/executors_ru.properties index 8086dd40f2789409cd6341a6a4f8bfaa46960a25..1b4283f45e915c8acb86869216c0be6ad2aaa734 100644 --- a/core/src/main/resources/lib/hudson/executors_ru.properties +++ b/core/src/main/resources/lib/hudson/executors_ru.properties @@ -1,17 +1,17 @@ # The MIT License -# +# # Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Mike Salnikov -# +# # 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 @@ -20,12 +20,13 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Build\ Executor\ Status=\u0421\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u0435 \u0441\u0431\u043E\u0440\u0449\u0438\u043A\u043E\u0432 -Offline=\u0412\u044B\u043A\u043B\u044E\u0447\u0435\u043D -Status=\u0421\u0442\u0430\u0442\u0443\u0441. -Master=\u041c\u0430\u0441\u0442\u0435\u0440 -offline=\u0432\u044B\u043A\u043B\u044E\u0447\u0435\u043D -Dead=\u041c\u0435\u0440\u0442\u0432 -Idle=\u0412 \u043E\u0436\u0438\u0434\u0430\u043D\u0438\u0438 -Building=\u0418\u0434\u0435\u0442 \u0441\u0431\u043E\u0440\u043A\u0430 -terminate\ this\ build=\u043F\u0440\u0435\u0440\u0432\u0430\u0442\u044C \u0442\u0435\u043A\u0443\u0449\u0443\u044E \u0441\u0431\u043E\u0440\u043A\u0443 +Build\ Executor\ Status=\u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0441\u0431\u043e\u0440\u0449\u0438\u043a\u043e\u0432 +Computers=\u041a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u044b +confirm=\u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u044c +Offline=\u0412\u044b\u043a\u043b\u044e\u0447\u0435\u043d +Pending=\u0412 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 +suspended=\u043f\u0440\u0438\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d +Unknown\ Task=\u041d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 +offline=\u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d +Idle=\u0412 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0438 +terminate\ this\ build=\u043f\u0440\u0435\u0440\u0432\u0430\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u0441\u0431\u043e\u0440\u043a\u0443 diff --git a/core/src/main/resources/lib/hudson/executors_sr.properties b/core/src/main/resources/lib/hudson/executors_sr.properties index 86e9d7b4e51d1fb7765c4dd8351081e8d1f45f57..c59e49e581071ce8a3f35eb65ba39be67df12831 100644 --- a/core/src/main/resources/lib/hudson/executors_sr.properties +++ b/core/src/main/resources/lib/hudson/executors_sr.properties @@ -20,8 +20,18 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Build\ Executor\ Status=Status Izvr\u0161itelja Gradnje -Building=Izgradnja -Idle=mirovanje +Build\ Executor\ Status=\u0421\u0442\u0430\u045A\u0435 \u0438\u0437\u0432\u0440\u0448\u0438\u0442\u0435\u0459\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 +Building=\u0418\u0437\u0433\u0440\u0430\u0434\u045A\u0430 +Idle=\u0421\u043B\u043E\u0432\u043E\u0434\u043D\u043E Status=\u0421\u0442\u0430\u045A\u0435 -terminate\ this\ build=okon\u010Daj ovu gradnju +terminate\ this\ build=\u041E\u043A\u043E\u043D\u0447\u0430\u0458 \u043E\u0432\u0443 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0443 +offline=\u0412\u0430\u043D \u043C\u0440\u0435\u0436\u0435 +suspended=\u0441\u0443\u0441\u043F\u0435\u043D\u0434\u043E\u0432\u0430\u043D +Offline=\u0412\u0430\u043D \u043C\u0440\u0435\u0436\u0435 +Pending=\u0427\u0435\u043A\u0430\u045A\u0435 +Unknown\ Task=\u041D\u0435\u043F\u043E\u0437\u043D\u0430\u0442\u0438 \u0437\u0430\u0434\u0430\u0442\u0430\u043A +confirm=\u0414\u0430 \u043B\u0438 \u0441\u0442\u0435 \u0441\u0438\u0433\u0443\u0440\u043D\u0438 \u0434\u0430 \u0436\u0435\u043B\u0438\u0442\u0435 \u0434\u0430 \u043E\u0442\u043A\u0430\u0436\u0435\u0442\u0435 {0}? +Computers=\ + \u043E\u0441\u043D\u043E\u0432\u043D\u043E{0,choice,0#|1# + {0,number} \u0440\u0430\u0447\u0443\u043D\u0430\u0440 ({1} \u043E\u0434 {2} \u0438\u0437\u0432\u0440\u0448\u0438\u0442\u0435\u0459\u0430)|1< + {0,number} \u0440\u0430\u0447\u0443\u043D\u0430\u0440\u0430 ({1} \u043E\u0434 {2} \u0438\u0437\u0432\u0440\u0448\u0438\u0442\u0435\u0459\u0430)} +Master= +Dead=\u041C\u0440\u0442\u0432\u043E diff --git a/core/src/main/resources/lib/hudson/iconSize_sr.properties b/core/src/main/resources/lib/hudson/iconSize_sr.properties index 908c440494e8eaf61fb64442f96e7e42343b42ea..45ad05ff2e3e43cd1ca2a7694e9333d56eb73f04 100644 --- a/core/src/main/resources/lib/hudson/iconSize_sr.properties +++ b/core/src/main/resources/lib/hudson/iconSize_sr.properties @@ -1,3 +1,3 @@ # This file is under the MIT License by authors -Icon=ikonica +Icon=\u0418\u043A\u043E\u043D\u0438\u0446\u0430 diff --git a/core/src/main/resources/lib/hudson/listScmBrowsers_sr.properties b/core/src/main/resources/lib/hudson/listScmBrowsers_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..1ab483f63439419c0ce3ca7d98b656d2ae449710 --- /dev/null +++ b/core/src/main/resources/lib/hudson/listScmBrowsers_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Repository\ browser=\u041F\u0440\u0435\u0433\u043B\u0435\u0434\u0430\u0447 \u0441\u043F\u0440\u0435\u043C\u0438\u0448\u0442\u0430 +Auto=\u0410\u0443\u0442\u043E\u043C\u0430\u0442\u0441\u043A\u0438 diff --git a/core/src/main/resources/lib/hudson/newFromList/form_sr.properties b/core/src/main/resources/lib/hudson/newFromList/form_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..6190adbdbb8f60154392518402dd38e58ea86a45 --- /dev/null +++ b/core/src/main/resources/lib/hudson/newFromList/form_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Copy\ from=\u0418\u0437\u043A\u043E\u043F\u0438\u0440\u0430\u0458 \u043E\u0434 diff --git a/core/src/main/resources/lib/hudson/node_sr.properties b/core/src/main/resources/lib/hudson/node_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..e2aa68159222b3094f293f7e65b93e9da4927e0d --- /dev/null +++ b/core/src/main/resources/lib/hudson/node_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +master=\u043C\u0430\u0441\u0442\u0435\u0440 diff --git a/core/src/main/resources/lib/hudson/project/build-permalink_sr.properties b/core/src/main/resources/lib/hudson/project/build-permalink_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..05a61a106e178e866106ab86f11de3f3c5f90922 --- /dev/null +++ b/core/src/main/resources/lib/hudson/project/build-permalink_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +format={0} (#{1}), \u043F\u0440\u0435 {2} diff --git a/core/src/main/resources/lib/hudson/project/config-assignedLabel_ru.properties b/core/src/main/resources/lib/hudson/project/config-assignedLabel_ru.properties index bf8b521cc2d0b27ebb4dce931471794356ccbb2f..afa44a1e0c8572d16675fbaa95e7c9ef2f6f4940 100644 --- a/core/src/main/resources/lib/hudson/project/config-assignedLabel_ru.properties +++ b/core/src/main/resources/lib/hudson/project/config-assignedLabel_ru.properties @@ -1,24 +1 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Mike Salnikov -# -# 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. - -Restrict\ where\ this\ project\ can\ be\ run=\u041E\u0433\u0440\u0430\u043D\u0438\u0447\u0438\u0442\u044C \u043A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u0443\u0437\u043B\u043E\u0432, \u043A\u043E\u0442\u043E\u0440\u044B\u0435 \u043C\u043E\u0433\u0443\u0442 \u0441\u043E\u0431\u0438\u0440\u0430\u0442\u044C \u044D\u0442\u043E\u0442 \u043F\u0440\u043E\u0435\u043A\u0442 -Tie\ this\ project\ to\ a\ node=\u041F\u0440\u0438\u0432\u044F\u0437\u0430\u0442\u044C \u043F\u0440\u043E\u0435\u043A\u0442 \u043A \u0443\u0437\u043B\u0443 +Restrict\ where\ this\ project\ can\ be\ run=\u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0442\u044c \u043b\u0435\u0439\u0431\u043b\u044b \u0441\u0431\u043e\u0440\u0449\u0438\u043a\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0434\u0430\u043d\u043d\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443 diff --git a/core/src/main/resources/lib/hudson/project/config-assignedLabel_sr.properties b/core/src/main/resources/lib/hudson/project/config-assignedLabel_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..5325e0a53ac556c0bf6a1481a17d4a58b693206d --- /dev/null +++ b/core/src/main/resources/lib/hudson/project/config-assignedLabel_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +Restrict\ where\ this\ project\ can\ be\ run=\u041E\u0433\u0440\u0430\u043D\u0438\u0447\u0438 \u0433\u0434\u0435 \u0441\u0435 \u043C\u043E\u0436\u0435 \u0438\u0437\u0432\u0440\u0448\u0438\u0442\u0438 \u043E\u0432\u0430\u0458 \u043F\u0440\u043E\u0458\u043A\u0430\u0442 +Label\ Expression=\u0418\u0437\u0440\u0430\u0437 \u043D\u0430 \u043B\u0430\u0431\u0435\u043B\u0438 +Tie\ this\ project\ to\ a\ node=\u041F\u043E\u0432\u0435\u0436\u0438 \u043E\u0432\u0430\u0458 \u043F\u0440\u043E\u0458\u0435\u043A\u0430\u0442 \u0441\u0430 \u043C\u0430\u0448\u0438\u043D\u043E\u043C diff --git a/core/src/main/resources/lib/hudson/project/config-blockWhenDownstreamBuilding_sr.properties b/core/src/main/resources/lib/hudson/project/config-blockWhenDownstreamBuilding_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..467994cca7bf80eb3df1919fda49a69525ea2b8e --- /dev/null +++ b/core/src/main/resources/lib/hudson/project/config-blockWhenDownstreamBuilding_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Block\ build\ when\ downstream\ project\ is\ building=\u0417\u0430\u0431\u043B\u043E\u043A\u0438\u0440\u0430\u0458 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0443 \u0434\u043E\u043A \u0441\u0435 \u0433\u0440\u0430\u0434\u0438 \u0437\u0430\u0432\u0438\u0441\u043D\u0438 \u043F\u0440\u043E\u0458\u0435\u043A\u0430\u0442 diff --git a/core/src/main/resources/lib/hudson/project/config-blockWhenUpstreamBuilding_sr.properties b/core/src/main/resources/lib/hudson/project/config-blockWhenUpstreamBuilding_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..07c76a702ce34c43b09e1fd93c583e5c08416ce3 --- /dev/null +++ b/core/src/main/resources/lib/hudson/project/config-blockWhenUpstreamBuilding_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Block\ build\ when\ upstream\ project\ is\ building=\u0417\u0430\u0431\u043B\u043E\u043A\u0438\u0440\u0430\u0458 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0443 \u0434\u043E\u043A \u0441\u0435 \u0433\u0440\u0430\u0434\u0438 upstream \u043F\u0440\u043E\u0458\u0435\u043A\u0430\u0442 diff --git a/core/src/main/resources/lib/hudson/project/config-buildWrappers_pl.properties b/core/src/main/resources/lib/hudson/project/config-buildWrappers_pl.properties new file mode 100644 index 0000000000000000000000000000000000000000..790e7ac441c720d83cb750da63491da5f21e4e7c --- /dev/null +++ b/core/src/main/resources/lib/hudson/project/config-buildWrappers_pl.properties @@ -0,0 +1,22 @@ +# The MIT License +# +# Copyright (c) 2004-2017, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributors +# +# 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\ Environment=\u015Arodowisko do uruchomienia diff --git a/core/src/main/resources/lib/hudson/project/config-buildWrappers_sr.properties b/core/src/main/resources/lib/hudson/project/config-buildWrappers_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..4a8151f6f405489ae56ba577fce94513893e536c --- /dev/null +++ b/core/src/main/resources/lib/hudson/project/config-buildWrappers_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Build\ Environment=\u041E\u043A\u043E\u043B\u0438\u043D\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 diff --git a/core/src/main/resources/lib/hudson/project/config-builders_pl.properties b/core/src/main/resources/lib/hudson/project/config-builders_pl.properties new file mode 100644 index 0000000000000000000000000000000000000000..2f4402e55bc01415370b7acac84e892564b13543 --- /dev/null +++ b/core/src/main/resources/lib/hudson/project/config-builders_pl.properties @@ -0,0 +1,23 @@ +# The MIT License +# +# Copyright (c) 2016, Damian Szczepanik +# +# 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=Budowanie +Add\ build\ step=Dodaj krok budowania diff --git a/core/src/main/resources/lib/hudson/project/config-builders_sr.properties b/core/src/main/resources/lib/hudson/project/config-builders_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..1d0c2302bcdd78a245b2a43e3d1eb0ead2778698 --- /dev/null +++ b/core/src/main/resources/lib/hudson/project/config-builders_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Build=\u0418\u0437\u0433\u0440\u0430\u0434\u045A\u0430 +Add\ build\ step=\u0414\u043E\u0434\u0430\u0458 \u043A\u043E\u0440\u0430\u043A \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0438 diff --git a/core/src/main/resources/lib/hudson/project/config-concurrentBuild_sr.properties b/core/src/main/resources/lib/hudson/project/config-concurrentBuild_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..7a677c66de69e2e445239b6b550368d40ee0705c --- /dev/null +++ b/core/src/main/resources/lib/hudson/project/config-concurrentBuild_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +title.concurrentbuilds=\u0418\u0437\u0432\u0440\u045A\u0438 \u043F\u0430\u0440\u0430\u043B\u0435\u043B\u043D\u043E \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 \u0430\u043A\u043E \u0431\u0443\u0434\u0435 \u0431\u0438\u043B\u043E \u043F\u043E\u0442\u0440\u0435\u0431\u043D\u043E diff --git a/core/src/main/resources/lib/hudson/project/config-customWorkspace_ja.properties b/core/src/main/resources/lib/hudson/project/config-customWorkspace_ja.properties index 5597e2694f443999af8906582b4911825b1be58c..0737289e39ba14d5273e65a7d4edee42a9edea83 100644 --- a/core/src/main/resources/lib/hudson/project/config-customWorkspace_ja.properties +++ b/core/src/main/resources/lib/hudson/project/config-customWorkspace_ja.properties @@ -1,24 +1,24 @@ -# The MIT License -# -# Copyright (c) 2004-2012, Sun Microsystems, Inc., Kohsuke Kawaguchi, Seiji Sogabe -# -# 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. - -Use\ custom\ workspace=\u30ab\u30b9\u30bf\u30e0\u30ef\u30fc\u30af\u30b9\u30da\u30fc\u30b9\u3092\u4f7f\u7528 +# The MIT License +# +# Copyright (c) 2004-2012, Sun Microsystems, Inc., Kohsuke Kawaguchi, Seiji Sogabe +# +# 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. + +Use\ custom\ workspace=\u30ab\u30b9\u30bf\u30e0\u30ef\u30fc\u30af\u30b9\u30da\u30fc\u30b9\u3092\u4f7f\u7528 Directory=\u30c7\u30a3\u30ec\u30af\u30c8\u30ea \ No newline at end of file diff --git a/core/src/main/resources/lib/hudson/project/config-customWorkspace_sr.properties b/core/src/main/resources/lib/hudson/project/config-customWorkspace_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..f5857ad05b57a83fd1fb7b0820be4c606a86436c --- /dev/null +++ b/core/src/main/resources/lib/hudson/project/config-customWorkspace_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Use\ custom\ workspace=\u041A\u043E\u0440\u0438\u0441\u0442\u0438 \u043F\u043E\u0440\u0443\u0447\u0435\u043D\u0438 \u0440\u0430\u0434\u043D\u0438 \u043F\u0440\u043E\u0441\u0442\u043E\u0440 +Directory=\u0414\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0458\u0443\u043C diff --git a/core/src/main/resources/lib/hudson/project/config-disableBuild_pl.properties b/core/src/main/resources/lib/hudson/project/config-disableBuild_pl.properties index dbf0f019a5fbe15c5af325b77aa3ab6f35bcc41d..dca0704a660e6f9617f6567baaf99f23608b0d14 100644 --- a/core/src/main/resources/lib/hudson/project/config-disableBuild_pl.properties +++ b/core/src/main/resources/lib/hudson/project/config-disableBuild_pl.properties @@ -1,4 +1,23 @@ -# This file is under the MIT License by authors +# The MIT License +# +# Copyright (c) 2004-2016, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributors +# +# 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. Disable\ this\ project=Zablokuj zadania -No\ new\ builds\ will\ be\ executed\ until\ the\ project\ is\ re-enabled.=Nowe zadania nie b\u0119d\u0105 wykonywane dop\u00F3ki projekt nie b\u0119dzie odblokowany diff --git a/core/src/main/resources/lib/hudson/project/config-disableBuild_ru.properties b/core/src/main/resources/lib/hudson/project/config-disableBuild_ru.properties index 0ec634790b6b10d5f7875512eb902fea857f9363..cdba0f6752500185a369f079bcc2f26ea28afe66 100644 --- a/core/src/main/resources/lib/hudson/project/config-disableBuild_ru.properties +++ b/core/src/main/resources/lib/hudson/project/config-disableBuild_ru.properties @@ -1,17 +1,17 @@ # The MIT License -# +# # Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Mike Salnikov -# +# # 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 @@ -21,4 +21,3 @@ # THE SOFTWARE. Disable\ this\ project=\u041f\u0440\u0438\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u0431\u043e\u0440\u043a\u0438 -No\ new\ builds\ will\ be\ executed\ until\ the\ project\ is\ re-enabled.=\u041d\u043e\u0432\u044b\u0435 \u0441\u0431\u043e\u0440\u043a\u0438 \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u043f\u043e\u043a\u0430 \u043e\u043f\u0446\u0438\u044f \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0430 diff --git a/core/src/main/resources/lib/hudson/project/config-disableBuild_sr.properties b/core/src/main/resources/lib/hudson/project/config-disableBuild_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..a1eb33cb22c9a35496893aae5ee49b3421a58fb1 --- /dev/null +++ b/core/src/main/resources/lib/hudson/project/config-disableBuild_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +Disable\ this\ project=\u041E\u043D\u0435\u043C\u043E\u0433\u0443\u045B\u0438 \u043E\u0432\u0430\u0458 \u043F\u0440\u043E\u0458\u0435\u043A\u0430\u0442 +Disable\ Build=\u041E\u043D\u0435\u043C\u043E\u0433\u0443\u045B\u0438 \u043F\u0440\u043E\u0458\u0435\u043A\u0430\u0442 +No\ new\ builds\ will\ be\ executed\ until\ the\ project\ is\ re-enabled.=\u041D\u043E\u0432\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 \u043D\u0435\u045B\u0435 \u0431\u0438\u0442\u0438 \u0438\u0437\u0432\u0440\u0448\u0438\u0432\u0430\u043D\u0430 \u0434\u043E\u043A \u043F\u0440\u043E\u0458\u0435\u043A\u0430\u0442 \u043D\u0438\u0458\u0435 \u043F\u043E\u043D\u043E\u0432\u043E \u043E\u043C\u043E\u0433\u0443\u045B\u0435\u043D. diff --git a/core/src/main/resources/lib/hudson/project/config-publishers2_pl.properties b/core/src/main/resources/lib/hudson/project/config-publishers2_pl.properties new file mode 100644 index 0000000000000000000000000000000000000000..49d26193b80143e0ae28e36372c4fa7a75a09e66 --- /dev/null +++ b/core/src/main/resources/lib/hudson/project/config-publishers2_pl.properties @@ -0,0 +1,23 @@ +# The MIT License +# +# Copyright (c) 2016, Damian Szczepanik +# +# 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. +Add\ post-build\ action=Dodaj akcje po zadaniu +Post-build\ Actions=Akcje po zadaniu diff --git a/core/src/main/resources/lib/hudson/project/config-publishers2_sr.properties b/core/src/main/resources/lib/hudson/project/config-publishers2_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..fb799a8a9e13266265c8b679d86f8799e154b98b --- /dev/null +++ b/core/src/main/resources/lib/hudson/project/config-publishers2_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Post-build\ Actions=\u0410\u043A\u0446\u0438\u0458\u0435 \u043F\u043E\u0441\u043B\u0435 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 +Add\ post-build\ action=\u0414\u043E\u0434\u0430\u0458 \u0430\u043A\u0446\u0438\u0458\u0443 \u043F\u043E\u0441\u043B\u0435 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 diff --git a/core/src/main/resources/lib/hudson/project/config-publishers_sr.properties b/core/src/main/resources/lib/hudson/project/config-publishers_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..4d777bfe2cb6108d7b7e484dc0f2adf458e4a695 --- /dev/null +++ b/core/src/main/resources/lib/hudson/project/config-publishers_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Post-build\ Actions=\u0410\u043A\u0446\u0438\u0458\u0435 \u043F\u043E\u0441\u043B\u0435 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 diff --git a/core/src/main/resources/lib/hudson/project/config-quietPeriod_sr.properties b/core/src/main/resources/lib/hudson/project/config-quietPeriod_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..d48d4a3d1c4aa1f93a1fe4f58a76786212556bfa --- /dev/null +++ b/core/src/main/resources/lib/hudson/project/config-quietPeriod_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Number\ of\ seconds=\u0412\u0440\u043E\u0458 \u0441\u0435\u043A\u0443\u043D\u0434\u0438 +Quiet\ period=\u041F\u0435\u0440\u0438\u043E\u0434 \u0442\u0438\u0448\u0438\u043D\u0435 diff --git a/core/src/main/resources/lib/hudson/project/config-retryCount_sr.properties b/core/src/main/resources/lib/hudson/project/config-retryCount_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..b4f7670b626eb1430dd448c2674db2f5793aa2e6 --- /dev/null +++ b/core/src/main/resources/lib/hudson/project/config-retryCount_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +SCM\ checkout\ retry\ count=\u0411\u0440\u043E\u0458 \u043F\u043E\u043A\u0443\u0448\u0430\u0458\u0430 \u043F\u0440\u0435\u0443\u0437\u0438\u043C\u0430\u045A\u0435 \u0438\u0437\u0432\u043E\u0440\u043D\u043E\u0433 \u043A\u043E\u0434\u0430 +Retry\ Count=\u0411\u0440\u043E\u0458 \u043F\u043E\u043A\u0443\u0448\u0430\u0458\u0430 diff --git a/core/src/main/resources/lib/hudson/project/config-scm_pl.properties b/core/src/main/resources/lib/hudson/project/config-scm_pl.properties index e0d39300b5a45dbbb254b7774240f4460b05a422..b8de9075d4ca265057e14a56ada57afd979b0bb5 100644 --- a/core/src/main/resources/lib/hudson/project/config-scm_pl.properties +++ b/core/src/main/resources/lib/hudson/project/config-scm_pl.properties @@ -1,3 +1,3 @@ # This file is under the MIT License by authors -Source\ Code\ Management=Repozytorium kodu \u017Ar\u00F3d\u0142owego +Source\ Code\ Management=Repozytorium kodu diff --git a/core/src/main/resources/lib/hudson/project/config-scm_ru.properties b/core/src/main/resources/lib/hudson/project/config-scm_ru.properties index 45f732d6c7d22a17d5fe5a8e9d25d5903bb4dc48..4957219706feb84eb75341ec6d4a54d1b6e0f2e5 100644 --- a/core/src/main/resources/lib/hudson/project/config-scm_ru.properties +++ b/core/src/main/resources/lib/hudson/project/config-scm_ru.properties @@ -1,23 +1,3 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Mike Salnikov -# -# 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. - +Advanced\ Source\ Code\ Management=\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u043e\u0435 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c +SCM\ Checkout\ Strategy=\u0421\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u044f checkout'\u0430 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 Source\ Code\ Management=\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c diff --git a/core/src/main/resources/lib/hudson/project/config-scm_sr.properties b/core/src/main/resources/lib/hudson/project/config-scm_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..4d1d943b752cc7180ca94b035fb22d5e8c8e0929 --- /dev/null +++ b/core/src/main/resources/lib/hudson/project/config-scm_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +Advanced\ Source\ Code\ Management=\u041D\u0430\u043F\u0440\u0435\u0434\u043D\u043E \u0443\u043F\u0440\u0430\u0432\u0459\u0430\u045A\u0435 \u0438\u0437\u0432\u043E\u0440\u043D\u0438\u043C \u043A\u043E\u0434\u043E\u043C +SCM\ Checkout\ Strategy=\u0428\u0430\u0431\u043B\u043E\u043D \u043F\u0440\u0435\u0434\u0443\u0437\u0438\u043C\u0430\u045A\u0430 \u0438\u0437\u0432\u043E\u0440\u043D\u043E\u0433 \u043A\u043E\u0434\u0430 +Source\ Code\ Management=\u0421\u0438\u0441\u0442\u0435\u043C \u0443\u043F\u0440\u0430\u0432\u0459\u0430\u045A\u0430 \u0438\u0437\u0432\u043E\u0440\u043D\u043E\u0433 \u043A\u043E\u0434\u0430 diff --git a/core/src/main/resources/hudson/triggers/SCMTrigger/AdministrativeMonitorImpl/message_fr.properties b/core/src/main/resources/lib/hudson/project/config-trigger_pl.properties similarity index 91% rename from core/src/main/resources/hudson/triggers/SCMTrigger/AdministrativeMonitorImpl/message_fr.properties rename to core/src/main/resources/lib/hudson/project/config-trigger_pl.properties index 0664cb46e04fdcb2b6168bd7d3fc9008aabdbc8c..a6f70f17415cc18cc40e812775db97b946533922 100644 --- a/core/src/main/resources/hudson/triggers/SCMTrigger/AdministrativeMonitorImpl/message_fr.properties +++ b/core/src/main/resources/lib/hudson/project/config-trigger_pl.properties @@ -1,6 +1,6 @@ # The MIT License # -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Eric Lefevre-Ardant +# Copyright (c) 2016, Damian Szczepanik # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -19,5 +19,4 @@ # 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. - -blurb= +Build\ Triggers=Wyzwalacze zadania diff --git a/core/src/main/resources/lib/hudson/project/config-trigger_sr.properties b/core/src/main/resources/lib/hudson/project/config-trigger_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..aae2ee44edaea15d0a9af27c3a7f2063ae614c77 --- /dev/null +++ b/core/src/main/resources/lib/hudson/project/config-trigger_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Build\ Triggers=\u041F\u043E\u043A\u0440\u0435\u0442\u0430\u045A\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 diff --git a/core/src/main/resources/lib/hudson/project/config-upstream-pseudo-trigger_ru.properties b/core/src/main/resources/lib/hudson/project/config-upstream-pseudo-trigger_ru.properties index 08e430835bba100a82c45d8cb87fea41f58ab143..897ba6d9724e269c0a22c85969bfbb7838f95f16 100644 --- a/core/src/main/resources/lib/hudson/project/config-upstream-pseudo-trigger_ru.properties +++ b/core/src/main/resources/lib/hudson/project/config-upstream-pseudo-trigger_ru.properties @@ -1,17 +1,17 @@ # The MIT License -# +# # Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Mike Salnikov -# +# # 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 @@ -20,7 +20,3 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Build\ after\ other\ projects\ are\ built=\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0441\u0431\u043e\u0440\u043a\u0443 \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0434\u0440\u0443\u0433\u043e\u0439 -Project\ names=\u0418\u043C\u0435\u043D\u0430 \u043F\u0440\u043E\u0435\u043A\u0442\u043E\u0432 -Projects\ names=\u0418\u043c\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430 -Multiple\ projects\ can\ be\ specified\ like\ 'abc,\ def'=\u041c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, 'abc, def' diff --git a/core/src/main/resources/lib/hudson/project/config-upstream-pseudo-trigger_sr.properties b/core/src/main/resources/lib/hudson/project/config-upstream-pseudo-trigger_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..2226c3544076098d8f001e1dc8358228f645b757 --- /dev/null +++ b/core/src/main/resources/lib/hudson/project/config-upstream-pseudo-trigger_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +Project\ names=\u0418\u043C\u0435\u043D\u0430 \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u0430 +Build\ after\ other\ projects\ are\ built=\u0418\u0437\u0433\u0440\u0430\u0434\u0438 \u043F\u043E\u0441\u043B\u0435 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 \u0434\u0440\u0443\u0433\u0438\u0445 \u043F\u0440\u043E\u0458\u0435\u043A\u0430\u0442\u0430 +Multiple\ projects\ can\ be\ specified\ like\ 'abc,\ def'=\u0412\u0438\u0448\u0435 \u043F\u0440\u043E\u0458\u0435\u043A\u0430\u0442\u0430 \u043C\u043E\u0433\u0443 \u0441\u0435 \u043D\u0430\u0432\u0435\u0441\u0442\u0438 '\u0430\u0431\u0432,\u0433\u0434\u0435' diff --git a/core/src/main/resources/lib/hudson/project/configurable_sr.properties b/core/src/main/resources/lib/hudson/project/configurable_sr.properties index 2b7db5910fcd4894cb9c2b2dd4f9f39af9b38ce7..436d9791d655b94302b73fdae0654a8546811a3b 100644 --- a/core/src/main/resources/lib/hudson/project/configurable_sr.properties +++ b/core/src/main/resources/lib/hudson/project/configurable_sr.properties @@ -20,7 +20,8 @@ # 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? +Build\ scheduled=\u0418\u0437\u0433\u0440\u0430\u0434\u045A\u0430 \u0437\u0430\u043A\u0430\u0437\u0430\u043D\u0430 +Configure=\u041F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 +delete=\u0423\u043A\u043B\u043E\u043D\u0438 {0} +delete.confirm=\u0414\u0430 \u043B\u0438 \u0436\u0435\u043B\u0438\u0442\u0435 \u0434\u0430 \u0443\u043A\u043B\u043E\u043D\u0438\u0442\u0435 {0} \u2018{1}\u2019? +View\ Configuration=\u041F\u0440\u0435\u0433\u043B\u0435\u0434 \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 diff --git a/core/src/main/resources/lib/hudson/project/console-link_ru.properties b/core/src/main/resources/lib/hudson/project/console-link_ru.properties new file mode 100644 index 0000000000000000000000000000000000000000..125c054cbe94c2e4d2e942b03bb67ee7c969ed3b --- /dev/null +++ b/core/src/main/resources/lib/hudson/project/console-link_ru.properties @@ -0,0 +1,24 @@ +# The MIT License +# +# Copyright (c) 2004-, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributors +# +# 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. + +Console\ Output=\u0412\u044B\u0432\u043E\u0434 \u043A\u043E\u043D\u0441\u043E\u043B\u0438 +View\ as\ plain\ text=\u041F\u0440\u043E\u0441\u043C\u043E\u0442\u0440\u0435\u0442\u044C \u043A\u0430\u043A \u043D\u0435\u0444\u043E\u0440\u043C\u0430\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0439 \u0442\u0435\u043A\u0441\u0442 \ No newline at end of file diff --git a/core/src/main/resources/lib/hudson/project/console-link_sr.properties b/core/src/main/resources/lib/hudson/project/console-link_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..a58b54d29de39112121908c70f30b47c33ce5d98 --- /dev/null +++ b/core/src/main/resources/lib/hudson/project/console-link_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +View\ as\ plain\ text=\u041F\u0440\u0435\u0433\u043B\u0435\u0434 \u043E\u0431\u0438\u0447\u043D\u043E\u0433 \u0442\u0435\u043A\u0441\u0442\u0430 +Console\ Output=\u0418\u0441\u0445\u043E\u0434 \u0438\u0437 \u043A\u043E\u043D\u0437\u043E\u043B\u0435 diff --git a/core/src/main/resources/lib/hudson/project/upstream-downstream_sr.properties b/core/src/main/resources/lib/hudson/project/upstream-downstream_sr.properties index ae9d077e7b6c4343776b53f4654399d8f9982abc..3ce2c7835bfe1d1b18acd4ef308123bea81fac9b 100644 --- a/core/src/main/resources/lib/hudson/project/upstream-downstream_sr.properties +++ b/core/src/main/resources/lib/hudson/project/upstream-downstream_sr.properties @@ -1,4 +1,4 @@ # This file is under the MIT License by authors -Downstream\ Projects=Downstream projekti -Upstream\ Projects=Upstream projekti +Downstream\ Projects=Downstream \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u0438 +Upstream\ Projects=Upstream \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u0438 \ No newline at end of file diff --git a/core/src/main/resources/lib/hudson/propertyTable.jelly b/core/src/main/resources/lib/hudson/propertyTable.jelly index 49df583388697cb48a26d1c7db0ff3964eeea5fe..1c69142d1c3436a88f3a460b1bd9a5075a7ec073 100644 --- a/core/src/main/resources/lib/hudson/propertyTable.jelly +++ b/core/src/main/resources/lib/hudson/propertyTable.jelly @@ -25,7 +25,7 @@ THE SOFTWARE. - Dispaly sortable table of properties. + Display sortable table of properties. A Map object that gets rendered as a table. diff --git a/core/src/main/resources/lib/hudson/propertyTable_sr.properties b/core/src/main/resources/lib/hudson/propertyTable_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..77ff4ea72af107982832d46040af776265661c2f --- /dev/null +++ b/core/src/main/resources/lib/hudson/propertyTable_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +Name=\u0418\u043C\u0435 +Value=\u0412\u0440\u0435\u0434\u043D\u043E\u0441\u0442 diff --git a/core/src/main/resources/lib/hudson/queue.jelly b/core/src/main/resources/lib/hudson/queue.jelly index 1bc26d34cf7c230ad0005c4119f7bcd05ab9b0fd..010fffb949bfffa2f8d26353059551582d6d05e5 100644 --- a/core/src/main/resources/lib/hudson/queue.jelly +++ b/core/src/main/resources/lib/hudson/queue.jelly @@ -79,7 +79,7 @@ THE SOFTWARE.   - + @@ -91,7 +91,7 @@ THE SOFTWARE. - + diff --git a/core/src/main/resources/lib/hudson/queue.properties b/core/src/main/resources/lib/hudson/queue.properties index d7b2a594e5da78f87dd5113b5f51cd25ee5ab8df..fc5be8a60a9e39d2b69156e9d706a6198235d153 100644 --- a/core/src/main/resources/lib/hudson/queue.properties +++ b/core/src/main/resources/lib/hudson/queue.properties @@ -1,3 +1,4 @@ Build\ Queue=Build Queue{0,choice,0#|0< ({0,number})} Filtered\ Build\ Queue=Filtered Build Queue{0,choice,0#|0< ({0,number})} -WaitingFor=Waiting for {0} \ No newline at end of file +WaitingFor=Waiting for {0} +confirm=Are you sure you want to cancel the queued run of {0}? diff --git a/core/src/main/resources/lib/hudson/queue_pl.properties b/core/src/main/resources/lib/hudson/queue_pl.properties index a326a1933ff7d8323cdf110cd0b34dfd74ea468a..1520fdffaaae5cf6f8403da53c1084132fd3a4a5 100644 --- a/core/src/main/resources/lib/hudson/queue_pl.properties +++ b/core/src/main/resources/lib/hudson/queue_pl.properties @@ -1,6 +1,6 @@ # The MIT License # -# Copyright (c) 2004-2010, Sun Microsystems, Inc. +# Copyright (c) 2004-2016, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributors # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal @@ -24,5 +24,4 @@ Build\ Queue=Kolejka zada\u0144{0,choice,0#|0< ({0,number})} Jenkins\ is\ going\ to\ shut\ down.\ No\ further\ builds\ will\ be\ performed.=Jenkins przygotowuje si\u0119 do wy\u0142\u0105czenia. Uruchamianie nast\u0119pnych kompilacji zosta\u0142o wstrzymane. No\ builds\ in\ the\ queue.=Nie ma zada\u0144 w kolejce WaitingFor=Czeka na {0} -WaitingSince=Oczekiwanie od {0} cancel=anuluj diff --git a/core/src/main/resources/lib/hudson/queue_ru.properties b/core/src/main/resources/lib/hudson/queue_ru.properties index a67a693434ea8245bf760f86c5a5917f930e510e..f61eeee667d96fc332e1fa479a2239b36f404bb8 100644 --- a/core/src/main/resources/lib/hudson/queue_ru.properties +++ b/core/src/main/resources/lib/hudson/queue_ru.properties @@ -1,17 +1,17 @@ # The MIT License -# +# # Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Mike Salnikov -# +# # 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 @@ -20,9 +20,11 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Build\ Queue=\u041E\u0447\u0435\u0440\u0435\u0434\u044C \u0441\u0431\u043E\u0440\u043E\u043A{0,choice,0#|0< ({0,number})} -No\ builds\ in\ the\ queue.=\u041E\u0447\u0435\u0440\u0435\u0434\u044C \u0441\u0431\u043E\u0440\u043E\u043A \u043F\u0443\u0441\u0442\u0430 +Build\ Queue=\u041e\u0447\u0435\u0440\u0435\u0434\u044c \u0441\u0431\u043e\u0440\u043e\u043a{0,choice,0#|0< ({0,number})} +confirm=\u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u044c +Filtered\ Build\ Queue=\u041e\u0442\u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0441\u0431\u043e\u0440\u043e\u043a +No\ builds\ in\ the\ queue.=\u041e\u0447\u0435\u0440\u0435\u0434\u044c \u0441\u0431\u043e\u0440\u043e\u043a \u043f\u0443\u0441\u0442\u0430 Jenkins\ is\ going\ to\ shut\ down.\ No\ further\ builds\ will\ be\ performed.=Jenkins \u0433\u043e\u0442\u043e\u0432\u0438\u0442\u0441\u044f \u043a \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044e. \u0421\u0431\u043e\u0440\u043a\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u043d\u0435 \u0431\u0443\u0434\u0443\u0442. +Unknown\ Task=\u041d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 WaitingFor=\u0416\u0434\u0451\u0442 {0} -WaitingSince=\u041E\u0436\u0438\u0434\u0430\u0435\u0442 \u0441 cancel=\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c diff --git a/core/src/main/resources/lib/hudson/queue_sr.properties b/core/src/main/resources/lib/hudson/queue_sr.properties index 6e99e6d2278417c39386ad69c0be7907c2efde0f..e9d9219566b5a8da5f74bd1717ccd8e4cabd829b 100644 --- a/core/src/main/resources/lib/hudson/queue_sr.properties +++ b/core/src/main/resources/lib/hudson/queue_sr.properties @@ -1,6 +1,13 @@ # This file is under the MIT License by authors -Build\ Queue=Red Gradnje{0,choice,0#|0< ({0,number})} -No\ builds\ in\ the\ queue.=Nema zakazanih procesa -WaitingFor=\u010Ceka se {0} -WaitingSince=\u010Ceka od {0} +Build\ Queue= +No\ builds\ in\ the\ queue.=\u041D\u0435\u043C\u0430 \u0437\u0430\u043A\u0430\u0437\u0430\u043D\u0438\u0445 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 +WaitingFor=\u0427\u0435\u043A\u0430 \u0441\u0435 {0} +WaitingSince=\u0427\u0435\u043A\u0430 \u043E\u0434 {0} +Filtered\ Build\ Queue=\u041F\u0440\u043E\u0444\u0438\u043B\u0442\u0440\u0438\u0440\u0430\u043D \u0440\u0435\u0434 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 +Jenkins\ is\ going\ to\ shut\ down.\ No\ further\ builds\ will\ be\ performed.=Jenkins \u045B\u0435 \u0431\u0438\u0442\u0438 \u0443\u0433\u0430\u0448\u0435\u043D. \u0414\u043E\u0434\u0430\u0442\u043D\u0435 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 \u0441\u0435 \u043D\u0435\u045B\u0435 \u0438\u0437\u0432\u0440\u0448\u0438\u0442\u0438. +cancel=\u043E\u0442\u043A\u0430\u0436\u0438 +Unknown\ Task=\u041D\u0435\u043F\u043E\u0437\u043D\u0430\u0442\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 +confirm=\u0414\u0430 \u043B\u0438 \u0441\u0442\u0435 \u0441\u0438\u0433\u0443\u0440\u043D\u0438 \u0434\u0430 \u0436\u0435\u043B\u0438\u0442\u0435 \u0434\u0430 \u043E\u0442\u043A\u0430\u0436\u0435\u0442\u0435 \u0437\u0430\u043A\u0430\u0442\u0430\u043D\u0443 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0443 {0}?\ +Are you sure you want to cancel the queued run of {0}? +appears\ to\ be\ stuck=\u0458\u0435 \u0437\u0430\u0433\u043B\u0430\u0432\u0459\u0435\u043D\u043E diff --git a/core/src/main/resources/lib/hudson/rssBar-with-iconSize_ru.properties b/core/src/main/resources/lib/hudson/rssBar-with-iconSize_ru.properties index 01d1fd8059e0aeba388698e2181e21e3d672a67f..ccabb0279de48fbef4bad065aff0293d13c5f3c0 100644 --- a/core/src/main/resources/lib/hudson/rssBar-with-iconSize_ru.properties +++ b/core/src/main/resources/lib/hudson/rssBar-with-iconSize_ru.properties @@ -20,4 +20,3 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Icon=\u0417\u043D\u0430\u0447\u043E\u043A diff --git a/core/src/main/resources/lib/hudson/rssBar_sr.properties b/core/src/main/resources/lib/hudson/rssBar_sr.properties index 00ddfd30a332049408c593c405279f6f5212ed73..09b57a4dcc61399e2bf00cff2e60b85e1317916b 100644 --- a/core/src/main/resources/lib/hudson/rssBar_sr.properties +++ b/core/src/main/resources/lib/hudson/rssBar_sr.properties @@ -1,6 +1,6 @@ # This file is under the MIT License by authors -Legend=Legenda -for\ all=za sve -for\ failures=za neuspe\u0161ne -for\ just\ latest\ builds=samo za najnovije gradnje +Legend=\u041B\u0435\u0433\u0435\u043D\u0434\u0430 +for\ all=\u0437\u0430 \u0441\u0432\u0435 +for\ failures=\u0437\u0430 \u043D\u0435\u0443\u0441\u043F\u0435\u0448\u043D\u0435 +for\ just\ latest\ builds=\u0441\u0430\u043C\u043E \u0437\u0430 \u043D\u0430\u0458\u043D\u043E\u0432\u0438\u0458\u0435 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0435 diff --git a/core/src/main/resources/lib/hudson/scriptConsole.jelly b/core/src/main/resources/lib/hudson/scriptConsole.jelly index 6c10838ae390e0d3a93c822d090e70dd3bc3aa03..a0d24b32e0f77da0210d168222784c15ad9d8aa4 100644 --- a/core/src/main/resources/lib/hudson/scriptConsole.jelly +++ b/core/src/main/resources/lib/hudson/scriptConsole.jelly @@ -26,12 +26,20 @@ THE SOFTWARE. Called from doScript() to display the execution result and the form. --> - + -

        ${%Script Console}

        + + + + + + + + +

        ${%Script Console}

        diff --git a/core/src/main/resources/lib/hudson/scriptConsole_ru.properties b/core/src/main/resources/lib/hudson/scriptConsole_ru.properties index b0b68ceaf595a26195f2a3f49e090406ea539d34..12ac56e9dde64ddadbeed4555a73c9659050b461 100644 --- a/core/src/main/resources/lib/hudson/scriptConsole_ru.properties +++ b/core/src/main/resources/lib/hudson/scriptConsole_ru.properties @@ -1,27 +1,6 @@ -# The MIT License -# -# Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Mike Salnikov -# -# 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. - -Script\ Console=\u041a\u043e\u043d\u0441\u043e\u043b\u044c +It\ is\ not\ possible\ to\ run\ scripts\ when\ agent\ is\ offline.=\u041d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0441\u043a\u0440\u0438\u043f\u0442, \u043a\u043e\u0433\u0434\u0430 \u0430\u0433\u0435\u043d\u0442 \u043d\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d. Result=\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 Run=\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c -description=\u0412\u0432\u0435\u0434\u0438\u0442\u0435 Groovy \u0441\u043A\u0440\u0438\u043F\u0442 \u0438 \u0432\u044B\u043F\u043E\u043B\u043D\u0438\u0442\u0435 \u0435\u0433\u043E \u043D\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435. \u041F\u043E\u043B\u0435\u0437\u043D\u043E \u043F\u0440\u0438 \u0443\u0441\u0442\u0440\u0430\u043D\u0435\u043D\u0438\u0438 \u043D\u0435\u043F\u043E\u043B\u0430\u0434\u043E\u043A \u0438 \u0434\u0438\u0430\u0433\u043D\u043E\u0441\u0442\u0438\u043A\u0438. \u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 \u043A\u043E\u043C\u0430\u043D\u0434\u0443 "println" \u0434\u043B\u044F \u043F\u0435\u0447\u0430\u0442\u0438 \u0432 \u0441\u0442\u0430\u043D\u0434\u0430\u0440\u0442\u043D\u044B\u0439 \u0432\u044B\u0432\u043E\u0434 (\u0435\u0441\u043B\u0438 \u0432\u044B \u0432\u043E\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442\u0435\u0441\u044C System.out, \u0442\u043E \u0432\u044B\u0432\u043E\u0434 \u043F\u043E\u0439\u0434\u0451\u0442 \u0432 stdout \u0441\u0435\u0440\u0432\u0435\u0440\u0430, \u043A\u043E\u0442\u043E\u0440\u044B\u0439 \u0441\u043B\u043E\u0436\u043D\u0435\u0435 \u0443\u0432\u0438\u0434\u0435\u0442\u044C). \u041D\u0430\u043F\u0440\u0438\u043C\u0435\u0440: -description2=\u0412\u0441\u0435 \u043A\u043B\u0430\u0441\u0441\u044B \u0438\u0437 \u0432\u0441\u0435\u0445 \u043F\u043B\u0430\u0433\u0438\u043D\u043E\u0432 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B. jenkins.*, jenkins.model.*, hudson.* \u0438 hudson.model.* \u0443\u0436\u0435 \u0438\u043C\u043F\u043E\u0440\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u044B \u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E. +Script\ Console=\u041a\u043e\u043d\u0441\u043e\u043b\u044c +description2=\u0412\u0441\u0435 \u043a\u043b\u0430\u0441\u0441\u044b \u0438\u0437 \u0432\u0441\u0435\u0445 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b. jenkins.*, jenkins.model.*, hudson.* \u0438 hudson.model.* \u0443\u0436\u0435 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e. +description=\u0412\u0432\u0435\u0434\u0438\u0442\u0435 Groovy \u0441\u043a\u0440\u0438\u043f\u0442 \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u0435 \u0435\u0433\u043e \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435. \u041f\u043e\u043b\u0435\u0437\u043d\u043e \u043f\u0440\u0438 \u0443\u0441\u0442\u0440\u0430\u043d\u0435\u043d\u0438\u0438 \u043d\u0435\u043f\u043e\u043b\u0430\u0434\u043e\u043a \u0438 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0438. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 ''''println'''' \u0434\u043b\u044f \u043f\u0435\u0447\u0430\u0442\u0438 \u0432 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0432\u044b\u0432\u043e\u0434 (\u0435\u0441\u043b\u0438 \u0432\u044b \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435\u0441\u044c System.out, \u0442\u043e \u0432\u044b\u0432\u043e\u0434 \u043f\u043e\u0439\u0434\u0451\u0442 \u0432 stdout \u0441\u0435\u0440\u0432\u0435\u0440\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043b\u043e\u0436\u043d\u0435\u0435 \u0443\u0432\u0438\u0434\u0435\u0442\u044c). \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440: diff --git a/core/src/main/resources/lib/hudson/scriptConsole_sr.properties b/core/src/main/resources/lib/hudson/scriptConsole_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..d460d45ff9f8979866a08e2d02526b4786875f97 --- /dev/null +++ b/core/src/main/resources/lib/hudson/scriptConsole_sr.properties @@ -0,0 +1,13 @@ +# This file is under the MIT License by authors + +Script\ Console=\u041A\u043E\u043D\u0437\u043E\u043B\u0430 +description=\ + \u0423\u043D\u0435\u0441\u0438\u0442\u0435 \u0430\u0440\u0431\u0438\u0442\u0440\u0430\u0440\u043D\u0438 Groovy \u0441\u043A\u0440\u0443\u043F\u0442\u0443 \u0438 \ + \u0438\u0437\u0432\u0440\u0448\u0438 \u0458\u0435 \u043D\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0443. \u041A\u043E\u0440\u0438\u0441\u043D\u043E \u043A\u043E\u0434 \u0440\u0435\u0448\u0430\u0432\u0430\u045A\u0435 \u043F\u0440\u043E\u0431\u043B\u0435\u043C\u0430 \u0438 \u0434\u0438\u0430\u0433\u043D\u043E\u0441\u0442\u0438\u043A\u043E\u043C. \ + \u041A\u043E\u0440\u0438\u0441\u0442\u0438\u0442\u0435 \u043A\u043E\u043C\u0430\u043D\u0434\u0443 \u2018println\u2019 \u0434\u0430 \u0432\u0438\u0434\u0438\u0442\u0435 \u0438\u0441\u0445\u043E\u0434 (\u0431\u0438\u045B\u0435 \u043F\u0440\u0435\u0443\u0441\u043C\u0435\u0440\u0435\u043D\u043E \ + System.out \u043F\u0440\u0435\u043C\u0430 stdout \u0441\u0435\u0440\u0432\u0435\u0440\u0430, \u0448\u0442\u043E \u0441\u0435 \u0442\u0435\u0436\u0435 \u0447\u0438\u0442\u0430.) \u041F\u0440\u0438\u043C\u0435\u0440: +description2=\ + \u0421\u0432\u0435 \u043A\u043B\u0430\u0441\u0435 \u0441\u0430 \u0441\u0432\u0438\u0445 \u043C\u043E\u0434\u0443\u043B\u0430 \u0441\u0443 \u0432\u0438\u0434\u0459\u0438\u0432\u0438. jenkins.*, jenkins.model.*, hudson.*, and hudson.model.* \u0441\u0443 \u043F\u0440\u0435\u0442\u0445\u043E\u0434\u043D\u043E \u0443\u0447\u0438\u0442\u0430\u043D\u0430. +Run=\u0418\u0437\u0432\u0440\u0448\u0438 +Result=\u0420\u0435\u0437\u0443\u043B\u0442\u0430\u0442 +It\ is\ not\ possible\ to\ run\ scripts\ when\ agent\ is\ offline.=\u041D\u0438\u0458\u0435 \u043C\u043E\u0433\u0443\u045B\u0435 \u0438\u0437\u0432\u0440\u0448\u0438\u0442\u0438 \u0441\u043A\u0438\u043F\u0442\u043E\u0432\u0435 \u043A\u0430\u0434\u0430 \u0430\u0433\u0435\u043D\u0442 \u043D\u0438\u0458\u0435 \u043F\u043E\u0432\u0435\u0437\u0430\u043D. diff --git a/core/src/main/resources/lib/hudson/thirdPartyLicenses_ru.properties b/core/src/main/resources/lib/hudson/thirdPartyLicenses_ru.properties index d14ab74845e954ca46a1b22d1fa096817d701332..8e2816f89c268eaa1bf62418464359466655bf9f 100644 --- a/core/src/main/resources/lib/hudson/thirdPartyLicenses_ru.properties +++ b/core/src/main/resources/lib/hudson/thirdPartyLicenses_ru.properties @@ -20,5 +20,6 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -License=\u041B\u0438\u0446\u0435\u043D\u0437\u0438\u044F -Name=\u0418\u043C\u044F +License=\u041b\u0438\u0446\u0435\u043d\u0437\u0438\u044f +Maven\ ID=ID Maven'\u0430 +Name=\u0418\u043c\u044f \ No newline at end of file diff --git a/core/src/main/resources/lib/hudson/thirdPartyLicenses_sr.properties b/core/src/main/resources/lib/hudson/thirdPartyLicenses_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..4b3e12ab10b7d25e2ca5502f9452407ec0b20c8a --- /dev/null +++ b/core/src/main/resources/lib/hudson/thirdPartyLicenses_sr.properties @@ -0,0 +1,5 @@ +# This file is under the MIT License by authors + +Name=\u0418\u043C\u0435 +Maven\ ID=\u0418\u0434\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0442\u043E\u0440 \u0437\u0430 Maven +License=\u041B\u0438\u0446\u0435\u043D\u0446\u0430 diff --git a/core/src/main/resources/lib/layout/breadcrumbBar_sr.properties b/core/src/main/resources/lib/layout/breadcrumbBar_sr.properties index dc5c69d85d53cb0c16724f90c61a4c6525ece855..b09138e3cef6c6fdb3964674fc6795d61d5fbd4d 100644 --- a/core/src/main/resources/lib/layout/breadcrumbBar_sr.properties +++ b/core/src/main/resources/lib/layout/breadcrumbBar_sr.properties @@ -1,3 +1,4 @@ # This file is under the MIT License by authors -ENABLE\ AUTO\ REFRESH=UKLJU\u010CI AUTOMATSKI OSVE\u017DAVANJE +ENABLE\ AUTO\ REFRESH=\u0421\u0430 \u0430\u0443\u0442\u043E\u043C\u0430\u0442\u0441\u043A\u0438\u043C \u043E\u0441\u0432\u0435\u0436\u0438\u0432\u0430\u045A\u0435\u043C +DISABLE\ AUTO\ REFRESH=\u0411\u0435\u0437 \u0430\u0443\u0442\u043E\u043C\u0430\u0442\u0441\u043A\u043E\u0433 \u043E\u0441\u0432\u0435\u0436\u0438\u0432\u0430\u045A\u0435\u043C \ No newline at end of file diff --git a/core/src/main/resources/lib/layout/html.jelly b/core/src/main/resources/lib/layout/html.jelly index 5065b33f34813d5b89246c6d50a55ca363f9c7e4..3e6b97cc135fe2a7c8b31c7d923ee43fe0a8555d 100644 --- a/core/src/main/resources/lib/layout/html.jelly +++ b/core/src/main/resources/lib/layout/html.jelly @@ -39,12 +39,12 @@ THE SOFTWARE.
        specify path that starts from "/" for loading additional CSS stylesheet. - path is interprted as relative to the context root. e.g., + path is interpreted as relative to the context root. e.g., {noformat}<l:layout css="/plugin/mysuperplugin/css/myneatstyle.css">{noformat} This was originally added to allow plugins to load their stylesheets, but - *the use of thie attribute is discouraged now.* + *the use of this attribute is discouraged now.* plugins should now do so by inserting <style> elements and/or <script> elements in <l:header/> tag. @@ -147,6 +147,7 @@ ${h.initPageVariables(context)} + diff --git a/core/src/main/resources/lib/layout/layout.jelly b/core/src/main/resources/lib/layout/layout.jelly index dbab66d4f3c67d68329426a3073c0e1f497ff9b0..2050d18c2ab9fca0db140846b1a693a8e2359555 100644 --- a/core/src/main/resources/lib/layout/layout.jelly +++ b/core/src/main/resources/lib/layout/layout.jelly @@ -153,6 +153,7 @@ ${h.initPageVariables(context)} + diff --git a/core/src/main/resources/lib/layout/layout.properties b/core/src/main/resources/lib/layout/layout.properties index 2e349f762e3632edba954dedff5622bf0d572906..b904b8f879e8f33291616ebd4b612c0a96a6fe61 100644 --- a/core/src/main/resources/lib/layout/layout.properties +++ b/core/src/main/resources/lib/layout/layout.properties @@ -21,5 +21,5 @@ # THE SOFTWARE. # do not localize unless a localized wiki page really exists. -searchBox.url=http://wiki.jenkins-ci.org/display/JENKINS/Search+Box +searchBox.url=https://jenkins.io/redirect/search-box logout=log out diff --git a/core/src/main/resources/lib/layout/layout_bg.properties b/core/src/main/resources/lib/layout/layout_bg.properties index 43583498cd6e9a7de4c769d4cec88ed301e3973d..617000a662f04687d57b59f297daf4a155e74f8f 100644 --- a/core/src/main/resources/lib/layout/layout_bg.properties +++ b/core/src/main/resources/lib/layout/layout_bg.properties @@ -27,4 +27,4 @@ logout=\ search=\ \u0422\u044a\u0440\u0441\u0435\u043d\u0435 searchBox.url=\ - http://wiki.jenkins-ci.org/display/JENKINS/Search+Box + https://jenkins.io/redirect/search-box diff --git a/core/src/main/resources/lib/layout/layout_ja.properties b/core/src/main/resources/lib/layout/layout_ja.properties index 292505a78eb24b51134a72c00336107f8feed4df..d512aeabd44386195da204b308ccc8a4f7826460 100644 --- a/core/src/main/resources/lib/layout/layout_ja.properties +++ b/core/src/main/resources/lib/layout/layout_ja.properties @@ -20,7 +20,7 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -searchBox.url=http://wiki.jenkins-ci.org/display/JA/Search+Box +searchBox.url=https://jenkins.io/redirect/search-box search=\u691c\u7d22 Page\ generated=\u30DA\u30FC\u30B8\u66F4\u65B0\u6642 logout=\u30ed\u30b0\u30a2\u30a6\u30c8 diff --git a/core/src/main/resources/lib/layout/layout_pt_BR.properties b/core/src/main/resources/lib/layout/layout_pt_BR.properties index 0b54c81590231b7eb8a9b6993ff9e1e32209294f..bba621933bd97a7ebdb515535d3878ac87bca70b 100644 --- a/core/src/main/resources/lib/layout/layout_pt_BR.properties +++ b/core/src/main/resources/lib/layout/layout_pt_BR.properties @@ -22,7 +22,7 @@ search=pesquisar Page\ generated=P\u00E1gina gerada -# http://wiki.jenkins-ci.org/display/JENKINS/Search+Box -searchBox.url=http://wiki.jenkins-ci.org/display/JENKINS/Search+Box +# https://jenkins.io/redirect/search-box +searchBox.url=https://jenkins.io/redirect/search-box # log out logout=sair diff --git a/core/src/main/resources/lib/layout/layout_ru.properties b/core/src/main/resources/lib/layout/layout_ru.properties index c4f0823e63c328f2ff3c89d53cda95a7c00fc5f8..be19820b1d714437d6163dda538a589ff007fe43 100644 --- a/core/src/main/resources/lib/layout/layout_ru.properties +++ b/core/src/main/resources/lib/layout/layout_ru.properties @@ -1,17 +1,17 @@ # The MIT License -# +# # Copyright (c) 2004-2009, Sun Microsystems, Inc., Kohsuke Kawaguchi, Mike Salnikov, Seiji Sogabe -# +# # 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 @@ -20,6 +20,6 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -search=\u043f\u043e\u0438\u0441\u043a -Page\ generated=\u0421\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0430 logout=\u0432\u044b\u0445\u043e\u0434 +Page\ generated=\u0421\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0430 +search=\u043f\u043e\u0438\u0441\u043a diff --git a/core/src/main/resources/lib/layout/layout_sr.properties b/core/src/main/resources/lib/layout/layout_sr.properties index 43e466ad988ca44352950c015ffc40f4e0b0646b..c20bd5b80a45b42a7b73fd1a6d32bb038bcade1a 100644 --- a/core/src/main/resources/lib/layout/layout_sr.properties +++ b/core/src/main/resources/lib/layout/layout_sr.properties @@ -20,6 +20,7 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Page\ generated=Izgenerirana stranica -logout=Odlogiraj se -search=Tra\u017Ei +Page\ generated=\u0418\u0437\u0433\u0435\u043D\u0435\u0440\u0438\u0441\u0430\u043D\u0430 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0430 +logout=\u041E\u0434\u0458\u0430\u0432\u0438 \u0441\u0435 +search=\u041F\u0440\u0435\u0442\u0440\u0430\u0433\u0430 +searchBox.url=https://jenkins.io/redirect/search-box diff --git a/core/src/main/resources/lib/layout/main-panel_sr.properties b/core/src/main/resources/lib/layout/main-panel_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..394a52ebe5d4571c610b2a63c63bad855c1f2fe9 --- /dev/null +++ b/core/src/main/resources/lib/layout/main-panel_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Jenkins\ is\ going\ to\ shut\ down=Jenkins \u045B\u0435 \u0441\u0435 \u0443\u0433\u0430\u0441\u0438\u0442\u0438 diff --git a/core/src/main/resources/lib/layout/pane_ru.properties b/core/src/main/resources/lib/layout/pane_ru.properties new file mode 100644 index 0000000000000000000000000000000000000000..26a50666d6d87f39dfa98430496988c094366f07 --- /dev/null +++ b/core/src/main/resources/lib/layout/pane_ru.properties @@ -0,0 +1,23 @@ +# The MIT License +# +# Copyright (c) 2004-, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributors +# +# 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. + +expand=\u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \ No newline at end of file diff --git a/core/src/main/resources/lib/layout/pane_sr.properties b/core/src/main/resources/lib/layout/pane_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..a0e25a9d4b63f60cf8ab0f094a772046b1314727 --- /dev/null +++ b/core/src/main/resources/lib/layout/pane_sr.properties @@ -0,0 +1,4 @@ +# This file is under the MIT License by authors + +expand=\u0420\u0430\u0448\u0438\u0440\u0438 +collapse=\u0421\u043C\u0430\u045A\u0438 diff --git a/core/src/main/resources/lib/layout/progressiveRendering_sr.properties b/core/src/main/resources/lib/layout/progressiveRendering_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..261504a0eeb766a4f19944e18f86d387b60d8b99 --- /dev/null +++ b/core/src/main/resources/lib/layout/progressiveRendering_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +progressMessage=\u041E\u0431\u0440\u0430\u0434\u0430\u045A\u0435... diff --git a/core/src/main/resources/lib/layout/stopButton.jelly b/core/src/main/resources/lib/layout/stopButton.jelly index 4d19c004f4644382e463f2d5c2f236be0bd195df..4fc6b6a127f61cd0a9d83c28ef42681efb90c3bd 100644 --- a/core/src/main/resources/lib/layout/stopButton.jelly +++ b/core/src/main/resources/lib/layout/stopButton.jelly @@ -33,8 +33,20 @@ THE SOFTWARE. Alt text for image. + + If defined, the user will be asked for confirmation first, and the value will be used as question. +
        - - - + + + + + + + + + + + +
        diff --git a/core/src/main/resources/lib/layout/tab.jelly b/core/src/main/resources/lib/layout/tab.jelly index 291661be911a35b7d28e2d71e43d0b771eb30481..9e8bebf6b90e4761a2cae37283119418a3cf4c5e 100644 --- a/core/src/main/resources/lib/layout/tab.jelly +++ b/core/src/main/resources/lib/layout/tab.jelly @@ -22,24 +22,32 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --> - - -
        + + + + The name of the tab + + + The url of the tab + + + Whether the tab is active or not + + + The title of the tab + + + diff --git a/core/src/main/resources/lib/layout/task_sr.properties b/core/src/main/resources/lib/layout/task_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..615977c3700fb9374a15ef5f88b64b5664000d94 --- /dev/null +++ b/core/src/main/resources/lib/layout/task_sr.properties @@ -0,0 +1,3 @@ +# This file is under the MIT License by authors + +Done.=\u0413\u043E\u0442\u043E\u0432\u043E. diff --git a/core/src/main/resources/lib/test/bar_sr.properties b/core/src/main/resources/lib/test/bar_sr.properties new file mode 100644 index 0000000000000000000000000000000000000000..9413a8e3629e1ed93d22f9242313ca55a71fc829 --- /dev/null +++ b/core/src/main/resources/lib/test/bar_sr.properties @@ -0,0 +1,6 @@ +# This file is under the MIT License by authors + +No\ tests=\u041D\u0435\u043C\u0430 \u0442\u0435\u0441\u0442\u043E\u0432\u0430 +failures={0} \u0433\u0440\u0435\u0448\u043A\u0430 +skipped={0} \u043F\u0440\u0435\u0441\u043A\u043E\u0447\u0435\u043D\u043E +tests={0} \u0442\u0435\u0441\u0442\u043E\u0432(\u0430) diff --git a/core/src/main/resources/testng-1.0.dtd b/core/src/main/resources/testng-1.0.dtd index be81e230d108c360c2b8da612cc3787024ff99ee..b1fcbc219c8982303bdc4c989f68146fd7b2a437 100644 --- a/core/src/main/resources/testng-1.0.dtd +++ b/core/src/main/resources/testng-1.0.dtd @@ -137,7 +137,7 @@ - + diff --git a/core/src/main/resources/windows-service/jenkins.xml b/core/src/main/resources/windows-service/jenkins.xml index d677bacf0acb141d16e2eeee22a332909fc7c783..30f22a98fe9e9b3b14030dca98155ef067c69ff6 100644 --- a/core/src/main/resources/windows-service/jenkins.xml +++ b/core/src/main/resources/windows-service/jenkins.xml @@ -1,50 +1,69 @@ - - - - - jenkins - Jenkins - This service runs Jenkins continuous integration system. - - - java - -Xrs -Xmx256m -Dhudson.lifecycle=hudson.lifecycle.WindowsServiceLifecycle -jar "%BASE%\jenkins.war" --httpPort=8080 --webroot="%BASE%\war" - - rotate - - - + + + + + jenkins + Jenkins + This service runs Jenkins automation server. + + + java + -Xrs -Xmx256m -Dhudson.lifecycle=hudson.lifecycle.WindowsServiceLifecycle -jar "%BASE%\jenkins.war" --httpPort=8080 --webroot="%BASE%\war" + + rotate + + + + + + + + %BASE%\jenkins.pid + 10000 + false + + + + + + diff --git a/core/src/test/groovy/hudson/util/SecretRewriterTest.groovy b/core/src/test/groovy/hudson/util/SecretRewriterTest.groovy index 9285f0bcdd6b4bd8e212f16b4fb60066b270ada5..a429bef54e6e393adfb79d3f31a829fc9d9e6440 100644 --- a/core/src/test/groovy/hudson/util/SecretRewriterTest.groovy +++ b/core/src/test/groovy/hudson/util/SecretRewriterTest.groovy @@ -2,6 +2,7 @@ package hudson.util import com.trilead.ssh2.crypto.Base64 import hudson.FilePath +import hudson.Functions import jenkins.security.ConfidentialStoreRule import org.junit.Rule import org.junit.Test @@ -9,6 +10,8 @@ import org.junit.rules.TemporaryFolder import javax.crypto.Cipher +import static org.junit.Assume.assumeFalse + /** * * @@ -23,42 +26,49 @@ class SecretRewriterTest { @Rule public TemporaryFolder tmp = new TemporaryFolder() + def FOO_PATTERN = /\{[A-Za-z0-9+\/]+={0,2}}<\/foo>/ + def MSG_PATTERN = /\{[A-Za-z0-9+\/]+={0,2}}<\/msg>/ + def FOO_PATTERN2 = /(\{[A-Za-z0-9+\/]+={0,2}}<\/foo>){2}/ + def ABC_FOO_PATTERN = /\s\{[A-Za-z0-9+\/]+={0,2}}<\/foo>\s<\/abc>/ + @Test void singleFileRewrite() { def o = encryptOld('foobar') // old def n = encryptNew('foobar') // new roundtrip "${o}", - "${n}" + {assert it ==~ FOO_PATTERN} + roundtrip "${o}${o}", - "${n}${n}" + {assert it ==~ FOO_PATTERN2} roundtrip "${n}", - "${n}" + {assert it == "${n}"} roundtrip " thisIsLegalBase64AndLongEnoughThatItCouldLookLikeSecret ", - " thisIsLegalBase64AndLongEnoughThatItCouldLookLikeSecret " + {assert it == "thisIsLegalBase64AndLongEnoughThatItCouldLookLikeSecret"} // to be rewritten, it needs to be between a tag - roundtrip "$o", "$o" - roundtrip "$o", "$o" + roundtrip "$o", {assert it == "$o"} + roundtrip "$o", {assert it == "$o"} // - roundtrip "\n$o\n", "\n$n\n" + roundtrip "\n$o\n", {assert it ==~ ABC_FOO_PATTERN} } - void roundtrip(String before, String after) { + void roundtrip(String before, Closure check) { def sr = new SecretRewriter(null); def f = File.createTempFile("test", "xml", tmp.root) f.text = before sr.rewrite(f,null) - assert after.replaceAll(System.getProperty("line.separator"), "\n").trim()==f.text.replaceAll(System.getProperty("line.separator"), "\n").trim() + check(f.text.replaceAll(System.getProperty("line.separator"), "\n").trim()) + //assert after.replaceAll(System.getProperty("line.separator"), "\n").trim()==f.text.replaceAll(System.getProperty("line.separator"), "\n").trim() } String encryptOld(str) { def cipher = Secret.getCipher("AES"); - cipher.init(Cipher.ENCRYPT_MODE, Secret.legacyKey); - return new String(Base64.encode(cipher.doFinal((str + Secret.MAGIC).getBytes("UTF-8")))) + cipher.init(Cipher.ENCRYPT_MODE, HistoricalSecrets.legacyKey); + return new String(Base64.encode(cipher.doFinal((str + HistoricalSecrets.MAGIC).getBytes("UTF-8")))) } String encryptNew(str) { @@ -70,8 +80,8 @@ class SecretRewriterTest { */ @Test void recursionDetection() { - def backup = tmp.newFolder("backup") - def sw = new SecretRewriter(backup); + assumeFalse("Symlinks don't work on Windows very well", Functions.isWindows()) + def sw = new SecretRewriter(); def st = StreamTaskListener.fromStdout() def o = encryptOld("Hello world") @@ -100,12 +110,11 @@ class SecretRewriterTest { assert 6==sw.rewriteRecursive(t, st) dirs.each { p-> - assert new File(t,"$p/foo.xml").text.trim()==answer - assert new File(backup,"$p/foo.xml").text.trim()==payload + assert new File(t,"$p/foo.xml").text.trim() ==~ MSG_PATTERN } // t2 is only reachable by following a symlink. this should be covered, too - assert new File(t2,"foo.xml").text.trim()==answer.trim(); + assert new File(t2,"foo.xml").text.trim() ==~ MSG_PATTERN } } diff --git a/core/src/test/groovy/hudson/util/SecretTest.groovy b/core/src/test/groovy/hudson/util/SecretTest.groovy index f7a0ba3ad00a194c86fd1e7b7ca12b10e5512b08..8f39ae7ec026fa093dade93129a4ec31f204e28d 100644 --- a/core/src/test/groovy/hudson/util/SecretTest.groovy +++ b/core/src/test/groovy/hudson/util/SecretTest.groovy @@ -31,7 +31,8 @@ import org.junit.Rule import org.junit.Test import java.util.Random; -import javax.crypto.Cipher; +import javax.crypto.Cipher +import java.util.regex.Pattern; /** * @author Kohsuke Kawaguchi @@ -43,6 +44,8 @@ public class SecretTest { @Rule public MockSecretRule mockSecretRule = new MockSecretRule() + static final Pattern ENCRYPTED_VALUE_PATTERN = Pattern.compile("\\{?[A-Za-z0-9+/]+={0,2}}?"); + @Test void testEncrypt() { def secret = Secret.fromString("abc"); @@ -54,6 +57,11 @@ public class SecretTest { // can we round trip? assert secret==Secret.fromString(secret.encryptedValue); + + //Two consecutive encryption requests of the same object should result in the same encrypted value - SECURITY-304 + assert secret.encryptedValue == secret.encryptedValue + //Two consecutive encryption requests of different objects with the same value should not result in the same encrypted value - SECURITY-304 + assert secret.encryptedValue != Secret.fromString(secret.plainText).encryptedValue } @Test @@ -62,9 +70,16 @@ public class SecretTest { String plaintext = RandomStringUtils.random(new Random().nextInt(i)); String ciphertext = Secret.fromString(plaintext).getEncryptedValue(); //println "${plaintext} → ${ciphertext}" - assert Secret.ENCRYPTED_VALUE_PATTERN.matcher(ciphertext).matches(); + assert ENCRYPTED_VALUE_PATTERN.matcher(ciphertext).matches(); } - assert !Secret.ENCRYPTED_VALUE_PATTERN.matcher("hello world").matches(); + //Not "plain" text + assert !ENCRYPTED_VALUE_PATTERN.matcher("hello world").matches(); + //Not "plain" text + assert !ENCRYPTED_VALUE_PATTERN.matcher("helloworld!").matches(); + //legacy key + assert ENCRYPTED_VALUE_PATTERN.matcher("abcdefghijklmnopqr0123456789").matches(); + //legacy key + assert ENCRYPTED_VALUE_PATTERN.matcher("abcdefghijklmnopqr012345678==").matches(); } @Test @@ -77,7 +92,7 @@ public class SecretTest { def s = Secret.fromString("Mr.Jenkins"); def xml = Jenkins.XSTREAM.toXML(s); assert !xml.contains(s.plainText) - assert xml.contains(s.encryptedValue) + assert xml ==~ /\{[A-Za-z0-9+\/]+={0,2}}<\/hudson\.util\.Secret>/ def o = Jenkins.XSTREAM.fromXML(xml); assert o==s : xml; @@ -104,11 +119,11 @@ public class SecretTest { */ @Test void migrationFromLegacyKeyToConfidentialStore() { - def legacy = Secret.legacyKey + def legacy = HistoricalSecrets.legacyKey ["Hello world","","\u0000unprintable"].each { str -> def cipher = Secret.getCipher("AES"); cipher.init(Cipher.ENCRYPT_MODE, legacy); - def old = new String(Base64.encode(cipher.doFinal((str + Secret.MAGIC).getBytes("UTF-8")))) + def old = new String(Base64.encode(cipher.doFinal((str + HistoricalSecrets.MAGIC).getBytes("UTF-8")))) def s = Secret.fromString(old) assert s.plainText==str : "secret by the old key should decrypt" assert s.encryptedValue!=old : "but when encrypting, ConfidentialKey should be in use" diff --git a/core/src/test/java/hudson/FunctionsTest.java b/core/src/test/java/hudson/FunctionsTest.java index 45f845f181c4e5e364fc978c76e030fb1a2374ea..5656a0a1c595c25da3e117dfee563c999b0043c3 100644 --- a/core/src/test/java/hudson/FunctionsTest.java +++ b/core/src/test/java/hudson/FunctionsTest.java @@ -29,13 +29,18 @@ import hudson.model.Item; import hudson.model.ItemGroup; import hudson.model.TopLevelItem; import hudson.model.View; +import java.io.PrintWriter; +import java.io.StringWriter; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Locale; import java.util.logging.Level; import java.util.logging.LogRecord; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import jenkins.model.Jenkins; +import org.apache.commons.io.IOUtils; import static org.junit.Assert.*; import org.junit.Ignore; import org.junit.Test; @@ -268,7 +273,7 @@ public class FunctionsTest { @Test @PrepareForTest(Stapler.class) - public void testGetActionUrl_unparsable() throws Exception{ + public void testGetActionUrl_unparseable() throws Exception{ assertEquals(null, Functions.getActionUrl(null, createMockAction("http://nowhere.net/stuff?something=^woohoo"))); } @@ -339,4 +344,214 @@ public class FunctionsTest { assertEquals("Bad input <xml/>\n", Functions.printLogRecordHtml(lr, null)[3]); } + @Issue("JDK-6507809") + @Test public void printThrowable() throws Exception { + // Basics: a single exception. No change. + assertPrintThrowable(new Stack("java.lang.NullPointerException: oops", "p.C.method1:17", "m.Main.main:1"), + "java.lang.NullPointerException: oops\n" + + "\tat p.C.method1(C.java:17)\n" + + "\tat m.Main.main(Main.java:1)\n", + "java.lang.NullPointerException: oops\n" + + "\tat p.C.method1(C.java:17)\n" + + "\tat m.Main.main(Main.java:1)\n"); + // try {…} catch (Exception x) {throw new IllegalStateException(x);} + assertPrintThrowable(new Stack("java.lang.IllegalStateException: java.lang.NullPointerException: oops", "p.C.method1:19", "m.Main.main:1"). + cause(new Stack("java.lang.NullPointerException: oops", "p.C.method2:23", "p.C.method1:17", "m.Main.main:1")), + "java.lang.IllegalStateException: java.lang.NullPointerException: oops\n" + + "\tat p.C.method1(C.java:19)\n" + + "\tat m.Main.main(Main.java:1)\n" + + "Caused by: java.lang.NullPointerException: oops\n" + + "\tat p.C.method2(C.java:23)\n" + + "\tat p.C.method1(C.java:17)\n" + + "\t... 1 more\n", + "java.lang.NullPointerException: oops\n" + + "\tat p.C.method2(C.java:23)\n" + + "\tat p.C.method1(C.java:17)\n" + + "Caused: java.lang.IllegalStateException\n" + + "\tat p.C.method1(C.java:19)\n" + + "\tat m.Main.main(Main.java:1)\n"); + // try {…} catch (Exception x) {throw new IllegalStateException("more info");} + assertPrintThrowable(new Stack("java.lang.IllegalStateException: more info", "p.C.method1:19", "m.Main.main:1"). + cause(new Stack("java.lang.NullPointerException: oops", "p.C.method2:23", "p.C.method1:17", "m.Main.main:1")), + "java.lang.IllegalStateException: more info\n" + + "\tat p.C.method1(C.java:19)\n" + + "\tat m.Main.main(Main.java:1)\n" + + "Caused by: java.lang.NullPointerException: oops\n" + + "\tat p.C.method2(C.java:23)\n" + + "\tat p.C.method1(C.java:17)\n" + + "\t... 1 more\n", + "java.lang.NullPointerException: oops\n" + + "\tat p.C.method2(C.java:23)\n" + + "\tat p.C.method1(C.java:17)\n" + + "Caused: java.lang.IllegalStateException: more info\n" + + "\tat p.C.method1(C.java:19)\n" + + "\tat m.Main.main(Main.java:1)\n"); + // try {…} catch (Exception x) {throw new IllegalStateException("more info: " + x);} + assertPrintThrowable(new Stack("java.lang.IllegalStateException: more info: java.lang.NullPointerException: oops", "p.C.method1:19", "m.Main.main:1"). + cause(new Stack("java.lang.NullPointerException: oops", "p.C.method2:23", "p.C.method1:17", "m.Main.main:1")), + "java.lang.IllegalStateException: more info: java.lang.NullPointerException: oops\n" + + "\tat p.C.method1(C.java:19)\n" + + "\tat m.Main.main(Main.java:1)\n" + + "Caused by: java.lang.NullPointerException: oops\n" + + "\tat p.C.method2(C.java:23)\n" + + "\tat p.C.method1(C.java:17)\n" + + "\t... 1 more\n", + "java.lang.NullPointerException: oops\n" + + "\tat p.C.method2(C.java:23)\n" + + "\tat p.C.method1(C.java:17)\n" + + "Caused: java.lang.IllegalStateException: more info\n" + + "\tat p.C.method1(C.java:19)\n" + + "\tat m.Main.main(Main.java:1)\n"); + // Synthetic stack showing an exception made elsewhere, such as happens with hudson.remoting.Channel.attachCallSiteStackTrace. + Throwable t = new Stack("remote.Exception: oops", "remote.Place.method:17", "remote.Service.run:9"); + StackTraceElement[] callSite = new Stack("wrapped.Exception", "local.Side.call:11", "local.Main.main:1").getStackTrace(); + StackTraceElement[] original = t.getStackTrace(); + StackTraceElement[] combined = new StackTraceElement[original.length + 1 + callSite.length]; + System.arraycopy(original, 0, combined, 0, original.length); + combined[original.length] = new StackTraceElement(".....", "remote call", null, -2); + System.arraycopy(callSite,0,combined,original.length+1,callSite.length); + t.setStackTrace(combined); + assertPrintThrowable(t, + "remote.Exception: oops\n" + + "\tat remote.Place.method(Place.java:17)\n" + + "\tat remote.Service.run(Service.java:9)\n" + + "\tat ......remote call(Native Method)\n" + + "\tat local.Side.call(Side.java:11)\n" + + "\tat local.Main.main(Main.java:1)\n", + "remote.Exception: oops\n" + + "\tat remote.Place.method(Place.java:17)\n" + + "\tat remote.Service.run(Service.java:9)\n" + + "\tat ......remote call(Native Method)\n" + + "\tat local.Side.call(Side.java:11)\n" + + "\tat local.Main.main(Main.java:1)\n"); + // Same but now using a cause on the remote side. + t = new Stack("remote.Wrapper: remote.Exception: oops", "remote.Place.method2:19", "remote.Service.run:9").cause(new Stack("remote.Exception: oops", "remote.Place.method1:11", "remote.Place.method2:17", "remote.Service.run:9")); + callSite = new Stack("wrapped.Exception", "local.Side.call:11", "local.Main.main:1").getStackTrace(); + original = t.getStackTrace(); + combined = new StackTraceElement[original.length + 1 + callSite.length]; + System.arraycopy(original, 0, combined, 0, original.length); + combined[original.length] = new StackTraceElement(".....", "remote call", null, -2); + System.arraycopy(callSite,0,combined,original.length+1,callSite.length); + t.setStackTrace(combined); + assertPrintThrowable(t, + "remote.Wrapper: remote.Exception: oops\n" + + "\tat remote.Place.method2(Place.java:19)\n" + + "\tat remote.Service.run(Service.java:9)\n" + + "\tat ......remote call(Native Method)\n" + + "\tat local.Side.call(Side.java:11)\n" + + "\tat local.Main.main(Main.java:1)\n" + + "Caused by: remote.Exception: oops\n" + + "\tat remote.Place.method1(Place.java:11)\n" + + "\tat remote.Place.method2(Place.java:17)\n" + + "\tat remote.Service.run(Service.java:9)\n", + "remote.Exception: oops\n" + + "\tat remote.Place.method1(Place.java:11)\n" + + "\tat remote.Place.method2(Place.java:17)\n" + + "\tat remote.Service.run(Service.java:9)\n" + // we do not know how to elide the common part in this case + "Caused: remote.Wrapper\n" + + "\tat remote.Place.method2(Place.java:19)\n" + + "\tat remote.Service.run(Service.java:9)\n" + + "\tat ......remote call(Native Method)\n" + + "\tat local.Side.call(Side.java:11)\n" + + "\tat local.Main.main(Main.java:1)\n"); + // Suppressed exceptions: + assertPrintThrowable(new Stack("java.lang.IllegalStateException: java.lang.NullPointerException: oops", "p.C.method1:19", "m.Main.main:1"). + cause(new Stack("java.lang.NullPointerException: oops", "p.C.method2:23", "p.C.method1:17", "m.Main.main:1")). + suppressed(new Stack("java.io.IOException: could not close", "p.C.close:99", "p.C.method1:18", "m.Main.main:1"), + new Stack("java.io.IOException: java.lang.NullPointerException", "p.C.flush:77", "p.C.method1:18", "m.Main.main:1"). + cause(new Stack("java.lang.NullPointerException", "p.C.findFlushee:70", "p.C.flush:75", "p.C.method1:18", "m.Main.main:1"))), + "java.lang.IllegalStateException: java.lang.NullPointerException: oops\n" + + "\tat p.C.method1(C.java:19)\n" + + "\tat m.Main.main(Main.java:1)\n" + + "\tSuppressed: java.io.IOException: could not close\n" + + "\t\tat p.C.close(C.java:99)\n" + + "\t\tat p.C.method1(C.java:18)\n" + + "\t\t... 1 more\n" + + "\tSuppressed: java.io.IOException: java.lang.NullPointerException\n" + + "\t\tat p.C.flush(C.java:77)\n" + + "\t\tat p.C.method1(C.java:18)\n" + + "\t\t... 1 more\n" + + "\tCaused by: java.lang.NullPointerException\n" + + "\t\tat p.C.findFlushee(C.java:70)\n" + + "\t\tat p.C.flush(C.java:75)\n" + + "\t\t... 2 more\n" + + "Caused by: java.lang.NullPointerException: oops\n" + + "\tat p.C.method2(C.java:23)\n" + + "\tat p.C.method1(C.java:17)\n" + + "\t... 1 more\n", + "java.lang.NullPointerException: oops\n" + + "\tat p.C.method2(C.java:23)\n" + + "\tat p.C.method1(C.java:17)\n" + + "Also: java.io.IOException: could not close\n" + + "\t\tat p.C.close(C.java:99)\n" + + "\t\tat p.C.method1(C.java:18)\n" + + "Also: java.lang.NullPointerException\n" + + "\t\tat p.C.findFlushee(C.java:70)\n" + + "\t\tat p.C.flush(C.java:75)\n" + + "\tCaused: java.io.IOException\n" + + "\t\tat p.C.flush(C.java:77)\n" + + "\t\tat p.C.method1(C.java:18)\n" + + "Caused: java.lang.IllegalStateException\n" + + "\tat p.C.method1(C.java:19)\n" + + "\tat m.Main.main(Main.java:1)\n"); + // Custom printStackTrace implementations: + assertPrintThrowable(new Throwable() { + @Override + public void printStackTrace(PrintWriter s) { + s.println("Some custom exception"); + } + }, "Some custom exception\n", "Some custom exception\n"); + // Circular references: + Stack stack1 = new Stack("p.Exc1", "p.C.method1:17"); + Stack stack2 = new Stack("p.Exc2", "p.C.method2:27"); + stack1.cause(stack2); + stack2.cause(stack1); + assertPrintThrowable(stack1, + "p.Exc1\n" + + "\tat p.C.method1(C.java:17)\n" + + "Caused by: p.Exc2\n" + + "\tat p.C.method2(C.java:27)\n" + + "\t[CIRCULAR REFERENCE:p.Exc1]\n", + "\n" + + "Caused: p.Exc2\n" + + "\tat p.C.method2(C.java:27)\n" + + "Caused: p.Exc1\n" + + "\tat p.C.method1(C.java:17)\n"); + } + private static void assertPrintThrowable(Throwable t, String traditional, String custom) { + StringWriter sw = new StringWriter(); + t.printStackTrace(new PrintWriter(sw)); + assertEquals(sw.toString().replace(IOUtils.LINE_SEPARATOR, "\n"), traditional); + String actual = Functions.printThrowable(t); + System.out.println(actual); + assertEquals(actual.replace(IOUtils.LINE_SEPARATOR, "\n"), custom); + } + private static final class Stack extends Throwable { + private static final Pattern LINE = Pattern.compile("(.+)[.](.+)[.](.+):(\\d+)"); + private final String toString; + Stack(String toString, String... stack) { + this.toString = toString; + StackTraceElement[] lines = new StackTraceElement[stack.length]; + for (int i = 0; i < stack.length; i++) { + Matcher m = LINE.matcher(stack[i]); + assertTrue(m.matches()); + lines[i] = new StackTraceElement(m.group(1) + "." + m.group(2), m.group(3), m.group(2) + ".java", Integer.parseInt(m.group(4))); + } + setStackTrace(lines); + } + @Override + public String toString() { + return toString; + } + synchronized Stack cause(Throwable cause) { + return (Stack) initCause(cause); + } + synchronized Stack suppressed(Throwable... suppressed) { + for (Throwable t : suppressed) { + addSuppressed(t); + } + return this; + } + } + } diff --git a/core/src/test/java/hudson/PluginManagerTest.java b/core/src/test/java/hudson/PluginManagerTest.java index da8e6a5a8896c13ec255894ef04bde3d66d719c8..483eaa467860eeaae6af9d3bd8e0173e9edaba7e 100644 --- a/core/src/test/java/hudson/PluginManagerTest.java +++ b/core/src/test/java/hudson/PluginManagerTest.java @@ -24,17 +24,33 @@ package hudson; +import java.io.File; +import java.io.FileOutputStream; import org.apache.tools.ant.filters.StringInputStream; import org.junit.Test; import org.xml.sax.SAXException; import java.io.IOException; +import java.io.InputStream; +import java.net.JarURLConnection; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.jar.Attributes; +import java.util.jar.Manifest; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; +import java.util.zip.ZipOutputStream; +import org.apache.commons.io.FileUtils; +import static org.hamcrest.CoreMatchers.*; import static org.hamcrest.core.IsInstanceOf.instanceOf; import static org.hamcrest.core.StringContains.containsString; import static org.junit.Assert.*; import org.junit.Rule; import org.junit.rules.TemporaryFolder; import org.jvnet.hudson.test.Issue; - + +/** + * Tests of {@link PluginManager}. + */ public class PluginManagerTest { @Rule public TemporaryFolder tmp = new TemporaryFolder(); @@ -68,4 +84,86 @@ public class PluginManagerTest { assertThat(ex.getCause().getMessage(), containsString("Refusing to resolve entity with publicId(null) and systemId (file:///)")); } } + + @Test + public void shouldProperlyParseManifestFromJar() throws IOException { + File jar = createHpiWithManifest(); + final Manifest manifest = PluginManager.parsePluginManifest(jar.toURI().toURL()); + + assertThat("manifest should have been read from the sample", manifest, notNullValue()); + assertAttribute(manifest, "Created-By", "Apache Maven"); + assertAttribute(manifest, "Short-Name", "matrix-auth"); + + // Multi-line entries + assertAttribute(manifest, "Specification-Title", "Offers matrix-based security authorization strategies (global and per-project)."); + assertAttribute(manifest, "Url", "http://wiki.jenkins-ci.org/display/JENKINS/Matrix+Authorization+Strategy+Plugin"); + + // Empty field + assertAttribute(manifest, "Plugin-Developers", null); + } + + @Test + public void shouldProperlyRetrieveModificationDate() throws IOException { + File jar = createHpiWithManifest(); + URL url = toManifestUrl(jar); + assertThat("Manifest last modified date should be equal to the file date", + PluginManager.getModificationDate(url), + equalTo(jar.lastModified())); + } + + private static void assertAttribute(Manifest manifest, String attributeName, String value) throws AssertionError { + Attributes attributes = manifest.getMainAttributes(); + assertThat("Main attributes must not be empty", attributes, notNullValue()); + assertThat("Attribute '" + attributeName + "' does not match the sample", + attributes.getValue(attributeName), + equalTo(value)); + + } + + private static final String SAMPLE_MANIFEST_FILE = "Manifest-Version: 1.0\n" + + "Archiver-Version: Plexus Archiver\n" + + "Created-By: Apache Maven\n" + + "Built-By: jglick\n" + + "Build-Jdk: 1.8.0_92\n" + + "Extension-Name: matrix-auth\n" + + "Specification-Title: \n" + + " Offers matrix-based security \n" + + " authorization strate\n" + + " gies (global and per-project).\n" + + "Implementation-Title: matrix-auth\n" + + "Implementation-Version: 1.4\n" + + "Group-Id: org.jenkins-ci.plugins\n" + + "Short-Name: matrix-auth\n" + + "Long-Name: Matrix Authorization Strategy Plugin\n" + + "Url: http://wiki.jenkins-ci.org/display/JENKINS/Matrix+Authorization+S\n" + + " trategy+Plugin\n" + + "Plugin-Version: 1.4\n" + + "Hudson-Version: 1.609.1\n" + + "Jenkins-Version: 1.609.1\n" + + "Plugin-Dependencies: icon-shim:2.0.3,cloudbees-folder:5.2.2;resolution\n" + + " :=optional\n" + + "Plugin-Developers: "; + + private File createHpiWithManifest() throws IOException { + File newFolder = tmp.newFolder("myJar"); + String manifestPath = "META-INF/MANIFEST.MF"; + new File("META-INF").mkdir(); + FileUtils.write(new File(newFolder, manifestPath), SAMPLE_MANIFEST_FILE); + + final File f = new File(tmp.getRoot(), "my.hpi"); + try(ZipOutputStream out = new ZipOutputStream(new FileOutputStream(f))) { + ZipEntry e = new ZipEntry(manifestPath); + out.putNextEntry(e); + byte[] data = SAMPLE_MANIFEST_FILE.getBytes(); + out.write(data, 0, data.length); + out.closeEntry(); + } + return f; + } + + + private URL toManifestUrl(File jarFile) throws MalformedURLException { + final String manifestPath = "META-INF/MANIFEST.MF"; + return new URL("jar:" + jarFile.toURI().toURL() + "!/" + manifestPath); + } } diff --git a/core/src/test/java/hudson/PluginWrapperTest.java b/core/src/test/java/hudson/PluginWrapperTest.java index f9ffe3dd4eaa2f8b84f8decc2e6d53bf5951f5c2..177cdf834b83b9e4713402561fe2e8ba1de0b278 100644 --- a/core/src/test/java/hudson/PluginWrapperTest.java +++ b/core/src/test/java/hudson/PluginWrapperTest.java @@ -1,11 +1,34 @@ package hudson; +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.jar.Attributes; +import java.util.jar.Manifest; + +import jenkins.model.Jenkins; +import org.junit.Before; import org.junit.Test; +import org.mockito.invocation.InvocationOnMock; +import org.mockito.stubbing.Answer; +import static org.hamcrest.CoreMatchers.containsString; +import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.fail; +import static org.mockito.Matchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; public class PluginWrapperTest { + @Before + public void before() throws Exception { + Jenkins.VERSION = "2.0"; // Some value needed - tests will overwrite if necessary + } + @Test public void dependencyTest() { String version = "plugin:0.0.2"; @@ -23,4 +46,138 @@ public class PluginWrapperTest { assertEquals("0.0.2", dependency.version); assertEquals(true, dependency.optional); } -} \ No newline at end of file + + @Test + public void jenkinsCoreTooOld() throws Exception { + PluginWrapper pw = pluginWrapper("fake").requiredCoreVersion("3.0").buildLoaded(); + try { + pw.resolvePluginDependencies(); + fail(); + } catch (IOException ex) { + assertContains(ex, "fake v42 failed to load", "update Jenkins from v2.0 to v3.0"); + } + } + + @Test + public void dependencyNotInstalled() throws Exception { + PluginWrapper pw = pluginWrapper("dependee").deps("dependency:42").buildLoaded(); + try { + pw.resolvePluginDependencies(); + fail(); + } catch (IOException ex) { + assertContains(ex, "dependee v42 failed to load", "dependency v42 is missing. To fix, install v42 or later"); + } + } + + @Test + public void dependencyOutdated() throws Exception { + pluginWrapper("dependency").version("3").buildLoaded(); + PluginWrapper pw = pluginWrapper("dependee").deps("dependency:5").buildLoaded(); + try { + pw.resolvePluginDependencies(); + fail(); + } catch (IOException ex) { + assertContains(ex, "dependee v42 failed to load", "dependency v3 is older than required. To fix, install v5 or later"); + } + } + + @Test + public void dependencyFailedToLoad() throws Exception { + pluginWrapper("dependency").version("5").buildFailed(); + PluginWrapper pw = pluginWrapper("dependee").deps("dependency:3").buildLoaded(); + try { + pw.resolvePluginDependencies(); + fail(); + } catch (IOException ex) { + assertContains(ex, "dependee v42 failed to load", "dependency v5 failed to load. Fix this plugin first"); + } + } + + private void assertContains(Throwable ex, String... patterns) { + String msg = ex.getMessage(); + for (String pattern : patterns) { + assertThat(msg, containsString(pattern)); + } + } + + private PluginWrapperBuilder pluginWrapper(String name) { + return new PluginWrapperBuilder(name); + } + + // per test + private final HashMap plugins = new HashMap<>(); + private final PluginManager pm = mock(PluginManager.class); + { + when(pm.getPlugin(any(String.class))).thenAnswer(new Answer() { + @Override public PluginWrapper answer(InvocationOnMock invocation) throws Throwable { + return plugins.get(invocation.getArguments()[0]); + } + }); + } + private final class PluginWrapperBuilder { + private String name; + private String version = "42"; + private String requiredCoreVersion = "1.0"; + private List deps = new ArrayList<>(); + private List optDeps = new ArrayList<>(); + + private PluginWrapperBuilder(String name) { + this.name = name; + } + + public PluginWrapperBuilder version(String version) { + this.version = version; + return this; + } + + public PluginWrapperBuilder requiredCoreVersion(String requiredCoreVersion) { + this.requiredCoreVersion = requiredCoreVersion; + return this; + } + + public PluginWrapperBuilder deps(String... deps) { + for (String dep: deps) { + this.deps.add(new PluginWrapper.Dependency(dep)); + } + return this; + } + + public PluginWrapperBuilder optDeps(String... optDeps) { + for (String dep: optDeps) { + this.optDeps.add(new PluginWrapper.Dependency(dep)); + } + return this; + } + + private PluginWrapper buildLoaded() { + PluginWrapper pw = build(); + plugins.put(name, pw); + return pw; + } + + private PluginWrapper buildFailed() { + PluginWrapper pw = build(); + PluginWrapper.NOTICE.addPlugin(pw); + return pw; + } + + private PluginWrapper build() { + Manifest manifest = mock(Manifest.class); + Attributes attributes = new Attributes(); + attributes.put(new Attributes.Name("Short-Name"), name); + attributes.put(new Attributes.Name("Jenkins-Version"), requiredCoreVersion); + attributes.put(new Attributes.Name("Plugin-Version"), version); + when(manifest.getMainAttributes()).thenReturn(attributes); + return new PluginWrapper( + pm, + new File("/tmp/" + name + ".jpi"), + manifest, + null, + null, + new File("/tmp/" + name + ".jpi.disabled"), + deps, + optDeps + ); + } + } +} diff --git a/core/src/test/java/hudson/RemoveWindowsDirectoryJunctionTest.java b/core/src/test/java/hudson/RemoveWindowsDirectoryJunctionTest.java new file mode 100644 index 0000000000000000000000000000000000000000..cd631503c31e8998983b5bfa4175bfdb74a28d8a --- /dev/null +++ b/core/src/test/java/hudson/RemoveWindowsDirectoryJunctionTest.java @@ -0,0 +1,48 @@ +/* + * + */ +package hudson; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.junit.Assume.assumeTrue; + +import java.io.File; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; +import org.jvnet.hudson.test.Issue; + +public class RemoveWindowsDirectoryJunctionTest { + @Rule + public TemporaryFolder tmp = new TemporaryFolder(); + + @Before + public void windowsOnly() { + assumeTrue(Functions.isWindows()); + } + + @Test + @Issue("JENKINS-2995") + public void testJunctionIsRemovedButNotContents() throws Exception { + File subdir1 = tmp.newFolder("notJunction"); + File f1 = new File(subdir1, "testfile1.txt"); + assertTrue("Unable to create temporary file in notJunction directory", f1.createNewFile()); + File j1 = makeJunction(tmp.getRoot(), subdir1); + Util.deleteRecursive(j1); + assertFalse("Windows Junction should have been removed", j1.exists()); + assertTrue("Contents of Windows Junction should not be removed", f1.exists()); + } + + private File makeJunction(File baseDir, File pointToDir) throws Exception { + File junc = new File(baseDir, "test Junction"); + String cmd = "mklink /J \"" + junc.getPath() + "\" \"" + pointToDir.getPath() + "\""; + ProcessBuilder pb = new ProcessBuilder("cmd.exe", "/C", cmd); + pb.inheritIO(); + Process p = pb.start(); + assertEquals("Running mklink failed (cmd=" + cmd + ")", 0, p.waitFor()); + return junc; + } +} diff --git a/core/src/test/java/hudson/UtilTest.java b/core/src/test/java/hudson/UtilTest.java index fe44a9630ce85b54e51d393d417be0300b249f8d..b733eecefed617df742e4c70facf80148d6f1de6 100644 --- a/core/src/test/java/hudson/UtilTest.java +++ b/core/src/test/java/hudson/UtilTest.java @@ -441,16 +441,16 @@ public class UtilTest { Util.WAIT_BETWEEN_DELETION_RETRIES = -1000; Util.GC_AFTER_FAILED_DELETE = true; final AtomicReference thrown = new AtomicReference(); - Thread deleteToBeInterupted = new Thread("deleteToBeInterupted") { + Thread deleteToBeInterrupted = new Thread("deleteToBeInterrupted") { public void run() { try { Util.deleteRecursive(dir); } catch( Throwable x ) { thrown.set(x); } } }; - deleteToBeInterupted.start(); - deleteToBeInterupted.interrupt(); - deleteToBeInterupted.join(500); - assertFalse("deletion stopped", deleteToBeInterupted.isAlive()); + deleteToBeInterrupted.start(); + deleteToBeInterrupted.interrupt(); + deleteToBeInterrupted.join(500); + assertFalse("deletion stopped", deleteToBeInterrupted.isAlive()); assertTrue("d1f1 still exists", d1f1.exists()); unlockFileForDeletion(d1f1); Throwable deletionInterruptedEx = thrown.get(); diff --git a/core/src/test/java/hudson/model/AbstractItemTest.java b/core/src/test/java/hudson/model/AbstractItemTest.java index 82ada9dea5adad703aa1903650e12df3a1894204..79507b4335a0e31c74c4b9f7b264bb3bc0eb8790 100644 --- a/core/src/test/java/hudson/model/AbstractItemTest.java +++ b/core/src/test/java/hudson/model/AbstractItemTest.java @@ -21,7 +21,7 @@ public class AbstractItemTest { protected StubAbstractItem() { // sending in null as parent as I don't care for my current tests - super(null, "StubAbatractItem"); + super(null, "StubAbstractItem"); } @SuppressWarnings("rawtypes") diff --git a/core/src/test/java/hudson/model/ActionableTest.java b/core/src/test/java/hudson/model/ActionableTest.java index 4f454050808d63d215070cfc3e949ae80b0e0a51..550a8853969d9bcd596fe12803430332b60aa9e2 100644 --- a/core/src/test/java/hudson/model/ActionableTest.java +++ b/core/src/test/java/hudson/model/ActionableTest.java @@ -24,18 +24,26 @@ package hudson.model; +import java.util.ArrayList; import java.util.Arrays; + +import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.*; + +import java.util.Collections; +import java.util.List; + +import org.junit.Assert; import org.junit.Test; +import org.jvnet.hudson.test.Issue; public class ActionableTest { + private Actionable thing = new ActionableImpl(); + @SuppressWarnings("deprecation") - @Test public void replaceAction() { - Actionable thing = new Actionable() { - @Override public String getDisplayName() {return null;} - @Override public String getSearchUrl() {return null;} - }; + @Test + public void replaceAction() { CauseAction a1 = new CauseAction(); ParametersAction a2 = new ParametersAction(); thing.addAction(a1); @@ -45,4 +53,168 @@ public class ActionableTest { assertEquals(Arrays.asList(a2, a3), thing.getActions()); } + static class ActionableOverride extends Actionable { + ArrayList specialActions = new ArrayList(); + + @Override + public String getDisplayName() { + return "nope"; + } + + @Override + public String getSearchUrl() { + return "morenope"; + } + + @Override + public List getActions() { + return specialActions; + } + } + + @SuppressWarnings("deprecation") + @Issue("JENKINS-39555") + @Test + public void testExtensionOverrides() throws Exception { + ActionableOverride myOverridden = new ActionableOverride(); + InvisibleAction invis = new InvisibleAction() { + }; + myOverridden.addAction(invis); + Assert.assertArrayEquals(new Object[]{invis}, myOverridden.specialActions.toArray()); + Assert.assertArrayEquals(new Object[]{invis}, myOverridden.getActions().toArray()); + + myOverridden.getActions().remove(invis); + Assert.assertArrayEquals(new Object[]{}, myOverridden.specialActions.toArray()); + Assert.assertArrayEquals(new Object[]{}, myOverridden.getActions().toArray()); + + myOverridden.addAction(invis); + myOverridden.removeAction(invis); + Assert.assertArrayEquals(new Object[]{}, myOverridden.specialActions.toArray()); + Assert.assertArrayEquals(new Object[]{}, myOverridden.getActions().toArray()); + + InvisibleAction invis2 = new InvisibleAction() {}; + myOverridden.addOrReplaceAction(invis2); + Assert.assertArrayEquals(new Object[]{invis2}, myOverridden.specialActions.toArray()); + Assert.assertArrayEquals(new Object[]{invis2}, myOverridden.getActions().toArray()); + + myOverridden.addOrReplaceAction(invis); + myOverridden.addOrReplaceAction(invis); + Assert.assertArrayEquals(new Object[]{invis2, invis}, myOverridden.specialActions.toArray()); + Assert.assertArrayEquals(new Object[]{invis2, invis}, myOverridden.getActions().toArray()); + } + + @SuppressWarnings("deprecation") + @Test + public void addOrReplaceAction() { + CauseAction a1 = new CauseAction(); + ParametersAction a2 = new ParametersAction(); + thing.addAction(a1); + thing.addAction(a2); + CauseAction a3 = new CauseAction(); + assertTrue(thing.addOrReplaceAction(a3)); + assertEquals(Arrays.asList(a2, a3), thing.getActions()); + assertFalse(thing.addOrReplaceAction(a3)); + assertEquals(Arrays.asList(a2, a3), thing.getActions()); + thing.addAction(a1); + assertEquals(Arrays.asList(a2, a3, a1), thing.getActions()); + assertTrue(thing.addOrReplaceAction(a3)); + assertEquals(Arrays.asList(a2, a3), thing.getActions()); + } + + @SuppressWarnings("deprecation") + @Test + public void replaceActions() { + CauseAction a1 = new CauseAction(); + ParametersAction a2 = new ParametersAction(); + thing.addAction(a1); + thing.addAction(a2); + CauseAction a3 = new CauseAction(); + assertTrue(thing.replaceActions(CauseAction.class, a3)); + assertEquals(Arrays.asList(a2, a3), thing.getActions()); + assertFalse(thing.replaceActions(CauseAction.class, a3)); + assertEquals(Arrays.asList(a2, a3), thing.getActions()); + } + + @SuppressWarnings("deprecation") + @Test + public void removeAction() { + CauseAction a1 = new CauseAction(); + ParametersAction a2 = new ParametersAction(); + thing.addAction(a1); + thing.addAction(a2); + assertEquals(Arrays.asList(a1, a2), thing.getActions()); + assertThat(thing.removeAction(a1), is(true)); + assertEquals(Arrays.asList(a2), thing.getActions()); + assertThat(thing.removeAction(a1), is(false)); + assertEquals(Arrays.asList(a2), thing.getActions()); + assertThat(thing.removeAction(null), is(false)); + assertEquals(Arrays.asList(a2), thing.getActions()); + } + + @SuppressWarnings("deprecation") + @Test + public void removeActions() { + CauseAction a1 = new CauseAction(); + ParametersAction a2 = new ParametersAction(); + thing.addAction(a1); + thing.addAction(a2); + assertEquals(Arrays.asList(a1, a2), thing.getActions()); + assertThat(thing.removeActions(CauseAction.class), is(true)); + assertEquals(Arrays.asList(a2), thing.getActions()); + assertThat(thing.removeActions(CauseAction.class), is(false)); + assertEquals(Arrays.asList(a2), thing.getActions()); + } + + @SuppressWarnings("deprecation") + @Test + public void addAction() { + CauseAction a1 = new CauseAction(); + ParametersAction a2 = new ParametersAction(); + assertEquals(Collections.emptyList(), thing.getActions()); + thing.addAction(a1); + assertEquals(Collections.singletonList(a1), thing.getActions()); + thing.addAction(a2); + assertEquals(Arrays.asList(a1, a2), thing.getActions()); + } + + @Test(expected = IllegalArgumentException.class) + public void addAction_null() { + thing.addAction(null); + } + + @Test(expected = IllegalArgumentException.class) + public void replaceAction_null() { + thing.replaceAction(null); + } + + @Test(expected = IllegalArgumentException.class) + public void replaceActions_null() { + thing.replaceActions(CauseAction.class, null); + } + + @Test(expected = IllegalArgumentException.class) + public void replaceActions_null_null() { + thing.replaceActions(null, null); + } + + @Test(expected = IllegalArgumentException.class) + public void addOrReplaceAction_null() { + thing.addOrReplaceAction(null); + } + + @Test + public void removeAction_null() { + assertFalse(thing.removeAction(null)); + } + + @Test(expected = IllegalArgumentException.class) + public void removeActions_null() { + thing.removeActions(null); + } + + private static class ActionableImpl extends Actionable { + @Override public String getDisplayName() {return null;} + + @Override public String getSearchUrl() {return null;} + } } diff --git a/core/src/test/java/hudson/model/FileParameterValueTest.java b/core/src/test/java/hudson/model/FileParameterValueTest.java index 13f6e339dad982146811cc4f31367d27891aca38..0b079da122be17434f115d4a7c98730fd62973c1 100644 --- a/core/src/test/java/hudson/model/FileParameterValueTest.java +++ b/core/src/test/java/hudson/model/FileParameterValueTest.java @@ -43,8 +43,8 @@ public class FileParameterValueTest { final FileParameterValue param1 = new FileParameterValue(paramName, new File("ws_param1.txt"), "param1.txt"); final FileParameterValue param2 = new FileParameterValue(paramName, new File("ws_param2.txt"), "param2.txt"); - assertNotEquals("Files with same locations shoud be considered as different", param1, param2); - assertNotEquals("Files with same locations shoud be considered as different", param2, param1); + assertNotEquals("Files with same locations should be considered as different", param1, param2); + assertNotEquals("Files with same locations should be considered as different", param2, param1); } @Test public void compareNullParams() { diff --git a/core/src/test/java/hudson/model/ListViewTest.java b/core/src/test/java/hudson/model/ListViewTest.java index 7de805913b5d3c324e70a40ae3ba2cb624a4f827..f184aac9a24679d1404133cf841094512ba16391 100644 --- a/core/src/test/java/hudson/model/ListViewTest.java +++ b/core/src/test/java/hudson/model/ListViewTest.java @@ -30,7 +30,7 @@ public class ListViewTest { mockStatic(Items.class); mockStatic(ListViewColumn.class); List columns = Collections.emptyList(); - when(ListViewColumn.createDefaultInitialColumnList()).thenReturn(columns); + when(ListViewColumn.createDefaultInitialColumnList(ListView.class)).thenReturn(columns); ViewGroup owner = mock(ViewGroup.class); ItemGroup itemGroupOwner = mock(ItemGroup.class); when(owner.getItemGroup()).thenReturn(itemGroupOwner); @@ -49,7 +49,7 @@ public class ListViewTest { mockStatic(Items.class); mockStatic(ListViewColumn.class); List columns = Collections.emptyList(); - when(ListViewColumn.createDefaultInitialColumnList()).thenReturn(columns); + when(ListViewColumn.createDefaultInitialColumnList(ListView.class)).thenReturn(columns); ViewGroup owner = mock(ViewGroup.class); ItemGroup ig = mock(ItemGroup.class); when(owner.getItemGroup()).thenReturn(ig); diff --git a/core/src/test/java/hudson/model/RunTest.java b/core/src/test/java/hudson/model/RunTest.java index ef4d51e514361461a3ced22e6e6578ab91c170ca..eb27dc69c2c550046c66572ff4db6cf213a2d2bf 100644 --- a/core/src/test/java/hudson/model/RunTest.java +++ b/core/src/test/java/hudson/model/RunTest.java @@ -159,7 +159,7 @@ public class RunTest { Job j = Mockito.mock(Job.class); File tempBuildDir = tmp.newFolder(); Mockito.when(j.getBuildDir()).thenReturn(tempBuildDir); - Run r = new Run(j, 0) {}; + Run, ? extends Run> r = new Run(j, 0) {}; File f = r.getLogFile(); f.getParentFile().mkdirs(); PrintWriter w = new PrintWriter(f, "utf-8"); @@ -169,4 +169,47 @@ public class RunTest { assertTrue(logLines.isEmpty()); } + @Test + public void getLogReturnsAnRightOrder() throws Exception { + Job j = Mockito.mock(Job.class); + File tempBuildDir = tmp.newFolder(); + Mockito.when(j.getBuildDir()).thenReturn(tempBuildDir); + Run, ? extends Run> r = new Run(j, 0) {}; + File f = r.getLogFile(); + f.getParentFile().mkdirs(); + PrintWriter w = new PrintWriter(f, "utf-8"); + for (int i = 0; i < 20; i++) { + w.println("dummy" + i); + } + + w.close(); + List logLines = r.getLog(10); + assertFalse(logLines.isEmpty()); + + for (int i = 1; i < 10; i++) { + assertEquals("dummy" + (10+i), logLines.get(i)); + } + int truncatedCount = 10* ("dummyN".length() + System.getProperty("line.separator").length()) - 2; + assertEquals("[...truncated "+truncatedCount+" B...]", logLines.get(0)); + } + + @Test + public void getLogReturnsAllLines() throws Exception { + Job j = Mockito.mock(Job.class); + File tempBuildDir = tmp.newFolder(); + Mockito.when(j.getBuildDir()).thenReturn(tempBuildDir); + Run, ? extends Run> r = new Run(j, 0) {}; + File f = r.getLogFile(); + f.getParentFile().mkdirs(); + PrintWriter w = new PrintWriter(f, "utf-8"); + w.print("a1\nb2\n\nc3"); + w.close(); + List logLines = r.getLog(10); + assertFalse(logLines.isEmpty()); + + assertEquals("a1", logLines.get(0)); + assertEquals("b2", logLines.get(1)); + assertEquals("", logLines.get(2)); + assertEquals("c3", logLines.get(3)); + } } diff --git a/core/src/test/java/hudson/model/UserTest.java b/core/src/test/java/hudson/model/UserTest.java index ed859a9d97b92ea75572d9ccf99de9586f5b845f..efded82496a6e26eb6908fa38896c47c7311eddb 100644 --- a/core/src/test/java/hudson/model/UserTest.java +++ b/core/src/test/java/hudson/model/UserTest.java @@ -43,4 +43,31 @@ public class UserTest { assertThat("Blank user IDs should not be allowed", User.isIdOrFullnameAllowed(" "), is(false)); } + @Test + @Issue("JENKINS-35967") + public void shouldNotAllowIllegalRestrictedNamesInWrongCase() { + assertIdOrFullNameNotAllowed("system"); + assertIdOrFullNameNotAllowed("System"); + assertIdOrFullNameNotAllowed("SYSTEM"); + assertIdOrFullNameNotAllowed("syStem"); + assertIdOrFullNameNotAllowed("sYstEm"); + } + + @Test + @Issue("JENKINS-35967") + public void shouldNotAllowIllegalRestrictedNamesEvenIfTrimmed() { + for (String username : User.getIllegalPersistedUsernames()) { + assertIdOrFullNameNotAllowed(username); + assertIdOrFullNameNotAllowed(" " + username); + assertIdOrFullNameNotAllowed(username + " "); + assertIdOrFullNameNotAllowed(" " + username + " "); + assertIdOrFullNameNotAllowed("\t" + username + "\t"); + } + } + + private void assertIdOrFullNameNotAllowed(String id) { + assertThat("User ID or full name '" + id + "' should not be allowed", + User.isIdOrFullnameAllowed(id), is(false)); + } + } diff --git a/core/src/test/java/hudson/slaves/ChannelPingerTest.java b/core/src/test/java/hudson/slaves/ChannelPingerTest.java new file mode 100644 index 0000000000000000000000000000000000000000..e3e67a1b26d404b49a1b183ca3ae8d26b01b5194 --- /dev/null +++ b/core/src/test/java/hudson/slaves/ChannelPingerTest.java @@ -0,0 +1,116 @@ +package hudson.slaves; + +import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.verify; +import static org.powermock.api.mockito.PowerMockito.mockStatic; +import static org.powermock.api.mockito.PowerMockito.verifyStatic; + +import com.google.common.testing.EqualsTester; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; +import hudson.remoting.Channel; + +import java.util.Map; +import java.util.HashMap; + +@RunWith(PowerMockRunner.class) +@PrepareForTest({ ChannelPinger.class }) +public class ChannelPingerTest { + + @Mock private Channel mockChannel; + + private Map savedSystemProperties = new HashMap(); + + @Before + public void setUp() throws Exception { + MockitoAnnotations.initMocks(this); + mockStatic(ChannelPinger.class); + } + + @Before + public void preserveSystemProperties() throws Exception { + preserveSystemProperty("hudson.slaves.ChannelPinger.pingInterval"); + preserveSystemProperty("hudson.slaves.ChannelPinger.pingIntervalSeconds"); + preserveSystemProperty("hudson.slaves.ChannelPinger.pingTimeoutSeconds"); + } + + @After + public void restoreSystemProperties() throws Exception { + for (Map.Entry entry : savedSystemProperties.entrySet()) { + if (entry.getValue() != null) { + System.setProperty(entry.getKey(), entry.getValue()); + } else { + System.clearProperty(entry.getKey()); + } + } + } + + private void preserveSystemProperty(String propertyName) { + savedSystemProperties.put(propertyName, System.getProperty(propertyName)); + System.clearProperty(propertyName); + } + + @Test + public void testDefaults() throws Exception { + ChannelPinger channelPinger = new ChannelPinger(); + channelPinger.install(mockChannel); + + verify(mockChannel).call(eq(new ChannelPinger.SetUpRemotePing(ChannelPinger.PING_TIMEOUT_SECONDS_DEFAULT, + ChannelPinger.PING_INTERVAL_SECONDS_DEFAULT))); + verifyStatic(); + ChannelPinger.setUpPingForChannel(mockChannel, ChannelPinger.PING_TIMEOUT_SECONDS_DEFAULT, + ChannelPinger.PING_INTERVAL_SECONDS_DEFAULT, true); + } + + @Test + public void testFromSystemProperties() throws Exception { + System.setProperty("hudson.slaves.ChannelPinger.pingTimeoutSeconds", "42"); + System.setProperty("hudson.slaves.ChannelPinger.pingIntervalSeconds", "73"); + + ChannelPinger channelPinger = new ChannelPinger(); + channelPinger.install(mockChannel); + + verify(mockChannel).call(new ChannelPinger.SetUpRemotePing(42, 73)); + verifyStatic(); + ChannelPinger.setUpPingForChannel(mockChannel, 42, 73, true); + } + + @Test + public void testFromOldSystemProperty() throws Exception { + System.setProperty("hudson.slaves.ChannelPinger.pingInterval", "7"); + + ChannelPinger channelPinger = new ChannelPinger(); + channelPinger.install(mockChannel); + + verify(mockChannel).call(eq(new ChannelPinger.SetUpRemotePing(ChannelPinger.PING_TIMEOUT_SECONDS_DEFAULT, 420))); + verifyStatic(); + ChannelPinger.setUpPingForChannel(mockChannel, ChannelPinger.PING_TIMEOUT_SECONDS_DEFAULT, 420, true); + } + + @Test + public void testNewSystemPropertyTrumpsOld() throws Exception { + System.setProperty("hudson.slaves.ChannelPinger.pingIntervalSeconds", "73"); + System.setProperty("hudson.slaves.ChannelPinger.pingInterval", "7"); + + ChannelPinger channelPinger = new ChannelPinger(); + channelPinger.install(mockChannel); + + verify(mockChannel).call(eq(new ChannelPinger.SetUpRemotePing(ChannelPinger.PING_TIMEOUT_SECONDS_DEFAULT, 73))); + verifyStatic(); + ChannelPinger.setUpPingForChannel(mockChannel, ChannelPinger.PING_TIMEOUT_SECONDS_DEFAULT, 73, true); + } + + @Test + public void testSetUpRemotePingEquality() { + new EqualsTester() + .addEqualityGroup(new ChannelPinger.SetUpRemotePing(1, 2), new ChannelPinger.SetUpRemotePing(1, 2)) + .addEqualityGroup(new ChannelPinger.SetUpRemotePing(2, 3), new ChannelPinger.SetUpRemotePing(2, 3)) + .testEquals(); + } +} diff --git a/core/src/test/java/hudson/slaves/CloudTest.java b/core/src/test/java/hudson/slaves/CloudTest.java new file mode 100644 index 0000000000000000000000000000000000000000..bed5bad5f74a7aaaee7253003e6af08c08e17ffa --- /dev/null +++ b/core/src/test/java/hudson/slaves/CloudTest.java @@ -0,0 +1,26 @@ +package hudson.slaves; + +import static org.junit.Assert.*; + +import hudson.model.Computer; +import hudson.security.Permission; +import hudson.security.SidACL; +import jenkins.model.Jenkins; +import org.acegisecurity.acls.sid.Sid; +import org.junit.Test; + +public class CloudTest { + + @Test + public void provisionPermissionShouldBeIndependentFromAdminister() throws Exception { + SidACL acl = new SidACL() { + @Override protected Boolean hasPermission(Sid p, Permission permission) { + return permission == Cloud.PROVISION; + } + }; + + assertTrue(acl.hasPermission(Jenkins.ANONYMOUS, Cloud.PROVISION)); + assertFalse(acl.hasPermission(Jenkins.ANONYMOUS, Jenkins.ADMINISTER)); + assertEquals(Cloud.PROVISION, Computer.PERMISSIONS.find("Provision")); + } +} diff --git a/core/src/test/java/hudson/slaves/ComputerLauncherTest.java b/core/src/test/java/hudson/slaves/ComputerLauncherTest.java index d1533420de65ac66348c230e40c6d708e4e44569..56ea7bfa61a9fdb41090ff9ff37e7250cf625b07 100644 --- a/core/src/test/java/hudson/slaves/ComputerLauncherTest.java +++ b/core/src/test/java/hudson/slaves/ComputerLauncherTest.java @@ -24,17 +24,16 @@ package hudson.slaves; -import edu.umd.cs.findbugs.annotations.SuppressWarnings; import java.io.BufferedReader; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.PrintStream; import java.io.StringReader; + import org.apache.commons.io.output.NullOutputStream; import org.junit.Test; import static org.junit.Assert.*; -@SuppressWarnings("DM_DEFAULT_ENCODING") public class ComputerLauncherTest { @Test public void jdk7() throws IOException { diff --git a/core/src/test/java/hudson/tasks/BuildStepCompatibilityLayerTest.java b/core/src/test/java/hudson/tasks/BuildStepCompatibilityLayerTest.java new file mode 100644 index 0000000000000000000000000000000000000000..c310e1f6610ed774f2fff6e5c3668784e61497e3 --- /dev/null +++ b/core/src/test/java/hudson/tasks/BuildStepCompatibilityLayerTest.java @@ -0,0 +1,54 @@ +package hudson.tasks; + +import static org.junit.Assert.assertTrue; +import hudson.Launcher; +import hudson.model.AbstractBuild; +import hudson.model.BuildListener; +import hudson.model.FreeStyleBuild; + +import java.io.IOException; + +import org.junit.Test; +import org.jvnet.hudson.test.Issue; +import org.mockito.Mockito; + +public class BuildStepCompatibilityLayerTest { + + @Issue("JENKINS-18734") + @Test(expected = AbstractMethodError.class) + public void testPerformExpectAbstractMethodError() throws InterruptedException, IOException { + + FreeStyleBuild mock = Mockito.mock(FreeStyleBuild.class, Mockito.CALLS_REAL_METHODS); + BuildStepCompatibilityLayer bscl = new BuildStepCompatibilityLayer() { + @Override + public BuildStepMonitor getRequiredMonitorService() { + return null; + } + }; + bscl.perform(mock, null, null); + + } + + @Issue("JENKINS-18734") + @Test + public void testPerform() throws InterruptedException, IOException { + + FreeStyleBuild mock = Mockito.mock(FreeStyleBuild.class, Mockito.CALLS_REAL_METHODS); + BuildStepCompatibilityLayer bscl = new BuildStepCompatibilityLayer() { + + @Override + public boolean perform(AbstractBuild build, Launcher launcher, BuildListener listener) + throws InterruptedException, IOException { + return true; + } + + @Override + public BuildStepMonitor getRequiredMonitorService() { + return null; + } + }; + assertTrue(bscl.perform(mock, null, null)); + + } + +} diff --git a/core/src/test/java/hudson/util/FormValidationTest.java b/core/src/test/java/hudson/util/FormValidationTest.java index 717d1768f4a1d779cc74db52c82962264b01c1b4..286079e22496a45a4fb8d0a043ba22d2b480f7af 100644 --- a/core/src/test/java/hudson/util/FormValidationTest.java +++ b/core/src/test/java/hudson/util/FormValidationTest.java @@ -99,10 +99,10 @@ public class FormValidationTest { assertTrue(ok_error.renderHtml().contains(ok.getMessage())); assertTrue(ok_error.renderHtml().contains(error.getMessage())); - final FormValidation warninig_error = aggregate(warning, error); - assertEquals(FormValidation.Kind.ERROR, warninig_error.kind); - assertTrue(warninig_error.renderHtml().contains(error.getMessage())); - assertTrue(warninig_error.renderHtml().contains(warning.getMessage())); + final FormValidation warning_error = aggregate(warning, error); + assertEquals(FormValidation.Kind.ERROR, warning_error.kind); + assertTrue(warning_error.renderHtml().contains(error.getMessage())); + assertTrue(warning_error.renderHtml().contains(warning.getMessage())); } private FormValidation aggregate(FormValidation... fvs) { diff --git a/core/src/test/java/hudson/util/io/ReopenableRotatingFileOutputStreamTest.java b/core/src/test/java/hudson/util/io/ReopenableRotatingFileOutputStreamTest.java deleted file mode 100644 index 94fc5cf9ed61ef793dbc0d3705f68cccd3c04608..0000000000000000000000000000000000000000 --- a/core/src/test/java/hudson/util/io/ReopenableRotatingFileOutputStreamTest.java +++ /dev/null @@ -1,38 +0,0 @@ -package hudson.util.io; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; - -import hudson.FilePath; -import org.junit.Test; - -import java.io.File; -import java.io.IOException; -import java.io.PrintWriter; - -/** - * @author Kohsuke Kawaguchi - */ -public class ReopenableRotatingFileOutputStreamTest { - - @Test - public void rotation() throws IOException, InterruptedException { - File base = File.createTempFile("test", "log"); - ReopenableRotatingFileOutputStream os = new ReopenableRotatingFileOutputStream(base,3); - PrintWriter w = new PrintWriter(os,true); - for (int i=0; i<=4; i++) { - w.println("Content"+i); - os.rewind(); - } - w.println("Content5"); - w.close(); - - assertEquals("Content5", new FilePath(base).readToString().trim()); - assertEquals("Content4", new FilePath(new File(base.getPath() + ".1")).readToString().trim()); - assertEquals("Content3", new FilePath(new File(base.getPath() + ".2")).readToString().trim()); - assertEquals("Content2", new FilePath(new File(base.getPath() + ".3")).readToString().trim()); - assertFalse(new File(base.getPath() + ".4").exists()); - - os.deleteAll(); - } -} diff --git a/core/src/test/java/hudson/util/io/RewindableRotatingFileOutputStreamTest.java b/core/src/test/java/hudson/util/io/RewindableRotatingFileOutputStreamTest.java new file mode 100644 index 0000000000000000000000000000000000000000..78f0ec9b3b968f61179c20b8aa013e797e9e4937 --- /dev/null +++ b/core/src/test/java/hudson/util/io/RewindableRotatingFileOutputStreamTest.java @@ -0,0 +1,64 @@ +package hudson.util.io; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; + +import hudson.FilePath; +import hudson.Functions; +import org.junit.Test; + +import java.io.File; +import java.io.IOException; +import java.io.PrintWriter; +import org.apache.commons.io.FileUtils; +import org.junit.Rule; +import org.junit.rules.TemporaryFolder; +import org.jvnet.hudson.test.Issue; + +import static org.junit.Assume.assumeFalse; + +public class RewindableRotatingFileOutputStreamTest { + + @Rule + public TemporaryFolder tmp = new TemporaryFolder(); + + @Test + public void rotation() throws IOException, InterruptedException { + File base = tmp.newFile("test.log"); + RewindableRotatingFileOutputStream os = new RewindableRotatingFileOutputStream(base,3); + PrintWriter w = new PrintWriter(os,true); + for (int i=0; i<=4; i++) { + w.println("Content"+i); + os.rewind(); + } + w.println("Content5"); + w.close(); + + assertEquals("Content5", new FilePath(base).readToString().trim()); + assertEquals("Content4", new FilePath(new File(base.getPath() + ".1")).readToString().trim()); + assertEquals("Content3", new FilePath(new File(base.getPath() + ".2")).readToString().trim()); + assertEquals("Content2", new FilePath(new File(base.getPath() + ".3")).readToString().trim()); + assertFalse(new File(base.getPath() + ".4").exists()); + + os.deleteAll(); + } + + @Issue("JENKINS-16634") + @Test + public void deletedFolder() throws Exception { + assumeFalse("Windows does not allow deleting a directory with a " + + "file open, so this case should never occur", Functions.isWindows()); + File dir = tmp.newFolder("dir"); + File base = new File(dir, "x.log"); + RewindableRotatingFileOutputStream os = new RewindableRotatingFileOutputStream(base, 3); + for (int i = 0; i < 2; i++) { + FileUtils.deleteDirectory(dir); + os.write('.'); + FileUtils.deleteDirectory(dir); + os.write('.'); + FileUtils.deleteDirectory(dir); + os.rewind(); + } + } + +} diff --git a/core/src/test/java/jenkins/model/RunIdMigratorTest.java b/core/src/test/java/jenkins/model/RunIdMigratorTest.java index f51d0299b8c0db66c4a9511680368aad439c77de..71a3e47832b84b0f3e7a6149ec73c501e64f16fb 100644 --- a/core/src/test/java/jenkins/model/RunIdMigratorTest.java +++ b/core/src/test/java/jenkins/model/RunIdMigratorTest.java @@ -24,6 +24,7 @@ package jenkins.model; +import hudson.Functions; import hudson.Util; import hudson.util.StreamTaskListener; import java.io.File; @@ -38,6 +39,8 @@ import java.util.logging.Level; import org.apache.commons.io.FileUtils; import org.junit.Test; import static org.junit.Assert.*; +import static org.junit.Assume.assumeFalse; + import org.junit.Before; import org.junit.BeforeClass; import org.junit.Rule; @@ -79,6 +82,7 @@ public class RunIdMigratorTest { } @Test public void legacy() throws Exception { + assumeFalse("Symlinks don't work well on Windows", Functions.isWindows()); write("2014-01-02_03-04-05/build.xml", "\n\n ok\n 99\n ok\n"); link("99", "2014-01-02_03-04-05"); link("lastFailedBuild", "-1"); @@ -97,6 +101,7 @@ public class RunIdMigratorTest { } @Test public void reRunMigration() throws Exception { + assumeFalse("Symlinks don't work well on Windows", Functions.isWindows()); write("2014-01-02_03-04-04/build.xml", "\n 98\n"); link("98", "2014-01-02_03-04-04"); write("99/build.xml", "\n\n ok\n 1388649845000\n ok\n"); @@ -108,6 +113,7 @@ public class RunIdMigratorTest { } @Test public void reverseImmediately() throws Exception { + assumeFalse("Symlinks don't work well on Windows", Functions.isWindows()); File root = dir; dir = new File(dir, "jobs/somefolder/jobs/someproject/promotions/OK/builds"); write("99/build.xml", "\n\n ok\n 2014-01-02_03-04-05\n 1388649845000\n ok\n"); @@ -120,6 +126,7 @@ public class RunIdMigratorTest { } @Test public void reverseAfterNewBuilds() throws Exception { + assumeFalse("Symlinks don't work well on Windows", Functions.isWindows()); File root = dir; dir = new File(dir, "jobs/someproject/modules/test$test/builds"); write("1/build.xml", "\n\n ok\n 1388649845000\n ok\n"); @@ -130,6 +137,7 @@ public class RunIdMigratorTest { } @Test public void reverseMatrixAfterNewBuilds() throws Exception { + assumeFalse("Symlinks don't work well on Windows", Functions.isWindows()); File root = dir; dir = new File(dir, "jobs/someproject/Environment=prod/builds"); write("1/build.xml", "\n\n ok\n 1388649845000\n ok\n"); @@ -140,6 +148,7 @@ public class RunIdMigratorTest { } @Test public void reverseMavenAfterNewBuilds() throws Exception { + assumeFalse("Symlinks don't work well on Windows", Functions.isWindows()); File root = dir; dir = new File(dir, "jobs/someproject/test$test/builds"); write("1/build.xml", "\n\n ok\n 1388649845000\n ok\n"); diff --git a/core/src/test/java/jenkins/slaves/DefaultJnlpSlaveReceiverTest.java b/core/src/test/java/jenkins/slaves/DefaultJnlpSlaveReceiverTest.java deleted file mode 100644 index a093f8ec2560c208fa3b95bcbd765070d8ed2cd5..0000000000000000000000000000000000000000 --- a/core/src/test/java/jenkins/slaves/DefaultJnlpSlaveReceiverTest.java +++ /dev/null @@ -1,145 +0,0 @@ -package jenkins.slaves; - -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; -import static org.mockito.Mockito.any; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; -import static org.powermock.api.mockito.PowerMockito.mockStatic; - -import hudson.TcpSlaveAgentListener.ConnectionFromCurrentPeer; -import hudson.remoting.Channel; -import hudson.slaves.SlaveComputer; -import jenkins.model.Jenkins; - -import java.io.IOException; -import java.util.Properties; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.Future; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; -import org.powermock.core.classloader.annotations.PrepareForTest; -import org.powermock.modules.junit4.PowerMockRunner; - -@RunWith(PowerMockRunner.class) -@PrepareForTest(Jenkins.class) -public class DefaultJnlpSlaveReceiverTest { - - @Mock private Jenkins mockJenkins; - @Mock private SlaveComputer mockComputer; - @Mock private Channel mockChannel; - @Mock private JnlpSlaveAgentProtocol2.Handler mockHandshake; - @Mock private Future mockFuture; - - private DefaultJnlpSlaveReceiver receiver; - - @Before - public void setUp() throws Exception { - MockitoAnnotations.initMocks(this); - - mockStatic(Jenkins.class); - when(Jenkins.getInstance()).thenReturn(mockJenkins); - - receiver = new DefaultJnlpSlaveReceiver(); - } - - @Test - public void testHandle() throws Exception { - when(mockJenkins.getComputer("node")).thenReturn(mockComputer); - when(mockComputer.getChannel()).thenReturn(null); - when(mockChannel.getProperty(any(String.class))).thenReturn("some cookie"); - when(mockHandshake.jnlpConnect(mockComputer)).thenReturn(mockChannel); - when(mockHandshake.getRequestProperty("Secret-Key")).thenReturn("mock-secret"); - when(mockComputer.getJnlpMac()).thenReturn("mock-secret"); - - assertTrue(receiver.handle("node", mockHandshake)); - verify(mockHandshake).success(any(Properties.class)); - verify(mockChannel).setProperty(any(String.class), any(String.class)); - } - - @Test - public void testHandleWithInvalidNode() throws Exception { - when(mockJenkins.getComputer("bogus-node")).thenReturn(null); - - assertFalse(receiver.handle("bogus-node", mockHandshake)); - } - - @Test - public void testHandleTakeover() throws Exception { - when(mockJenkins.getComputer("node")).thenReturn(mockComputer); - when(mockComputer.getChannel()).thenReturn(mockChannel); - when(mockHandshake.getRequestProperty(any(String.class))).thenReturn("some cookie"); - when(mockChannel.getProperty(any(String.class))).thenReturn("some cookie"); - when(mockComputer.disconnect(any(ConnectionFromCurrentPeer.class))).thenReturn(mockFuture); - when(mockHandshake.jnlpConnect(mockComputer)).thenReturn(mockChannel); - when(mockHandshake.getRequestProperty("Secret-Key")).thenReturn("mock-secret"); - when(mockComputer.getJnlpMac()).thenReturn("mock-secret"); - - assertTrue(receiver.handle("node", mockHandshake)); - verify(mockFuture).get(15, TimeUnit.SECONDS); - verify(mockHandshake).success(any(Properties.class)); - verify(mockChannel).setProperty(any(String.class), any(String.class)); - } - - @Test - public void testHandleTakeoverFailedDisconnect() throws Exception { - when(mockJenkins.getComputer("node")).thenReturn(mockComputer); - when(mockComputer.getChannel()).thenReturn(mockChannel); - when(mockHandshake.getRequestProperty(any(String.class))).thenReturn("some cookie"); - when(mockChannel.getProperty(any(String.class))).thenReturn("some cookie"); - when(mockComputer.disconnect(any(ConnectionFromCurrentPeer.class))).thenReturn(mockFuture); - when(mockFuture.get(15, TimeUnit.SECONDS)).thenThrow(new ExecutionException(null)); - - try { - receiver.handle("node", mockHandshake); - fail(); - } catch (IOException e) { - // good - } - } - - @Test - public void testHandleTakeoverTimedOut() throws Exception { - when(mockJenkins.getComputer("node")).thenReturn(mockComputer); - when(mockComputer.getChannel()).thenReturn(mockChannel); - when(mockHandshake.getRequestProperty(any(String.class))).thenReturn("some cookie"); - when(mockChannel.getProperty(any(String.class))).thenReturn("some cookie"); - when(mockComputer.disconnect(any(ConnectionFromCurrentPeer.class))).thenReturn(mockFuture); - when(mockFuture.get(15, TimeUnit.SECONDS)).thenThrow(new TimeoutException()); - - try { - receiver.handle("node", mockHandshake); - fail(); - } catch (IOException e) { - // good - } - } - - @Test - public void testHandleAttemptTakeoverWithNullCookie() throws Exception { - when(mockJenkins.getComputer("node")).thenReturn(mockComputer); - when(mockComputer.getChannel()).thenReturn(mockChannel); - when(mockHandshake.getRequestProperty(any(String.class))).thenReturn(null); - when(mockChannel.getProperty(any(String.class))).thenReturn("some cookie"); - - assertTrue(receiver.handle("node", mockHandshake)); - verify(mockHandshake).error(any(String.class)); - } - - @Test - public void testHandleAttemptTakeoverWithInvalidCookie() throws Exception { - when(mockJenkins.getComputer("node")).thenReturn(mockComputer); - when(mockComputer.getChannel()).thenReturn(mockChannel); - when(mockHandshake.getRequestProperty(any(String.class))).thenReturn("bogus cookie"); - when(mockChannel.getProperty(any(String.class))).thenReturn("some cookie"); - - assertTrue(receiver.handle("node", mockHandshake)); - verify(mockHandshake).error(any(String.class)); - } -} diff --git a/core/src/test/java/jenkins/util/ResourceBundleUtilTest.java b/core/src/test/java/jenkins/util/ResourceBundleUtilTest.java index 1e8c24b56946e51ad0d80afdf1a9b442e2642c17..137bffb09bc9e473e2ab33c0fec8b10db2cd5cff 100644 --- a/core/src/test/java/jenkins/util/ResourceBundleUtilTest.java +++ b/core/src/test/java/jenkins/util/ResourceBundleUtilTest.java @@ -54,9 +54,16 @@ public class ResourceBundleUtilTest { */ @Test public void test_unknown_locale() { - JSONObject bundle = ResourceBundleUtil.getBundle("hudson.logging.Messages", new Locale("kok")); // konkani - Assert.assertEquals("Initialing log recorders", bundle.getString("LogRecorderManager.init")); + Locale defaultOSLocale = Locale.getDefault(); + try { + //Set Default-Locale to english + Locale.setDefault(new Locale("en", "US")); + JSONObject bundle = ResourceBundleUtil.getBundle("hudson.logging.Messages", new Locale("kok")); // konkani + Assert.assertEquals("Initialing log recorders", bundle.getString("LogRecorderManager.init")); + }finally{ + Locale.setDefault(defaultOSLocale); + } } /** diff --git a/core/src/test/java/jenkins/util/VirtualFileTest.java b/core/src/test/java/jenkins/util/VirtualFileTest.java index 46bfecd8d62213b54d70d2c06e9ada43140207fd..c45f45109cb87286cf697a9be9235186e0b568c8 100644 --- a/core/src/test/java/jenkins/util/VirtualFileTest.java +++ b/core/src/test/java/jenkins/util/VirtualFileTest.java @@ -24,6 +24,7 @@ package jenkins.util; +import hudson.Functions; import hudson.Util; import hudson.model.TaskListener; import java.io.File; @@ -32,6 +33,8 @@ import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import org.junit.Test; import static org.junit.Assert.*; +import static org.junit.Assume.assumeFalse; + import org.junit.Rule; import org.junit.rules.TemporaryFolder; import org.jvnet.hudson.test.Issue; @@ -42,6 +45,7 @@ public class VirtualFileTest { @Issue("SECURITY-162") @Test public void outsideSymlinks() throws Exception { + assumeFalse("Symlinks don't work well on Windows", Functions.isWindows()); File ws = tmp.newFolder("ws"); FileUtils.write(new File(ws, "safe"), "safe"); Util.createSymlink(ws, "safe", "supported", TaskListener.NULL); diff --git a/core/src/test/java/jenkins/util/xstream/XStreamDOMTest.java b/core/src/test/java/jenkins/util/xstream/XStreamDOMTest.java index 979a86cb2bafcf665dfc51c732365853a2290c8b..b32ed5a40f15fe005305f64de201a43c2b7d9900 100644 --- a/core/src/test/java/jenkins/util/xstream/XStreamDOMTest.java +++ b/core/src/test/java/jenkins/util/xstream/XStreamDOMTest.java @@ -83,12 +83,9 @@ public class XStreamDOMTest { @Test public void testUnmarshal() throws Exception { - InputStream is = XStreamDOMTest.class.getResourceAsStream("XStreamDOMTest.data1.xml"); Foo foo; - try { + try (InputStream is = XStreamDOMTest.class.getResourceAsStream("XStreamDOMTest.data1.xml")) { foo = (Foo) xs.fromXML(is); - } finally { - is.close(); } assertEquals("test1",foo.bar.getTagName()); assertEquals("value",foo.bar.getAttribute("key")); diff --git a/core/src/test/java/jenkins/widgets/HistoryPageFilterTest.java b/core/src/test/java/jenkins/widgets/HistoryPageFilterTest.java index f00969b769df4ae8b3629985529a7962d4a766b5..9649264d0a0fe36574c2fb05542d3c9d291968ce 100644 --- a/core/src/test/java/jenkins/widgets/HistoryPageFilterTest.java +++ b/core/src/test/java/jenkins/widgets/HistoryPageFilterTest.java @@ -23,24 +23,39 @@ */ package jenkins.widgets; +import hudson.model.Build; +import hudson.model.FreeStyleBuild; +import hudson.model.FreeStyleProject; import hudson.model.Job; import hudson.model.MockItem; import hudson.model.ModelObject; +import hudson.model.ParameterValue; +import hudson.model.ParametersAction; import hudson.model.Queue; import hudson.model.Result; import hudson.model.Run; -import jenkins.widgets.HistoryPageEntry; -import jenkins.widgets.HistoryPageFilter; +import hudson.model.StringParameterValue; + import org.junit.Assert; +import org.junit.Ignore; import org.junit.Test; import org.mockito.Mockito; import java.io.IOException; import java.util.ArrayList; +import java.util.Calendar; +import java.util.Collections; import java.util.List; +import java.util.Map; + +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Lists; /** * @author tom.fennelly@gmail.com + * + * See also HistoryPageFilterInsensitiveSearchTest integration test. */ public class HistoryPageFilterTest { @@ -293,6 +308,80 @@ public class HistoryPageFilterTest { Assert.assertEquals(HistoryPageEntry.getEntryId(6), historyPageFilter.oldestOnPage); } + @Test + public void test_search_runs_by_build_number() throws IOException { + //given + HistoryPageFilter historyPageFilter = newPage(5, null, null); + List runs = newRuns(23, 24); + List queueItems = newQueueItems(25, 26); + //and + historyPageFilter.setSearchString("23"); + + //when + historyPageFilter.add(runs, queueItems); + + //then + Assert.assertEquals(1, historyPageFilter.runs.size()); + Assert.assertEquals(HistoryPageEntry.getEntryId(23), historyPageFilter.runs.get(0).getEntryId()); + } + + @Test + public void test_search_should_be_case_sensitive_for_anonymous_user() throws IOException { + //given + HistoryPageFilter historyPageFilter = newPage(5, null, null); + //and + historyPageFilter.setSearchString("failure"); + //and + List runs = Lists.newArrayList(new MockRun(2, Result.FAILURE), new MockRun(1, Result.SUCCESS)); + List queueItems = newQueueItems(3, 4); + + //when + historyPageFilter.add(runs, queueItems); + + //then + Assert.assertEquals(0, historyPageFilter.runs.size()); + } + + @Test + public void test_search_builds_by_build_variables() throws IOException { + List runs = ImmutableList.of( + new MockBuild(2).withBuildVariables(ImmutableMap.of("env", "dummyEnv")), + new MockBuild(1).withBuildVariables(ImmutableMap.of("env", "otherEnv"))); + assertOneMatchingBuildForGivenSearchStringAndRunItems("dummyEnv", runs); + } + + @Test + public void test_search_builds_by_build_params() throws IOException { + List runs = ImmutableList.of( + new MockBuild(2).withBuildParameters(ImmutableMap.of("env", "dummyEnv")), + new MockBuild(1).withBuildParameters(ImmutableMap.of("env", "otherEnv"))); + assertOneMatchingBuildForGivenSearchStringAndRunItems("dummyEnv", runs); + } + + @Test + public void test_ignore_sensitive_parameters_in_search_builds_by_build_params() throws IOException { + List runs = ImmutableList.of( + new MockBuild(2).withBuildParameters(ImmutableMap.of("plainPassword", "pass1plain")), + new MockBuild(1).withSensitiveBuildParameters("password", "pass1")); + assertOneMatchingBuildForGivenSearchStringAndRunItems("pass1", runs); + } + + private void assertOneMatchingBuildForGivenSearchStringAndRunItems(String searchString, List runs) { + //given + HistoryPageFilter historyPageFilter = newPage(5, null, null); + //and + historyPageFilter.setSearchString(searchString); + //and + List queueItems = newQueueItems(3, 4); + + //when + historyPageFilter.add(runs, queueItems); + + //then + Assert.assertEquals(1, historyPageFilter.runs.size()); + Assert.assertEquals(HistoryPageEntry.getEntryId(2), historyPageFilter.runs.get(0).getEntryId()); + } + private List newQueueItems(long startId, long endId) { List items = new ArrayList<>(); for (long queueId = startId; queueId <= endId; queueId++) { @@ -329,6 +418,11 @@ public class HistoryPageFilterTest { this.queueId = queueId; } + public MockRun(long queueId, Result result) throws IOException { + this(queueId); + this.result = result; + } + @Override public int compareTo(Run o) { return 0; @@ -373,4 +467,60 @@ public class HistoryPageFilterTest { return super.getNumber(); } } + + private static class MockBuild extends Build { + + private final int buildNumber; + + private Map buildVariables = Collections.emptyMap(); + + private MockBuild(int buildNumber) { + super(Mockito.mock(FreeStyleProject.class), Mockito.mock(Calendar.class)); + this.buildNumber = buildNumber; + } + + @Override + public int getNumber() { + return buildNumber; + } + + @Override + public Map getBuildVariables() { + return buildVariables; + } + + MockBuild withBuildVariables(Map buildVariables) { + this.buildVariables = buildVariables; + return this; + } + + MockBuild withBuildParameters(Map buildParametersAsMap) throws IOException { + addAction(new ParametersAction(buildPropertiesMapToParameterValues(buildParametersAsMap), buildParametersAsMap.keySet())); + return this; + } + + //TODO: Rewrite in functional style when Java 8 is available + private List buildPropertiesMapToParameterValues(Map buildParametersAsMap) { + List parameterValues = new ArrayList<>(); + for (Map.Entry parameter : buildParametersAsMap.entrySet()) { + parameterValues.add(new StringParameterValue(parameter.getKey(), parameter.getValue())); + } + return parameterValues; + } + + MockBuild withSensitiveBuildParameters(String paramName, String paramValue) throws IOException { + addAction(new ParametersAction(ImmutableList.of(createSensitiveStringParameterValue(paramName, paramValue)), + ImmutableList.of(paramName))); + return this; + } + + private StringParameterValue createSensitiveStringParameterValue(final String paramName, final String paramValue) { + return new StringParameterValue(paramName, paramValue) { + @Override + public boolean isSensitive() { + return true; + } + }; + } + } } diff --git a/core/src/test/java/jenkins/xml/XMLUtilsTest.java b/core/src/test/java/jenkins/xml/XMLUtilsTest.java index aac8ab8e53812e31ff71a94dab008b43535d6aa2..55b0d806bbb94c7d1b368628ec182c95488f25ab 100644 --- a/core/src/test/java/jenkins/xml/XMLUtilsTest.java +++ b/core/src/test/java/jenkins/xml/XMLUtilsTest.java @@ -42,7 +42,6 @@ import javax.xml.xpath.XPathExpressionException; import static org.hamcrest.core.StringContains.containsString; import static org.junit.Assert.assertThat; import org.jvnet.hudson.test.Issue; -import org.w3c.dom.Document; import org.xml.sax.SAXException; public class XMLUtilsTest { @@ -127,10 +126,10 @@ public class XMLUtilsTest { "&xxe;"; StringReader stringReader = new StringReader(xml); - Document doc = XMLUtils.parse(stringReader); + XMLUtils.parse(stringReader); Assert.fail("Expecting SAXException for XXE."); } catch (SAXException e) { - assertThat(e.getMessage(), containsString("DOCTYPE is disallowed")); + assertThat(e.getMessage(), containsString("\"http://apache.org/xml/features/disallow-doctype-decl\"")); } } } diff --git a/licenseCompleter.groovy b/licenseCompleter.groovy index 93b33219ca3c9cc86b14b610483262194549edb4..9c6d8eca8ee3c3fbaa9706f5a9314bc6beae2326 100644 --- a/licenseCompleter.groovy +++ b/licenseCompleter.groovy @@ -1,5 +1,5 @@ /* - This script auguments the missing license information in our dependencies. + This script augments the missing license information in our dependencies. */ complete { // license constants @@ -8,7 +8,7 @@ complete { def lgpl = license("LGPL 2.1","http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html") def mitLicense = license("MIT License","http://www.opensource.org/licenses/mit-license.php") def bsdLicense = license("BSD License","http://opensource.org/licenses/BSD-2-Clause") - def jenkinsLicense = license("MIT License","http://jenkins-ci.org/mit-license") + def jenkinsLicense = license("MIT License","https://jenkins.io/mit-license") def ccby = license("Creative Commons Attribution License","http://creativecommons.org/licenses/by/2.5") diff --git a/pom.xml b/pom.xml index 1328ed84f779000fa4054b3da9afe6dda91a4ff1..5995ba44426d730c6878395e88662de6cb60060e 100644 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.19-SNAPSHOT + 2.51-SNAPSHOT pom Jenkins main module @@ -73,13 +73,8 @@ THE SOFTWARE. https://issues.jenkins-ci.org/browse/JENKINS/component/15593 - - jenkins - https://ci.jenkins-ci.org/job/jenkins_main_trunk/ - - - UTF-8 private @@ -91,8 +86,9 @@ THE SOFTWARE. https://api.github.com jenkins-jira + 11.0.1 1.7.7 - 2.7.1 + 2.14 1.4.1 0.11 ${skipTests} @@ -102,7 +98,7 @@ THE SOFTWARE. 7 - https://jenkins-ci.org/changelog + https://jenkins.io/changelog @@ -468,7 +469,7 @@ THE SOFTWARE. org.jvnet.localizer maven-localizer-plugin - 1.23 + 1.24 UTF-8 @@ -488,11 +489,6 @@ THE SOFTWARE. antlr-maven-plugin 2.1 - - org.codehaus.mojo - apt-maven-plugin - 1.0-alpha-5 - org.codehaus.mojo cobertura-maven-plugin @@ -539,7 +535,7 @@ THE SOFTWARE. org.jenkins-ci.tools maven-hpi-plugin - 1.116 + 1.120 org.apache.maven.plugins @@ -659,7 +655,7 @@ THE SOFTWARE. 1.${java.level} 1.${java.level} - @@ -754,8 +750,8 @@ THE SOFTWARE. - - + + @@ -884,7 +880,7 @@ THE SOFTWARE. lts-release - https://jenkins-ci.org/changelog-stable + https://jenkins.io/changelog-stable diff --git a/test/pom.xml b/test/pom.xml index ede46384ff0d77383256c4927e1abeff4d832345..7f9c1c9b2438ec3311762cbf450d85db12c2540e 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main pom - 2.19-SNAPSHOT + 2.51-SNAPSHOT test @@ -40,6 +40,7 @@ THE SOFTWARE. 2 false + false @@ -175,6 +176,11 @@ THE SOFTWARE. mockito-core test + + org.reflections + reflections + 0.9.9 + org.codehaus.geb geb-implicit-assertions diff --git a/test/src/test/groovy/hudson/cli/BuildCommandTest.groovy b/test/src/test/groovy/hudson/cli/BuildCommandTest.groovy index 57c5f29cb08700fbbd1c9e8f272e96d9f71e652d..86ea1ecc83afa1d035f3e46ee96cf3fac6bc261e 100644 --- a/test/src/test/groovy/hudson/cli/BuildCommandTest.groovy +++ b/test/src/test/groovy/hudson/cli/BuildCommandTest.groovy @@ -205,7 +205,7 @@ public class BuildCommandTest { assertNull("Project should not be built", project.getBuildByNumber(1)); } - @Test void refuseToBuildNewlyCoppiedProject() { + @Test void refuseToBuildNewlyCopiedProject() { def original = j.createFreeStyleProject("original"); def newOne = (FreeStyleProject) j.jenkins.copy(original, "new-one"); diff --git a/test/src/test/groovy/hudson/cli/SetBuildParameterCommandTest.groovy b/test/src/test/groovy/hudson/cli/SetBuildParameterCommandTest.groovy index 24d44d4624677e9597ed6fe6195877875d072f74..b082cd03e5388a55a0335d0b7ab61063f2eb0412 100644 --- a/test/src/test/groovy/hudson/cli/SetBuildParameterCommandTest.groovy +++ b/test/src/test/groovy/hudson/cli/SetBuildParameterCommandTest.groovy @@ -1,5 +1,6 @@ package hudson.cli +import hudson.Functions import hudson.Launcher import hudson.model.AbstractBuild import hudson.model.BuildListener @@ -8,6 +9,8 @@ import hudson.model.ParametersDefinitionProperty import hudson.model.ParameterDefinition import hudson.model.Result import hudson.model.StringParameterDefinition +import hudson.tasks.BatchFile +import hudson.tasks.Builder import hudson.tasks.Shell import jenkins.model.JenkinsLocationConfiguration import org.junit.Assert @@ -39,9 +42,9 @@ public class SetBuildParameterCommandTest { }); List pd = [new StringParameterDefinition("a", ""), new StringParameterDefinition("b", "")]; p.addProperty(new ParametersDefinitionProperty(pd)) - p.buildersList.add(new Shell("java -jar cli.jar set-build-parameter a b")) - p.buildersList.add(new Shell("java -jar cli.jar set-build-parameter a x")) - p.buildersList.add(new Shell("java -jar cli.jar set-build-parameter b y")) + p.buildersList.add(createScriptBuilder("java -jar cli.jar set-build-parameter a b")) + p.buildersList.add(createScriptBuilder("java -jar cli.jar set-build-parameter a x")) + p.buildersList.add(createScriptBuilder("java -jar cli.jar set-build-parameter b y")) def r = [:]; @@ -50,10 +53,24 @@ public class SetBuildParameterCommandTest { assert r.equals(["a":"x", "b":"y"]); - p.buildersList.add(new Shell("BUILD_NUMBER=1 java -jar cli.jar set-build-parameter a b")); + if (Functions.isWindows()) { + p.buildersList.add(new BatchFile("set BUILD_NUMBER=1\r\njava -jar cli.jar set-build-parameter a b")) + } else { + p.buildersList.add(new Shell("BUILD_NUMBER=1 java -jar cli.jar set-build-parameter a b")) + } def b2 = j.assertBuildStatus(Result.FAILURE, p.scheduleBuild2(0).get()); r = [:]; b.getAction(ParametersAction.class).parameters.each { v -> r[v.name]=v.value } assert r.equals(["a":"x", "b":"y"]); } + + //TODO: determine if this should be pulled out into JenkinsRule or something + /** + * Create a script based builder (either Shell or BatchFile) depending on platform + * @param script the contents of the script to run + * @return A Builder instance of either Shell or BatchFile + */ + private Builder createScriptBuilder(String script) { + return Functions.isWindows() ? new BatchFile(script) : new Shell(script); + } } diff --git a/test/src/test/groovy/hudson/model/AbstractProjectTest.groovy b/test/src/test/groovy/hudson/model/AbstractProjectTest.groovy index 4bceaa4e04c70ce49e50a9c1266a2f42473b10c2..55294aa0c5087685ad2c891be3e4b6aa3982d62c 100644 --- a/test/src/test/groovy/hudson/model/AbstractProjectTest.groovy +++ b/test/src/test/groovy/hudson/model/AbstractProjectTest.groovy @@ -27,6 +27,7 @@ import com.gargoylesoftware.htmlunit.ElementNotFoundException import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException; import com.gargoylesoftware.htmlunit.HttpMethod import com.gargoylesoftware.htmlunit.WebRequest; +import hudson.tasks.BatchFile; import hudson.tasks.BuildStepMonitor; import hudson.tasks.Recorder; import com.gargoylesoftware.htmlunit.html.HtmlPage @@ -48,9 +49,10 @@ import hudson.triggers.TriggerDescriptor; import hudson.util.StreamTaskListener; import hudson.util.OneShotEvent import jenkins.model.Jenkins -import org.junit.Assert; -import org.jvnet.hudson.test.HudsonTestCase -import org.jvnet.hudson.test.Issue; +import org.junit.Rule +import org.junit.Test; +import org.jvnet.hudson.test.Issue +import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.TestExtension; import org.jvnet.hudson.test.recipes.PresetData; import org.jvnet.hudson.test.recipes.PresetData.DataSet @@ -59,15 +61,22 @@ import org.junit.Assume; import org.jvnet.hudson.test.MockFolder import org.kohsuke.args4j.CmdLineException +import static org.junit.Assert.fail +import static org.junit.Assert.assertEquals; + /** * @author Kohsuke Kawaguchi */ -public class AbstractProjectTest extends HudsonTestCase { +public class AbstractProjectTest { + + @Rule public JenkinsRule j = new JenkinsRule(); + + @Test public void testConfigRoundtrip() { - def project = createFreeStyleProject(); - def l = jenkins.getLabel("foo && bar"); + def project = j.createFreeStyleProject(); + def l = j.jenkins.getLabel("foo && bar"); project.assignedLabel = l; - configRoundtrip((Item) project); + j.configRoundtrip((Item) project); assert l == project.getAssignedLabel(); } @@ -75,9 +84,10 @@ public class AbstractProjectTest extends HudsonTestCase { /** * Tests the workspace deletion. */ + @Test public void testWipeWorkspace() { - def project = createFreeStyleProject(); - project.buildersList.add(new Shell("echo hello")); + def project = j.createFreeStyleProject(); + project.buildersList.add(Functions.isWindows() ? new BatchFile("echo hello") : new Shell("echo hello")); def b = project.scheduleBuild2(0).get(); @@ -91,17 +101,18 @@ public class AbstractProjectTest extends HudsonTestCase { /** * Makes sure that the workspace deletion is protected. */ + @Test @PresetData(DataSet.NO_ANONYMOUS_READACCESS) public void testWipeWorkspaceProtected() { - def project = createFreeStyleProject(); - project.getBuildersList().add(new Shell("echo hello")); + def project = j.createFreeStyleProject(); + project.getBuildersList().add(Functions.isWindows() ? new BatchFile("echo hello") : new Shell("echo hello")); def b = project.scheduleBuild2(0).get(); assert b.getWorkspace().exists(): "Workspace should exist by now"; // make sure that the action link is protected - com.gargoylesoftware.htmlunit.WebClient wc = createWebClient(); + com.gargoylesoftware.htmlunit.WebClient wc = j.createWebClient(); try { wc.getPage(new WebRequest(new URL(wc.getContextPath() + project.getUrl() + "doWipeOutWorkspace"), HttpMethod.POST)); fail("Expected HTTP status code 403") @@ -114,16 +125,17 @@ public class AbstractProjectTest extends HudsonTestCase { * Makes sure that the workspace deletion link is not provided * when the user doesn't have an access. */ + @Test @PresetData(DataSet.ANONYMOUS_READONLY) public void testWipeWorkspaceProtected2() { - ((GlobalMatrixAuthorizationStrategy) jenkins.getAuthorizationStrategy()).add(AbstractProject.WORKSPACE,"anonymous"); + ((GlobalMatrixAuthorizationStrategy) j.jenkins.getAuthorizationStrategy()).add(AbstractProject.WORKSPACE,"anonymous"); // make sure that the deletion is protected in the same way testWipeWorkspaceProtected(); // there shouldn't be any "wipe out workspace" link for anonymous user - def webClient = createWebClient(); - HtmlPage page = webClient.getPage(jenkins.getItem("test0")); + def webClient = j.createWebClient(); + HtmlPage page = webClient.getPage(j.jenkins.getItem("test0")); page = (HtmlPage)page.getAnchorByText("Workspace").click(); try { @@ -138,11 +150,12 @@ public class AbstractProjectTest extends HudsonTestCase { /** * Tests the <optionalBlock @field> round trip behavior by using {@link AbstractProject#concurrentBuild} */ + @Test public void testOptionalBlockDataBindingRoundtrip() { - def p = createFreeStyleProject(); + def p = j.createFreeStyleProject(); [true,false].each { b -> p.concurrentBuild = b; - submit(createWebClient().getPage(p,"configure").getFormByName("config")); + j.submit(j.createWebClient().getPage(p,"configure").getFormByName("config")); assert b==p.isConcurrentBuild(); } } @@ -150,20 +163,21 @@ public class AbstractProjectTest extends HudsonTestCase { /** * Tests round trip configuration of the blockBuildWhenUpstreamBuilding field */ + @Test @Issue("JENKINS-4423") public void testConfiguringBlockBuildWhenUpstreamBuildingRoundtrip() { - def p = createFreeStyleProject(); + def p = j.createFreeStyleProject(); p.blockBuildWhenUpstreamBuilding = false; - def form = createWebClient().getPage(p, "configure").getFormByName("config"); + def form = j.createWebClient().getPage(p, "configure").getFormByName("config"); def input = form.getInputByName("blockBuildWhenUpstreamBuilding"); assert !input.isChecked(): "blockBuildWhenUpstreamBuilding check box is checked."; input.setChecked(true); - submit(form); + j.submit(form); assert p.blockBuildWhenUpstreamBuilding: "blockBuildWhenUpstreamBuilding was not updated from configuration form"; - form = createWebClient().getPage(p, "configure").getFormByName("config"); + form = j.createWebClient().getPage(p, "configure").getFormByName("config"); input = form.getInputByName("blockBuildWhenUpstreamBuilding"); assert input.isChecked(): "blockBuildWhenUpstreamBuilding check box is not checked."; } @@ -172,12 +186,13 @@ public class AbstractProjectTest extends HudsonTestCase { * Unless the concurrent build option is enabled, polling and build should be mutually exclusive * to avoid allocating unnecessary workspaces. */ + @Test @Issue("JENKINS-4202") public void testPollingAndBuildExclusion() { final OneShotEvent sync = new OneShotEvent(); - final FreeStyleProject p = createFreeStyleProject(); - def b1 = buildAndAssertSuccess(p); + final FreeStyleProject p = j.createFreeStyleProject(); + def b1 = j.buildAndAssertSuccess(p); p.scm = new NullSCM() { @Override @@ -217,7 +232,7 @@ public class AbstractProjectTest extends HudsonTestCase { // release the polling sync.signal(); - def b2 = assertBuildStatusSuccess(f); + def b2 = j.assertBuildStatusSuccess(f); // they should have used the same workspace. assert b1.workspace == b2.workspace; @@ -226,11 +241,12 @@ public class AbstractProjectTest extends HudsonTestCase { } } + @Test @Issue("JENKINS-1986") public void testBuildSymlinks() { Assume.assumeFalse("If we're on Windows, don't bother doing this", Functions.isWindows()); - def job = createFreeStyleProject(); + def job = j.createFreeStyleProject(); job.buildersList.add(new Shell("echo \"Build #\$BUILD_NUMBER\"\n")); def build = job.scheduleBuild2(0, new Cause.UserCause()).get(); File lastSuccessful = new File(job.rootDir, "lastSuccessful"), @@ -260,12 +276,13 @@ public class AbstractProjectTest extends HudsonTestCase { assert s.contains("Build #" + buildNumber + "\n") : "link should point to build #$buildNumber, but link was: ${Util.resolveSymlink(file, TaskListener.NULL)}\nand log was:\n$s"; } + @Test @Issue("JENKINS-2543") public void testSymlinkForPostBuildFailure() { Assume.assumeFalse("If we're on Windows, don't bother doing this", Functions.isWindows()); // Links should be updated after post-build actions when final build result is known - def job = createFreeStyleProject(); + def job = j.createFreeStyleProject(); job.buildersList.add(new Shell("echo \"Build #\$BUILD_NUMBER\"\n")); def build = job.scheduleBuild2(0, new Cause.UserCause()).get(); assert Result.SUCCESS == build.result; @@ -284,25 +301,27 @@ public class AbstractProjectTest extends HudsonTestCase { } /* TODO too slow, seems capable of causing testWorkspaceLock to time out: + @Test @Issue("JENKINS-15156") public void testGetBuildAfterGC() { - FreeStyleProject job = createFreeStyleProject(); + FreeStyleProject job = j.createFreeStyleProject(); job.scheduleBuild2(0, new Cause.UserIdCause()).get(); - jenkins.queue.clearLeftItems(); + j.jenkins.queue.clearLeftItems(); MemoryAssert.assertGC(new WeakReference(job.getLastBuild())); assert job.lastBuild != null; } */ + @Test @Issue("JENKINS-17137") public void testExternalBuildDirectorySymlinks() { - // TODO when using JUnit 4 add: Assume.assumeFalse(Functions.isWindows()); // symlinks may not be available - def form = createWebClient().goTo("configure").getFormByName("config"); - def builds = createTmpDir(); + Assume.assumeFalse(Functions.isWindows()); // symlinks may not be available + def form = j.createWebClient().goTo("configure").getFormByName("config"); + def builds = j.createTmpDir(); form.getInputByName("_.rawBuildsDir").valueAttribute = builds.toString() + "/\${ITEM_FULL_NAME}"; - submit(form); - assert builds.toString() + "/\${ITEM_FULL_NAME}" == jenkins.getRawBuildsDir(); - def p = jenkins.createProject(MockFolder.class, "d").createProject(FreeStyleProject.class, "p"); + j.submit(form); + assert builds.toString() + "/\${ITEM_FULL_NAME}" == j.jenkins.getRawBuildsDir(); + def p = j.jenkins.createProject(MockFolder.class, "d").createProject(FreeStyleProject.class, "p"); def b1 = p.scheduleBuild2(0).get(); def link = new File(p.rootDir, "lastStable"); assert link.exists(); @@ -325,14 +344,15 @@ public class AbstractProjectTest extends HudsonTestCase { } } + @Test @Issue("JENKINS-17138") public void testExternalBuildDirectoryRenameDelete() { - def form = createWebClient().goTo("configure").getFormByName("config"); - def builds = createTmpDir(); + def form = j.createWebClient().goTo("configure").getFormByName("config"); + def builds = j.createTmpDir(); form.getInputByName("_.rawBuildsDir").setValueAttribute(builds.toString() + "/\${ITEM_FULL_NAME}"); - submit(form); - assert builds.toString() + "/\${ITEM_FULL_NAME}" == jenkins.rawBuildsDir; - def p = jenkins.createProject(MockFolder.class, "d").createProject(FreeStyleProject.class, "prj"); + j.submit(form); + assert builds.toString() + "/\${ITEM_FULL_NAME}" == j.jenkins.rawBuildsDir; + def p = j.jenkins.createProject(MockFolder.class, "d").createProject(FreeStyleProject.class, "prj"); def b = p.scheduleBuild2(0).get(); def oldBuildDir = new File(builds, "d/prj"); assert new File(oldBuildDir, b.id) == b.rootDir; @@ -345,30 +365,32 @@ public class AbstractProjectTest extends HudsonTestCase { assert !b.rootDir.isDirectory(); } + @Test @Issue("JENKINS-18678") public void testRenameJobLostBuilds() throws Exception { - def p = createFreeStyleProject("initial"); - assertBuildStatusSuccess(p.scheduleBuild2(0)); + def p = j.createFreeStyleProject("initial"); + j.assertBuildStatusSuccess(p.scheduleBuild2(0)); assertEquals(1, p.getBuilds().size()); p.renameTo("edited"); p._getRuns().purgeCache(); assertEquals(1, p.getBuilds().size()); - def d = jenkins.createProject(MockFolder.class, "d"); + def d = j.jenkins.createProject(MockFolder.class, "d"); Items.move(p, d); - assertEquals(p, jenkins.getItemByFullName("d/edited")); + assertEquals(p, j.jenkins.getItemByFullName("d/edited")); p._getRuns().purgeCache(); assertEquals(1, p.getBuilds().size()); d.renameTo("d2"); - p = jenkins.getItemByFullName("d2/edited"); + p = j.jenkins.getItemByFullName("d2/edited"); p._getRuns().purgeCache(); assertEquals(1, p.getBuilds().size()); } + @Test @Issue("JENKINS-17575") public void testDeleteRedirect() { - createFreeStyleProject("j1"); + j.createFreeStyleProject("j1"); assert "" == deleteRedirectTarget("job/j1"); - createFreeStyleProject("j2"); + j.createFreeStyleProject("j2"); Jenkins.getInstance().addView(new AllView("v1")); assert "view/v1/" == deleteRedirectTarget("view/v1/job/j2"); MockFolder d = Jenkins.getInstance().createProject(MockFolder.class, "d"); @@ -381,19 +403,20 @@ public class AbstractProjectTest extends HudsonTestCase { } private String deleteRedirectTarget(String job) { - def wc = createWebClient(); + def wc = j.createWebClient(); String base = wc.getContextPath(); String loc = wc.getPage(wc.addCrumb(new WebRequest(new URL(base + job + "/doDelete"), HttpMethod.POST))).getUrl().toString(); assert loc.startsWith(base): loc; return loc.substring(base.length()); } + @Test @Issue("JENKINS-18407") public void testQueueSuccessBehavior() { // prevent any builds to test the behaviour - jenkins.numExecutors = 0; + j.jenkins.numExecutors = 0; - def p = createFreeStyleProject() + def p = j.createFreeStyleProject() def f = p.scheduleBuild2(0) assert f!=null; def g = p.scheduleBuild2(0) @@ -406,26 +429,27 @@ public class AbstractProjectTest extends HudsonTestCase { /** * Do the same as {@link #testQueueSuccessBehavior()} but over HTTP */ + @Test @Issue("JENKINS-18407") public void testQueueSuccessBehaviorOverHTTP() { // prevent any builds to test the behaviour - jenkins.numExecutors = 0; + j.jenkins.numExecutors = 0; - def p = createFreeStyleProject() - def wc = createWebClient(); + def p = j.createFreeStyleProject() + def wc = j.createWebClient(); - def rsp = wc.getPage("${getURL()}${p.url}build").webResponse + def rsp = wc.getPage("${j.getURL()}${p.url}build").webResponse assert rsp.statusCode==201; assert rsp.getResponseHeaderValue("Location")!=null; - def rsp2 = wc.getPage("${getURL()}${p.url}build").webResponse + def rsp2 = wc.getPage("${j.getURL()}${p.url}build").webResponse assert rsp2.statusCode==201; assert rsp.getResponseHeaderValue("Location")==rsp2.getResponseHeaderValue("Location") p.makeDisabled(true) try { - wc.getPage("${getURL()}${p.url}build") + wc.getPage("${j.getURL()}${p.url}build") fail(); } catch (FailingHttpStatusCodeException e) { // request should fail @@ -436,51 +460,56 @@ public class AbstractProjectTest extends HudsonTestCase { * We used to store {@link AbstractProject#triggers} as {@link Vector}, so make sure * we can still read back the configuration from that. */ + @Test public void testVectorTriggers() { - AbstractProject j = jenkins.createProjectFromXML("foo", getClass().getResourceAsStream("AbstractProjectTest/vectorTriggers.xml")) - assert j.triggers().size()==1 - def t = j.triggers()[0] + AbstractProject p = j.jenkins.createProjectFromXML("foo", getClass().getResourceAsStream("AbstractProjectTest/vectorTriggers.xml")) + assert p.triggers().size()==1 + def t = p.triggers()[0] assert t.class==SCMTrigger.class; assert t.spec=="*/10 * * * *" } + @Test @Issue("JENKINS-18813") public void testRemoveTrigger() { - AbstractProject j = jenkins.createProjectFromXML("foo", getClass().getResourceAsStream("AbstractProjectTest/vectorTriggers.xml")) + AbstractProject p = j.jenkins.createProjectFromXML("foo", getClass().getResourceAsStream("AbstractProjectTest/vectorTriggers.xml")) - TriggerDescriptor SCM_TRIGGER_DESCRIPTOR = Hudson.instance.getDescriptorOrDie(SCMTrigger.class) - j.removeTrigger(SCM_TRIGGER_DESCRIPTOR); - assert j.triggers().size()==0 + TriggerDescriptor SCM_TRIGGER_DESCRIPTOR = j.jenkins.getDescriptorOrDie(SCMTrigger.class) + p.removeTrigger(SCM_TRIGGER_DESCRIPTOR); + assert p.triggers().size()==0 } + @Test @Issue("JENKINS-18813") public void testAddTriggerSameType() { - AbstractProject j = jenkins.createProjectFromXML("foo", getClass().getResourceAsStream("AbstractProjectTest/vectorTriggers.xml")) + AbstractProject p = j.jenkins.createProjectFromXML("foo", getClass().getResourceAsStream("AbstractProjectTest/vectorTriggers.xml")) def newTrigger = new SCMTrigger("H/5 * * * *") - j.addTrigger(newTrigger); + p.addTrigger(newTrigger); - assert j.triggers().size()==1 - def t = j.triggers()[0] + assert p.triggers().size()==1 + def t = p.triggers()[0] assert t.class==SCMTrigger.class; assert t.spec=="H/5 * * * *" } + @Test @Issue("JENKINS-18813") public void testAddTriggerDifferentType() { - AbstractProject j = jenkins.createProjectFromXML("foo", getClass().getResourceAsStream("AbstractProjectTest/vectorTriggers.xml")) + AbstractProject p = j.jenkins.createProjectFromXML("foo", getClass().getResourceAsStream("AbstractProjectTest/vectorTriggers.xml")) def newTrigger = new TimerTrigger("20 * * * *") - j.addTrigger(newTrigger); + p.addTrigger(newTrigger); - assert j.triggers().size()==2 - def t = j.triggers()[1] + assert p.triggers().size()==2 + def t = p.triggers()[1] assert t == newTrigger } + @Test @Issue("JENKINS-10615") public void testWorkspaceLock() { - def p = createFreeStyleProject() + def p = j.createFreeStyleProject() p.concurrentBuild = true; def e1 = new OneShotEvent(), e2=new OneShotEvent() def done = new OneShotEvent() @@ -519,45 +548,13 @@ public class AbstractProjectTest extends HudsonTestCase { done.signal() } - public void testRenameToPrivileged() { - def secret = jenkins.createProject(FreeStyleProject.class,"secret"); - def regular = jenkins.createProject(FreeStyleProject.class,"regular") - - jenkins.securityRealm = createDummySecurityRealm(); - def auth = new ProjectMatrixAuthorizationStrategy(); - jenkins.authorizationStrategy = auth; - - auth.add(Jenkins.ADMINISTER, "alice"); - auth.add(Jenkins.READ, "bob"); - - // bob the regular user can only see regular jobs - regular.addProperty(new AuthorizationMatrixProperty([(Job.READ) : ["bob"] as Set])); - - def wc = createWebClient() - wc.login("bob") - wc.executeOnServer { - assert jenkins.getItem("secret")==null; - try { - regular.renameTo("secret") - fail("rename as an overwrite should have failed"); - } catch (Exception e) { - // expected rename to fail in some non-descriptive generic way - e.printStackTrace() - } - } - - // those two jobs should still be there - assert jenkins.getItem("regular")!=null; - assert jenkins.getItem("secret")!=null; - } - - /** * Trying to POST to config.xml by a different job type should fail. */ + @Test public void testConfigDotXmlSubmissionToDifferentType() { - jenkins.crumbIssuer = null - def p = createFreeStyleProject() + j.jenkins.crumbIssuer = null + def p = j.createFreeStyleProject() HttpURLConnection con = postConfigDotXml(p, "") @@ -575,7 +572,7 @@ public class AbstractProjectTest extends HudsonTestCase { } private HttpURLConnection postConfigDotXml(FreeStyleProject p, String xml) { - HttpURLConnection con = new URL(getURL(), "job/${p.name}/config.xml").openConnection() + HttpURLConnection con = new URL(j.getURL(), "job/${p.name}/config.xml").openConnection() con.requestMethod = "POST" con.setRequestProperty("Content-Type", "application/xml") con.doOutput = true @@ -585,13 +582,15 @@ public class AbstractProjectTest extends HudsonTestCase { return con } + @Test @Issue("JENKINS-27549") public void testLoadingWithNPEOnTriggerStart() { - AbstractProject project = jenkins.createProjectFromXML("foo", getClass().getResourceAsStream("AbstractProjectTest/npeTrigger.xml")) + AbstractProject project = j.jenkins.createProjectFromXML("foo", getClass().getResourceAsStream("AbstractProjectTest/npeTrigger.xml")) assert project.triggers().size() == 1 } + @Test @Issue("JENKINS-30742") public void testResolveForCLI() { try { @@ -601,7 +600,7 @@ public class AbstractProjectTest extends HudsonTestCase { assert e.getMessage().contentEquals("No such job \u2018never_created\u2019 exists."); } - AbstractProject project = jenkins.createProject(FreeStyleProject.class, "never_created"); + AbstractProject project = j.jenkins.createProject(FreeStyleProject.class, "never_created"); try { AbstractProject not_found = AbstractProject.resolveForCLI("never_created1"); fail("Exception should occur before!"); @@ -611,7 +610,7 @@ public class AbstractProjectTest extends HudsonTestCase { } - static class MockBuildTriggerThrowsNPEOnStart extends Trigger { + static class MockBuildTriggerThrowsNPEOnStart extends Trigger { @Override public void start(hudson.model.Item project, boolean newInstance) { throw new NullPointerException(); } diff --git a/test/src/test/groovy/hudson/security/TokenBasedRememberMeServices2Test.groovy b/test/src/test/groovy/hudson/security/TokenBasedRememberMeServices2Test.groovy index 435eb4fbb7f8ab4b3f6c2eaaae948404e38f2586..4796f12b5baa5750e74da05bf6958c5975c9cef2 100644 --- a/test/src/test/groovy/hudson/security/TokenBasedRememberMeServices2Test.groovy +++ b/test/src/test/groovy/hudson/security/TokenBasedRememberMeServices2Test.groovy @@ -10,11 +10,10 @@ import org.acegisecurity.userdetails.User import org.acegisecurity.userdetails.UserDetails import org.acegisecurity.userdetails.UsernameNotFoundException import com.gargoylesoftware.htmlunit.util.Cookie -import org.junit.After -import org.junit.Before import org.junit.Rule import org.junit.Test import org.jvnet.hudson.test.JenkinsRule +import org.jvnet.hudson.test.LoggerRule import org.springframework.dao.DataAccessException import java.util.logging.Handler @@ -31,41 +30,11 @@ import static java.util.logging.Level.FINEST class TokenBasedRememberMeServices2Test { @Rule public JenkinsRule j = new JenkinsRule(); + @Rule + public LoggerRule logging = new LoggerRule() private boolean failureInduced; - private Logger logger = Logger.getLogger(TokenBasedRememberMeServices.class.name) - - private List logs = [] - private Handler loghandler - - @Before - public void setUp() { - loghandler = new Handler() { - @Override - void publish(LogRecord record) { - logs.add(record); - } - - @Override - void flush() { - } - - @Override - void close() throws SecurityException { - } - } - loghandler.level = FINEST - logger.addHandler(loghandler) - logger.level = FINEST - } - - @After - public void tearDown() { - logger.removeHandler(loghandler); - logger.level = null - } - @Test public void rememberMeAutoLoginFailure() { j.jenkins.securityRealm = new InvalidUserWhenLoggingBackInRealm() @@ -83,12 +52,12 @@ class TokenBasedRememberMeServices2Test { wc.cookieManager.addCookie(c); // even if SecurityRealm chokes, it shouldn't kill the page - logs.clear() + logging.capture(1000).record(TokenBasedRememberMeServices.class, FINEST) wc.goTo("") // make sure that the server recorded this failure assert failureInduced - assert logs.find { it.message.contains("contained username 'alice' but was not found")}!=null + assert logging.messages.find { it.contains("contained username 'alice' but was not found")}!=null // and the problematic cookie should have been removed assert getRememberMeCookie(wc)==null } diff --git a/test/src/test/groovy/hudson/util/TextFileTest.groovy b/test/src/test/groovy/hudson/util/TextFileTest.groovy index 9347b488a9144170976f194d366656693b027d8c..0299132fc8cc14eab87bfccd449ae72d5d1e65c7 100644 --- a/test/src/test/groovy/hudson/util/TextFileTest.groovy +++ b/test/src/test/groovy/hudson/util/TextFileTest.groovy @@ -44,9 +44,9 @@ class TextFileTest { f.text = getClass().getResource("ascii.txt").text def t = new TextFile(f) - def tail35 = "la, vitae interdum quam rutrum id.\n" - assert t.fastTail(35).equals(tail35) - assert tail35.length()==35 + def tailStr = "la, vitae interdum quam rutrum id." + System.lineSeparator() + assert t.fastTail(tailStr.length()).equals(tailStr) + assert tailStr.length()==(34 + System.lineSeparator().length()) } @Test diff --git a/test/src/test/groovy/jenkins/bugs/Jenkins41511Test.java b/test/src/test/groovy/jenkins/bugs/Jenkins41511Test.java new file mode 100644 index 0000000000000000000000000000000000000000..6f677865be3f3fa592564df169eca191674fee5a --- /dev/null +++ b/test/src/test/groovy/jenkins/bugs/Jenkins41511Test.java @@ -0,0 +1,27 @@ +package jenkins.bugs; + +import org.junit.BeforeClass; +import org.junit.Rule; +import org.junit.Test; +import org.jvnet.hudson.test.JenkinsRule; + +import hudson.security.HudsonPrivateSecurityRealm; +import jenkins.model.Jenkins; + +public class Jenkins41511Test { + + @BeforeClass + public static void setUpClass() { + System.setProperty(Jenkins.class.getName()+".slaveAgentPort", "10000"); + System.setProperty(Jenkins.class.getName()+".slaveAgentPortEnforce", "true"); + } + + @Rule + public JenkinsRule j = new JenkinsRule(); + + @Test + public void configRoundTrip() throws Exception { + Jenkins.getInstance().setSecurityRealm(new HudsonPrivateSecurityRealm(true, false, null)); + j.submit(j.createWebClient().goTo("configureSecurity").getFormByName("config")); + } +} diff --git a/test/src/test/java/hudson/ExtensionListTest.java b/test/src/test/java/hudson/ExtensionListTest.java index 398b7502addc4cd8721a76d996bf5e6385e354d8..bebe10ee25ccc4202e6d98deb8a2f434dddac839 100644 --- a/test/src/test/java/hudson/ExtensionListTest.java +++ b/test/src/test/java/hudson/ExtensionListTest.java @@ -10,12 +10,14 @@ import jenkins.model.Jenkins; import hudson.model.Descriptor; import hudson.model.Describable; import hudson.util.DescriptorList; +import java.util.ArrayList; import java.util.List; import java.util.Collection; import org.junit.Rule; import org.junit.Test; +import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.WithoutJenkins; @@ -140,7 +142,7 @@ public class ExtensionListTest { assertEquals(3,list.size()); assertNotNull(list.get(Sishamo.DescriptorImpl.class)); - // all 3 should be visisble from LIST, too + // all 3 should be visible from LIST, too assertEquals(3,LIST.size()); assertNotNull(LIST.findByName(Tai.class.getName())); assertNotNull(LIST.findByName(Sishamo.class.getName())); @@ -204,4 +206,15 @@ public class ExtensionListTest { assertEquals("mazda",list.get(1).name); assertEquals("toyota",list.get(2).name); } + + @Issue("JENKINS-39520") + @Test + public void removeAll() { + ExtensionList list = ExtensionList.lookup(Animal.class); + assertTrue(list.removeAll(new ArrayList<>(list))); + assertEquals(0, list.size()); + assertFalse(list.removeAll(new ArrayList<>(list))); + assertEquals(0, list.size()); + } + } diff --git a/test/src/test/java/hudson/PluginManagerTest.java b/test/src/test/java/hudson/PluginManagerTest.java index e7bb69de1bdd30314d605b917b6167826935fe93..7a22d84971b41850fe44dd1dc05b5220da85d08d 100644 --- a/test/src/test/java/hudson/PluginManagerTest.java +++ b/test/src/test/java/hudson/PluginManagerTest.java @@ -30,7 +30,10 @@ import hudson.model.Hudson; import hudson.model.UpdateCenter; import hudson.model.UpdateCenter.UpdateCenterJob; import hudson.model.UpdateSite; +import hudson.model.User; import hudson.scm.SubversionSCM; +import hudson.security.ACL; +import hudson.security.ACLContext; import hudson.util.FormValidation; import hudson.util.PersistedList; import java.io.File; @@ -47,12 +50,14 @@ import net.sf.json.JSONObject; import org.apache.commons.io.FileUtils; import org.apache.tools.ant.filters.StringInputStream; import static org.junit.Assert.*; +import static org.junit.Assume.assumeFalse; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.JenkinsRule; +import org.jvnet.hudson.test.MockAuthorizationStrategy; import org.jvnet.hudson.test.Url; import org.jvnet.hudson.test.recipes.WithPlugin; import org.jvnet.hudson.test.recipes.WithPluginManager; @@ -209,6 +214,7 @@ public class PluginManagerTest { } @Test public void prevalidateConfig() throws Exception { + assumeFalse("TODO: Implement this test on Windows", Functions.isWindows()); PersistedList sites = r.jenkins.getUpdateCenter().getSites(); sites.clear(); URL url = PluginManagerTest.class.getResource("/plugins/tasks-update-center.json"); @@ -444,6 +450,16 @@ public class PluginManagerTest { assertTrue(pluginInfo.getString("dependencies") != null); } + @Issue("JENKINS-41684") + @Test + public void requireSystemDuringLoad() throws Exception { + r.jenkins.setSecurityRealm(r.createDummySecurityRealm()); + r.jenkins.setAuthorizationStrategy(new MockAuthorizationStrategy()); + try (ACLContext context = ACL.as(User.get("underprivileged").impersonate())) { + dynamicLoad("require-system-during-load.hpi"); + } + } + private void dynamicLoad(String plugin) throws IOException, InterruptedException, RestartRequiredException { PluginManagerUtil.dynamicLoad(plugin, r.jenkins); } @@ -453,6 +469,7 @@ public class PluginManagerTest { } @Test public void uploadDependencyResolution() throws Exception { + assumeFalse("TODO: Implement this test for Windows", Functions.isWindows()); PersistedList sites = r.jenkins.getUpdateCenter().getSites(); sites.clear(); URL url = PluginManagerTest.class.getResource("/plugins/upload-test-update-center.json"); diff --git a/test/src/test/java/hudson/PluginWrapperTest.java b/test/src/test/java/hudson/PluginWrapperTest.java deleted file mode 100644 index 7529c5319495fc7645dbfe19d524417cd64d478d..0000000000000000000000000000000000000000 --- a/test/src/test/java/hudson/PluginWrapperTest.java +++ /dev/null @@ -1,26 +0,0 @@ -package hudson; - -import org.junit.Test; - -import static org.junit.Assert.assertEquals; - -public class PluginWrapperTest { - - @Test - public void dependencyTest() { - String version = "plugin:0.0.2"; - PluginWrapper.Dependency dependency = new PluginWrapper.Dependency(version); - assertEquals("plugin", dependency.shortName); - assertEquals("0.0.2", dependency.version); - assertEquals(false, dependency.optional); - } - - @Test - public void optionalDependencyTest() { - String version = "plugin:0.0.2;resolution:=optional"; - PluginWrapper.Dependency dependency = new PluginWrapper.Dependency(version); - assertEquals("plugin", dependency.shortName); - assertEquals("0.0.2", dependency.version); - assertEquals(true, dependency.optional); - } -} diff --git a/test/src/test/java/hudson/ProcStarterTest.java b/test/src/test/java/hudson/ProcStarterTest.java index d88f30f722ae6fc0d5d443d80586e5298b685baa..901aa7e0123e921bace2bff9cd324202f2ce55bd 100644 --- a/test/src/test/java/hudson/ProcStarterTest.java +++ b/test/src/test/java/hudson/ProcStarterTest.java @@ -103,7 +103,8 @@ public class ProcStarterTest { @Override public Environment setUp(AbstractBuild build, Launcher launcher, BuildListener listener) throws IOException, InterruptedException { - Launcher.ProcStarter starter = launcher.launch().cmds("echo", "Hello"); + String[] cmds = Functions.isWindows() ? new String[] { "cmd.exe", "/C", "echo", "Hello" } : new String[] { "echo", "Hello" }; + Launcher.ProcStarter starter = launcher.launch().cmds(cmds); starter.start(); starter.join(); return new Environment() { @@ -148,7 +149,9 @@ public class ProcStarterTest { @Override public boolean perform(AbstractBuild build, Launcher launcher, BuildListener listener) throws InterruptedException, IOException { - Launcher.ProcStarter starter = launcher.launch().cmds("echo", "Hello").pwd(new File("/this/path/doesnt/exist")); + String[] cmds = Functions.isWindows() ? new String[] { "cmd.exe", "/C", "echo", "Hello" } : new String[] { "echo", "Hello" }; + String path = Functions.isWindows() ? "C:\\this\\path\\doesn't\\exist" : "/this/path/doesnt/exist"; + Launcher.ProcStarter starter = launcher.launch().cmds(cmds).pwd(new File(path)); starter.start(); starter.join(); return true; diff --git a/test/src/test/java/hudson/ProcTest.java b/test/src/test/java/hudson/ProcTest.java index c3eebe20a08de2e3874465e62c90700164b6f991..4f7133ccff936cc07be7cdfa3e8d1080a2a16faf 100644 --- a/test/src/test/java/hudson/ProcTest.java +++ b/test/src/test/java/hudson/ProcTest.java @@ -2,6 +2,7 @@ package hudson; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; +import static org.junit.Assume.assumeFalse; import hudson.Launcher.LocalLauncher; import hudson.Launcher.RemoteLauncher; @@ -37,6 +38,7 @@ public class ProcTest { */ @Test public void remoteProcOutputSync() throws Exception { + assumeFalse("TODO: Implement this test for Windows", Functions.isWindows()); VirtualChannel ch = createSlaveChannel(); // keep the pipe fairly busy @@ -96,11 +98,13 @@ public class ProcTest { @Test public void ioPumpingWithLocalLaunch() throws Exception { + assumeFalse("TODO: Implement this test for Windows", Functions.isWindows()); doIoPumpingTest(new LocalLauncher(new StreamTaskListener(System.out, Charset.defaultCharset()))); } @Test public void ioPumpingWithRemoteLaunch() throws Exception { + assumeFalse("TODO: Implement this test for Windows", Functions.isWindows()); doIoPumpingTest(new RemoteLauncher( new StreamTaskListener(System.out, Charset.defaultCharset()), createSlaveChannel(), true)); diff --git a/test/src/test/java/hudson/bugs/JnlpAccessWithSecuredHudsonTest.java b/test/src/test/java/hudson/bugs/JnlpAccessWithSecuredHudsonTest.java index e047da3073a1812e81cb00b26d8d6786c014053d..af0c270163fb44166457ef83fded795ba0172afe 100644 --- a/test/src/test/java/hudson/bugs/JnlpAccessWithSecuredHudsonTest.java +++ b/test/src/test/java/hudson/bugs/JnlpAccessWithSecuredHudsonTest.java @@ -124,7 +124,7 @@ public class JnlpAccessWithSecuredHudsonTest extends HudsonTestCase { fail("SECURITY-206: " + channel.call(new Attack(f.getAbsolutePath()))); } catch (SecurityException x) { System.out.println("expected: " + x); - assertTrue(x.getMessage().contains("http://jenkins-ci.org/security-144")); + assertTrue(x.getMessage().contains("https://jenkins.io/redirect/security-144")); } return; } diff --git a/test/src/test/java/hudson/cli/AbstractBuildRangeCommand2Test.java b/test/src/test/java/hudson/cli/AbstractBuildRangeCommand2Test.java index d2643b2d1394ea8cbd7fe862f6abe200f551ed84..bea2d8de8a05c469760da2c40e430eb6c15940a3 100644 --- a/test/src/test/java/hudson/cli/AbstractBuildRangeCommand2Test.java +++ b/test/src/test/java/hudson/cli/AbstractBuildRangeCommand2Test.java @@ -25,10 +25,12 @@ package hudson.cli; import hudson.Extension; +import hudson.Functions; import hudson.model.AbstractBuild; import hudson.model.FreeStyleProject; import hudson.model.Job; import hudson.model.labels.LabelAtom; +import hudson.tasks.BatchFile; import hudson.tasks.Shell; import jenkins.model.Jenkins; import org.junit.Before; @@ -88,7 +90,7 @@ public class AbstractBuildRangeCommand2Test { @Test public void dummyRangeShouldSuccessEvenTheBuildIsRunning() throws Exception { FreeStyleProject project = j.createFreeStyleProject("aProject"); - project.getBuildersList().add(new Shell("echo 1\nsleep 10s")); + project.getBuildersList().add(Functions.isWindows() ? new BatchFile("echo 1\r\nping -n 10 127.0.0.1 >nul") : new Shell("echo 1\nsleep 10s")); assertThat("Job wasn't scheduled properly", project.scheduleBuild(0), equalTo(true)); // Wait until classProject is started (at least 1s) @@ -106,7 +108,7 @@ public class AbstractBuildRangeCommand2Test { .authorizedTo(Jenkins.READ, Job.READ) .invokeWithArgs("aProject", "1"); assertThat(result, succeeded()); - assertThat(result.stdout(), containsString("Builds: 1\n")); + assertThat(result.stdout(), containsString("Builds: 1" + System.lineSeparator())); } @Test public void dummyRangeShouldSuccessEvenTheBuildIsStuckInTheQueue() throws Exception { @@ -124,7 +126,7 @@ public class AbstractBuildRangeCommand2Test { .authorizedTo(Jenkins.READ, Job.READ) .invokeWithArgs("aProject", "1"); assertThat(result, succeeded()); - assertThat(result.stdout(), containsString("Builds: \n")); + assertThat(result.stdout(), containsString("Builds: " + System.lineSeparator())); } } diff --git a/test/src/test/java/hudson/cli/AbstractBuildRangeCommandTest.java b/test/src/test/java/hudson/cli/AbstractBuildRangeCommandTest.java index 50a4cf85cfed895e777fa576db2b182a09289bbf..cda886fc851a5b7360a78831d2696d9a920e0be2 100644 --- a/test/src/test/java/hudson/cli/AbstractBuildRangeCommandTest.java +++ b/test/src/test/java/hudson/cli/AbstractBuildRangeCommandTest.java @@ -119,13 +119,13 @@ public class AbstractBuildRangeCommandTest { .authorizedTo(Jenkins.READ, Job.READ) .invokeWithArgs(PROJECT_NAME, String.valueOf(BUILDS+1)); assertThat(result, succeeded()); - assertThat(result.stdout(), containsString("Builds: \n")); + assertThat(result.stdout(), containsString("Builds: "+System.lineSeparator())); result = command .authorizedTo(Jenkins.READ, Job.READ) .invokeWithArgs(PROJECT_NAME, String.valueOf(deleted[0])); assertThat(result, succeeded()); - assertThat(result.stdout(), containsString("Builds: \n")); + assertThat(result.stdout(), containsString("Builds: "+System.lineSeparator())); } @Test public void dummyRangeNumberSingleShouldSuccess() throws Exception { @@ -134,28 +134,28 @@ public class AbstractBuildRangeCommandTest { .authorizedTo(Jenkins.READ, Job.READ) .invokeWithArgs(PROJECT_NAME, "1"); assertThat(result, succeeded()); - assertThat(result.stdout(), containsString("Builds: 1\n")); + assertThat(result.stdout(), containsString("Builds: 1"+System.lineSeparator())); // First with plus symbol '+' result = command .authorizedTo(Jenkins.READ, Job.READ) .invokeWithArgs(PROJECT_NAME, "+1"); assertThat(result, succeeded()); - assertThat(result.stdout(), containsString("Builds: 1\n")); + assertThat(result.stdout(), containsString("Builds: 1"+System.lineSeparator())); // In the middle result = command .authorizedTo(Jenkins.READ, Job.READ) .invokeWithArgs(PROJECT_NAME, "10"); assertThat(result, succeeded()); - assertThat(result.stdout(), containsString("Builds: 10\n")); + assertThat(result.stdout(), containsString("Builds: 10"+System.lineSeparator())); // In the middle with plus symbol '+' result = command .authorizedTo(Jenkins.READ, Job.READ) .invokeWithArgs(PROJECT_NAME, "+10"); assertThat(result, succeeded()); - assertThat(result.stdout(), containsString("Builds: 10\n")); + assertThat(result.stdout(), containsString("Builds: 10"+System.lineSeparator())); // Last result = command @@ -163,7 +163,7 @@ public class AbstractBuildRangeCommandTest { .invokeWithArgs(PROJECT_NAME, String.valueOf(BUILDS)); assertThat(result, succeeded()); assertThat(result.stdout(), - containsString(String.format("Builds: %s\n", String.valueOf(BUILDS)))); + containsString(String.format("Builds: %s"+System.lineSeparator(), String.valueOf(BUILDS)))); // Last with the plus symbol '+' result = command @@ -171,7 +171,7 @@ public class AbstractBuildRangeCommandTest { .invokeWithArgs(PROJECT_NAME, '+' + String.valueOf(BUILDS)); assertThat(result, succeeded()); assertThat(result.stdout(), - containsString(String.format("Builds: %s\n", String.valueOf(BUILDS)))); + containsString(String.format("Builds: %s"+System.lineSeparator(), String.valueOf(BUILDS)))); } @Test public void dummyRangeNumberSingleShouldSuccessIfBuildNumberIsZero() throws Exception { @@ -179,13 +179,13 @@ public class AbstractBuildRangeCommandTest { .authorizedTo(Jenkins.READ, Job.READ) .invokeWithArgs(PROJECT_NAME, "0"); assertThat(result, succeeded()); - assertThat(result.stdout(), containsString("Builds: \n")); + assertThat(result.stdout(), containsString("Builds: "+System.lineSeparator())); result = command .authorizedTo(Jenkins.READ, Job.READ) .invokeWithArgs(PROJECT_NAME, "+0"); assertThat(result, succeeded()); - assertThat(result.stdout(), containsString("Builds: \n")); + assertThat(result.stdout(), containsString("Builds: "+System.lineSeparator())); } @Test public void dummyRangeNumberSingleShouldFailIfBuildNumberIsNegative() throws Exception { @@ -227,7 +227,7 @@ public class AbstractBuildRangeCommandTest { .authorizedTo(Jenkins.READ, Job.READ) .invokeWithArgs(PROJECT_NAME, ""); assertThat(result, succeeded()); - assertThat(result.stdout(), containsString("Builds: \n")); + assertThat(result.stdout(), containsString("Builds: "+System.lineSeparator())); } @Test public void dummyRangeNumberSingleShouldFailIfBuildNumberIsSpace() throws Exception { @@ -244,7 +244,7 @@ public class AbstractBuildRangeCommandTest { .authorizedTo(Jenkins.READ, Job.READ) .invokeWithArgs(PROJECT_NAME, ","); assertThat(result, succeeded()); - assertThat(result.stdout(), containsString("Builds: \n")); + assertThat(result.stdout(), containsString("Builds: "+System.lineSeparator())); } @Test public void dummyRangeNumberSingleShouldFailIfBuildNumberIsHyphen() throws Exception { @@ -261,40 +261,40 @@ public class AbstractBuildRangeCommandTest { .authorizedTo(Jenkins.READ, Job.READ) .invokeWithArgs(PROJECT_NAME, "1,2"); assertThat(result, succeeded()); - assertThat(result.stdout(), containsString("Builds: 1,2\n")); + assertThat(result.stdout(), containsString("Builds: 1,2"+System.lineSeparator())); // With plus symbol '+' result = command .authorizedTo(Jenkins.READ, Job.READ) .invokeWithArgs(PROJECT_NAME, "1,+2,4"); assertThat(result, succeeded()); - assertThat(result.stdout(), containsString("Builds: 1,2,4\n")); + assertThat(result.stdout(), containsString("Builds: 1,2,4"+System.lineSeparator())); // Build specified twice result = command .authorizedTo(Jenkins.READ, Job.READ) .invokeWithArgs(PROJECT_NAME, "1,1"); assertThat(result, succeeded()); - assertThat(result.stdout(), containsString("Builds: 1,1\n")); + assertThat(result.stdout(), containsString("Builds: 1,1"+System.lineSeparator())); // Build with zero build number result = command .authorizedTo(Jenkins.READ, Job.READ) .invokeWithArgs(PROJECT_NAME, "0,1,2"); assertThat(result, succeeded()); - assertThat(result.stdout(), containsString("Builds: 1,2\n")); + assertThat(result.stdout(), containsString("Builds: 1,2"+System.lineSeparator())); result = command .authorizedTo(Jenkins.READ, Job.READ) .invokeWithArgs(PROJECT_NAME, "1,0,2"); assertThat(result, succeeded()); - assertThat(result.stdout(), containsString("Builds: 1,2\n")); + assertThat(result.stdout(), containsString("Builds: 1,2"+System.lineSeparator())); result = command .authorizedTo(Jenkins.READ, Job.READ) .invokeWithArgs(PROJECT_NAME, "1,2,0"); assertThat(result, succeeded()); - assertThat(result.stdout(), containsString("Builds: 1,2\n")); + assertThat(result.stdout(), containsString("Builds: 1,2"+System.lineSeparator())); } @Test public void dummyRangeNumberMultiShouldSuccessIfSomeBuildDoesNotExist() throws Exception { @@ -302,19 +302,19 @@ public class AbstractBuildRangeCommandTest { .authorizedTo(Jenkins.READ, Job.READ) .invokeWithArgs(PROJECT_NAME, "1,2,"+deleted[0]); assertThat(result, succeeded()); - assertThat(result.stdout(), containsString("Builds: 1,2\n")); + assertThat(result.stdout(), containsString("Builds: 1,2"+System.lineSeparator())); result = command .authorizedTo(Jenkins.READ, Job.READ) .invokeWithArgs(PROJECT_NAME, String.format("1,%d,%d", deleted[0], deleted[0]+1)); assertThat(result, succeeded()); - assertThat(result.stdout(), containsString(String.format("Builds: 1,%d\n", deleted[0]+1))); + assertThat(result.stdout(), containsString(String.format("Builds: 1,%d"+System.lineSeparator(), deleted[0]+1))); result = command .authorizedTo(Jenkins.READ, Job.READ) .invokeWithArgs(PROJECT_NAME, String.format("%d,%d,%d", deleted[0]-1, deleted[0], deleted[0]+1)); assertThat(result, succeeded()); - assertThat(result.stdout(), containsString(String.format("Builds: %d,%d\n", deleted[0]-1, deleted[0]+1))); + assertThat(result.stdout(), containsString(String.format("Builds: %d,%d"+System.lineSeparator(), deleted[0]-1, deleted[0]+1))); } @Test public void dummyRangeNumberMultiShouldFailIfBuildNumberIsNegative() throws Exception { @@ -504,25 +504,25 @@ public class AbstractBuildRangeCommandTest { .authorizedTo(Jenkins.READ, Job.READ) .invokeWithArgs(PROJECT_NAME, "1-2"); assertThat(result, succeeded()); - assertThat(result.stdout(), containsString("Builds: 1,2\n")); + assertThat(result.stdout(), containsString("Builds: 1,2"+System.lineSeparator())); result = command .authorizedTo(Jenkins.READ, Job.READ) .invokeWithArgs(PROJECT_NAME, "+1-+2"); assertThat(result, succeeded()); - assertThat(result.stdout(), containsString("Builds: 1,2\n")); + assertThat(result.stdout(), containsString("Builds: 1,2"+System.lineSeparator())); result = command .authorizedTo(Jenkins.READ, Job.READ) .invokeWithArgs(PROJECT_NAME, "1-1"); assertThat(result, succeeded()); - assertThat(result.stdout(), containsString("Builds: 1\n")); + assertThat(result.stdout(), containsString("Builds: 1"+System.lineSeparator())); result = command .authorizedTo(Jenkins.READ, Job.READ) .invokeWithArgs(PROJECT_NAME, "+1-+1"); assertThat(result, succeeded()); - assertThat(result.stdout(), containsString("Builds: 1\n")); + assertThat(result.stdout(), containsString("Builds: 1"+System.lineSeparator())); result = command .authorizedTo(Jenkins.READ, Job.READ) @@ -536,49 +536,49 @@ public class AbstractBuildRangeCommandTest { builds += i; next = true; } - assertThat(result.stdout(), containsString("Builds: "+builds+"\n")); + assertThat(result.stdout(), containsString("Builds: "+builds+System.lineSeparator())); result = command .authorizedTo(Jenkins.READ, Job.READ) .invokeWithArgs(PROJECT_NAME, "+1-+"+deleted[0]); assertThat(result, succeeded()); - assertThat(result.stdout(), containsString("Builds: "+builds+"\n")); + assertThat(result.stdout(), containsString("Builds: "+builds+System.lineSeparator())); result = command .authorizedTo(Jenkins.READ, Job.READ) .invokeWithArgs(PROJECT_NAME, "0-1"); assertThat(result, succeeded()); - assertThat(result.stdout(), containsString("Builds: 1\n")); + assertThat(result.stdout(), containsString("Builds: 1"+System.lineSeparator())); result = command .authorizedTo(Jenkins.READ, Job.READ) .invokeWithArgs(PROJECT_NAME, "+0-+1"); assertThat(result, succeeded()); - assertThat(result.stdout(), containsString("Builds: 1\n")); + assertThat(result.stdout(), containsString("Builds: 1"+System.lineSeparator())); result = command .authorizedTo(Jenkins.READ, Job.READ) .invokeWithArgs(PROJECT_NAME, "0-2"); assertThat(result, succeeded()); - assertThat(result.stdout(), containsString("Builds: 1,2\n")); + assertThat(result.stdout(), containsString("Builds: 1,2"+System.lineSeparator())); result = command .authorizedTo(Jenkins.READ, Job.READ) .invokeWithArgs(PROJECT_NAME, "+0-+2"); assertThat(result, succeeded()); - assertThat(result.stdout(), containsString("Builds: 1,2\n")); + assertThat(result.stdout(), containsString("Builds: 1,2"+System.lineSeparator())); result = command .authorizedTo(Jenkins.READ, Job.READ) .invokeWithArgs(PROJECT_NAME, "0-0"); assertThat(result, succeeded()); - assertThat(result.stdout(), containsString("Builds: \n")); + assertThat(result.stdout(), containsString("Builds: "+System.lineSeparator())); result = command .authorizedTo(Jenkins.READ, Job.READ) .invokeWithArgs(PROJECT_NAME, "+0-+0"); assertThat(result, succeeded()); - assertThat(result.stdout(), containsString("Builds: \n")); + assertThat(result.stdout(), containsString("Builds: "+System.lineSeparator())); } @Test public void dummyRangeRangeSingleShouldSuccessIfSomeBuildDoesNotExist() throws Exception { @@ -586,19 +586,19 @@ public class AbstractBuildRangeCommandTest { .authorizedTo(Jenkins.READ, Job.READ) .invokeWithArgs(PROJECT_NAME, String.format("%d-%d", deleted[0], deleted[0]+1)); assertThat(result, succeeded()); - assertThat(result.stdout(), containsString(String.format("Builds: %d\n", deleted[0] + 1))); + assertThat(result.stdout(), containsString(String.format("Builds: %d"+System.lineSeparator(), deleted[0] + 1))); result = command .authorizedTo(Jenkins.READ, Job.READ) .invokeWithArgs(PROJECT_NAME, String.format("%d-%d", deleted[0]-1, deleted[0]+1)); assertThat(result, succeeded()); - assertThat(result.stdout(), containsString(String.format("Builds: %d,%d\n", deleted[0]-1, deleted[0]+1))); + assertThat(result.stdout(), containsString(String.format("Builds: %d,%d"+System.lineSeparator(), deleted[0]-1, deleted[0]+1))); result = command .authorizedTo(Jenkins.READ, Job.READ) .invokeWithArgs(PROJECT_NAME, String.format("%d-%d", deleted[0]-1, deleted[0])); assertThat(result, succeeded()); - assertThat(result.stdout(), containsString(String.format("Builds: %d\n", deleted[0]-1))); + assertThat(result.stdout(), containsString(String.format("Builds: %d"+System.lineSeparator(), deleted[0]-1))); } @Test public void dummyRangeRangeSingleShouldFailIfBuildRangeContainsZeroAndNegative() throws Exception { @@ -955,25 +955,25 @@ public class AbstractBuildRangeCommandTest { .authorizedTo(Jenkins.READ, Job.READ) .invokeWithArgs(PROJECT_NAME, "1-2,3-4"); assertThat(result, succeeded()); - assertThat(result.stdout(), containsString("Builds: 1,2,3,4\n")); + assertThat(result.stdout(), containsString("Builds: 1,2,3,4"+System.lineSeparator())); result = command .authorizedTo(Jenkins.READ, Job.READ) .invokeWithArgs(PROJECT_NAME, "1-3,3-4"); assertThat(result, succeeded()); - assertThat(result.stdout(), containsString("Builds: 1,2,3,3,4\n")); + assertThat(result.stdout(), containsString("Builds: 1,2,3,3,4"+System.lineSeparator())); result = command .authorizedTo(Jenkins.READ, Job.READ) .invokeWithArgs(PROJECT_NAME, "1-4,2-3"); assertThat(result, succeeded()); - assertThat(result.stdout(), containsString("Builds: 1,2,3,4,2,3\n")); + assertThat(result.stdout(), containsString("Builds: 1,2,3,4,2,3"+System.lineSeparator())); result = command .authorizedTo(Jenkins.READ, Job.READ) .invokeWithArgs(PROJECT_NAME, "1-2,4-5"); assertThat(result, succeeded()); - assertThat(result.stdout(), containsString("Builds: 1,2,4\n")); + assertThat(result.stdout(), containsString("Builds: 1,2,4"+System.lineSeparator())); } @Extension diff --git a/test/src/test/java/hudson/cli/CLIActionTest.java b/test/src/test/java/hudson/cli/CLIActionTest.java index b42a89b329fa9a03e345f1d096b26802d85eb003..8a808673a48311bc4233df0ca67c2d925ec70684 100644 --- a/test/src/test/java/hudson/cli/CLIActionTest.java +++ b/test/src/test/java/hudson/cli/CLIActionTest.java @@ -65,10 +65,10 @@ public class CLIActionTest { @Test public void security218_take2() throws Exception { pool = Executors.newCachedThreadPool(); - try { + try (CLI cli = new CLI(j.getURL())) { List/**/ commands = new ArrayList(); commands.add(new Security218()); - new CLI(j.getURL()).execute(commands); + cli.execute(commands); fail("Expected the call to be rejected"); } catch (Exception e) { assertThat(Functions.printThrowable(e), containsString("Rejected: " + Security218.class.getName())); @@ -89,7 +89,6 @@ public class CLIActionTest { settings.setHttpMethod(HttpMethod.POST); settings.setAdditionalHeader("Session", UUID.randomUUID().toString()); settings.setAdditionalHeader("Side", "download"); // We try to download something to init the duplex channel - settings = wc.addCrumb(settings); Page page = wc.getPage(settings); WebResponse webResponse = page.getWebResponse(); diff --git a/test/src/test/java/hudson/cli/ConnectNodeCommandTest.java b/test/src/test/java/hudson/cli/ConnectNodeCommandTest.java index d35aef81c25a3e8cba5e332f392cf31255314564..ec714605a879850d746f9cbec04c27db2b18aadd 100644 --- a/test/src/test/java/hudson/cli/ConnectNodeCommandTest.java +++ b/test/src/test/java/hudson/cli/ConnectNodeCommandTest.java @@ -64,7 +64,7 @@ public class ConnectNodeCommandTest { assertThat(result, failedWith(6)); assertThat(result, hasNoStandardOutput()); assertThat(result.stderr(), containsString("ERROR: user is missing the Agent/Connect permission")); - assertThat(result.stderr(), not(containsString("ERROR: Error occured while performing this command, see previous stderr output."))); + assertThat(result.stderr(), not(containsString("ERROR: " + CLICommand.CLI_LISTPARAM_SUMMARY_ERROR_TEXT))); } @Test public void connectNodeShouldFailIfNodeDoesNotExist() throws Exception { @@ -74,7 +74,7 @@ public class ConnectNodeCommandTest { assertThat(result, failedWith(3)); assertThat(result, hasNoStandardOutput()); assertThat(result.stderr(), containsString("ERROR: No such agent \"never_created\" exists.")); - assertThat(result.stderr(), not(containsString("ERROR: Error occured while performing this command, see previous stderr output."))); + assertThat(result.stderr(), not(containsString("ERROR: " + CLICommand.CLI_LISTPARAM_SUMMARY_ERROR_TEXT))); } @Test public void connectNodeShouldSucceed() throws Exception { @@ -156,7 +156,7 @@ public class ConnectNodeCommandTest { assertThat(result, failedWith(5)); assertThat(result, hasNoStandardOutput()); assertThat(result.stderr(), containsString("never_created: No such agent \"never_created\" exists. Did you mean \"aNode1\"?")); - assertThat(result.stderr(), containsString("ERROR: Error occured while performing this command, see previous stderr output.")); + assertThat(result.stderr(), containsString("ERROR: " + CLICommand.CLI_LISTPARAM_SUMMARY_ERROR_TEXT)); assertThat(slave1.toComputer().isOnline(), equalTo(true)); assertThat(slave2.toComputer().isOnline(), equalTo(true)); } diff --git a/test/src/test/java/hudson/cli/ConsoleCommandTest.java b/test/src/test/java/hudson/cli/ConsoleCommandTest.java index f48f0fe1ed9b4b78cec0c7bcc0f23507c3dabd8c..1f4033e0c2d7ff9bdf88dbce9f948ad53f8fab1a 100644 --- a/test/src/test/java/hudson/cli/ConsoleCommandTest.java +++ b/test/src/test/java/hudson/cli/ConsoleCommandTest.java @@ -24,12 +24,14 @@ package hudson.cli; +import hudson.Functions; import hudson.model.FreeStyleProject; import hudson.model.Item; import hudson.model.Job; import hudson.model.Result; import hudson.model.Run; import hudson.model.labels.LabelAtom; +import hudson.tasks.BatchFile; import hudson.tasks.Shell; import jenkins.model.Jenkins; import org.junit.Before; @@ -156,7 +158,11 @@ public class ConsoleCommandTest { @Test public void consoleShouldSuccessWithLastBuild() throws Exception { FreeStyleProject project = j.createFreeStyleProject("aProject"); - project.getBuildersList().add(new Shell("echo 1")); + if (Functions.isWindows()) { + project.getBuildersList().add(new BatchFile("echo 1")); + } else { + project.getBuildersList().add(new Shell("echo 1")); + } assertThat(project.scheduleBuild2(0).get().getLog(), containsString("echo 1")); final CLICommandInvoker.Result result = command @@ -170,7 +176,11 @@ public class ConsoleCommandTest { @Test public void consoleShouldSuccessWithSpecifiedBuildNumber() throws Exception { FreeStyleProject project = j.createFreeStyleProject("aProject"); - project.getBuildersList().add(new Shell("echo ${BUILD_NUMBER}")); + if (Functions.isWindows()) { + project.getBuildersList().add(new BatchFile("echo %BUILD_NUMBER%")); + } else { + project.getBuildersList().add(new Shell("echo ${BUILD_NUMBER}")); + } assertThat(project.scheduleBuild2(0).get().getLog(), containsString("echo 1")); assertThat(project.scheduleBuild2(0).get().getLog(), containsString("echo 2")); assertThat(project.scheduleBuild2(0).get().getLog(), containsString("echo 3")); @@ -184,10 +194,15 @@ public class ConsoleCommandTest { } @Test public void consoleShouldSuccessWithFollow() throws Exception { - FreeStyleProject project = j.createFreeStyleProject("aProject"); - project.getBuildersList().add(new Shell("echo start - ${BUILD_NUMBER}\nsleep 10s\n" - + "echo after sleep - ${BUILD_NUMBER}")); + //TODO: do we really want to sleep for 10 seconds? + if(Functions.isWindows()) { + project.getBuildersList().add(new BatchFile("echo start - %BUILD_NUMBER%\r\n" + + "ping -n 10 127.0.0.1 >nul\r\necho after sleep - %BUILD_NUMBER%")); + } else { + project.getBuildersList().add(new Shell("echo start - ${BUILD_NUMBER}\nsleep 10s\n" + + "echo after sleep - ${BUILD_NUMBER}")); + } if (!project.scheduleBuild(0)) { fail("Job wasn't scheduled properly"); } @@ -229,14 +244,18 @@ public class ConsoleCommandTest { @Test public void consoleShouldSuccessWithLastNLines() throws Exception { FreeStyleProject project = j.createFreeStyleProject("aProject"); - project.getBuildersList().add(new Shell("echo 1\necho 2\necho 3\necho 4\necho 5")); + if(Functions.isWindows()) { + project.getBuildersList().add(new BatchFile("echo 1\r\necho 2\r\necho 3\r\necho 4\r\necho 5")); + } else { + project.getBuildersList().add(new Shell("echo 1\necho 2\necho 3\necho 4\necho 5")); + } project.scheduleBuild2(0).get(); assertThat(project.getBuildByNumber(1).getLog(), containsString("echo 1")); assertThat(project.getBuildByNumber(1).getLog(), containsString("echo 5")); final CLICommandInvoker.Result result = command .authorizedTo(Jenkins.READ, Job.READ, Item.BUILD) - .invokeWithArgs("aProject", "1", "-n", "4"); + .invokeWithArgs("aProject", "1", "-n", Functions.isWindows() ? "5" : "4"); assertThat(result, succeeded()); assertThat(result.stdout(), not(containsString("echo 1"))); @@ -246,9 +265,16 @@ public class ConsoleCommandTest { @Test public void consoleShouldSuccessWithLastNLinesAndFollow() throws Exception { FreeStyleProject project = j.createFreeStyleProject("aProject"); - project.getBuildersList().add(new Shell("echo 1\necho 2\necho 3\necho 4\necho 5\n" - + "sleep 10s\n" - + "echo 6\necho 7\necho 8\necho 9")); + //TODO: do we really want to sleep for 10 seconds? + if (Functions.isWindows()) { + // the ver >NUL is to reset ERRORLEVEL so we don't fail (ping causes the error) + project.getBuildersList().add(new BatchFile("echo 1\r\necho 2\r\necho 3\r\necho 4\r\necho 5\r\n" + + "ping -n 10 127.0.0.1 >nul\r\necho 6\r\necho 7\r\necho 8\r\necho 9")); + } else { + project.getBuildersList().add(new Shell("echo 1\necho 2\necho 3\necho 4\necho 5\n" + + "sleep 10s\n" + + "echo 6\necho 7\necho 8\necho 9")); + } if (!project.scheduleBuild(0)) { fail("Job wasn't scheduled properly"); @@ -270,7 +296,7 @@ public class ConsoleCommandTest { CLICommandInvoker.Result result = command .authorizedTo(Jenkins.READ, Job.READ, Item.BUILD) - .invokeWithArgs("aProject", "1", "-f", "-n", "4"); + .invokeWithArgs("aProject", "1", "-f", "-n", Functions.isWindows() ? "5" : "4"); assertThat(result, succeeded()); assertThat(result.stdout(), not(containsString("echo 1"))); diff --git a/test/src/test/java/hudson/cli/CopyJobCommandTest.java b/test/src/test/java/hudson/cli/CopyJobCommandTest.java index 8d34edcd8e7e3dd3777fbd02880bebb475e0ad82..ac9218a71f7f7e09e4a513ba34596258c826075b 100644 --- a/test/src/test/java/hudson/cli/CopyJobCommandTest.java +++ b/test/src/test/java/hudson/cli/CopyJobCommandTest.java @@ -24,7 +24,6 @@ package hudson.cli; -import edu.umd.cs.findbugs.annotations.SuppressWarnings; import static hudson.cli.CLICommandInvoker.Matcher.*; import hudson.model.AbstractItem; import hudson.model.FreeStyleProject; @@ -47,7 +46,6 @@ import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.MockFolder; -@SuppressWarnings("DM_DEFAULT_ENCODING") public class CopyJobCommandTest { @Rule public JenkinsRule j = new JenkinsRule(); diff --git a/test/src/test/java/hudson/cli/DeleteBuildsCommandTest.java b/test/src/test/java/hudson/cli/DeleteBuildsCommandTest.java index 59d338c2d629d31b87e2a022043925cd90afceb7..0b111edd87d2ae9913e93e2b1611c8e08522c4c2 100644 --- a/test/src/test/java/hudson/cli/DeleteBuildsCommandTest.java +++ b/test/src/test/java/hudson/cli/DeleteBuildsCommandTest.java @@ -24,6 +24,7 @@ package hudson.cli; +import hudson.Functions; import hudson.model.ExecutorTest; import hudson.model.FreeStyleProject; import hudson.model.Job; @@ -43,6 +44,7 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.hasSize; +import static org.junit.Assume.assumeFalse; /** * @author pjanouse @@ -135,6 +137,7 @@ public class DeleteBuildsCommandTest { } @Test public void deleteBuildsShouldSuccessEvenTheBuildIsRunning() throws Exception { + assumeFalse("You can't delete files that are in use on Windows", Functions.isWindows()); FreeStyleProject project = j.createFreeStyleProject("aProject"); ExecutorTest.startBlockingBuild(project); assertThat(((FreeStyleProject) j.jenkins.getItem("aProject")).getBuilds(), hasSize(1)); diff --git a/test/src/test/java/hudson/cli/DeleteJobCommandTest.java b/test/src/test/java/hudson/cli/DeleteJobCommandTest.java index 1bf3622f9929cd98ea65cbaa64204356b207946e..81a5bb96694fcc79a987c805e476268066134dc3 100644 --- a/test/src/test/java/hudson/cli/DeleteJobCommandTest.java +++ b/test/src/test/java/hudson/cli/DeleteJobCommandTest.java @@ -131,7 +131,7 @@ public class DeleteJobCommandTest { assertThat(result, failedWith(5)); assertThat(result, hasNoStandardOutput()); assertThat(result.stderr(), containsString("never_created: No such job 'never_created'")); - assertThat(result.stderr(), containsString("ERROR: Error occured while performing this command, see previous stderr output.")); + assertThat(result.stderr(), containsString("ERROR: " + CLICommand.CLI_LISTPARAM_SUMMARY_ERROR_TEXT)); assertThat(j.jenkins.getItem("aProject1"), nullValue()); assertThat(j.jenkins.getItem("aProject2"), nullValue()); @@ -150,7 +150,7 @@ public class DeleteJobCommandTest { assertThat(result, failedWith(5)); assertThat(result, hasNoStandardOutput()); assertThat(result.stderr(), containsString("never_created: No such job 'never_created'")); - assertThat(result.stderr(), containsString("ERROR: Error occured while performing this command, see previous stderr output.")); + assertThat(result.stderr(), containsString("ERROR: " + CLICommand.CLI_LISTPARAM_SUMMARY_ERROR_TEXT)); assertThat(j.jenkins.getItem("aProject1"), nullValue()); assertThat(j.jenkins.getItem("aProject2"), nullValue()); @@ -169,7 +169,7 @@ public class DeleteJobCommandTest { assertThat(result, failedWith(5)); assertThat(result, hasNoStandardOutput()); assertThat(result.stderr(), containsString("never_created: No such job 'never_created'")); - assertThat(result.stderr(), containsString("ERROR: Error occured while performing this command, see previous stderr output.")); + assertThat(result.stderr(), containsString("ERROR: " + CLICommand.CLI_LISTPARAM_SUMMARY_ERROR_TEXT)); assertThat(j.jenkins.getItem("aProject1"), nullValue()); assertThat(j.jenkins.getItem("aProject2"), nullValue()); @@ -189,7 +189,7 @@ public class DeleteJobCommandTest { assertThat(result, hasNoStandardOutput()); assertThat(result.stderr(), containsString("never_created1: No such job 'never_created1'")); assertThat(result.stderr(), containsString("never_created2: No such job 'never_created2'")); - assertThat(result.stderr(), containsString("ERROR: Error occured while performing this command, see previous stderr output.")); + assertThat(result.stderr(), containsString("ERROR: " + CLICommand.CLI_LISTPARAM_SUMMARY_ERROR_TEXT)); assertThat(j.jenkins.getItem("aProject1"), nullValue()); assertThat(j.jenkins.getItem("aProject2"), nullValue()); diff --git a/test/src/test/java/hudson/cli/DeleteNodeCommandTest.java b/test/src/test/java/hudson/cli/DeleteNodeCommandTest.java index 07ddcdca2a2483c11b40008d7a119c254abd24c4..a75607bc30ddd6d1cb16bb48387ccf135d7e0c5f 100644 --- a/test/src/test/java/hudson/cli/DeleteNodeCommandTest.java +++ b/test/src/test/java/hudson/cli/DeleteNodeCommandTest.java @@ -118,7 +118,7 @@ public class DeleteNodeCommandTest { assertThat(result, failedWith(5)); assertThat(result, hasNoStandardOutput()); assertThat(result.stderr(), containsString("never_created: No such node 'never_created'")); - assertThat(result.stderr(), containsString("ERROR: Error occured while performing this command, see previous stderr output.")); + assertThat(result.stderr(), containsString("ERROR: " + CLICommand.CLI_LISTPARAM_SUMMARY_ERROR_TEXT)); assertThat(j.jenkins.getView("aNode1"), nullValue()); assertThat(j.jenkins.getView("aNode2"), nullValue()); @@ -137,7 +137,7 @@ public class DeleteNodeCommandTest { assertThat(result, failedWith(5)); assertThat(result, hasNoStandardOutput()); assertThat(result.stderr(), containsString("never_created: No such node 'never_created'")); - assertThat(result.stderr(), containsString("ERROR: Error occured while performing this command, see previous stderr output.")); + assertThat(result.stderr(), containsString("ERROR: " + CLICommand.CLI_LISTPARAM_SUMMARY_ERROR_TEXT)); assertThat(j.jenkins.getView("aNode1"), nullValue()); assertThat(j.jenkins.getView("aNode2"), nullValue()); @@ -156,7 +156,7 @@ public class DeleteNodeCommandTest { assertThat(result, failedWith(5)); assertThat(result, hasNoStandardOutput()); assertThat(result.stderr(), containsString("never_created: No such node 'never_created'")); - assertThat(result.stderr(), containsString("ERROR: Error occured while performing this command, see previous stderr output.")); + assertThat(result.stderr(), containsString("ERROR: " + CLICommand.CLI_LISTPARAM_SUMMARY_ERROR_TEXT)); assertThat(j.jenkins.getView("aNode1"), nullValue()); assertThat(j.jenkins.getView("aNode2"), nullValue()); @@ -176,7 +176,7 @@ public class DeleteNodeCommandTest { assertThat(result, hasNoStandardOutput()); assertThat(result.stderr(), containsString("never_created1: No such node 'never_created1'")); assertThat(result.stderr(), containsString("never_created2: No such node 'never_created2'")); - assertThat(result.stderr(), containsString("ERROR: Error occured while performing this command, see previous stderr output.")); + assertThat(result.stderr(), containsString("ERROR: " + CLICommand.CLI_LISTPARAM_SUMMARY_ERROR_TEXT)); assertThat(j.jenkins.getView("aNode1"), nullValue()); assertThat(j.jenkins.getView("aNode2"), nullValue()); diff --git a/test/src/test/java/hudson/cli/DeleteViewCommandTest.java b/test/src/test/java/hudson/cli/DeleteViewCommandTest.java index 732270fcccc7c98b7fedd169341d4d406c2b66fe..40ab7db0a483dffe1b3c1cbee46b4c67f0893035 100644 --- a/test/src/test/java/hudson/cli/DeleteViewCommandTest.java +++ b/test/src/test/java/hudson/cli/DeleteViewCommandTest.java @@ -33,6 +33,7 @@ import static hudson.cli.CLICommandInvoker.Matcher.hasNoStandardOutput; import static hudson.cli.CLICommandInvoker.Matcher.succeededSilently; import static hudson.cli.CLICommandInvoker.Matcher.failedWith; +import hudson.model.AllView; import java.io.IOException; import hudson.model.ListView; @@ -116,16 +117,16 @@ public class DeleteViewCommandTest { final CLICommandInvoker.Result result = command .authorizedTo(View.READ, View.DELETE, Jenkins.READ) - .invokeWithArgs("All") + .invokeWithArgs(AllView.DEFAULT_VIEW_NAME) ; assertThat(result, failedWith(4)); assertThat(result, hasNoStandardOutput()); - assertThat(j.jenkins.getView("All"), notNullValue()); - assertThat(result.stderr(), containsString("ERROR: Jenkins does not allow to delete 'All' view")); + assertThat(j.jenkins.getView(AllView.DEFAULT_VIEW_NAME), notNullValue()); + assertThat(result.stderr(), containsString("ERROR: Jenkins does not allow to delete '"+AllView.DEFAULT_VIEW_NAME+"' view")); } - @Test public void deleteViewShoudlFailIfViewNameIsEmpty() { + @Test public void deleteViewShouldFailIfViewNameIsEmpty() { final CLICommandInvoker.Result result = command .authorizedTo(View.READ, View.DELETE, Jenkins.READ) .invokeWithArgs("") @@ -136,7 +137,7 @@ public class DeleteViewCommandTest { assertThat(result.stderr(), containsString("ERROR: View name is empty")); } - @Test public void deleteViewShoudlFailIfViewNameIsSpace() { + @Test public void deleteViewShouldFailIfViewNameIsSpace() { final CLICommandInvoker.Result result = command .authorizedTo(View.READ, View.DELETE, Jenkins.READ) .invokeWithArgs(" ") @@ -175,7 +176,7 @@ public class DeleteViewCommandTest { assertThat(result, failedWith(5)); assertThat(result, hasNoStandardOutput()); assertThat(result.stderr(), containsString("never_created: No view named never_created inside view Jenkins")); - assertThat(result.stderr(), containsString("ERROR: Error occured while performing this command, see previous stderr output.")); + assertThat(result.stderr(), containsString("ERROR: " + CLICommand.CLI_LISTPARAM_SUMMARY_ERROR_TEXT)); assertThat(j.jenkins.getView("aView1"), nullValue()); assertThat(j.jenkins.getView("aView2"), nullValue()); @@ -194,7 +195,7 @@ public class DeleteViewCommandTest { assertThat(result, failedWith(5)); assertThat(result, hasNoStandardOutput()); assertThat(result.stderr(), containsString("never_created: No view named never_created inside view Jenkins")); - assertThat(result.stderr(), containsString("ERROR: Error occured while performing this command, see previous stderr output.")); + assertThat(result.stderr(), containsString("ERROR: " + CLICommand.CLI_LISTPARAM_SUMMARY_ERROR_TEXT)); assertThat(j.jenkins.getView("aView1"), nullValue()); assertThat(j.jenkins.getView("aView2"), nullValue()); @@ -213,7 +214,7 @@ public class DeleteViewCommandTest { assertThat(result, failedWith(5)); assertThat(result, hasNoStandardOutput()); assertThat(result.stderr(), containsString("never_created: No view named never_created inside view Jenkins")); - assertThat(result.stderr(), containsString("ERROR: Error occured while performing this command, see previous stderr output.")); + assertThat(result.stderr(), containsString("ERROR: " + CLICommand.CLI_LISTPARAM_SUMMARY_ERROR_TEXT)); assertThat(j.jenkins.getView("aView1"), nullValue()); assertThat(j.jenkins.getView("aView2"), nullValue()); @@ -233,7 +234,7 @@ public class DeleteViewCommandTest { assertThat(result, hasNoStandardOutput()); assertThat(result.stderr(), containsString("never_created1: No view named never_created1 inside view Jenkins")); assertThat(result.stderr(), containsString("never_created2: No view named never_created2 inside view Jenkins")); - assertThat(result.stderr(), containsString("ERROR: Error occured while performing this command, see previous stderr output.")); + assertThat(result.stderr(), containsString("ERROR: " + CLICommand.CLI_LISTPARAM_SUMMARY_ERROR_TEXT)); assertThat(j.jenkins.getView("aView1"), nullValue()); assertThat(j.jenkins.getView("aView2"), nullValue()); @@ -262,15 +263,15 @@ public class DeleteViewCommandTest { final CLICommandInvoker.Result result = command .authorizedTo(View.READ, View.DELETE, Jenkins.READ) - .invokeWithArgs("aView1", "aView2", "All"); + .invokeWithArgs("aView1", "aView2", AllView.DEFAULT_VIEW_NAME); assertThat(result, failedWith(5)); assertThat(result, hasNoStandardOutput()); - assertThat(result.stderr(), containsString("All: Jenkins does not allow to delete 'All' view")); - assertThat(result.stderr(), containsString("ERROR: Error occured while performing this command, see previous stderr output.")); + assertThat(result.stderr(), containsString(AllView.DEFAULT_VIEW_NAME+": Jenkins does not allow to delete '"+ AllView.DEFAULT_VIEW_NAME+"' view")); + assertThat(result.stderr(), containsString("ERROR: " + CLICommand.CLI_LISTPARAM_SUMMARY_ERROR_TEXT)); assertThat(j.jenkins.getView("aView1"), nullValue()); assertThat(j.jenkins.getView("aView2"), nullValue()); - assertThat(j.jenkins.getView("All"), notNullValue()); + assertThat(j.jenkins.getView(AllView.DEFAULT_VIEW_NAME), notNullValue()); } } diff --git a/test/src/test/java/hudson/cli/DisconnectNodeCommandTest.java b/test/src/test/java/hudson/cli/DisconnectNodeCommandTest.java index 858a3c9ec0d799c3fde276eff42c9aced40dfd6c..534ef0f0b0122bc9bd5e35f0a29a57fe5f01ab04 100644 --- a/test/src/test/java/hudson/cli/DisconnectNodeCommandTest.java +++ b/test/src/test/java/hudson/cli/DisconnectNodeCommandTest.java @@ -68,7 +68,7 @@ public class DisconnectNodeCommandTest { assertThat(result, failedWith(6)); assertThat(result, hasNoStandardOutput()); assertThat(result.stderr(), containsString("ERROR: user is missing the Agent/Disconnect permission")); - assertThat(result.stderr(), not(containsString("ERROR: Error occured while performing this command, see previous stderr output."))); + assertThat(result.stderr(), not(containsString("ERROR: " + CLICommand.CLI_LISTPARAM_SUMMARY_ERROR_TEXT))); } @Test @@ -79,7 +79,7 @@ public class DisconnectNodeCommandTest { assertThat(result, failedWith(3)); assertThat(result, hasNoStandardOutput()); assertThat(result.stderr(), containsString("ERROR: No such agent \"never_created\" exists.")); - assertThat(result.stderr(), not(containsString("ERROR: Error occured while performing this command, see previous stderr output."))); + assertThat(result.stderr(), not(containsString("ERROR: " + CLICommand.CLI_LISTPARAM_SUMMARY_ERROR_TEXT))); } @Test @@ -233,7 +233,7 @@ public class DisconnectNodeCommandTest { assertThat(result, failedWith(5)); assertThat(result, hasNoStandardOutput()); assertThat(result.stderr(), containsString("never_created: No such agent \"never_created\" exists. Did you mean \"aNode1\"?")); - assertThat(result.stderr(), containsString("ERROR: Error occured while performing this command, see previous stderr output.")); + assertThat(result.stderr(), containsString("ERROR: " + CLICommand.CLI_LISTPARAM_SUMMARY_ERROR_TEXT)); assertThat(slave1.toComputer().isOffline(), equalTo(true)); assertThat(slave1.toComputer().getOfflineCause(), instanceOf(OfflineCause.ByCLI.class)); assertThat(((OfflineCause.ByCLI) slave1.toComputer().getOfflineCause()).message, equalTo("aCause")); diff --git a/test/src/test/java/hudson/cli/GetJobCommandTest.java b/test/src/test/java/hudson/cli/GetJobCommandTest.java index cc36bff8b10f07ce0b1d78ed6af76094d0563a4f..8a52cfed0ccb2f41ae4d6d14eeb7ba59b575dd27 100644 --- a/test/src/test/java/hudson/cli/GetJobCommandTest.java +++ b/test/src/test/java/hudson/cli/GetJobCommandTest.java @@ -24,7 +24,6 @@ package hudson.cli; -import edu.umd.cs.findbugs.annotations.SuppressWarnings; import hudson.model.FreeStyleProject; import java.io.ByteArrayOutputStream; import java.io.PrintStream; @@ -38,7 +37,6 @@ import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.MockFolder; -@SuppressWarnings("DM_DEFAULT_ENCODING") public class GetJobCommandTest { @Rule public JenkinsRule j = new JenkinsRule(); diff --git a/test/src/test/java/hudson/cli/OfflineNodeCommandTest.java b/test/src/test/java/hudson/cli/OfflineNodeCommandTest.java index a1623f853b5190d376ae61aa2a07f6d5cfcd2c9d..0dae4a56576469fb2172b56d38d5560e267e40cc 100644 --- a/test/src/test/java/hudson/cli/OfflineNodeCommandTest.java +++ b/test/src/test/java/hudson/cli/OfflineNodeCommandTest.java @@ -74,7 +74,7 @@ public class OfflineNodeCommandTest { assertThat(result, failedWith(6)); assertThat(result, hasNoStandardOutput()); assertThat(result.stderr(), containsString("ERROR: user is missing the Agent/Disconnect permission")); - assertThat(result.stderr(), not(containsString("ERROR: Error occured while performing this command, see previous stderr output."))); + assertThat(result.stderr(), not(containsString("ERROR: " + CLICommand.CLI_LISTPARAM_SUMMARY_ERROR_TEXT))); } @Test @@ -85,7 +85,7 @@ public class OfflineNodeCommandTest { assertThat(result, failedWith(3)); assertThat(result, hasNoStandardOutput()); assertThat(result.stderr(), containsString("ERROR: No such agent \"never_created\" exists.")); - assertThat(result.stderr(), not(containsString("ERROR: Error occured while performing this command, see previous stderr output."))); + assertThat(result.stderr(), not(containsString("ERROR: " + CLICommand.CLI_LISTPARAM_SUMMARY_ERROR_TEXT))); } @Test @@ -371,7 +371,7 @@ public class OfflineNodeCommandTest { assertThat(result, failedWith(5)); assertThat(result, hasNoStandardOutput()); assertThat(result.stderr(), containsString("never_created: No such agent \"never_created\" exists. Did you mean \"aNode1\"?")); - assertThat(result.stderr(), containsString("ERROR: Error occured while performing this command, see previous stderr output.")); + assertThat(result.stderr(), containsString("ERROR: " + CLICommand.CLI_LISTPARAM_SUMMARY_ERROR_TEXT)); assertThat(slave1.toComputer().isOffline(), equalTo(true)); assertThat(slave1.toComputer().getOfflineCause(), instanceOf(OfflineCause.ByCLI.class)); assertThat(((OfflineCause.ByCLI) slave1.toComputer().getOfflineCause()).message, equalTo(null)); @@ -397,7 +397,7 @@ public class OfflineNodeCommandTest { assertThat(result, failedWith(5)); assertThat(result, hasNoStandardOutput()); assertThat(result.stderr(), containsString("never_created: No such agent \"never_created\" exists. Did you mean \"aNode1\"?")); - assertThat(result.stderr(), containsString("ERROR: Error occured while performing this command, see previous stderr output.")); + assertThat(result.stderr(), containsString("ERROR: " + CLICommand.CLI_LISTPARAM_SUMMARY_ERROR_TEXT)); assertThat(slave1.toComputer().isOffline(), equalTo(true)); assertThat(slave1.toComputer().getOfflineCause(), instanceOf(OfflineCause.ByCLI.class)); assertThat(((OfflineCause.ByCLI) slave1.toComputer().getOfflineCause()).message, equalTo("aCause")); diff --git a/test/src/test/java/hudson/cli/OnlineNodeCommandTest.java b/test/src/test/java/hudson/cli/OnlineNodeCommandTest.java index ac10883416533b4b318ad5b5c2bc11bbc661c2ca..97c84a6e8f1e2ae936ad476d89fcd4a92f5c0263 100644 --- a/test/src/test/java/hudson/cli/OnlineNodeCommandTest.java +++ b/test/src/test/java/hudson/cli/OnlineNodeCommandTest.java @@ -253,7 +253,7 @@ public class OnlineNodeCommandTest { assertThat(result, failedWith(5)); assertThat(result, hasNoStandardOutput()); assertThat(result.stderr(), containsString("never_created: No such agent \"never_created\" exists. Did you mean \"aNode1\"?")); - assertThat(result.stderr(), containsString("ERROR: Error occured while performing this command, see previous stderr output.")); + assertThat(result.stderr(), containsString("ERROR: " + CLICommand.CLI_LISTPARAM_SUMMARY_ERROR_TEXT)); if (slave1.toComputer().isConnecting()) { System.out.println("Waiting until aNode1 going online is in progress..."); slave1.toComputer().waitUntilOnline(); diff --git a/test/src/test/java/hudson/cli/ReloadJobCommandTest.java b/test/src/test/java/hudson/cli/ReloadJobCommandTest.java index 40869bab3fd5f9ab711cc0eb64003477227f03b9..a012090070ed5b3ce47ba85325fae4697d9467f9 100644 --- a/test/src/test/java/hudson/cli/ReloadJobCommandTest.java +++ b/test/src/test/java/hudson/cli/ReloadJobCommandTest.java @@ -25,8 +25,11 @@ package hudson.cli; import hudson.FilePath; +import hudson.Functions; import hudson.model.FreeStyleProject; import hudson.model.Job; +import hudson.tasks.BatchFile; +import hudson.tasks.Builder; import hudson.tasks.Shell; import jenkins.model.Jenkins; import org.junit.Before; @@ -58,7 +61,7 @@ public class ReloadJobCommandTest { @Test public void reloadJobShouldFailWithoutJobConfigurePermission() throws Exception { FreeStyleProject project = j.createFreeStyleProject("aProject"); - project.getBuildersList().add(new Shell("echo 1")); + project.getBuildersList().add(createScriptBuilder("echo 1")); assertThat(project.scheduleBuild2(0).get().getLog(), containsString("echo 1")); changeProjectOnTheDisc(project, "echo 1", "echo 2"); @@ -77,7 +80,7 @@ public class ReloadJobCommandTest { @Test public void reloadJobShouldFailWithoutJobReadPermission() throws Exception { FreeStyleProject project = j.createFreeStyleProject("aProject"); - project.getBuildersList().add(new Shell("echo 1")); + project.getBuildersList().add(createScriptBuilder("echo 1")); assertThat(project.scheduleBuild2(0).get().getLog(), containsString("echo 1")); changeProjectOnTheDisc(project, "echo 1", "echo 2"); @@ -96,7 +99,7 @@ public class ReloadJobCommandTest { @Test public void reloadJobShouldSucceed() throws Exception { FreeStyleProject project = j.createFreeStyleProject("aProject"); - project.getBuildersList().add(new Shell("echo 1")); + project.getBuildersList().add(createScriptBuilder("echo 1")); assertThat(project.scheduleBuild2(0).get().getLog(), containsString("echo 1")); @@ -134,13 +137,12 @@ public class ReloadJobCommandTest { } @Test public void reloadJobManyShouldSucceed() throws Exception { - FreeStyleProject project1 = j.createFreeStyleProject("aProject1"); - project1.getBuildersList().add(new Shell("echo 1")); + project1.getBuildersList().add(createScriptBuilder("echo 1")); FreeStyleProject project2 = j.createFreeStyleProject("aProject2"); - project2.getBuildersList().add(new Shell("echo 1")); + project2.getBuildersList().add(createScriptBuilder("echo 1")); FreeStyleProject project3 = j.createFreeStyleProject("aProject3"); - project3.getBuildersList().add(new Shell("echo 1")); + project3.getBuildersList().add(createScriptBuilder("echo 1")); assertThat(project1.scheduleBuild2(0).get().getLog(), containsString("echo 1")); assertThat(project2.scheduleBuild2(0).get().getLog(), containsString("echo 1")); @@ -164,9 +166,9 @@ public class ReloadJobCommandTest { @Test public void reloadJobManyShouldFailIfFirstJobDoesNotExist() throws Exception { FreeStyleProject project1 = j.createFreeStyleProject("aProject1"); - project1.getBuildersList().add(new Shell("echo 1")); + project1.getBuildersList().add(createScriptBuilder("echo 1")); FreeStyleProject project2 = j.createFreeStyleProject("aProject2"); - project2.getBuildersList().add(new Shell("echo 1")); + project2.getBuildersList().add(createScriptBuilder("echo 1")); assertThat(project1.scheduleBuild2(0).get().getLog(), containsString("echo 1")); assertThat(project2.scheduleBuild2(0).get().getLog(), containsString("echo 1")); @@ -181,7 +183,7 @@ public class ReloadJobCommandTest { assertThat(result, failedWith(5)); assertThat(result, hasNoStandardOutput()); assertThat(result.stderr(), containsString("never_created: No such job \u2018never_created\u2019 exists.")); - assertThat(result.stderr(), containsString("ERROR: Error occured while performing this command, see previous stderr output.")); + assertThat(result.stderr(), containsString("ERROR: " + CLICommand.CLI_LISTPARAM_SUMMARY_ERROR_TEXT)); assertThat(project1.scheduleBuild2(0).get().getLog(), containsString("echo 2")); assertThat(project2.scheduleBuild2(0).get().getLog(), containsString("echo 2")); @@ -190,9 +192,9 @@ public class ReloadJobCommandTest { @Test public void reloadJobManyShouldFailIfMiddleJobDoesNotExist() throws Exception { FreeStyleProject project1 = j.createFreeStyleProject("aProject1"); - project1.getBuildersList().add(new Shell("echo 1")); + project1.getBuildersList().add(createScriptBuilder("echo 1")); FreeStyleProject project2 = j.createFreeStyleProject("aProject2"); - project2.getBuildersList().add(new Shell("echo 1")); + project2.getBuildersList().add(createScriptBuilder("echo 1")); assertThat(project1.scheduleBuild2(0).get().getLog(), containsString("echo 1")); assertThat(project2.scheduleBuild2(0).get().getLog(), containsString("echo 1")); @@ -207,7 +209,7 @@ public class ReloadJobCommandTest { assertThat(result, failedWith(5)); assertThat(result, hasNoStandardOutput()); assertThat(result.stderr(), containsString("never_created: No such job \u2018never_created\u2019 exists.")); - assertThat(result.stderr(), containsString("ERROR: Error occured while performing this command, see previous stderr output.")); + assertThat(result.stderr(), containsString("ERROR: " + CLICommand.CLI_LISTPARAM_SUMMARY_ERROR_TEXT)); assertThat(project1.scheduleBuild2(0).get().getLog(), containsString("echo 2")); assertThat(project2.scheduleBuild2(0).get().getLog(), containsString("echo 2")); @@ -216,9 +218,9 @@ public class ReloadJobCommandTest { @Test public void reloadJobManyShouldFailIfLastJobDoesNotExist() throws Exception { FreeStyleProject project1 = j.createFreeStyleProject("aProject1"); - project1.getBuildersList().add(new Shell("echo 1")); + project1.getBuildersList().add(createScriptBuilder("echo 1")); FreeStyleProject project2 = j.createFreeStyleProject("aProject2"); - project2.getBuildersList().add(new Shell("echo 1")); + project2.getBuildersList().add(createScriptBuilder("echo 1")); assertThat(project1.scheduleBuild2(0).get().getLog(), containsString("echo 1")); assertThat(project2.scheduleBuild2(0).get().getLog(), containsString("echo 1")); @@ -233,7 +235,7 @@ public class ReloadJobCommandTest { assertThat(result, failedWith(5)); assertThat(result, hasNoStandardOutput()); assertThat(result.stderr(), containsString("never_created: No such job \u2018never_created\u2019 exists.")); - assertThat(result.stderr(), containsString("ERROR: Error occured while performing this command, see previous stderr output.")); + assertThat(result.stderr(), containsString("ERROR: " + CLICommand.CLI_LISTPARAM_SUMMARY_ERROR_TEXT)); assertThat(project1.scheduleBuild2(0).get().getLog(), containsString("echo 2")); assertThat(project2.scheduleBuild2(0).get().getLog(), containsString("echo 2")); @@ -242,9 +244,9 @@ public class ReloadJobCommandTest { @Test public void reloadJobManyShouldFailIfMoreJobsDoNotExist() throws Exception { FreeStyleProject project1 = j.createFreeStyleProject("aProject1"); - project1.getBuildersList().add(new Shell("echo 1")); + project1.getBuildersList().add(createScriptBuilder("echo 1")); FreeStyleProject project2 = j.createFreeStyleProject("aProject2"); - project2.getBuildersList().add(new Shell("echo 1")); + project2.getBuildersList().add(createScriptBuilder("echo 1")); assertThat(project1.scheduleBuild2(0).get().getLog(), containsString("echo 1")); assertThat(project2.scheduleBuild2(0).get().getLog(), containsString("echo 1")); @@ -260,18 +262,17 @@ public class ReloadJobCommandTest { assertThat(result, hasNoStandardOutput()); assertThat(result.stderr(), containsString("never_created1: No such job \u2018never_created1\u2019 exists.")); assertThat(result.stderr(), containsString("never_created2: No such job \u2018never_created2\u2019 exists.")); - assertThat(result.stderr(), containsString("ERROR: Error occured while performing this command, see previous stderr output.")); + assertThat(result.stderr(), containsString("ERROR: " + CLICommand.CLI_LISTPARAM_SUMMARY_ERROR_TEXT)); assertThat(project1.scheduleBuild2(0).get().getLog(), containsString("echo 2")); assertThat(project2.scheduleBuild2(0).get().getLog(), containsString("echo 2")); } @Test public void reloadJobManyShouldSucceedEvenAJobIsSpecifiedTwice() throws Exception { - FreeStyleProject project1 = j.createFreeStyleProject("aProject1"); - project1.getBuildersList().add(new Shell("echo 1")); + project1.getBuildersList().add(createScriptBuilder("echo 1")); FreeStyleProject project2 = j.createFreeStyleProject("aProject2"); - project2.getBuildersList().add(new Shell("echo 1")); + project2.getBuildersList().add(createScriptBuilder("echo 1")); assertThat(project1.scheduleBuild2(0).get().getLog(), containsString("echo 1")); assertThat(project2.scheduleBuild2(0).get().getLog(), containsString("echo 1")); @@ -303,4 +304,13 @@ public class ReloadJobCommandTest { FilePath fp = new FilePath(new File(project.getRootDir()+"/config.xml")); fp.write(fp.readToString().replace(oldstr, newstr), null); } + + /** + * Create a script based builder (either Shell or BatchFile) depending on platform + * @param script the contents of the script to run + * @return A Builder instance of either Shell or BatchFile + */ + private Builder createScriptBuilder(String script) { + return Functions.isWindows() ? new BatchFile(script) : new Shell(script); + } } diff --git a/test/src/test/java/hudson/cli/SetBuildDescriptionCommandTest.java b/test/src/test/java/hudson/cli/SetBuildDescriptionCommandTest.java index acc4ec779992fa4ae88467969a5136f3b1d00282..3f2931f1aa2084325fad2854b2eac1fa34104928 100644 --- a/test/src/test/java/hudson/cli/SetBuildDescriptionCommandTest.java +++ b/test/src/test/java/hudson/cli/SetBuildDescriptionCommandTest.java @@ -25,10 +25,13 @@ package hudson.cli; import hudson.FilePath; +import hudson.Functions; import hudson.model.FreeStyleBuild; import hudson.model.FreeStyleProject; import hudson.model.Job; import hudson.model.Run; +import hudson.tasks.BatchFile; +import hudson.tasks.Builder; import hudson.tasks.Shell; import jenkins.model.Jenkins; import org.junit.Before; @@ -61,7 +64,7 @@ public class SetBuildDescriptionCommandTest { @Test public void setBuildDescriptionShouldFailWithoutJobReadPermission() throws Exception { FreeStyleProject project = j.createFreeStyleProject("aProject"); - project.getBuildersList().add(new Shell("echo 1")); + project.getBuildersList().add(createScriptBuilder("echo 1")); assertThat(project.scheduleBuild2(0).get().getLog(), containsString("echo 1")); final CLICommandInvoker.Result result = command @@ -74,7 +77,7 @@ public class SetBuildDescriptionCommandTest { @Test public void setBuildDescriptionShouldFailWithoutRunUpdatePermission1() throws Exception { FreeStyleProject project = j.createFreeStyleProject("aProject"); - project.getBuildersList().add(new Shell("echo 1")); + project.getBuildersList().add(createScriptBuilder("echo 1")); assertThat(project.scheduleBuild2(0).get().getLog(), containsString("echo 1")); final CLICommandInvoker.Result result = command @@ -87,7 +90,7 @@ public class SetBuildDescriptionCommandTest { @Test public void setBuildDescriptionShouldSucceed() throws Exception { FreeStyleProject project = j.createFreeStyleProject("aProject"); - project.getBuildersList().add(new Shell("echo 1")); + project.getBuildersList().add(createScriptBuilder("echo 1")); FreeStyleBuild build = project.scheduleBuild2(0).get(); assertThat(build.getLog(), containsString("echo 1")); assertThat(build.getDescription(), equalTo(null)); @@ -133,7 +136,7 @@ public class SetBuildDescriptionCommandTest { @Test public void setBuildDescriptionShouldFailIfBuildDoesNotExist() throws Exception { FreeStyleProject project = j.createFreeStyleProject("aProject"); - project.getBuildersList().add(new Shell("echo 1")); + project.getBuildersList().add(createScriptBuilder("echo 1")); assertThat(project.scheduleBuild2(0).get().getLog(), containsString("echo 1")); final CLICommandInvoker.Result result = command @@ -145,4 +148,14 @@ public class SetBuildDescriptionCommandTest { assertThat(result.stderr(), containsString("ERROR: No such build #2")); } + //TODO: determine if this should be pulled out into JenkinsRule or something + /** + * Create a script based builder (either Shell or BatchFile) depending on platform + * @param script the contents of the script to run + * @return A Builder instance of either Shell or BatchFile + */ + private Builder createScriptBuilder(String script) { + return Functions.isWindows() ? new BatchFile(script) : new Shell(script); + } + } diff --git a/test/src/test/java/hudson/console/AnnotatedLargeTextTest.java b/test/src/test/java/hudson/console/AnnotatedLargeTextTest.java new file mode 100644 index 0000000000000000000000000000000000000000..43ca1aee547a1fa888df332f0d60acd577779677 --- /dev/null +++ b/test/src/test/java/hudson/console/AnnotatedLargeTextTest.java @@ -0,0 +1,126 @@ +/* + * The MIT License + * + * Copyright 2016 CloudBees, Inc. + * + * 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 hudson.console; + +import hudson.MarkupText; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.PrintStream; +import java.io.StringWriter; +import java.util.logging.Level; +import org.apache.commons.io.Charsets; +import static org.hamcrest.CoreMatchers.*; +import static org.junit.Assert.*; +import org.junit.ClassRule; +import org.junit.Rule; +import org.junit.Test; +import org.jvnet.hudson.test.For; +import org.jvnet.hudson.test.Issue; +import org.jvnet.hudson.test.JenkinsRule; +import org.jvnet.hudson.test.LoggerRule; +import org.kohsuke.stapler.framework.io.ByteBuffer; + +@For({AnnotatedLargeText.class, ConsoleNote.class, ConsoleAnnotationOutputStream.class, PlainTextConsoleOutputStream.class}) +public class AnnotatedLargeTextTest { + + @ClassRule + public static JenkinsRule r = new JenkinsRule(); + + @Rule + public LoggerRule logging = new LoggerRule().record(ConsoleAnnotationOutputStream.class, Level.FINE).capture(100); + + @Test + public void smokes() throws Exception { + ByteBuffer buf = new ByteBuffer(); + PrintStream ps = new PrintStream(buf, true); + ps.print("Some text.\n"); + ps.print("Go back to " + TestNote.encodeTo("/root", "your home") + ".\n"); + ps.print("More text.\n"); + AnnotatedLargeText text = new AnnotatedLargeText<>(buf, Charsets.UTF_8, true, null); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + text.writeLogTo(0, baos); + assertEquals("Some text.\nGo back to your home.\nMore text.\n", baos.toString()); + StringWriter w = new StringWriter(); + text.writeHtmlTo(0, w); + assertEquals("Some text.\nGo back to your home.\nMore text.\n", w.toString()); + } + + @Issue("SECURITY-382") + @Test + public void oldDeserialization() throws Exception { + ByteBuffer buf = new ByteBuffer(); + buf.write(("hello" + ConsoleNote.PREAMBLE_STR + "AAAAwR+LCAAAAAAAAP9dzLEOwVAUxvHThtiNprYxsGiMQhiwNSIhMR/tSZXr3Lr3oJPwPt7FM5hM3gFh8i3/5Bt+1yeUrYH6ap9Yza1Ys9WKWuMiR05wqWhEgpmyEy306Jxvwb19ccGNoBJjLplmgWq0xgOGCjkNZ2IyTrsRlFayVTs4gVMYqP3pw28/JnznuABF/rYWyIyeJfLQe1vxZiDQ7NnYZLn0UZGRRjA9MiV+0OyFv3+utadQyH8B+aJxVM4AAAA=" + ConsoleNote.POSTAMBLE_STR + "there\n").getBytes()); + AnnotatedLargeText text = new AnnotatedLargeText<>(buf, Charsets.UTF_8, true, null); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + text.writeLogTo(0, baos); + assertEquals("hellothere\n", baos.toString()); + StringWriter w = new StringWriter(); + text.writeHtmlTo(0, w); + assertEquals("hellothere\n", w.toString()); + assertThat(logging.getMessages(), hasItem("Failed to resurrect annotation")); // TODO assert that this is IOException: Refusing to deserialize unsigned note from an old log. + ConsoleNote.INSECURE = true; + try { + w = new StringWriter(); + text.writeHtmlTo(0, w); + assertThat(w.toString(), containsString("