diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 0e47cddae6..df64fc700f 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,3 +1,8 @@ + See [JENKINS-XXXXX](https://issues.jenkins-ci.org/browse/JENKINS-XXXXX). +### Proposed upgrade guidelines + +N/A + ### Submitter checklist - [ ] JIRA issue is well described -- [ ] Changelog entry appropriate for the audience affected by the change (users or developer, depending on the change). [Examples](https://github.com/jenkins-infra/jenkins.io/blob/master/content/_data/changelogs/weekly.yml) - * Use the `Internal: ` prefix if the change has no user-visible impact (API, test frameworks, etc.) +- [ ] Changelog entries and upgrade guidelines are appropriate for the audience affected by the change (users or developer, depending on the change). [Examples](https://github.com/jenkins-infra/jenkins.io/blob/master/content/_data/changelogs/weekly.yml) + * Fill-in the `Proposed changelog entries` section only if there are breaking changes or other changes which may require extra steps from users during the upgrade - [ ] Appropriate autotests or explanation to why this change has no tests - [ ] For dependency updates: links to external changelogs and, if possible, full diffs @@ -33,3 +42,15 @@ The changelogs will be integrated by the core maintainers after the merge. See + +### Maintainer checklist + +Before the changes are marked as `ready-for-merge`: + +- [ ] There are at least 2 approvals for the pull request and no outstanding requests for change +- [ ] Conversations in the pull request are over OR it is explicit that a reviewer does not block the change +- [ ] Changelog entries in the PR title and/or `Proposed changelog entries` are correct +- [ ] Proper changelog labels are set so that the changelog can be generated automatically +- [ ] If the change needs additional upgrade steps from users, `upgrade-guide-needed` label is set and there is a `Proposed upgrade guidelines` section in the PR title. ([example](https://github.com/jenkinsci/jenkins/pull/4387)) +- [ ] If it would make sense to backport the change to LTS, a JIRA issue should exist and be labeled as `lts-candidate` + diff --git a/.github/release-drafter.yml b/.github/release-drafter.yml new file mode 100644 index 0000000000..c716bd42ff --- /dev/null +++ b/.github/release-drafter.yml @@ -0,0 +1,15 @@ +# Configuration for Release Drafter: https://github.com/toolmantim/release-drafter +_extends: .github +# We use the 2-digit versioning in Jenkins weekly releases. +version-template: $MAJOR.$MINOR +name-template: $NEXT_MINOR_VERSION +tag-template: jenkins-$NEXT_MINOR_VERSION + +template: | + **Disclaimer**: This is an automatically generated changelog draft for Jenkins weekly releases. + See https://jenkins.io/changelog/ for the official changelogs. + For `changelog.yaml` drafts see GitHub action artifacts attached to release commits. + + $CHANGES + + All contributors: $CONTRIBUTORS diff --git a/.github/workflows/changelog.yml b/.github/workflows/changelog.yml new file mode 100644 index 0000000000..1c16d431d0 --- /dev/null +++ b/.github/workflows/changelog.yml @@ -0,0 +1,43 @@ +# Automates creation of changelog drafts using Release Drafter +# More Info: https://github.com/jenkinsci/.github/blob/master/.github/release-drafter.adoc +name: Changelog Drafter + +on: + push: + # branches to consider in the event; optional, defaults to all + branches: + - master + +jobs: + update_draft_release: + runs-on: ubuntu-latest + steps: + # Drafts your next Release notes as Pull Requests are merged into "master" + - name: Generate GitHub Release Draft + id: release-drafter + uses: release-drafter/release-drafter@v5.6.0 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + # Generates a YAML changelog file using https://github.com/jenkinsci/jenkins-core-changelog-generator + - name: Generate YAML changelog draft + id: jenkins-core-changelog-generator + uses: jenkinsci/jenkins-core-changelog-generator@master + env: + GITHUB_AUTH: github-actions:${{ secrets.GITHUB_TOKEN }} + - name: Upload Changelog YAML + uses: actions/upload-artifact@v1 + with: + name: changelog.yaml + path: changelog.yaml +#TODO(oleg-nenashev): It will not work well with Release Drafter which does not recreated releases. Asset does not get overwritten, and there is no ready-to-go API for overriding assets + # Upload YAML to the release draft assets +# - name: Upload changelog.yaml to the Release Draft +# id: upload-changelog-yaml +# uses: actions/upload-release-asset@v1.0.1 +# env: +# GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} +# with: +# upload_url: ${{ steps.release-drafter.outputs.upload_url }} +# asset_path: ./changelog.yaml +# asset_name: changelog.yaml +# asset_content_type: text/yaml diff --git a/.mvn/maven.config b/.mvn/maven.config index e54fdacfe6..2a0299c486 100644 --- a/.mvn/maven.config +++ b/.mvn/maven.config @@ -1 +1,2 @@ +-Pconsume-incrementals -Pmight-produce-incrementals diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 4311a35ac2..f362e4cfb9 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -9,12 +9,15 @@ This page provides information about contributing code to the Jenkins core codeb 1. Fork the repository on GitHub 2. Clone the forked repository to your machine 3. Install the development tools. In order to develop Jenkins, you need the following tools: - * Java Development Kit (JDK) 8. - - In Jenkins project we usually use [OpenJDK], - but you can use other JDKs as well. - - Java 9+ is **not supported** in Jenkins. - * Maven 3.5.3 or above. You can [download maven]. + * Java Development Kit (JDK) 8 or 11. + In Jenkins project we usually use [OpenJDK](http://openjdk.java.net/) or [AdoptOpenJDK](https://adoptopenjdk.net/), but you can use other JDKs as well. + * For JDK 11 there might be some compatibility issues in developer tools, + please see [this page](https://wiki.jenkins.io/display/JENKINS/Java+11+Developer+Guidelines#Java11DeveloperGuidelines-Knowndevelopertoolsissues) for more info. + If you hit a new issue, please report it with a `java11-devtools-compatibility` label in our issue tracker. + * Maven 3.5.4 or above. You can [download maven]. * Any IDE which supports importing Maven projects. + * Install [NodeJS](https://nodejs.org/en/). **Note:** only needed to work on the frontend assets found on the `war` module. + * Frontend tasks are ran using [yarn](https://yarnpkg.com/lang/en/). Run `npm install -g yarn` to install it. 4. Setup your development environment as described in [Preparing for Plugin Development] If you want to contribute to Jenkins or just learn about the project, @@ -30,7 +33,9 @@ There is a description of the [building and debugging process]. If you want simply to have the `jenkins.war` file as fast as possible without tests, run: - mvn clean package -pl war -am -DskipTests -Dfindbugs.skip +```sh +mvn -am -pl war,bom -DskipTests -Dspotbugs.skip clean install +``` The WAR file will be created in `war/target/jenkins.war`. After that you can start Jenkins using Java CLI ([guide]). @@ -38,6 +43,28 @@ If you want to debug this WAR file without using Maven plugins, You can just start the executable with [Remote Debug Flags] and then attach IDE Debugger to it. +To launch a development instance, after the above command run: + +```sh +mvn -pl war jetty:run +``` + +(Beware that `maven-plugin` builds will not work in this mode due to class loading conflicts.) + +### Building frontend assets + +To work on the `war` module frontend assets two processes are needed at the same time: + +On one terminal, start a development server that will not process frontend assets: +```sh +mvn -pl war jetty:run -Dskip.yarn +``` + +On another terminal, move to the war folder and start a [webpack](https://webpack.js.org/) dev server: +```sh +cd war; yarn start +``` + ## Testing changes Jenkins core includes unit and functional tests as a part of the repository. @@ -56,6 +83,13 @@ In addition to the included tests, you can also find extra integration and UI tests in the [Acceptance Test Harness (ATH)] repository. If you propose complex UI changes, you should create new ATH tests for them. +### JavaScript unit tests + +In case there's only need to run the JS tests: +```sh +cd war; yarn test +``` + ## Proposing Changes The Jenkins project source code repositories are hosted at GitHub. @@ -115,7 +149,6 @@ just submit a pull request. [download maven]: https://maven.apache.org/download.cgi [Preparing for Plugin Development]: https://jenkins.io/doc/developer/tutorial/prepare/ [newbie friendly issues]: https://issues.jenkins-ci.org/issues/?jql=project%20%3D%20JENKINS%20AND%20status%20in%20(Open%2C%20%22In%20Progress%22%2C%20Reopened)%20AND%20component%20%3D%20core%20AND%20labels%20in%20(newbie-friendly) -[OpenJDK]: http://openjdk.java.net/ [Participate]: https://jenkins.io/participate/ [building and debugging process]: https://jenkins.io/doc/developer/building/ [guide]: https://wiki.jenkins.io/display/JENKINS/Starting+and+Accessing+Jenkins @@ -124,8 +157,8 @@ just submit a pull request. [backporting process]: https://jenkins.io/download/lts/ [proposed template]: .github/PULL_REQUEST_TEMPLATE.md [MIT license]: ./LICENSE.txt -[contributor agreement]: https://wiki.jenkins.io/display/JENKINS/Copyright+on+source+code +[contributor agreement]: https://jenkins.io/project/governance/#cla [Jenkins Security Team]: https://jenkins.io/security/#team [ci.jenkins.io]: https://ci.jenkins.io/ [Jenkins Pipeline]: https://jenkins.io/doc/book/pipeline/ -[Jenkinsfile]: ./Jenkinsfile \ No newline at end of file +[Jenkinsfile]: ./Jenkinsfile diff --git a/Jenkinsfile b/Jenkinsfile index 436efd0ed3..62d7f503cc 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -3,20 +3,18 @@ /* * 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 - * to have Java installed, but some setups may have nodes that shouldn't have heavier builds running on them, so we - * make this explicit. "docker" would be any node with docker installed. */ +def buildNumber = BUILD_NUMBER as int; if (buildNumber > 1) milestone(buildNumber - 1); milestone(buildNumber) // JENKINS-43353 / JENKINS-58625 + // 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 properties([buildDiscarder(logRotator(numToKeepStr: '50', artifactNumToKeepStr: '3')), durabilityHint('PERFORMANCE_OPTIMIZED')]) -// see https://github.com/jenkins-infra/documentation/blob/master/ci.adoc for information on what node types are available -def buildTypes = ['Linux', 'Windows'] +// TODO: Restore 'Windows' once https://groups.google.com/forum/#!topic/jenkinsci-dev/v9d-XosOp2s is resolved +def buildTypes = ['Linux'] def jdks = [8, 11] def builds = [:] @@ -25,7 +23,8 @@ for(j = 0; j < jdks.size(); j++) { def buildType = buildTypes[i] def jdk = jdks[j] builds["${buildType}-jdk${jdk}"] = { - node(buildType.toLowerCase()) { + // see https://github.com/jenkins-infra/documentation/blob/master/ci.adoc#node-labels for information on what node types are available + node(buildType == 'Linux' ? (jdk == 8 ? 'maven' : 'maven-11') : buildType.toLowerCase()) { // First stage is actually checking out the source. Since we're using Multibranch // currently, we can use "checkout scm". stage('Checkout') { @@ -41,10 +40,10 @@ for(j = 0; j < jdks.size(); j++) { // 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", - "MAVEN_OPTS=-Xmx1536m -Xms512m"], jdk) { + "MAVEN_OPTS=-Xmx1536m -Xms512m"], buildType, jdk) { // Actually run Maven! // -Dmaven.repo.local=… tells Maven to create a subdir in the temporary directory for the local Maven repository - def mvnCmd = "mvn -Pdebug -U -Dset.changelist help:evaluate -Dexpression=changelist -Doutput=$changelistF clean install ${runTests ? '-Dmaven.test.failure.ignore' : '-DskipTests'} -V -B -Dmaven.repo.local=$m2repo -s settings-azure.xml -e" + def mvnCmd = "mvn -Pdebug -U -Dset.changelist help:evaluate -Dexpression=changelist -Doutput=$changelistF clean install ${runTests ? '-Dmaven.test.failure.ignore' : '-DskipTests'} -V -B -ntp -Dmaven.repo.local=$m2repo -e" if(isUnix()) { sh mvnCmd @@ -76,6 +75,7 @@ for(j = 0; j < jdks.size(); j++) { } }} +// TODO: Restore ATH once https://groups.google.com/forum/#!topic/jenkinsci-dev/v9d-XosOp2s is resolved // TODO: ATH flow now supports Java 8 only, it needs to be reworked (INFRA-1690) builds.ath = { node("docker&&highmem") { @@ -87,7 +87,7 @@ builds.ath = { checkout scm withMavenEnv(["JAVA_OPTS=-Xmx1536m -Xms512m", "MAVEN_OPTS=-Xmx1536m -Xms512m"], 8) { - sh "mvn --batch-mode --show-version -DskipTests -am -pl war package -Dmaven.repo.local=${pwd tmp: true}/m2repo -s settings-azure.xml" + sh "mvn --batch-mode --show-version -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn -DskipTests -am -pl war package -Dmaven.repo.local=${pwd tmp: true}/m2repo" } dir("war/target") { fileUri = "file://" + pwd() + "/jenkins.war" @@ -107,7 +107,14 @@ infra.maybePublishIncrementals() // 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 // body we passed in within that environment. -void withMavenEnv(List envVars = [], def javaVersion, def body) { +void withMavenEnv(List envVars = [], def buildType, def javaVersion, def body) { + if (buildType == 'Linux') { + // I.e., a Maven container using ACI. No need to install tools. + return withEnv(envVars) { + body.call() + } + } + // The names here are currently hardcoded for my test environment. This needs // to be made more flexible. // Using the "tool" Workflow call automatically installs those tools on the diff --git a/README.md b/README.md index 7ef6c08a8e..ee4ed648cb 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,13 @@ [![][ButlerImage]][website] # About + +[![Weekly Release](https://img.shields.io/badge/dynamic/json.svg?url=https://updates.jenkins.io/update-center.actual.json&label=Weekly%20Release&query=$.core.version&color=green)](https://jenkins.io/changelog/) +[![LTS Release](https://img.shields.io/badge/dynamic/json.svg?url=https://updates.jenkins.io/stable/update-center.actual.json&label=LTS%20Release&query=$.core.version&color=orange)](https://jenkins.io/changelog-stable/) +[![Docker Pulls](https://img.shields.io/docker/pulls/jenkins/jenkins.svg)](https://hub.docker.com/r/jenkins/jenkins/) + In a nutshell, Jenkins is the leading open-source automation server. -Built with Java, it provides over 1000 plugins to support automating virtually anything, +Built with Java, it provides over 1600 [plugins](https://plugins.jenkins.io/) to support automating virtually anything, so that humans can actually spend their time doing things machines cannot. # What to Use Jenkins for and When to Use It @@ -29,32 +34,11 @@ Follow the [contributing](CONTRIBUTING.md) file. All information about Jenkins can be found on our [website]. Follow us on Twitter [@jenkinsci]. # License -Jenkins is **licensed** under the **[MIT License]**. The terms of the license are as follows: +Jenkins is **licensed** under the **[MIT License]**. - The MIT License (MIT) - - Copyright (c) 2004 Kohsuke Kawaguchi, Sun Microsystems Inc., and a number of other 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. [ButlerImage]: https://jenkins.io/sites/default/files/jenkins_logo.png -[MIT License]: https://github.com/jenkinsci/jenkins/raw/master/LICENSE.txt +[MIT License]: https://github.com/jenkinsci/jenkins/blob/master/LICENSE.txt [Mirrors]: http://mirrors.jenkins-ci.org [GitHub]: https://github.com/jenkinsci/jenkins [website]: https://jenkins.io/ diff --git a/bom/pom.xml b/bom/pom.xml new file mode 100644 index 0000000000..6b93b53647 --- /dev/null +++ b/bom/pom.xml @@ -0,0 +1,203 @@ + + + + 4.0.0 + + + org.jenkins-ci.main + jenkins-parent + ${revision}${changelist} + + + org.jenkins-ci.main + jenkins-bom + pom + + Jenkins BOM + The module contains dependencies that are used by a specific Jenkins version + + + + 11.0.1 + 1.7.26 + + + + + + com.github.spotbugs + spotbugs-annotations + 3.1.11 + + + net.jcip + jcip-annotations + 1.0 + + + org.apache.ant + ant + 1.9.14 + + + commons-io + commons-io + 2.6 + + + commons-lang + commons-lang + 2.6 + + + commons-httpclient + commons-httpclient + 3.1-jenkins-1 + + + org.jenkins-ci.main + remoting + ${remoting.version} + + + com.google.guava + guava + ${guavaVersion} + + + com.google.guava + guava-testlib + ${guavaVersion} + + + com.google.inject + guice + 4.0 + + + + + org.slf4j + slf4j-api + ${slf4jVersion} + + + org.slf4j + slf4j-jdk14 + ${slf4jVersion} + + + org.slf4j + jcl-over-slf4j + ${slf4jVersion} + + + commons-logging + commons-logging + 1.2 + provided + + + org.slf4j + log4j-over-slf4j + ${slf4jVersion} + + + log4j + log4j + 1.2.17 + provided + + + org.samba.jcifs + jcifs + 1.3.17-kohsuke-1 + + + org.kohsuke + access-modifier-annotation + ${access-modifier-annotation.version} + + + + + javax.servlet + + servlet-api + [0] + + provided + true + + + + commons-codec + commons-codec + 1.12 + + + + org.jenkins-ci + annotation-indexer + 1.12 + + + + + + + + + org.codehaus.mojo + flatten-maven-plugin + + true + ${project.build.directory} + ${project.artifactId}-${project.version}.pom + + + + flatten + process-resources + + flatten + + + bom + + + + + + + + diff --git a/cli/pom.xml b/cli/pom.xml index 5cb529ccec..77375bbe7a 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -16,39 +16,54 @@ Medium + 5.5.2 + + + + org.jenkins-ci.main + jenkins-bom + ${project.version} + pom + import + + + + - org.powermock - powermock-module-junit4 + org.junit.jupiter + junit-jupiter-api + ${junit.jupiter.version} test - org.powermock - powermock-api-mockito2 + org.junit.jupiter + junit-jupiter-engine + ${junit.jupiter.version} + test + + + org.junit.jupiter + junit-jupiter + ${junit.jupiter.version} test org.kohsuke access-modifier-annotation + provided org.jenkins-ci annotation-indexer - - - commons-codec - commons-codec + true commons-io commons-io - - - ${project.groupId} - remoting - + true junit @@ -59,66 +74,88 @@ org.jvnet.localizer localizer 1.26 + true org.apache.sshd sshd-core 1.7.0 - true + true + + + + net.i2p.crypto + eddsa + 0.3.0 + true - - - net.i2p.crypto - eddsa - 0.3.0 - org.slf4j slf4j-jdk14 - true + true - - org.jenkins-ci - trilead-ssh2 - build214-jenkins-1 + + org.glassfish.tyrus.bundles + tyrus-standalone-client-jdk + 1.12 + true com.github.spotbugs spotbugs-annotations - true + provided commons-lang commons-lang + true - maven-assembly-plugin - - - - - single - - package - - - jar-with-dependencies - - - - hudson.cli.CLI - - - ${project.version} - - - - - + maven-surefire-plugin + 2.22.2 + + + org.apache.maven.plugins + maven-shade-plugin + 3.2.1 + + + package + + shade + + + false + + + javax.websocket + io.jenkins.cli.shaded.javax.websocket + + + org + io.jenkins.cli.shaded.org + + + net + io.jenkins.cli.shaded.net + + + + + hudson.cli.CLI + + ${project.version} + + + + + + + org.jvnet.localizer diff --git a/cli/src/main/java/hudson/cli/CLI.java b/cli/src/main/java/hudson/cli/CLI.java index 5b436b02b0..9c33baa358 100644 --- a/cli/src/main/java/hudson/cli/CLI.java +++ b/cli/src/main/java/hudson/cli/CLI.java @@ -23,7 +23,9 @@ */ package hudson.cli; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import hudson.cli.client.Messages; +import java.io.DataInputStream; import javax.net.ssl.HostnameVerifier; import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLContext; @@ -33,22 +35,33 @@ import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.net.URI; import java.net.URL; import java.net.URLConnection; +import java.nio.ByteBuffer; import java.nio.charset.Charset; import java.security.GeneralSecurityException; import java.security.KeyPair; import java.security.SecureRandom; import java.util.Arrays; +import java.util.Collections; import java.util.List; import java.util.Locale; +import java.util.Map; import java.util.Properties; import java.util.logging.Handler; import java.util.logging.Level; import java.util.logging.Logger; import static java.util.logging.Level.*; +import javax.websocket.ClientEndpointConfig; +import javax.websocket.Endpoint; +import javax.websocket.EndpointConfig; +import javax.websocket.Session; import org.apache.commons.io.FileUtils; import org.apache.commons.lang.StringUtils; +import org.glassfish.tyrus.client.ClientManager; +import org.glassfish.tyrus.client.ClientProperties; +import org.glassfish.tyrus.container.jdk.client.JdkClientContainer; /** * CLI entry point to Jenkins. @@ -91,7 +104,7 @@ public class CLI { } } - private enum Mode {HTTP, SSH} + private enum Mode {HTTP, SSH, WEB_SOCKET} public static int _main(String[] _args) throws Exception { List args = Arrays.asList(_args); PrivateKeyProvider provider = new PrivateKeyProvider(); @@ -101,8 +114,9 @@ public class CLI { if (url==null) url = System.getenv("HUDSON_URL"); - boolean tryLoadPKey = true; + boolean noKeyAuth = false; + // TODO perhaps allow mode to be defined by environment variable too (assuming $JENKINS_USER_ID can be used for -user) Mode mode = null; String user = null; @@ -137,6 +151,15 @@ public class CLI { args = args.subList(1, args.size()); continue; } + if (head.equals("-webSocket")) { + if (mode != null) { + printUsage("-webSocket clashes with previously defined mode " + mode); + return -1; + } + mode = Mode.WEB_SOCKET; + args = args.subList(1, args.size()); + continue; + } if (head.equals("-remoting")) { printUsage("-remoting mode is no longer supported"); return -1; @@ -153,6 +176,7 @@ public class CLI { HttpsURLConnection.setDefaultSSLSocketFactory(context.getSocketFactory()); // bypass host name check, too. HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() { + @SuppressFBWarnings(value = "WEAK_HOSTNAME_VERIFIER", justification = "User set parameter to skip verifier.") public boolean verify(String s, SSLSession sslSession) { return true; } @@ -161,12 +185,12 @@ public class CLI { continue; } if (head.equals("-noKeyAuth")) { - tryLoadPKey = false; + noKeyAuth = true; args = args.subList(1,args.size()); continue; } if(head.equals("-i") && args.size()>=2) { - File f = new File(args.get(1)); + File f = getFileFromArguments(args); if (!f.exists()) { printUsage(Messages.CLI_NoSuchFileExists(f)); return -1; @@ -229,9 +253,6 @@ public class CLI { if(args.isEmpty()) args = Arrays.asList("help"); // default to help - if (tryLoadPKey && !provider.hasKeys()) - provider.readFromDefaultLocations(); - if (mode == null) { mode = Mode.HTTP; } @@ -248,6 +269,9 @@ public class CLI { LOGGER.warning("-user required when using -ssh"); return -1; } + if (!noKeyAuth && !provider.hasKeys()) { + provider.readFromDefaultLocations(); + } return SSHCLI.sshConnection(url, user, args, provider, strictHostKey); } @@ -255,6 +279,10 @@ public class CLI { LOGGER.warning("-strictHostKey meaningful only with -ssh"); } + if (noKeyAuth) { + LOGGER.warning("-noKeyAuth meaningful only with -ssh"); + } + if (user != null) { LOGGER.warning("Warning: -user ignored unless using -ssh"); } @@ -264,82 +292,89 @@ public class CLI { if (userInfo != null) { factory = factory.basicAuth(userInfo); } else if (auth != null) { - factory = factory.basicAuth(auth.startsWith("@") ? FileUtils.readFileToString(new File(auth.substring(1))).trim() : auth); + factory = factory.basicAuth(auth.startsWith("@") ? readAuthFromFile(auth).trim() : auth); } if (mode == Mode.HTTP) { return plainHttpConnection(url, args, factory); } + if (mode == Mode.WEB_SOCKET) { + return webSocketConnection(url, args, factory); + } + throw new AssertionError(); } + @SuppressFBWarnings(value = {"PATH_TRAVERSAL_IN", "URLCONNECTION_SSRF_FD"}, justification = "User provided values for running the program.") + private static String readAuthFromFile(String auth) throws IOException { + return FileUtils.readFileToString(new File(auth.substring(1)), Charset.defaultCharset()); + } + + @SuppressFBWarnings(value = {"PATH_TRAVERSAL_IN", "URLCONNECTION_SSRF_FD"}, justification = "User provided values for running the program.") + private static File getFileFromArguments(List args) { + return new File(args.get(1)); + } + + private static int webSocketConnection(String url, List args, CLIConnectionFactory factory) throws Exception { + LOGGER.fine(() -> "Trying to connect to " + url + " via plain protocol over WebSocket"); + class CLIEndpoint extends Endpoint { + @Override + public void onOpen(Session session, EndpointConfig config) {} + } + class Authenticator extends ClientEndpointConfig.Configurator { + @Override + public void beforeRequest(Map> headers) { + if (factory.authorization != null) { + headers.put("Authorization", Collections.singletonList(factory.authorization)); + } + } + } + ClientManager client = ClientManager.createClient(JdkClientContainer.class.getName()); // ~ ContainerProvider.getWebSocketContainer() + client.getProperties().put(ClientProperties.REDIRECT_ENABLED, true); // https://tyrus-project.github.io/documentation/1.13.1/index/tyrus-proprietary-config.html#d0e1775 + Session session = client.connectToServer(new CLIEndpoint(), ClientEndpointConfig.Builder.create().configurator(new Authenticator()).build(), URI.create(url.replaceFirst("^http", "ws") + "cli/ws")); + PlainCLIProtocol.Output out = new PlainCLIProtocol.Output() { + @Override + public void send(byte[] data) throws IOException { + session.getBasicRemote().sendBinary(ByteBuffer.wrap(data)); + } + @Override + public void close() throws IOException { + session.close(); + } + }; + try (ClientSideImpl connection = new ClientSideImpl(out)) { + session.addMessageHandler(InputStream.class, is -> { + try { + connection.handle(new DataInputStream(is)); + } catch (IOException x) { + LOGGER.log(Level.WARNING, null, x); + } + }); + connection.start(args); + return connection.exit(); + } + } + private static int plainHttpConnection(String url, List args, CLIConnectionFactory factory) throws IOException, InterruptedException { LOGGER.log(FINE, "Trying to connect to {0} via plain protocol over HTTP", url); FullDuplexHttpStream streams = new FullDuplexHttpStream(new URL(url), "cli?remoting=false", factory.authorization); - class ClientSideImpl extends PlainCLIProtocol.ClientSide { - boolean complete; - int exit = -1; - ClientSideImpl(InputStream is, OutputStream os) throws IOException { - super(is, os); - if (is.read() != 0) { // cf. FullDuplexHttpService - throw new IOException("expected to see initial zero byte; perhaps you are connecting to an old server which does not support -http?"); - } + try (final ClientSideImpl connection = new ClientSideImpl(new PlainCLIProtocol.FramedOutput(streams.getOutputStream()))) { + connection.start(args); + InputStream is = streams.getInputStream(); + if (is.read() != 0) { // cf. FullDuplexHttpService + throw new IOException("expected to see initial zero byte; perhaps you are connecting to an old server which does not support -http?"); } - @Override - protected void onExit(int code) { - this.exit = code; - finished(); - } - @Override - protected void onStdout(byte[] chunk) throws IOException { - System.out.write(chunk); - } - @Override - protected void onStderr(byte[] chunk) throws IOException { - System.err.write(chunk); - } - @Override - protected void handleClose() { - finished(); - } - private synchronized void finished() { - complete = true; - notifyAll(); - } - } - try (final ClientSideImpl connection = new ClientSideImpl(streams.getInputStream(), streams.getOutputStream())) { - for (String arg : args) { - connection.sendArg(arg); - } - connection.sendEncoding(Charset.defaultCharset().name()); - connection.sendLocale(Locale.getDefault().toString()); - connection.sendStart(); - connection.begin(); - new Thread("input reader") { - @Override - public void run() { - try { - final OutputStream stdin = connection.streamStdin(); - int c; - while (!connection.complete && (c = System.in.read()) != -1) { - stdin.write(c); - } - connection.sendEndStdin(); - } catch (IOException x) { - LOGGER.log(Level.WARNING, null, x); - } - } - }.start(); + new PlainCLIProtocol.FramedReader(connection, is).start(); new Thread("ping") { // JENKINS-46659 @Override public void run() { try { - Thread.sleep(10_000); + Thread.sleep(PING_INTERVAL); while (!connection.complete) { LOGGER.fine("sending ping"); connection.sendEncoding(Charset.defaultCharset().name()); // no-op at this point - Thread.sleep(10_000); + Thread.sleep(PING_INTERVAL); } } catch (IOException | InterruptedException x) { LOGGER.log(Level.WARNING, null, x); @@ -347,15 +382,79 @@ public class CLI { } }.start(); - synchronized (connection) { - while (!connection.complete) { - connection.wait(); - } - } - return connection.exit; + return connection.exit(); } } + private static final class ClientSideImpl extends PlainCLIProtocol.ClientSide { + + volatile boolean complete; + private int exit = -1; + + ClientSideImpl(PlainCLIProtocol.Output out) { + super(out); + } + + void start(List args) throws IOException { + for (String arg : args) { + sendArg(arg); + } + sendEncoding(Charset.defaultCharset().name()); + sendLocale(Locale.getDefault().toString()); + sendStart(); + new Thread("input reader") { + @Override + public void run() { + try { + final OutputStream stdin = streamStdin(); + int c; + // TODO check available to avoid sending lots of one-byte frames + while (!complete && (c = System.in.read()) != -1) { + stdin.write(c); + } + sendEndStdin(); + } catch (IOException x) { + LOGGER.log(Level.WARNING, null, x); + } + } + }.start(); + } + + @Override + protected synchronized void onExit(int code) { + this.exit = code; + finished(); + } + + @Override + protected void onStdout(byte[] chunk) throws IOException { + System.out.write(chunk); + } + + @Override + protected void onStderr(byte[] chunk) throws IOException { + System.err.write(chunk); + } + + @Override + protected void handleClose() { + finished(); + } + + private synchronized void finished() { + complete = true; + notifyAll(); + } + + synchronized int exit() throws InterruptedException { + while (!complete) { + wait(); + } + return exit; + } + + } + private static String computeVersion() { Properties props = new Properties(); try { @@ -406,4 +505,6 @@ public class CLI { } static final Logger LOGGER = Logger.getLogger(CLI.class.getName()); + + private static final int PING_INTERVAL = Integer.getInteger(CLI.class.getName() + ".pingInterval", 3_000); // JENKINS-59267 } diff --git a/cli/src/main/java/hudson/cli/CLIConnectionFactory.java b/cli/src/main/java/hudson/cli/CLIConnectionFactory.java index 288696b0da..de065d357f 100644 --- a/cli/src/main/java/hudson/cli/CLIConnectionFactory.java +++ b/cli/src/main/java/hudson/cli/CLIConnectionFactory.java @@ -1,7 +1,6 @@ package hudson.cli; -import org.apache.commons.codec.binary.Base64; - +import java.util.Base64; /** * Fluent-API to instantiate {@link CLI}. @@ -34,7 +33,7 @@ public class CLIConnectionFactory { * Cf. {@code BasicHeaderApiTokenAuthenticator}. */ public CLIConnectionFactory basicAuth(String userInfo) { - return authorization("Basic " + new String(Base64.encodeBase64((userInfo).getBytes()))); + return authorization("Basic " + Base64.getEncoder().encodeToString(userInfo.getBytes())); } } diff --git a/cli/src/main/java/hudson/cli/FullDuplexHttpStream.java b/cli/src/main/java/hudson/cli/FullDuplexHttpStream.java index 723e97f16c..fe8db45116 100644 --- a/cli/src/main/java/hudson/cli/FullDuplexHttpStream.java +++ b/cli/src/main/java/hudson/cli/FullDuplexHttpStream.java @@ -1,5 +1,7 @@ package hudson.cli; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; + import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; @@ -60,7 +62,7 @@ public class FullDuplexHttpStream { // server->client LOGGER.fine("establishing download side"); - HttpURLConnection con = (HttpURLConnection) target.openConnection(); + HttpURLConnection con = openHttpConnection(target); con.setDoOutput(true); // request POST to avoid caching con.setRequestMethod("POST"); con.addRequestProperty("Session", uuid.toString()); @@ -78,7 +80,7 @@ public class FullDuplexHttpStream { // client->server uses chunked encoded POST for unlimited capacity. LOGGER.fine("establishing upload side"); - con = (HttpURLConnection) target.openConnection(); + con = openHttpConnection(target); con.setDoOutput(true); // request POST con.setRequestMethod("POST"); con.setChunkedStreamingMode(0); @@ -92,10 +94,15 @@ public class FullDuplexHttpStream { LOGGER.fine("established upload side"); } - // As this transport mode is using POST, it is necessary to resolve possible redirections using GET first. + @SuppressFBWarnings(value = "URLCONNECTION_SSRF_FD", justification = "Client-side code doesn't involve SSRF.") + private HttpURLConnection openHttpConnection(URL target) throws IOException { + return (HttpURLConnection) target.openConnection(); + } + + // As this transport mode is using POST, it is necessary to resolve possible redirections using GET first. @SuppressFBWarnings(value = "URLCONNECTION_SSRF_FD", justification = "Client-side code doesn't involve SSRF.") private URL tryToResolveRedirects(URL base, String authorization) { try { - HttpURLConnection con = (HttpURLConnection) base.openConnection(); + HttpURLConnection con = openHttpConnection(base); if (authorization != null) { con.addRequestProperty("Authorization", authorization); } diff --git a/cli/src/main/java/hudson/cli/NoCheckTrustManager.java b/cli/src/main/java/hudson/cli/NoCheckTrustManager.java index c69b3330c2..cceacf2b21 100644 --- a/cli/src/main/java/hudson/cli/NoCheckTrustManager.java +++ b/cli/src/main/java/hudson/cli/NoCheckTrustManager.java @@ -1,5 +1,7 @@ package hudson.cli; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; + import javax.net.ssl.X509TrustManager; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; @@ -8,12 +10,15 @@ import java.security.cert.X509Certificate; * @author Kohsuke Kawaguchi */ public class NoCheckTrustManager implements X509TrustManager { + @SuppressFBWarnings(value = "WEAK_TRUST_MANAGER", justification = "User set parameter to skip verifier.") public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException { } + @SuppressFBWarnings(value = "WEAK_TRUST_MANAGER", justification = "User set parameter to skip verifier.") public void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException { } + @SuppressFBWarnings(value = "WEAK_TRUST_MANAGER", justification = "User set parameter to skip verifier.") public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0]; } diff --git a/cli/src/main/java/hudson/cli/PlainCLIProtocol.java b/cli/src/main/java/hudson/cli/PlainCLIProtocol.java index ed5c453360..5359b7c738 100644 --- a/cli/src/main/java/hudson/cli/PlainCLIProtocol.java +++ b/cli/src/main/java/hudson/cli/PlainCLIProtocol.java @@ -37,6 +37,7 @@ import java.nio.channels.ReadPendingException; import java.util.logging.Level; import java.util.logging.Logger; import org.apache.commons.io.IOUtils; +import org.apache.commons.io.input.BoundedInputStream; import org.apache.commons.io.input.CountingInputStream; /** @@ -76,111 +77,143 @@ class PlainCLIProtocol { } } - static abstract class EitherSide implements Closeable { + interface Output extends Closeable { + void send(byte[] data) throws IOException; + } - private final CountingInputStream cis; - private final FlightRecorderInputStream flightRecorder; - final DataInputStream dis; - final DataOutputStream dos; + static final class FramedOutput implements Output { - protected EitherSide(InputStream is, OutputStream os) { - cis = new CountingInputStream(is); - flightRecorder = new FlightRecorderInputStream(cis); - dis = new DataInputStream(flightRecorder); + private final DataOutputStream dos; + + FramedOutput(OutputStream os) { dos = new DataOutputStream(os); } - final void begin() { - new Reader().start(); + @Override + public void send(byte[] data) throws IOException { + dos.writeInt(data.length - 1); // not counting the opcode + dos.write(data); + dos.flush(); } - private class Reader extends Thread { + @Override + public void close() throws IOException { + dos.close(); + } - Reader() { - super("PlainCLIProtocol"); // TODO set distinctive Thread.name - } + } - @Override - public void run() { - try { - while (true) { - LOGGER.finest("reading frame"); - int framelen; - try { - framelen = dis.readInt(); - } catch (EOFException x) { - handleClose(); - break; // TODO verify that we hit EOF immediately, not partway into framelen - } - if (framelen < 0) { - throw new IOException("corrupt stream: negative frame length"); - } - byte b = dis.readByte(); - if (b < 0) { // i.e., >127 - throw new IOException("corrupt stream: negative operation code"); - } - if (b >= Op.values().length) { - LOGGER.log(Level.WARNING, "unknown operation #{0}: {1}", new Object[] {b, HexDump.toHex(flightRecorder.getRecord())}); - IOUtils.skipFully(dis, framelen); - continue; - } - Op op = Op.values()[b]; - long start = cis.getByteCount(); - LOGGER.log(Level.FINEST, "handling frame with {0} of length {1}", new Object[] {op, framelen}); - boolean handled = handle(op, framelen); - if (handled) { - long actuallyRead = cis.getByteCount() - start; - if (actuallyRead != framelen) { - throw new IOException("corrupt stream: expected to read " + framelen + " bytes from " + op + " but read " + actuallyRead); - } - } else { - LOGGER.log(Level.WARNING, "unexpected {0}: {1}", new Object[] {op, HexDump.toHex(flightRecorder.getRecord())}); - IOUtils.skipFully(dis, framelen); + static final class FramedReader extends Thread { + + private final EitherSide side; + private final CountingInputStream cis; + private final FlightRecorderInputStream flightRecorder; + private final DataInputStream dis; + + FramedReader(EitherSide side, InputStream is) { + super("PlainCLIProtocol"); // TODO set distinctive Thread.name + this.side = side; + cis = new CountingInputStream(is); + flightRecorder = new FlightRecorderInputStream(cis); + dis = new DataInputStream(flightRecorder); + } + + @Override + public void run() { + try { + while (true) { + LOGGER.finest("reading frame"); + int framelen; + try { + framelen = dis.readInt(); + } catch (EOFException x) { + side.handleClose(); + break; // TODO verify that we hit EOF immediately, not partway into framelen + } + if (framelen < 0) { + throw new IOException("corrupt stream: negative frame length"); + } + LOGGER.finest("read frame length " + framelen); + long start = cis.getByteCount(); + try { + side.handle(new DataInputStream(new BoundedInputStream(dis, /* op byte not counted */framelen + 1))); + } catch (ProtocolException x) { + LOGGER.log(Level.WARNING, null, x); + // but read another frame + } finally { + long actuallyRead = cis.getByteCount() - start; + long unread = framelen + 1 - actuallyRead; + if (unread > 0) { + LOGGER.warning(() -> "Did not read " + unread + " bytes"); + IOUtils.skipFully(dis, unread); } } - } catch (ClosedChannelException x) { - LOGGER.log(Level.FINE, null, x); - handleClose(); - } catch (IOException x) { - LOGGER.log(Level.WARNING, null, flightRecorder.analyzeCrash(x, "broken stream")); - } catch (ReadPendingException x) { - // in case trick in CLIAction does not work - LOGGER.log(Level.FINE, null, x); - handleClose(); - } catch (RuntimeException x) { - LOGGER.log(Level.WARNING, null, x); - handleClose(); } + } catch (ClosedChannelException x) { + LOGGER.log(Level.FINE, null, x); + side.handleClose(); + } catch (IOException x) { + LOGGER.log(Level.WARNING, null, flightRecorder.analyzeCrash(x, "broken stream")); + } catch (ReadPendingException x) { + // in case trick in CLIAction does not work + LOGGER.log(Level.FINE, null, x); + side.handleClose(); + } catch (RuntimeException x) { + LOGGER.log(Level.WARNING, null, x); + side.handleClose(); } + } + } + + private static final class ProtocolException extends IOException { + ProtocolException(String message) { + super(message); + } + } + + static abstract class EitherSide implements Closeable { + + private final Output out; + + protected EitherSide(Output out) { + this.out = out; } protected abstract void handleClose(); - protected abstract boolean handle(Op op, int framelen) throws IOException; - - private void writeOp(Op op) throws IOException { - dos.writeByte((byte) op.ordinal()); + final void handle(DataInputStream dis) throws IOException { + byte b = dis.readByte(); + if (b < 0) { // i.e., >127 + throw new IOException("corrupt stream: negative operation code"); + } + if (b >= Op.values().length) { + throw new ProtocolException("unknown operation #" + b); + } + Op op = Op.values()[b]; + LOGGER.finest(() -> "handling frame with " + op); + if (!handle(op, dis)) { + throw new ProtocolException("unhandled: " + op); + } } + protected abstract boolean handle(Op op, DataInputStream dis) throws IOException; + protected final synchronized void send(Op op) throws IOException { - dos.writeInt(0); - writeOp(op); - dos.flush(); + send(op, new byte[0], 0, 0); } - protected final synchronized void send(Op op, int number) throws IOException { - dos.writeInt(4); - writeOp(op); - dos.writeInt(number); - dos.flush(); + protected final synchronized void send(Op op, int v) throws IOException { + ByteArrayOutputStream baos = new ByteArrayOutputStream(4); + new DataOutputStream(baos).writeInt(v); + send(op, baos.toByteArray()); } protected final synchronized void send(Op op, byte[] chunk, int off, int len) throws IOException { - dos.writeInt(len); - writeOp(op); - dos.write(chunk, off, len); - dos.flush(); + byte[] data = new byte[len + 1]; + data[0] = (byte) op.ordinal(); + System.arraycopy(chunk, off, data, 1, len); + out.send(data); } protected final void send(Op op, byte[] chunk) throws IOException { @@ -193,13 +226,6 @@ class PlainCLIProtocol { send(op, buf.toByteArray()); } - protected final byte[] readChunk(int framelen) throws IOException { - assert Thread.currentThread() instanceof EitherSide.Reader; - byte[] buf = new byte[framelen]; - dis.readFully(buf); - return buf; - } - protected final OutputStream stream(final Op op) { return new OutputStream() { @Override @@ -219,20 +245,19 @@ class PlainCLIProtocol { @Override public synchronized void close() throws IOException { - dos.close(); + out.close(); } } static abstract class ServerSide extends EitherSide { - ServerSide(InputStream is, OutputStream os) { - super(is, os); + ServerSide(Output out) { + super(out); } @Override - protected final boolean handle(Op op, int framelen) throws IOException { - assert Thread.currentThread() instanceof EitherSide.Reader; + protected final boolean handle(Op op, DataInputStream dis) throws IOException { assert op.clientSide; switch (op) { case ARG: @@ -248,7 +273,7 @@ class PlainCLIProtocol { onStart(); return true; case STDIN: - onStdin(readChunk(framelen)); + onStdin(IOUtils.toByteArray(dis)); return true; case END_STDIN: onEndStdin(); @@ -286,23 +311,22 @@ class PlainCLIProtocol { static abstract class ClientSide extends EitherSide { - ClientSide(InputStream is, OutputStream os) { - super(is, os); + ClientSide(Output out) { + super(out); } @Override - protected boolean handle(Op op, int framelen) throws IOException { - assert Thread.currentThread() instanceof EitherSide.Reader; + protected boolean handle(Op op, DataInputStream dis) throws IOException { assert !op.clientSide; switch (op) { case EXIT: onExit(dis.readInt()); return true; case STDOUT: - onStdout(readChunk(framelen)); + onStdout(IOUtils.toByteArray(dis)); return true; case STDERR: - onStderr(readChunk(framelen)); + onStderr(IOUtils.toByteArray(dis)); return true; default: return false; @@ -311,6 +335,7 @@ class PlainCLIProtocol { protected abstract void onExit(int code); + // TODO more efficient to change signature to InputStream, then use IOUtils.copy protected abstract void onStdout(byte[] chunk) throws IOException; protected abstract void onStderr(byte[] chunk) throws IOException; diff --git a/cli/src/main/java/hudson/cli/PrivateKeyProvider.java b/cli/src/main/java/hudson/cli/PrivateKeyProvider.java index bbf7873e29..fbd4f332da 100644 --- a/cli/src/main/java/hudson/cli/PrivateKeyProvider.java +++ b/cli/src/main/java/hudson/cli/PrivateKeyProvider.java @@ -86,10 +86,7 @@ public class PrivateKeyProvider { readFrom(key); read = true; - } catch (IOException e) { - - LOGGER.log(FINE, "Failed to load " + key, e); - } catch (GeneralSecurityException e) { + } catch (IOException | GeneralSecurityException e) { LOGGER.log(FINE, "Failed to load " + key, e); } diff --git a/cli/src/main/java/hudson/cli/SSHCLI.java b/cli/src/main/java/hudson/cli/SSHCLI.java index 39dc9210a3..5321536c5c 100644 --- a/cli/src/main/java/hudson/cli/SSHCLI.java +++ b/cli/src/main/java/hudson/cli/SSHCLI.java @@ -61,11 +61,10 @@ import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; */ class SSHCLI { - @SuppressFBWarnings(value = "RCN_REDUNDANT_NULLCHECK_OF_NULL_VALUE", justification = "Due to whatever reason FindBugs reports it fot try-with-resources") static int sshConnection(String jenkinsUrl, String user, List args, PrivateKeyProvider provider, final boolean strictHostKey) throws IOException { Logger.getLogger(SecurityUtils.class.getName()).setLevel(Level.WARNING); // suppress: BouncyCastle not registered, using the default JCE provider URL url = new URL(jenkinsUrl + "login"); - URLConnection conn = url.openConnection(); + URLConnection conn = openConnection(url); CLI.verifyJenkinsConnection(conn); String endpointDescription = conn.getHeaderField("X-SSH-Endpoint"); @@ -131,6 +130,11 @@ class SSHCLI { } } + @SuppressFBWarnings(value = "URLCONNECTION_SSRF_FD", justification = "Client-side code doesn't involve SSRF.") + private static URLConnection openConnection(URL url) throws IOException { + return url.openConnection(); + } + private SSHCLI() {} } diff --git a/cli/src/main/java/hudson/util/QuotedStringTokenizer.java b/cli/src/main/java/hudson/util/QuotedStringTokenizer.java index e33b15ccab..55db964b09 100644 --- a/cli/src/main/java/hudson/util/QuotedStringTokenizer.java +++ b/cli/src/main/java/hudson/util/QuotedStringTokenizer.java @@ -1,4 +1,4 @@ -/** +/* * (C) Copyright 2004-2005 Mort Bay Consulting Pty. Ltd. * * Parts of this code was taken from the Jetty project, which can be diff --git a/cli/src/main/resources/hudson/cli/client/Messages.properties b/cli/src/main/resources/hudson/cli/client/Messages.properties index c789036505..de4cac2174 100644 --- a/cli/src/main/resources/hudson/cli/client/Messages.properties +++ b/cli/src/main/resources/hudson/cli/client/Messages.properties @@ -3,6 +3,7 @@ CLI.Usage=Jenkins CLI\n\ Options:\n\ \ -s URL : the server URL (defaults to the JENKINS_URL env var)\n\ \ -http : use a plain CLI protocol over HTTP(S) (the default; mutually exclusive with -ssh)\n\ + \ -webSocket : like -http but using WebSocket (works better with most reverse proxies)\n\ \ -ssh : use SSH protocol (requires -user; SSH port must be open on server, and user must have registered a public key)\n\ \ -i KEY : SSH private key file used for authentication (for use with -ssh)\n\ \ -noCertificateCheck : bypass HTTPS certificate check entirely. Use with caution\n\ diff --git a/cli/src/main/resources/hudson/cli/client/Messages_da.properties b/cli/src/main/resources/hudson/cli/client/Messages_da.properties index 84a2e91e10..5414bbe31f 100644 --- a/cli/src/main/resources/hudson/cli/client/Messages_da.properties +++ b/cli/src/main/resources/hudson/cli/client/Messages_da.properties @@ -22,7 +22,7 @@ CLI.VersionMismatch=Versionskonflikt. CLI''en fungerer ikke med denne Hudson server CLI.Usage=Jenkins_ CLI\n\ -Brug: java -jar jenkins-cli.jar [-s URL] command [opts...] args...\n\ +Brug: java -jar jenkins-cli.jar [-s URL] command [opts...] args...\n\ Tilvalg:\n\ De tilg\u00e6ngelige kommandoer afh\u00e6nger af serveren. K\u00f8r 'help' kommandoen for at se listen. CLI.NoURL=Hverken -s eller JENKINS_URL milj\u00f8variablen er defineret diff --git a/cli/src/main/resources/hudson/cli/client/Messages_ja.properties b/cli/src/main/resources/hudson/cli/client/Messages_ja.properties index 79fde62741..d3111a7a71 100644 --- a/cli/src/main/resources/hudson/cli/client/Messages_ja.properties +++ b/cli/src/main/resources/hudson/cli/client/Messages_ja.properties @@ -37,4 +37,4 @@ CLI.Usage=Jenkins CLI\n\ \ -s URL : \u30b5\u30fc\u30d0\u306eURL\u3092\u6307\u5b9a\u3057\u3066\u304f\u3060\u3055\u3044\uff08\u30c7\u30d5\u30a9\u30eb\u30c8\u306f\u74b0\u5883\u5909\u6570JENKINS_URL\u3067\u3059\uff09\u3002\n\ \n\ \u5229\u7528\u53ef\u80fd\u306a\u30b3\u30de\u30f3\u30c9\u306f\u30b5\u30fc\u30d0\u306b\u4f9d\u5b58\u3057\u307e\u3059\u3002\u305d\u306e\u30ea\u30b9\u30c8\u3092\u307f\u308b\u306b\u306f'help'\u30b3\u30de\u30f3\u30c9\u3092\u5b9f\u884c\u3057\u3066\u304f\u3060\u3055\u3044\u3002 -CLI.NoSuchFileExists=\u30d5\u30a1\u30a4\u30eb\u304c\u5b58\u5728\u3057\u307e\u305b\u3093\u3002: {0} \ No newline at end of file +CLI.NoSuchFileExists=\u30d5\u30a1\u30a4\u30eb\u304c\u5b58\u5728\u3057\u307e\u305b\u3093\u3002: {0} diff --git a/cli/src/test/java/hudson/cli/HexDumpTest.java b/cli/src/test/java/hudson/cli/HexDumpTest.java new file mode 100644 index 0000000000..1e1aa9f70e --- /dev/null +++ b/cli/src/test/java/hudson/cli/HexDumpTest.java @@ -0,0 +1,41 @@ +package hudson.cli; + + +import org.junit.Assert; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.parallel.Execution; +import org.junit.jupiter.api.parallel.ExecutionMode; + +@Execution(ExecutionMode.CONCURRENT) +public class HexDumpTest { + + @Test + public void testToHex1() { + Assert.assertEquals("'fooBar'", + HexDump.toHex(new byte[] {'f', 'o', 'o', 'B', 'a', 'r'})); + Assert.assertEquals("0xc3", + HexDump.toHex(new byte[] {(byte)'Ã'})); + Assert.assertEquals("0xac '100'", + HexDump.toHex(new byte[] {(byte)'€', '1', '0', '0'})); + Assert.assertEquals("'1' 0xf7 '2'", + HexDump.toHex(new byte[] {'1', (byte)'÷', '2'})); + Assert.assertEquals("'foo' 0x0a\n'Bar'", + HexDump.toHex(new byte[] {'f', 'o', 'o', '\n', 'B', 'a', 'r'})); + } + + @Test + public void testToHex2() { + Assert.assertEquals("'ooBa'", + HexDump.toHex(new byte[] {'f', 'o', 'o', 'B', 'a', 'r'}, 1, 4)); + Assert.assertEquals("0xc3", + HexDump.toHex(new byte[] {(byte)'Ã'}, 0, 1)); + Assert.assertEquals("0xac '10'", + HexDump.toHex(new byte[] {(byte)'€', '1', '0', '0'}, 0, 3)); + Assert.assertEquals("0xf7 '2'", + HexDump.toHex(new byte[] {'1', (byte)'÷', '2'}, 1, 2)); + Assert.assertEquals("'Bar'", + HexDump.toHex(new byte[] {'f', 'o', 'o', '\n', 'B', 'a', 'r'}, 4, 3)); + Assert.assertEquals("", + HexDump.toHex(new byte[] {'f', 'o', 'o', 'B', 'a', 'r'}, 0, 0)); + } +} diff --git a/cli/src/test/java/hudson/cli/PlainCLIProtocolTest.java b/cli/src/test/java/hudson/cli/PlainCLIProtocolTest.java index 4663fbafd5..953b01d02c 100644 --- a/cli/src/test/java/hudson/cli/PlainCLIProtocolTest.java +++ b/cli/src/test/java/hudson/cli/PlainCLIProtocolTest.java @@ -24,12 +24,16 @@ package hudson.cli; +import org.junit.jupiter.api.Test; + import java.io.ByteArrayOutputStream; +import java.io.DataOutputStream; import java.io.IOException; import java.io.PipedInputStream; import java.io.PipedOutputStream; -import static org.junit.Assert.*; -import org.junit.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + public class PlainCLIProtocolTest { @@ -41,7 +45,7 @@ public class PlainCLIProtocolTest { int code = -1; final ByteArrayOutputStream stdout = new ByteArrayOutputStream(); Client() throws IOException { - super(new PipedInputStream(download), upload); + super(new PlainCLIProtocol.FramedOutput(upload)); } @Override protected synchronized void onExit(int code) { @@ -62,6 +66,7 @@ public class PlainCLIProtocolTest { streamStdin().write("hello".getBytes()); } void newop() throws IOException { + DataOutputStream dos = new DataOutputStream(upload); dos.writeInt(0); dos.writeByte(99); dos.flush(); @@ -72,7 +77,7 @@ public class PlainCLIProtocolTest { boolean started; final ByteArrayOutputStream stdin = new ByteArrayOutputStream(); Server() throws IOException { - super(new PipedInputStream(upload), download); + super(new PlainCLIProtocol.FramedOutput(download)); } @Override protected void onArg(String text) { @@ -89,6 +94,13 @@ public class PlainCLIProtocolTest { } @Override protected void onStdin(byte[] chunk) throws IOException { + /* To inject a race condition: + try { + Thread.sleep(1000); + } catch (InterruptedException x) { + throw new IOException(x); + } + */ stdin.write(chunk); } @Override @@ -100,6 +112,7 @@ public class PlainCLIProtocolTest { sendExit(2); } void newop() throws IOException { + DataOutputStream dos = new DataOutputStream(download); dos.writeInt(0); dos.writeByte(99); dos.flush(); @@ -107,8 +120,8 @@ public class PlainCLIProtocolTest { } Client client = new Client(); Server server = new Server(); - client.begin(); - server.begin(); + new PlainCLIProtocol.FramedReader(client, new PipedInputStream(download)).start(); + new PlainCLIProtocol.FramedReader(server, new PipedInputStream(upload)).start(); client.send(); client.newop(); synchronized (server) { @@ -123,6 +136,9 @@ public class PlainCLIProtocolTest { client.wait(); } } + while (server.stdin.size() == 0) { + Thread.sleep(100); + } assertEquals("hello", server.stdin.toString()); assertEquals("command", server.arg); assertEquals("goodbye", client.stdout.toString()); diff --git a/cli/src/test/java/hudson/cli/PrivateKeyProviderTest.java b/cli/src/test/java/hudson/cli/PrivateKeyProviderTest.java index 1bb49866ba..b186263346 100644 --- a/cli/src/test/java/hudson/cli/PrivateKeyProviderTest.java +++ b/cli/src/test/java/hudson/cli/PrivateKeyProviderTest.java @@ -1,6 +1,9 @@ package hudson.cli; -import org.junit.Test; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.parallel.Execution; +import org.junit.jupiter.api.parallel.ExecutionMode; import java.io.File; import java.io.IOException; @@ -9,11 +12,13 @@ import java.security.GeneralSecurityException; import java.security.KeyPair; import java.security.NoSuchAlgorithmException; -import static org.junit.Assert.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; /** keys were generated with ssh-keygen from OpenSSH_7.9p1, LibreSSL 2.7.3 */ +@Execution(ExecutionMode.CONCURRENT) public class PrivateKeyProviderTest { /** @@ -22,7 +27,15 @@ public class PrivateKeyProviderTest { @Test public void loadKeyDSA() throws IOException, GeneralSecurityException { File file = new File(this.getClass().getResource("dsa").getFile()); - String password = null; + assertKeyPairNotNull(file, null); + } + + /** + * Asserts the keyPair private and public are not null. + * @param file the file to load the key from + * @param password the password + */ + private void assertKeyPairNotNull(File file, String password) throws IOException, GeneralSecurityException { KeyPair keyPair = PrivateKeyProvider.loadKey(file, password); assertNotNull(keyPair); assertNotNull(keyPair.getPrivate()); @@ -36,10 +49,7 @@ public class PrivateKeyProviderTest { public void loadKeyDSAPassword() throws IOException, GeneralSecurityException { File file = new File(this.getClass().getResource("dsa-password").getFile()); String password = "password"; - KeyPair keyPair = PrivateKeyProvider.loadKey(file, password); - assertNotNull(keyPair); - assertNotNull(keyPair.getPrivate()); - assertNotNull(keyPair.getPublic()); + assertKeyPairNotNull(file, password); } /** @@ -48,11 +58,7 @@ public class PrivateKeyProviderTest { @Test public void loadKeyRSA() throws IOException, GeneralSecurityException { File file = new File(this.getClass().getResource("rsa").getFile()); - String password = null; - KeyPair keyPair = PrivateKeyProvider.loadKey(file, password); - assertNotNull(keyPair); - assertNotNull(keyPair.getPrivate()); - assertNotNull(keyPair.getPublic()); + assertKeyPairNotNull(file, null); } /** @@ -62,10 +68,7 @@ public class PrivateKeyProviderTest { public void loadKeyRSAPassword() throws IOException, GeneralSecurityException { File file = new File(this.getClass().getResource("rsa-password").getFile()); String password = "password"; - KeyPair keyPair = PrivateKeyProvider.loadKey(file, password); - assertNotNull(keyPair); - assertNotNull(keyPair.getPrivate()); - assertNotNull(keyPair.getPublic()); + assertKeyPairNotNull(file, password); } /** @@ -74,31 +77,27 @@ public class PrivateKeyProviderTest { @Test public void loadKeyOpenSSH() throws IOException, GeneralSecurityException { File file = new File(this.getClass().getResource("openssh").getFile()); - String password = null; - KeyPair keyPair = PrivateKeyProvider.loadKey(file, password); - assertNotNull(keyPair); - assertNotNull(keyPair.getPrivate()); - assertNotNull(keyPair.getPublic()); + assertKeyPairNotNull(file, null); } /** key command: ssh-keygen -f openssh-unsupported -t rsa -b 1024 -p password */ - @Test(expected = NoSuchAlgorithmException.class) + @Test public void loadKeyUnsupportedCipher() throws IOException, GeneralSecurityException { File file = new File(this.getClass().getResource("openssh-unsuported").getFile()); String password = "password"; - PrivateKeyProvider.loadKey(file, password); + assertThrows(NoSuchAlgorithmException.class, () -> PrivateKeyProvider.loadKey(file, password)); } /** key command: ssh-keygen -f openssh -t rsa -b 1024 in this key we remove some lines to break the key. */ - @Test(expected = IllegalArgumentException.class) + @Test public void loadKeyBroken() throws IOException, GeneralSecurityException { File file = new File(this.getClass().getResource("openssh-broken").getFile()); String password = "password"; - PrivateKeyProvider.loadKey(file, password); + assertThrows(IllegalArgumentException.class, () -> PrivateKeyProvider.loadKey(file, password)); } } diff --git a/core/pom.xml b/core/pom.xml index 368b47db5b..4594bbbfd5 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -39,11 +39,24 @@ THE SOFTWARE. true - 1.257 + 1.258 2.5.6.SEC03 2.4.12 + + + + org.jenkins-ci.main + jenkins-bom + ${project.version} + pom + import + + + + + org.jenkins-ci.plugins.icon-shim @@ -53,7 +66,6 @@ THE SOFTWARE. ${project.groupId} remoting - ${project.groupId} @@ -101,6 +113,11 @@ THE SOFTWARE. + + org.connectbot.jbcrypt + jbcrypt + 1.0.0 + org.jruby.ext.posix jna-posix @@ -111,16 +128,6 @@ THE SOFTWARE. jnr-posix 3.0.45 - - org.kohsuke - trilead-putty-extension - 1.2 - - - org.jenkins-ci - trilead-ssh2 - build-217-jenkins-14 - org.kohsuke.stapler stapler-groovy @@ -180,7 +187,7 @@ THE SOFTWARE. io.jenkins.stapler jenkins-stapler-support - 1.0 + 1.1 org.hamcrest @@ -207,7 +214,7 @@ THE SOFTWARE. args4j args4j - 2.0.31 + 2.33 org.jenkins-ci @@ -263,9 +270,9 @@ THE SOFTWARE. 2.3.0 - jfree + org.jfree jfreechart - 1.0.9 + 1.0.19 org.apache.ant @@ -304,7 +311,7 @@ THE SOFTWARE. org.apache.commons commons-compress - 1.10 + 1.19 javax.mail @@ -526,11 +533,6 @@ THE SOFTWARE. wstx-asl 3.2.9 - - org.jmdns - jmdns - 3.5.5 - net.java.dev.jna jna @@ -635,6 +637,18 @@ THE SOFTWARE. jzlib 1.1.3-kohsuke-1 + + org.xmlunit + xmlunit-core + 2.2.1 + test + + + org.xmlunit + xmlunit-matchers + 2.2.1 + test + @@ -774,7 +788,7 @@ THE SOFTWARE. com.sun.winsw winsw - 2.2.0 + 2.3.0 bin exe ${project.build.outputDirectory}/windows-service diff --git a/core/src/filter/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_bg.properties b/core/src/filter/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_bg.properties deleted file mode 100644 index 95e74685ad..0000000000 --- a/core/src/filter/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_bg.properties +++ /dev/null @@ -1,32 +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. - -NewVersionAvailable=\ - \u041d\u043e\u0432\u0430\u0442\u0430 \u0432\u0435\u0440\u0441\u0438\u044f \u043d\u0430 Jenkins ({0}) \u0435 \u043d\u0430\u043b\u0438\u0447\u043d\u0430 \u0437\u0430 \u0438\u0437\u0442\u0435\u0433\u043b\u044f\u043d\u0435\ - (\u0441\u043f\u0438\u0441\u044a\u043a \u0441 \u043f\u0440\u043e\u043c\u0435\u043d\u0438\u0442\u0435). -UpgradeComplete=\ - \u041e\u0431\u043d\u043e\u0432\u044f\u0432\u0430\u043d\u0435\u0442\u043e \u043a\u044a\u043c \u043d\u043e\u0432\u0430\u0442\u0430 \u0432\u0435\u0440\u0441\u0438\u044f Jenkins {0} \u043f\u0440\u0438\u043a\u043b\u044e\u0447\u0438. \u0422\u0440\u044f\u0431\u0432\u0430 \u0434\u0430 \u0440\u0435\u0441\u0442\u0430\u0440\u0442\u0438\u0440\u0430\u0442\u0435. -UpgradeCompleteRestartNotSupported=\ -\u041e\u0431\u043d\u043e\u0432\u044f\u0432\u0430\u043d\u0435\u0442\u043e \u043a\u044a\u043c \u043d\u043e\u0432\u0430\u0442\u0430 \u0432\u0435\u0440\u0441\u0438\u044f Jenkins {0} \u043f\u0440\u0438\u043a\u043b\u044e\u0447\u0438. \u0422\u0440\u044f\u0431\u0432\u0430 \u0434\u0430 \u0440\u0435\u0441\u0442\u0430\u0440\u0442\u0438\u0440\u0430\u0442\u0435. -UpgradeProgress=\u0418\u0437\u043f\u044a\u043b\u043d\u044f\u0432\u0430 \u0441\u0435 \u043e\u0431\u043d\u043e\u0432\u044f\u0432\u0430\u043d\u0435 \u043a\u044a\u043c Jenkins {0}. -UpgradeFailed=\u041d\u0435\u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043e\u0431\u043d\u043e\u0432\u044f\u0432\u0430\u043d\u0435 \u043a\u044a\u043c Jenkins {0}: {1}. diff --git a/core/src/filter/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_it.properties b/core/src/filter/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_it.properties deleted file mode 100644 index 510a7f5f86..0000000000 --- a/core/src/filter/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_it.properties +++ /dev/null @@ -1,6 +0,0 @@ -NewVersionAvailable=Una nuova versione di Jenkins ({0}) è disponibile per il download \ - (log delle modifiche). -UpgradeComplete=Aggiornamento a Jenkins {0} completato, in attesa del riavvio. -UpgradeCompleteRestartNotSupported=Aggiornamento a Jenkins {0} completato, in attesa del riavvio. -UpgradeProgress=Aggiornamento a Jenkins {0} in corso. -UpgradeFailed=Aggiornamento a Jenkins {0} non riuscito: {1}. diff --git a/core/src/filter/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_ru.properties b/core/src/filter/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_ru.properties deleted file mode 100644 index 97659c57c7..0000000000 --- a/core/src/filter/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_ru.properties +++ /dev/null @@ -1,27 +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. - -NewVersionAvailable=\u041D\u043E\u0432\u0430\u044F \u0432\u0435\u0440\u0441\u0438\u044F Jenkins ({0}) \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0430 \u0434\u043B\u044F \u0437\u0430\u0433\u0440\u0443\u0437\u043A\u0438 (\u0441\u043F\u0438\u0441\u043E\u043A \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u0439). -Or\ Upgrade\ Automatically=\u0418\u043B\u0438 \u043E\u0431\u043D\u043E\u0432\u0438\u0442\u044C \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438 -UpgradeComplete=\u041E\u0431\u043D\u043E\u0432\u043B\u0435\u043D\u0438\u0435 \u0434\u043E Jenkins {0} \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u043E, \u043E\u0436\u0438\u0434\u0430\u0435\u0442 \u043F\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u043A\u0438. -UpgradeCompleteRestartNotSupported=\u041E\u0431\u043D\u043E\u0432\u043B\u0435\u043D\u0438\u0435 \u0434\u043E Jenkins {0} \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u043E, \u043E\u0436\u0438\u0434\u0430\u0435\u0442 \u043F\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u043A\u0438. -UpgradeProgress=\u041E\u0431\u043D\u043E\u0432\u043B\u0435\u043D\u0438\u0435 \u043D\u0430 Jenkins {0} \u0432\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u0442\u0441\u044F \u0438\u043B\u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043B\u043E\u0441\u044C \u043D\u0435\u0443\u0434\u0430\u0447\u0435\u0439. diff --git a/core/src/filter/resources/hudson/model/hudson-version.properties b/core/src/filter/resources/hudson/model/hudson-version.properties index defbd48204..7650f6ad16 100644 --- a/core/src/filter/resources/hudson/model/hudson-version.properties +++ b/core/src/filter/resources/hudson/model/hudson-version.properties @@ -1 +1,2 @@ +# TODO unused? version=${project.version} diff --git a/core/src/filter/resources/jenkins/model/jenkins-version.properties b/core/src/filter/resources/jenkins/model/jenkins-version.properties index defbd48204..662419771c 100644 --- a/core/src/filter/resources/jenkins/model/jenkins-version.properties +++ b/core/src/filter/resources/jenkins/model/jenkins-version.properties @@ -1 +1,2 @@ version=${project.version} +changelog.url=${changelog.url} diff --git a/core/src/main/java/hudson/AbstractMarkupText.java b/core/src/main/java/hudson/AbstractMarkupText.java index 2398f6f744..e909b7e9dd 100644 --- a/core/src/main/java/hudson/AbstractMarkupText.java +++ b/core/src/main/java/hudson/AbstractMarkupText.java @@ -73,7 +73,7 @@ public abstract class AbstractMarkupText { * *

* For example, if the text was "abc", then {@code addMarkup(1,2,"","")} - * would generate {@code"abc"} + * would generate {@code "abc"} */ public abstract void addMarkup( int startPos, int endPos, String startTag, String endTag ); diff --git a/core/src/main/java/hudson/ClassicPluginStrategy.java b/core/src/main/java/hudson/ClassicPluginStrategy.java index e46014f1a9..e3af9fc07c 100644 --- a/core/src/main/java/hudson/ClassicPluginStrategy.java +++ b/core/src/main/java/hudson/ClassicPluginStrategy.java @@ -289,7 +289,7 @@ public class ClassicPluginStrategy implements PluginStrategy { protected ClassLoader createClassLoader(List paths, ClassLoader parent, Attributes atts) throws IOException { if (atts != null) { String usePluginFirstClassLoader = atts.getValue( "PluginFirstClassLoader" ); - if (Boolean.valueOf( usePluginFirstClassLoader )) { + if (Boolean.parseBoolean( usePluginFirstClassLoader )) { PluginFirstClassLoader classLoader = new PluginFirstClassLoader(); classLoader.setParentFirst( false ); classLoader.setParent( parent ); @@ -329,8 +329,8 @@ public class ClassicPluginStrategy implements PluginStrategy { finders = hudson.getExtensionList(ExtensionFinder.class); } - /** - * See {@link ExtensionFinder#scout(Class, Hudson)} for the dead lock issue and what this does. + /* + * See ExtensionFinder#scout(Class, Hudson) for the dead lock issue and what this does. */ if (LOGGER.isLoggable(Level.FINER)) LOGGER.log(Level.FINER, "Scout-loading ExtensionList: "+type, new Throwable()); @@ -431,6 +431,7 @@ public class ClassicPluginStrategy implements PluginStrategy { return null; } + @SuppressFBWarnings(value = "PATH_TRAVERSAL_IN", justification = "Administrator action installing a plugin, which could do far worse.") private static File resolve(File base, String relative) { File rel = new File(relative); if(rel.isAbsolute()) diff --git a/core/src/main/java/hudson/DNSMultiCast.java b/core/src/main/java/hudson/DNSMultiCast.java index 9352fd9dec..b7971e2d0a 100644 --- a/core/src/main/java/hudson/DNSMultiCast.java +++ b/core/src/main/java/hudson/DNSMultiCast.java @@ -1,208 +1,32 @@ package hudson; +import hudson.init.Initializer; import jenkins.util.SystemProperties; -import jenkins.model.Jenkins; -import jenkins.model.Jenkins.MasterComputer; +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.NoExternalUse; -import javax.jmdns.ServiceEvent; -import javax.jmdns.ServiceInfo; -import javax.jmdns.ServiceListener; -import javax.jmdns.impl.JmDNSImpl; -import java.io.Closeable; -import java.io.IOException; -import java.lang.reflect.Field; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.net.InetAddress; -import java.net.URL; -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.Callable; -import java.util.concurrent.ExecutorService; -import java.util.logging.Level; import java.util.logging.Logger; +import static hudson.init.InitMilestone.COMPLETED; + /** * Registers a DNS multi-cast service-discovery support. * * @author Kohsuke Kawaguchi + * @deprecated No longer does anything. */ -public class DNSMultiCast implements Closeable { - private JenkinsJmDNS jmdns; - - public DNSMultiCast(final Jenkins jenkins) { - if (disabled) return; // escape hatch - - // the registerService call can be slow. run these asynchronously - MasterComputer.threadPoolForRemoting.submit(new Callable() { - public Object call() { - try { - jmdns = new JenkinsJmDNS(null, null); - - Map props = new HashMap<>(); - String rootURL = jenkins.getRootUrl(); - if (rootURL==null) return null; - - props.put("url", rootURL); - try { - props.put("version",String.valueOf(Jenkins.getVersion())); - } catch (IllegalArgumentException e) { - // failed to parse the version number - } - - TcpSlaveAgentListener tal = jenkins.getTcpSlaveAgentListener(); - if (tal!=null) - props.put("slave-port",String.valueOf(tal.getPort())); - - props.put("server-id", jenkins.getLegacyInstanceId()); - - URL jenkins_url = new URL(rootURL); - int jenkins_port = jenkins_url.getPort(); - if (jenkins_port == -1) { - jenkins_port = 80; - } - if (jenkins_url.getPath().length() > 0) { - props.put("path", jenkins_url.getPath()); - } - - jmdns.registerService(ServiceInfo.create("_hudson._tcp.local.","jenkins", - jenkins_port,0,0,props)); // for backward compatibility - jmdns.registerService(ServiceInfo.create("_jenkins._tcp.local.","jenkins", - jenkins_port,0,0,props)); - - // Make Jenkins appear in Safari's Bonjour bookmarks - jmdns.registerService(ServiceInfo.create("_http._tcp.local.","Jenkins", - jenkins_port,0,0,props)); - } catch (IOException e) { - LOGGER.log(Level.INFO, "Cannot advertise service to DNS multi-cast, skipping: {0}", e); - LOGGER.log(Level.FINE, null, e); - } - return null; - } - }); - } - - public void close() { - if (jmdns!=null) { - try { - jmdns.abort(); - jmdns = null; - } catch (final IOException e) { - LOGGER.log(Level.WARNING,"Failed to close down JmDNS instance!",e); - } - } - } - +@Deprecated +@Restricted(NoExternalUse.class) +public class DNSMultiCast { private static final Logger LOGGER = Logger.getLogger(DNSMultiCast.class.getName()); - public static boolean disabled = SystemProperties.getBoolean(DNSMultiCast.class.getName()+".disabled"); + public static boolean disabled = SystemProperties.getBoolean(DNSMultiCast.class.getName()+".disabled", true); - /** - * Class that extends {@link JmDNSImpl} to add an abort method. Since {@link javax.jmdns.JmDNS#close()} might - * make the instance hang during the shutdown, the abort method terminate uncleanly, but rapidly and - * without blocking. - * - * Initially it was part of the jenkinsci/jmdns forked library, but now this class is responsible for aborting, - * allowing to have a direct and clean dependency to the original library. - * - * The abort() method is pretty similar to close() method. To access private methods and fields uses - * reflection. - * - * @since 2.178 - * - * See JENKINS-25369 for further details - */ - private static class JenkinsJmDNS extends JmDNSImpl { - private static Logger logger = Logger.getLogger(JmDNSImpl.class.getName()); - private final Class parent; - - /** - * Create an instance of JmDNS and bind it to a specific network interface given its IP-address. - * - * @param address IP address to bind to. - * @param name name of the newly created JmDNS - * @throws IOException - */ - public JenkinsJmDNS(InetAddress address, String name) throws IOException { - super(address, name); - this.parent = this.getClass().getSuperclass(); + @Initializer(before=COMPLETED) + public static void warn() { + if (!disabled) { + LOGGER.warning("DNS multicast capability has been removed from Jenkins. More information: https://jenkins.io/redirect/dns-multicast"); } - - /** - * Works like {@link #close()} but terminate uncleanly, but rapidly and without blocking. - */ - public void abort() throws IOException { - if (this.isClosing()) { - return; - } - - if (logger.isLoggable(Level.FINER)) { - logger.finer("Aborting JmDNS: " + this); - } - // Stop JmDNS - // This protects against recursive calls - if (this.closeState()) { - // We got the tie break now clean up - - // Stop the timer - logger.finer("Canceling the timer"); - this.cancelTimer(); - - // Cancel all services - // KK: this is a blocking call that doesn't fit 'abort' - // this.unregisterAllServices(); - executePrivateParentMethod("disposeServiceCollectors"); - -// KK: another blocking call -// if (logger.isLoggable(Level.FINER)) { -// logger.finer("Wait for JmDNS cancel: " + this); -// } -// this.waitForCanceled(DNSConstants.CLOSE_TIMEOUT); - - // Stop the canceler timer - logger.finer("Canceling the state timer"); - this.cancelStateTimer(); - - // Stop the executor - shutdown(); - - // close socket - executePrivateParentMethod("closeMulticastSocket"); - - // remove the shutdown hook - if (_shutdown != null) { - Runtime.getRuntime().removeShutdownHook(_shutdown); - } - - if (logger.isLoggable(Level.FINER)) { - logger.finer("JmDNS closed."); - } - } - advanceState(null); - } - - private void shutdown() throws IOException { - try { - Field executor = this.parent.getDeclaredField("_executor"); - executor.setAccessible(true); - ExecutorService _executor = (ExecutorService) executor.get(this); - _executor.shutdown(); - } catch (NoSuchFieldException | IllegalAccessException e) { - logger.log(Level.SEVERE, "Error trying to abort JmDNS", e); - throw new IOException(e); - } - } - - private void executePrivateParentMethod(String method) throws IOException { - try { - Method m = this.parent.getDeclaredMethod(method); - m.setAccessible(true); - m.invoke(this); - } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { - logger.log(Level.SEVERE, "Error trying to abort JmDNS", e); - throw new IOException(e); - } - } - } + } diff --git a/core/src/main/java/hudson/DependencyRunner.java b/core/src/main/java/hudson/DependencyRunner.java index 03efea55e4..6fd8889caa 100644 --- a/core/src/main/java/hudson/DependencyRunner.java +++ b/core/src/main/java/hudson/DependencyRunner.java @@ -25,6 +25,7 @@ package hudson; import hudson.model.AbstractProject; +import hudson.security.ACLContext; import jenkins.model.Jenkins; import hudson.security.ACL; @@ -35,9 +36,6 @@ import java.util.Set; import java.util.Collection; import java.util.logging.Logger; -import org.acegisecurity.context.SecurityContext; -import org.acegisecurity.context.SecurityContextHolder; - /** * Runs a job on all projects in the order of dependencies */ @@ -47,19 +45,18 @@ public class DependencyRunner implements Runnable { ProjectRunnable runnable; - List polledProjects = new ArrayList(); + List polledProjects = new ArrayList<>(); public DependencyRunner(ProjectRunnable runnable) { this.runnable = runnable; } public void run() { - SecurityContext oldContext = ACL.impersonate(ACL.SYSTEM); - try { - Set topLevelProjects = new HashSet(); + try (ACLContext ctx = ACL.as(ACL.SYSTEM)) { + Set topLevelProjects = new HashSet<>(); // Get all top-level projects LOGGER.fine("assembling top level projects"); - for (AbstractProject p : Jenkins.getInstance().allItems(AbstractProject.class)) + for (AbstractProject p : Jenkins.get().allItems(AbstractProject.class)) if (p.getUpstreamProjects().size() == 0) { LOGGER.fine("adding top level project " + p.getName()); topLevelProjects.add(p); @@ -71,8 +68,6 @@ public class DependencyRunner implements Runnable { LOGGER.fine("running project in correct dependency order: " + p.getName()); runnable.run(p); } - } finally { - SecurityContextHolder.setContext(oldContext); } } diff --git a/core/src/main/java/hudson/DescriptorExtensionList.java b/core/src/main/java/hudson/DescriptorExtensionList.java index 4557034ccc..da2a0fc5f6 100644 --- a/core/src/main/java/hudson/DescriptorExtensionList.java +++ b/core/src/main/java/hudson/DescriptorExtensionList.java @@ -115,6 +115,7 @@ public class DescriptorExtensionList, D extends Descrip * Fully qualified name of the descriptor, not the describable. * @deprecated {@link Descriptor#getId} is supposed to be used for new code, not the descriptor class name. */ + @Deprecated public D find(String fqcn) { return Descriptor.find(this,fqcn); } diff --git a/core/src/main/java/hudson/EnvVars.java b/core/src/main/java/hudson/EnvVars.java index 0dbec25143..e076b1e370 100644 --- a/core/src/main/java/hudson/EnvVars.java +++ b/core/src/main/java/hudson/EnvVars.java @@ -388,6 +388,15 @@ public class EnvVars extends TreeMap { if (value!=null) put(key,value); } + + /** + * Add entire map but filter null values out. + * @since TODO + */ + public void putAllNonNull(Map map) { + map.forEach(this::putIfNotNull); + } + /** * Takes a string that looks like "a=b" and adds that to this map. diff --git a/core/src/main/java/hudson/ExtensionComponent.java b/core/src/main/java/hudson/ExtensionComponent.java index 98e03969f3..d274e11204 100644 --- a/core/src/main/java/hudson/ExtensionComponent.java +++ b/core/src/main/java/hudson/ExtensionComponent.java @@ -88,8 +88,8 @@ public class ExtensionComponent implements Comparable> public int compareTo(ExtensionComponent that) { double a = this.ordinal(); double b = that.ordinal(); - if (a>b) return -1; - if (a 0) return -1; + if (Double.compare(a, b) < 0) return 1; // make the order bit more deterministic among extensions of the same ordinal if (this.instance instanceof Descriptor && that.instance instanceof Descriptor) { diff --git a/core/src/main/java/hudson/ExtensionFinder.java b/core/src/main/java/hudson/ExtensionFinder.java index 9e9c18f63b..bd8fc132d0 100644 --- a/core/src/main/java/hudson/ExtensionFinder.java +++ b/core/src/main/java/hudson/ExtensionFinder.java @@ -63,6 +63,7 @@ import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashMap; +import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.Map; @@ -263,13 +264,13 @@ public abstract class ExtensionFinder implements ExtensionPoint { public GuiceFinder() { refreshExtensionAnnotations(); - SezpozModule extensions = new SezpozModule(loadSezpozIndices(Jenkins.getInstance().getPluginManager().uberClassLoader)); + SezpozModule extensions = new SezpozModule(loadSezpozIndices(Jenkins.get().getPluginManager().uberClassLoader)); List modules = new ArrayList<>(); modules.add(new AbstractModule() { @Override protected void configure() { - Jenkins j = Jenkins.getInstance(); + Jenkins j = Jenkins.get(); bind(Jenkins.class).toInstance(j); bind(PluginManager.class).toInstance(j.getPluginManager()); } @@ -291,7 +292,7 @@ public abstract class ExtensionFinder implements ExtensionPoint { } // expose Injector via lookup mechanism for interop with non-Guice clients - Jenkins.getInstance().lookup.set(Injector.class,new ProxyInjector() { + Jenkins.get().lookup.set(Injector.class,new ProxyInjector() { protected Injector resolve() { return getContainer(); } @@ -482,26 +483,35 @@ public abstract class ExtensionFinder implements ExtensionPoint { * So this is an attempt to detect subset of problems eagerly, by invoking various reflection * operations and try to find non-existent classes early. */ - private void resolve(Class c) { + private void resolve(Class c) { + resolve(c, new HashSet<>()); + } + private void resolve(Class c, Set> encountered) { + if (!encountered.add(c)) { + return; + } try { - c.getGenericSuperclass(); - c.getGenericInterfaces(); ClassLoader ecl = c.getClassLoader(); - Method m = ClassLoader.class.getDeclaredMethod("resolveClass", Class.class); - m.setAccessible(true); - m.invoke(ecl, c); - c.getConstructors(); - c.getMethods(); - for (Field f : c.getFields()) { - if (f.getAnnotation(javax.inject.Inject.class) != null || f.getAnnotation(com.google.inject.Inject.class) != null) { - resolve(f.getType()); + if (ecl != null) { // Not bootstrap classloader + Method m = ClassLoader.class.getDeclaredMethod("resolveClass", Class.class); + m.setAccessible(true); + m.invoke(ecl, c); + } + for (Class cc = c; cc != Object.class && cc != null; cc = cc.getSuperclass()) { + /** + * See {@link com.google.inject.spi.InjectionPoint#getInjectionPoints(TypeLiteral, boolean, Errors)} + */ + cc.getGenericSuperclass(); + cc.getGenericInterfaces(); + cc.getDeclaredConstructors(); + cc.getDeclaredMethods(); + for (Field f : cc.getDeclaredFields()) { + if (f.getAnnotation(javax.inject.Inject.class) != null || f.getAnnotation(com.google.inject.Inject.class) != null) { + resolve(f.getType(), encountered); + } } } LOGGER.log(Level.FINER, "{0} looks OK", c); - while (c != Object.class) { - c.getGenericSuperclass(); - c = c.getSuperclass(); - } } catch (Exception x) { throw (LinkageError)new LinkageError("Failed to resolve "+c).initCause(x); } @@ -533,8 +543,9 @@ public abstract class ExtensionFinder implements ExtensionPoint { } else if (e instanceof Method) { extType = ((Method)e).getReturnType(); - } else + } else { throw new AssertionError(); + } resolve(extType); @@ -599,7 +610,7 @@ public abstract class ExtensionFinder implements ExtensionPoint { /** * Returns initial {@link Method} as well as all matching ones found in interfaces. * This allows to introspect metadata for a method which is both declared in parent class and in implemented - * interface(s). interfaces typically is obtained by {@link ClassUtils#getAllInterfacesAsSet} + * interface(s). {@code interfaces} typically is obtained by {@link ClassUtils#getAllInterfacesAsSet} */ Collection getMethodAndInterfaceDeclarations(Method method, Collection interfaces) { final List methods = new ArrayList<>(); @@ -642,7 +653,7 @@ public abstract class ExtensionFinder implements ExtensionPoint { // 4. thread Y decides to load extensions, now blocked on SZ. // 5. dead lock if (indices==null) { - ClassLoader cl = Jenkins.getInstance().getPluginManager().uberClassLoader; + ClassLoader cl = Jenkins.get().getPluginManager().uberClassLoader; indices = ImmutableList.copyOf(Index.load(Extension.class, Object.class, cl)); } return indices; @@ -676,7 +687,7 @@ public abstract class ExtensionFinder implements ExtensionPoint { static List> listDelta(Class annotationType, List> old) { // list up newly discovered components final List> delta = Lists.newArrayList(); - ClassLoader cl = Jenkins.getInstance().getPluginManager().uberClassLoader; + ClassLoader cl = Jenkins.get().getPluginManager().uberClassLoader; for (IndexItem ii : Index.load(annotationType, Object.class, cl)) { if (!old.contains(ii)) { delta.add(ii); @@ -697,18 +708,7 @@ public abstract class ExtensionFinder implements ExtensionPoint { for (IndexItem item : indices) { try { - AnnotatedElement e = item.element(); - Class extType; - if (e instanceof Class) { - extType = (Class) e; - } else - if (e instanceof Field) { - extType = ((Field)e).getType(); - } else - if (e instanceof Method) { - extType = ((Method)e).getReturnType(); - } else - throw new AssertionError(); + Class extType = getClassFromIndex(item); if(type.isAssignableFrom(extType)) { Object instance = item.instance(); @@ -733,18 +733,7 @@ public abstract class ExtensionFinder implements ExtensionPoint { // but we can't synchronize this --- if we do, the one thread that's supposed to load a class // can block while other threads wait for the entry into the element call(). // looking at the sezpoz code, it should be safe to do so - AnnotatedElement e = item.element(); - Class extType; - if (e instanceof Class) { - extType = (Class) e; - } else - if (e instanceof Field) { - extType = ((Field)e).getType(); - } else - if (e instanceof Method) { - extType = ((Method)e).getReturnType(); - } else - throw new AssertionError(); + Class extType = getClassFromIndex(item); // according to JDK-4993813 this is the only way to force class initialization Class.forName(extType.getName(),true,extType.getClassLoader()); } catch (Exception | LinkageError e) { @@ -758,5 +747,20 @@ public abstract class ExtensionFinder implements ExtensionPoint { } } + private static Class getClassFromIndex(IndexItem item) throws InstantiationException { + AnnotatedElement e = item.element(); + Class extType; + if (e instanceof Class) { + extType = (Class) e; + } else if (e instanceof Field) { + extType = ((Field) e).getType(); + } else if (e instanceof Method) { + extType = ((Method) e).getReturnType(); + } else { + throw new AssertionError(); + } + return extType; + } + private static final Logger LOGGER = Logger.getLogger(ExtensionFinder.class.getName()); } diff --git a/core/src/main/java/hudson/ExtensionListView.java b/core/src/main/java/hudson/ExtensionListView.java index 100dad6fb7..e3689ccf61 100644 --- a/core/src/main/java/hudson/ExtensionListView.java +++ b/core/src/main/java/hudson/ExtensionListView.java @@ -58,7 +58,7 @@ public class ExtensionListView { public static List createList(final Class type) { return new AbstractList() { private ExtensionList storage() { - return Jenkins.getInstance().getExtensionList(type); + return Jenkins.get().getExtensionList(type); } @Override @@ -103,7 +103,7 @@ public class ExtensionListView { public static CopyOnWriteList createCopyOnWriteList(final Class type) { return new CopyOnWriteList() { private ExtensionList storage() { - return Jenkins.getInstance().getExtensionList(type); + return Jenkins.get().getExtensionList(type); } @Override diff --git a/core/src/main/java/hudson/FilePath.java b/core/src/main/java/hudson/FilePath.java index 0af8d564b9..6b5cf97304 100644 --- a/core/src/main/java/hudson/FilePath.java +++ b/core/src/main/java/hudson/FilePath.java @@ -59,7 +59,7 @@ import hudson.util.NamingThreadFactory; import hudson.util.io.Archiver; import hudson.util.io.ArchiverFactory; - +import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileFilter; @@ -133,7 +133,6 @@ import org.jenkinsci.remoting.RoleSensitive; import org.jenkinsci.remoting.SerializableOnlyOverRemoting; import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.restrictions.NoExternalUse; -import org.kohsuke.stapler.Function; import org.kohsuke.stapler.Stapler; import static hudson.FilePath.TarCompression.GZIP; @@ -759,10 +758,10 @@ public final class FilePath implements SerializableOnlyOverRemoting { public enum TarCompression { NONE { public InputStream extract(InputStream in) { - return in; + return new BufferedInputStream(in); } public OutputStream compress(OutputStream out) { - return out; + return new BufferedOutputStream(out); } }, GZIP { @@ -845,10 +844,13 @@ public final class FilePath implements SerializableOnlyOverRemoting { * @since 1.299 */ public boolean installIfNecessaryFrom(@Nonnull URL archive, @CheckForNull TaskListener listener, @Nonnull String message) throws IOException, InterruptedException { + if (listener == null) { + listener = TaskListener.NULL; + } return installIfNecessaryFrom(archive, listener, message, MAX_REDIRECTS); } - private boolean installIfNecessaryFrom(@Nonnull URL archive, @CheckForNull TaskListener listener, @Nonnull String message, int maxRedirects) throws InterruptedException, IOException { + private boolean installIfNecessaryFrom(@Nonnull URL archive, @Nonnull TaskListener listener, @Nonnull String message, int maxRedirects) throws InterruptedException, IOException { try { FilePath timestamp = this.child(".timestamp"); long lastModified = timestamp.lastModified(); @@ -862,9 +864,7 @@ public final class FilePath implements SerializableOnlyOverRemoting { } catch (IOException x) { if (this.exists()) { // Cannot connect now, so assume whatever was last unpacked is still OK. - if (listener != null) { - listener.getLogger().println("Skipping installation of " + archive + " to " + remote + ": " + x); - } + listener.getLogger().println("Skipping installation of " + archive + " to " + remote + ": " + x); return false; } else { throw x; @@ -906,8 +906,7 @@ public final class FilePath implements SerializableOnlyOverRemoting { this.mkdirs(); } - if(listener!=null) - listener.getLogger().println(message); + listener.getLogger().println(message); if (isRemote()) { // First try to download from the agent machine. @@ -916,9 +915,7 @@ public final class FilePath implements SerializableOnlyOverRemoting { timestamp.touch(sourceTimestamp); return true; } catch (IOException x) { - if (listener != null) { - Functions.printStackTrace(x, 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")); } } @@ -1523,7 +1520,7 @@ public final class FilePath implements SerializableOnlyOverRemoting { tempPath = Files.createTempDirectory(Util.fileToPath(dir), name, PosixFilePermissions.asFileAttribute(EnumSet.allOf(PosixFilePermission.class))); } else { - tempPath = Files.createTempDirectory(Util.fileToPath(dir), name, new FileAttribute[] {}); + tempPath = Files.createTempDirectory(Util.fileToPath(dir), name); } if (tempPath.toFile() == null) { @@ -1721,7 +1718,7 @@ public final class FilePath implements SerializableOnlyOverRemoting { * if the parameter is -1, this method becomes no-op. *

* please note mask is expected to be an octal if you use chmod command line values, - * so preceded by a '0' in java notation, ie chmod(0644) + * so preceded by a '0' in java notation, ie {@code chmod(0644)} *

* Only supports setting read, write, or execute permissions for the * owner, group, or others, so the largest permissible value is 0777. @@ -2350,6 +2347,19 @@ public final class FilePath implements SerializableOnlyOverRemoting { * @since 1.532 */ public int copyRecursiveTo(final DirScanner scanner, final FilePath target, final String description) throws IOException, InterruptedException { + return copyRecursiveTo(scanner, target, description, GZIP); + } + + /** + * Copies files according to a specified scanner to a target node. + * @param scanner a way of enumerating some files (must be serializable for possible delivery to remote side) + * @param target the destination basedir + * @param description a description of the fileset, for logging purposes + * @param compression compression to use + * @return the number of files copied + * @since 2.196 + */ + public int copyRecursiveTo(final DirScanner scanner, final FilePath target, final String description, @Nonnull TarCompression compression) throws IOException, InterruptedException { if(this.channel==target.channel) { // local to local copy. return act(new CopyRecursiveLocal(target, scanner)); @@ -2358,8 +2368,8 @@ public final class FilePath implements SerializableOnlyOverRemoting { // local -> remote copy final Pipe pipe = Pipe.createLocalToRemote(); - Future future = target.actAsync(new ReadToTar(pipe, description)); - Future future2 = actAsync(new WriteToTar(scanner, pipe)); + Future future = target.actAsync(new ReadToTar(pipe, description, compression)); + Future future2 = actAsync(new WriteToTar(scanner, pipe, compression)); try { // JENKINS-9540 in case the reading side failed, report that error first future.get(); @@ -2371,9 +2381,9 @@ public final class FilePath implements SerializableOnlyOverRemoting { // remote -> local copy final Pipe pipe = Pipe.createRemoteToLocal(); - Future future = actAsync(new CopyRecursiveRemoteToLocal(pipe, scanner)); + Future future = actAsync(new CopyRecursiveRemoteToLocal(pipe, scanner, compression)); try { - readFromTar(remote + '/' + description,new File(target.remote),TarCompression.GZIP.extract(pipe.getIn())); + readFromTar(remote + '/' + description,new File(target.remote),compression.extract(pipe.getIn())); } catch (IOException e) {// BuildException or IOException try { future.get(3,TimeUnit.SECONDS); @@ -2474,15 +2484,18 @@ public final class FilePath implements SerializableOnlyOverRemoting { private class ReadToTar extends SecureFileCallable { private final Pipe pipe; private final String description; - ReadToTar(Pipe pipe, String description) { + private final TarCompression compression; + + ReadToTar(Pipe pipe, String description, @Nonnull TarCompression compression) { this.pipe = pipe; this.description = description; + this.compression = compression; } private static final long serialVersionUID = 1L; @Override public Void invoke(File f, VirtualChannel channel) throws IOException { try (InputStream in = pipe.getIn()) { - readFromTar(remote + '/' + description, f, TarCompression.GZIP.extract(in)); + readFromTar(remote + '/' + description, f, compression.extract(in)); return null; } } @@ -2490,28 +2503,32 @@ public final class FilePath implements SerializableOnlyOverRemoting { private class WriteToTar extends SecureFileCallable { private final DirScanner scanner; private final Pipe pipe; - WriteToTar(DirScanner scanner, Pipe pipe) { + private final TarCompression compression; + WriteToTar(DirScanner scanner, Pipe pipe, @Nonnull TarCompression compression) { this.scanner = scanner; this.pipe = pipe; + this.compression = compression; } private static final long serialVersionUID = 1L; @Override public Integer invoke(File f, VirtualChannel channel) throws IOException, InterruptedException { - return writeToTar(new File(remote), scanner, TarCompression.GZIP.compress(pipe.getOut())); + return writeToTar(new File(remote), scanner, compression.compress(pipe.getOut())); } } private class CopyRecursiveRemoteToLocal extends SecureFileCallable { private static final long serialVersionUID = 1L; private final Pipe pipe; private final DirScanner scanner; - CopyRecursiveRemoteToLocal(Pipe pipe, DirScanner scanner) { + private final TarCompression compression; + CopyRecursiveRemoteToLocal(Pipe pipe, DirScanner scanner, @Nonnull TarCompression compression) { this.pipe = pipe; this.scanner = scanner; + this.compression = compression; } @Override public Integer invoke(File f, VirtualChannel channel) throws IOException { try (OutputStream out = pipe.getOut()) { - return writeToTar(f, scanner, TarCompression.GZIP.compress(out)); + return writeToTar(f, scanner, compression.compress(out)); } } } @@ -2737,7 +2754,7 @@ public final class FilePath implements SerializableOnlyOverRemoting { int idx = findSeparator(f); if(idx==-1) break; - prefix.append(f.substring(0, idx)).append('/'); + prefix.append(f, 0, idx).append('/'); f=f.substring(idx+1); if(hasMatch(dir,prefix+fileMask,caseSensitive)) return Messages.FilePath_validateAntFileMask_doesntMatchAndSuggest(fileMask, prefix+fileMask); @@ -2954,7 +2971,7 @@ public final class FilePath implements SerializableOnlyOverRemoting { private static void checkPermissionForValidate() { AccessControlled subject = Stapler.getCurrentRequest().findAncestorObject(AbstractProject.class); if (subject == null) - Jenkins.getInstance().checkPermission(Jenkins.ADMINISTER); + Jenkins.get().checkPermission(Jenkins.MANAGE); else subject.checkPermission(Item.CONFIGURE); } diff --git a/core/src/main/java/hudson/FileSystemProvisioner.java b/core/src/main/java/hudson/FileSystemProvisioner.java index 3ef75eccbb..153b9397b3 100644 --- a/core/src/main/java/hudson/FileSystemProvisioner.java +++ b/core/src/main/java/hudson/FileSystemProvisioner.java @@ -177,7 +177,7 @@ public abstract class FileSystemProvisioner implements ExtensionPoint, Describab public abstract WorkspaceSnapshot snapshot(AbstractBuild build, FilePath ws, String glob, TaskListener listener) throws IOException, InterruptedException; public FileSystemProvisionerDescriptor getDescriptor() { - return (FileSystemProvisionerDescriptor) Jenkins.getInstance().getDescriptorOrDie(getClass()); + return (FileSystemProvisionerDescriptor) Jenkins.get().getDescriptorOrDie(getClass()); } /** @@ -189,7 +189,7 @@ public abstract class FileSystemProvisioner implements ExtensionPoint, Describab * Returns all the registered {@link FileSystemProvisioner} descriptors. */ public static DescriptorExtensionList all() { - return Jenkins.getInstance().getDescriptorList(FileSystemProvisioner.class); + return Jenkins.get().getDescriptorList(FileSystemProvisioner.class); } /** diff --git a/core/src/main/java/hudson/FileSystemProvisionerDescriptor.java b/core/src/main/java/hudson/FileSystemProvisionerDescriptor.java index 9e162d666f..bafdb293b5 100644 --- a/core/src/main/java/hudson/FileSystemProvisionerDescriptor.java +++ b/core/src/main/java/hudson/FileSystemProvisionerDescriptor.java @@ -23,6 +23,7 @@ */ package hudson; +import hudson.model.AbstractBuild; import hudson.model.Descriptor; import hudson.model.TaskListener; diff --git a/core/src/main/java/hudson/Functions.java b/core/src/main/java/hudson/Functions.java index 67e9398c23..dfbaaf79ef 100644 --- a/core/src/main/java/hudson/Functions.java +++ b/core/src/main/java/hudson/Functions.java @@ -27,6 +27,7 @@ package hudson; import hudson.model.Slave; import hudson.security.*; +import jenkins.telemetry.impl.AutoRefresh; import jenkins.util.SystemProperties; import hudson.cli.CLICommand; import hudson.console.ConsoleAnnotationDescriptor; @@ -52,6 +53,7 @@ import hudson.model.PaneStatusProperties; import hudson.model.ParameterDefinition; import hudson.model.ParameterDefinition.ParameterDescriptor; import hudson.model.Run; +import hudson.model.TimeZoneProperty; import hudson.model.TopLevelItem; import hudson.model.User; import hudson.model.View; @@ -82,9 +84,12 @@ import hudson.views.MyViewsTabBar; import hudson.views.ViewsTabBar; import hudson.widgets.RenderOnDemandClosure; + import java.io.File; import java.io.IOException; +import java.io.PrintStream; import java.io.PrintWriter; +import java.io.Serializable; import java.io.StringWriter; import java.io.UnsupportedEncodingException; import java.lang.management.LockInfo; @@ -99,6 +104,8 @@ import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.net.URLDecoder; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.Arrays; @@ -114,6 +121,7 @@ import java.util.List; import java.util.Locale; import java.util.Map; import java.util.SortedMap; +import java.util.TimeZone; import java.util.TreeMap; import java.util.logging.Level; import java.util.logging.LogManager; @@ -153,7 +161,7 @@ import com.google.common.base.Predicate; import com.google.common.base.Predicates; import hudson.model.PasswordParameterDefinition; import hudson.util.RunList; -import java.io.PrintStream; + import java.util.HashSet; import java.util.Set; import java.util.concurrent.atomic.AtomicLong; @@ -176,6 +184,7 @@ import org.kohsuke.accmod.restrictions.DoNotUse; @SuppressWarnings("rawtypes") public class Functions { private static final AtomicLong iota = new AtomicLong(); + private static Logger LOGGER = Logger.getLogger(Functions.class.getName()); public Functions() { } @@ -240,6 +249,7 @@ public class Functions { public static void initPageVariables(JellyContext context) { StaplerRequest currentRequest = Stapler.getCurrentRequest(); + currentRequest.getWebApp().getDispatchValidator().allowDispatch(currentRequest, Stapler.getCurrentResponse()); String rootURL = currentRequest.getContextPath(); Functions h = new Functions(); @@ -287,7 +297,7 @@ public class Functions { } public JDK.DescriptorImpl getJDKDescriptor() { - return Jenkins.getInstance().getDescriptorByType(JDK.DescriptorImpl.class); + return Jenkins.get().getDescriptorByType(JDK.DescriptorImpl.class); } /** @@ -379,6 +389,11 @@ public class Functions { return null; } + @Restricted(NoExternalUse.class) + public static boolean useHidingPasswordFields() { + return SystemProperties.getBoolean(Functions.class.getName() + ".hidingPasswordFields", true); + } + /** * URL decomposed for easier computation of relevant URLs. * @@ -638,11 +653,18 @@ public class Functions { // to avoid conflicts with any other web apps that might be on the same machine. c.setPath("/"); c.setMaxAge(60*60*24*30); // persist it roughly for a month + c.setHttpOnly(true); response.addCookie(c); } if (refresh) { response.addHeader("Refresh", SystemProperties.getString("hudson.Functions.autoRefreshSeconds", "10")); } + + try { + ExtensionList.lookupSingleton(AutoRefresh.class).recordRequest(request, refresh); + } catch (Exception e) { + LOGGER.log(Level.WARNING, "Failed to record auto refresh status in telemetry", e); + } } public static boolean isAutoRefresh(HttpServletRequest request) { @@ -665,7 +687,28 @@ public class Functions { public static boolean isCollapsed(String paneId) { return PaneStatusProperties.forCurrentUser().isCollapsed(paneId); } - + + @Restricted(NoExternalUse.class) + public static boolean isUserTimeZoneOverride() { + return TimeZoneProperty.forCurrentUser() != null; + } + + @CheckForNull + @Restricted(NoExternalUse.class) + public static String getUserTimeZone() { + return TimeZoneProperty.forCurrentUser(); + } + + @Restricted(NoExternalUse.class) + public static String getUserTimeZonePostfix() { + if (!isUserTimeZoneOverride()) { + return ""; + } + + TimeZone tz = TimeZone.getTimeZone(getUserTimeZone()); + return tz.getDisplayName(tz.observesDaylightTime(), TimeZone.SHORT); + } + /** * Finds the given object in the ancestor list and returns its URL. * This is used to determine the "current" URL assigned to the given object, @@ -725,6 +768,24 @@ public class Functions { return Util.encode(s); } + /** + * Shortcut function for calling {@link URLEncoder#encode(String,String)} (with UTF-8 encoding).
+ * Useful for encoding URL query parameters in jelly code (as in {@code "...?param=${h.urlEncode(something)}"}).
+ * For convenience in jelly code, it also accepts null parameter, and then returns an empty string. + * + * @since 2.200 + */ + public static String urlEncode(String s) { + if (s == null) { + return ""; + } + try { + return URLEncoder.encode(s, StandardCharsets.UTF_8.name()); + } catch (UnsupportedEncodingException e) { + throw new Error(e); // impossible + } + } + public static String escape(String s) { return Util.escape(s); } @@ -762,7 +823,7 @@ public class Functions { } public static void checkPermission(Permission permission) throws IOException, ServletException { - checkPermission(Jenkins.getInstance(),permission); + checkPermission(Jenkins.get(),permission); } public static void checkPermission(AccessControlled object, Permission permission) throws IOException, ServletException { @@ -791,7 +852,7 @@ public class Functions { return; } } - checkPermission(Jenkins.getInstance(),permission); + checkPermission(Jenkins.get(),permission); } } @@ -802,7 +863,7 @@ public class Functions { * If null, returns true. This defaulting is convenient in making the use of this method terse. */ public static boolean hasPermission(Permission permission) throws IOException, ServletException { - return hasPermission(Jenkins.getInstance(),permission); + return hasPermission(Jenkins.get(),permission); } /** @@ -822,7 +883,7 @@ public class Functions { return ((AccessControlled)o).hasPermission(permission); } } - return Jenkins.getInstance().hasPermission(permission); + return Jenkins.get().hasPermission(permission); } } @@ -845,7 +906,7 @@ public class Functions { * Infers the hudson installation URL from the given request. */ public static String inferHudsonURL(StaplerRequest req) { - String rootUrl = Jenkins.getInstance().getRootUrl(); + String rootUrl = Jenkins.get().getRootUrl(); if(rootUrl !=null) // prefer the one explicitly configured, to work with load-balancer, frontend, etc. return rootUrl; @@ -912,7 +973,7 @@ public class Functions { @Restricted(DoNotUse.class) @RestrictedSince("2.12") public static List> getComputerLauncherDescriptors() { - return Jenkins.getInstance().>getDescriptorList(ComputerLauncher.class); + return Jenkins.get().>getDescriptorList(ComputerLauncher.class); } /** @@ -950,8 +1011,8 @@ public class Functions { @Restricted(DoNotUse.class) @RestrictedSince("2.12") public static List getNodePropertyDescriptors(Class clazz) { - List result = new ArrayList(); - Collection list = (Collection) Jenkins.getInstance().getDescriptorList(NodeProperty.class); + List result = new ArrayList<>(); + Collection list = (Collection) Jenkins.get().getDescriptorList(NodeProperty.class); for (NodePropertyDescriptor npd : list) { if (npd.isApplicable(clazz)) { result.add(npd); @@ -966,8 +1027,8 @@ public class Functions { * @since 1.520 */ public static List getGlobalNodePropertyDescriptors() { - List result = new ArrayList(); - Collection list = (Collection) Jenkins.getInstance().getDescriptorList(NodeProperty.class); + List result = new ArrayList<>(); + Collection list = (Collection) Jenkins.get().getDescriptorList(NodeProperty.class); for (NodePropertyDescriptor npd : list) { if (npd.isApplicableAsGlobal()) { result.add(npd); @@ -995,22 +1056,26 @@ public class Functions { */ public static Collection getSortedDescriptorsForGlobalConfig(Predicate predicate) { ExtensionList exts = ExtensionList.lookup(Descriptor.class); - List r = new ArrayList(exts.size()); + List r = new ArrayList<>(exts.size()); for (ExtensionComponent c : exts.getComponents()) { Descriptor d = c.getInstance(); if (d.getGlobalConfigPage()==null) continue; + if (!Jenkins.get().hasPermission(d.getRequiredGlobalConfigPagePermission())) { + continue; + } + if (predicate.apply(d.getCategory())) { r.add(new Tag(c.ordinal(), d)); } } Collections.sort(r); - List answer = new ArrayList(r.size()); + List answer = new ArrayList<>(r.size()); for (Tag d : r) answer.add(d.d); - return DescriptorVisibilityFilter.apply(Jenkins.getInstance(),answer); + return DescriptorVisibilityFilter.apply(Jenkins.get(),answer); } /** @@ -1058,8 +1123,8 @@ public class Functions { } public int compareTo(Tag that) { - int r = Double.compare(this.ordinal, that.ordinal); - if (r!=0) return -r; // descending for ordinal + int r = Double.compare(that.ordinal, this.ordinal); + if (r!=0) return r; // descending for ordinal by reversing the order for compare return this.hierarchy.compareTo(that.hierarchy); } } @@ -1089,7 +1154,7 @@ public class Functions { * Computes the relative path from the current page to the given item. */ public static String getRelativeLinkTo(Item p) { - Map ancestors = new HashMap(); + Map ancestors = new HashMap<>(); View view=null; StaplerRequest request = Stapler.getCurrentRequest(); @@ -1110,7 +1175,7 @@ public class Functions { ItemGroup ig = i.getParent(); url = i.getShortUrl()+url; - if(ig== Jenkins.getInstance() || (view != null && ig == view.getOwner().getItemGroup())) { + if(ig== Jenkins.get() || (view != null && ig == view.getOwner().getItemGroup())) { assert i instanceof TopLevelItem; if (view != null) { // assume p and the current page belong to the same view, so return a relative path @@ -1165,7 +1230,7 @@ public class Functions { String separationString = useDisplayName ? " » " : "/"; // first list up all the parents - Map parents = new HashMap(); + Map parents = new HashMap<>(); int depth=0; while (g!=null) { parents.put(g, depth++); @@ -1232,7 +1297,7 @@ public class Functions { } public static Map dumpAllThreads() { - Map sorted = new TreeMap(new ThreadSorter()); + Map sorted = new TreeMap<>(new ThreadSorter()); sorted.putAll(Thread.getAllStackTraces()); return sorted; } @@ -1250,9 +1315,9 @@ public class Functions { // Common code for sorting Threads/ThreadInfos by ThreadGroup private static class ThreadSorterBase { - protected Map map = new HashMap(); + protected Map map = new HashMap<>(); - private ThreadSorterBase() { + public ThreadSorterBase() { ThreadGroup tg = Thread.currentThread().getThreadGroup(); while (tg.getParent() != null) tg = tg.getParent(); Thread[] threads = new Thread[tg.activeCount()*2]; @@ -1272,7 +1337,9 @@ public class Functions { } } - public static class ThreadGroupMap extends ThreadSorterBase implements Comparator { + public static class ThreadGroupMap extends ThreadSorterBase implements Comparator, Serializable { + + private static final long serialVersionUID = 7803975728695308444L; /** * @return ThreadGroup name or null if unknown @@ -1289,7 +1356,9 @@ public class Functions { } } - private static class ThreadSorter extends ThreadSorterBase implements Comparator { + private static class ThreadSorter extends ThreadSorterBase implements Comparator, Serializable { + + private static final long serialVersionUID = 5053631350439192685L; public int compare(Thread a, Thread b) { int result = compare(a.getId(), b.getId()); @@ -1426,12 +1495,10 @@ public class Functions { if(it instanceof Descriptor) clazz = ((Descriptor)it).clazz; - StringBuilder buf = new StringBuilder(Stapler.getCurrentRequest().getContextPath()); - buf.append(Jenkins.VIEW_RESOURCE_PATH).append('/'); - buf.append(clazz.getName().replace('.','/').replace('$','/')); - buf.append('/').append(path); - - return buf.toString(); + String buf = Stapler.getCurrentRequest().getContextPath() + Jenkins.VIEW_RESOURCE_PATH + '/' + + clazz.getName().replace('.', '/').replace('$', '/') + + '/' + path; + return buf; } public static boolean hasView(Object it, String path) throws IOException { @@ -1474,7 +1541,7 @@ public class Functions { return Messages.Functions_NoExceptionDetails(); } StringBuilder s = new StringBuilder(); - doPrintStackTrace(s, t, null, "", new HashSet()); + doPrintStackTrace(s, t, null, "", new HashSet<>()); return s.toString(); } private static void doPrintStackTrace(@Nonnull StringBuilder s, @Nonnull Throwable t, @CheckForNull Throwable higher, @Nonnull String prefix, @Nonnull Set encountered) { @@ -1663,14 +1730,14 @@ public class Functions { for( int i=0; i=0) buf.append(ch); else buf.append('_'); // escape } - return projectName; + return String.valueOf(buf); } /** @@ -1682,7 +1749,7 @@ public class Functions { public String getServerName() { // Try to infer this from the configured root URL. // This makes it work correctly when Hudson runs behind a reverse proxy. - String url = Jenkins.getInstance().getRootUrl(); + String url = Jenkins.get().getRootUrl(); try { if(url!=null) { String host = new URL(url).getHost(); @@ -1839,7 +1906,7 @@ public class Functions { public List getLoggerNames() { while (true) { try { - List r = new ArrayList(); + List r = new ArrayList<>(); Enumeration e = LogManager.getLogManager().getLoggerNames(); while (e.hasMoreElements()) r.add(e.nextElement()); @@ -1932,7 +1999,7 @@ public class Functions { } public static List getRequestHeaders(String name) { - List r = new ArrayList(); + List r = new ArrayList<>(); Enumeration e = Stapler.getCurrentRequest().getHeaders(name); while (e.hasMoreElements()) { r.add(e.nextElement().toString()); @@ -1948,7 +2015,7 @@ public class Functions { } public static ArrayList getCLICommands() { - ArrayList all = new ArrayList(CLICommand.all()); + ArrayList all = new ArrayList<>(CLICommand.all()); Collections.sort(all, new Comparator() { public int compare(CLICommand cliCommand, CLICommand cliCommand1) { return cliCommand.getName().compareTo(cliCommand1.getName()); diff --git a/core/src/main/java/hudson/Launcher.java b/core/src/main/java/hudson/Launcher.java index e65011b61b..d2007e14b1 100644 --- a/core/src/main/java/hudson/Launcher.java +++ b/core/src/main/java/hudson/Launcher.java @@ -23,7 +23,6 @@ */ package hudson; -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import hudson.Proc.LocalProc; import hudson.model.Computer; import jenkins.util.MemoryReductionUtil; @@ -147,7 +146,7 @@ public abstract class Launcher { @Deprecated @CheckForNull public Computer getComputer() { - for( Computer c : Jenkins.getInstance().getComputers() ) + for( Computer c : Jenkins.get().getComputers() ) if(c.getChannel()==channel) return c; return null; @@ -769,8 +768,8 @@ public abstract class Launcher { * recorded on the listener. * * @param cmd The commands - * @param mask An array of booleans which control whether a cmd element should be masked (true) or - * remain unmasked (false). + * @param mask An array of booleans which control whether a cmd element should be masked ({@code true}) or + * remain unmasked ({@code false}). * @param workDir The work dir. */ protected final void maskedPrintCommandLine(@Nonnull List cmd, @CheckForNull boolean[] mask, @CheckForNull FilePath workDir) { @@ -1038,8 +1037,6 @@ public abstract class Launcher { @Override @Nonnull - @SuppressFBWarnings(value = "NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE", - justification = "We always require nonnull channel when we initialize this launcher") public VirtualChannel getChannel() { VirtualChannel vc = super.getChannel(); if (vc == null) { @@ -1251,9 +1248,9 @@ public abstract class Launcher { } public static class IOTriplet implements Serializable { - @Nonnull + @CheckForNull InputStream stdout,stderr; - @Nonnull + @CheckForNull OutputStream stdin; private static final long serialVersionUID = 1L; } @@ -1327,11 +1324,7 @@ public abstract class Launcher { Channel taskChannel = null; try { // Sync IO will fail automatically if the channel is being closed, no need to use getOpenChannelOrFail() - // TODOL Replace by Channel#currentOrFail() when Remoting version allows - taskChannel = Channel.current(); - if (taskChannel == null) { - throw new IOException("No Remoting channel associated with this thread"); - } + taskChannel = Channel.currentOrFail(); taskChannel.syncIO(); } catch (Throwable t) { // this includes a failure to sync, agent.jar too old, etc diff --git a/core/src/main/java/hudson/LauncherDecorator.java b/core/src/main/java/hudson/LauncherDecorator.java index 62e56f56d3..b73beb4e21 100644 --- a/core/src/main/java/hudson/LauncherDecorator.java +++ b/core/src/main/java/hudson/LauncherDecorator.java @@ -1,7 +1,10 @@ package hudson; +import hudson.model.AbstractBuild; +import hudson.model.BuildListener; import hudson.model.Node; import hudson.model.Executor; +import hudson.model.TaskListener; import hudson.tasks.BuildWrapper; import javax.annotation.Nonnull; diff --git a/core/src/main/java/hudson/LocalPluginManager.java b/core/src/main/java/hudson/LocalPluginManager.java index b001e1f348..fbc4cd5d4c 100644 --- a/core/src/main/java/hudson/LocalPluginManager.java +++ b/core/src/main/java/hudson/LocalPluginManager.java @@ -24,11 +24,11 @@ package hudson; -import edu.umd.cs.findbugs.annotations.CheckForNull; -import edu.umd.cs.findbugs.annotations.NonNull; import jenkins.util.SystemProperties; import jenkins.model.Jenkins; +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; import javax.servlet.ServletContext; import java.io.File; import java.util.Collection; @@ -43,10 +43,10 @@ import java.util.logging.Logger; public class LocalPluginManager extends PluginManager { /** * Creates a new LocalPluginManager - * @param context Servlet context. Provided for compatibility as {@code Jenkins.getInstance().servletContext} should be used. + * @param context Servlet context. Provided for compatibility as {@code Jenkins.get().servletContext} should be used. * @param rootDir Jenkins home directory. */ - public LocalPluginManager(@CheckForNull ServletContext context, @NonNull File rootDir) { + public LocalPluginManager(@CheckForNull ServletContext context, @Nonnull File rootDir) { super(context, new File(rootDir,"plugins")); } @@ -54,7 +54,7 @@ public class LocalPluginManager extends PluginManager { * Creates a new LocalPluginManager * @param jenkins Jenkins instance that will use the plugin manager. */ - public LocalPluginManager(@NonNull Jenkins jenkins) { + public LocalPluginManager(@Nonnull Jenkins jenkins) { this(jenkins.servletContext, jenkins.getRootDir()); } @@ -62,7 +62,7 @@ public class LocalPluginManager extends PluginManager { * Creates a new LocalPluginManager * @param rootDir Jenkins home directory. */ - public LocalPluginManager(@NonNull File rootDir) { + public LocalPluginManager(@Nonnull File rootDir) { this(null, rootDir); } diff --git a/core/src/main/java/hudson/Main.java b/core/src/main/java/hudson/Main.java index 14ae9ee38f..b4490d4188 100644 --- a/core/src/main/java/hudson/Main.java +++ b/core/src/main/java/hudson/Main.java @@ -153,8 +153,7 @@ public class Main { // run the command long start = System.currentTimeMillis(); - List cmd = new ArrayList<>(); - cmd.addAll(Arrays.asList(args).subList(1, args.length)); + List cmd = new ArrayList<>(Arrays.asList(args).subList(1, args.length)); Proc proc = new Proc.LocalProc(cmd.toArray(new String[0]),(String[])null,System.in, new DualOutputStream(System.out,new EncodingStream(os))); @@ -221,7 +220,7 @@ public class Main { public static boolean isUnitTest = false; /** - * Set to true if we are running inside "mvn hpi:run" or "mvn hudson-dev:run" + * Set to true if we are running inside {@code mvn hpi:run} or {@code mvn jetty:run}. */ public static boolean isDevelopmentMode = SystemProperties.getBoolean(Main.class.getName()+".development"); diff --git a/core/src/main/java/hudson/Plugin.java b/core/src/main/java/hudson/Plugin.java index 2f065102be..f0557862e7 100644 --- a/core/src/main/java/hudson/Plugin.java +++ b/core/src/main/java/hudson/Plugin.java @@ -30,6 +30,9 @@ import hudson.model.Saveable; import hudson.model.listeners.ItemListener; import hudson.model.listeners.SaveableListener; import hudson.model.Descriptor.FormException; +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; @@ -80,7 +83,7 @@ import jenkins.model.GlobalConfiguration; * @author Kohsuke Kawaguchi * @since 1.42 */ -public abstract class Plugin implements Saveable { +public abstract class Plugin implements Saveable, StaplerProxy { private static final Logger LOGGER = Logger.getLogger(Plugin.class.getName()); @@ -290,9 +293,23 @@ public abstract class Plugin implements Saveable { */ protected XmlFile getConfigXml() { return new XmlFile(Jenkins.XSTREAM, - new File(Jenkins.getInstance().getRootDir(),wrapper.getShortName()+".xml")); + new File(Jenkins.get().getRootDir(),wrapper.getShortName()+".xml")); } + @Override + @Restricted(NoExternalUse.class) + public Object getTarget() { + if (!SKIP_PERMISSION_CHECK) { + Jenkins.get().checkPermission(Jenkins.READ); + } + return this; + } + + /** + * Escape hatch for StaplerProxy-based access control + */ + @Restricted(NoExternalUse.class) + public static /* Script Console modifiable */ boolean SKIP_PERMISSION_CHECK = Boolean.getBoolean(Plugin.class.getName() + ".skipPermissionCheck"); /** * Dummy instance of {@link Plugin} to be used when a plugin didn't diff --git a/core/src/main/java/hudson/PluginFirstClassLoader.java b/core/src/main/java/hudson/PluginFirstClassLoader.java index 31c93a1fd3..dde635d24d 100644 --- a/core/src/main/java/hudson/PluginFirstClassLoader.java +++ b/core/src/main/java/hudson/PluginFirstClassLoader.java @@ -50,7 +50,7 @@ public class PluginFirstClassLoader super(null, false); } - private List urls = new ArrayList(); + private List urls = new ArrayList<>(); public void addPathFiles( Collection paths ) throws IOException diff --git a/core/src/main/java/hudson/PluginManager.java b/core/src/main/java/hudson/PluginManager.java index 9094acb7f8..a245f8b131 100644 --- a/core/src/main/java/hudson/PluginManager.java +++ b/core/src/main/java/hudson/PluginManager.java @@ -23,7 +23,6 @@ */ package hudson; -import edu.umd.cs.findbugs.annotations.NonNull; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import hudson.PluginWrapper.Dependency; import hudson.init.InitMilestone; @@ -64,6 +63,7 @@ import jenkins.install.InstallUtil; import jenkins.model.Jenkins; import jenkins.plugins.DetachedPluginsUtil; import jenkins.security.CustomClassFilter; +import jenkins.telemetry.impl.java11.MissingClassTelemetry; import jenkins.util.SystemProperties; import jenkins.util.io.OnMaster; import jenkins.util.xml.RestrictiveEntityResolver; @@ -83,7 +83,6 @@ import org.jenkinsci.Symbol; import org.jenkinsci.bytecode.Transformer; import org.jvnet.hudson.reactor.Executable; import org.jvnet.hudson.reactor.Reactor; -import org.jvnet.hudson.reactor.ReactorException; import org.jvnet.hudson.reactor.TaskBuilder; import org.jvnet.hudson.reactor.TaskGraphBuilder; import org.kohsuke.accmod.Restricted; @@ -100,6 +99,7 @@ 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.kohsuke.stapler.verb.POST; import org.xml.sax.Attributes; import org.xml.sax.InputSource; import org.xml.sax.SAXException; @@ -149,6 +149,7 @@ import java.util.jar.JarFile; import java.util.jar.Manifest; import java.util.logging.Level; import java.util.logging.Logger; +import java.util.stream.Collectors; import static hudson.init.InitMilestone.*; import static java.util.logging.Level.*; @@ -158,7 +159,7 @@ import static java.util.logging.Level.*; * *

* Setting default Plugin Managers. The default plugin manager in {@code Jenkins} can be replaced by defining a - * System Property (hudson.PluginManager.className). See {@link #createDefault(Jenkins)}. + * System Property ({@code hudson.PluginManager.className}). See {@link #createDefault(Jenkins)}. * This className should be available on early startup, so it cannot come only from a library * (e.g. Jenkins module or Extra library dependency in the WAR file project). * Plugins cannot be used for such purpose. @@ -208,28 +209,29 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas private enum PMConstructor { JENKINS { @Override - @NonNull PluginManager doCreate(@NonNull Class klass, - @NonNull Jenkins jenkins) throws ReflectiveOperationException { + @Nonnull + PluginManager doCreate(@Nonnull Class klass, + @Nonnull Jenkins jenkins) throws ReflectiveOperationException { return klass.getConstructor(Jenkins.class).newInstance(jenkins); } }, SC_FILE { @Override - @NonNull PluginManager doCreate(@NonNull Class klass, - @NonNull Jenkins jenkins) throws ReflectiveOperationException { + @Nonnull PluginManager doCreate(@Nonnull Class klass, + @Nonnull Jenkins jenkins) throws ReflectiveOperationException { return klass.getConstructor(ServletContext.class, File.class).newInstance(jenkins.servletContext, jenkins.getRootDir()); } }, FILE { @Override - @NonNull PluginManager doCreate(@NonNull Class klass, - @NonNull Jenkins jenkins) throws ReflectiveOperationException { + @Nonnull PluginManager doCreate(@Nonnull Class klass, + @Nonnull Jenkins jenkins) throws ReflectiveOperationException { return klass.getConstructor(File.class).newInstance(jenkins.getRootDir()); } }; - final @CheckForNull PluginManager create(@NonNull Class klass, - @NonNull Jenkins jenkins) throws ReflectiveOperationException { + final @CheckForNull PluginManager create(@Nonnull Class klass, + @Nonnull Jenkins jenkins) throws ReflectiveOperationException { try { return doCreate(klass, jenkins); } catch(NoSuchMethodException e) { @@ -238,8 +240,8 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas } } - abstract @NonNull PluginManager doCreate(@NonNull Class klass, - @NonNull Jenkins jenkins) throws ReflectiveOperationException; + abstract @Nonnull PluginManager doCreate(@Nonnull Class klass, + @Nonnull Jenkins jenkins) throws ReflectiveOperationException; } /** @@ -249,7 +251,7 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas * @return Plugin manager to use. If no custom class is configured or in case of any error, the default * {@link LocalPluginManager} is returned. */ - public static @NonNull PluginManager createDefault(@NonNull Jenkins jenkins) { + public static @Nonnull PluginManager createDefault(@Nonnull Jenkins jenkins) { String pmClassName = SystemProperties.getString(CUSTOM_PLUGIN_MANAGER); if (!StringUtils.isBlank(pmClassName)) { LOGGER.log(FINE, String.format("Use of custom plugin manager [%s] requested.", pmClassName)); @@ -369,7 +371,7 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas } public Api getApi() { - Jenkins.getInstance().checkPermission(Jenkins.ADMINISTER); + Jenkins.get().checkPermission(Jenkins.ADMINISTER); return new Api(this); } @@ -533,7 +535,7 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas * Once the plugins are listed, schedule their initialization. */ public void run(Reactor session) throws Exception { - Jenkins.getInstance().lookup.set(PluginInstanceStore.class, new PluginInstanceStore()); + Jenkins.get().lookup.set(PluginInstanceStore.class, new PluginInstanceStore()); TaskGraphBuilder g = new TaskGraphBuilder(); // schedule execution of loading plugins @@ -601,7 +603,10 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas } void considerDetachedPlugin(String shortName) { - if (new File(rootDir, shortName + ".jpi").isFile() || new File(rootDir, shortName + ".hpi").isFile()) { + if (new File(rootDir, shortName + ".jpi").isFile() || + new File(rootDir, shortName + ".hpi").isFile() || + new File(rootDir, shortName + ".jpl").isFile() || + new File(rootDir, shortName + ".hpl").isFile()) { LOGGER.fine(() -> "not considering loading a detached dependency " + shortName + " as it is already on disk"); return; } @@ -628,7 +633,7 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas protected @Nonnull Set loadPluginsFromWar(@Nonnull String fromPath, @CheckForNull FilenameFilter filter) { Set names = new HashSet(); - ServletContext context = Jenkins.getActiveInstance().servletContext; + ServletContext context = Jenkins.get().servletContext; Set plugins = Util.fixNull(context.getResourcePaths(fromPath)); Set copiedPlugins = new HashSet<>(); Set dependencies = new HashSet<>(); @@ -692,7 +697,7 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas String dependencySpec = manifest.getMainAttributes().getValue("Plugin-Dependencies"); if (dependencySpec != null) { String[] dependencyTokens = dependencySpec.split(","); - ServletContext context = Jenkins.getActiveInstance().servletContext; + ServletContext context = Jenkins.get().servletContext; for (String dependencyToken : dependencyTokens) { if (dependencyToken.endsWith(";resolution:=optional")) { @@ -704,7 +709,7 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas String artifactId = artifactIdVersionPair[0]; VersionNumber dependencyVersion = new VersionNumber(artifactIdVersionPair[1]); - PluginManager manager = Jenkins.getActiveInstance().getPluginManager(); + PluginManager manager = Jenkins.get().getPluginManager(); VersionNumber installedVersion = manager.getPluginVersion(manager.rootDir, artifactId); if (installedVersion != null && !installedVersion.isOlderThan(dependencyVersion)) { // Do not downgrade dependencies that are already installed. @@ -868,16 +873,16 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas * TODO: revisit where/how to expose this. This is an experiment. */ public void dynamicLoad(File arc) throws IOException, InterruptedException, RestartRequiredException { - dynamicLoad(arc, false); + dynamicLoad(arc, false, null); } /** * Try the dynamicLoad, removeExisting to attempt to dynamic load disabled plugins */ @Restricted(NoExternalUse.class) - public void dynamicLoad(File arc, boolean removeExisting) throws IOException, InterruptedException, RestartRequiredException { + public void dynamicLoad(File arc, boolean removeExisting, @CheckForNull List batch) throws IOException, InterruptedException, RestartRequiredException { try (ACLContext context = ACL.as(ACL.SYSTEM)) { - LOGGER.info("Attempting to dynamic load "+arc); + LOGGER.log(FINE, "Attempting to dynamic load {0}", arc); PluginWrapper p = null; String sn; try { @@ -924,9 +929,12 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas p.resolvePluginDependencies(); strategy.load(p); - Jenkins.getInstance().refreshExtensions(); + if (batch != null) { + batch.add(p); + } else { + start(Collections.singletonList(p)); + } - p.getPlugin().postInitialize(); } catch (Exception e) { failedPlugins.add(new FailedPlugin(sn, e)); activePlugins.remove(p); @@ -934,49 +942,57 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas throw new IOException("Failed to install "+ sn +" plugin",e); } - // 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); - } - - // 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! - getPluginStrategy().updateDependency(depender, p); - break; - } - } - } - - // Redo who depends on who. - resolveDependentPlugins(); - - try { - Jenkins.get().refreshExtensions(); - } catch (ExtensionRefreshException e) { - throw new IOException("Failed to refresh extensions after installing " + sn + " plugin", e); - } - LOGGER.info("Plugin " + p.getShortName()+":"+p.getVersion() + " dynamically installed"); + LOGGER.log(FINE, "Plugin {0}:{1} dynamically {2}", new Object[] {p.getShortName(), p.getVersion(), batch != null ? "loaded but not yet started" : "installed"}); } } + @Restricted(NoExternalUse.class) + public void start(List plugins) throws Exception { + try (ACLContext context = ACL.as(ACL.SYSTEM)) { + Map pluginsByName = plugins.stream().collect(Collectors.toMap(p -> p.getShortName(), p -> p)); + + // recalculate dependencies of plugins optionally depending the newly deployed ones. + for (PluginWrapper depender: this.plugins) { + if (plugins.contains(depender)) { + // skip itself. + continue; + } + for (Dependency d: depender.getOptionalDependencies()) { + PluginWrapper dependee = pluginsByName.get(d.shortName); + if (dependee != null) { + // this plugin depends on the newly loaded one! + // recalculate dependencies! + getPluginStrategy().updateDependency(depender, dependee); + break; + } + } + } + + // Redo who depends on who. + resolveDependentPlugins(); + + try { + Jenkins.get().refreshExtensions(); + } catch (ExtensionRefreshException e) { + throw new IOException("Failed to refresh extensions after installing some plugins", e); + } + for (PluginWrapper p : plugins) { + p.getPlugin().postInitialize(); + } + + // run initializers in the added plugins + Reactor r = new Reactor(InitMilestone.ordering()); + Set loaders = plugins.stream().map(p -> p.classLoader).collect(Collectors.toSet()); + r.addAll(new InitializerFinder(uberClassLoader) { + @Override + protected boolean filter(Method e) { + return !loaders.contains(e.getDeclaringClass().getClassLoader()) || super.filter(e); + } + }.discoverTasks(r)); + new InitReactorRunner().run(r); + } + } + @Restricted(NoExternalUse.class) public synchronized void resolveDependentPlugins() { for (PluginWrapper plugin : plugins) { @@ -1098,7 +1114,7 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas try(final JarFile jarFile = jarURLConnection.getJarFile()) { final JarEntry entry = (entryName != null && jarFile != null) ? jarFile.getJarEntry(entryName) : null; - if (entry != null && jarFile != null) { + if (entry != null) { try(InputStream i = jarFile.getInputStream(entry)) { byte[] manifestBytes = IOUtils.toByteArray(i); in = new ByteArrayInputStream(manifestBytes); @@ -1331,7 +1347,7 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas */ @Restricted(DoNotUse.class) // WebOnly public HttpResponse doPlugins() { - Jenkins.getInstance().checkPermission(Jenkins.ADMINISTER); + Jenkins.get().checkPermission(Jenkins.ADMINISTER); JSONArray response = new JSONArray(); Map allPlugins = new HashMap<>(); for (PluginWrapper plugin : plugins) { @@ -1357,7 +1373,7 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas } response.add(pluginInfo); } - for (UpdateSite site : Jenkins.getActiveInstance().getUpdateCenter().getSiteList()) { + for (UpdateSite site : Jenkins.get().getUpdateCenter().getSiteList()) { for (UpdateSite.Plugin plugin: site.getAvailables()) { JSONObject pluginInfo = allPlugins.get(plugin.name); if(pluginInfo == null) { @@ -1378,10 +1394,10 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas @RequirePOST public HttpResponse doUpdateSources(StaplerRequest req) throws IOException { - Jenkins.getInstance().checkPermission(CONFIGURE_UPDATECENTER); + Jenkins.get().checkPermission(CONFIGURE_UPDATECENTER); if (req.hasParameter("remove")) { - UpdateCenter uc = Jenkins.getInstance().getUpdateCenter(); + UpdateCenter uc = Jenkins.get().getUpdateCenter(); BulkChange bc = new BulkChange(uc); try { for (String id : req.getParameterValues("sources")) @@ -1403,7 +1419,7 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas @RequirePOST @Restricted(DoNotUse.class) // WebOnly public void doInstallPluginsDone() { - Jenkins j = Jenkins.getInstance(); + Jenkins j = Jenkins.get(); j.checkPermission(Jenkins.ADMINISTER); InstallUtil.proceedToNextStateFrom(InstallState.INITIAL_PLUGINS_INSTALLING); } @@ -1413,7 +1429,7 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas */ @RequirePOST public void doInstall(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException { - Jenkins.getInstance().checkPermission(Jenkins.ADMINISTER); + Jenkins.get().checkPermission(Jenkins.ADMINISTER); Set plugins = new LinkedHashSet<>(); Enumeration en = req.getParameterNames(); @@ -1442,7 +1458,7 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas @RequirePOST @Restricted(DoNotUse.class) // WebOnly public HttpResponse doInstallPlugins(StaplerRequest req) throws IOException { - Jenkins.getInstance().checkPermission(Jenkins.ADMINISTER); + Jenkins.get().checkPermission(Jenkins.ADMINISTER); String payload = IOUtils.toString(req.getInputStream(), req.getCharacterEncoding()); JSONObject request = JSONObject.fromObject(payload); JSONArray pluginListJSON = request.getJSONArray("plugins"); @@ -1483,6 +1499,10 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas private List> install(@Nonnull Collection plugins, boolean dynamicLoad, @CheckForNull UUID correlationId) { List> installJobs = new ArrayList<>(); + LOGGER.log(INFO, "Starting installation of a batch of {0} plugins plus their dependencies", plugins.size()); + long start = System.nanoTime(); + List batch = new ArrayList<>(); + for (String n : plugins) { // JENKINS-22080 plugin names can contain '.' as could (according to rumour) update sites int index = n.indexOf('.'); @@ -1514,21 +1534,20 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas if (p == null) { throw new Failure("No such plugin: " + n); } - Future jobFuture = p.deploy(dynamicLoad, correlationId); + Future jobFuture = p.deploy(dynamicLoad, correlationId, batch); installJobs.add(jobFuture); } - trackInitialPluginInstall(installJobs); - - return installJobs; - } - - private void trackInitialPluginInstall(@Nonnull final List> installJobs) { - final Jenkins jenkins = Jenkins.getInstance(); + final Jenkins jenkins = Jenkins.get(); final UpdateCenter updateCenter = jenkins.getUpdateCenter(); + + if (dynamicLoad) { + installJobs.add(updateCenter.addJob(updateCenter.new CompleteBatchJob(batch, start, correlationId))); + } + final Authentication currentAuth = Jenkins.getAuthentication(); - if (!Jenkins.getInstance().getInstallState().isSetupComplete()) { + if (!jenkins.getInstallState().isSetupComplete()) { jenkins.setInstallState(InstallState.INITIAL_PLUGINS_INSTALLING); updateCenter.persistInstallStatus(); new Thread() { @@ -1563,36 +1582,12 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas } }.start(); } - - // Fire a one-off thread to wait for the plugins to be deployed and then - // refresh the dependent plugins list. - new Thread() { - @Override - public void run() { - INSTALLING: while (true) { - for (Future deployJob : installJobs) { - try { - Thread.sleep(500); - } catch (InterruptedException e) { - LOGGER.log(SEVERE, "Unexpected error while waiting for some plugins to install. Plugin Manager state may be invalid. Please restart Jenkins ASAP.", e); - } - if (!deployJob.isCancelled() && !deployJob.isDone()) { - // One of the plugins is not installing/canceled, so - // go back to sleep and try again in a while. - continue INSTALLING; - } - } - // All the plugins are installed. It's now safe to refresh. - resolveDependentPlugins(); - break; - } - } - }.start(); - + + return installJobs; } private UpdateSite.Plugin getPlugin(String pluginName, String siteName) { - UpdateSite updateSite = Jenkins.getInstance().getUpdateCenter().getById(siteName); + UpdateSite updateSite = Jenkins.get().getUpdateCenter().getById(siteName); if (updateSite == null) { throw new Failure("No such update center: " + siteName); } @@ -1604,7 +1599,7 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas */ @RequirePOST public HttpResponse doSiteConfigure(@QueryParameter String site) throws IOException { - Jenkins hudson = Jenkins.getInstance(); + Jenkins hudson = Jenkins.get(); hudson.checkPermission(CONFIGURE_UPDATECENTER); UpdateCenter uc = hudson.getUpdateCenter(); PersistedList sites = uc.getSites(); @@ -1617,9 +1612,9 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas return new HttpRedirect("advanced"); } - @RequirePOST + @POST public HttpResponse doProxyConfigure(StaplerRequest req) throws IOException, ServletException { - Jenkins jenkins = Jenkins.getInstance(); + Jenkins jenkins = Jenkins.get(); jenkins.checkPermission(CONFIGURE_UPDATECENTER); ProxyConfiguration pc = req.bindJSON(ProxyConfiguration.class, req.getSubmittedForm()); @@ -1639,7 +1634,7 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas @RequirePOST public HttpResponse doUploadPlugin(StaplerRequest req) throws IOException, ServletException { try { - Jenkins.getInstance().checkPermission(UPLOAD_PLUGINS); + Jenkins.get().checkPermission(UPLOAD_PLUGINS); ServletFileUpload upload = new ServletFileUpload(new DiskFileItemFactory()); @@ -1671,7 +1666,10 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas JSONArray dependencies = new JSONArray(); try { - Manifest m = new JarFile(t).getManifest(); + Manifest m; + try (JarFile jarFile = new JarFile(t)) { + m = jarFile.getManifest(); + } String deps = m.getMainAttributes().getValue("Plugin-Dependencies"); if (StringUtils.isNotBlank(deps)) { @@ -1705,7 +1703,7 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas @Restricted(NoExternalUse.class) @RequirePOST public HttpResponse doCheckUpdatesServer() throws IOException { - Jenkins.getInstance().checkPermission(Jenkins.ADMINISTER); + Jenkins.get().checkPermission(Jenkins.ADMINISTER); // We'll check the update servers with a try-retry mechanism. The retrier is built with a builder Retrier updateServerRetrier = new Retrier.Builder<>( @@ -1764,7 +1762,7 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas private FormValidation checkUpdatesServer() throws Exception { for (UpdateSite site : Jenkins.get().getUpdateCenter().getSites()) { - FormValidation v = site.updateDirectlyNow(DownloadService.signatureCheck); + FormValidation v = site.updateDirectlyNow(); if (v.kind != FormValidation.Kind.OK) { // Stop with an error return v; @@ -1801,7 +1799,7 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas } public Descriptor getProxyDescriptor() { - return Jenkins.getInstance().getDescriptor(ProxyConfiguration.class); + return Jenkins.get().getDescriptor(ProxyConfiguration.class); } /** @@ -1823,9 +1821,9 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas * @since 1.483 */ public List> prevalidateConfig(InputStream configXml) throws IOException { - Jenkins.getInstance().checkPermission(Jenkins.ADMINISTER); + Jenkins.get().checkPermission(Jenkins.ADMINISTER); List> jobs = new ArrayList<>(); - UpdateCenter uc = Jenkins.getInstance().getUpdateCenter(); + UpdateCenter uc = Jenkins.get().getUpdateCenter(); // TODO call uc.updateAllSites() when available? perhaps not, since we should not block on network here for (Map.Entry requestedPlugin : parseRequestedPlugins(configXml).entrySet()) { PluginWrapper pw = getPlugin(requestedPlugin.getKey()); @@ -1835,15 +1833,7 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas LOGGER.log(WARNING, "No such plugin {0} to install", requestedPlugin.getKey()); continue; } - if (new VersionNumber(toInstall.version).compareTo(requestedPlugin.getValue()) < 0) { - LOGGER.log(WARNING, "{0} can only be satisfied in @{1}", new Object[] {requestedPlugin, toInstall.version}); - } - if (toInstall.isForNewerHudson()) { - LOGGER.log(WARNING, "{0}@{1} was built for a newer Jenkins", new Object[] {toInstall.name, toInstall.version}); - } - if (toInstall.isForNewerJava()) { - LOGGER.log(WARNING, "{0}@{1} was built for a newer Java", new Object[] {toInstall.name, toInstall.version}); - } + logPluginWarnings(requestedPlugin, toInstall); jobs.add(toInstall.deploy(true)); } else if (pw.isOlderThan(requestedPlugin.getValue())) { // upgrade UpdateSite.Plugin toInstall = uc.getPlugin(requestedPlugin.getKey(), requestedPlugin.getValue()); @@ -1855,15 +1845,7 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas LOGGER.log(WARNING, "{0}@{1} is no newer than what we already have", new Object[] {toInstall.name, toInstall.version}); continue; } - if (new VersionNumber(toInstall.version).compareTo(requestedPlugin.getValue()) < 0) { - LOGGER.log(WARNING, "{0} can only be satisfied in @{1}", new Object[] {requestedPlugin, toInstall.version}); - } - if (toInstall.isForNewerHudson()) { - LOGGER.log(WARNING, "{0}@{1} was built for a newer Jenkins", new Object[] {toInstall.name, toInstall.version}); - } - if (toInstall.isForNewerJava()) { - LOGGER.log(WARNING, "{0}@{1} was built for a newer Java", new Object[] {toInstall.name, toInstall.version}); - } + logPluginWarnings(requestedPlugin, toInstall); if (!toInstall.isCompatibleWithInstalledVersion()) { LOGGER.log(WARNING, "{0}@{1} is incompatible with the installed @{2}", new Object[] {toInstall.name, toInstall.version, pw.getVersion()}); } @@ -1873,6 +1855,18 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas return jobs; } + private void logPluginWarnings(Map.Entry requestedPlugin, UpdateSite.Plugin toInstall) { + if (new VersionNumber(toInstall.version).compareTo(requestedPlugin.getValue()) < 0) { + LOGGER.log(WARNING, "{0} can only be satisfied in @{1}", new Object[] {requestedPlugin, toInstall.version}); + } + if (toInstall.isForNewerHudson()) { + LOGGER.log(WARNING, "{0}@{1} was built for a newer Jenkins", new Object[] {toInstall.name, toInstall.version}); + } + if (toInstall.isForNewerJava()) { + LOGGER.log(WARNING, "{0}@{1} was built for a newer Java", new Object[] {toInstall.name, toInstall.version}); + } + } + /** * Like {@link #doInstallNecessaryPlugins(StaplerRequest)} but only checks if everything is installed * or if some plugins need updates or installation. @@ -1885,7 +1879,7 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas */ @RequirePOST public JSONArray doPrevalidateConfig(StaplerRequest req) throws IOException { - Jenkins.getInstance().checkPermission(Jenkins.ADMINISTER); + Jenkins.get().checkPermission(Jenkins.ADMINISTER); JSONArray response = new JSONArray(); @@ -1964,7 +1958,7 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas * @return the list of results for every plugin and their dependent plugins. * @throws IOException see {@link PluginWrapper#disable()} */ - public @NonNull List disablePlugins(@NonNull PluginWrapper.PluginDisableStrategy strategy, @NonNull List plugins) throws IOException { + public @Nonnull List disablePlugins(@Nonnull PluginWrapper.PluginDisableStrategy strategy, @Nonnull List plugins) throws IOException { // Where we store the results of each plugin disablement List results = new ArrayList<>(plugins.size()); @@ -2065,7 +2059,9 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas loaded.put(name, null); } // not found in any of the classloader. delegate. - throw new ClassNotFoundException(name); + ClassNotFoundException cnfe = new ClassNotFoundException(name); + MissingClassTelemetry.reportException(name, cnfe); + throw cnfe; } @Override @@ -2133,7 +2129,7 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas * Stores {@link Plugin} instances. */ /*package*/ static final class PluginInstanceStore { - final Map store = new ConcurrentHashMap(); + final Map store = new ConcurrentHashMap<>(); } /** @@ -2154,7 +2150,7 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas public boolean isActivated() { if(pluginsWithCycle == null){ pluginsWithCycle = new ArrayList<>(); - for (PluginWrapper p : Jenkins.getInstance().getPluginManager().getPlugins()) { + for (PluginWrapper p : Jenkins.get().getPluginManager().getPlugins()) { if(p.hasCycleDependency()){ pluginsWithCycle.add(p); isActive = true; @@ -2176,7 +2172,7 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas @Extension @Symbol("pluginUpdate") public static final class PluginUpdateMonitor extends AdministrativeMonitor { - private Map pluginsToBeUpdated = new HashMap(); + private Map pluginsToBeUpdated = new HashMap<>(); /** * Convenience method to ease access to this monitor, this allows other plugins to register required updates. @@ -2194,7 +2190,7 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas * @param message the message to show (plain text) */ public void ifPluginOlderThenReport(String pluginName, String requiredVersion, String message){ - Plugin plugin = Jenkins.getInstance().getPlugin(pluginName); + Plugin plugin = Jenkins.get().getPlugin(pluginName); if(plugin != null){ if(plugin.getWrapper().getVersionNumber().isOlderThan(new VersionNumber(requiredVersion))) { pluginsToBeUpdated.put(pluginName, new PluginUpdateInfo(pluginName, message)); @@ -2274,7 +2270,7 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas @Restricted(NoExternalUse.class) public Object getTarget() { if (!SKIP_PERMISSION_CHECK) { - Jenkins.getInstance().checkPermission(Jenkins.ADMINISTER); + Jenkins.get().checkPermission(Jenkins.ADMINISTER); } return this; } diff --git a/core/src/main/java/hudson/PluginWrapper.java b/core/src/main/java/hudson/PluginWrapper.java index 7b27dfd697..3b537f4a63 100644 --- a/core/src/main/java/hudson/PluginWrapper.java +++ b/core/src/main/java/hudson/PluginWrapper.java @@ -84,6 +84,7 @@ import static hudson.PluginWrapper.PluginDisableStatus.ERROR_DISABLING; import static hudson.PluginWrapper.PluginDisableStatus.NOT_DISABLED_DEPENDANTS; import static hudson.PluginWrapper.PluginDisableStatus.NO_SUCH_PLUGIN; import static java.util.logging.Level.WARNING; +import jenkins.plugins.DetachedPluginsUtil; import static org.apache.commons.io.FilenameUtils.getBaseName; /** @@ -230,7 +231,7 @@ public class PluginWrapper implements Comparable, ModelObject { } /** - * @deprecated Please use {@link setDependents}. + * @deprecated Please use {@link #setDependents}. */ @Deprecated public void setDependants(@Nonnull Set dependents) { @@ -246,7 +247,7 @@ public class PluginWrapper implements Comparable, ModelObject { } /** - * @deprecated Please use {@link setOptionalDependents}. + * @deprecated Please use {@link #setOptionalDependents}. */ @Deprecated public void setOptionalDependants(@Nonnull Set optionalDependents) { @@ -267,7 +268,7 @@ public class PluginWrapper implements Comparable, ModelObject { } /** - * @deprecated Please use {@link getDependents}. + * @deprecated Please use {@link #getDependents}. */ @Deprecated public @Nonnull Set getDependants() { @@ -276,7 +277,7 @@ public class PluginWrapper implements Comparable, ModelObject { /** * Like {@link #getDependents} but excluding optional dependencies. - * @since TODO + * @since 2.181 */ public @Nonnull Set getMandatoryDependents() { Set s = new HashSet<>(dependents); @@ -292,7 +293,7 @@ public class PluginWrapper implements Comparable, ModelObject { } /** - * @deprecated Please use {@link getOptionalDependents}. + * @deprecated Please use {@link #getOptionalDependents}. */ @Deprecated public @Nonnull Set getOptionalDependants() { @@ -311,7 +312,7 @@ public class PluginWrapper implements Comparable, ModelObject { /** * Like {@link #hasDependents} but excluding optional dependencies. - * @since TODO + * @since 2.181 */ public boolean hasMandatoryDependents() { if (isBundled) { @@ -321,7 +322,7 @@ public class PluginWrapper implements Comparable, ModelObject { } /** - * @deprecated Please use {@link hasDependents}. + * @deprecated Please use {@link #hasDependents}. */ @Deprecated public boolean hasDependants() { @@ -338,7 +339,7 @@ public class PluginWrapper implements Comparable, ModelObject { } /** - * @deprecated Please use {@link hasOptionalDependents}. + * @deprecated Please use {@link #hasOptionalDependents}. */ @Deprecated public boolean hasOptionalDependants() { @@ -356,7 +357,7 @@ public class PluginWrapper implements Comparable, ModelObject { /** * Like {@link #hasDependencies} but omitting optional dependencies. - * @since TODO + * @since 2.181 */ public boolean hasMandatoryDependencies() { return dependencies.stream().anyMatch(d -> !d.optional); @@ -394,6 +395,7 @@ public class PluginWrapper implements Comparable, ModelObject { String osgiProperty = osgiProperties[i].trim(); if (osgiProperty.equalsIgnoreCase("resolution:=optional")) { isOptional = true; + break; } } this.optional = isOptional; @@ -447,7 +449,7 @@ public class PluginWrapper implements Comparable, ModelObject { } public Api getApi() { - Jenkins.getInstance().checkPermission(Jenkins.ADMINISTER); + Jenkins.get().checkPermission(Jenkins.ADMINISTER); return new Api(this); } @@ -495,7 +497,7 @@ public class PluginWrapper implements Comparable, ModelObject { /** * Like {@link #getDependencies} but omits optional dependencies. - * @since TODO + * @since 2.181 */ public List getMandatoryDependencies() { return dependencies.stream().filter(d -> !d.optional).collect(Collectors.toList()); @@ -530,20 +532,30 @@ public class PluginWrapper implements Comparable, ModelObject { */ @Exported public String getUrl() { - // first look for the manifest entry. This is new in maven-hpi-plugin 1.30 + // first look in update center metadata + List siteMetadataList = getInfoFromAllSites(); + String firstSiteUrl = null; + if (!siteMetadataList.isEmpty()) { + firstSiteUrl = siteMetadataList.get(0).wiki; + if (allUrlsMatch(firstSiteUrl, siteMetadataList)) { + return firstSiteUrl; + } + } + + // if update sites give different / empty results, + // use manifest (since maven-hpi-plugin 1.30) String url = manifest.getMainAttributes().getValue("Url"); - if(url!=null) return url; - - // fallback to update center metadata - UpdateSite.Plugin ui = getInfo(); - if(ui!=null) return ui.wiki; - - return null; + if (url != null) { + return url; + } + return firstSiteUrl; } - - - @Override + private boolean allUrlsMatch(String url, List uiList) { + return uiList.stream().allMatch(k -> k.wiki != null && k.wiki.equals(url)); + } + + @Override public String toString() { return "Plugin:" + getShortName(); } @@ -604,12 +616,12 @@ public class PluginWrapper implements Comparable, ModelObject { /** * Returns the minimum Java version of this plugin, as specified in the plugin metadata. - * Generally coming from the java.level extracted as MANIFEST's metadata with + * Generally coming from the {@code java.level} extracted as MANIFEST's metadata with * this addition on the plugins' parent pom. * * @see maven-hpi-plugin#PR-75. * - * @since TODO + * @since 2.158 */ @Exported public @CheckForNull String getMinimumJavaVersion() { @@ -965,7 +977,7 @@ public class PluginWrapper implements Comparable, ModelObject { * the user may have installed a plugin locally developed. */ public UpdateSite.Plugin getUpdateInfo() { - UpdateCenter uc = Jenkins.getInstance().getUpdateCenter(); + UpdateCenter uc = Jenkins.get().getUpdateCenter(); UpdateSite.Plugin p = uc.getPlugin(getShortName(), getVersionNumber()); if(p!=null && p.isNewerThan(getVersion())) return p; return null; @@ -975,12 +987,17 @@ public class PluginWrapper implements Comparable, ModelObject { * returns the {@link hudson.model.UpdateSite.Plugin} object, or null. */ public UpdateSite.Plugin getInfo() { - UpdateCenter uc = Jenkins.getInstance().getUpdateCenter(); + UpdateCenter uc = Jenkins.get().getUpdateCenter(); UpdateSite.Plugin p = uc.getPlugin(getShortName(), getVersionNumber()); if (p != null) return p; return uc.getPlugin(getShortName()); } + private List getInfoFromAllSites() { + UpdateCenter uc = Jenkins.get().getUpdateCenter(); + return uc.getPluginFromAllSites(getShortName(), getVersionNumber()); + } + /** * Returns true if this plugin has update in the update center. * @@ -1009,6 +1026,15 @@ public class PluginWrapper implements Comparable, ModelObject { return !archive.exists(); } + /** + * Same as {@link DetachedPluginsUtil#isDetachedPlugin}. + * @since 2.185 + */ + @Exported + public boolean isDetached() { + return DetachedPluginsUtil.isDetachedPlugin(shortName); + } + /** * Sort by short name. */ @@ -1028,7 +1054,7 @@ public class PluginWrapper implements Comparable, ModelObject { * Where is the backup file? */ public File getBackupFile() { - return new File(Jenkins.getInstance().getRootDir(),"plugins/"+getShortName() + ".bak"); + return new File(Jenkins.get().getRootDir(),"plugins/"+getShortName() + ".bak"); } /** @@ -1204,14 +1230,14 @@ public class PluginWrapper implements Comparable, ModelObject { // @RequirePOST public HttpResponse doMakeEnabled() throws IOException { - Jenkins.getInstance().checkPermission(Jenkins.ADMINISTER); + Jenkins.get().checkPermission(Jenkins.ADMINISTER); enable(); return HttpResponses.ok(); } @RequirePOST public HttpResponse doMakeDisabled() throws IOException { - Jenkins.getInstance().checkPermission(Jenkins.ADMINISTER); + Jenkins.get().checkPermission(Jenkins.ADMINISTER); disable(); return HttpResponses.ok(); } @@ -1219,7 +1245,7 @@ public class PluginWrapper implements Comparable, ModelObject { @RequirePOST @Deprecated public HttpResponse doPin() throws IOException { - Jenkins.getInstance().checkPermission(Jenkins.ADMINISTER); + Jenkins.get().checkPermission(Jenkins.ADMINISTER); // See https://groups.google.com/d/msg/jenkinsci-dev/kRobm-cxFw8/6V66uhibAwAJ LOGGER.log(WARNING, "Call to pin plugin has been ignored. Plugin name: " + shortName); return HttpResponses.ok(); @@ -1228,7 +1254,7 @@ public class PluginWrapper implements Comparable, ModelObject { @RequirePOST @Deprecated public HttpResponse doUnpin() throws IOException { - Jenkins.getInstance().checkPermission(Jenkins.ADMINISTER); + Jenkins.get().checkPermission(Jenkins.ADMINISTER); // See https://groups.google.com/d/msg/jenkinsci-dev/kRobm-cxFw8/6V66uhibAwAJ LOGGER.log(WARNING, "Call to unpin plugin has been ignored. Plugin name: " + shortName); return HttpResponses.ok(); @@ -1236,7 +1262,7 @@ public class PluginWrapper implements Comparable, ModelObject { @RequirePOST public HttpResponse doDoUninstall() throws IOException { - Jenkins jenkins = Jenkins.getActiveInstance(); + Jenkins jenkins = Jenkins.get(); jenkins.checkPermission(Jenkins.ADMINISTER); archive.delete(); diff --git a/core/src/main/java/hudson/Proc.java b/core/src/main/java/hudson/Proc.java index 6acb1ceeba..f387d6abcc 100644 --- a/core/src/main/java/hudson/Proc.java +++ b/core/src/main/java/hudson/Proc.java @@ -23,6 +23,7 @@ */ package hudson; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import hudson.Launcher.ProcStarter; import hudson.model.TaskListener; import hudson.remoting.Channel; @@ -215,6 +216,7 @@ public abstract class Proc { * @param err * null to redirect stderr to stdout. */ + @SuppressFBWarnings(value = "COMMAND_INJECTION", justification = "Command injection is the point of this old, barely used class.") public LocalProc(String[] cmd,String[] env,InputStream in,OutputStream out,OutputStream err,File workDir) throws IOException { this( calcName(cmd), stderr(environment(new ProcessBuilder(cmd),env).directory(workDir), err==null || err== SELFPUMP_OUTPUT), diff --git a/core/src/main/java/hudson/ProxyConfiguration.java b/core/src/main/java/hudson/ProxyConfiguration.java index f621ef0f53..f79d15ef1d 100644 --- a/core/src/main/java/hudson/ProxyConfiguration.java +++ b/core/src/main/java/hudson/ProxyConfiguration.java @@ -62,7 +62,10 @@ import org.apache.commons.httpclient.auth.AuthScope; import org.apache.commons.httpclient.methods.GetMethod; import org.jenkinsci.Symbol; import org.jvnet.robust_http_client.RetryableHttpStream; +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.NoExternalUse; import org.kohsuke.stapler.DataBoundConstructor; +import org.kohsuke.stapler.DataBoundSetter; import org.kohsuke.stapler.QueryParameter; import org.kohsuke.stapler.interceptor.RequirePOST; @@ -94,14 +97,15 @@ public final class ProxyConfiguration extends AbstractDescribableImpl 0 ? DEFAULT_CONNECT_TIMEOUT_MILLIS : TimeUnit.SECONDS.toMillis(30)); + method.getParams().setParameter("http.socket.timeout", DEFAULT_CONNECT_TIMEOUT_MILLIS > 0 ? DEFAULT_CONNECT_TIMEOUT_MILLIS : (int)TimeUnit.SECONDS.toMillis(30)); HttpClient client = new HttpClient(); if (Util.fixEmptyAndTrim(name) != null && !isNoProxyHost(host, noProxyHost)) { client.getHostConfiguration().setProxy(name, port); - Credentials credentials = createCredentials(userName, password); + Credentials credentials = createCredentials(userName, password != null ? password.getPlainText() : null); AuthScope scope = new AuthScope(AuthScope.ANY_HOST, AuthScope.ANY_PORT); client.getState().setProxyCredentials(scope, credentials); } diff --git a/core/src/main/java/hudson/TcpSlaveAgentListener.java b/core/src/main/java/hudson/TcpSlaveAgentListener.java index 659cf2da1c..39ba388d2d 100644 --- a/core/src/main/java/hudson/TcpSlaveAgentListener.java +++ b/core/src/main/java/hudson/TcpSlaveAgentListener.java @@ -27,7 +27,6 @@ import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.io.ByteArrayInputStream; import java.io.SequenceInputStream; import java.io.Writer; -import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.security.interfaces.RSAPublicKey; import javax.annotation.Nullable; @@ -44,7 +43,9 @@ import java.io.DataOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.net.SocketAddress; +import java.net.URL; import java.util.Arrays; +import java.util.Base64; import jenkins.AgentProtocol; import java.io.BufferedWriter; @@ -55,12 +56,12 @@ import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.BindException; import java.net.InetSocketAddress; +import java.net.MalformedURLException; import java.net.Socket; import java.nio.channels.ServerSocketChannel; import java.util.logging.Level; import java.util.logging.Logger; -import org.apache.commons.codec.binary.Base64; import org.apache.commons.io.Charsets; import org.apache.commons.io.IOUtils; import org.apache.commons.io.output.NullOutputStream; @@ -132,6 +133,21 @@ public final class TcpSlaveAgentListener extends Thread { return CLI_PORT != null ? CLI_PORT : getPort(); } + /** + * Gets the host name that we advertise protocol clients to connect to. + * @since 2.198 + */ + public String getAdvertisedHost() { + if (CLI_HOST_NAME != null) { + return CLI_HOST_NAME; + } + try { + return new URL(Jenkins.get().getRootUrl()).getHost(); + } catch (MalformedURLException | NullPointerException e) { + throw new IllegalStateException("Could not get TcpSlaveAgentListener host name", e); + } + } + /** * Gets the Base64 encoded public key that forms part of this instance's identity keypair. * @return the Base64 encoded public key @@ -140,7 +156,7 @@ public final class TcpSlaveAgentListener extends Thread { @Nullable public String getIdentityPublicKey() { RSAPublicKey key = InstanceIdentityProvider.RSA.getPublicKey(); - return key == null ? null : new String(Base64.encodeBase64(key.getEncoded()), Charset.forName("UTF-8")); + return key == null ? null : Base64.getEncoder().encodeToString(key.getEncoded()); } /** @@ -151,7 +167,7 @@ public final class TcpSlaveAgentListener extends Thread { * @since 2.16 */ public String getAgentProtocolNames() { - return StringUtils.join(Jenkins.getInstance().getAgentProtocols(), ", "); + return StringUtils.join(Jenkins.get().getAgentProtocols(), ", "); } /** @@ -267,7 +283,7 @@ public final class TcpSlaveAgentListener extends Thread { String protocol = s.substring(9); AgentProtocol p = AgentProtocol.of(protocol); if (p!=null) { - if (Jenkins.getInstance().getAgentProtocols().contains(protocol)) { + if (Jenkins.get().getAgentProtocols().contains(protocol)) { LOGGER.log(p instanceof PingAgentProtocol ? Level.FINE : Level.INFO, "Accepted {0} connection #{1} from {2}", new Object[] {protocol, id, this.s.getRemoteSocketAddress()}); p.handle(this.s); } else { @@ -374,9 +390,6 @@ public final class TcpSlaveAgentListener extends Thread { ping = "Ping\n".getBytes(StandardCharsets.UTF_8); } - /** - * {@inheritDoc} - */ @Override public boolean isRequired() { return true; @@ -387,9 +400,6 @@ public final class TcpSlaveAgentListener extends Thread { return "Ping"; } - /** - * {@inheritDoc} - */ @Override public String getDisplayName() { return Messages.TcpSlaveAgentListener_PingAgentProtocol_displayName(); @@ -439,7 +449,7 @@ public final class TcpSlaveAgentListener extends Thread { } /** - * Reschedules the TcpSlaveAgentListener on demand. Disables itself after running. + * Reschedules the {@code TcpSlaveAgentListener} on demand. Disables itself after running. */ @Extension @Restricted(NoExternalUse.class) @@ -488,7 +498,7 @@ public final class TcpSlaveAgentListener extends Thread { if (originThread.isAlive()) { originThread.interrupt(); } - int port = Jenkins.getInstance().getSlaveAgentPort(); + int port = Jenkins.get().getSlaveAgentPort(); if (port != -1) { new TcpSlaveAgentListener(port).start(); LOGGER.log(Level.INFO, "Restarted TcpSlaveAgentListener"); diff --git a/core/src/main/java/hudson/UDPBroadcastThread.java b/core/src/main/java/hudson/UDPBroadcastThread.java index 446c621a3e..57bbe7fc30 100644 --- a/core/src/main/java/hudson/UDPBroadcastThread.java +++ b/core/src/main/java/hudson/UDPBroadcastThread.java @@ -2,6 +2,7 @@ * The MIT License * * Copyright (c) 2004-2009, Sun Microsystems, Inc. + * Copyright (c) 2020, 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 @@ -23,24 +24,17 @@ */ package hudson; -import jenkins.util.SystemProperties; -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; -import hudson.model.Hudson; +import hudson.init.Initializer; import jenkins.model.Jenkins; -import hudson.util.OneShotEvent; +import jenkins.util.SystemProperties; +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.NoExternalUse; import java.io.IOException; -import java.net.DatagramPacket; -import java.net.InetAddress; -import java.net.MulticastSocket; -import java.net.SocketAddress; -import java.net.SocketException; -import java.net.UnknownHostException; -import java.nio.channels.ClosedByInterruptException; -import java.nio.charset.StandardCharsets; -import java.util.logging.Level; import java.util.logging.Logger; +import static hudson.init.InitMilestone.COMPLETED; + /** * Monitors a UDP multicast broadcast and respond with the location of the Hudson service. * @@ -48,103 +42,22 @@ import java.util.logging.Logger; * Useful for auto-discovery of Hudson in the network. * * @author Kohsuke Kawaguchi + * @deprecated No longer does anything. */ -public class UDPBroadcastThread extends Thread { - private final Jenkins jenkins; +@Deprecated +@Restricted(NoExternalUse.class) +public class UDPBroadcastThread { - public final OneShotEvent ready = new OneShotEvent(); - private MulticastSocket mcs; - private boolean shutdown; - static boolean udpHandlingProblem; // for tests - - /** - * @deprecated as of 1.416 - * Use {@link #UDPBroadcastThread(Jenkins)} - */ - @Deprecated - public UDPBroadcastThread(Hudson jenkins) throws IOException { - this((Jenkins)jenkins); - } - - public UDPBroadcastThread(Jenkins jenkins) throws IOException { - super("Jenkins UDP "+PORT+" monitoring thread"); - this.jenkins = jenkins; - mcs = new MulticastSocket(PORT); - } - - @SuppressFBWarnings("ST_WRITE_TO_STATIC_FROM_INSTANCE_METHOD") - @Override - public void run() { - try { - mcs.joinGroup(MULTICAST); - ready.signal(); - - //noinspection InfiniteLoopStatement - while(true) { - byte[] buf = new byte[2048]; - DatagramPacket p = new DatagramPacket(buf,buf.length); - mcs.receive(p); - - SocketAddress sender = p.getSocketAddress(); - - // prepare a response - TcpSlaveAgentListener tal = jenkins.getTcpSlaveAgentListener(); - - StringBuilder rsp = new StringBuilder(""); - tag(rsp,"version", Jenkins.VERSION); - tag(rsp,"url", jenkins.getRootUrl()); - tag(rsp,"server-id", jenkins.getLegacyInstanceId()); - tag(rsp,"slave-port",tal==null?null:tal.getPort()); - - for (UDPBroadcastFragment f : UDPBroadcastFragment.all()) - f.buildFragment(rsp,sender); - - rsp.append(""); - - byte[] response = rsp.toString().getBytes(StandardCharsets.UTF_8); - mcs.send(new DatagramPacket(response,response.length,sender)); - } - } catch (ClosedByInterruptException e) { - // shut down - } catch (SocketException e) { - if (shutdown) { // forcibly closed - return; - } // if we failed to listen to UDP, just silently abandon it, as a stack trace - // makes people unnecessarily concerned, for a feature that currently does no good. - LOGGER.log(Level.INFO, "Cannot listen to UDP port {0}, skipping: {1}", new Object[] {PORT, e}); - LOGGER.log(Level.FINE, null, e); - } catch (IOException e) { - if (shutdown) return; // forcibly closed - LOGGER.log(Level.WARNING, "UDP handling problem",e); - udpHandlingProblem = true; - } - } - - private void tag(StringBuilder buf, String tag, Object value) { - if(value==null) return; - buf.append('<').append(tag).append('>').append(value).append("'); - } - - public void shutdown() { - shutdown = true; - mcs.close(); - interrupt(); - } - - public static final int PORT = SystemProperties.getInteger("hudson.udp",33848); + // The previous default port was 33848, before the "disabled by default" change + public static final int PORT = SystemProperties.getInteger("hudson.udp", -1); private static final Logger LOGGER = Logger.getLogger(UDPBroadcastThread.class.getName()); - /** - * Multicast socket address. - */ - public static InetAddress MULTICAST; - - static { - try { - MULTICAST = InetAddress.getByAddress(new byte[]{(byte)239, (byte)77, (byte)124, (byte)213}); - } catch (UnknownHostException e) { - throw new Error(e); + @Initializer(before=COMPLETED) + public static void warn() { + if (PORT > 0) { + LOGGER.warning("UDP broadcast capability has been removed from Jenkins. More information: https://jenkins.io/redirect/udp-broadcast"); } } + } diff --git a/core/src/main/java/hudson/Util.java b/core/src/main/java/hudson/Util.java index 73c3f03a9a..776fea2c41 100644 --- a/core/src/main/java/hudson/Util.java +++ b/core/src/main/java/hudson/Util.java @@ -23,6 +23,7 @@ */ package hudson; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import hudson.model.TaskListener; import jenkins.util.MemoryReductionUtil; import hudson.util.QuotedStringTokenizer; @@ -185,11 +186,11 @@ public class Util { } /** - * Reads the entire contents of the text file at logfile into a + * Reads the entire contents of the text file at {@code logfile} into a * string using the {@link Charset#defaultCharset() default charset} for * decoding. If no such file exists, an empty string is returned. * @param logfile The text file to read in its entirety. - * @return The entire text content of logfile. + * @return The entire text content of {@code logfile}. * @throws IOException If an error occurs while reading the file. * @deprecated call {@link #loadFile(java.io.File, java.nio.charset.Charset)} * instead to specify the charset to use for decoding (preferably @@ -202,12 +203,12 @@ public class Util { } /** - * Reads the entire contents of the text file at logfile into a - * string using charset for decoding. If no such file exists, + * Reads the entire contents of the text file at {@code logfile} into a + * string using {@code charset} for decoding. If no such file exists, * an empty string is returned. * @param logfile The text file to read in its entirety. - * @param charset The charset to use for decoding the bytes in logfile. - * @return The entire text content of logfile. + * @param charset The charset to use for decoding the bytes in {@code logfile}. + * @return The entire text content of {@code logfile}. * @throws IOException If an error occurs while reading the file. */ @Nonnull @@ -588,6 +589,8 @@ public class Util { /** * Computes MD5 digest of the given input stream. * + * This method should only be used for non-security applications where the MD5 weakness is not a problem. + * * @param source * The stream will be closed by this method at the end of this method. * @return @@ -597,7 +600,7 @@ public class Util { @Nonnull public static String getDigestOf(@Nonnull InputStream source) throws IOException { try { - MessageDigest md5 = MessageDigest.getInstance("MD5"); + MessageDigest md5 = getMd5(); DigestInputStream in = new DigestInputStream(source, md5); // Note: IOUtils.copy() buffers the input internally, so there is no // need to use a BufferedInputStream. @@ -617,6 +620,14 @@ public class Util { */ } + // TODO JENKINS-60563 remove MD5 from all usages in Jenkins + @SuppressFBWarnings(value = "WEAK_MESSAGE_DIGEST_MD5", justification = + "This method should only be used for non-security applications where the MD5 weakness is not a problem.") + @Deprecated + private static MessageDigest getMd5() throws NoSuchAlgorithmException { + return MessageDigest.getInstance("MD5"); + } + @Nonnull public static String getDigestOf(@Nonnull String text) { try { @@ -692,6 +703,7 @@ public class Util { * number of milliseconds. */ @Nonnull + @SuppressFBWarnings(value = "ICAST_IDIV_CAST_TO_DOUBLE", justification = "We want to truncate here.") public static String getTimeSpanString(long duration) { // Break the duration up in to units. long years = duration / ONE_YEAR_MS; @@ -753,10 +765,12 @@ public class Util { /** * Get a human readable string representing strings like "xxx days ago", * which should be used to point to the occurrence of an event in the past. + * @deprecated Actually identical to {@link #getTimeSpanString}, does not add {@code ago}. */ + @Deprecated @Nonnull public static String getPastTimeString(long duration) { - return Messages.Util_pastTime(getTimeSpanString(duration)); + return getTimeSpanString(duration); } @@ -866,29 +880,52 @@ public class Util { CharBuffer buf = null; char c; for (int i = 0, m = s.length(); i < m; i++) { - c = s.charAt(i); - if (c > 122 || uriMap[c]) { + int codePoint = Character.codePointAt(s, i); + if((codePoint&0xffffff80)==0) { // 1 byte + c = s.charAt(i); + if (c > 122 || uriMap[c]) { + if (!escaped) { + out = new StringBuilder(i + (m - i) * 3); + out.append(s, 0, i); + escaped = true; + } + if (enc == null || buf == null) { + enc = StandardCharsets.UTF_8.newEncoder(); + buf = CharBuffer.allocate(1); + } + // 1 char -> UTF8 + buf.put(0, c); + buf.rewind(); + try { + ByteBuffer bytes = enc.encode(buf); + while (bytes.hasRemaining()) { + byte b = bytes.get(); + out.append('%'); + out.append(toDigit((b >> 4) & 0xF)); + out.append(toDigit(b & 0xF)); + } + } catch (CharacterCodingException ex) { + } + } else if (escaped) { + out.append(c); + } + } else { if (!escaped) { out = new StringBuilder(i + (m - i) * 3); out.append(s, 0, i); - enc = StandardCharsets.UTF_8.newEncoder(); - buf = CharBuffer.allocate(1); escaped = true; } - // 1 char -> UTF8 - buf.put(0,c); - buf.rewind(); - try { - ByteBuffer bytes = enc.encode(buf); - while (bytes.hasRemaining()) { - byte b = bytes.get(); - out.append('%'); - out.append(toDigit((b >> 4) & 0xF)); - out.append(toDigit(b & 0xF)); - } - } catch (CharacterCodingException ex) { } - } else if (escaped) { - out.append(c); + + byte[] bytes = new String(new int[] { codePoint }, 0, 1).getBytes(StandardCharsets.UTF_8); + for (byte aByte : bytes) { + out.append('%'); + out.append(toDigit((aByte >> 4) & 0xF)); + out.append(toDigit(aByte & 0xF)); + } + + if(Character.charCount(codePoint) > 1) { + i++; // we processed two characters + } } } return escaped ? out.toString() : s; @@ -967,7 +1004,7 @@ public class Util { /** * Creates an empty file if nonexistent or truncates the existing file. * Note: The behavior of this method in the case where the file already - * exists is unlike the POSIX touch utility which merely + * exists is unlike the POSIX {@code touch} utility which merely * updates the file's access and/or modification time. */ public static void touch(@Nonnull File file) throws IOException { @@ -1554,10 +1591,10 @@ public class Util { public static boolean SYMLINK_ESCAPEHATCH = SystemProperties.getBoolean(Util.class.getName()+".symlinkEscapeHatch"); /** - * The number of times we will attempt to delete files/directory trees + * The number of additional times we will attempt to delete files/directory trees * before giving up and throwing an exception.
- * Specifying a value less than 1 is invalid and will be treated as if - * a value of 1 (i.e. one attempt, no retries) was specified. + * Specifying a value less than 0 is invalid and will be treated as if + * a value of 0 (i.e. one attempt, no retries) was specified. *

* e.g. if some of the child directories are big, it might take long enough * to delete that it allows others to create new files in the directory we @@ -1568,12 +1605,12 @@ public class Util { * give up, thus improving build reliability. */ @Restricted(value = NoExternalUse.class) - static int DELETION_MAX = Math.max(1, SystemProperties.getInteger(Util.class.getName() + ".maxFileDeletionRetries", 3)); + static int DELETION_RETRIES = Math.max(0, SystemProperties.getInteger(Util.class.getName() + ".maxFileDeletionRetries", 2)); /** * The time (in milliseconds) that we will wait between attempts to * delete files when retrying.
- * This has no effect unless {@link #DELETION_MAX} is non-zero. + * This has no effect unless {@link #DELETION_RETRIES} is non-zero. *

* If zero, we will not delay between attempts.
* If negative, we will wait an (linearly) increasing multiple of this value @@ -1585,8 +1622,8 @@ public class Util { /** * If this flag is set to true then we will request a garbage collection * after a deletion failure before we next retry the delete.
- * It defaults to false and is ignored unless - * {@link #DELETION_MAX} is greater than 1. + * It defaults to {@code false} and is ignored unless + * {@link #DELETION_RETRIES} is non zero. *

* Setting this flag to true may resolve some problems on Windows, * and also for directory trees residing on an NFS share, but it can @@ -1607,7 +1644,7 @@ public class Util { static boolean GC_AFTER_FAILED_DELETE = SystemProperties.getBoolean(Util.class.getName() + ".performGCOnFailedDelete"); private static PathRemover newPathRemover(@Nonnull PathRemover.PathChecker pathChecker) { - return PathRemover.newFilteredRobustRemover(pathChecker, DELETION_MAX - 1, GC_AFTER_FAILED_DELETE, WAIT_BETWEEN_DELETION_RETRIES); + return PathRemover.newFilteredRobustRemover(pathChecker, DELETION_RETRIES, GC_AFTER_FAILED_DELETE, WAIT_BETWEEN_DELETION_RETRIES); } /** diff --git a/core/src/main/java/hudson/WebAppMain.java b/core/src/main/java/hudson/WebAppMain.java index bf2bf3f455..1dcadb036d 100644 --- a/core/src/main/java/hudson/WebAppMain.java +++ b/core/src/main/java/hudson/WebAppMain.java @@ -130,7 +130,7 @@ public class WebAppMain implements ServletContextListener { final FileAndDescription describedHomeDir = getHomeDir(event); home = describedHomeDir.file.getAbsoluteFile(); home.mkdirs(); - System.out.println("Jenkins home directory: "+home+" found at: "+describedHomeDir.description); + LOGGER.info("Jenkins home directory: "+ home +" found at: " + describedHomeDir.description); // check that home exists (as mkdirs could have failed silently), otherwise throw a meaningful error if (!home.exists()) diff --git a/core/src/main/java/hudson/XmlFile.java b/core/src/main/java/hudson/XmlFile.java index 7f630dfb33..89be52478b 100644 --- a/core/src/main/java/hudson/XmlFile.java +++ b/core/src/main/java/hudson/XmlFile.java @@ -25,8 +25,10 @@ package hudson; import com.thoughtworks.xstream.XStream; import com.thoughtworks.xstream.converters.Converter; +import com.thoughtworks.xstream.converters.DataHolder; import com.thoughtworks.xstream.converters.UnmarshallingContext; import com.thoughtworks.xstream.io.HierarchicalStreamDriver; +import com.thoughtworks.xstream.io.HierarchicalStreamReader; import hudson.diagnosis.OldDataMonitor; import hudson.model.Descriptor; import hudson.util.AtomicFileWriter; diff --git a/core/src/main/java/hudson/cli/CLIAction.java b/core/src/main/java/hudson/cli/CLIAction.java index b4116f3b58..102dbbc00b 100644 --- a/core/src/main/java/hudson/cli/CLIAction.java +++ b/core/src/main/java/hudson/cli/CLIAction.java @@ -43,20 +43,26 @@ import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerResponse; import hudson.Extension; +import java.io.ByteArrayInputStream; +import java.io.DataInputStream; import java.io.InputStream; import java.io.OutputStream; import java.io.PipedInputStream; import java.io.PipedOutputStream; import java.io.PrintStream; +import java.nio.ByteBuffer; import java.nio.charset.Charset; import java.nio.charset.UnsupportedCharsetException; import java.util.ArrayList; import java.util.List; import java.util.Locale; -import java.util.concurrent.atomic.AtomicReference; import java.util.logging.Level; import java.util.logging.Logger; import jenkins.util.FullDuplexHttpService; +import jenkins.websocket.WebSocketSession; +import jenkins.websocket.WebSockets; +import org.acegisecurity.Authentication; +import org.kohsuke.stapler.HttpResponse; import org.kohsuke.stapler.HttpResponses; /** @@ -85,7 +91,7 @@ public class CLIAction implements UnprotectedRootAction, StaplerProxy { } public void doCommand(StaplerRequest req, StaplerResponse rsp) throws ServletException, IOException { - final Jenkins jenkins = Jenkins.getActiveInstance(); + final Jenkins jenkins = Jenkins.get(); jenkins.checkPermission(Jenkins.READ); // Strip trailing slash @@ -100,6 +106,74 @@ public class CLIAction implements UnprotectedRootAction, StaplerProxy { req.getView(this, "command.jelly").forward(req, rsp); } + /** for Jelly */ + public boolean isWebSocketSupported() { + return WebSockets.isSupported(); + } + + /** + * WebSocket endpoint. + */ + public HttpResponse doWs() { + if (!WebSockets.isSupported()) { + return HttpResponses.notFound(); + } + Authentication authentication = Jenkins.getAuthentication(); + return WebSockets.upgrade(new WebSocketSession() { + ServerSideImpl connection; + class OutputImpl implements PlainCLIProtocol.Output { + @Override + public void send(byte[] data) throws IOException { + sendBinary(ByteBuffer.wrap(data)); + } + @Override + public void close() throws IOException { + doClose(); + } + } + private void doClose() { + close(); + } + @Override + protected void opened() { + try { + connection = new ServerSideImpl(new OutputImpl(), authentication); + } catch (IOException x) { + error(x); + return; + } + new Thread(() -> { + try { + try { + connection.run(); + } finally { + connection.close(); + } + } catch (Exception x) { + error(x); + } + }, "CLI handler for " + authentication.getName()).start(); + } + @Override + protected void binary(byte[] payload, int offset, int len) { + try { + connection.handle(new DataInputStream(new ByteArrayInputStream(payload, offset, len))); + } catch (IOException x) { + error(x); + } + } + @Override + protected void error(Throwable cause) { + LOGGER.log(Level.WARNING, null, cause); + } + @Override + protected void closed(int statusCode, String reason) { + LOGGER.fine(() -> "closed: " + statusCode + ": " + reason); + connection.handleClose(); + } + }); + } + @Override public Object getTarget() { StaplerRequest req = Stapler.getCurrentRequest(); @@ -116,6 +190,105 @@ public class CLIAction implements UnprotectedRootAction, StaplerProxy { } } + class ServerSideImpl extends PlainCLIProtocol.ServerSide { + private Thread runningThread; + private boolean ready; + private final List args = new ArrayList<>(); + private Locale locale = Locale.getDefault(); + private Charset encoding = Charset.defaultCharset(); + private final PipedInputStream stdin = new PipedInputStream(); + private final PipedOutputStream stdinMatch = new PipedOutputStream(); + private final Authentication authentication; + ServerSideImpl(PlainCLIProtocol.Output out, Authentication authentication) throws IOException { + super(out); + stdinMatch.connect(stdin); + this.authentication = authentication; + } + @Override + protected void onArg(String text) { + args.add(text); + } + @Override + protected void onLocale(String text) { + for (Locale _locale : Locale.getAvailableLocales()) { + if (_locale.toString().equals(text)) { + locale = _locale; + return; + } + } + LOGGER.log(Level.WARNING, "unknown client locale {0}", text); + } + @Override + protected void onEncoding(String text) { + try { + encoding = Charset.forName(text); + } catch (UnsupportedCharsetException x) { + LOGGER.log(Level.WARNING, "unknown client charset {0}", text); + } + } + @Override + protected void onStart() { + ready(); + } + @Override + protected void onStdin(byte[] chunk) throws IOException { + stdinMatch.write(chunk); + } + @Override + protected void onEndStdin() throws IOException { + stdinMatch.close(); + } + @Override + protected void handleClose() { + ready(); + if (runningThread != null) { + runningThread.interrupt(); + } + } + private synchronized void ready() { + ready = true; + notifyAll(); + } + void run() throws IOException, InterruptedException { + synchronized (this) { + while (!ready) { + wait(); + } + } + PrintStream stdout = new PrintStream(streamStdout(), false, encoding.name()); + PrintStream stderr = new PrintStream(streamStderr(), true, encoding.name()); + if (args.isEmpty()) { + stderr.println("Connection closed before arguments received"); + sendExit(2); + return; + } + String commandName = args.get(0); + CLICommand command = CLICommand.clone(commandName); + if (command == null) { + stderr.println("No such command " + commandName); + sendExit(2); + return; + } + command.setTransportAuth(authentication); + command.setClientCharset(encoding); + CLICommand orig = CLICommand.setCurrent(command); + try { + runningThread = Thread.currentThread(); + int exit = command.main(args.subList(1, args.size()), locale, stdin, stdout, stderr); + stdout.flush(); + sendExit(exit); + try { // seems to avoid ReadPendingException from Jetty + Thread.sleep(1000); + } catch (InterruptedException x) { + // expected; ignore + } + } finally { + CLICommand.setCurrent(orig); + runningThread = null; + } + } + } + /** * Serves {@link PlainCLIProtocol} response. */ @@ -130,103 +303,9 @@ public class CLIAction implements UnprotectedRootAction, StaplerProxy { return new FullDuplexHttpService(uuid) { @Override protected void run(InputStream upload, OutputStream download) throws IOException, InterruptedException { - final AtomicReference runningThread = new AtomicReference<>(); - class ServerSideImpl extends PlainCLIProtocol.ServerSide { - boolean ready; - List args = new ArrayList<>(); - Locale locale = Locale.getDefault(); - Charset encoding = Charset.defaultCharset(); - final PipedInputStream stdin = new PipedInputStream(); - final PipedOutputStream stdinMatch = new PipedOutputStream(); - ServerSideImpl(InputStream is, OutputStream os) throws IOException { - super(is, os); - stdinMatch.connect(stdin); - } - @Override - protected void onArg(String text) { - args.add(text); - } - @Override - protected void onLocale(String text) { - for (Locale _locale : Locale.getAvailableLocales()) { - if (_locale.toString().equals(text)) { - locale = _locale; - return; - } - } - LOGGER.log(Level.WARNING, "unknown client locale {0}", text); - } - @Override - protected void onEncoding(String text) { - try { - encoding = Charset.forName(text); - } catch (UnsupportedCharsetException x) { - LOGGER.log(Level.WARNING, "unknown client charset {0}", text); - } - } - @Override - protected void onStart() { - ready(); - } - @Override - protected void onStdin(byte[] chunk) throws IOException { - stdinMatch.write(chunk); - } - @Override - protected void onEndStdin() throws IOException { - stdinMatch.close(); - } - @Override - protected void handleClose() { - ready(); - Thread t = runningThread.get(); - if (t != null) { - t.interrupt(); - } - } - private synchronized void ready() { - ready = true; - notifyAll(); - } - } - try (ServerSideImpl connection = new ServerSideImpl(upload, download)) { - connection.begin(); - synchronized (connection) { - while (!connection.ready) { - connection.wait(); - } - } - PrintStream stdout = new PrintStream(connection.streamStdout(), false, connection.encoding.name()); - PrintStream stderr = new PrintStream(connection.streamStderr(), true, connection.encoding.name()); - if (connection.args.isEmpty()) { - stderr.println("Connection closed before arguments received"); - connection.sendExit(2); - return; - } - String commandName = connection.args.get(0); - CLICommand command = CLICommand.clone(commandName); - if (command == null) { - stderr.println("No such command " + commandName); - connection.sendExit(2); - return; - } - command.setTransportAuth(Jenkins.getAuthentication()); - command.setClientCharset(connection.encoding); - CLICommand orig = CLICommand.setCurrent(command); - try { - runningThread.set(Thread.currentThread()); - int exit = command.main(connection.args.subList(1, connection.args.size()), connection.locale, connection.stdin, stdout, stderr); - stdout.flush(); - connection.sendExit(exit); - try { // seems to avoid ReadPendingException from Jetty - Thread.sleep(1000); - } catch (InterruptedException x) { - // expected; ignore - } - } finally { - CLICommand.setCurrent(orig); - runningThread.set(null); - } + try (ServerSideImpl connection = new ServerSideImpl(new PlainCLIProtocol.FramedOutput(download), Jenkins.getAuthentication())) { + new PlainCLIProtocol.FramedReader(connection, upload).start(); + connection.run(); } } }; diff --git a/core/src/main/java/hudson/cli/CLICommand.java b/core/src/main/java/hudson/cli/CLICommand.java index 15d496be1b..68747a6a8c 100644 --- a/core/src/main/java/hudson/cli/CLICommand.java +++ b/core/src/main/java/hudson/cli/CLICommand.java @@ -242,10 +242,8 @@ public abstract class CLICommand implements ExtensionPoint, Cloneable { sc.setAuthentication(auth = getTransportAuthentication()); if (!(this instanceof HelpCommand || this instanceof WhoAmICommand)) - Jenkins.getActiveInstance().checkPermission(Jenkins.READ); + Jenkins.get().checkPermission(Jenkins.READ); p.parseArgument(args.toArray(new String[0])); - if (!(this instanceof HelpCommand || this instanceof WhoAmICommand)) - Jenkins.getActiveInstance().checkPermission(Jenkins.READ); LOGGER.log(Level.FINE, "Invoking CLI command {0}, with {1} arguments, as user {2}.", new Object[] {getName(), args.size(), auth.getName()}); int res = run(); @@ -502,7 +500,7 @@ public abstract class CLICommand implements ExtensionPoint, Cloneable { */ protected void registerOptionHandlers() { try { - for (Class c : Index.list(OptionHandlerExtension.class, Jenkins.getActiveInstance().pluginManager.uberClassLoader,Class.class)) { + for (Class c : Index.list(OptionHandlerExtension.class, Jenkins.get().pluginManager.uberClassLoader,Class.class)) { Type t = Types.getBaseClass(c, OptionHandler.class); CmdLineParser.registerHandler(Types.erasure(Types.getTypeArgument(t,0)), c); } diff --git a/core/src/main/java/hudson/cli/CancelQuietDownCommand.java b/core/src/main/java/hudson/cli/CancelQuietDownCommand.java index 24b2ec3018..a521de769b 100644 --- a/core/src/main/java/hudson/cli/CancelQuietDownCommand.java +++ b/core/src/main/java/hudson/cli/CancelQuietDownCommand.java @@ -47,7 +47,7 @@ public class CancelQuietDownCommand extends CLICommand { @Override protected int run() throws Exception { - Jenkins.getActiveInstance().doCancelQuietDown(); + Jenkins.get().doCancelQuietDown(); return 0; } } diff --git a/core/src/main/java/hudson/cli/ClearQueueCommand.java b/core/src/main/java/hudson/cli/ClearQueueCommand.java index 52cd7c4063..1a1b875bc5 100644 --- a/core/src/main/java/hudson/cli/ClearQueueCommand.java +++ b/core/src/main/java/hudson/cli/ClearQueueCommand.java @@ -47,7 +47,7 @@ public class ClearQueueCommand extends CLICommand { @Override protected int run() throws Exception { - Jenkins.getActiveInstance().getQueue().clear(); + Jenkins.get().getQueue().clear(); return 0; } diff --git a/core/src/main/java/hudson/cli/ConnectNodeCommand.java b/core/src/main/java/hudson/cli/ConnectNodeCommand.java index 012237190f..0a9a152e22 100644 --- a/core/src/main/java/hudson/cli/ConnectNodeCommand.java +++ b/core/src/main/java/hudson/cli/ConnectNodeCommand.java @@ -26,9 +26,6 @@ package hudson.cli; import hudson.AbortException; import hudson.Extension; import hudson.model.Computer; -import hudson.model.ComputerSet; -import hudson.util.EditDistance; -import jenkins.model.Jenkins; import org.kohsuke.args4j.Argument; import org.kohsuke.args4j.Option; @@ -61,35 +58,18 @@ public class ConnectNodeCommand extends CLICommand { @Override protected int run() throws Exception { boolean errorOccurred = false; - final Jenkins jenkins = Jenkins.getActiveInstance(); - final HashSet hs = new HashSet<>(nodes); - List names = null; - for (String node_s : hs) { - Computer computer; - try { - computer = jenkins.getComputer(node_s); - - if(computer == null) { - if(names == null) { - names = ComputerSet.getComputerNames(); - } - String adv = EditDistance.findNearest(node_s, names); - throw new IllegalArgumentException(adv == null ? - hudson.model.Messages.Computer_NoSuchSlaveExistsWithoutAdvice(node_s) : - hudson.model.Messages.Computer_NoSuchSlaveExists(node_s, adv)); - } - + Computer computer = Computer.resolveForCLI(node_s); computer.cliConnect(force); } catch (Exception e) { if (hs.size() == 1) { throw e; } - final String errorMsg = String.format(node_s + ": " + e.getMessage()); + final String errorMsg = node_s + ": " + e.getMessage(); stderr.println(errorMsg); errorOccurred = true; continue; diff --git a/cli/src/main/java/hudson/cli/Connection.java b/core/src/main/java/hudson/cli/Connection.java similarity index 94% rename from cli/src/main/java/hudson/cli/Connection.java rename to core/src/main/java/hudson/cli/Connection.java index 1961447778..bdeb192fd3 100644 --- a/cli/src/main/java/hudson/cli/Connection.java +++ b/core/src/main/java/hudson/cli/Connection.java @@ -23,6 +23,7 @@ */ package hudson.cli; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import hudson.remoting.ClassFilter; import hudson.remoting.ObjectInputStreamEx; import hudson.remoting.SocketChannelStream; @@ -113,6 +114,8 @@ public class Connection { /** * Receives an object sent by {@link #writeObject(Object)} */ + // TODO JENKINS-60562 remove this class + @SuppressFBWarnings(value = "OBJECT_DESERIALIZATION", justification = "Not used. We should just remove it. Class is deprecated.") public T readObject() throws IOException, ClassNotFoundException { ObjectInputStream ois = new ObjectInputStreamEx(in, getClass().getClassLoader(), ClassFilter.DEFAULT); @@ -194,16 +197,20 @@ public class Connection { */ public Connection encryptConnection(SecretKey sessionKey, String algorithm) throws IOException, GeneralSecurityException { Cipher cout = Cipher.getInstance(algorithm); - cout.init(Cipher.ENCRYPT_MODE, sessionKey, new IvParameterSpec(sessionKey.getEncoded())); + cout.init(Cipher.ENCRYPT_MODE, sessionKey, createIv(sessionKey)); CipherOutputStream o = new CipherOutputStream(out, cout); Cipher cin = Cipher.getInstance(algorithm); - cin.init(Cipher.DECRYPT_MODE, sessionKey, new IvParameterSpec(sessionKey.getEncoded())); + cin.init(Cipher.DECRYPT_MODE, sessionKey, createIv(sessionKey)); CipherInputStream i = new CipherInputStream(in, cin); return new Connection(i,o); } + private IvParameterSpec createIv(SecretKey sessionKey) { + return new IvParameterSpec(sessionKey.getEncoded()); + } + /** * Given a byte array that contains arbitrary number of bytes, digests or expands those bits into the specified * number of bytes without loss of entropy. diff --git a/core/src/main/java/hudson/cli/CopyJobCommand.java b/core/src/main/java/hudson/cli/CopyJobCommand.java index 3eb8049c1f..fd6b658f8f 100644 --- a/core/src/main/java/hudson/cli/CopyJobCommand.java +++ b/core/src/main/java/hudson/cli/CopyJobCommand.java @@ -50,7 +50,7 @@ public class CopyJobCommand extends CLICommand { public String dst; protected int run() throws Exception { - Jenkins jenkins = Jenkins.getActiveInstance(); + Jenkins jenkins = Jenkins.get(); if (jenkins.getItemByFullName(dst)!=null) { throw new IllegalStateException("Job '"+dst+"' already exists"); diff --git a/core/src/main/java/hudson/cli/CreateJobCommand.java b/core/src/main/java/hudson/cli/CreateJobCommand.java index 0f0108c361..10ea5798fd 100644 --- a/core/src/main/java/hudson/cli/CreateJobCommand.java +++ b/core/src/main/java/hudson/cli/CreateJobCommand.java @@ -45,7 +45,7 @@ public class CreateJobCommand extends CLICommand { public String name; protected int run() throws Exception { - Jenkins h = Jenkins.getActiveInstance(); + Jenkins h = Jenkins.get(); if (h.getItemByFullName(name)!=null) { throw new IllegalStateException("Job '"+name+"' already exists"); diff --git a/core/src/main/java/hudson/cli/CreateNodeCommand.java b/core/src/main/java/hudson/cli/CreateNodeCommand.java index edab3f7e71..36aa7242db 100644 --- a/core/src/main/java/hudson/cli/CreateNodeCommand.java +++ b/core/src/main/java/hudson/cli/CreateNodeCommand.java @@ -52,7 +52,7 @@ public class CreateNodeCommand extends CLICommand { @Override protected int run() throws Exception { - final Jenkins jenkins = Jenkins.getActiveInstance(); + final Jenkins jenkins = Jenkins.get(); jenkins.checkPermission(Computer.CREATE); final Node newNode = (Node) Jenkins.XSTREAM2.fromXML(stdin); @@ -63,11 +63,6 @@ public class CreateNodeCommand extends CLICommand { newNode.setNodeName(nodeName); } - if(newNode instanceof Slave) { //change userId too - User user = User.current(); - ((Slave) newNode).setUserId(user==null ? "anonymous" : user.getId()); - } - if (jenkins.getNode(newNode.getNodeName()) != null) { throw new IllegalStateException("Node '" + newNode.getNodeName() + "' already exists"); } diff --git a/core/src/main/java/hudson/cli/CreateViewCommand.java b/core/src/main/java/hudson/cli/CreateViewCommand.java index d22a0b424f..dea72441fa 100644 --- a/core/src/main/java/hudson/cli/CreateViewCommand.java +++ b/core/src/main/java/hudson/cli/CreateViewCommand.java @@ -49,7 +49,7 @@ public class CreateViewCommand extends CLICommand { @Override protected int run() throws Exception { - final Jenkins jenkins = Jenkins.getActiveInstance(); + final Jenkins jenkins = Jenkins.get(); jenkins.checkPermission(View.CREATE); View newView; diff --git a/core/src/main/java/hudson/cli/DeleteJobCommand.java b/core/src/main/java/hudson/cli/DeleteJobCommand.java index f6c4fe5c9e..d829340892 100644 --- a/core/src/main/java/hudson/cli/DeleteJobCommand.java +++ b/core/src/main/java/hudson/cli/DeleteJobCommand.java @@ -54,7 +54,7 @@ public class DeleteJobCommand extends CLICommand { protected int run() throws Exception { boolean errorOccurred = false; - final Jenkins jenkins = Jenkins.getActiveInstance(); + final Jenkins jenkins = Jenkins.get(); final HashSet hs = new HashSet<>(jobs); @@ -75,7 +75,7 @@ public class DeleteJobCommand extends CLICommand { throw e; } - final String errorMsg = String.format(job_s + ": " + e.getMessage()); + final String errorMsg = job_s + ": " + e.getMessage(); stderr.println(errorMsg); errorOccurred = true; continue; diff --git a/core/src/main/java/hudson/cli/DeleteNodeCommand.java b/core/src/main/java/hudson/cli/DeleteNodeCommand.java index ed1a178267..57aad43507 100644 --- a/core/src/main/java/hudson/cli/DeleteNodeCommand.java +++ b/core/src/main/java/hudson/cli/DeleteNodeCommand.java @@ -54,7 +54,7 @@ public class DeleteNodeCommand extends CLICommand { protected int run() throws Exception { boolean errorOccurred = false; - final Jenkins jenkins = Jenkins.getActiveInstance(); + final Jenkins jenkins = Jenkins.get(); final HashSet hs = new HashSet<>(nodes); @@ -74,7 +74,7 @@ public class DeleteNodeCommand extends CLICommand { throw e; } - final String errorMsg = String.format(node_s + ": " + e.getMessage()); + final String errorMsg = node_s + ": " + e.getMessage(); stderr.println(errorMsg); errorOccurred = true; continue; diff --git a/core/src/main/java/hudson/cli/DeleteViewCommand.java b/core/src/main/java/hudson/cli/DeleteViewCommand.java index b2ebffac80..9950ff3a26 100644 --- a/core/src/main/java/hudson/cli/DeleteViewCommand.java +++ b/core/src/main/java/hudson/cli/DeleteViewCommand.java @@ -86,7 +86,7 @@ public class DeleteViewCommand extends CLICommand { throw e; } - final String errorMsg = String.format(view_s + ": " + e.getMessage()); + final String errorMsg = view_s + ": " + e.getMessage(); stderr.println(errorMsg); errorOccurred = true; continue; diff --git a/core/src/main/java/hudson/cli/DisablePluginCommand.java b/core/src/main/java/hudson/cli/DisablePluginCommand.java index 101576e904..58dbbb3291 100644 --- a/core/src/main/java/hudson/cli/DisablePluginCommand.java +++ b/core/src/main/java/hudson/cli/DisablePluginCommand.java @@ -164,7 +164,7 @@ public class DisablePluginCommand extends CLICommand { /** * Restart if this particular result of the disablement of a plugin and its dependent plugins (depending on the - * strategy used) has a plugin disablexd. + * strategy used) has a plugin disabled. * @param oneResult the result of a plugin (and its dependents). * @return true if it end up in restarting jenkins. */ @@ -220,15 +220,15 @@ public class DisablePluginCommand extends CLICommand { break; case NO_SUCH_PLUGIN: returnCode = RETURN_CODE_NO_SUCH_PLUGIN; - } - - if (returnCode == 0) { - for (PluginWrapper.PluginDisableResult oneDependentResult : result.getDependentsDisableStatus()) { - returnCode = getResultCode(oneDependentResult); - if (returnCode != 0) { - break; + break; + default: + for (PluginWrapper.PluginDisableResult oneDependentResult : result.getDependentsDisableStatus()) { + returnCode = getResultCode(oneDependentResult); + if (returnCode != 0) { + break; + } } - } + break; } return returnCode; diff --git a/core/src/main/java/hudson/cli/DisconnectNodeCommand.java b/core/src/main/java/hudson/cli/DisconnectNodeCommand.java index 34da7d8cf6..6135c932bc 100644 --- a/core/src/main/java/hudson/cli/DisconnectNodeCommand.java +++ b/core/src/main/java/hudson/cli/DisconnectNodeCommand.java @@ -59,7 +59,7 @@ public class DisconnectNodeCommand extends CLICommand { @Override protected int run() throws Exception { boolean errorOccurred = false; - final Jenkins jenkins = Jenkins.getActiveInstance(); + final Jenkins jenkins = Jenkins.get(); final HashSet hs = new HashSet<>(nodes); @@ -87,7 +87,7 @@ public class DisconnectNodeCommand extends CLICommand { throw e; } - stderr.println(String.format(node_s + ": " + e.getMessage())); + stderr.println(node_s + ": " + e.getMessage()); errorOccurred = true; continue; } diff --git a/core/src/main/java/hudson/cli/GroovyCommand.java b/core/src/main/java/hudson/cli/GroovyCommand.java index f87ba80abc..9a802bc5a1 100644 --- a/core/src/main/java/hudson/cli/GroovyCommand.java +++ b/core/src/main/java/hudson/cli/GroovyCommand.java @@ -59,7 +59,7 @@ public class GroovyCommand extends CLICommand { protected int run() throws Exception { // this allows the caller to manipulate the JVM state, so require the execute script privilege. - Jenkins.getActiveInstance().checkPermission(Jenkins.RUN_SCRIPTS); + Jenkins.get().checkPermission(Jenkins.RUN_SCRIPTS); Binding binding = new Binding(); binding.setProperty("out",new PrintWriter(stdout,true)); @@ -67,7 +67,7 @@ public class GroovyCommand extends CLICommand { binding.setProperty("stdout",stdout); binding.setProperty("stderr",stderr); - GroovyShell groovy = new GroovyShell(Jenkins.getActiveInstance().getPluginManager().uberClassLoader, binding); + GroovyShell groovy = new GroovyShell(Jenkins.get().getPluginManager().uberClassLoader, binding); groovy.run(loadScript(),"RemoteClass",remaining.toArray(new String[0])); return 0; } diff --git a/core/src/main/java/hudson/cli/GroovyshCommand.java b/core/src/main/java/hudson/cli/GroovyshCommand.java index 1048bc53d7..dd2584ebf0 100644 --- a/core/src/main/java/hudson/cli/GroovyshCommand.java +++ b/core/src/main/java/hudson/cli/GroovyshCommand.java @@ -60,7 +60,7 @@ public class GroovyshCommand extends CLICommand { @Override protected int run() { // this allows the caller to manipulate the JVM state, so require the admin privilege. - Jenkins.getActiveInstance().checkPermission(Jenkins.RUN_SCRIPTS); + Jenkins.get().checkPermission(Jenkins.RUN_SCRIPTS); // this being remote means no jline capability is available System.setProperty("jline.terminal", UnsupportedTerminal.class.getName()); @@ -85,12 +85,12 @@ public class GroovyshCommand extends CLICommand { Binding binding = new Binding(); // redirect "println" to the CLI binding.setProperty("out", new PrintWriter(stdout,true)); - binding.setProperty("hudson", Jenkins.getActiveInstance()); // backward compatibility - binding.setProperty("jenkins", Jenkins.getActiveInstance()); + binding.setProperty("hudson", Jenkins.get()); // backward compatibility + binding.setProperty("jenkins", Jenkins.get()); IO io = new IO(new BufferedInputStream(stdin),stdout,stderr); - final ClassLoader cl = Jenkins.getActiveInstance().pluginManager.uberClassLoader; + final ClassLoader cl = Jenkins.get().pluginManager.uberClassLoader; Closure registrar = new Closure(null, null) { private static final long serialVersionUID = 1L; diff --git a/core/src/main/java/hudson/cli/HelpCommand.java b/core/src/main/java/hudson/cli/HelpCommand.java index 071bce6a7f..a4623f5b8f 100644 --- a/core/src/main/java/hudson/cli/HelpCommand.java +++ b/core/src/main/java/hudson/cli/HelpCommand.java @@ -51,7 +51,7 @@ public class HelpCommand extends CLICommand { @Override protected int run() throws Exception { - if (!Jenkins.getActiveInstance().hasPermission(Jenkins.READ)) { + if (!Jenkins.get().hasPermission(Jenkins.READ)) { throw new AccessDeniedException("You must authenticate to access this Jenkins.\n" + CLI.usage()); } diff --git a/core/src/main/java/hudson/cli/InstallPluginCommand.java b/core/src/main/java/hudson/cli/InstallPluginCommand.java index 5279a7fd3a..09cb54c95c 100644 --- a/core/src/main/java/hudson/cli/InstallPluginCommand.java +++ b/core/src/main/java/hudson/cli/InstallPluginCommand.java @@ -25,7 +25,6 @@ package hudson.cli; import hudson.AbortException; import hudson.Extension; -import hudson.FilePath; import hudson.PluginManager; import hudson.util.VersionNumber; import jenkins.model.Jenkins; @@ -38,10 +37,14 @@ import org.kohsuke.args4j.Option; import java.io.File; import java.net.URL; import java.net.MalformedURLException; +import java.nio.file.Files; +import java.nio.file.StandardCopyOption; import java.util.HashSet; import java.util.List; import java.util.ArrayList; import java.util.Set; +import java.util.jar.JarFile; +import java.util.jar.Manifest; import org.apache.commons.io.FileUtils; /** @@ -52,21 +55,24 @@ import org.apache.commons.io.FileUtils; */ @Extension public class InstallPluginCommand extends CLICommand { + + @Override public String getShortDescription() { return Messages.InstallPluginCommand_ShortDescription(); } @Argument(metaVar="SOURCE",required=true,usage= "If this is an URL, Jenkins downloads the URL and installs that as a plugin. " + - "If it is the string ‘=’, the file will be read from standard input of the command, and ‘-name’ must be specified. " + + "If it is the string ‘=’, the file will be read from standard input of the command. " + "Otherwise the name is assumed to be the short name of the plugin in the existing update center (like ‘findbugs’), " + "and the plugin will be installed from the update center. If the short name includes a minimum version number " + "(like ‘findbugs:1.4’), and there are multiple update centers publishing different versions, the update centers " + "will be searched in order for the first one publishing a version that is at least the specified version.") public List sources = new ArrayList<>(); - @Option(name="-name",usage="If specified, the plugin will be installed as this short name (whereas normally the name is inferred from the source name automatically).") - public String name; // TODO better to parse out Short-Name from the manifest and deprecate this option + @Deprecated + @Option(name = "-name", usage = "No longer used.") + public String name; @Option(name="-restart",usage="Restart Jenkins upon successful installation.") public boolean restart; @@ -74,23 +80,22 @@ public class InstallPluginCommand extends CLICommand { @Option(name="-deploy",usage="Deploy plugins right away without postponing them until the reboot.") public boolean dynamicLoad; + @Override protected int run() throws Exception { - Jenkins h = Jenkins.getActiveInstance(); + Jenkins h = Jenkins.get(); h.checkPermission(PluginManager.UPLOAD_PLUGINS); PluginManager pm = h.getPluginManager(); - if (sources.size() > 1 && name != null) { - throw new IllegalArgumentException("-name is incompatible with multiple sources"); + if (name != null) { + stderr.println("-name is deprecated; it is no longer necessary nor honored."); } for (String source : sources) { if (source.equals("=")) { - if (name == null) { - throw new IllegalArgumentException("-name required when using -source -"); - } stdout.println(Messages.InstallPluginCommand_InstallingPluginFromStdin()); - File f = getTargetFile(name); + File f = getTmpFile(); FileUtils.copyInputStreamToFile(stdin, f); + f = moveToFinalLocation(f); if (dynamicLoad) { pm.dynamicLoad(f); } @@ -101,21 +106,12 @@ public class InstallPluginCommand extends CLICommand { try { URL u = new URL(source); stdout.println(Messages.InstallPluginCommand_InstallingPluginFromUrl(u)); - 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); - } + File f = getTmpFile(); + FileUtils.copyURLToFile(u, f); // TODO JENKINS-58248 proxy + f = moveToFinalLocation(f); + if (dynamicLoad) { + pm.dynamicLoad(f); } - getTargetFilePath(n).copyFrom(u); - if (dynamicLoad) - pm.dynamicLoad(getTargetFile(n)); continue; } catch (MalformedURLException e) { // not an URL @@ -172,11 +168,24 @@ public class InstallPluginCommand extends CLICommand { return 0; // all success } - private static FilePath getTargetFilePath(String name) { - return new FilePath(getTargetFile(name)); + private static File getTmpFile() throws Exception { + return File.createTempFile("download", ".jpi.tmp", Jenkins.get().getPluginManager().rootDir); } - private static File getTargetFile(String name) { - return new File(Jenkins.getActiveInstance().getPluginManager().rootDir,name+".jpi"); + private static File moveToFinalLocation(File tmpFile) throws Exception { + String pluginName; + try (JarFile jf = new JarFile(tmpFile)) { + Manifest mf = jf.getManifest(); + if (mf == null) { + throw new IllegalArgumentException("JAR lacks a manifest"); + } + pluginName = mf.getMainAttributes().getValue("Short-Name"); + } + if (pluginName == null) { + throw new IllegalArgumentException("JAR manifest lacks a Short-Name attribute and so does not look like a plugin"); + } + File target = new File(Jenkins.get().getPluginManager().rootDir, pluginName + ".jpi"); + Files.move(tmpFile.toPath(), target.toPath(), StandardCopyOption.REPLACE_EXISTING, StandardCopyOption.ATOMIC_MOVE); + return target; } } diff --git a/core/src/main/java/hudson/cli/ListJobsCommand.java b/core/src/main/java/hudson/cli/ListJobsCommand.java index 8dae08e674..dd7a1daf8f 100644 --- a/core/src/main/java/hudson/cli/ListJobsCommand.java +++ b/core/src/main/java/hudson/cli/ListJobsCommand.java @@ -49,7 +49,7 @@ public class ListJobsCommand extends CLICommand { public String name; protected int run() throws Exception { - Jenkins h = Jenkins.getActiveInstance(); + Jenkins h = Jenkins.get(); final Collection jobs; // If name is given retrieve jobs for the given view. diff --git a/core/src/main/java/hudson/cli/ListPluginsCommand.java b/core/src/main/java/hudson/cli/ListPluginsCommand.java index faa35dfa67..f637bf7a84 100644 --- a/core/src/main/java/hudson/cli/ListPluginsCommand.java +++ b/core/src/main/java/hudson/cli/ListPluginsCommand.java @@ -47,7 +47,7 @@ public class ListPluginsCommand extends CLICommand { public String name; protected int run() { - Jenkins h = Jenkins.getInstance(); + Jenkins h = Jenkins.get(); h.checkPermission(Jenkins.ADMINISTER); PluginManager pluginManager = h.getPluginManager(); diff --git a/core/src/main/java/hudson/cli/OnlineNodeCommand.java b/core/src/main/java/hudson/cli/OnlineNodeCommand.java index b3ec4fc0c9..e4a56ef8ed 100644 --- a/core/src/main/java/hudson/cli/OnlineNodeCommand.java +++ b/core/src/main/java/hudson/cli/OnlineNodeCommand.java @@ -27,9 +27,6 @@ package hudson.cli; import hudson.AbortException; import hudson.Extension; import hudson.model.Computer; -import hudson.model.ComputerSet; -import hudson.util.EditDistance; -import jenkins.model.Jenkins; import org.kohsuke.args4j.Argument; @@ -55,24 +52,11 @@ public class OnlineNodeCommand extends CLICommand { @Override protected int run() throws Exception { boolean errorOccurred = false; - final Jenkins jenkins = Jenkins.getActiveInstance(); final HashSet hs = new HashSet<>(nodes); - List names = null; for (String node_s : hs) { - Computer computer; - try { - computer = jenkins.getComputer(node_s); - if (computer == null) { - if (names == null) { - names = ComputerSet.getComputerNames(); - } - String adv = EditDistance.findNearest(node_s, names); - throw new IllegalArgumentException(adv == null ? - hudson.model.Messages.Computer_NoSuchSlaveExistsWithoutAdvice(node_s) : - hudson.model.Messages.Computer_NoSuchSlaveExists(node_s, adv)); - } + Computer computer = Computer.resolveForCLI(node_s); computer.cliOnline(); } catch (Exception e) { if (hs.size() == 1) { diff --git a/core/src/main/java/hudson/cli/QuietDownCommand.java b/core/src/main/java/hudson/cli/QuietDownCommand.java index 4d84055c8d..740ee10864 100644 --- a/core/src/main/java/hudson/cli/QuietDownCommand.java +++ b/core/src/main/java/hudson/cli/QuietDownCommand.java @@ -54,7 +54,7 @@ public class QuietDownCommand extends CLICommand { @Override protected int run() throws Exception { - Jenkins.getActiveInstance().doQuietDown(block, timeout); + Jenkins.get().doQuietDown(block, timeout); return 0; } } diff --git a/core/src/main/java/hudson/cli/ReloadJobCommand.java b/core/src/main/java/hudson/cli/ReloadJobCommand.java index f807476934..e8c51f9583 100644 --- a/core/src/main/java/hudson/cli/ReloadJobCommand.java +++ b/core/src/main/java/hudson/cli/ReloadJobCommand.java @@ -60,7 +60,7 @@ public class ReloadJobCommand extends CLICommand { protected int run() throws Exception { boolean errorOccurred = false; - final Jenkins jenkins = Jenkins.getActiveInstance(); + final Jenkins jenkins = Jenkins.get(); final HashSet hs = new HashSet<>(jobs); @@ -90,7 +90,7 @@ public class ReloadJobCommand extends CLICommand { throw e; } - final String errorMsg = String.format(job_s + ": " + e.getMessage()); + final String errorMsg = job_s + ": " + e.getMessage(); stderr.println(errorMsg); errorOccurred = true; continue; diff --git a/core/src/main/java/hudson/cli/SetBuildDescriptionCommand.java b/core/src/main/java/hudson/cli/SetBuildDescriptionCommand.java index 3322929125..a689a6e2e5 100644 --- a/core/src/main/java/hudson/cli/SetBuildDescriptionCommand.java +++ b/core/src/main/java/hudson/cli/SetBuildDescriptionCommand.java @@ -1,5 +1,6 @@ package hudson.cli; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import hudson.Extension; import hudson.model.Job; import hudson.model.Run; @@ -9,6 +10,9 @@ import java.io.Serializable; import org.apache.commons.io.IOUtils; import org.kohsuke.args4j.Argument; + +// TODO: Remove Serializable +@SuppressFBWarnings(value = "SE_NO_SERIALVERSIONID", justification = "The Serializable should be removed.") @Extension public class SetBuildDescriptionCommand extends CLICommand implements Serializable { diff --git a/core/src/main/java/hudson/cli/handlers/ViewOptionHandler.java b/core/src/main/java/hudson/cli/handlers/ViewOptionHandler.java index 6107855812..2c901b06b4 100644 --- a/core/src/main/java/hudson/cli/handlers/ViewOptionHandler.java +++ b/core/src/main/java/hudson/cli/handlers/ViewOptionHandler.java @@ -94,7 +94,7 @@ public class ViewOptionHandler extends OptionHandler { @CheckForNull public View getView(final String name) { - ViewGroup group = Jenkins.getActiveInstance(); + ViewGroup group = Jenkins.get(); View view = null; final StringTokenizer tok = new StringTokenizer(name, "/"); diff --git a/core/src/main/java/hudson/console/AnnotatedLargeText.java b/core/src/main/java/hudson/console/AnnotatedLargeText.java index f29430b1b2..36d2664e92 100644 --- a/core/src/main/java/hudson/console/AnnotatedLargeText.java +++ b/core/src/main/java/hudson/console/AnnotatedLargeText.java @@ -25,6 +25,7 @@ */ package hudson.console; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import jenkins.model.Jenkins; import hudson.remoting.ObjectInputStreamEx; import java.util.concurrent.TimeUnit; @@ -124,11 +125,11 @@ public class AnnotatedLargeText extends LargeText { try (ObjectInputStream ois = new ObjectInputStreamEx(new GZIPInputStream( new CipherInputStream(new ByteArrayInputStream(Base64.getDecoder().decode(base64.getBytes(StandardCharsets.UTF_8))), sym)), - Jenkins.getInstance().pluginManager.uberClassLoader)) { + Jenkins.get().pluginManager.uberClassLoader)) { long timestamp = ois.readLong(); if (TimeUnit.HOURS.toMillis(1) > abs(System.currentTimeMillis()-timestamp)) // don't deserialize something too old to prevent a replay attack - return (ConsoleAnnotator) ois.readObject(); + return getConsoleAnnotator(ois); } catch (RuntimeException ex) { throw new IOException("Could not decode input", ex); } @@ -140,6 +141,11 @@ public class AnnotatedLargeText extends LargeText { return ConsoleAnnotator.initial(context); } + @SuppressFBWarnings(value = "OBJECT_DESERIALIZATION", justification = "Deserialization is protected by logic.") + private ConsoleAnnotator getConsoleAnnotator(ObjectInputStream ois) throws IOException, ClassNotFoundException { + return (ConsoleAnnotator) ois.readObject(); + } + @CheckReturnValue @Override public long writeLogTo(long start, Writer w) throws IOException { diff --git a/core/src/main/java/hudson/console/ConsoleAnnotationDescriptor.java b/core/src/main/java/hudson/console/ConsoleAnnotationDescriptor.java index 4a74ae8a9e..2126cdc283 100644 --- a/core/src/main/java/hudson/console/ConsoleAnnotationDescriptor.java +++ b/core/src/main/java/hudson/console/ConsoleAnnotationDescriptor.java @@ -92,6 +92,6 @@ public abstract class ConsoleAnnotationDescriptor extends Descriptor,ConsoleAnnotationDescriptor> all() { - return (DescriptorExtensionList) Jenkins.getInstance().getDescriptorList(ConsoleNote.class); + return (DescriptorExtensionList) Jenkins.get().getDescriptorList(ConsoleNote.class); } } diff --git a/core/src/main/java/hudson/console/ConsoleLogFilter.java b/core/src/main/java/hudson/console/ConsoleLogFilter.java index 99fe50eca3..24b2c73c10 100644 --- a/core/src/main/java/hudson/console/ConsoleLogFilter.java +++ b/core/src/main/java/hudson/console/ConsoleLogFilter.java @@ -60,6 +60,7 @@ public abstract class ConsoleLogFilter implements ExtensionPoint { * * @deprecated as of 1.632. Use {@link #decorateLogger(Run, OutputStream)} */ + @Deprecated public OutputStream decorateLogger(AbstractBuild build, OutputStream logger) throws IOException, InterruptedException { if (Util.isOverridden(ConsoleLogFilter.class, getClass(), "decorateLogger", Run.class, OutputStream.class)) { // old client calling newer implementation. forward the call. diff --git a/core/src/main/java/hudson/console/ConsoleNote.java b/core/src/main/java/hudson/console/ConsoleNote.java index 2b646cab4b..e55f7c2629 100644 --- a/core/src/main/java/hudson/console/ConsoleNote.java +++ b/core/src/main/java/hudson/console/ConsoleNote.java @@ -23,6 +23,7 @@ */ package hudson.console; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import hudson.ExtensionPoint; import hudson.Functions; import hudson.MarkupText; @@ -165,7 +166,7 @@ public abstract class ConsoleNote implements Serializable, Describable implements Serializable, Describable implements Serializable, Describablehttp://stacktrace.jenkins-ci.org/ service, which is dead now (JENKINS-42861). + * {@code http://stacktrace.jenkins-ci.org/} service, which is dead now (JENKINS-42861). * This console note does nothing right now. */ @Deprecated diff --git a/core/src/main/java/hudson/console/HyperlinkNote.java b/core/src/main/java/hudson/console/HyperlinkNote.java index 3f8ccfda1d..8d0e13d70b 100644 --- a/core/src/main/java/hudson/console/HyperlinkNote.java +++ b/core/src/main/java/hudson/console/HyperlinkNote.java @@ -66,7 +66,7 @@ public class HyperlinkNote extends ConsoleNote { url = req.getContextPath()+url; } else { // otherwise presumably this is rendered for e-mails and other non-HTTP stuff - url = Jenkins.getInstance().getRootUrl()+url.substring(1); + url = Jenkins.get().getRootUrl()+url.substring(1); } } text.addMarkup(charPos, charPos + length, "", ""); diff --git a/core/src/main/java/hudson/console/ModelHyperlinkNote.java b/core/src/main/java/hudson/console/ModelHyperlinkNote.java index 127911cc76..c389dfa383 100644 --- a/core/src/main/java/hudson/console/ModelHyperlinkNote.java +++ b/core/src/main/java/hudson/console/ModelHyperlinkNote.java @@ -50,7 +50,7 @@ public class ModelHyperlinkNote extends HyperlinkNote { if (c != null) { return encodeTo("/" + c.getUrl(), node.getDisplayName()); } - String nodePath = node == Jenkins.getInstance() ? "(master)" : node.getNodeName(); + String nodePath = node == Jenkins.get() ? "(master)" : node.getNodeName(); return encodeTo("/computer/" + nodePath, node.getDisplayName()); } diff --git a/core/src/main/java/hudson/diagnosis/HudsonHomeDiskUsageChecker.java b/core/src/main/java/hudson/diagnosis/HudsonHomeDiskUsageChecker.java index 56eaf7d941..586a244b7a 100644 --- a/core/src/main/java/hudson/diagnosis/HudsonHomeDiskUsageChecker.java +++ b/core/src/main/java/hudson/diagnosis/HudsonHomeDiskUsageChecker.java @@ -43,8 +43,8 @@ public class HudsonHomeDiskUsageChecker extends PeriodicWork { } protected void doRun() { - long free = Jenkins.getInstance().getRootDir().getUsableSpace(); - long total = Jenkins.getInstance().getRootDir().getTotalSpace(); + long free = Jenkins.get().getRootDir().getUsableSpace(); + long total = Jenkins.get().getRootDir().getTotalSpace(); if(free<=0 || total<=0) { // information unavailable. pointless to try. LOGGER.info("JENKINS_HOME disk usage information isn't available. aborting to monitor"); diff --git a/core/src/main/java/hudson/diagnosis/MemoryUsageMonitor.java b/core/src/main/java/hudson/diagnosis/MemoryUsageMonitor.java index eba9991aff..eb0c10584a 100644 --- a/core/src/main/java/hudson/diagnosis/MemoryUsageMonitor.java +++ b/core/src/main/java/hudson/diagnosis/MemoryUsageMonitor.java @@ -39,6 +39,7 @@ import java.util.List; import java.util.ArrayList; import java.io.IOException; +import jenkins.model.Jenkins; import org.jenkinsci.Symbol; import org.kohsuke.stapler.QueryParameter; @@ -102,6 +103,7 @@ public final class MemoryUsageMonitor extends PeriodicWork { * Generates the memory usage statistics graph. */ public TrendChart doGraph(@QueryParameter String type) throws IOException { + Jenkins.get().checkPermission(Jenkins.ADMINISTER); return MultiStageTimeSeries.createTrendChart(TimeScale.parse(type),used,max); } } diff --git a/core/src/main/java/hudson/diagnosis/NullIdDescriptorMonitor.java b/core/src/main/java/hudson/diagnosis/NullIdDescriptorMonitor.java index 27a5685f1d..5663a32d96 100644 --- a/core/src/main/java/hudson/diagnosis/NullIdDescriptorMonitor.java +++ b/core/src/main/java/hudson/diagnosis/NullIdDescriptorMonitor.java @@ -68,7 +68,7 @@ public class NullIdDescriptorMonitor extends AdministrativeMonitor { @Initializer(after=EXTENSIONS_AUGMENTED) public void verify() { - Jenkins h = Jenkins.getInstance(); + Jenkins h = Jenkins.get(); for (Descriptor d : h.getExtensionList(Descriptor.class)) { PluginWrapper p = h.getPluginManager().whichPlugin(d.getClass()); String id; diff --git a/core/src/main/java/hudson/diagnosis/OldDataMonitor.java b/core/src/main/java/hudson/diagnosis/OldDataMonitor.java index c4317b4816..856cbb0cec 100644 --- a/core/src/main/java/hudson/diagnosis/OldDataMonitor.java +++ b/core/src/main/java/hudson/diagnosis/OldDataMonitor.java @@ -38,6 +38,7 @@ import hudson.model.listeners.ItemListener; import hudson.model.listeners.RunListener; import hudson.model.listeners.SaveableListener; import hudson.security.ACL; +import hudson.security.ACLContext; import hudson.util.RobustReflectionConverter; import hudson.util.VersionNumber; import java.io.IOException; @@ -56,8 +57,6 @@ import javax.annotation.CheckForNull; import javax.annotation.Nonnull; import jenkins.model.Jenkins; -import org.acegisecurity.context.SecurityContext; -import org.acegisecurity.context.SecurityContextHolder; import org.jenkinsci.Symbol; import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.restrictions.NoExternalUse; @@ -117,18 +116,15 @@ public class OldDataMonitor extends AdministrativeMonitor { } private static void remove(Saveable obj, boolean isDelete) { - Jenkins j = Jenkins.getInstance(); + Jenkins j = Jenkins.get(); OldDataMonitor odm = get(j); - SecurityContext oldContext = ACL.impersonate(ACL.SYSTEM); - try { + try (ACLContext ctx = ACL.as(ACL.SYSTEM)) { odm.data.remove(referTo(obj)); if (isDelete && obj instanceof Job) { for (Run r : ((Job) obj).getBuilds()) { odm.data.remove(referTo(r)); } } - } finally { - SecurityContextHolder.setContext(oldContext); } } @@ -166,7 +162,7 @@ public class OldDataMonitor extends AdministrativeMonitor { * @param version Hudson release when the data structure changed. */ public static void report(Saveable obj, String version) { - OldDataMonitor odm = get(Jenkins.getInstance()); + OldDataMonitor odm = get(Jenkins.get()); try { SaveableReference ref = referTo(obj); while (true) { @@ -294,7 +290,7 @@ public class OldDataMonitor extends AdministrativeMonitor { */ @Restricted(NoExternalUse.class) public Iterator getVersionList() { - TreeSet set = new TreeSet(); + TreeSet set = new TreeSet<>(); for (VersionRange vr : data.values()) { if (vr.max != null) { set.add(vr.max); @@ -364,7 +360,7 @@ public class OldDataMonitor extends AdministrativeMonitor { * does occur: just means the user will be prompted to discard less than they should have been (and * would see the warning again after next restart). */ - List removed = new ArrayList(); + List removed = new ArrayList<>(); for (Map.Entry entry : data.entrySet()) { if (matchingPredicate.apply(entry)) { Saveable s = entry.getKey().get(); @@ -395,7 +391,7 @@ public class OldDataMonitor extends AdministrativeMonitor { private static SaveableReference referTo(Saveable s) { if (s instanceof Run) { Job parent = ((Run) s).getParent(); - if (Jenkins.getInstance().getItemByFullName(parent.getFullName()) == parent) { + if (Jenkins.get().getItemByFullName(parent.getFullName()) == parent) { return new RunSaveableReference((Run) s); } } diff --git a/core/src/main/java/hudson/diagnosis/ReverseProxySetupMonitor.java b/core/src/main/java/hudson/diagnosis/ReverseProxySetupMonitor.java index 858f79ddaa..70c4c211bd 100644 --- a/core/src/main/java/hudson/diagnosis/ReverseProxySetupMonitor.java +++ b/core/src/main/java/hudson/diagnosis/ReverseProxySetupMonitor.java @@ -64,7 +64,7 @@ public class ReverseProxySetupMonitor extends AdministrativeMonitor { public HttpResponse doTest() { String referer = Stapler.getCurrentRequest().getReferer(); - Jenkins j = Jenkins.getInstance(); + Jenkins j = Jenkins.get(); // May need to send an absolute URL, since handling of HttpRedirect with a relative URL does not currently honor X-Forwarded-Proto/Port at all. String redirect = j.getRootUrl() + "administrativeMonitor/" + id + "/testForReverseProxySetup/" + (referer != null ? Util.rawEncode(referer) : "NO-REFERER") + "/"; LOGGER.log(Level.FINE, "coming from {0} and redirecting to {1}", new Object[] {referer, redirect}); @@ -73,7 +73,7 @@ public class ReverseProxySetupMonitor extends AdministrativeMonitor { @StaplerDispatchable public void getTestForReverseProxySetup(String rest) { - Jenkins j = Jenkins.getInstance(); + Jenkins j = Jenkins.get(); String inferred = j.getRootUrlFromRequest() + "manage"; // TODO this could also verify that j.getRootUrl() has been properly configured, and send a different message if not if (rest.startsWith(inferred)) { // not using equals due to JENKINS-24014 diff --git a/core/src/main/java/hudson/diagnosis/TooManyJobsButNoView.java b/core/src/main/java/hudson/diagnosis/TooManyJobsButNoView.java index 7f5c02c0e3..56c9885415 100644 --- a/core/src/main/java/hudson/diagnosis/TooManyJobsButNoView.java +++ b/core/src/main/java/hudson/diagnosis/TooManyJobsButNoView.java @@ -50,7 +50,7 @@ public class TooManyJobsButNoView extends AdministrativeMonitor { } public boolean isActivated() { - Jenkins h = Jenkins.getInstance(); + Jenkins h = Jenkins.get(); return h.getViews().size()==1 && h.getItemMap().size()> THRESHOLD; } diff --git a/core/src/main/java/hudson/fsp/WorkspaceSnapshotSCM.java b/core/src/main/java/hudson/fsp/WorkspaceSnapshotSCM.java index 956f4c9464..e8c19e62a8 100644 --- a/core/src/main/java/hudson/fsp/WorkspaceSnapshotSCM.java +++ b/core/src/main/java/hudson/fsp/WorkspaceSnapshotSCM.java @@ -94,7 +94,7 @@ public class WorkspaceSnapshotSCM extends SCM { * @return never null. */ public Snapshot resolve() throws ResolvedFailedException { - Jenkins h = Jenkins.getInstance(); + Jenkins h = Jenkins.get(); AbstractProject job = h.getItemByFullName(jobName, AbstractProject.class); if(job==null) { if(h.getItemByFullName(jobName)==null) { diff --git a/core/src/main/java/hudson/init/InitMilestone.java b/core/src/main/java/hudson/init/InitMilestone.java index b6bd3a528f..02fa2b6c23 100644 --- a/core/src/main/java/hudson/init/InitMilestone.java +++ b/core/src/main/java/hudson/init/InitMilestone.java @@ -43,7 +43,10 @@ import org.jvnet.hudson.reactor.TaskGraphBuilder; *

  • PLUGINS_PREPARED *
  • PLUGINS_STARTED *
  • EXTENSIONS_AUGMENTED + *
  • SYSTEM_CONFIG_LOADED
  • + *
  • SYSTEM_CONFIG_ADAPTED
  • *
  • JOB_LOADED + *
  • JOB_CONFIG_ADAPTED
  • *
  • COMPLETED * * @@ -82,13 +85,32 @@ public enum InitMilestone implements Milestone { * By this milestone, all programmatically constructed extension point implementations * should be added. */ - EXTENSIONS_AUGMENTED("Augmented all extensions"), // TODO nothing attains() this so when does it actually happen? + EXTENSIONS_AUGMENTED("Augmented all extensions"), + + /** + * By this milestone, all the system configurations are loaded from file system + * @since TODO + */ + SYSTEM_CONFIG_LOADED("System config loaded"), + + /** + * By this milestone, the system configuration is adapted just in case any plugin (CasC might be an example) needs + * to update configuration files + * @since TODO + */ + SYSTEM_CONFIG_ADAPTED("System config adapted"), /** * By this milestone, all jobs and their build records are loaded from disk. */ JOB_LOADED("Loaded all jobs"), + /** + * By this milestone, any job configuration is adapted or updated just in case any plugin needs to update former/old configurations or init scripts + * @since TODO + */ + JOB_CONFIG_ADAPTED("Configuration for all jobs updated"), + /** * The very last milestone * diff --git a/core/src/main/java/hudson/init/InitStrategy.java b/core/src/main/java/hudson/init/InitStrategy.java index c6c5795e54..d4ba7d85b9 100644 --- a/core/src/main/java/hudson/init/InitStrategy.java +++ b/core/src/main/java/hudson/init/InitStrategy.java @@ -72,7 +72,7 @@ public class InitStrategy { /** * Lists up additional bundled plugins from the system property {@code hudson.bundled.plugins}. * Since 1.480 glob syntax is supported. - * For use in the "mvn hudson-dev:run". + * For use in {@code mvn jetty:run}. * TODO: maven-hpi-plugin should inject its own InitStrategy instead of having this in the core. */ protected void getBundledPluginsFromProperty(final List r) { diff --git a/core/src/main/java/hudson/init/Initializer.java b/core/src/main/java/hudson/init/Initializer.java index d24a412ae8..402a2c3dfb 100644 --- a/core/src/main/java/hudson/init/Initializer.java +++ b/core/src/main/java/hudson/init/Initializer.java @@ -65,7 +65,7 @@ public @interface Initializer { * *

    * This has the identical purpose as {@link #requires()}, but it's separated to allow better type-safety - * when using {@link InitMilestone} as a requirement (since enum member definitions need to be constant.) + * when using {@link InitMilestone} as a requirement (since enum member definitions need to be constant). */ InitMilestone after() default STARTED; diff --git a/core/src/main/java/hudson/init/TaskMethodFinder.java b/core/src/main/java/hudson/init/TaskMethodFinder.java index bbd60a61bf..b8370294c8 100644 --- a/core/src/main/java/hudson/init/TaskMethodFinder.java +++ b/core/src/main/java/hudson/init/TaskMethodFinder.java @@ -115,7 +115,7 @@ abstract class TaskMethodFinder extends TaskBuilder { * Determines the parameter injection of the initialization method. */ private Object lookUp(Class type) { - Jenkins j = Jenkins.getInstance(); + Jenkins j = Jenkins.get(); assert j != null : "This method is only invoked after the Jenkins singleton instance has been set"; if (type==Jenkins.class || type==Hudson.class) return j; diff --git a/core/src/main/java/hudson/init/impl/InitialUserContent.java b/core/src/main/java/hudson/init/impl/InitialUserContent.java index 0407dd8bb6..8124c3b2f1 100644 --- a/core/src/main/java/hudson/init/impl/InitialUserContent.java +++ b/core/src/main/java/hudson/init/impl/InitialUserContent.java @@ -23,7 +23,7 @@ */ package hudson.init.impl; -import static hudson.init.InitMilestone.JOB_LOADED; +import static hudson.init.InitMilestone.JOB_CONFIG_ADAPTED; import hudson.init.Initializer; import jenkins.model.Jenkins; import hudson.model.Messages; @@ -37,7 +37,7 @@ import java.io.IOException; * @author Kohsuke Kawaguchi */ public class InitialUserContent { - @Initializer(after=JOB_LOADED) + @Initializer(after=JOB_CONFIG_ADAPTED) public static void init(Jenkins h) throws IOException { File userContentDir = new File(h.getRootDir(), "userContent"); if(!userContentDir.exists()) { diff --git a/core/src/main/java/hudson/init/impl/InstallUncaughtExceptionHandler.java b/core/src/main/java/hudson/init/impl/InstallUncaughtExceptionHandler.java index 454af18cb3..a8b73db22e 100644 --- a/core/src/main/java/hudson/init/impl/InstallUncaughtExceptionHandler.java +++ b/core/src/main/java/hudson/init/impl/InstallUncaughtExceptionHandler.java @@ -1,18 +1,18 @@ package hudson.init.impl; import hudson.init.Initializer; -import java.io.EOFException; import jenkins.model.Jenkins; +import jenkins.telemetry.impl.java11.MissingClassTelemetry; +import org.kohsuke.stapler.Stapler; import org.kohsuke.stapler.WebApp; import org.kohsuke.stapler.compression.CompressionFilter; import javax.servlet.ServletException; +import java.io.EOFException; import java.io.IOException; import java.util.logging.Level; import java.util.logging.Logger; -import org.kohsuke.stapler.Stapler; - /** * Deals with exceptions that get thrown all the way up to the Stapler rendering layer. */ @@ -29,6 +29,10 @@ public class InstallUncaughtExceptionHandler { } req.setAttribute("javax.servlet.error.exception",e); try { + // If we have an exception, let's see if it's related with missing classes on Java 11. We reach + // here with a ClassNotFoundException in an action, for example. Setting the report here is the only + // way to catch the missing classes when the plugin uses Thread.currentThread().getContextClassLoader().loadClass + MissingClassTelemetry.reportExceptionInside(e); WebApp.get(j.servletContext).getSomeStapler().invoke(req, rsp, j, "/oops"); } catch (ServletException | IOException x) { if (!Stapler.isSocketException(x)) { @@ -42,10 +46,10 @@ public class InstallUncaughtExceptionHandler { } catch (SecurityException ex) { LOGGER.log(Level.SEVERE, - "Failed to set the default UncaughtExceptionHandler. " + + "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 recommended that you consult the documentation that comes with you servlet container on how to allow the " + + "The lack of this diagnostic information will make it harder to track down issues which will reduce the supportability of Jenkins. " + + "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); } } @@ -70,10 +74,14 @@ public class InstallUncaughtExceptionHandler { "A thread (" + t.getName() + '/' + t.getId() + ") died unexpectedly due to an uncaught exception, this may leave your Jenkins in a bad way and is usually indicative of a bug in the code.", ex); + + // If we have an exception, let's see if it's related with missing classes on Java 11. We reach + // here with a ClassNotFoundException in an action, for example. Setting the report here is the only + // way to catch the missing classes when the plugin uses Thread.currentThread().getContextClassLoader().loadClass + MissingClassTelemetry.reportExceptionInside(ex); } } private InstallUncaughtExceptionHandler() {} - } diff --git a/core/src/main/java/hudson/lifecycle/ExitLifecycle.java b/core/src/main/java/hudson/lifecycle/ExitLifecycle.java index 4d15a575a3..84fa17f91a 100644 --- a/core/src/main/java/hudson/lifecycle/ExitLifecycle.java +++ b/core/src/main/java/hudson/lifecycle/ExitLifecycle.java @@ -23,6 +23,7 @@ */ package hudson.lifecycle; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import hudson.Extension; import org.kohsuke.accmod.Restricted; @@ -59,6 +60,7 @@ public class ExitLifecycle extends Lifecycle { } @Override + @SuppressFBWarnings(value = "DM_EXIT", justification = "Exit is really intended.") public void restart() { Jenkins jenkins = Jenkins.getInstanceOrNull(); // guard against repeated concurrent calls to restart diff --git a/core/src/main/java/hudson/lifecycle/Lifecycle.java b/core/src/main/java/hudson/lifecycle/Lifecycle.java index 4c52cdd878..8df00fb23b 100644 --- a/core/src/main/java/hudson/lifecycle/Lifecycle.java +++ b/core/src/main/java/hudson/lifecycle/Lifecycle.java @@ -61,7 +61,7 @@ public abstract class Lifecycle implements ExtensionPoint { String p = SystemProperties.getString("hudson.lifecycle"); if(p!=null) { try { - ClassLoader cl = Jenkins.getInstance().getPluginManager().uberClassLoader; + ClassLoader cl = Jenkins.get().getPluginManager().uberClassLoader; instance = (Lifecycle)cl.loadClass(p).newInstance(); } catch (InstantiationException e) { InstantiationError x = new InstantiationError(e.getMessage()); diff --git a/core/src/main/java/hudson/lifecycle/SolarisSMFLifecycle.java b/core/src/main/java/hudson/lifecycle/SolarisSMFLifecycle.java index 54e3d6c743..7556005107 100644 --- a/core/src/main/java/hudson/lifecycle/SolarisSMFLifecycle.java +++ b/core/src/main/java/hudson/lifecycle/SolarisSMFLifecycle.java @@ -23,6 +23,7 @@ */ package hudson.lifecycle; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import jenkins.model.Jenkins; import java.io.IOException; @@ -39,6 +40,7 @@ public class SolarisSMFLifecycle extends Lifecycle { * In SMF managed environment, just commit a suicide and the service will be restarted by SMF. */ @Override + @SuppressFBWarnings(value = "DM_EXIT", justification = "Exit is really intended.") public void restart() throws IOException, InterruptedException { Jenkins jenkins = Jenkins.getInstanceOrNull(); // guard against repeated concurrent calls to restart try { diff --git a/core/src/main/java/hudson/lifecycle/WindowsInstallerLink.java b/core/src/main/java/hudson/lifecycle/WindowsInstallerLink.java index 9aea39647c..a8f412539a 100644 --- a/core/src/main/java/hudson/lifecycle/WindowsInstallerLink.java +++ b/core/src/main/java/hudson/lifecycle/WindowsInstallerLink.java @@ -24,6 +24,7 @@ package hudson.lifecycle; import com.sun.jna.Native; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import hudson.Functions; import hudson.Launcher.LocalLauncher; import hudson.model.ManagementLink; @@ -111,7 +112,7 @@ public class WindowsInstallerLink extends ManagementLink { */ @RequirePOST public void doDoInstall(StaplerRequest req, StaplerResponse rsp, @QueryParameter("dir") String _dir) throws IOException, ServletException { - Jenkins.getInstance().checkPermission(Jenkins.ADMINISTER); + Jenkins.get().checkPermission(Jenkins.ADMINISTER); if(installationDir!=null) { // installation already complete @@ -173,7 +174,7 @@ public class WindowsInstallerLink extends ManagementLink { @RequirePOST public void doRestart(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException { - Jenkins.getInstance().checkPermission(Jenkins.ADMINISTER); + Jenkins.get().checkPermission(Jenkins.ADMINISTER); if(installationDir==null) { // if the user reloads the page after Hudson has restarted, @@ -184,10 +185,11 @@ public class WindowsInstallerLink extends ManagementLink { } rsp.forward(this,"_restart",req); - final File oldRoot = Jenkins.getInstance().getRootDir(); + final File oldRoot = Jenkins.get().getRootDir(); // initiate an orderly shutdown after we finished serving this request new Thread("terminator") { + @SuppressFBWarnings(value = "DM_EXIT", justification = "Exit is really intended.") public void run() { try { Thread.sleep(1000); @@ -228,7 +230,7 @@ public class WindowsInstallerLink extends ManagementLink { } }); - Jenkins.getInstance().cleanUp(); + Jenkins.get().cleanUp(); System.exit(0); } catch (InterruptedException e) { e.printStackTrace(); @@ -247,7 +249,7 @@ public class WindowsInstallerLink extends ManagementLink { protected final void sendError(String message, StaplerRequest req, StaplerResponse rsp) throws ServletException, IOException { req.setAttribute("message",message); req.setAttribute("pre",true); - rsp.forward(Jenkins.getInstance(),"error",req); + rsp.forward(Jenkins.get(),"error",req); } /** @@ -269,7 +271,7 @@ public class WindowsInstallerLink extends ManagementLink { // TODO possibly now unused (JNLP installation mode is long gone): if(SystemProperties.getString(WindowsInstallerLink.class.getName()+".prominent")!=null) - Jenkins.getInstance().getActions().add(link); + Jenkins.get().getActions().add(link); return link; } diff --git a/core/src/main/java/hudson/lifecycle/WindowsServiceLifecycle.java b/core/src/main/java/hudson/lifecycle/WindowsServiceLifecycle.java index 378caf460b..92c155fbeb 100644 --- a/core/src/main/java/hudson/lifecycle/WindowsServiceLifecycle.java +++ b/core/src/main/java/hudson/lifecycle/WindowsServiceLifecycle.java @@ -153,7 +153,7 @@ public class WindowsServiceLifecycle extends Lifecycle { baseDir = new File(baseEnv); } else { LOGGER.log(Level.WARNING, "Could not find environment variable 'BASE' for Jenkins base directory. Falling back to JENKINS_HOME"); - baseDir = Jenkins.getInstance().getRootDir(); + baseDir = Jenkins.get().getRootDir(); } return baseDir; } diff --git a/core/src/main/java/hudson/logging/LogRecorder.java b/core/src/main/java/hudson/logging/LogRecorder.java index 85de032387..c6ec3e1b41 100644 --- a/core/src/main/java/hudson/logging/LogRecorder.java +++ b/core/src/main/java/hudson/logging/LogRecorder.java @@ -50,6 +50,7 @@ import org.kohsuke.stapler.interceptor.RequirePOST; import javax.servlet.ServletException; import java.io.File; import java.io.IOException; +import java.io.Serializable; import java.text.Collator; import java.util.*; import java.util.logging.Level; @@ -58,6 +59,7 @@ import java.util.logging.LogRecord; import java.util.logging.Logger; import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.restrictions.NoExternalUse; +import org.kohsuke.stapler.verb.POST; /** * Records a selected set of logs so that the system administrator @@ -251,7 +253,9 @@ public class LogRecorder extends AbstractModelObject implements Saveable { } - private static class TargetComparator implements Comparator { + private static class TargetComparator implements Comparator, Serializable { + + private static final long serialVersionUID = 9285340752515798L; @Override public int compare(Target left, Target right) { @@ -261,7 +265,7 @@ public class LogRecorder extends AbstractModelObject implements Saveable { private static final class SetLevel extends MasterToSlaveCallable { /** known loggers (kept per agent), to avoid GC */ - @SuppressWarnings("MismatchedQueryAndUpdateOfCollection") private static final Set loggers = new HashSet(); + @SuppressWarnings("MismatchedQueryAndUpdateOfCollection") private static final Set loggers = new HashSet<>(); private final String name; private final Level level; SetLevel(String name, Level level) { @@ -275,7 +279,7 @@ public class LogRecorder extends AbstractModelObject implements Saveable { return null; } void broadcast() { - for (Computer c : Jenkins.getInstance().getComputers()) { + for (Computer c : Jenkins.get().getComputers()) { if (c.getName().length() > 0) { // i.e. not master VirtualChannel ch = c.getChannel(); if (ch != null) { @@ -292,7 +296,7 @@ public class LogRecorder extends AbstractModelObject implements Saveable { @Extension @Restricted(NoExternalUse.class) public static final class ComputerLogInitializer extends ComputerListener { @Override public void preOnline(Computer c, Channel channel, FilePath root, TaskListener listener) throws IOException, InterruptedException { - for (LogRecorder recorder : Jenkins.getInstance().getLog().logRecorders.values()) { + for (LogRecorder recorder : Jenkins.get().getLog().logRecorders.values()) { for (Target t : recorder.targets) { channel.call(new SetLevel(t.name, t.getLevel())); } @@ -320,13 +324,13 @@ public class LogRecorder extends AbstractModelObject implements Saveable { } public LogRecorderManager getParent() { - return Jenkins.getInstance().getLog(); + return Jenkins.get().getLog(); } /** * Accepts submission from the configuration page. */ - @RequirePOST + @POST public synchronized void doConfigSubmit( StaplerRequest req, StaplerResponse rsp ) throws IOException, ServletException { JSONObject src = req.getSubmittedForm(); @@ -420,17 +424,18 @@ public class LogRecorder extends AbstractModelObject implements Saveable { * @since 1.519 */ public Map> getSlaveLogRecords() { - Map> result = new TreeMap>(new Comparator() { + Map> result = new TreeMap<>(new Comparator() { final Collator COLL = Collator.getInstance(); + public int compare(Computer c1, Computer c2) { return COLL.compare(c1.getDisplayName(), c2.getDisplayName()); } }); - for (Computer c : Jenkins.getInstance().getComputers()) { + for (Computer c : Jenkins.get().getComputers()) { if (c.getName().length() == 0) { continue; // master } - List recs = new ArrayList(); + List recs = new ArrayList<>(); try { for (LogRecord rec : c.getLogRecords()) { for (Target t : targets) { diff --git a/core/src/main/java/hudson/logging/LogRecorderManager.java b/core/src/main/java/hudson/logging/LogRecorderManager.java index a572900a55..4bf9730f3a 100644 --- a/core/src/main/java/hudson/logging/LogRecorderManager.java +++ b/core/src/main/java/hudson/logging/LogRecorderManager.java @@ -87,7 +87,7 @@ public class LogRecorderManager extends AbstractModelObject implements ModelObje } static File configDir() { - return new File(Jenkins.getInstance().getRootDir(), "log"); + return new File(Jenkins.get().getRootDir(), "log"); } /** @@ -135,7 +135,7 @@ public class LogRecorderManager extends AbstractModelObject implements ModelObje @edu.umd.cs.findbugs.annotations.SuppressFBWarnings("LG_LOST_LOGGER_DUE_TO_WEAK_REFERENCE") @RequirePOST public HttpResponse doConfigLogger(@QueryParameter String name, @QueryParameter String level) { - Jenkins.getInstance().checkPermission(Jenkins.ADMINISTER); + Jenkins.get().checkPermission(Jenkins.ADMINISTER); Level lv; if(level.equals("inherit")) lv = null; @@ -157,6 +157,7 @@ public class LogRecorderManager extends AbstractModelObject implements ModelObje */ /*package*/ static void doRss(StaplerRequest req, StaplerResponse rsp, List logs) throws IOException, ServletException { // filter log records based on the log level + String entryType = "all"; String level = req.getParameter("level"); if(level!=null) { Level threshold = Level.parse(level); @@ -166,9 +167,10 @@ public class LogRecorderManager extends AbstractModelObject implements ModelObje filtered.add(r); } logs = filtered; + entryType = level; } - RSS.forwardToRss("Hudson log","", logs, new FeedAdapter() { + RSS.forwardToRss("Jenkins:log (" + entryType + " entries)","", logs, new FeedAdapter() { public String getEntryTitle(LogRecord entry) { return entry.getMessage(); } @@ -206,7 +208,7 @@ public class LogRecorderManager extends AbstractModelObject implements ModelObje @Restricted(NoExternalUse.class) public Object getTarget() { if (!SKIP_PERMISSION_CHECK) { - Jenkins.getInstance().checkPermission(Jenkins.ADMINISTER); + Jenkins.get().checkPermission(Jenkins.ADMINISTER); } return this; } diff --git a/core/src/main/java/hudson/markup/EscapedMarkupFormatter.java b/core/src/main/java/hudson/markup/EscapedMarkupFormatter.java index f97e5e94c4..ca356e9499 100644 --- a/core/src/main/java/hudson/markup/EscapedMarkupFormatter.java +++ b/core/src/main/java/hudson/markup/EscapedMarkupFormatter.java @@ -47,7 +47,9 @@ public class EscapedMarkupFormatter extends MarkupFormatter { @Override public void translate(String markup, Writer output) throws IOException { - output.write(Util.escape(markup)); + if (markup != null) { + output.write(Util.escape(markup)); + } } @Extension @Symbol("plainText") diff --git a/core/src/main/java/hudson/markup/MarkupFormatterDescriptor.java b/core/src/main/java/hudson/markup/MarkupFormatterDescriptor.java index 5e0cd5ea41..cd7c108bd7 100644 --- a/core/src/main/java/hudson/markup/MarkupFormatterDescriptor.java +++ b/core/src/main/java/hudson/markup/MarkupFormatterDescriptor.java @@ -38,7 +38,7 @@ public abstract class MarkupFormatterDescriptor extends Descriptor all() { - return Jenkins.getInstance(). + return Jenkins.get(). getDescriptorList(MarkupFormatter.class); } } diff --git a/core/src/main/java/hudson/model/AbstractBuild.java b/core/src/main/java/hudson/model/AbstractBuild.java index 447fa51c26..6af442245d 100644 --- a/core/src/main/java/hudson/model/AbstractBuild.java +++ b/core/src/main/java/hudson/model/AbstractBuild.java @@ -207,9 +207,9 @@ public abstract class AbstractBuild

    ,R extends Abs */ public @CheckForNull Node getBuiltOn() { if (builtOn==null || builtOn.equals("")) - return Jenkins.getInstance(); + return Jenkins.get(); else - return Jenkins.getInstance().getNode(builtOn); + return Jenkins.get().getNode(builtOn); } /** @@ -460,7 +460,7 @@ public abstract class AbstractBuild

    ,R extends Abs this.listener = listener; launcher = createLauncher(listener); - if (!Jenkins.getInstance().getNodes().isEmpty()) { + if (!Jenkins.get().getNodes().isEmpty()) { if (node instanceof Jenkins) { listener.getLogger().print(Messages.AbstractBuild_BuildingOnMaster()); } else { @@ -545,7 +545,7 @@ public abstract class AbstractBuild

    ,R extends Abs } } - for (NodeProperty nodeProperty: Jenkins.getInstance().getGlobalNodeProperties()) { + for (NodeProperty nodeProperty: Jenkins.get().getGlobalNodeProperties()) { Environment environment = nodeProperty.setUp(AbstractBuild.this, l, listener); if (environment != null) { buildEnvironments.add(environment); @@ -863,8 +863,10 @@ public abstract class AbstractBuild

    ,R extends Abs public EnvVars getEnvironment(TaskListener log) throws IOException, InterruptedException { EnvVars env = super.getEnvironment(log); FilePath ws = getWorkspace(); - if (ws!=null) // if this is done very early on in the build, workspace may not be decided yet. see HUDSON-3997 + if (ws != null) { // if this is done very early on in the build, workspace may not be decided yet. see HUDSON-3997 env.put("WORKSPACE", ws.getRemote()); + env.put("WORKSPACE_TMP", WorkspaceList.tempDir(ws).getRemote()); // JENKINS-60634 + } project.getScm().buildEnvVars(this,env); @@ -1001,7 +1003,7 @@ public abstract class AbstractBuild

    ,R extends Abs @Deprecated public Action getTestResultAction() { try { - return getAction(Jenkins.getInstance().getPluginManager().uberClassLoader.loadClass("hudson.tasks.test.AbstractTestResultAction").asSubclass(Action.class)); + return getAction(Jenkins.get().getPluginManager().uberClassLoader.loadClass("hudson.tasks.test.AbstractTestResultAction").asSubclass(Action.class)); } catch (ClassNotFoundException x) { return null; } @@ -1013,7 +1015,7 @@ public abstract class AbstractBuild

    ,R extends Abs @Deprecated public Action getAggregatedTestResultAction() { try { - return getAction(Jenkins.getInstance().getPluginManager().uberClassLoader.loadClass("hudson.tasks.test.AggregatedTestResultAction").asSubclass(Action.class)); + return getAction(Jenkins.get().getPluginManager().uberClassLoader.loadClass("hudson.tasks.test.AggregatedTestResultAction").asSubclass(Action.class)); } catch (ClassNotFoundException x) { return null; } diff --git a/core/src/main/java/hudson/model/AbstractCIBase.java b/core/src/main/java/hudson/model/AbstractCIBase.java index 76ea2147ac..f6c11f0219 100644 --- a/core/src/main/java/hudson/model/AbstractCIBase.java +++ b/core/src/main/java/hudson/model/AbstractCIBase.java @@ -93,7 +93,7 @@ public abstract class AbstractCIBase extends Node implements ItemGroup disabledAdministrativeMonitors = new CopyOnWriteArraySet(); + /*package*/ final CopyOnWriteArraySet disabledAdministrativeMonitors = new CopyOnWriteArraySet<>(); @Restricted(NoExternalUse.class) public CopyOnWriteArraySet getDisabledAdministrativeMonitors(){ @@ -131,7 +131,7 @@ public abstract class AbstractCIBase extends Node implements ItemGroup0 || n==Jenkins.getInstance()) { + if(n.getNumExecutors()>0 || n==Jenkins.get()) { try { c = n.createComputer(); } catch(RuntimeException ex) { // Just in case there is a bogus extension @@ -192,11 +192,11 @@ public abstract class AbstractCIBase extends Node implements ItemGroup computers = getComputerMap(); - final Set old = new HashSet(computers.size()); + final Set old = new HashSet<>(computers.size()); Queue.withLock(new Runnable() { @Override public void run() { - Map byName = new HashMap(); + Map byName = new HashMap<>(); for (Computer c : computers.values()) { old.add(c); Node node = c.getNode(); diff --git a/core/src/main/java/hudson/model/AbstractDescribableImpl.java b/core/src/main/java/hudson/model/AbstractDescribableImpl.java index 07ed386a93..b1ac6dd847 100644 --- a/core/src/main/java/hudson/model/AbstractDescribableImpl.java +++ b/core/src/main/java/hudson/model/AbstractDescribableImpl.java @@ -39,7 +39,7 @@ public abstract class AbstractDescribableImpl getDescriptor() { - return Jenkins.getInstance().getDescriptorOrDie(getClass()); + return Jenkins.get().getDescriptorOrDie(getClass()); } } diff --git a/core/src/main/java/hudson/model/AbstractItem.java b/core/src/main/java/hudson/model/AbstractItem.java index b52c646a74..d00fb66986 100644 --- a/core/src/main/java/hudson/model/AbstractItem.java +++ b/core/src/main/java/hudson/model/AbstractItem.java @@ -77,7 +77,6 @@ import javax.annotation.Nonnull; import org.acegisecurity.AccessDeniedException; import org.kohsuke.stapler.HttpResponse; -import org.kohsuke.stapler.HttpResponses; import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerResponse; import org.kohsuke.stapler.Stapler; @@ -91,13 +90,13 @@ import org.xml.sax.SAXException; import javax.servlet.ServletException; import javax.xml.transform.Source; import javax.xml.transform.TransformerException; +import javax.xml.transform.sax.SAXSource; import javax.xml.transform.stream.StreamResult; import javax.xml.transform.stream.StreamSource; import static hudson.model.queue.Executables.getParentOf; import hudson.model.queue.SubTask; import static javax.servlet.http.HttpServletResponse.SC_BAD_REQUEST; -import static javax.servlet.http.HttpServletResponse.SC_NOT_FOUND; import org.apache.commons.io.FileUtils; import org.kohsuke.accmod.Restricted; @@ -157,11 +156,11 @@ public abstract class AbstractItem extends Actionable implements Item, HttpDelet 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 * of the object. */ + @Exported public String getDisplayName() { if(null!=displayName) { return displayName; @@ -170,13 +169,13 @@ public abstract class AbstractItem extends Actionable implements Item, HttpDelet return getName(); } - @Exported /** * This is intended to be used by the Job configuration pages where * we want to return null if the display name is not set. * @return The display name of this object or null if the display name is not * set */ + @Exported public String getDisplayNameOrNull() { return displayName; } @@ -275,6 +274,11 @@ public abstract class AbstractItem extends Actionable implements Item, HttpDelet */ @Restricted(NoExternalUse.class) public @Nonnull FormValidation doCheckNewName(@QueryParameter String newName) { + + if (!isNameEditable()) { + return FormValidation.error("Trying to rename an item that does not support this operation."); + } + // TODO: Create an Item.RENAME permission to use here, see JENKINS-18649. if (!hasPermission(Item.CONFIGURE)) { if (parent instanceof AccessControlled) { @@ -351,6 +355,11 @@ public abstract class AbstractItem extends Actionable implements Item, HttpDelet * you can use this method. */ protected void renameTo(final String newName) throws IOException { + + if (!isNameEditable()) { + throw new IOException("Trying to rename an item that does not support this operation."); + } + // always synchronize from bigger objects first final ItemGroup parent = getParent(); String oldName = this.name; @@ -589,7 +598,7 @@ public abstract class AbstractItem extends Actionable implements Item, HttpDelet * Returns the {@link ACL} for this object. */ public ACL getACL() { - return Jenkins.getInstance().getAuthorizationStrategy().getACL(this); + return Jenkins.get().getAuthorizationStrategy().getACL(this); } /** @@ -713,7 +722,7 @@ public abstract class AbstractItem extends Actionable implements Item, HttpDelet // the 15 second delay for every child item). This happens after queue cancellation, so will be // a complete set of builds in flight Map buildsInProgress = new LinkedHashMap<>(); - for (Computer c : Jenkins.getInstance().getComputers()) { + for (Computer c : Jenkins.get().getComputers()) { for (Executor e : c.getAllExecutors()) { final WorkUnit workUnit = e.getCurrentWorkUnit(); final Executable executable = workUnit != null ? workUnit.getExecutable() : null; @@ -721,18 +730,16 @@ public abstract class AbstractItem extends Actionable implements Item, HttpDelet if (subtask != null) { Item item = Tasks.getItemOf(subtask); - if (item != null) { - while (item != null) { - if (item == this) { - buildsInProgress.put(e, e.getCurrentExecutable()); - e.interrupt(Result.ABORTED); - break; - } - if (item.getParent() instanceof Item) { - item = (Item) item.getParent(); - } else { - break; - } + while (item != null) { + if (item == this) { + buildsInProgress.put(e, e.getCurrentExecutable()); + e.interrupt(Result.ABORTED); + break; + } + if (item.getParent() instanceof Item) { + item = (Item) item.getParent(); + } else { + break; } } } @@ -780,7 +787,7 @@ public abstract class AbstractItem extends Actionable implements Item, HttpDelet } } getParent().onDeleted(AbstractItem.this); - Jenkins.getInstance().rebuildDependencyGraphAsync(); + Jenkins.get().rebuildDependencyGraphAsync(); } /** @@ -852,7 +859,7 @@ public abstract class AbstractItem extends Actionable implements Item, HttpDelet /** * Updates an Item by its XML definition. * @param source source of the Item's new definition. - * The source should be either a StreamSource or a SAXSource, other + * The source should be either a {@link StreamSource} or a {@link SAXSource}, other * sources may not be handled. * @since 1.473 */ @@ -882,7 +889,7 @@ public abstract class AbstractItem extends Actionable implements Item, HttpDelet return null; } }); - Jenkins.getInstance().rebuildDependencyGraphAsync(); + Jenkins.get().rebuildDependencyGraphAsync(); // if everything went well, commit this new version out.commit(); @@ -915,15 +922,12 @@ public abstract class AbstractItem extends Actionable implements Item, HttpDelet return null; } }); - Jenkins.getInstance().rebuildDependencyGraphAsync(); + Jenkins.get().rebuildDependencyGraphAsync(); SaveableListener.fireOnChange(this, getConfigFile()); } - /** - * {@inheritDoc} - */ @Override public String getSearchName() { // the search name of abstract items should be the name and not display name. @@ -961,9 +965,9 @@ public abstract class AbstractItem extends Actionable implements Item, HttpDelet public static AbstractItem resolveForCLI( @Argument(required=true,metaVar="NAME",usage="Item name") String name) throws CmdLineException { // TODO can this (and its pseudo-override in AbstractProject) share code with GenericItemOptionHandler, used for explicit CLICommand’s rather than CLIMethod’s? - AbstractItem item = Jenkins.getInstance().getItemByFullName(name, AbstractItem.class); + AbstractItem item = Jenkins.get().getItemByFullName(name, AbstractItem.class); if (item==null) { - AbstractItem project = Items.findNearest(AbstractItem.class, name, Jenkins.getInstance()); + AbstractItem project = Items.findNearest(AbstractItem.class, name, Jenkins.get()); throw new CmdLineException(null, project == null ? Messages.AbstractItem_NoSuchJobExistsWithoutSuggestion(name) : Messages.AbstractItem_NoSuchJobExists(name, project.getFullName())); } @@ -973,7 +977,7 @@ public abstract class AbstractItem extends Actionable implements Item, HttpDelet /** * Replaceable pronoun of that points to a job. Defaults to "Job"/"Project" depending on the context. */ - public static final Message PRONOUN = new Message(); + public static final Message PRONOUN = new Message<>(); /** * Replaceable noun for describing the kind of task that this item represents. Defaults to "Build". diff --git a/core/src/main/java/hudson/model/AbstractProject.java b/core/src/main/java/hudson/model/AbstractProject.java index f86aed606d..00a82dbf69 100644 --- a/core/src/main/java/hudson/model/AbstractProject.java +++ b/core/src/main/java/hudson/model/AbstractProject.java @@ -125,6 +125,7 @@ import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerResponse; import org.kohsuke.stapler.export.Exported; import org.kohsuke.stapler.interceptor.RequirePOST; +import org.kohsuke.stapler.verb.POST; /** * Base implementation of {@link Job}s that build software. @@ -231,7 +232,7 @@ public abstract class AbstractProject

    ,R extends A * List of all {@link Trigger}s for this project. */ @AdaptField(was=List.class) - protected volatile DescribableList,TriggerDescriptor> triggers = new DescribableList,TriggerDescriptor>(this); + protected volatile DescribableList,TriggerDescriptor> triggers = new DescribableList<>(this); private static final AtomicReferenceFieldUpdater triggersUpdater = AtomicReferenceFieldUpdater.newUpdater(AbstractProject.class,DescribableList.class,"triggers"); @@ -243,7 +244,7 @@ public abstract class AbstractProject

    ,R extends A * come and go as configuration change, so it's kept separate. */ @CopyOnWrite - protected transient volatile List transientActions = new Vector(); + protected transient volatile List transientActions = new Vector<>(); private boolean concurrentBuild; @@ -259,9 +260,8 @@ public abstract class AbstractProject

    ,R extends A buildMixIn = createBuildMixIn(); builds = buildMixIn.getRunMap(); - final Jenkins j = Jenkins.getInstance(); - final List nodes = j != null ? j.getNodes() : null; - if(nodes!=null && !nodes.isEmpty()) { + Jenkins j = Jenkins.getInstanceOrNull(); + if (j != null && !j.getNodes().isEmpty()) { // if a new job is configured with Hudson that already has agent nodes // make it roamable by default canRoam = true; @@ -319,7 +319,7 @@ public abstract class AbstractProject

    ,R extends A scm = new NullSCM(); // perhaps it was pointing to a plugin that no longer exists. if(transientActions==null) - transientActions = new Vector(); // happens when loaded from disk + transientActions = new Vector<>(); // happens when loaded from disk updateTransientActions(); } @@ -385,8 +385,8 @@ public abstract class AbstractProject

    ,R extends A return null; if(assignedNode==null) - return Jenkins.getInstance().getSelfLabel(); - return Jenkins.getInstance().getLabel(assignedNode); + return Jenkins.get().getSelfLabel(); + return Jenkins.get().getLabel(assignedNode); } /** @@ -428,7 +428,7 @@ public abstract class AbstractProject

    ,R extends A assignedNode = null; } else { canRoam = false; - if(l== Jenkins.getInstance().getSelfLabel()) assignedNode = null; + if(l== Jenkins.get().getSelfLabel()) assignedNode = null; else assignedNode = l.getExpression(); } save(); @@ -510,6 +510,7 @@ public abstract class AbstractProject

    ,R extends A * * @return An AbstractBuild for deprecated methods to use. */ + @CheckForNull private AbstractBuild getBuildForDeprecatedMethods() { Executor e = Executor.currentExecutor(); if(e!=null) { @@ -520,9 +521,7 @@ public abstract class AbstractProject

    ,R extends A return b; } } - R lb = getLastBuild(); - if(lb!=null) return lb; - return null; + return getLastBuild(); } /** @@ -553,8 +552,7 @@ public abstract class AbstractProject

    ,R extends A * @return null if no such build exists. */ public final R getSomeBuildWithWorkspace() { - int cnt=0; - for (R b = getLastBuild(); cnt<5 && b!=null; b=b.getPreviousBuild()) { + for (R b = getLastBuild(); b != null; b = b.getPreviousBuild()) { FilePath ws = b.getWorkspace(); if (ws!=null) return b; } @@ -562,8 +560,7 @@ public abstract class AbstractProject

    ,R extends A } private R getSomeBuildWithExistingWorkspace() throws IOException, InterruptedException { - int cnt=0; - for (R b = getLastBuild(); cnt<5 && b!=null; b=b.getPreviousBuild()) { + for (R b = getLastBuild(); b != null; b = b.getPreviousBuild()) { FilePath ws = b.getWorkspace(); if (ws!=null && ws.exists()) return b; } @@ -602,7 +599,7 @@ public abstract class AbstractProject

    ,R extends A } public int getQuietPeriod() { - return quietPeriod!=null ? quietPeriod : Jenkins.getInstance().getQuietPeriod(); + return quietPeriod!=null ? quietPeriod : Jenkins.get().getQuietPeriod(); } public SCMCheckoutStrategy getScmCheckoutStrategy() { @@ -616,7 +613,7 @@ public abstract class AbstractProject

    ,R extends A public int getScmCheckoutRetryCount() { - return scmCheckoutRetryCount !=null ? scmCheckoutRetryCount : Jenkins.getInstance().getScmCheckoutRetryCount(); + return scmCheckoutRetryCount !=null ? scmCheckoutRetryCount : Jenkins.get().getScmCheckoutRetryCount(); } // ugly name because of EL @@ -668,6 +665,7 @@ public abstract class AbstractProject

    ,R extends A } @Override + @Exported public boolean isDisabled() { return disabled; } @@ -732,7 +730,7 @@ public abstract class AbstractProject

    ,R extends A } protected List createTransientActions() { - Vector ta = new Vector(); + Vector ta = new Vector<>(); for (JobProperty p : Util.fixNull(properties)) ta.addAll(p.getJobActions((P)this)); @@ -767,17 +765,17 @@ public abstract class AbstractProject

    ,R extends A } @Override - @RequirePOST + @POST public void doConfigSubmit( StaplerRequest req, StaplerResponse rsp ) throws IOException, ServletException, FormException { super.doConfigSubmit(req,rsp); updateTransientActions(); // notify the queue as the project might be now tied to different node - Jenkins.getInstance().getQueue().scheduleMaintenance(); + Jenkins.get().getQueue().scheduleMaintenance(); // this is to reflect the upstream build adjustments done above - Jenkins.getInstance().rebuildDependencyGraphAsync(); + Jenkins.get().rebuildDependencyGraphAsync(); } /** @@ -818,7 +816,7 @@ public abstract class AbstractProject

    ,R extends A */ @WithBridgeMethods(Future.class) public QueueTaskFuture scheduleBuild2(int quietPeriod, Cause c, Collection actions) { - List queueActions = new ArrayList(actions); + List queueActions = new ArrayList<>(actions); if (c != null) { queueActions.add(new CauseAction(c)); } @@ -870,19 +868,19 @@ public abstract class AbstractProject

    ,R extends A */ @Override public boolean isInQueue() { - return Jenkins.getInstance().getQueue().contains(this); + return Jenkins.get().getQueue().contains(this); } @Override public Queue.Item getQueueItem() { - return Jenkins.getInstance().getQueue().getItem(this); + return Jenkins.get().getQueue().getItem(this); } /** * Gets the JDK that this project is configured with, or null. */ public JDK getJDK() { - return Jenkins.getInstance().getJDK(jdk); + return Jenkins.get().getJDK(jdk); } /** @@ -988,7 +986,7 @@ public abstract class AbstractProject

    ,R extends A @Override public List getActions() { // add all the transient actions, too - List actions = new Vector(super.getActions()); + List actions = new Vector<>(super.getActions()); actions.addAll(transientActions); // return the read only list to cause a failure on plugins who try to add an action here return Collections.unmodifiableList(actions); @@ -1075,7 +1073,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 implementation glitсh in the implementation for AbstractProject. + // Another cause may be an API implementation glitch 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"); } @@ -1101,7 +1099,7 @@ public abstract class AbstractProject

    ,R extends A * the given project (provided that all builds went smoothly.) */ public AbstractProject getBuildingDownstream() { - Set unblockedTasks = Jenkins.getInstance().getQueue().getUnblockedTasks(); + Set unblockedTasks = Jenkins.get().getQueue().getUnblockedTasks(); for (AbstractProject tup : getTransitiveDownstreamProjects()) { if (tup!=this && (tup.isBuilding() || unblockedTasks.contains(tup))) @@ -1118,7 +1116,7 @@ public abstract class AbstractProject

    ,R extends A * the given project (provided that all builds went smoothly.) */ public AbstractProject getBuildingUpstream() { - Set unblockedTasks = Jenkins.getInstance().getQueue().getUnblockedTasks(); + Set unblockedTasks = Jenkins.get().getQueue().getUnblockedTasks(); for (AbstractProject tup : getTransitiveUpstreamProjects()) { if (tup!=this && (tup.isBuilding() || unblockedTasks.contains(tup))) @@ -1128,7 +1126,7 @@ public abstract class AbstractProject

    ,R extends A } public List getSubTasks() { - List r = new ArrayList(); + List r = new ArrayList<>(); r.add(this); for (SubTaskContributor euc : SubTaskContributor.all()) r.addAll(euc.forProject(this)); @@ -1174,7 +1172,7 @@ public abstract class AbstractProject

    ,R extends A */ public ResourceList getResourceList() { final Set resourceActivities = getResourceActivities(); - final List resourceLists = new ArrayList(1 + resourceActivities.size()); + final List resourceLists = new ArrayList<>(1 + resourceActivities.size()); for (ResourceActivity activity : resourceActivities) { if (activity != this && activity != null) { // defensive infinite recursion and null check @@ -1340,7 +1338,7 @@ public abstract class AbstractProject

    ,R extends A // because otherwise there's no way we can detect changes. // However, first there are some conditions in which we do not want to do so. // give time for agents to come online if we are right after reconnection (JENKINS-8408) - long running = Jenkins.getInstance().getInjector().getInstance(Uptime.class).getUptime(); + long running = Jenkins.get().getInjector().getInstance(Uptime.class).getUptime(); long remaining = TimeUnit.MINUTES.toMillis(10)-running; if (remaining>0 && /* this logic breaks tests of polling */!Functions.getIsUnitTest()) { listener.getLogger().print(Messages.AbstractProject_AwaitingWorkspaceToComeOnline(remaining/1000)); @@ -1431,7 +1429,6 @@ public abstract class AbstractProject

    ,R extends A */ private boolean isAllSuitableNodesOffline(R build) { Label label = getAssignedLabel(); - List allNodes = Jenkins.getInstance().getNodes(); if (label != null) { //Invalid label. Put in queue to make administrator fix @@ -1442,7 +1439,7 @@ public abstract class AbstractProject

    ,R extends A return label.isOffline(); } else { if(canRoam) { - for (Node n : Jenkins.getInstance().getNodes()) { + for (Node n : Jenkins.get().getNodes()) { Computer c = n.toComputer(); if (c != null && c.isOnline() && c.isAcceptingTasks() && n.getMode() == Mode.NORMAL) { // Some executor is online that is ready and this job can run anywhere @@ -1450,7 +1447,7 @@ public abstract class AbstractProject

    ,R extends A } } //We can roam, check that the master is set to be used as much as possible, and not tied jobs only. - return Jenkins.getInstance().getMode() == Mode.EXCLUSIVE; + return Jenkins.get().getMode() == Mode.EXCLUSIVE; } } return true; @@ -1461,7 +1458,7 @@ public abstract class AbstractProject

    ,R extends A Label label = getAssignedLabel(); if (isAllSuitableNodesOffline(build)) { - Collection applicableClouds = label == null ? Jenkins.getInstance().clouds : label.getClouds(); + Collection applicableClouds = label == null ? Jenkins.get().clouds : label.getClouds(); return applicableClouds.isEmpty() ? WorkspaceOfflineReason.all_suitable_nodes_are_offline : WorkspaceOfflineReason.use_ondemand_slave; } @@ -1569,7 +1566,7 @@ public abstract class AbstractProject

    ,R extends A * when a build of this project is completed. */ public final List getDownstreamProjects() { - return Jenkins.getInstance().getDependencyGraph().getDownstream(this); + return Jenkins.get().getDependencyGraph().getDownstream(this); } @Exported(name="downstreamProjects") @@ -1585,7 +1582,7 @@ public abstract class AbstractProject

    ,R extends A } public final List getUpstreamProjects() { - return Jenkins.getInstance().getDependencyGraph().getUpstream(this); + return Jenkins.get().getDependencyGraph().getUpstream(this); } @Exported(name="upstreamProjects") @@ -1607,7 +1604,7 @@ public abstract class AbstractProject

    ,R extends A * @return A List of upstream projects that has a {@link BuildTrigger} to this project. */ public final List getBuildTriggerUpstreamProjects() { - ArrayList result = new ArrayList(); + ArrayList result = new ArrayList<>(); for (AbstractProject ap : getUpstreamProjects()) { BuildTrigger buildTrigger = ap.getPublishersList().get(BuildTrigger.class); if (buildTrigger != null) @@ -1623,7 +1620,7 @@ public abstract class AbstractProject

    ,R extends A * @since 1.138 */ public final Set getTransitiveUpstreamProjects() { - return Jenkins.getInstance().getDependencyGraph().getTransitiveUpstream(this); + return Jenkins.get().getDependencyGraph().getTransitiveUpstream(this); } /** @@ -1632,7 +1629,7 @@ public abstract class AbstractProject

    ,R extends A * @since 1.138 */ public final Set getTransitiveDownstreamProjects() { - return Jenkins.getInstance().getDependencyGraph().getTransitiveDownstream(this); + return Jenkins.get().getDependencyGraph().getTransitiveDownstream(this); } /** @@ -1644,7 +1641,7 @@ public abstract class AbstractProject

    ,R extends A * numbers of that project. */ public SortedMap getRelationship(AbstractProject that) { - TreeMap r = new TreeMap(REVERSE_INTEGER_COMPARATOR); + TreeMap r = new TreeMap<>(REVERSE_INTEGER_COMPARATOR); checkAndRecord(that, r, this.getBuilds()); // checkAndRecord(that, r, that.getBuilds()); @@ -1817,7 +1814,7 @@ public abstract class AbstractProject

    ,R extends A throws FormException, ServletException { JSONObject data = req.getSubmittedForm(); - List r = new Vector(); + List r = new Vector<>(); for (Descriptor d : descriptors) { String safeName = d.getJsonSafeClassName(); if (req.getParameter(safeName) != null) { @@ -1934,7 +1931,7 @@ public abstract class AbstractProject

    ,R extends A return FormValidation.error(e, Messages.AbstractProject_AssignedLabelString_InvalidBooleanExpression(e.getMessage())); } - Jenkins j = Jenkins.getInstance(); + Jenkins j = Jenkins.get(); Label l = j.getLabel(value); if (l.isEmpty()) { for (LabelAtom a : l.listAtoms()) { @@ -1968,7 +1965,7 @@ public abstract class AbstractProject

    ,R extends A public AutoCompletionCandidates doAutoCompleteUpstreamProjects(@QueryParameter String value) { AutoCompletionCandidates candidates = new AutoCompletionCandidates(); - List jobs = Jenkins.getInstance().getItems(Job.class); + List jobs = Jenkins.get().getItems(Job.class); for (Job job: jobs) { if (job.getFullName().startsWith(value)) { if (job.hasPermission(Item.READ)) { @@ -1989,7 +1986,7 @@ public abstract class AbstractProject

    ,R extends A public AutoCompletionCandidates doAutoCompleteLabel(@QueryParameter String value) { AutoCompletionCandidates c = new AutoCompletionCandidates(); - Set

    ,R extends A } List getSeeds() { - ArrayList terms = new ArrayList(); + ArrayList terms = new ArrayList<>(); boolean trailingQuote = source.endsWith("\""); boolean leadingQuote = source.startsWith("\""); boolean trailingSpace = source.endsWith(" "); @@ -2053,7 +2050,7 @@ public abstract class AbstractProject

    ,R extends A * @see Items#findNearest */ public static @CheckForNull AbstractProject findNearest(String name) { - return findNearest(name,Jenkins.getInstance()); + return findNearest(name,Jenkins.get()); } /** @@ -2084,7 +2081,7 @@ public abstract class AbstractProject

    ,R extends A * @deprecated Use {@link ParameterizedJobMixIn#BUILD_NOW_TEXT}. */ @Deprecated - public static final Message BUILD_NOW_TEXT = new Message(); + public static final Message BUILD_NOW_TEXT = new Message<>(); /** * Used for CLI binding. @@ -2092,7 +2089,7 @@ public abstract class AbstractProject

    ,R extends A @CLIResolver public static AbstractProject resolveForCLI( @Argument(required=true,metaVar="NAME",usage="Job name") String name) throws CmdLineException { - AbstractProject item = Jenkins.getInstance().getItemByFullName(name, AbstractProject.class); + AbstractProject item = Jenkins.get().getItemByFullName(name, AbstractProject.class); if (item==null) { AbstractProject project = AbstractProject.findNearest(name); throw new CmdLineException(null, project == null ? Messages.AbstractItem_NoSuchJobExistsWithoutSuggestion(name) diff --git a/core/src/main/java/hudson/model/Actionable.java b/core/src/main/java/hudson/model/Actionable.java index 496c2de286..174bf192ff 100644 --- a/core/src/main/java/hudson/model/Actionable.java +++ b/core/src/main/java/hudson/model/Actionable.java @@ -322,7 +322,7 @@ public abstract class Actionable extends AbstractModelObject implements ModelObj * Gets the action (first instance to be found) of a specified type that contributed to this build. * * @param type - * @return The action or null if no such actions exist. + * @return The action or {@code null} if no such actions exist. * @see #getActions(Class) */ public T getAction(Class type) { diff --git a/core/src/main/java/hudson/model/AdministrativeMonitor.java b/core/src/main/java/hudson/model/AdministrativeMonitor.java index e0f0a63ff9..4554809c54 100644 --- a/core/src/main/java/hudson/model/AdministrativeMonitor.java +++ b/core/src/main/java/hudson/model/AdministrativeMonitor.java @@ -68,7 +68,7 @@ import org.kohsuke.stapler.interceptor.RequirePOST; * If {@link #isActivated()} returns true, Jenkins will use the {@code message.jelly} * view of this object to render the warning text. This happens in the * {@code http://SERVER/jenkins/manage} page. This view should typically render - * a DIV box with class='alert alert-error' or class='alert alert-warning' with a human-readable text + * a DIV box with class='alert alert-danger' or class='alert alert-warning' with a human-readable text * inside it. It often also contains a link to a page that provides more details * about the problem. * diff --git a/core/src/main/java/hudson/model/AperiodicWork.java b/core/src/main/java/hudson/model/AperiodicWork.java index dad7bbe573..2d0ed22f0e 100644 --- a/core/src/main/java/hudson/model/AperiodicWork.java +++ b/core/src/main/java/hudson/model/AperiodicWork.java @@ -36,7 +36,7 @@ import java.util.Set; import java.util.concurrent.TimeUnit; import java.util.logging.Logger; -import static hudson.init.InitMilestone.JOB_LOADED; +import static hudson.init.InitMilestone.JOB_CONFIG_ADAPTED; /** @@ -92,7 +92,7 @@ public abstract class AperiodicWork extends SafeTimerTask implements ExtensionPo Timer.get().schedule(getNewInstance(), getRecurrencePeriod(), TimeUnit.MILLISECONDS); } - @Initializer(after= JOB_LOADED) + @Initializer(after= JOB_CONFIG_ADAPTED) public static void init() { // start all AperidocWorks ExtensionList extensionList = all(); diff --git a/core/src/main/java/hudson/model/Api.java b/core/src/main/java/hudson/model/Api.java index 5fe6cdd56a..ccf30f01bc 100644 --- a/core/src/main/java/hudson/model/Api.java +++ b/core/src/main/java/hudson/model/Api.java @@ -247,6 +247,10 @@ public class Api extends AbstractModelObject { protected void setHeaders(StaplerResponse rsp) { rsp.setHeader("X-Jenkins", Jenkins.VERSION); rsp.setHeader("X-Jenkins-Session", Jenkins.SESSION_HASH); + // to be really defensive against dumb browsers not taking into consideration the content-type being set + rsp.setHeader("X-Content-Type-Options", "nosniff"); + // recommended by OWASP: https://cheatsheetseries.owasp.org/cheatsheets/REST_Security_Cheat_Sheet.html#security-headers + rsp.setHeader("X-Frame-Options", "deny"); } private static final Logger LOGGER = Logger.getLogger(Api.class.getName()); diff --git a/core/src/main/java/hudson/model/AsyncAperiodicWork.java b/core/src/main/java/hudson/model/AsyncAperiodicWork.java index 6e720c1419..cd9f46b830 100644 --- a/core/src/main/java/hudson/model/AsyncAperiodicWork.java +++ b/core/src/main/java/hudson/model/AsyncAperiodicWork.java @@ -25,6 +25,7 @@ package hudson.model; import hudson.Functions; import hudson.security.ACL; +import hudson.security.ACLContext; import hudson.util.StreamTaskListener; import java.io.File; import java.io.IOException; @@ -107,34 +108,30 @@ public abstract class AsyncAperiodicWork extends AperiodicWork { logger.log(getSlowLoggingLevel(), "{0} thread is still running. Execution aborted.", name); return; } - thread = new Thread(new Runnable() { - public void run() { - logger.log(getNormalLoggingLevel(), "Started {0}", name); - long startTime = System.currentTimeMillis(); - long stopTime; - - StreamTaskListener l = createListener(); - try { - l.getLogger().printf("Started at %tc%n", new Date(startTime)); - ACL.impersonate(ACL.SYSTEM); + thread = new Thread(() -> { + logger.log(getNormalLoggingLevel(), "Started {0}", name); + long startTime = System.currentTimeMillis(); + long stopTime; + StreamTaskListener l = createListener(); + try (ACLContext ctx = ACL.as(ACL.SYSTEM)) { + l.getLogger().printf("Started at %tc%n", new Date(startTime)); execute(l); - } catch (IOException e) { - Functions.printStackTrace(e, l.fatalError(e.getMessage())); - } catch (InterruptedException e) { - Functions.printStackTrace(e, l.fatalError("aborted")); + } catch (IOException e) { + Functions.printStackTrace(e, l.fatalError(e.getMessage())); + } catch (InterruptedException e) { + Functions.printStackTrace(e, l.fatalError("aborted")); + } finally { + stopTime = System.currentTimeMillis(); + try { + l.getLogger().printf("Finished at %tc. %dms%n", new Date(stopTime), stopTime - startTime); } finally { - stopTime = System.currentTimeMillis(); - try { - l.getLogger().printf("Finished at %tc. %dms%n", new Date(stopTime), stopTime - startTime); - } finally { - l.closeQuietly(); - } + l.closeQuietly(); } - - logger.log(getNormalLoggingLevel(), "Finished {0}. {1,number} ms", - new Object[]{name, stopTime - startTime}); } + + logger.log(getNormalLoggingLevel(), "Finished {0}. {1,number} ms", + new Object[]{name, stopTime - startTime}); },name+" thread"); thread.start(); } catch (Throwable t) { @@ -175,7 +172,7 @@ public abstract class AsyncAperiodicWork extends AperiodicWork { } else { lastRotateMillis = System.currentTimeMillis(); // migrate old log files the first time we start-up - File oldFile = new File(Jenkins.getActiveInstance().getRootDir(), f.getName()); + File oldFile = new File(Jenkins.get().getRootDir(), f.getName()); if (oldFile.isFile()) { File newFile = new File(f.getParentFile(), f.getName() + ".1"); if (!newFile.isFile()) { diff --git a/core/src/main/java/hudson/model/AsyncPeriodicWork.java b/core/src/main/java/hudson/model/AsyncPeriodicWork.java index 324d1853ee..80031750b7 100644 --- a/core/src/main/java/hudson/model/AsyncPeriodicWork.java +++ b/core/src/main/java/hudson/model/AsyncPeriodicWork.java @@ -2,6 +2,7 @@ package hudson.model; import hudson.Functions; import hudson.security.ACL; +import hudson.security.ACLContext; import hudson.util.StreamTaskListener; import java.io.File; import java.io.IOException; @@ -87,34 +88,32 @@ public abstract class AsyncPeriodicWork extends PeriodicWork { logger.log(this.getSlowLoggingLevel(), "{0} thread is still running. Execution aborted.", name); return; } - thread = new Thread(new Runnable() { - public void run() { - logger.log(getNormalLoggingLevel(), "Started {0}", name); - long startTime = System.currentTimeMillis(); - long stopTime; - - StreamTaskListener l = createListener(); - try { - l.getLogger().printf("Started at %tc%n", new Date(startTime)); - ACL.impersonate(ACL.SYSTEM); + thread = new Thread(() -> { + logger.log(getNormalLoggingLevel(), "Started {0}", name); + long startTime = System.currentTimeMillis(); + long stopTime; + StreamTaskListener l = createListener(); + try { + l.getLogger().printf("Started at %tc%n", new Date(startTime)); + try (ACLContext ctx = ACL.as(ACL.SYSTEM)) { execute(l); - } catch (IOException e) { - Functions.printStackTrace(e, l.fatalError(e.getMessage())); - } catch (InterruptedException e) { - Functions.printStackTrace(e, l.fatalError("aborted")); - } finally { - stopTime = System.currentTimeMillis(); - try { - l.getLogger().printf("Finished at %tc. %dms%n", new Date(stopTime), stopTime - startTime); - } finally { - l.closeQuietly(); - } } - - logger.log(getNormalLoggingLevel(), "Finished {0}. {1,number} ms", - new Object[]{name, stopTime - startTime}); + } catch (IOException e) { + Functions.printStackTrace(e, l.fatalError(e.getMessage())); + } catch (InterruptedException e) { + Functions.printStackTrace(e, l.fatalError("aborted")); + } finally { + stopTime = System.currentTimeMillis(); + try { + l.getLogger().printf("Finished at %tc. %dms%n", new Date(stopTime), stopTime - startTime); + } finally { + l.closeQuietly(); + } } + + logger.log(getNormalLoggingLevel(), "Finished {0}. {1,number} ms", + new Object[]{name, stopTime - startTime}); },name+" thread"); thread.start(); } catch (Throwable t) { @@ -158,7 +157,7 @@ public abstract class AsyncPeriodicWork extends PeriodicWork { } else { lastRotateMillis = System.currentTimeMillis(); // migrate old log files the first time we start-up - File oldFile = new File(Jenkins.getActiveInstance().getRootDir(), f.getName()); + File oldFile = new File(Jenkins.get().getRootDir(), f.getName()); if (oldFile.isFile()) { File newFile = new File(f.getParentFile(), f.getName() + ".1"); if (!newFile.isFile()) { diff --git a/core/src/main/java/hudson/model/AutoCompletionCandidates.java b/core/src/main/java/hudson/model/AutoCompletionCandidates.java index e8e64b8e48..735a9b80e8 100644 --- a/core/src/main/java/hudson/model/AutoCompletionCandidates.java +++ b/core/src/main/java/hudson/model/AutoCompletionCandidates.java @@ -154,12 +154,12 @@ public class AutoCompletionCandidates implements HttpResponse { } } - if (container==null || container==Jenkins.getInstance()) { - new Visitor("").onItemGroup(Jenkins.getInstance()); + if (container==null || container==Jenkins.get()) { + new Visitor("").onItemGroup(Jenkins.get()); } else { new Visitor("").onItemGroup(container); if (value.startsWith("/")) - new Visitor("/").onItemGroup(Jenkins.getInstance()); + new Visitor("/").onItemGroup(Jenkins.get()); for ( String p="../"; value.startsWith(p); p+="../") { container = ((Item)container).getParent(); diff --git a/core/src/main/java/hudson/model/BallColor.java b/core/src/main/java/hudson/model/BallColor.java index 84897187d7..c0872aedfc 100644 --- a/core/src/main/java/hudson/model/BallColor.java +++ b/core/src/main/java/hudson/model/BallColor.java @@ -26,7 +26,6 @@ package hudson.model; import hudson.util.ColorPalette; import jenkins.model.Jenkins; import org.jenkins.ui.icon.Icon; -import org.jenkins.ui.icon.IconSet; import org.jvnet.localizer.LocaleProvider; import org.jvnet.localizer.Localizable; import org.kohsuke.stapler.Stapler; diff --git a/core/src/main/java/hudson/model/BooleanParameterDefinition.java b/core/src/main/java/hudson/model/BooleanParameterDefinition.java index 15cb4ec80a..5a96b06ec2 100644 --- a/core/src/main/java/hudson/model/BooleanParameterDefinition.java +++ b/core/src/main/java/hudson/model/BooleanParameterDefinition.java @@ -65,7 +65,7 @@ public class BooleanParameterDefinition extends SimpleParameterDefinition { } public ParameterValue createValue(String value) { - return new BooleanParameterValue(getName(),Boolean.valueOf(value),getDescription()); + return new BooleanParameterValue(getName(),Boolean.parseBoolean(value),getDescription()); } @Override diff --git a/core/src/main/java/hudson/model/BuildAuthorizationToken.java b/core/src/main/java/hudson/model/BuildAuthorizationToken.java index 1d5456a8f9..dd54ffb307 100644 --- a/core/src/main/java/hudson/model/BuildAuthorizationToken.java +++ b/core/src/main/java/hudson/model/BuildAuthorizationToken.java @@ -68,7 +68,7 @@ public final class BuildAuthorizationToken { } public static void checkPermission(Job project, BuildAuthorizationToken token, StaplerRequest req, StaplerResponse rsp) throws IOException { - if (!Jenkins.getInstance().isUseSecurity()) + if (!Jenkins.get().isUseSecurity()) return; // everyone is authorized if(token!=null && token.token != null) { diff --git a/core/src/main/java/hudson/model/BuildStepListener.java b/core/src/main/java/hudson/model/BuildStepListener.java index e0ee3efe29..20bd9e1a23 100644 --- a/core/src/main/java/hudson/model/BuildStepListener.java +++ b/core/src/main/java/hudson/model/BuildStepListener.java @@ -25,7 +25,7 @@ public abstract class BuildStepListener implements ExtensionPoint { * Returns all the registered {@link BuildStepListener}s. */ public static ExtensionList all() { - // TODO should have a null-safe version when Jenkins.getInstance() is null; would require changes in ExtensionList + // TODO should have a null-safe version when Jenkins.getInstanceOrNull() is null; would require changes in ExtensionList return ExtensionList.lookup(BuildStepListener.class); } } diff --git a/core/src/main/java/hudson/model/Cause.java b/core/src/main/java/hudson/model/Cause.java index 178f2b9b21..08f6655236 100644 --- a/core/src/main/java/hudson/model/Cause.java +++ b/core/src/main/java/hudson/model/Cause.java @@ -47,7 +47,7 @@ import javax.annotation.Nonnull; /** * Cause object base class. This class hierarchy is used to keep track of why * a given build was started. This object encapsulates the UI rendering of the cause, - * as well as providing more useful information in respective subypes. + * as well as providing more useful information in respective subtypes. * * The Cause object is connected to a build via the {@link CauseAction} object. * @@ -191,7 +191,7 @@ public abstract class Cause { @Override public void onLoad(@Nonnull Job _job, int _buildNumber) { - Item i = Jenkins.getInstance().getItemByFullName(this.upstreamProject); + Item i = Jenkins.get().getItemByFullName(this.upstreamProject); if (!(i instanceof Job)) { // cannot initialize upstream causes return; @@ -275,7 +275,7 @@ public abstract class Cause { * @since 1.505 */ public @CheckForNull Run getUpstreamRun() { - Job job = Jenkins.getInstance().getItemByFullName(upstreamProject, Job.class); + Job job = Jenkins.get().getItemByFullName(upstreamProject, Job.class); return job != null ? job.getBuildByNumber(upstreamBuild) : null; } @@ -333,7 +333,6 @@ public abstract class Cause { public ConverterImpl(XStream2 xstream) { super(xstream); } @Override protected void callback(UpstreamCause uc, UnmarshallingContext context) { if (uc.upstreamCause != null) { - if (uc.upstreamCauses == null) uc.upstreamCauses = new ArrayList<>(); uc.upstreamCauses.add(uc.upstreamCause); uc.upstreamCause = null; OldDataMonitor.report(context, "1.288"); @@ -486,7 +485,7 @@ public abstract class Cause { public String getShortDescription() { if(note != null) { try { - return Messages.Cause_RemoteCause_ShortDescriptionWithNote(addr, Jenkins.getInstance().getMarkupFormatter().translate(note)); + return Messages.Cause_RemoteCause_ShortDescriptionWithNote(addr, Jenkins.get().getMarkupFormatter().translate(note)); } catch (IOException x) { // ignore } diff --git a/core/src/main/java/hudson/model/CheckPoint.java b/core/src/main/java/hudson/model/CheckPoint.java index 934fe7ddb5..ab4e176f6f 100644 --- a/core/src/main/java/hudson/model/CheckPoint.java +++ b/core/src/main/java/hudson/model/CheckPoint.java @@ -101,7 +101,7 @@ public final class CheckPoint { } /** - * Records that the execution of the build has reached to a check point, idenified + * Records that the execution of the build has reached to a check point, identified * by the given identifier. * *

    diff --git a/core/src/main/java/hudson/model/ChoiceParameterDefinition.java b/core/src/main/java/hudson/model/ChoiceParameterDefinition.java index ffe11cb3fd..612925bce4 100644 --- a/core/src/main/java/hudson/model/ChoiceParameterDefinition.java +++ b/core/src/main/java/hudson/model/ChoiceParameterDefinition.java @@ -13,6 +13,7 @@ import org.apache.commons.lang.StringUtils; import net.sf.json.JSONObject; import hudson.Extension; +import javax.annotation.CheckForNull; import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.util.ArrayList; @@ -37,19 +38,19 @@ public class ChoiceParameterDefinition extends SimpleParameterDefinition { return !StringUtils.isEmpty(strippedChoices) && strippedChoices.split(CHOICES_DELIMITER).length > 0; } - public ChoiceParameterDefinition(String name, String choices, String description) { + public ChoiceParameterDefinition(@Nonnull String name, @Nonnull String choices, String description) { super(name, description); setChoicesText(choices); defaultValue = null; } - public ChoiceParameterDefinition(String name, String[] choices, String description) { + public ChoiceParameterDefinition(@Nonnull String name, @Nonnull String[] choices, String description) { super(name, description); this.choices = new ArrayList<>(Arrays.asList(choices)); defaultValue = null; } - private ChoiceParameterDefinition(String name, List choices, String defaultValue, String description) { + private ChoiceParameterDefinition(@Nonnull String name, @Nonnull List choices, String defaultValue, String description) { super(name, description); this.choices = choices; this.defaultValue = defaultValue; @@ -129,8 +130,15 @@ public class ChoiceParameterDefinition extends SimpleParameterDefinition { } @Override + @CheckForNull public StringParameterValue getDefaultParameterValue() { - return new StringParameterValue(getName(), defaultValue == null ? choices.get(0) : defaultValue, getDescription()); + if (defaultValue == null) { + if (choices.isEmpty()) { + return null; + } + return new StringParameterValue(getName(), choices.get(0), getDescription()); + } + return new StringParameterValue(getName(), defaultValue, getDescription()); } private StringParameterValue checkValue(StringParameterValue value) { @@ -185,4 +193,4 @@ public class ChoiceParameterDefinition extends SimpleParameterDefinition { } } -} \ No newline at end of file +} diff --git a/core/src/main/java/hudson/model/Computer.java b/core/src/main/java/hudson/model/Computer.java index 3464bc7652..0fe348beda 100644 --- a/core/src/main/java/hudson/model/Computer.java +++ b/core/src/main/java/hudson/model/Computer.java @@ -62,6 +62,7 @@ import hudson.util.RemotingDiagnostics; import hudson.util.RemotingDiagnostics.HeapDump; import hudson.util.RunList; import hudson.util.Futures; +import hudson.util.IOUtils; import hudson.util.NamingThreadFactory; import jenkins.model.Jenkins; import jenkins.util.ContextResettingExecutorService; @@ -78,6 +79,7 @@ import org.kohsuke.accmod.restrictions.NoExternalUse; import org.kohsuke.args4j.Argument; import org.kohsuke.args4j.CmdLineException; import org.kohsuke.stapler.Stapler; +import org.kohsuke.stapler.StaplerProxy; import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerResponse; import org.kohsuke.stapler.QueryParameter; @@ -88,6 +90,7 @@ import org.kohsuke.stapler.WebMethod; import org.kohsuke.stapler.export.Exported; import org.kohsuke.stapler.export.ExportedBean; import org.kohsuke.stapler.interceptor.RequirePOST; +import org.kohsuke.stapler.verb.POST; import javax.annotation.OverridingMethodsMustInvokeSuper; import javax.annotation.concurrent.GuardedBy; @@ -148,7 +151,7 @@ import static javax.servlet.http.HttpServletResponse.*; * @author Kohsuke Kawaguchi */ @ExportedBean -public /*transient*/ abstract class Computer extends Actionable implements AccessControlled, ExecutorListener, DescriptorByNameOwner { +public /*transient*/ abstract class Computer extends Actionable implements AccessControlled, ExecutorListener, DescriptorByNameOwner, StaplerProxy { private final CopyOnWriteArrayList executors = new CopyOnWriteArrayList<>(); // TODO: @@ -299,9 +302,11 @@ public /*transient*/ abstract class Computer extends Actionable implements Acces * @since 1.613 */ protected @Nonnull File getLogDir() { - File dir = new File(Jenkins.getInstance().getRootDir(),"logs/slaves/"+nodeName); - if (!dir.exists() && !dir.mkdirs()) { - LOGGER.severe("Failed to create agent log directory " + dir.getAbsolutePath()); + File dir = new File(Jenkins.get().getRootDir(),"logs/slaves/"+nodeName); + try { + IOUtils.mkdirs(dir); + } catch (IOException x) { + LOGGER.log(Level.SEVERE, "Failed to create agent log directory " + dir, x); } return dir; } @@ -329,7 +334,7 @@ public /*transient*/ abstract class Computer extends Actionable implements Acces } public ACL getACL() { - return Jenkins.getInstance().getAuthorizationStrategy().getACL(this); + return Jenkins.get().getAuthorizationStrategy().getACL(this); } /** @@ -592,32 +597,23 @@ public /*transient*/ abstract class Computer extends Actionable implements Acces @Exported public LoadStatistics getLoadStatistics() { - return LabelAtom.get(nodeName != null ? nodeName : Jenkins.getInstance().getSelfLabel().toString()).loadStatistics; + return LabelAtom.get(nodeName != null ? nodeName : Jenkins.get().getSelfLabel().toString()).loadStatistics; } public BuildTimelineWidget getTimeline() { return new BuildTimelineWidget(getBuilds()); } - /** - * {@inheritDoc} - */ @Override public void taskAccepted(Executor executor, Queue.Task task) { // dummy implementation } - /** - * {@inheritDoc} - */ @Override public void taskCompleted(Executor executor, Queue.Task task, long durationMS) { // dummy implementation } - /** - * {@inheritDoc} - */ @Override public void taskCompletedWithProblems(Executor executor, Queue.Task task, long durationMS, Throwable problems) { // dummy implementation @@ -731,10 +727,11 @@ public /*transient*/ abstract class Computer extends Actionable implements Acces */ @Exported public String getIcon() { - if(isOffline()) - return "computer-x.png"; - else - return "computer.png"; + // The machine was taken offline by someone + if (isTemporarilyOffline() && getOfflineCause() instanceof OfflineCause.UserCause) return "computer-user-offline.png"; + // There is a "technical" reason the computer will not accept new builds + if (isOffline() || !isAcceptingTasks()) return "computer-x.png"; + return "computer.png"; } /** @@ -750,17 +747,19 @@ public /*transient*/ abstract class Computer extends Actionable implements Acces */ @Exported public String getIconClassName() { - if(isOffline()) - return "icon-computer-x"; - else - return "icon-computer"; + // The machine was taken offline by someone + if (isTemporarilyOffline() && getOfflineCause() instanceof OfflineCause.UserCause) return "icon-computer-user-offline"; + // There is a "technical" reason the computer will not accept new builds + if (isOffline() || !isAcceptingTasks()) return "icon-computer-x"; + return "icon-computer"; } public String getIconAltText() { - if(isOffline()) - return "[offline]"; - else - return "[online]"; + // The machine was taken offline by someone + if (isTemporarilyOffline() && getOfflineCause() instanceof OfflineCause.UserCause) return "[temporarily offline by user]"; + // There is a "technical" reason the computer will not accept new builds + if (isOffline() || !isAcceptingTasks()) return "[offline]"; + return "[online]"; } @Exported @@ -779,7 +778,7 @@ public /*transient*/ abstract class Computer extends Actionable implements Acces @Exported public Set getAssignedLabels() { Node node = getNode(); - return (node != null) ? node.getAssignedLabels() : Collections.EMPTY_SET; + return (node != null) ? node.getAssignedLabels() : Collections.emptySet(); } /** @@ -787,11 +786,11 @@ public /*transient*/ abstract class Computer extends Actionable implements Acces */ public List getTiedJobs() { Node node = getNode(); - return (node != null) ? node.getSelfLabel().getTiedJobs() : Collections.EMPTY_LIST; + return (node != null) ? node.getSelfLabel().getTiedJobs() : Collections.emptyList(); } public RunList getBuilds() { - return RunList.fromJobs((Iterable)Jenkins.getInstance().allItems(Job.class)).node(getNode()); + return RunList.fromJobs((Iterable)Jenkins.get().allItems(Job.class)).node(getNode()); } /** @@ -877,7 +876,7 @@ public /*transient*/ abstract class Computer extends Actionable implements Acces * 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 + * @param n number of executors */ @GuardedBy("hudson.model.Queue.lock") private void setNumExecutors(int n) { @@ -1064,20 +1063,20 @@ public /*transient*/ abstract class Computer extends Actionable implements Acces */ public final long getDemandStartMilliseconds() { long firstDemand = Long.MAX_VALUE; - for (Queue.BuildableItem item : Jenkins.getInstance().getQueue().getBuildableItems(this)) { + for (Queue.BuildableItem item : Jenkins.get().getQueue().getBuildableItems(this)) { firstDemand = Math.min(item.buildableStartMilliseconds, firstDemand); } return firstDemand; } /** - * Returns the {@link Node} description for this computer + * Returns the {@link Node} description for this computer. Empty String if the {@link Node} is {@code null}. */ @Restricted(DoNotUse.class) @Exported public @Nonnull String getDescription() { Node node = getNode(); - return (node != null) ? node.getNodeDescription() : null; + return (node != null) ? node.getNodeDescription() : ""; } @@ -1090,6 +1089,7 @@ public /*transient*/ abstract class Computer extends Actionable implements Acces public void run() { synchronized (Computer.this) { executors.remove(e); + oneOffExecutors.remove(e); addNewExecutorIfNecessary(); if (!isAlive()) { AbstractCIBase ciBase = Jenkins.getInstanceOrNull(); @@ -1203,7 +1203,7 @@ public /*transient*/ abstract class Computer extends Actionable implements Acces Node node = getNode(); if (node==null) return env; // bail out - for (NodeProperty nodeProperty: Jenkins.getInstance().getGlobalNodeProperties()) { + for (NodeProperty nodeProperty: Jenkins.get().getGlobalNodeProperties()) { nodeProperty.buildEnvVars(env,listener); } @@ -1212,7 +1212,7 @@ public /*transient*/ abstract class Computer extends Actionable implements Acces } // TODO: hmm, they don't really belong - String rootUrl = Jenkins.getInstance().getRootUrl(); + String rootUrl = Jenkins.get().getRootUrl(); if(rootUrl!=null) { env.put("HUDSON_URL", rootUrl); // Legacy. env.put("JENKINS_URL", rootUrl); @@ -1369,16 +1369,36 @@ public /*transient*/ abstract class Computer extends Actionable implements Acces // UI // // + @Restricted(DoNotUse.class) public void doRssAll( StaplerRequest req, StaplerResponse rsp ) throws IOException, ServletException { - rss(req, rsp, " all builds", getBuilds()); + RSS.rss(req, rsp, "Jenkins:" + getDisplayName() + " (all builds)", getUrl(), getBuilds()); } + @Restricted(DoNotUse.class) public void doRssFailed(StaplerRequest req, StaplerResponse rsp ) throws IOException, ServletException { - rss(req, rsp, " failed builds", getBuilds().failureOnly()); + RSS.rss(req, rsp, "Jenkins:" + getDisplayName() + " (failed builds)", getUrl(), getBuilds().failureOnly()); } - private void rss(StaplerRequest req, StaplerResponse rsp, String suffix, RunList runs) throws IOException, ServletException { - RSS.forwardToRss(getDisplayName() + suffix, getUrl(), - runs.newBuilds(), Run.FEED_ADAPTER, req, rsp); + + /** + * Retrieve the RSS feed for the last build for each project executed in this computer. + * Only the information from {@link AbstractProject} is displayed since there isn't a proper API to gather + * information about the node where the builds are executed for other sorts of projects such as Pipeline + * @since TODO + */ + @Restricted(DoNotUse.class) + public void doRssLatest( StaplerRequest req, StaplerResponse rsp ) throws IOException, ServletException { + final List lastBuilds = new ArrayList<>(); + for (AbstractProject p : Jenkins.get().allItems(AbstractProject.class)) { + if (p.getLastBuild() != null) { + for (AbstractBuild b = p.getLastBuild(); b != null; b = b.getPreviousBuild()) { + if (b.getBuiltOn() == getNode()) { + lastBuilds.add(b); + break; + } + } + } + } + RSS.rss(req, rsp, "Jenkins:" + getDisplayName() + " (latest builds)", getUrl(), RunList.fromRuns(lastBuilds)); } @RequirePOST @@ -1464,7 +1484,7 @@ public /*transient*/ abstract class Computer extends Actionable implements Acces /** * Accepts the update to the node configuration. */ - @RequirePOST + @POST public void doConfigSubmit( StaplerRequest req, StaplerResponse rsp ) throws IOException, ServletException, FormException { checkPermission(CONFIGURE); @@ -1477,7 +1497,7 @@ public /*transient*/ abstract class Computer extends Actionable implements Acces } if ((!proposedName.equals(nodeName)) - && Jenkins.getActiveInstance().getNode(proposedName) != null) { + && Jenkins.get().getNode(proposedName) != null) { throw new FormException(Messages.ComputerSet_SlaveAlreadyExists(proposedName), "name"); } @@ -1487,7 +1507,7 @@ public /*transient*/ abstract class Computer extends Actionable implements Acces } Node result = node.reconfigure(req, req.getSubmittedForm()); - Jenkins.getInstance().getNodesObject().replaceNode(this.getNode(), result); + Jenkins.get().getNodesObject().replaceNode(this.getNode(), result); // take the user back to the agent top page. rsp.sendRedirect2("../" + result.getNodeName() + '/'); @@ -1529,7 +1549,7 @@ public /*transient*/ abstract class Computer extends Actionable implements Acces public void updateByXml(final InputStream source) throws IOException, ServletException { checkPermission(CONFIGURE); Node result = (Node)Jenkins.XSTREAM2.fromXML(source); - Jenkins.getInstance().getNodesObject().replaceNode(this.getNode(), result); + Jenkins.get().getNodesObject().replaceNode(this.getNode(), result); } /** @@ -1540,9 +1560,9 @@ public /*transient*/ abstract class Computer extends Actionable implements Acces checkPermission(DELETE); Node node = getNode(); if (node != null) { - Jenkins.getInstance().removeNode(node); + Jenkins.get().removeNode(node); } else { - AbstractCIBase app = Jenkins.getInstance(); + AbstractCIBase app = Jenkins.get(); app.removeComputer(this); } return new HttpRedirect(".."); @@ -1572,6 +1592,21 @@ public /*transient*/ abstract class Computer extends Actionable implements Acces getLogText().doProgressText(req, rsp); } + @Override + @Restricted(NoExternalUse.class) + public Object getTarget() { + if (!SKIP_PERMISSION_CHECK) { + Jenkins.get().checkPermission(Jenkins.READ); + } + return this; + } + + /** + * Escape hatch for StaplerProxy-based access control + */ + @Restricted(NoExternalUse.class) + public static /* Script Console modifiable */ boolean SKIP_PERMISSION_CHECK = Boolean.getBoolean(Computer.class.getName() + ".skipPermissionCheck"); + /** * Gets the current {@link Computer} that the build is running. * This method only works when called during a build, such as by @@ -1603,7 +1638,7 @@ public /*transient*/ abstract class Computer extends Actionable implements Acces @CLIResolver public static Computer resolveForCLI( @Argument(required=true,metaVar="NAME",usage="Agent name, or empty string for master") String name) throws CmdLineException { - Jenkins h = Jenkins.getInstance(); + Jenkins h = Jenkins.get(); Computer item = h.getComputer(name); if (item==null) { List names = ComputerSet.getComputerNames(); @@ -1625,7 +1660,7 @@ public /*transient*/ abstract class Computer extends Actionable implements Acces */ @Initializer public static void relocateOldLogs() { - relocateOldLogs(Jenkins.getInstance().getRootDir()); + relocateOldLogs(Jenkins.get().getRootDir()); } /*package*/ static void relocateOldLogs(File dir) { @@ -1775,4 +1810,11 @@ public /*transient*/ abstract class Computer extends Actionable implements Acces private static final @Deprecated Permission CLOUD_PROVISION = Cloud.PROVISION; private static final Logger LOGGER = Logger.getLogger(Computer.class.getName()); + + static { + IconSet.icons.addIcon(new Icon("icon-computer-user-offline icon-sm", "16x16/computer-user-offline.png", Icon.ICON_SMALL_STYLE)); + IconSet.icons.addIcon(new Icon("icon-computer-user-offline icon-md", "24x24/computer-user-offline.png", Icon.ICON_MEDIUM_STYLE)); + IconSet.icons.addIcon(new Icon("icon-computer-user-offline icon-lg", "32x32/computer-user-offline.png", Icon.ICON_LARGE_STYLE)); + IconSet.icons.addIcon(new Icon("icon-computer-user-offline icon-xlg", "48x48/computer-user-offline.png", Icon.ICON_XLARGE_STYLE)); + } } diff --git a/core/src/main/java/hudson/model/ComputerSet.java b/core/src/main/java/hudson/model/ComputerSet.java index 1b618d0d50..7fafbf68c7 100644 --- a/core/src/main/java/hudson/model/ComputerSet.java +++ b/core/src/main/java/hudson/model/ComputerSet.java @@ -62,8 +62,9 @@ import java.util.concurrent.TimeUnit; import java.util.logging.Level; import java.util.logging.Logger; import net.sf.json.JSONObject; +import org.kohsuke.stapler.verb.POST; -import static hudson.init.InitMilestone.JOB_LOADED; +import static hudson.init.InitMilestone.JOB_CONFIG_ADAPTED; /** * Serves as the top of {@link Computer}s in the URL hierarchy. @@ -103,7 +104,7 @@ public final class ComputerSet extends AbstractModelObject implements Describabl @Exported(name="computer",inline=true) public Computer[] get_all() { - return Jenkins.getInstance().getComputers(); + return Jenkins.get().getComputers(); } public ContextMenu doChildrenContextMenu(StaplerRequest request, StaplerResponse response) throws Exception { @@ -142,7 +143,7 @@ public final class ComputerSet extends AbstractModelObject implements Describabl */ public List get_slaveNames() { return new AbstractList() { - final List nodes = Jenkins.getInstance().getNodes(); + final List nodes = Jenkins.get().getNodes(); public String get(int index) { return nodes.get(index).getNodeName(); @@ -198,12 +199,12 @@ public final class ComputerSet extends AbstractModelObject implements Describabl } public Computer getDynamic(String token, StaplerRequest req, StaplerResponse rsp) { - return Jenkins.getInstance().getComputer(token); + return Jenkins.get().getComputer(token); } @RequirePOST public void do_launchAll(StaplerRequest req, StaplerResponse rsp) throws IOException { - Jenkins.getInstance().checkPermission(Jenkins.ADMINISTER); + Jenkins.get().checkPermission(Jenkins.ADMINISTER); for(Computer c : get_all()) { if(c.isLaunchSupported()) @@ -219,7 +220,7 @@ public final class ComputerSet extends AbstractModelObject implements Describabl */ @RequirePOST public void doUpdateNow( StaplerRequest req, StaplerResponse rsp ) throws IOException, ServletException { - Jenkins.getInstance().checkPermission(Jenkins.ADMINISTER); + Jenkins.get().checkPermission(Jenkins.ADMINISTER); for (NodeMonitor nodeMonitor : NodeMonitor.getAll()) { Thread t = nodeMonitor.triggerUpdate(); @@ -238,7 +239,7 @@ public final class ComputerSet extends AbstractModelObject implements Describabl public synchronized void doCreateItem( StaplerRequest req, StaplerResponse rsp, @QueryParameter String name, @QueryParameter String mode, @QueryParameter String from ) throws IOException, ServletException { - final Jenkins app = Jenkins.getInstance(); + final Jenkins app = Jenkins.get(); app.checkPermission(Computer.CREATE); if(mode!=null && mode.equals("copy")) { @@ -257,10 +258,6 @@ public final class ComputerSet extends AbstractModelObject implements Describabl String xml = Jenkins.XSTREAM.toXML(src); Node result = (Node) Jenkins.XSTREAM.fromXML(xml); result.setNodeName(name); - if(result instanceof Slave){ //change userId too - User user = User.current(); - ((Slave)result).setUserId(user==null ? "anonymous" : user.getId()); - } result.holdOffLaunchUntilSave = true; app.addNode(result); @@ -284,11 +281,11 @@ public final class ComputerSet extends AbstractModelObject implements Describabl /** * Really creates a new agent. */ - @RequirePOST + @POST public synchronized void doDoCreateItem( StaplerRequest req, StaplerResponse rsp, @QueryParameter String name, @QueryParameter String type ) throws IOException, ServletException, FormException { - final Jenkins app = Jenkins.getInstance(); + final Jenkins app = Jenkins.get(); app.checkPermission(Computer.CREATE); String fixedName = Util.fixEmptyAndTrim(name); checkName(fixedName); @@ -315,7 +312,7 @@ public final class ComputerSet extends AbstractModelObject implements Describabl name = name.trim(); Jenkins.checkGoodName(name); - if(Jenkins.getInstance().getNode(name)!=null) + if(Jenkins.get().getNode(name)!=null) throw new Failure(Messages.ComputerSet_SlaveAlreadyExists(name)); // looks good @@ -326,7 +323,7 @@ public final class ComputerSet extends AbstractModelObject implements Describabl * Makes sure that the given name is good as an agent name. */ public FormValidation doCheckName(@QueryParameter String value) throws IOException, ServletException { - Jenkins.getInstance().checkPermission(Computer.CREATE); + Jenkins.get().checkPermission(Computer.CREATE); if(Util.fixEmpty(value)==null) return FormValidation.ok(); @@ -342,11 +339,11 @@ public final class ComputerSet extends AbstractModelObject implements Describabl /** * Accepts submission from the configuration page. */ - @RequirePOST + @POST public synchronized HttpResponse doConfigSubmit( StaplerRequest req) throws IOException, ServletException, FormException { BulkChange bc = new BulkChange(MONITORS_OWNER); try { - Jenkins.getInstance().checkPermission(Jenkins.ADMINISTER); + Jenkins.get().checkPermission(Jenkins.ADMINISTER); monitors.rebuild(req,req.getSubmittedForm(),getNodeMonitorDescriptors()); // add in the rest of instances are ignored instances @@ -372,7 +369,7 @@ public final class ComputerSet extends AbstractModelObject implements Describabl * {@link NodeMonitor}s are persisted in this file. */ private static XmlFile getConfigFile() { - return new XmlFile(new File(Jenkins.getInstance().getRootDir(),"nodeMonitors.xml")); + return new XmlFile(new File(Jenkins.get().getRootDir(),"nodeMonitors.xml")); } public Api getApi() { @@ -380,7 +377,7 @@ public final class ComputerSet extends AbstractModelObject implements Describabl } public Descriptor getDescriptor() { - return Jenkins.getInstance().getDescriptorOrDie(ComputerSet.class); + return Jenkins.get().getDescriptorOrDie(ComputerSet.class); } @Extension @@ -391,7 +388,7 @@ public final class ComputerSet extends AbstractModelObject implements Describabl public AutoCompletionCandidates doAutoCompleteCopyNewItemFrom(@QueryParameter final String value) { final AutoCompletionCandidates r = new AutoCompletionCandidates(); - for (Node n : Jenkins.getInstance().getNodes()) { + for (Node n : Jenkins.get().getNodes()) { if (n.getNodeName().startsWith(value)) r.add(n.getNodeName()); } @@ -405,7 +402,7 @@ public final class ComputerSet extends AbstractModelObject implements Describabl */ public static void initialize() {} - @Initializer(after= JOB_LOADED) + @Initializer(after= JOB_CONFIG_ADAPTED) public static void init() { // start monitoring nodes, although there's no hurry. Timer.get().schedule(new SafeTimerTask() { @@ -422,7 +419,7 @@ public final class ComputerSet extends AbstractModelObject implements Describabl @Nonnull public static List getComputerNames() { final ArrayList names = new ArrayList<>(); - for (Computer c : Jenkins.getInstance().getComputers()) { + for (Computer c : Jenkins.get().getComputers()) { if (!c.getName().isEmpty()) { names.add(c.getName()); } diff --git a/core/src/main/java/hudson/model/DependencyGraph.java b/core/src/main/java/hudson/model/DependencyGraph.java index 076b25dee8..f52fb4e1ea 100644 --- a/core/src/main/java/hudson/model/DependencyGraph.java +++ b/core/src/main/java/hudson/model/DependencyGraph.java @@ -24,14 +24,13 @@ */ package hudson.model; +import hudson.security.ACLContext; import jenkins.model.DependencyDeclarer; import com.google.common.collect.ImmutableList; import hudson.security.ACL; import jenkins.model.Jenkins; import jenkins.util.DirectedGraph; import jenkins.util.DirectedGraph.SCC; -import org.acegisecurity.context.SecurityContext; -import org.acegisecurity.context.SecurityContextHolder; import java.util.ArrayList; import java.util.Collection; @@ -41,7 +40,6 @@ import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashSet; import java.util.List; -import java.util.ListIterator; import java.util.Map; import java.util.Map.Entry; import java.util.Set; @@ -88,10 +86,9 @@ public class DependencyGraph implements Comparator { public void build() { // Set full privileges while computing to avoid missing any projects the current user cannot see. - SecurityContext saveCtx = ACL.impersonate(ACL.SYSTEM); - try { + try (ACLContext ctx = ACL.as(ACL.SYSTEM)){ this.computationalData = new HashMap<>(); - for( AbstractProject p : Jenkins.getInstance().allItems(AbstractProject.class) ) + for( AbstractProject p : Jenkins.get().allItems(AbstractProject.class) ) p.buildDependencyGraph(this); forward = finalize(forward); @@ -99,8 +96,6 @@ public class DependencyGraph implements Comparator { topologicalDagSort(); this.computationalData = null; built = true; - } finally { - SecurityContextHolder.setContext(saveCtx); } } diff --git a/core/src/main/java/hudson/model/Descriptor.java b/core/src/main/java/hudson/model/Descriptor.java index b00b60e4fb..a946de2acf 100644 --- a/core/src/main/java/hudson/model/Descriptor.java +++ b/core/src/main/java/hudson/model/Descriptor.java @@ -24,6 +24,7 @@ package hudson.model; import hudson.DescriptorExtensionList; +import hudson.Extension; import hudson.PluginWrapper; import hudson.RelativePath; import hudson.XmlFile; @@ -31,6 +32,7 @@ import hudson.BulkChange; import hudson.ExtensionList; import hudson.Util; import hudson.model.listeners.SaveableListener; +import hudson.security.Permission; import hudson.util.FormApply; import hudson.util.FormValidation.CheckMethod; import hudson.util.ReflectionUtils; @@ -59,6 +61,7 @@ import java.io.File; import java.io.IOException; import java.io.InputStream; import java.net.URL; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Collection; import java.util.LinkedHashMap; @@ -199,7 +202,7 @@ public abstract class Descriptor> implements Saveable, * Returns {@link Descriptor} whose 'clazz' is the same as {@link #getItemType() the item type}. */ public Descriptor getItemTypeDescriptor() { - return Jenkins.getInstance().getDescriptor(getItemType()); + return Jenkins.get().getDescriptor(getItemType()); } public Descriptor getItemTypeDescriptorOrDie() { @@ -207,7 +210,7 @@ public abstract class Descriptor> implements Saveable, if (it == null) { 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); + Descriptor d = Jenkins.get().getDescriptor(it); if (d==null) throw new AssertionError(it +" is missing its descriptor in "+displayName+". See https://jenkins.io/redirect/developer/class-is-missing-descriptor"); return d; @@ -217,14 +220,14 @@ public abstract class Descriptor> implements Saveable, * Returns all the descriptors that produce types assignable to the property type. */ public List getApplicableDescriptors() { - return Jenkins.getInstance().getDescriptorList(clazz); + return Jenkins.get().getDescriptorList(clazz); } /** * Returns all the descriptors that produce types assignable to the item type for a collection property. */ public List getApplicableItemDescriptors() { - return Jenkins.getInstance().getDescriptorList(getItemType()); + return Jenkins.get().getDescriptorList(getItemType()); } } @@ -246,7 +249,7 @@ public abstract class Descriptor> implements Saveable, private String resolve() { // the resolution has to be deferred to avoid ordering issue among descriptor registrations. - return Jenkins.getInstance().getDescriptor(owner).getHelpFile(fieldNameToRedirectTo); + return Jenkins.get().getDescriptor(owner).getHelpFile(fieldNameToRedirectTo); } } @@ -644,7 +647,7 @@ 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 { - final Descriptor descriptor = Jenkins.getActiveInstance().getDescriptor(actualType); + final Descriptor descriptor = Jenkins.get().getDescriptor(actualType); if (descriptor != null) { return descriptor.newInstance(Stapler.getCurrentRequest(), json); } else { @@ -670,7 +673,7 @@ public abstract class Descriptor> implements Saveable, if (isApplicable(targetTypeErasure, json)) { LOGGER.log(Level.FINE, "switching to newInstance {0} {1}", new Object[] {targetTypeErasure.getName(), json}); try { - return Jenkins.getActiveInstance().getDescriptor(targetTypeErasure).newInstance(Stapler.getCurrentRequest(), json); + return Jenkins.get().getDescriptor(targetTypeErasure).newInstance(Stapler.getCurrentRequest(), json); } catch (Exception x) { LOGGER.log(Level.WARNING, "falling back to default instantiation " + targetTypeErasure.getName() + " " + json, x); } @@ -690,7 +693,7 @@ public abstract class Descriptor> implements Saveable, private T verifyNewInstance(T t) { if (t!=null && t.getDescriptor()!=this) { // TODO: should this be a fatal error? - LOGGER.warning("Father of "+ t+" and its getDescriptor() points to two different instances. Probably malplaced @Extension. See http://hudson.361315.n4.nabble.com/Help-Hint-needed-Post-build-action-doesn-t-stay-activated-td2308833.html"); + LOGGER.warning("Father of "+ t+" and its getDescriptor() points to two different instances. Probably misplaced @Extension. See http://hudson.361315.n4.nabble.com/Help-Hint-needed-Post-build-action-doesn-t-stay-activated-td2308833.html"); } return t; } @@ -829,6 +832,20 @@ public abstract class Descriptor> implements Saveable, return GlobalConfigurationCategory.get(GlobalConfigurationCategory.Unclassified.class); } + /** + * Returns the permission type needed in order to access the {@link #getGlobalConfigPage()} for this descriptor. + * By default, requires {@link Jenkins#ADMINISTER} permission. + * For now this only applies to descriptors configured through the global ({@link jenkins.model.GlobalConfigurationCategory.Unclassified}) configuration. + * Override to return something different if appropriate. The only currently supported alternative return value is {@link Jenkins#MANAGE}. + * + * @return Permission required to globally configure this descriptor. + * @since TODO + */ + public @Nonnull + Permission getRequiredGlobalConfigPagePermission() { + return Jenkins.ADMINISTER; + } + private String getViewPage(Class clazz, String pageName, String defaultValue) { return getViewPage(clazz,Collections.singleton(pageName),defaultValue); } @@ -856,7 +873,7 @@ public abstract class Descriptor> implements Saveable, protected List getPossibleViewNames(String baseName) { List names = new ArrayList<>(); - for (Facet f : WebApp.get(Jenkins.getInstance().servletContext).facets) { + for (Facet f : WebApp.get(Jenkins.get().servletContext).facets) { if (f instanceof JellyCompatibleFacet) { JellyCompatibleFacet jcf = (JellyCompatibleFacet) f; for (String ext : jcf.getScriptExtensions()) @@ -901,7 +918,7 @@ public abstract class Descriptor> implements Saveable, } protected XmlFile getConfigFile() { - return new XmlFile(new File(Jenkins.getInstance().getRootDir(),getId()+".xml")); + return new XmlFile(new File(Jenkins.get().getRootDir(),getId()+".xml")); } /** @@ -911,7 +928,7 @@ public abstract class Descriptor> implements Saveable, * null to indicate that this descriptor came from the core. */ protected PluginWrapper getPlugin() { - return Jenkins.getInstance().getPluginManager().whichPlugin(clazz); + return Jenkins.get().getPluginManager().whichPlugin(clazz); } /** @@ -943,7 +960,7 @@ public abstract class Descriptor> implements Saveable, // TODO: generalize macro expansion and perhaps even support JEXL rsp.setContentType("text/html;charset=UTF-8"); try (InputStream in = url.openStream()) { - String literal = IOUtils.toString(in,"UTF-8"); + String literal = IOUtils.toString(in, StandardCharsets.UTF_8); rsp.getWriter().println(Util.replaceMacro(literal, Collections.singletonMap("rootURL",req.getContextPath()))); } return; @@ -1108,6 +1125,7 @@ public abstract class Descriptor> implements Saveable, * Finds a descriptor from a collection by its class name or ID. * @deprecated choose between {@link #findById} or {@link #findByDescribableClassName} */ + @Deprecated public static @CheckForNull T find(Collection list, String string) { T d = findByClassName(list, string); if (d != null) { @@ -1119,6 +1137,7 @@ public abstract class Descriptor> implements Saveable, /** * @deprecated choose between {@link #findById} or {@link #findByDescribableClassName} */ + @Deprecated public static @CheckForNull Descriptor find(String className) { return find(ExtensionList.lookup(Descriptor.class),className); } diff --git a/core/src/main/java/hudson/model/DescriptorByNameOwner.java b/core/src/main/java/hudson/model/DescriptorByNameOwner.java index 26414ca6a1..e36f61df4d 100644 --- a/core/src/main/java/hudson/model/DescriptorByNameOwner.java +++ b/core/src/main/java/hudson/model/DescriptorByNameOwner.java @@ -49,6 +49,6 @@ public interface DescriptorByNameOwner extends ModelObject { * Either {@link Descriptor#getId()} (recommended) or the short name. */ default Descriptor getDescriptorByName(String id) { - return Jenkins.getInstance().getDescriptorByName(id); + return Jenkins.get().getDescriptorByName(id); } } diff --git a/core/src/main/java/hudson/model/DirectoryBrowserSupport.java b/core/src/main/java/hudson/model/DirectoryBrowserSupport.java index 3325fe1b52..0f02f1c2a2 100644 --- a/core/src/main/java/hudson/model/DirectoryBrowserSupport.java +++ b/core/src/main/java/hudson/model/DirectoryBrowserSupport.java @@ -54,6 +54,8 @@ import javax.servlet.ServletException; import javax.servlet.http.HttpServletResponse; import jenkins.model.Jenkins; import jenkins.security.MasterToSlaveCallable; +import jenkins.security.ResourceDomainConfiguration; +import jenkins.security.ResourceDomainRootAction; import jenkins.util.SystemProperties; import jenkins.util.VirtualFile; import org.apache.commons.io.IOUtils; @@ -88,6 +90,14 @@ public final class DirectoryBrowserSupport implements HttpResponse { private final boolean serveDirIndex; private String indexFileName = "index.html"; + @Restricted(NoExternalUse.class) + public static final String CSP_PROPERTY_NAME = DirectoryBrowserSupport.class.getName() + ".CSP"; + + /** + * Keeps track of whether this has been registered from use via {@link ResourceDomainRootAction}. + */ + private ResourceDomainRootAction.Token resourceToken; + /** * @deprecated as of 1.297 * Use {@link #DirectoryBrowserSupport(ModelObject, FilePath, String, String, boolean)} @@ -137,6 +147,10 @@ public final class DirectoryBrowserSupport implements HttpResponse { } public void generateResponse(StaplerRequest req, StaplerResponse rsp, Object node) throws IOException, ServletException { + if (!ResourceDomainConfiguration.isResourceRequest(req) && ResourceDomainConfiguration.isResourceDomainConfigured()) { + resourceToken = ResourceDomainRootAction.get().getToken(this, req); + } + try { serveFile(req,rsp,base,icon,serveDirIndex); } catch (InterruptedException e) { @@ -181,7 +195,7 @@ public final class DirectoryBrowserSupport implements HttpResponse { } String path = getPath(req); - if(path.replace('\\','/').indexOf("/../")!=-1) { + if(path.replace('\\', '/').contains("/../")) { // don't serve anything other than files in the artifacts dir rsp.sendError(HttpServletResponse.SC_BAD_REQUEST); return; @@ -290,7 +304,11 @@ public final class DirectoryBrowserSupport implements HttpResponse { req.setAttribute("path", path); req.setAttribute("pattern",rest); req.setAttribute("dir", baseFile); - req.getView(this,"dir.jelly").forward(req, rsp); + if (ResourceDomainConfiguration.isResourceRequest(req)) { + req.getView(this, "plaindir.jelly").forward(req, rsp); + } else { + req.getView(this, "dir.jelly").forward(req, rsp); + } return; } @@ -308,11 +326,8 @@ public final class DirectoryBrowserSupport implements HttpResponse { boolean view = rest.equals("*view*"); if(rest.equals("*fingerprint*")) { - InputStream fingerprintInput = baseFile.open(); - try { - rsp.forward(Jenkins.getInstance().getFingerprint(Util.getDigestOf(fingerprintInput)), "/", req); - } finally { - fingerprintInput.close(); + try (InputStream fingerprintInput = baseFile.open()) { + rsp.forward(Jenkins.get().getFingerprint(Util.getDigestOf(fingerprintInput)), "/", req); } return; } @@ -339,17 +354,25 @@ public final class DirectoryBrowserSupport implements HttpResponse { // pseudo file name to let the Stapler set text/plain rsp.serveFile(req, in, lastModified, -1, length, "plain.txt"); } else { - String csp = SystemProperties.getString(DirectoryBrowserSupport.class.getName() + ".CSP", DEFAULT_CSP_VALUE); - if (!csp.trim().equals("")) { - // allow users to prevent sending this header by setting empty system property - for (String header : new String[]{"Content-Security-Policy", "X-WebKit-CSP", "X-Content-Security-Policy"}) { - rsp.setHeader(header, csp); + if (resourceToken != null) { + // redirect to second domain + rsp.sendRedirect(302, ResourceDomainRootAction.get().getRedirectUrl(resourceToken, req.getRestOfPath())); + } else { + if (!ResourceDomainConfiguration.isResourceRequest(req)) { + // if we're serving this from the main domain, set CSP headers + String csp = SystemProperties.getString(CSP_PROPERTY_NAME, DEFAULT_CSP_VALUE); + if (!csp.trim().equals("")) { + // allow users to prevent sending this header by setting empty system property + for (String header : new String[]{"Content-Security-Policy", "X-WebKit-CSP", "X-Content-Security-Policy"}) { + rsp.setHeader(header, csp); + } + } } + rsp.serveFile(req, in, lastModified, -1, length, baseFile.getName()); } - rsp.serveFile(req, in, lastModified, -1, length, baseFile.getName() ); } } - + private List> keepReadabilityOnlyOnDescendants(VirtualFile root, boolean patternUsed, List> pathFragmentsList){ Stream> pathFragmentsStream = pathFragmentsList.stream().map((List pathFragments) -> { List mappedFragments = new ArrayList<>(pathFragments.size()); @@ -413,7 +436,7 @@ public final class DirectoryBrowserSupport implements HttpResponse { * from a string like "/foo/bar/zot". */ private List buildParentPath(String pathList, int restSize) { - List r = new ArrayList(); + List r = new ArrayList<>(); StringTokenizer tokens = new StringTokenizer(pathList, "/"); int total = tokens.countTokens(); int current=1; @@ -669,7 +692,7 @@ public final class DirectoryBrowserSupport implements HttpResponse { * (this mechanism is used to skip empty intermediate directory.) */ private static List> buildChildPaths(VirtualFile cur, Locale locale) throws IOException { - List> r = new ArrayList>(); + List> r = new ArrayList<>(); VirtualFile[] files = cur.list(); Arrays.sort(files,new FileComparator(locale)); @@ -680,12 +703,12 @@ public final class DirectoryBrowserSupport implements HttpResponse { r.add(Collections.singletonList(p)); } else { // find all empty intermediate directory - List l = new ArrayList(); + List l = new ArrayList<>(); l.add(p); String relPath = Util.rawEncode(f.getName()); while(true) { // files that don't start with '.' qualify for 'meaningful files', nor SCM related files - List sub = new ArrayList(); + List sub = new ArrayList<>(); for (VirtualFile vf : f.list()) { String name = vf.getName(); if (!name.startsWith(".") && !name.equals("CVS") && !name.equals(".svn")) { @@ -714,7 +737,7 @@ public final class DirectoryBrowserSupport implements HttpResponse { Collection files = baseDir.list(pattern, null, /* TODO what is the user expectation? */true); if (!files.isEmpty()) { - List> r = new ArrayList>(files.size()); + List> r = new ArrayList<>(files.size()); for (String match : files) { List file = buildPathList(baseDir, baseDir.child(match), baseRef); r.add(file); @@ -729,7 +752,7 @@ public final class DirectoryBrowserSupport implements HttpResponse { * Builds a path list from the current workspace directory down to the specified file path. */ private static List buildPathList(VirtualFile baseDir, VirtualFile filePath, String baseRef) throws IOException { - List pathList = new ArrayList(); + List pathList = new ArrayList<>(); StringBuilder href = new StringBuilder(baseRef); buildPathList(baseDir, filePath, pathList, href); diff --git a/core/src/main/java/hudson/model/DisplayNameListener.java b/core/src/main/java/hudson/model/DisplayNameListener.java index ed5cf71495..22157290f9 100644 --- a/core/src/main/java/hudson/model/DisplayNameListener.java +++ b/core/src/main/java/hudson/model/DisplayNameListener.java @@ -41,13 +41,13 @@ public class DisplayNameListener extends ItemListener { private final static Logger LOGGER = Logger.getLogger(DisplayNameListener.class.getName()); - @Override /** * Called after the user has clicked OK in the New Job page when * Copy existing job has been selected. * The fields in item will be displayed in when the config page is loaded * displayed. */ + @Override public void onCopied(Item src, Item item) { // bug 5056825 - Display name field should be cleared when you copy a job within the same folder. if(item instanceof AbstractItem && src.getParent() == item.getParent()) { @@ -60,7 +60,6 @@ public class DisplayNameListener extends ItemListener { } } - @Override /** * Called after the user has changed the project name of a job and then * clicked on submit. @@ -69,6 +68,7 @@ public class DisplayNameListener extends ItemListener { * @param oldName the old name * @param newName the new name */ + @Override public void onRenamed(Item item, String oldName, String newName) { // bug 5077308 - Display name field should be cleared when you rename a job. if(item instanceof AbstractItem) { diff --git a/core/src/main/java/hudson/model/DownloadService.java b/core/src/main/java/hudson/model/DownloadService.java index dac79530e0..dfdd4e5c7a 100644 --- a/core/src/main/java/hudson/model/DownloadService.java +++ b/core/src/main/java/hudson/model/DownloadService.java @@ -33,7 +33,6 @@ import hudson.init.InitMilestone; import hudson.init.Initializer; import hudson.util.FormValidation; import hudson.util.FormValidation.Kind; -import hudson.util.QuotedStringTokenizer; import hudson.util.TextFile; import static java.util.concurrent.TimeUnit.DAYS; import java.io.File; @@ -44,22 +43,17 @@ import java.net.HttpURLConnection; import java.net.URL; import java.net.URLConnection; import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; -import java.util.concurrent.TimeUnit; import java.util.logging.Level; import java.util.logging.Logger; -import jenkins.model.DownloadSettings; import jenkins.model.Jenkins; import net.sf.json.JSONException; import net.sf.json.JSONObject; import org.apache.commons.io.IOUtils; import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.restrictions.NoExternalUse; -import org.kohsuke.stapler.Stapler; -import org.kohsuke.stapler.StaplerRequest; -import org.kohsuke.stapler.StaplerResponse; -import org.kohsuke.stapler.interceptor.RequirePOST; /** * Service for plugins to periodically retrieve update data files @@ -72,7 +66,7 @@ import org.kohsuke.stapler.interceptor.RequirePOST; * @author Kohsuke Kawaguchi */ @Extension -public class DownloadService extends PageDecorator { +public class DownloadService { /** * the prefix for the signature validator name @@ -80,59 +74,12 @@ public class DownloadService extends PageDecorator { private static final String signatureValidatorPrefix = "downloadable"; /** * Builds up an HTML fragment that starts all the download jobs. + * + * @deprecated browser-based download has been disabled */ + @Deprecated public String generateFragment() { - if (!DownloadSettings.usePostBack()) { - return ""; - } - if (neverUpdate) return ""; - if (doesNotSupportPostMessage()) return ""; - - StringBuilder buf = new StringBuilder(); - if(Jenkins.getInstance().hasPermission(Jenkins.READ)) { - long now = System.currentTimeMillis(); - for (Downloadable d : Downloadable.all()) { - if(d.getDue()") - .append("Behaviour.addLoadEvent(function() {") - .append(" downloadService.download(") - .append(QuotedStringTokenizer.quote(d.getId())) - .append(',') - .append(QuotedStringTokenizer.quote(mapHttps(d.getUrl()))) - .append(',') - .append("{version:").append(QuotedStringTokenizer.quote(Jenkins.VERSION)).append('}') - .append(',') - .append(QuotedStringTokenizer.quote(Stapler.getCurrentRequest().getContextPath()+'/'+getUrl()+"/byId/"+d.getId()+"/postBack")) - .append(',') - .append("null);") - .append("});") - .append(""); - d.lastAttempt = now; - } - } - } - return buf.toString(); - } - - private boolean doesNotSupportPostMessage() { - StaplerRequest req = Stapler.getCurrentRequest(); - if (req==null) return false; - - String ua = req.getHeader("User-Agent"); - if (ua==null) return false; - - // according to http://caniuse.com/#feat=x-doc-messaging, IE <=7 doesn't support pstMessage - // see http://www.useragentstring.com/pages/Internet%20Explorer/ for user agents - - // we want to err on the cautious side here. - // Because of JENKINS-15105, we can't serve signed metadata from JSON, which means we need to be - // using a modern browser as a vehicle to request these data. This check is here to prevent Jenkins - // from using older browsers that are known not to support postMessage as the vehicle. - return ua.contains("Windows") && (ua.contains(" MSIE 5.") || ua.contains(" MSIE 6.") || ua.contains(" MSIE 7.")); - } - - private String mapHttps(String url) { - return url; + return ""; } /** @@ -148,7 +95,7 @@ public class DownloadService extends PageDecorator { /** * Loads JSON from a JSONP URL. - * Metadata for downloadables and update centers is offered in two formats, both designed for download from the browser (predating {@link DownloadSettings}): + * Metadata for downloadables and update centers is offered in two formats, both designed for download from the browser (a feature since removed): * HTML using {@code postMessage} for newer browsers, and JSONP as a fallback. * Confusingly, the JSONP files are given the {@code *.json} file extension, when they are really JavaScript and should be {@code *.js}. * This method extracts the JSON from a JSONP URL, since that is what we actually want when we download from the server. @@ -165,7 +112,7 @@ public class DownloadService extends PageDecorator { ((HttpURLConnection) con).setInstanceFollowRedirects(true); } try (InputStream is = con.getInputStream()) { - String jsonp = IOUtils.toString(is, "UTF-8"); + String jsonp = IOUtils.toString(is, StandardCharsets.UTF_8); int start = jsonp.indexOf('{'); int end = jsonp.lastIndexOf('}'); if (start >= 0 && end > start) { @@ -190,7 +137,7 @@ public class DownloadService extends PageDecorator { ((HttpURLConnection) con).setInstanceFollowRedirects(true); } try (InputStream is = con.getInputStream()) { - String jsonp = IOUtils.toString(is, "UTF-8"); + String jsonp = IOUtils.toString(is, StandardCharsets.UTF_8); String preamble = "window.parent.postMessage(JSON.stringify("; int start = jsonp.indexOf(preamble); int end = jsonp.lastIndexOf("),'*');"); @@ -302,7 +249,7 @@ public class DownloadService extends PageDecorator { * URL to download. */ public String getUrl() { - return Jenkins.getInstance().getUpdateCenter().getDefaultBaseUrl()+"updates/"+url; + return Jenkins.get().getUpdateCenter().getDefaultBaseUrl()+"updates/"+url; } /** @@ -310,7 +257,7 @@ public class DownloadService extends PageDecorator { */ public List getUrls() { List updateSites = new ArrayList<>(); - for (UpdateSite site : Jenkins.getActiveInstance().getUpdateCenter().getSiteList()) { + for (UpdateSite site : Jenkins.get().getUpdateCenter().getSiteList()) { String siteUrl = site.getUrl(); int baseUrlEnd = siteUrl.indexOf("update-center.json"); if (baseUrlEnd != -1) { @@ -337,7 +284,7 @@ public class DownloadService extends PageDecorator { * This is where the retrieved file will be stored. */ public TextFile getDataFile() { - return new TextFile(new File(Jenkins.getInstance().getRootDir(),"updates/"+id)); + return new TextFile(new File(Jenkins.get().getRootDir(),"updates/"+id)); } /** @@ -368,24 +315,6 @@ public class DownloadService extends PageDecorator { return null; } - /** - * This is where the browser sends us the data. - */ - @RequirePOST - public void doPostBack(StaplerRequest req, StaplerResponse rsp) throws IOException { - DownloadSettings.checkPostBackAccess(); - long dataTimestamp = System.currentTimeMillis(); - due = dataTimestamp+getInterval(); // success or fail, don't try too often - - String json = IOUtils.toString(req.getInputStream(),"UTF-8"); - FormValidation e = load(json, dataTimestamp); - if (e.kind != Kind.OK) { - LOGGER.severe(e.renderHtml()); - throw e; - } - rsp.setContentType("text/plain"); // So browser won't try to parse response - } - private FormValidation load(String json, long dataTimestamp) throws IOException { TextFile df = getDataFile(); df.write(json); @@ -398,10 +327,10 @@ public class DownloadService extends PageDecorator { public FormValidation updateNow() throws IOException { List jsonList = new ArrayList<>(); boolean toolInstallerMetadataExists = false; - for (UpdateSite updatesite : Jenkins.getActiveInstance().getUpdateCenter().getSiteList()) { + for (UpdateSite updatesite : Jenkins.get().getUpdateCenter().getSiteList()) { String site = updatesite.getMetadataUrlForDownloadable(url); if (site == null) { - return FormValidation.warning("The update site " + site + " does not look like an update center"); + return FormValidation.warning("The update site " + updatesite.getId() + " does not look like an update center"); } String jsonString; try { @@ -497,13 +426,12 @@ public class DownloadService extends PageDecorator { SystemProperties.getLong(Downloadable.class.getName()+".defaultInterval", DAYS.toMillis(1)); } + // TODO this was previously referenced in the browser-based download, but should probably be checked for the server-based download public static boolean neverUpdate = SystemProperties.getBoolean(DownloadService.class.getName()+".never"); /** * May be used to temporarily disable signature checking on {@link DownloadService} and {@link UpdateCenter}. * Useful when upstream signatures are broken, such as due to expired certificates. - * Should only be used when {@link DownloadSettings#isUseBrowser}; - * disabling signature checks for in-browser downloads is very dangerous as unprivileged users could submit spoofed metadata! */ public static boolean signatureCheck = !SystemProperties.getBoolean(DownloadService.class.getName()+".noSignatureCheck"); } diff --git a/core/src/main/java/hudson/model/Executor.java b/core/src/main/java/hudson/model/Executor.java index b466779e1a..e69fa2100b 100644 --- a/core/src/main/java/hudson/model/Executor.java +++ b/core/src/main/java/hudson/model/Executor.java @@ -39,6 +39,7 @@ import jenkins.model.Jenkins; import org.acegisecurity.Authentication; import org.kohsuke.stapler.HttpResponse; import org.kohsuke.stapler.HttpResponses; +import org.kohsuke.stapler.QueryParameter; import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerResponse; import org.kohsuke.stapler.export.Exported; @@ -338,9 +339,7 @@ public class Executor extends Thread implements ModelObject { lock.writeLock().unlock(); } - ACL.impersonate(ACL.SYSTEM); - - try { + try (ACLContext ctx = ACL.as(ACL.SYSTEM)) { SubTask task; // transition from idle to building. // perform this state change as an atomic operation wrt other queue operations @@ -767,7 +766,7 @@ public class Executor extends Thread implements ModelObject { * string like "3 minutes" "1 day" etc. */ public String getTimestampString() { - return Util.getPastTimeString(getElapsedTime()); + return Util.getTimeSpanString(getElapsedTime()); } /** @@ -830,7 +829,7 @@ public class Executor extends Thread implements ModelObject { /** * @deprecated as of 1.489 - * Use {@link #doStop()}. + * Use {@link #doStop()} or {@link #doStopBuild(String)}. */ @RequirePOST @Deprecated @@ -839,17 +838,38 @@ public class Executor extends Thread implements ModelObject { } /** - * Stops the current build. + * Stops the current build.
    + * You can use {@link #doStopBuild(String)} instead to ensure what will be + * interrupted is actually what you want to interrupt. * * @since 1.489 + * @see #doStopBuild(String) */ @RequirePOST public HttpResponse doStop() { + return doStopBuild(null); + } + + /** + * Stops the current build, if matching the specified external id + * (or no id is specified, or the current {@link Executable} is not a {@link Run}). + * + * @param runExtId + * if not null, the externalizable id ({@link Run#getExternalizableId()}) + * of the build the user expects to interrupt + * @since TODO + */ + @RequirePOST + @Restricted(NoExternalUse.class) + public HttpResponse doStopBuild(@CheckForNull @QueryParameter(fixEmpty = true) String runExtId) { lock.writeLock().lock(); // need write lock as interrupt will change the field try { if (executable != null) { - getParentOf(executable).getOwnerTask().checkAbortPermission(); - interrupt(); + if (runExtId == null || runExtId.isEmpty() || ! (executable instanceof Run) + || (executable instanceof Run && runExtId.equals(((Run) executable).getExternalizableId()))) { + getParentOf(executable).getOwnerTask().checkAbortPermission(); + interrupt(); + } } } finally { lock.writeLock().unlock(); diff --git a/core/src/main/java/hudson/model/Failure.java b/core/src/main/java/hudson/model/Failure.java index 37fc2696b5..4fb00809f0 100644 --- a/core/src/main/java/hudson/model/Failure.java +++ b/core/src/main/java/hudson/model/Failure.java @@ -67,8 +67,8 @@ public class Failure extends RuntimeException implements HttpResponse { if(pre) req.setAttribute("pre",true); if (node instanceof AbstractItem) // Maintain ancestors - rsp.forward(Jenkins.getInstance(), ((AbstractItem)node).getUrl() + "error", req); + rsp.forward(Jenkins.get(), ((AbstractItem)node).getUrl() + "error", req); else - rsp.forward(node instanceof AbstractModelObject ? node : Jenkins.getInstance() ,"error", req); + rsp.forward(node instanceof AbstractModelObject ? node : Jenkins.get() ,"error", req); } } diff --git a/core/src/main/java/hudson/model/FileParameterValue.java b/core/src/main/java/hudson/model/FileParameterValue.java index f911927285..4e059196e6 100644 --- a/core/src/main/java/hudson/model/FileParameterValue.java +++ b/core/src/main/java/hudson/model/FileParameterValue.java @@ -37,6 +37,7 @@ import java.io.UnsupportedEncodingException; import java.nio.file.Files; import java.nio.file.InvalidPathException; import java.nio.file.Path; +import java.util.regex.Pattern; import javax.servlet.ServletException; import org.apache.commons.fileupload.FileItem; @@ -65,6 +66,8 @@ import org.kohsuke.stapler.StaplerResponse; */ public class FileParameterValue extends ParameterValue { private static final String FOLDER_NAME = "fileParameters"; + private static final Pattern PROHIBITED_DOUBLE_DOT = Pattern.compile(".*[\\\\/]\\.\\.[\\\\/].*"); + private static final long serialVersionUID = -143427023159076073L; /** * Escape hatch for SECURITY-1074, fileParameter used to escape their expected folder. @@ -162,7 +165,7 @@ public class FileParameterValue extends ParameterValue { if (ws == null) { throw new IllegalStateException("The workspace should be created when setUp method is called"); } - if (!ALLOW_FOLDER_TRAVERSAL_OUTSIDE_WORKSPACE && !ws.isDescendant(location)) { + if (!ALLOW_FOLDER_TRAVERSAL_OUTSIDE_WORKSPACE && (PROHIBITED_DOUBLE_DOT.matcher(location).matches() || !ws.isDescendant(location))) { listener.error("Rejecting file path escaping base directory with relative path: " + location); // force the build to fail return null; diff --git a/core/src/main/java/hudson/model/Fingerprint.java b/core/src/main/java/hudson/model/Fingerprint.java index e9d296b160..e628c6bd54 100644 --- a/core/src/main/java/hudson/model/Fingerprint.java +++ b/core/src/main/java/hudson/model/Fingerprint.java @@ -129,7 +129,7 @@ public class Fingerprint implements ModelObject, Saveable { private boolean hasPermissionToDiscoverBuild() { // We expose the data to Jenkins administrators in order to // let them manage the data for deleted jobs (also works for SYSTEM) - final Jenkins instance = Jenkins.getInstance(); + final Jenkins instance = Jenkins.get(); if (instance.hasPermission(Jenkins.ADMINISTER)) { return true; } @@ -149,7 +149,7 @@ public class Fingerprint implements ModelObject, Saveable { */ @WithBridgeMethods(value=AbstractProject.class, castRequired=true) public Job getJob() { - return Jenkins.getInstance().getItemByFullName(name, Job.class); + return Jenkins.get().getItemByFullName(name, Job.class); } /** @@ -201,7 +201,7 @@ public class Fingerprint implements ModelObject, Saveable { * belongs to MavenModuleSet. */ public boolean belongsTo(Job job) { - Item p = Jenkins.getInstance().getItemByFullName(name); + Item p = Jenkins.get().getItemByFullName(name); while(p!=null) { if(p==job) return true; @@ -828,7 +828,7 @@ public class Fingerprint implements ModelObject, Saveable { } private void locationChanged(Item item, String oldName, String newName) { if (item instanceof Job) { - Job p = Jenkins.getInstance().getItemByFullName(newName, Job.class); + Job p = Jenkins.get().getItemByFullName(newName, Job.class); if (p != null) { RunList builds = p.getBuilds(); for (Run build : builds) { @@ -943,7 +943,7 @@ public class Fingerprint implements ModelObject, Saveable { */ public @Nonnull String getTimestampString() { long duration = System.currentTimeMillis()-timestamp.getTime(); - return Util.getPastTimeString(duration); + return Util.getTimeSpanString(duration); } /** @@ -993,7 +993,7 @@ public class Fingerprint implements ModelObject, Saveable { @Exported(name="usage") public @Nonnull List _getUsages() { List r = new ArrayList<>(); - final Jenkins instance = Jenkins.getInstance(); + final Jenkins instance = Jenkins.get(); for (Entry e : usages.entrySet()) { final String itemName = e.getKey(); if (instance.hasPermission(Jenkins.ADMINISTER) || canDiscoverItem(itemName)) { @@ -1060,7 +1060,7 @@ public class Fingerprint implements ModelObject, Saveable { return true; for (Entry e : usages.entrySet()) { - Job j = Jenkins.getInstance().getItemByFullName(e.getKey(),Job.class); + Job j = Jenkins.get().getItemByFullName(e.getKey(),Job.class); if(j==null) continue; @@ -1087,7 +1087,7 @@ public class Fingerprint implements ModelObject, Saveable { boolean modified = false; for (Entry e : new Hashtable<>(usages).entrySet()) {// copy because we mutate - Job j = Jenkins.getInstance().getItemByFullName(e.getKey(),Job.class); + Job j = Jenkins.get().getItemByFullName(e.getKey(),Job.class); if(j==null) {// no such job any more. recycle the record modified = true; usages.remove(e.getKey()); @@ -1203,9 +1203,7 @@ public class Fingerprint implements ModelObject, Saveable { public int compare(FingerprintFacet o1, FingerprintFacet o2) { long a = o1.getTimestamp(); long b = o2.getTimestamp(); - if (a < b) return -1; - if (a == b) return 0; - return 1; + return Long.compare(a, b); } }); return r; @@ -1349,7 +1347,7 @@ public class Fingerprint implements ModelObject, Saveable { */ private static @Nonnull File getFingerprintFile(@Nonnull byte[] md5sum) { assert md5sum.length==16; - return new File( Jenkins.getInstance().getRootDir(), + return new File( Jenkins.get().getRootDir(), "fingerprints/"+ Util.toHexString(md5sum,0,1)+'/'+Util.toHexString(md5sum,1,1)+'/'+Util.toHexString(md5sum,2,md5sum.length-2)+".xml"); } @@ -1429,7 +1427,7 @@ public class Fingerprint implements ModelObject, Saveable { * @return {@code true} if the user can discover the item */ private static boolean canDiscoverItem(@Nonnull final String fullName) { - final Jenkins jenkins = Jenkins.getInstance(); + final Jenkins jenkins = Jenkins.get(); // Fast check to avoid security context switches Item item = null; diff --git a/core/src/main/java/hudson/model/FingerprintMap.java b/core/src/main/java/hudson/model/FingerprintMap.java index 7760bd0ada..2727d22174 100644 --- a/core/src/main/java/hudson/model/FingerprintMap.java +++ b/core/src/main/java/hudson/model/FingerprintMap.java @@ -50,7 +50,7 @@ public final class FingerprintMap extends KeyedDataStorage i } public DescriptorImpl getDescriptor() { - return (DescriptorImpl)Jenkins.getInstance().getDescriptorOrDie(getClass()); + return (DescriptorImpl)Jenkins.get().getDescriptorOrDie(getClass()); } /** @@ -67,6 +67,7 @@ public class FreeStyleProject extends Project i * @deprecated as of 2.0 * Use injection */ + @Deprecated @Restricted(NoExternalUse.class) public static /*almost final*/ DescriptorImpl DESCRIPTOR; diff --git a/core/src/main/java/hudson/model/HealthReport.java b/core/src/main/java/hudson/model/HealthReport.java index 7b67538272..461264ed6a 100644 --- a/core/src/main/java/hudson/model/HealthReport.java +++ b/core/src/main/java/hudson/model/HealthReport.java @@ -63,6 +63,8 @@ public class HealthReport implements Serializable, Comparable { private static final String HEALTH_UNKNOWN_IMG = "empty.png"; private static final Map iconIMGToClassMap = new HashMap<>(); + private static final long serialVersionUID = 7451361788415642230L; + static { iconIMGToClassMap.put(HEALTH_OVER_80_IMG, HEALTH_OVER_80); iconIMGToClassMap.put(HEALTH_61_TO_80_IMG, HEALTH_61_TO_80); @@ -82,11 +84,11 @@ public class HealthReport implements Serializable, Comparable { private String iconClassName; /** - * The path to the icon corresponding to this health score or null to use the default icon + * The path to the icon corresponding to this health score or {@code null} to use the default icon * corresponding to the current health score. *

    * If the path begins with a '/' then it will be the absolute path, otherwise the image is assumed to be in one of - * /images/16x16/, /images/24x24/ or /images/32x32/ depending on the icon + * {@code /images/16x16/}, {@code /images/24x24/} or {@code /images/32x32/} depending on the icon * size selected by the user. */ private String iconUrl; @@ -108,12 +110,12 @@ public class HealthReport implements Serializable, Comparable { * Create a new HealthReport. * * @param score The percentage health score (from 0 to 100 inclusive). - * @param iconUrl The path to the icon corresponding to this {@link Action}'s health or null to + * @param iconUrl The path to the icon corresponding to this {@link Action}'s health or {@code null} to * display the default icon corresponding to the current health score. *

    * If the path begins with a '/' then it will be the absolute path, otherwise the image is - * assumed to be in one of /images/16x16/, /images/24x24/ or - * /images/32x32/ depending on the icon size selected by the user. + * assumed to be in one of {@code /images/16x16/}, {@code /images/24x24/} or + * {@code /images/32x32/} depending on the icon size selected by the user. * When calculating the url to display for absolute paths, the getIconUrl(String) method * will replace /32x32/ in the path with the appropriate size. * @param description The health icon's tool-tip. @@ -129,12 +131,12 @@ public class HealthReport implements Serializable, Comparable { * Create a new HealthReport. * * @param score The percentage health score (from 0 to 100 inclusive). - * @param iconUrl The path to the icon corresponding to this {@link Action}'s health or null to + * @param iconUrl The path to the icon corresponding to this {@link Action}'s health or {@code null} to * display the default icon corresponding to the current health score. *

    * If the path begins with a '/' then it will be the absolute path, otherwise the image is - * assumed to be in one of /images/16x16/, /images/24x24/ or - * /images/32x32/ depending on the icon size selected by the user. + * assumed to be in one of {@code /images/16x16/}, {@code /images/24x24/} or + * {@code /images/32x32/} depending on the icon size selected by the user. * When calculating the url to display for absolute paths, the getIconUrl(String) method * will replace /32x32/ in the path with the appropriate size. * @param description The health icon's tool-tip. @@ -322,12 +324,9 @@ public class HealthReport implements Serializable, Comparable { return false; } - /** - * {@inheritDoc} - */ @Override public int compareTo(HealthReport o) { - return (this.score < o.score ? -1 : (this.score == o.score ? 0 : 1)); + return Integer.compare(this.score, o.score); } /** diff --git a/core/src/main/java/hudson/model/HealthReportingAction.java b/core/src/main/java/hudson/model/HealthReportingAction.java index a247ba45fb..024c948872 100644 --- a/core/src/main/java/hudson/model/HealthReportingAction.java +++ b/core/src/main/java/hudson/model/HealthReportingAction.java @@ -43,7 +43,7 @@ public interface HealthReportingAction extends Action { * * @return * The health report for this instance of the Action or - * null if the Action does not want to + * {@code null} if the Action does not want to * contribute a HealthReport. */ HealthReport getBuildHealth(); diff --git a/core/src/main/java/hudson/model/Hudson.java b/core/src/main/java/hudson/model/Hudson.java index cf72f3b336..b20ddd349f 100644 --- a/core/src/main/java/hudson/model/Hudson.java +++ b/core/src/main/java/hudson/model/Hudson.java @@ -74,7 +74,7 @@ public class Hudson extends Jenkins { @CLIResolver @Nullable public static Hudson getInstance() { - return (Hudson)Jenkins.getInstance(); + return (Hudson)Jenkins.get(); } public Hudson(File root, ServletContext context) throws IOException, InterruptedException, ReactorException { @@ -305,7 +305,7 @@ public class Hudson extends Jenkins { */ @Deprecated public static boolean isAdmin() { - return Jenkins.getInstance().getACL().hasPermission(ADMINISTER); + return Jenkins.get().getACL().hasPermission(ADMINISTER); } /** diff --git a/core/src/main/java/hudson/model/Item.java b/core/src/main/java/hudson/model/Item.java index be8a5495e1..d4d0a6dcc0 100644 --- a/core/src/main/java/hudson/model/Item.java +++ b/core/src/main/java/hudson/model/Item.java @@ -140,11 +140,10 @@ public interface Item extends PersistenceRoot, SearchableModelObject, AccessCont * @param g * The {@link ItemGroup} instance used as context to evaluate the relative name of this item * @return - * The name of the current item, relative to p. Nested {@link ItemGroup}s are separated by {@code /} character. + * The name of the current item, relative to {@code g}, or {@code null} if one of the + * item's parents is not an {@link Item}. Nested {@link ItemGroup}s are separated by a + * {@code /} character (e.g., {@code ../foo/bar}). * @since 1.419 - * @return - * String like "../foo/bar". - * {@code null} if one of item parents is not an {@link Item}. */ @Nullable default String getRelativeNameFrom(@CheckForNull ItemGroup g) { @@ -201,7 +200,7 @@ public interface Item extends PersistenceRoot, SearchableModelObject, AccessCont */ @Deprecated default String getAbsoluteUrl() { - String r = Jenkins.getInstance().getRootUrl(); + String r = Jenkins.get().getRootUrl(); if(r==null) throw new IllegalStateException("Root URL isn't configured yet. Cannot compute absolute URL."); return Util.encode(r+getUrl()); diff --git a/core/src/main/java/hudson/model/ItemGroup.java b/core/src/main/java/hudson/model/ItemGroup.java index 2397587a0b..f79df6bae4 100644 --- a/core/src/main/java/hudson/model/ItemGroup.java +++ b/core/src/main/java/hudson/model/ItemGroup.java @@ -25,9 +25,13 @@ package hudson.model; import hudson.model.listeners.ItemListener; import java.io.IOException; +import java.util.ArrayList; import java.util.Collection; import java.io.File; import java.util.List; +import java.util.function.Predicate; +import java.util.stream.Collectors; +import java.util.stream.Stream; import javax.annotation.CheckForNull; import org.acegisecurity.AccessDeniedException; @@ -55,6 +59,33 @@ public interface ItemGroup extends PersistenceRoot, ModelObject */ Collection getItems(); + /** + * Gets all the items in this collection in a read-only view + * that matches supplied Predicate + * @since TODO + */ + default Collection getItems(Predicate pred) { + return getItemsStream(pred) + .collect(Collectors.toList()); + } + + /** + * Gets a read-only stream of all the items in this collection + * @since TODO + */ + default Stream getItemsStream() { + return getItems().stream(); + } + + /** + * Gets a read-only stream of all the items in this collection + * that matches supplied Predicate + * @since TODO + */ + default Stream getItemsStream(Predicate pred) { + return getItemsStream().filter(pred); + } + /** * Returns the path relative to the context root, * like "foo/bar/zot/". Note no leading slash but trailing slash. @@ -99,6 +130,14 @@ public interface ItemGroup extends PersistenceRoot, ModelObject return Items.getAllItems(this, type); } + /** + * Similar to {@link #getAllItems(Class)} with additional predicate filtering + * @since TODO + */ + default List getAllItems(Class type, Predicate pred) { + return Items.getAllItems(this, type, pred); + } + /** * Gets all the {@link Item}s unordered, lazily and recursively in the {@link ItemGroup} tree * and filter them by the given type. @@ -108,6 +147,15 @@ public interface ItemGroup extends PersistenceRoot, ModelObject return Items.allItems(this, type); } + /** + * Gets all the {@link Item}s unordered, lazily and recursively in the {@link ItemGroup} tree + * and filter them by the given type and given predicate + * @since TODO + */ + default Iterable allItems(Class type, Predicate pred) { + return Items.allItems(this, type, pred); + } + /** * Gets all the items recursively. * @since 2.93 diff --git a/core/src/main/java/hudson/model/ItemGroupMixIn.java b/core/src/main/java/hudson/model/ItemGroupMixIn.java index 0ac4d2a3c1..e9f43f8805 100644 --- a/core/src/main/java/hudson/model/ItemGroupMixIn.java +++ b/core/src/main/java/hudson/model/ItemGroupMixIn.java @@ -37,7 +37,6 @@ import org.kohsuke.stapler.StaplerResponse; import javax.servlet.ServletException; import javax.servlet.http.HttpServletResponse; -import javax.xml.transform.Source; import javax.xml.transform.TransformerException; import javax.xml.transform.stream.StreamResult; import javax.xml.transform.stream.StreamSource; @@ -175,7 +174,7 @@ public abstract class ItemGroupMixIn { String from = req.getParameter("from"); // resolve a name to Item - Item src = Jenkins.getInstance().getItem(from, parent); + Item src = Jenkins.get().getItem(from, parent); if(src==null) { if(Util.fixEmpty(from)==null) throw new Failure("Specify which job to copy"); @@ -255,7 +254,7 @@ public abstract class ItemGroupMixIn { add(result); ItemListener.fireOnCopied(src,result); - Jenkins.getInstance().rebuildDependencyGraphAsync(); + Jenkins.get().rebuildDependencyGraphAsync(); return result; } @@ -263,7 +262,7 @@ public abstract class ItemGroupMixIn { public synchronized TopLevelItem createProjectFromXML(String name, InputStream xml) throws IOException { acl.checkPermission(Item.CREATE); - Jenkins.getInstance().getProjectNamingStrategy().checkName(name); + Jenkins.get().getProjectNamingStrategy().checkName(name); Items.verifyItemDoesNotAlreadyExist(parent, name, null); // place it as config.xml @@ -287,7 +286,7 @@ public abstract class ItemGroupMixIn { add(result); ItemListener.fireOnCreated(result); - Jenkins.getInstance().rebuildDependencyGraphAsync(); + Jenkins.get().rebuildDependencyGraphAsync(); return result; } catch (TransformerException | SAXException e) { @@ -310,14 +309,14 @@ public abstract class ItemGroupMixIn { type.checkApplicableIn(parent); acl.getACL().checkCreatePermission(parent, type); - Jenkins.getInstance().getProjectNamingStrategy().checkName(name); + Jenkins.get().getProjectNamingStrategy().checkName(name); Items.verifyItemDoesNotAlreadyExist(parent, name, null); TopLevelItem item = type.newInstance(parent, name); item.onCreatedFromScratch(); item.save(); add(item); - Jenkins.getInstance().rebuildDependencyGraphAsync(); + Jenkins.get().rebuildDependencyGraphAsync(); if (notify) ItemListener.fireOnCreated(item); diff --git a/core/src/main/java/hudson/model/ItemVisitor.java b/core/src/main/java/hudson/model/ItemVisitor.java index bfd2bbc64d..e33a6849b0 100644 --- a/core/src/main/java/hudson/model/ItemVisitor.java +++ b/core/src/main/java/hudson/model/ItemVisitor.java @@ -56,6 +56,6 @@ public abstract class ItemVisitor { * To walk a subtree, call {@link #onItemGroup(ItemGroup)} or {@link #onItem(Item)} */ public final void walk() { - onItemGroup(Jenkins.getInstance()); + onItemGroup(Jenkins.get()); } } diff --git a/core/src/main/java/hudson/model/Items.java b/core/src/main/java/hudson/model/Items.java index 5bef4b0045..8c31c0bf1d 100644 --- a/core/src/main/java/hudson/model/Items.java +++ b/core/src/main/java/hudson/model/Items.java @@ -41,13 +41,13 @@ 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 java.util.function.Predicate; import javax.annotation.CheckForNull; import javax.annotation.Nonnull; import jenkins.model.DirectlyModifiableTopLevelItemGroup; @@ -153,7 +153,7 @@ public class Items { * Returns all the registered {@link TopLevelItemDescriptor}s. */ public static DescriptorExtensionList all() { - return Jenkins.getInstance().getDescriptorList(TopLevelItem.class); + return Jenkins.get().getDescriptorList(TopLevelItem.class); } /** @@ -179,7 +179,7 @@ public class Items { acl = ((AccessControlled) c).getACL(); } else { // fall back to root - acl = Jenkins.getInstance().getACL(); + acl = Jenkins.get().getACL(); } for (TopLevelItemDescriptor d: all()) { if (acl.hasCreatePermission(a, c, d) && d.isApplicableIn(c)) { @@ -192,6 +192,7 @@ public class Items { /** * @deprecated Underspecified what the parameter is. {@link Descriptor#getId}? A {@link Describable} class name? */ + @Deprecated public static TopLevelItemDescriptor getDescriptor(String fqcn) { return Descriptor.find(all(), fqcn); } @@ -222,13 +223,10 @@ public class Items { * Does the opposite of {@link #toNameList(Collection)}. */ public static List fromNameList(ItemGroup context, @Nonnull String list, @Nonnull Class type) { - final Jenkins jenkins = Jenkins.getInstance(); + final Jenkins jenkins = Jenkins.get(); List r = new ArrayList<>(); - if (jenkins == null) { - return r; - } - + StringTokenizer tokens = new StringTokenizer(list,","); while(tokens.hasMoreTokens()) { String fullName = tokens.nextToken().trim(); @@ -282,8 +280,8 @@ public class Items { * Computes the relative name of list of items after a rename or move occurred. * Used to manage job references as names in plugins to support {@link hudson.model.listeners.ItemListener#onLocationChanged}. *

    - * In a hierarchical context, when a plugin has a reference to a job as ../foo/bar this method will - * handle the relative path as "foo" is renamed to "zot" to compute ../zot/bar + * In a hierarchical context, when a plugin has a reference to a job as {@code ../foo/bar} this method will + * handle the relative path as "foo" is renamed to "zot" to compute {@code ../zot/bar} * * @param oldFullName the old full name of the item * @param newFullName the new full name of the item @@ -396,26 +394,44 @@ public class Items { *

    * 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. + * + * @param root Root node to start searching from + * @param type Given type of of items being searched for + * @return List of items matching given criteria * * @since 1.512 */ public static List getAllItems(final ItemGroup root, Class type) { + return getAllItems(root ,type, t -> true); + } + + /** + * Similar to {@link #getAllItems(ItemGroup, Class)} but with a predicate to pre-filter items to + * avoid checking ACLs unnecessarily and returning items not required by the caller + * @param root Root node to start searching from + * @param type Given type of of items being searched for + * @param pred Predicate condition to filter items + * @return List of items matching given criteria + * + * @since TODO + */ + public static List getAllItems(final ItemGroup root, Class type, Predicate pred) { List r = new ArrayList<>(); - getAllItems(root, type, r); + getAllItems(root, type, r, pred); return r; } - private static void getAllItems(final ItemGroup root, Class type, List r) { + private static void getAllItems(final ItemGroup root, Class type, List r, Predicate pred) { List items = new ArrayList<>(((ItemGroup) root).getItems()); // because we add items depth first, we can use the quicker BY_NAME comparison items.sort(BY_NAME); for (Item i : items) { - if (type.isInstance(i)) { + if (type.isInstance(i) && pred.test(type.cast(i))) { if (i.hasPermission(Item.READ)) { r.add(type.cast(i)); } } if (i instanceof ItemGroup) { - getAllItems((ItemGroup) i, type, r); + getAllItems((ItemGroup) i, type, r, pred); } } } @@ -437,6 +453,24 @@ public class Items { return allItems(Jenkins.getAuthentication(), root, type); } + /** + * Gets a read-only view of all the {@link Item}s recursively matching type and predicate + * 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. + * @param the predicate. + * @return An {@link Iterable} for all items. + * @since TODO + */ + public static Iterable allItems(ItemGroup root, Class type, Predicate pred) { + return allItems(Jenkins.getAuthentication(), root, type, pred); + } /** * Gets a read-only view all the {@link Item}s recursively in the {@link ItemGroup} tree visible to the supplied @@ -452,7 +486,26 @@ public class Items { * @since 2.37 */ public static Iterable allItems(Authentication authentication, ItemGroup root, Class type) { - return new AllItemsIterable<>(root, authentication, type); + return allItems(authentication, root, type, t -> true); + } + + /** + * Gets a read-only view all the {@link Item}s recursively matching supplied type and predicate conditions + * 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. + * @param pred the predicate. + * @return An {@link Iterable} for all items. + * @since TODO + */ + public static Iterable allItems(Authentication authentication, ItemGroup root, Class type, Predicate pred) { + return new AllItemsIterable<>(root, authentication, type, pred); } /** @@ -466,11 +519,11 @@ public class Items { */ public static @CheckForNull T findNearest(Class type, String name, ItemGroup context) { List names = new ArrayList<>(); - for (T item: Jenkins.getInstance().allItems(type)) { + for (T item: Jenkins.get().allItems(type)) { names.add(item.getRelativeNameFrom(context)); } String nearest = EditDistance.findNearest(name, names); - return Jenkins.getInstance().getItem(nearest, context, type); + return Jenkins.get().getItem(nearest, context, type); } /** @@ -521,16 +574,18 @@ public class Items { * The type of item we want to return. */ private final Class type; + /** + * Predicate to filter items with + */ + private final Predicate pred; - private AllItemsIterable(ItemGroup root, Authentication authentication, Class type) { + private AllItemsIterable(ItemGroup root, Authentication authentication, Class type, Predicate pred) { this.root = root; this.authentication = authentication; this.type = type; + this.pred = pred; } - /** - * {@inheritDoc} - */ @Override public Iterator iterator() { return new AllItemsIterator(); @@ -557,22 +612,17 @@ public class Items { stack.push(root); } - /** - * {@inheritDoc} - */ @Override public void remove() { throw new UnsupportedOperationException(); } - /** - * {@inheritDoc} - */ @Override public boolean hasNext() { if (next != null) { return true; } + Predicate search = t -> t instanceof ItemGroup || (type.isInstance(t) && pred.test(type.cast(t))); while (true) { if (delegate == null || !delegate.hasNext()) { if (stack.isEmpty()) { @@ -581,13 +631,13 @@ public class Items { 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(); + delegate = group.getItems(search).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(); + delegate = group.getItems(search).iterator(); } } } @@ -596,7 +646,7 @@ public class Items { if (item instanceof ItemGroup) { stack.push((ItemGroup) item); } - if (type.isInstance(item)) { + if (type.isInstance(item) && pred.test(type.cast(item))) { next = type.cast(item); return true; } @@ -604,9 +654,6 @@ public class Items { } } - /** - * {@inheritDoc} - */ @Override public T next() { if (!hasNext()) { diff --git a/core/src/main/java/hudson/model/JDK.java b/core/src/main/java/hudson/model/JDK.java index fbb567c70e..9a243cb2ba 100644 --- a/core/src/main/java/hudson/model/JDK.java +++ b/core/src/main/java/hudson/model/JDK.java @@ -64,6 +64,7 @@ public final class JDK extends ToolInstallation implements NodeSpecific, En * @since 1.577 */ public static final String DEFAULT_NAME = "(System)"; + private static final long serialVersionUID = -3318291200160313357L; @Restricted(NoExternalUse.class) public static boolean isDefaultName(String name) { @@ -176,17 +177,17 @@ public final class JDK extends ToolInstallation implements NodeSpecific, En } public @Override JDK[] getInstallations() { - return Jenkins.getInstance().getJDKs().toArray(new JDK[0]); + return Jenkins.get().getJDKs().toArray(new JDK[0]); } public @Override void setInstallations(JDK... jdks) { - Jenkins.getInstance().setJDKs(Arrays.asList(jdks)); + Jenkins.get().setJDKs(Arrays.asList(jdks)); } @Override public List getDefaultInstallers() { try { - Class jdkInstallerClass = Jenkins.getInstance().getPluginManager() + Class jdkInstallerClass = Jenkins.get().getPluginManager() .uberClassLoader.loadClass("hudson.tools.JDKInstaller").asSubclass(ToolInstaller.class); Constructor constructor = jdkInstallerClass.getConstructor(String.class, boolean.class); return Collections.singletonList(constructor.newInstance(null, false)); diff --git a/core/src/main/java/hudson/model/Job.java b/core/src/main/java/hudson/model/Job.java index 89250109bb..caddc5ca60 100644 --- a/core/src/main/java/hudson/model/Job.java +++ b/core/src/main/java/hudson/model/Job.java @@ -115,6 +115,7 @@ import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerResponse; import org.kohsuke.stapler.export.Exported; import org.kohsuke.stapler.interceptor.RequirePOST; +import org.kohsuke.stapler.verb.POST; import static javax.servlet.http.HttpServletResponse.SC_BAD_REQUEST; import static javax.servlet.http.HttpServletResponse.SC_NO_CONTENT; @@ -159,6 +160,7 @@ public abstract class Job, RunT extends Run, RunT extends Run, RunT extends Run * Much of Hudson assumes that the build number is unique and monotonic, so @@ -546,7 +548,7 @@ public abstract class Job, RunT extends Run> getProperties() { Map result = Descriptor.toMap((Iterable) properties); if (logRotator != null) { - result.put(Jenkins.getActiveInstance().getDescriptorByType(BuildDiscarderProperty.DescriptorImpl.class), new BuildDiscarderProperty(logRotator)); + result.put(Jenkins.get().getDescriptorByType(BuildDiscarderProperty.DescriptorImpl.class), new BuildDiscarderProperty(logRotator)); } return result; } @@ -663,7 +665,6 @@ public abstract class Job, RunT extends Run, RunT extends Run, RunT extends Run, RunT extends Run getLastBuildsOverThreshold(int numberOfBuilds, Result threshold) { - - List result = new ArrayList<>(numberOfBuilds); - RunT r = getLastBuild(); - while (r != null && result.size() < numberOfBuilds) { - if (!r.isBuilding() && - (r.getResult() != null && r.getResult().isBetterOrEqualTo(threshold))) { - result.add(r); - } - r = r.getPreviousBuild(); - } - - return result; + return r.getBuildsOverThreshold(numberOfBuilds, threshold); } /** @@ -1318,7 +1305,7 @@ public abstract class Job, RunT extends Run, RunT extends Run, RunT extends Run, RunT extends Run, RunT extends Run> implements ReconfigurableD this.owner = owner; } - /** - * {@inheritDoc} - */ @Override public JobPropertyDescriptor getDescriptor() { - return (JobPropertyDescriptor) Jenkins.getInstance().getDescriptorOrDie(getClass()); + return (JobPropertyDescriptor) Jenkins.get().getDescriptorOrDie(getClass()); } /** diff --git a/core/src/main/java/hudson/model/JobPropertyDescriptor.java b/core/src/main/java/hudson/model/JobPropertyDescriptor.java index 1a90cedf85..03fdd78796 100644 --- a/core/src/main/java/hudson/model/JobPropertyDescriptor.java +++ b/core/src/main/java/hudson/model/JobPropertyDescriptor.java @@ -58,8 +58,6 @@ public abstract class JobPropertyDescriptor extends Descriptor> { } /** - * {@inheritDoc} - * * @return * null to avoid setting an instance of {@link JobProperty} to the target project (or just use {@link OptionalJobProperty}) */ @@ -107,6 +105,6 @@ public abstract class JobPropertyDescriptor extends Descriptor> { } public static Collection all() { - return (Collection) Jenkins.getInstance().getDescriptorList(JobProperty.class); + return (Collection) Jenkins.get().getDescriptorList(JobProperty.class); } } diff --git a/core/src/main/java/hudson/model/Label.java b/core/src/main/java/hudson/model/Label.java index 0cb65eea38..f9ce39340d 100644 --- a/core/src/main/java/hudson/model/Label.java +++ b/core/src/main/java/hudson/model/Label.java @@ -41,14 +41,13 @@ import hudson.model.labels.LabelOperatorPrecedence; import hudson.model.labels.LabelVisitor; import hudson.model.queue.SubTask; import hudson.security.ACL; +import hudson.security.ACLContext; import hudson.slaves.NodeProvisioner; import hudson.slaves.Cloud; import hudson.util.QuotedStringTokenizer; import hudson.util.VariableResolver; import jenkins.model.Jenkins; import jenkins.model.ModelObjectWithChildren; -import org.acegisecurity.context.SecurityContext; -import org.acegisecurity.context.SecurityContextHolder; import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.restrictions.DoNotUse; import org.kohsuke.stapler.StaplerRequest; @@ -56,6 +55,7 @@ import org.kohsuke.stapler.StaplerResponse; import org.kohsuke.stapler.export.Exported; import org.kohsuke.stapler.export.ExportedBean; +import java.io.Serializable; import java.io.StringReader; import java.util.ArrayList; import java.util.Collection; @@ -66,12 +66,15 @@ import java.util.List; import java.util.Set; import java.util.Stack; import java.util.TreeSet; +import java.util.stream.Collectors; +import java.util.stream.StreamSupport; import com.thoughtworks.xstream.converters.Converter; import com.thoughtworks.xstream.converters.MarshallingContext; import com.thoughtworks.xstream.converters.UnmarshallingContext; import com.thoughtworks.xstream.io.HierarchicalStreamWriter; import com.thoughtworks.xstream.io.HierarchicalStreamReader; +import javax.annotation.Nonnull; /** * Group of {@link Node}s. @@ -85,16 +88,19 @@ public abstract class Label extends Actionable implements Comparable

    * Extending Update Centers. The update center in {@code Jenkins} can be replaced by defining a - * System Property (hudson.model.UpdateCenter.className). See {@link #createUpdateCenter(hudson.model.UpdateCenter.UpdateCenterConfiguration)}. + * System Property ({@code hudson.model.UpdateCenter.className}). See {@link #createUpdateCenter(hudson.model.UpdateCenter.UpdateCenterConfiguration)}. * This className should be available on early startup, so it cannot come only from a library * (e.g. Jenkins module or Extra library dependency in the WAR file project). * Plugins cannot be used for such purpose. @@ -209,6 +208,9 @@ public class UpdateCenter extends AbstractModelObject implements Saveable, OnMas private boolean requiresRestart; + /** @see #isSiteDataReady */ + private transient volatile boolean siteDataLoading; + static { Logger logger = Logger.getLogger(UpdateCenter.class.getName()); LOGGER = logger; @@ -436,10 +438,10 @@ public class UpdateCenter extends AbstractModelObject implements Saveable, OnMas @Restricted(DoNotUse.class) // WebOnly public HttpResponse doIncompleteInstallStatus() { try { - Map jobs = InstallUtil.getPersistedInstallStatus(); - if(jobs == null) { - jobs = Collections.emptyMap(); - } + Map jobs = InstallUtil.getPersistedInstallStatus(); + if(jobs == null) { + jobs = Collections.emptyMap(); + } return HttpResponses.okJSON(jobs); } catch (Exception e) { return HttpResponses.errorJSON(String.format("ERROR: %s", e.getMessage())); @@ -487,7 +489,7 @@ public class UpdateCenter extends AbstractModelObject implements Saveable, OnMas try { String correlationId = request.getParameter("correlationId"); Map response = new HashMap<>(); - response.put("state", Jenkins.getInstance().getInstallState().name()); + response.put("state", Jenkins.get().getInstallState().name()); List> installStates = new ArrayList<>(); response.put("jobs", installStates); List jobCopy = getJobs(); @@ -541,6 +543,27 @@ public class UpdateCenter extends AbstractModelObject implements Saveable, OnMas return sites; } + /** + * Whether it is probably safe to call all {@link UpdateSite#getData} without blocking. + * @return true if all data is currently ready (or absent); + * false if some is not ready now (but it will be loaded in the background) + */ + @Restricted(NoExternalUse.class) + public boolean isSiteDataReady() { + if (sites.stream().anyMatch(UpdateSite::hasUnparsedData)) { + if (!siteDataLoading) { + siteDataLoading = true; + Timer.get().submit(() -> { + sites.forEach(UpdateSite::getData); + siteDataLoading = false; + }); + } + return false; + } else { + return true; + } + } + /** * The same as {@link #getSites()} but for REST API. */ @@ -573,7 +596,7 @@ public class UpdateCenter extends AbstractModelObject implements Saveable, OnMas if (newestTs == 0) { return Messages.UpdateCenter_n_a(); } - return Util.getPastTimeString(System.currentTimeMillis()-newestTs); + return Util.getTimeSpanString(System.currentTimeMillis()-newestTs); } /** @@ -642,8 +665,7 @@ public class UpdateCenter extends AbstractModelObject implements Saveable, OnMas } for (UpdateSite s : sites) { Plugin p = s.getPlugin(artifactId); - if (p!=null) { - if (minVersion.isNewerThan(new VersionNumber(p.version))) continue; + if (checkMinVersion(p, minVersion)) { return p; } } @@ -651,6 +673,28 @@ public class UpdateCenter extends AbstractModelObject implements Saveable, OnMas } /** + * Gets plugin info from all available sites + * @return list of plugins + */ + @Restricted(NoExternalUse.class) + public @Nonnull List getPluginFromAllSites(String artifactId, + @CheckForNull VersionNumber minVersion) { + ArrayList result = new ArrayList<>(); + for (UpdateSite s : sites) { + Plugin p = s.getPlugin(artifactId); + if (checkMinVersion(p, minVersion)) { + result.add(p); + } + } + return result; + } + + private boolean checkMinVersion(@CheckForNull Plugin p, @CheckForNull VersionNumber minVersion) { + return p != null + && (minVersion == null || !minVersion.isNewerThan(new VersionNumber(p.version))); + } + + /** * Schedules a Jenkins upgrade. */ @RequirePOST @@ -799,8 +843,11 @@ public class UpdateCenter extends AbstractModelObject implements Saveable, OnMas } - /*package*/ synchronized Future addJob(UpdateCenterJob job) { - addConnectionCheckJob(job.site); + @Restricted(NoExternalUse.class) + public synchronized Future addJob(UpdateCenterJob job) { + if (job.site != null) { + addConnectionCheckJob(job.site); + } return job.submit(); } @@ -846,7 +893,7 @@ public class UpdateCenter extends AbstractModelObject implements Saveable, OnMas private @CheckForNull ConnectionCheckJob getConnectionCheckJob(@Nonnull UpdateSite site) { synchronized (jobs) { for (UpdateCenterJob job : jobs) { - if (job instanceof ConnectionCheckJob && job.site.getId().equals(site.getId())) { + if (job instanceof ConnectionCheckJob && job.site != null && job.site.getId().equals(site.getId())) { return (ConnectionCheckJob) job; } } @@ -905,6 +952,7 @@ public class UpdateCenter extends AbstractModelObject implements Saveable, OnMas sites.add(createDefaultUpdateSite()); } } + siteDataLoading = false; } protected UpdateSite createDefaultUpdateSite() { @@ -912,7 +960,7 @@ public class UpdateCenter extends AbstractModelObject implements Saveable, OnMas } private XmlFile getConfigFile() { - return new XmlFile(XSTREAM,new File(Jenkins.getInstance().root, + return new XmlFile(XSTREAM,new File(Jenkins.get().root, UpdateCenter.class.getName()+".xml")); } @@ -958,8 +1006,10 @@ public class UpdateCenter extends AbstractModelObject implements Saveable, OnMas if (category==null) return Messages.UpdateCenter_PluginCategory_misc(); try { - return (String)Messages.class.getMethod( + return (String) Messages.class.getMethod( "UpdateCenter_PluginCategory_" + category.replace('-', '_')).invoke(null); + } catch (RuntimeException ex) { + throw ex; } catch (Exception ex) { return Messages.UpdateCenter_PluginCategory_unrecognized(category); } @@ -967,11 +1017,20 @@ public class UpdateCenter extends AbstractModelObject implements Saveable, OnMas public List getUpdates() { Map pluginMap = new LinkedHashMap<>(); + final Map> incompatiblePluginMap = new LinkedHashMap<>(); + final PluginManager.MetadataCache cache = new PluginManager.MetadataCache(); + for (UpdateSite site : sites) { for (Plugin plugin: site.getUpdates()) { final Plugin existing = pluginMap.get(plugin.name); if (existing == null) { pluginMap.put(plugin.name, plugin); + + if (!plugin.isNeededDependenciesCompatibleWithInstalledVersion()) { + for (Plugin incompatiblePlugin : plugin.getDependenciesIncompatibleWithInstalledVersion(cache)) { + incompatiblePluginMap.computeIfAbsent(incompatiblePlugin.name, _ignored -> new HashSet<>()).add(plugin); + } + } } else if (!existing.version.equals(plugin.version)) { // allow secondary update centers to publish different versions // TODO refactor to consolidate multiple versions of the same plugin within the one row @@ -983,6 +1042,11 @@ public class UpdateCenter extends AbstractModelObject implements Saveable, OnMas } } + incompatiblePluginMap.forEach((key, incompatiblePlugins) -> pluginMap.computeIfPresent(key, (_ignored, plugin) -> { + plugin.setIncompatibleParentPlugins(incompatiblePlugins); + return plugin; + })); + return new ArrayList<>(pluginMap.values()); } @@ -999,7 +1063,7 @@ public class UpdateCenter extends AbstractModelObject implements Saveable, OnMas public List updateAllSites() throws InterruptedException, ExecutionException { List > futures = new ArrayList<>(); for (UpdateSite site : getSites()) { - Future future = site.updateDirectly(DownloadService.signatureCheck); + Future future = site.updateDirectly(); if (future != null) { futures.add(future); } @@ -1023,13 +1087,18 @@ public class UpdateCenter extends AbstractModelObject implements Saveable, OnMas return Messages.UpdateCenter_CoreUpdateMonitor_DisplayName(); } + @Override public boolean isActivated() { + if (!Jenkins.get().getUpdateCenter().isSiteDataReady()) { + // Do not display monitor during this page load, but possibly later. + return false; + } Data data = getData(); return data!=null && data.hasCoreUpdates(); } public Data getData() { - UpdateSite cs = Jenkins.getInstance().getUpdateCenter().getCoreSource(); + UpdateSite cs = Jenkins.get().getUpdateCenter().getCoreSource(); if (cs!=null) return cs.getData(); return null; } @@ -1192,15 +1261,15 @@ public class UpdateCenter extends AbstractModelObject implements Saveable, OnMas if (sha1 != null) { byte[] digest = sha1.digest(); - job.computedSHA1 = Base64.encodeBase64String(digest); + job.computedSHA1 = Base64.getEncoder().encodeToString(digest); } if (sha256 != null) { byte[] digest = sha256.digest(); - job.computedSHA256 = Base64.encodeBase64String(digest); + job.computedSHA256 = Base64.getEncoder().encodeToString(digest); } if (sha512 != null) { byte[] digest = sha512.digest(); - job.computedSHA512 = Base64.encodeBase64String(digest); + job.computedSHA512 = Base64.getEncoder().encodeToString(digest); } return tmp; } catch (IOException e) { @@ -1331,7 +1400,7 @@ public class UpdateCenter extends AbstractModelObject implements Saveable, OnMas /** * Which {@link UpdateSite} does this belong to? */ - public final UpdateSite site; + public final @CheckForNull UpdateSite site; /** * Simple correlation ID that can be used to associated a batch of jobs e.g. the @@ -1344,7 +1413,7 @@ public class UpdateCenter extends AbstractModelObject implements Saveable, OnMas */ protected Throwable error; - protected UpdateCenterJob(UpdateSite site) { + protected UpdateCenterJob(@CheckForNull UpdateSite site) { this.site = site; } @@ -1439,7 +1508,7 @@ public class UpdateCenter extends AbstractModelObject implements Saveable, OnMas try { // safeRestart records the current authentication for the log, so set it to the managing user try (ACLContext acl = ACL.as(User.get(authentication, false, Collections.emptyMap()))) { - Jenkins.getInstance().safeRestart(); + Jenkins.get().safeRestart(); } } catch (RestartNotSupportedException exception) { // ignore if restart is not allowed @@ -1479,7 +1548,7 @@ public class UpdateCenter extends AbstractModelObject implements Saveable, OnMas * Tests the internet connectivity. */ public final class ConnectionCheckJob extends UpdateCenterJob { - private final Vector statuses= new Vector(); + private final Vector statuses= new Vector<>(); final Map connectionStates = new ConcurrentHashMap<>(); @@ -1492,7 +1561,7 @@ public class UpdateCenter extends AbstractModelObject implements Saveable, OnMas public void run() { connectionStates.put(ConnectionStatus.INTERNET, ConnectionStatus.UNCHECKED); connectionStates.put(ConnectionStatus.UPDATE_SITE, ConnectionStatus.UNCHECKED); - if (ID_UPLOAD.equals(site.getId())) { + if (site == null || ID_UPLOAD.equals(site.getId())) { return; } LOGGER.fine("Doing a connectivity check"); @@ -1512,7 +1581,7 @@ public class UpdateCenter extends AbstractModelObject implements Saveable, OnMas if(e.getMessage().contains("Connection timed out")) { // Google can't be down, so this is probably a proxy issue connectionStates.put(ConnectionStatus.INTERNET, ConnectionStatus.FAILED); - statuses.add(Messages.UpdateCenter_Status_ConnectionFailed(connectionCheckUrl)); + statuses.add(Messages.UpdateCenter_Status_ConnectionFailed(Functions.xmlEscape(connectionCheckUrl))); return; } } @@ -1534,12 +1603,12 @@ public class UpdateCenter extends AbstractModelObject implements Saveable, OnMas statuses.add(Messages.UpdateCenter_Status_Success()); } catch (UnknownHostException e) { connectionStates.put(ConnectionStatus.UPDATE_SITE, ConnectionStatus.FAILED); - statuses.add(Messages.UpdateCenter_Status_UnknownHostException(e.getMessage())); + statuses.add(Messages.UpdateCenter_Status_UnknownHostException(Functions.xmlEscape(e.getMessage()))); addStatus(e); error = e; } catch (Exception e) { connectionStates.put(ConnectionStatus.UPDATE_SITE, ConnectionStatus.FAILED); - statuses.add(Functions.printThrowable(e)); + addStatus(e); error = e; } @@ -1553,7 +1622,7 @@ public class UpdateCenter extends AbstractModelObject implements Saveable, OnMas } } - private void addStatus(UnknownHostException e) { + private void addStatus(Throwable e) { statuses.add("

    "+ Functions.xmlEscape(Functions.printThrowable(e))+"
    "); } @@ -1595,7 +1664,7 @@ public class UpdateCenter extends AbstractModelObject implements Saveable, OnMas if (dynamicLoad) { try { // remove the existing, disabled inactive plugin to force a new one to load - pm.dynamicLoad(getDestination(), true); + pm.dynamicLoad(getDestination(), true, null); } catch (Exception e) { LOGGER.log(Level.SEVERE, "Failed to dynamically load " + plugin.getDisplayName(), e); error = e; @@ -1660,9 +1729,20 @@ public class UpdateCenter extends AbstractModelObject implements Saveable, OnMas */ protected abstract File getDestination(); + /** + * Code name used for logging. + */ @Exported public abstract String getName(); + /** + * Display name used for the GUI. + * @since 2.189 + */ + public String getDisplayName() { + return getName(); + } + /** * Called when the whole thing went successfully. */ @@ -1919,11 +1999,14 @@ public class UpdateCenter extends AbstractModelObject implements Saveable, OnMas return; case FAIL: throwVerificationFailure(entry.getSha512(), job.getComputedSHA512(), file, "SHA-512"); + break; case NOT_COMPUTED: LOGGER.log(WARNING, "Attempt to verify a downloaded file (" + file.getName() + ") using SHA-512 failed since it could not be computed. Falling back to weaker algorithms. Update your JRE."); break; case NOT_PROVIDED: break; + default: + throw new IllegalStateException("Unexpected value: " + result512); } VerificationResult result256 = verifyChecksums(entry.getSha256(), job.getComputedSHA256(), false); @@ -1932,9 +2015,12 @@ public class UpdateCenter extends AbstractModelObject implements Saveable, OnMas return; case FAIL: throwVerificationFailure(entry.getSha256(), job.getComputedSHA256(), file, "SHA-256"); + break; case NOT_COMPUTED: case NOT_PROVIDED: break; + default: + throw new IllegalStateException("Unexpected value: " + result256); } if (result512 == VerificationResult.NOT_PROVIDED && result256 == VerificationResult.NOT_PROVIDED) { @@ -1947,6 +2033,7 @@ public class UpdateCenter extends AbstractModelObject implements Saveable, OnMas return; case FAIL: throwVerificationFailure(entry.getSha1(), job.getComputedSHA1(), file, "SHA-1"); + break; case NOT_COMPUTED: throw new IOException("Failed to compute SHA-1 of downloaded file, refusing installation"); case NOT_PROVIDED: @@ -1964,13 +2051,15 @@ public class UpdateCenter extends AbstractModelObject implements Saveable, OnMas @Exported public final Plugin plugin; - protected final PluginManager pm = Jenkins.getInstance().getPluginManager(); + protected final PluginManager pm = Jenkins.get().getPluginManager(); /** * True to load the plugin into this Jenkins, false to wait until restart. */ protected final boolean dynamicLoad; + @CheckForNull List batch; + /** * @deprecated as of 1.442 */ @@ -1999,7 +2088,13 @@ public class UpdateCenter extends AbstractModelObject implements Saveable, OnMas return new File(baseDir, plugin.name + ".hpi"); } + @Override public String getName() { + return plugin.name; + } + + @Override + public String getDisplayName() { return plugin.getDisplayName(); } @@ -2017,17 +2112,14 @@ public class UpdateCenter extends AbstractModelObject implements Saveable, OnMas // if this is a bundled plugin, make sure it won't get overwritten PluginWrapper pw = plugin.getInstalled(); if (pw!=null && pw.isBundled()) { - SecurityContext oldContext = ACL.impersonate(ACL.SYSTEM); - try { + try (ACLContext ctx = ACL.as(ACL.SYSTEM)) { pw.doPin(); - } finally { - SecurityContextHolder.setContext(oldContext); } } if (dynamicLoad) { try { - pm.dynamicLoad(getDestination()); + pm.dynamicLoad(getDestination(), false, batch); } catch (RestartRequiredException e) { throw new SuccessButRequiresRestart(e.message); } catch (Exception e) { @@ -2100,7 +2192,7 @@ public class UpdateCenter extends AbstractModelObject implements Saveable, OnMas */ @Override protected void replace(File dst, File src) throws IOException { - if (!site.getId().equals(ID_UPLOAD)) { + if (site == null || !site.getId().equals(ID_UPLOAD)) { verifyChecksums(this, plugin, src); } @@ -2123,6 +2215,61 @@ public class UpdateCenter extends AbstractModelObject implements Saveable, OnMas throw new IOException("Failed to rename "+src+" to "+dst); } } + + void setBatch(List batch) { + this.batch = batch; + } + + } + + @Restricted(NoExternalUse.class) + public final class CompleteBatchJob extends UpdateCenterJob { + + private final List batch; + private final long start; + @Exported(inline = true) + public volatile CompleteBatchJobStatus status = new Pending(); + + public CompleteBatchJob(List batch, long start, UUID correlationId) { + super(getCoreSource()); + this.batch = batch; + this.start = start; + setCorrelationId(correlationId); + } + + @Override + public void run() { + LOGGER.info("Completing installing of plugin batch…"); + status = new Running(); + try { + Jenkins.get().getPluginManager().start(batch); + status = new Success(); + } catch (Exception x) { + status = new Failure(x); + LOGGER.log(Level.WARNING, "Failed to start some plugins", x); + } + LOGGER.log(INFO, "Completed installation of {0} plugins in {1}", new Object[] {batch.size(), Util.getTimeSpanString((System.nanoTime() - start) / 1_000_000)}); + } + + @ExportedBean + public abstract class CompleteBatchJobStatus { + @Exported + public final int id = iota.incrementAndGet(); + } + + public class Pending extends CompleteBatchJobStatus {} + + public class Running extends CompleteBatchJobStatus {} + + public class Success extends CompleteBatchJobStatus {} + + public class Failure extends CompleteBatchJobStatus { + Failure(Throwable problemStackTrace) { + this.problemStackTrace = problemStackTrace; + } + public final Throwable problemStackTrace; + } + } /** @@ -2134,7 +2281,7 @@ public class UpdateCenter extends AbstractModelObject implements Saveable, OnMas */ public final Plugin plugin; - private final PluginManager pm = Jenkins.getInstance().getPluginManager(); + private final PluginManager pm = Jenkins.get().getPluginManager(); public PluginDowngradeJob(Plugin plugin, UpdateSite site, Authentication auth) { super(site, auth); @@ -2159,7 +2306,13 @@ public class UpdateCenter extends AbstractModelObject implements Saveable, OnMas return new File(baseDir, plugin.name + ".bak"); } + @Override public String getName() { + return plugin.name; + } + + @Override + public String getDisplayName() { return plugin.getDisplayName(); } @@ -2219,6 +2372,9 @@ public class UpdateCenter extends AbstractModelObject implements Saveable, OnMas } protected URL getURL() throws MalformedURLException { + if (site == null) { + throw new MalformedURLException("no update site defined"); + } return new URL(site.getData().core.url); } @@ -2236,6 +2392,9 @@ public class UpdateCenter extends AbstractModelObject implements Saveable, OnMas @Override protected void replace(File dst, File src) throws IOException { + if (site == null) { + throw new IOException("no update site defined"); + } verifyChecksums(this, site.getData().core, src); Lifecycle.get().rewriteHudsonWar(src); } @@ -2247,6 +2406,9 @@ public class UpdateCenter extends AbstractModelObject implements Saveable, OnMas } protected URL getURL() throws MalformedURLException { + if (site == null) { + throw new MalformedURLException("no update site defined"); + } return new URL(site.getData().core.url); } @@ -2333,13 +2495,6 @@ public class UpdateCenter extends AbstractModelObject implements Saveable, OnMas } } - /** - * Adds the update center data retriever to HTML. - */ - @Extension - public static class PageDecoratorImpl extends PageDecorator { - } - /** * Initializes the update center. * @@ -2352,7 +2507,7 @@ public class UpdateCenter extends AbstractModelObject implements Saveable, OnMas @Restricted(NoExternalUse.class) public static void updateDefaultSite() { - final UpdateSite site = Jenkins.getInstance().getUpdateCenter().getSite(UpdateCenter.ID_DEFAULT); + final UpdateSite site = Jenkins.get().getUpdateCenter().getSite(UpdateCenter.ID_DEFAULT); if (site == null) { LOGGER.log(Level.SEVERE, "Upgrading Jenkins. Cannot retrieve the default Update Site ''{0}''. " + "Plugin installation may fail.", UpdateCenter.ID_DEFAULT); @@ -2361,7 +2516,7 @@ public class UpdateCenter extends AbstractModelObject implements Saveable, OnMas try { // Need to do the following because the plugin manager will attempt to access // $JENKINS_HOME/updates/$ID_DEFAULT.json. Needs to be up to date. - site.updateDirectlyNow(true); + site.updateDirectlyNow(); } catch (Exception e) { LOGGER.log(WARNING, "Upgrading Jenkins. Failed to update the default Update Site '" + UpdateCenter.ID_DEFAULT + "'. Plugin upgrades may fail.", e); @@ -2372,7 +2527,7 @@ public class UpdateCenter extends AbstractModelObject implements Saveable, OnMas @Restricted(NoExternalUse.class) public Object getTarget() { if (!SKIP_PERMISSION_CHECK) { - Jenkins.getInstance().checkPermission(Jenkins.ADMINISTER); + Jenkins.get().checkPermission(Jenkins.ADMINISTER); } return this; } diff --git a/core/src/main/java/hudson/model/UpdateSite.java b/core/src/main/java/hudson/model/UpdateSite.java index f5af60859b..de54334b95 100644 --- a/core/src/main/java/hudson/model/UpdateSite.java +++ b/core/src/main/java/hudson/model/UpdateSite.java @@ -43,7 +43,6 @@ import java.io.IOException; import java.net.URI; import java.net.URL; import java.net.URLEncoder; -import java.security.GeneralSecurityException; import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; @@ -66,7 +65,6 @@ import javax.annotation.Nullable; import io.jenkins.lib.versionnumber.JavaSpecificationVersion; import jenkins.model.Jenkins; -import jenkins.model.DownloadSettings; import jenkins.plugins.DetachedPluginsUtil; import jenkins.security.UpdateSiteWarningsConfiguration; import jenkins.util.JSONSignatureValidator; @@ -75,14 +73,12 @@ import jenkins.util.java.JavaUtils; 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; -import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.export.Exported; import org.kohsuke.stapler.export.ExportedBean; import org.kohsuke.stapler.interceptor.RequirePOST; @@ -164,6 +160,17 @@ public class UpdateSite { return dataTimestamp; } + /** + * Update the data file from the given URL if the file + * does not exist, or is otherwise due for update. + * Accepted formats are JSONP or HTML with {@code postMessage}, not raw JSON. + * @return null if no updates are necessary, or the future result + * @since TODO + */ + public @CheckForNull Future updateDirectly() { + return updateDirectly(DownloadService.signatureCheck); + } + /** * Update the data file from the given URL if the file * does not exist, or is otherwise due for update. @@ -171,10 +178,12 @@ public class UpdateSite { * @param signatureCheck whether to enforce the signature (may be off only for testing!) * @return null if no updates are necessary, or the future result * @since 1.502 + * @deprecated use {@linkplain #updateDirectly()} */ + @Deprecated public @CheckForNull Future updateDirectly(final boolean signatureCheck) { if (! getDataFile().exists() || isDue()) { - return Jenkins.getInstance().getUpdateCenter().updateService.submit(new Callable() { + return Jenkins.get().getUpdateCenter().updateService.submit(new Callable() { @Override public FormValidation call() throws Exception { return updateDirectlyNow(signatureCheck); } @@ -184,20 +193,21 @@ public class UpdateSite { } } + /** + * Forces an update of the data file from the configured URL, irrespective of the last time the data was retrieved. + * @return A {@code FormValidation} indicating the if the update metadata was successfully downloaded from the configured update site + * @since TODO + * @throws IOException if there was an error downloading or saving the file. + */ + public @Nonnull FormValidation updateDirectlyNow() throws IOException { + return updateDirectlyNow(DownloadService.signatureCheck); + } + @Restricted(NoExternalUse.class) public @Nonnull FormValidation updateDirectlyNow(boolean signatureCheck) throws IOException { return updateData(DownloadService.loadJSON(new URL(getUrl() + "?id=" + URLEncoder.encode(getId(), "UTF-8") + "&version=" + URLEncoder.encode(Jenkins.VERSION, "UTF-8"))), signatureCheck); } - /** - * This is the endpoint that receives the update center data file from the browser. - */ - @RequirePOST - public FormValidation doPostBack(StaplerRequest req) throws IOException, GeneralSecurityException { - DownloadSettings.checkPostBackAccess(); - return updateData(IOUtils.toString(req.getInputStream(),"UTF-8"), true); - } - private FormValidation updateData(String json, boolean signatureCheck) throws IOException { @@ -222,7 +232,7 @@ public class UpdateSite { } } - LOGGER.info("Obtained the latest update center data file for UpdateSource " + id); + LOGGER.finest("Obtained the latest update center data file for UpdateSource " + id); retryWindow = 0; getDataFile().write(json); data = new Data(o); @@ -257,7 +267,7 @@ 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 use {@link #getJsonSignatureValidator(String)} instead. */ @Deprecated @Nonnull @@ -307,7 +317,7 @@ public class UpdateSite { */ @RequirePOST public HttpResponse doInvalidateData() { - Jenkins.getInstance().checkPermission(Jenkins.ADMINISTER); + Jenkins.get().checkPermission(Jenkins.ADMINISTER); dataTimestamp = 0; data = null; return HttpResponses.ok(); @@ -328,14 +338,25 @@ public class UpdateSite { return data; } + /** + * Whether {@link #getData} might be blocking. + */ + // Internal use only + boolean hasUnparsedData() { + return data == null && getDataFile().exists(); + } + /** * Gets the raw update center JSON data. */ public JSONObject getJSONObject() { TextFile df = getDataFile(); if(df.exists()) { + long start = System.nanoTime(); try { - return JSONObject.fromObject(df.read()); + JSONObject o = JSONObject.fromObject(df.read()); + LOGGER.fine(() -> String.format("Loaded and parsed %s in %.01fs", df, (System.nanoTime() - start) / 1_000_000_000.0)); + return o; } catch (JSONException | IOException e) { LOGGER.log(Level.SEVERE,"Failed to parse "+df,e); df.delete(); // if we keep this file, it will cause repeated failures @@ -397,7 +418,7 @@ public class UpdateSite { * This is where we store the update center data. */ private TextFile getDataFile() { - return new TextFile(new File(Jenkins.getInstance().getRootDir(), + return new TextFile(new File(Jenkins.get().getRootDir(), "updates/" + getId()+".json")); } @@ -413,7 +434,7 @@ public class UpdateSite { if(data==null) return Collections.emptyList(); // fail to determine List r = new ArrayList<>(); - for (PluginWrapper pw : Jenkins.getInstance().getPluginManager().getPlugins()) { + for (PluginWrapper pw : Jenkins.get().getPluginManager().getPlugins()) { Plugin p = pw.getUpdateInfo(); if(p!=null) r.add(p); } @@ -429,7 +450,7 @@ public class UpdateSite { Data data = getData(); if(data==null) return false; - for (PluginWrapper pw : Jenkins.getInstance().getPluginManager().getPlugins()) { + for (PluginWrapper pw : Jenkins.get().getPluginManager().getPlugins()) { if(!pw.isBundled() && pw.getUpdateInfo()!=null) // do not advertize updates to bundled plugins, since we generally want users to get them // as a part of jenkins.war updates. This also avoids unnecessary pinning of plugins. @@ -894,7 +915,7 @@ public class UpdateSite { case PLUGIN: // check whether plugin is installed - PluginWrapper plugin = Jenkins.getInstance().getPluginManager().getPlugin(this.component); + PluginWrapper plugin = Jenkins.get().getPluginManager().getPlugin(this.component); if (plugin == null) { return false; } @@ -969,7 +990,7 @@ public class UpdateSite { /** * Version of Java this plugin requires to run. * - * @since TODO + * @since 2.158 */ @Exported public final String minimumJavaVersion; @@ -992,6 +1013,11 @@ public class UpdateSite { @Exported public final Map optionalDependencies; + /** + * Set of plugins, this plugin is a incompatible dependency to. + */ + private Set incompatibleParentPlugins; + @DataBoundConstructor public Plugin(String sourceId, JSONObject o) { super(sourceId, o, UpdateSite.this.url); @@ -1040,17 +1066,18 @@ public class UpdateSite { */ @Exported public PluginWrapper getInstalled() { - PluginManager pm = Jenkins.getInstance().getPluginManager(); + PluginManager pm = Jenkins.get().getPluginManager(); return pm.getPlugin(name); } /** * Returns true if the plugin and its dependencies are fully compatible with the current installation - * This is set to restricted for now, since it is only being used by Jenkins UI at the moment. + * This is set to restricted for now, since it is only being used by Jenkins UI or Restful API at the moment. * - * @since TODO + * @since 2.175 */ @Restricted(NoExternalUse.class) + @Exported public boolean isCompatible() { return isCompatible(new PluginManager.MetadataCache()); } @@ -1092,7 +1119,7 @@ public class UpdateSite { for(Map.Entry e : dependencies.entrySet()) { VersionNumber requiredVersion = e.getValue() != null ? new VersionNumber(e.getValue()) : null; - Plugin depPlugin = Jenkins.getInstance().getUpdateCenter().getPlugin(e.getKey(), requiredVersion); + Plugin depPlugin = Jenkins.get().getUpdateCenter().getPlugin(e.getKey(), requiredVersion); if (depPlugin == null) { LOGGER.log(warnedMissing.add(e.getKey()) ? Level.WARNING : Level.FINE, "Could not find dependency {0} of {1}", new Object[] {e.getKey(), name}); continue; @@ -1117,7 +1144,7 @@ public class UpdateSite { for(Map.Entry e : optionalDependencies.entrySet()) { VersionNumber requiredVersion = e.getValue() != null ? new VersionNumber(e.getValue()) : null; - Plugin depPlugin = Jenkins.getInstance().getUpdateCenter().getPlugin(e.getKey(), requiredVersion); + Plugin depPlugin = Jenkins.get().getUpdateCenter().getPlugin(e.getKey(), requiredVersion); if (depPlugin == null) { continue; } @@ -1133,7 +1160,7 @@ public class UpdateSite { return deps; } - + public boolean isForNewerHudson() { try { return requiredCore!=null && new VersionNumber(requiredCore).isNewerThan( @@ -1145,7 +1172,7 @@ public class UpdateSite { /** * Returns true iff the plugin declares a minimum Java version and it's newer than what the Jenkins master is running on. - * @since TODO + * @since 2.158 */ public boolean isForNewerJava() { try { @@ -1174,7 +1201,7 @@ public class UpdateSite { /** * Returns the minimum Java version needed to use the plugin and all its dependencies. - * @since TODO + * @since 2.158 * @return the minimum Java version needed to use the plugin and all its dependencies, or null if unspecified. */ @CheckForNull @@ -1221,7 +1248,7 @@ public class UpdateSite { /** * Returns true iff any of the plugin dependencies require a newer Java than Jenkins is running on. * - * @since TODO + * @since 2.158 */ public boolean isNeededDependenciesForNewerJava() { for (Plugin p: getNeededDependencies()) { @@ -1246,16 +1273,42 @@ public class UpdateSite { @Restricted(NoExternalUse.class) // table.jelly public boolean isNeededDependenciesCompatibleWithInstalledVersion(PluginManager.MetadataCache cache) { - return cache.of("isNeededDependenciesCompatibleWithInstalledVersion:" + name, Boolean.class, () -> { + return getDependenciesIncompatibleWithInstalledVersion(cache).isEmpty(); + } + + /** + * Get the list of incompatible dependencies (if there are any, as determined by isNeededDependenciesCompatibleWithInstalledVersion) + * + * @since TODO + */ + @Restricted(NoExternalUse.class) // table.jelly + @SuppressWarnings("unchecked") + public List getDependenciesIncompatibleWithInstalledVersion(PluginManager.MetadataCache cache) { + return cache.of("getDependenciesIncompatibleWithInstalledVersion:" + name, List.class, () -> { + List incompatiblePlugins = new ArrayList<>(); for (Plugin p : getNeededDependencies()) { if (!p.isCompatibleWithInstalledVersion() || !p.isNeededDependenciesCompatibleWithInstalledVersion()) { - return false; + incompatiblePlugins.add(p); } } - return true; + return incompatiblePlugins; }); } + public void setIncompatibleParentPlugins(Set incompatibleParentPlugins) { + this.incompatibleParentPlugins = incompatibleParentPlugins; + } + + @Restricted(NoExternalUse.class) // table.jelly + public Set getIncompatibleParentPlugins() { + return this.incompatibleParentPlugins; + } + + @Restricted(NoExternalUse.class) // table.jelly + public boolean hasIncompatibleParentPlugins() { + return this.incompatibleParentPlugins != null && !this.incompatibleParentPlugins.isEmpty(); + } + /** * @since 2.40 */ @@ -1319,7 +1372,7 @@ public class UpdateSite { * See {@link UpdateCenter#isRestartRequiredForCompletion()} */ public Future deploy(boolean dynamicLoad) { - return deploy(dynamicLoad, null); + return deploy(dynamicLoad, null, null); } /** @@ -1334,18 +1387,19 @@ public class UpdateSite { * the plugin will only take effect after the reboot. * See {@link UpdateCenter#isRestartRequiredForCompletion()} * @param correlationId A correlation ID to be set on the job. + * @param batch if defined, a list of plugins to add to, which will be started later */ @Restricted(NoExternalUse.class) - public Future deploy(boolean dynamicLoad, @CheckForNull UUID correlationId) { - Jenkins.getInstance().checkPermission(Jenkins.ADMINISTER); - UpdateCenter uc = Jenkins.getInstance().getUpdateCenter(); + public Future deploy(boolean dynamicLoad, @CheckForNull UUID correlationId, @CheckForNull List batch) { + Jenkins.get().checkPermission(Jenkins.ADMINISTER); + UpdateCenter uc = Jenkins.get().getUpdateCenter(); for (Plugin dep : getNeededDependencies()) { UpdateCenter.InstallationJob job = uc.getJob(dep); if (job == null || job.status instanceof UpdateCenter.DownloadJob.Failure) { LOGGER.log(Level.INFO, "Adding dependent install of " + dep.name + " for plugin " + name); - dep.deploy(dynamicLoad); + dep.deploy(dynamicLoad, /* UpdateCenterPluginInstallTest.test_installKnownPlugins specifically asks that these not be correlated */ null, batch); } else { - LOGGER.log(Level.INFO, "Dependent install of " + dep.name + " for plugin " + name + " already added, skipping"); + LOGGER.log(Level.FINE, "Dependent install of {0} for plugin {1} already added, skipping", new Object[] {dep.name, name}); } } PluginWrapper pw = getInstalled(); @@ -1362,6 +1416,7 @@ public class UpdateSite { } UpdateCenter.InstallationJob job = createInstallationJob(this, uc, dynamicLoad); job.setCorrelationId(correlationId); + job.setBatch(batch); return uc.addJob(job); } @@ -1369,8 +1424,8 @@ public class UpdateSite { * Schedules the downgrade of this plugin. */ public Future deployBackup() { - Jenkins.getInstance().checkPermission(Jenkins.ADMINISTER); - UpdateCenter uc = Jenkins.getInstance().getUpdateCenter(); + Jenkins.get().checkPermission(Jenkins.ADMINISTER); + UpdateCenter uc = Jenkins.get().getUpdateCenter(); return uc.addJob(uc.new PluginDowngradeJob(this, UpdateSite.this, Jenkins.getAuthentication())); } /** diff --git a/core/src/main/java/hudson/model/UsageStatistics.java b/core/src/main/java/hudson/model/UsageStatistics.java index 93e4057c40..beac77113f 100644 --- a/core/src/main/java/hudson/model/UsageStatistics.java +++ b/core/src/main/java/hudson/model/UsageStatistics.java @@ -96,7 +96,7 @@ public class UsageStatistics extends PageDecorator implements PersistentDescript */ public boolean isDue() { // user opted out. no data collection. - if(!Jenkins.getInstance().isUsageStatisticsCollected() || DISABLED) return false; + if(!Jenkins.get().isUsageStatisticsCollected() || DISABLED) return false; long now = System.currentTimeMillis(); if(now - lastAttempt > DAY) { @@ -122,7 +122,7 @@ public class UsageStatistics extends PageDecorator implements PersistentDescript * Gets the encrypted usage stat data to be sent to the Hudson server. */ public String getStatData() throws IOException { - Jenkins j = Jenkins.getInstance(); + Jenkins j = Jenkins.get(); JSONObject o = new JSONObject(); o.put("stat",1); @@ -196,7 +196,7 @@ public class UsageStatistics extends PageDecorator implements PersistentDescript public boolean configure(StaplerRequest req, JSONObject json) throws FormException { try { // for backward compatibility reasons, this configuration is stored in Jenkins - Jenkins.getInstance().setNoUsageStatistics(json.has("usageStatisticsCollected") ? null : true); + Jenkins.get().setNoUsageStatistics(json.has("usageStatisticsCollected") ? null : true); return true; } catch (IOException e) { throw new FormException(e,"usageStatisticsCollected"); diff --git a/core/src/main/java/hudson/model/User.java b/core/src/main/java/hudson/model/User.java index 9c09bb94d0..86f9c9e8c4 100644 --- a/core/src/main/java/hudson/model/User.java +++ b/core/src/main/java/hudson/model/User.java @@ -31,7 +31,6 @@ import hudson.CopyOnWrite; import hudson.Extension; import hudson.ExtensionList; import hudson.ExtensionPoint; -import hudson.FeedAdapter; import hudson.Util; import hudson.XmlFile; import hudson.init.InitMilestone; @@ -93,6 +92,7 @@ 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.kohsuke.stapler.verb.POST; import org.springframework.dao.DataAccessException; /** @@ -262,13 +262,11 @@ public class User extends AbstractModelObject implements AccessControlled, Descr return id; } - public @Nonnull - String getUrl() { + public @Nonnull String getUrl() { return "user/" + Util.rawEncode(idStrategy().keyFor(id)); } - public @Nonnull - String getSearchUrl() { + public @Nonnull String getSearchUrl() { return "/user/" + Util.rawEncode(idStrategy().keyFor(id)); } @@ -276,8 +274,7 @@ public class User extends AbstractModelObject implements AccessControlled, Descr * The URL of the user page. */ @Exported(visibility = 999) - public @Nonnull - String getAbsoluteUrl() { + public @Nonnull String getAbsoluteUrl() { return Jenkins.get().getRootUrl() + getUrl(); } @@ -286,8 +283,7 @@ public class User extends AbstractModelObject implements AccessControlled, Descr * This is configurable by the user. */ @Exported(visibility = 999) - public @Nonnull - String getFullName() { + public @Nonnull String getFullName() { return fullName; } @@ -301,8 +297,7 @@ public class User extends AbstractModelObject implements AccessControlled, Descr } @Exported - public @CheckForNull - String getDescription() { + public @CheckForNull String getDescription() { return description; } @@ -370,8 +365,7 @@ public class User extends AbstractModelObject implements AccessControlled, Descr * @throws UsernameNotFoundException If this user is not a valid user in the backend {@link SecurityRealm}. * @since 1.419 */ - public @Nonnull - Authentication impersonate() throws UsernameNotFoundException { + public @Nonnull Authentication impersonate() throws UsernameNotFoundException { return this.impersonate(this.getUserDetailsForImpersonation()); } @@ -384,8 +378,7 @@ public class User extends AbstractModelObject implements AccessControlled, Descr * @return userDetails for the user, in case he's not found but seems legitimate, we provide a userDetails with minimum access * @throws UsernameNotFoundException If this user is not a valid user in the backend {@link SecurityRealm}. */ - public @Nonnull - UserDetails getUserDetailsForImpersonation() throws UsernameNotFoundException { + public @Nonnull UserDetails getUserDetailsForImpersonation() throws UsernameNotFoundException { ImpersonatingUserDetailsService userDetailsService = new ImpersonatingUserDetailsService( Jenkins.get().getSecurityRealm().getSecurityComponents().userDetails ); @@ -431,8 +424,7 @@ public class User extends AbstractModelObject implements AccessControlled, Descr * @see #getUserDetailsForImpersonation() */ @Restricted(NoExternalUse.class) - public @Nonnull - Authentication impersonate(@Nonnull UserDetails userDetails) { + public @Nonnull Authentication impersonate(@Nonnull UserDetails userDetails) { return new UsernamePasswordAuthenticationToken(userDetails.getUsername(), "", userDetails.getAuthorities()); } @@ -470,8 +462,7 @@ public class User extends AbstractModelObject implements AccessControlled, Descr * @deprecated use {@link User#get(String, boolean, java.util.Map)} */ @Deprecated - public static @Nullable - User get(String idOrFullName, boolean create) { + public static @Nullable User get(String idOrFullName, boolean create) { return get(idOrFullName, create, Collections.emptyMap()); } @@ -491,8 +482,7 @@ public class User extends AbstractModelObject implements AccessControlled, Descr * @return An existing or created user. May be {@code null} if a user does not exist and * {@code create} is false. */ - public static @Nullable - User get(String idOrFullName, boolean create, @Nonnull Map context) { + public static @Nullable User get(String idOrFullName, boolean create, @Nonnull Map context) { if (idOrFullName == null) { return null; } @@ -512,8 +502,7 @@ public class User extends AbstractModelObject implements AccessControlled, Descr * @return An existing or created user. May be {@code null} if a user does not exist and * {@code create} is false. */ - private static @Nullable - User getOrCreateById(@Nonnull String id, @Nonnull String fullName, boolean create) { + private static @Nullable User getOrCreateById(@Nonnull String id, @Nonnull String fullName, boolean create) { User u = AllUsers.get(id); if (u == null && (create || UserIdMapper.getInstance().isMapped(id))) { u = new User(id, fullName); @@ -546,8 +535,7 @@ public class User extends AbstractModelObject implements AccessControlled, Descr * Otherwise use {@link #getOrCreateByIdOrFullName(String)} or {@link #get(String, boolean, Map)}. */ @Deprecated - public static @Nonnull - User get(String idOrFullName) { + public static @Nonnull User get(String idOrFullName) { return getOrCreateByIdOrFullName(idOrFullName); } @@ -577,8 +565,7 @@ public class User extends AbstractModelObject implements AccessControlled, Descr * * @since 1.172 */ - public static @CheckForNull - User current() { + public static @CheckForNull User current() { return get(Jenkins.getAuthentication()); } @@ -590,8 +577,7 @@ public class User extends AbstractModelObject implements AccessControlled, Descr * @return a {@link User} object for the supplied {@link Authentication} or {@code null} * @since 1.609 */ - public static @CheckForNull - User get(@CheckForNull Authentication a) { + public static @CheckForNull User get(@CheckForNull Authentication a) { if (a == null || a instanceof AnonymousAuthenticationToken) return null; @@ -600,26 +586,24 @@ public class User extends AbstractModelObject implements AccessControlled, Descr } /** - * Gets the {@link User} object by its id + * Gets the {@link User} object by its {@code id} * * @param id the id of the user to retrieve and optionally create if it does not exist. - * @param create If true, this method will never return null for valid input (by creating a - * new {@link User} object if none exists.) If false, this method will return - * null if {@link User} object with the given id doesn't exist. - * @return the a User whose id is id, or null if create is false + * @param create If {@code true}, this method will never return {@code null} for valid input (by creating a + * new {@link User} object if none exists.) If {@code false}, this method will return + * {@code null} if {@link User} object with the given id doesn't exist. + * @return the a User whose id is {@code id}, or {@code null} if {@code create} is {@code false} * and the user does not exist. * @since 1.651.2 / 2.3 */ - public static @Nullable - User getById(String id, boolean create) { + public static @Nullable User getById(String id, boolean create) { return getOrCreateById(id, id, create); } /** * Gets all the users. */ - public static @Nonnull - Collection getAll() { + public static @Nonnull Collection getAll() { final IdStrategy strategy = idStrategy(); ArrayList users = new ArrayList<>(AllUsers.values()); users.sort((o1, o2) -> strategy.compare(o1.getId(), o2.getId())); @@ -657,8 +641,7 @@ public class User extends AbstractModelObject implements AccessControlled, Descr /** * Returns the user name. */ - public @Nonnull - String getDisplayName() { + public @Nonnull String getDisplayName() { return getFullName(); } @@ -686,8 +669,7 @@ public class User extends AbstractModelObject implements AccessControlled, Descr */ @SuppressWarnings("unchecked") @WithBridgeMethods(List.class) - public @Nonnull - RunList getBuilds() { + public @Nonnull RunList getBuilds() { return RunList.fromJobs((Iterable) Jenkins.get(). allItems(Job.class)).filter((Predicate>) r -> r instanceof AbstractBuild && relatedTo((AbstractBuild) r)); } @@ -697,8 +679,7 @@ public class User extends AbstractModelObject implements AccessControlled, Descr * * @since 1.191 */ - public @Nonnull - Set> getProjects() { + public @Nonnull Set> getProjects() { Set> r = new HashSet<>(); for (AbstractProject p : Jenkins.get().allItems(AbstractProject.class)) if (p.hasParticipant(this)) @@ -706,8 +687,7 @@ public class User extends AbstractModelObject implements AccessControlled, Descr return r; } - public @Override - String toString() { + public @Override String toString() { return fullName; } @@ -836,7 +816,7 @@ public class User extends AbstractModelObject implements AccessControlled, Descr /** * Accepts submission from the configuration page. */ - @RequirePOST + @POST public void doConfigSubmit(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException, FormException { checkPermission(Jenkins.ADMINISTER); @@ -891,11 +871,11 @@ public class User extends AbstractModelObject implements AccessControlled, Descr } public void doRssAll(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException { - rss(req, rsp, " all builds", getBuilds(), Run.FEED_ADAPTER); + RSS.rss(req, rsp, "Jenkins:" + getDisplayName() + " (all builds)", getUrl(), getBuilds().newBuilds()); } public void doRssFailed(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException { - rss(req, rsp, " regression builds", getBuilds().regressionOnly(), Run.FEED_ADAPTER); + RSS.rss(req, rsp, "Jenkins:" + getDisplayName() + " (failed builds)", getUrl(), getBuilds().regressionOnly()); } public void doRssLatest(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException { @@ -911,12 +891,7 @@ 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 lastBuilds.sort((o1, o2) -> Items.BY_FULL_NAME.compare(o1.getParent(), o2.getParent())); - rss(req, rsp, " latest build", RunList.fromRuns(lastBuilds), Run.FEED_ADAPTER_LATEST); - } - - private void rss(StaplerRequest req, StaplerResponse rsp, String suffix, RunList runs, FeedAdapter adapter) - throws IOException, ServletException { - RSS.forwardToRss(getDisplayName() + suffix, getUrl(), runs.newBuilds(), adapter, req, rsp); + RSS.rss(req, rsp, "Jenkins:" + getDisplayName() + " (latest builds)", getUrl(), RunList.fromRuns(lastBuilds), Run.FEED_ADAPTER_LATEST); } @Override @@ -945,8 +920,7 @@ public class User extends AbstractModelObject implements AccessControlled, Descr * @return a possibly empty list * @since 1.498 */ - public @Nonnull - List getAuthorities() { + public @Nonnull List getAuthorities() { if (!Jenkins.get().hasPermission(Jenkins.ADMINISTER)) { return Collections.emptyList(); } @@ -1062,7 +1036,7 @@ public class User extends AbstractModelObject implements AccessControlled, Descr private final ConcurrentMap byName = new ConcurrentHashMap<>(); - @Initializer(after = InitMilestone.JOB_LOADED) + @Initializer(after = InitMilestone.JOB_CONFIG_ADAPTED) public static void scanAll() { for (String userId : UserIdMapper.getInstance().getConvertedUserIds()) { User user = new User(userId, userId); @@ -1134,10 +1108,9 @@ public class User extends AbstractModelObject implements AccessControlled, Descr /** * extract user ID from idOrFullName with help from contextual infos. - * can return null if no user ID matched the input + * can return {@code null} if no user ID matched the input */ - public abstract @CheckForNull - String resolveCanonicalId(String idOrFullName, Map context); + public abstract @CheckForNull String resolveCanonicalId(String idOrFullName, Map context); /** * Gets priority of the resolver. diff --git a/core/src/main/java/hudson/model/UserProperty.java b/core/src/main/java/hudson/model/UserProperty.java index d7da302c2d..7cbe57a486 100644 --- a/core/src/main/java/hudson/model/UserProperty.java +++ b/core/src/main/java/hudson/model/UserProperty.java @@ -64,14 +64,14 @@ public abstract class UserProperty implements ReconfigurableDescribable all() { - return Jenkins.getInstance().getDescriptorList(UserProperty.class); + return Jenkins.get().getDescriptorList(UserProperty.class); } public UserProperty reconfigure(StaplerRequest req, JSONObject form) throws FormException { diff --git a/core/src/main/java/hudson/model/View.java b/core/src/main/java/hudson/model/View.java index 6b27e876a8..190eb985f9 100644 --- a/core/src/main/java/hudson/model/View.java +++ b/core/src/main/java/hudson/model/View.java @@ -33,7 +33,6 @@ import hudson.Functions; import hudson.Indenter; import hudson.Util; import hudson.model.Descriptor.FormException; -import hudson.model.labels.LabelAtomPropertyDescriptor; import hudson.model.listeners.ItemListener; import hudson.scm.ChangeLogSet; import hudson.scm.ChangeLogSet.Entry; @@ -91,6 +90,7 @@ import javax.servlet.ServletException; import javax.servlet.http.HttpServletResponse; import javax.xml.transform.Source; import javax.xml.transform.TransformerException; +import javax.xml.transform.sax.SAXSource; import javax.xml.transform.stream.StreamResult; import javax.xml.transform.stream.StreamSource; import java.io.BufferedInputStream; @@ -123,6 +123,7 @@ import static javax.servlet.http.HttpServletResponse.SC_BAD_REQUEST; import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.restrictions.NoExternalUse; import org.kohsuke.stapler.QueryParameter; +import org.kohsuke.stapler.verb.POST; import org.xml.sax.SAXException; /** @@ -320,8 +321,9 @@ public abstract class View extends AbstractModelObject implements AccessControll } /** - * Returns all the {@link LabelAtomPropertyDescriptor}s that can be potentially configured - * on this label. + * Returns all the {@link ViewPropertyDescriptor}s that can be potentially configured + * on this view. Returns both {@link ViewPropertyDescriptor}s visible and invisible for user, see + * {@link View#getVisiblePropertyDescriptors} to filter invisible one. */ public List getApplicablePropertyDescriptors() { List r = new ArrayList<>(); @@ -332,6 +334,15 @@ public abstract class View extends AbstractModelObject implements AccessControll return r; } + /** + * @return all the {@link ViewPropertyDescriptor}s that can be potentially configured on this View and are visible + * for the user. Use {@link DescriptorVisibilityFilter} to make a View property invisible for users. + * @since 2.214 + */ + public List getVisiblePropertyDescriptors() { + return DescriptorVisibilityFilter.apply(this, getApplicablePropertyDescriptors()); + } + public void save() throws IOException { // persistence is a part of the owner // due to initialization timing issue, it can be null when this method is called @@ -350,7 +361,7 @@ public abstract class View extends AbstractModelObject implements AccessControll } public ViewDescriptor getDescriptor() { - return (ViewDescriptor) Jenkins.getInstance().getDescriptorOrDie(getClass()); + return (ViewDescriptor) Jenkins.get().getDescriptorOrDie(getClass()); } public String getDisplayName() { @@ -402,7 +413,7 @@ public abstract class View extends AbstractModelObject implements AccessControll * For now, this just returns the widgets registered to Hudson. */ public List getWidgets() { - return Collections.unmodifiableList(Jenkins.getInstance().getWidgets()); + return Collections.unmodifiableList(Jenkins.get().getWidgets()); } /** @@ -428,7 +439,7 @@ public abstract class View extends AbstractModelObject implements AccessControll } public List getComputers() { - Computer[] computers = Jenkins.getInstance().getComputers(); + Computer[] computers = Jenkins.get().getComputers(); if (!isFilterExecutors()) { return Arrays.asList(computers); @@ -507,7 +518,7 @@ public abstract class View extends AbstractModelObject implements AccessControll } public List getQueueItems() { - return filterQueue(Arrays.asList(Jenkins.getInstance().getQueue().getItems())); + return filterQueue(Arrays.asList(Jenkins.get().getQueue().getItems())); } /** @@ -516,7 +527,7 @@ public abstract class View extends AbstractModelObject implements AccessControll */ @Deprecated public List getApproximateQueueItemsQuickly() { - return filterQueue(Jenkins.getInstance().getQueue().getApproximateItemsQuickly()); + return filterQueue(Jenkins.get().getQueue().getApproximateItemsQuickly()); } /** @@ -584,7 +595,7 @@ public abstract class View extends AbstractModelObject implements AccessControll */ @Exported(visibility=2,name="url") public String getAbsoluteUrl() { - return Jenkins.getInstance().getRootUrl()+getUrl(); + return Jenkins.get().getRootUrl()+getUrl(); } public Api getApi() { @@ -605,7 +616,7 @@ public abstract class View extends AbstractModelObject implements AccessControll * Returns the {@link ACL} for this object. */ public ACL getACL() { - return Jenkins.getInstance().getAuthorizationStrategy().getACL(this); + return Jenkins.get().getAuthorizationStrategy().getACL(this); } /** @deprecated Does not work properly with moved jobs. Use {@link ItemListener#onLocationChanged} instead. */ @@ -670,9 +681,7 @@ public abstract class View extends AbstractModelObject implements AccessControll public int compareTo(UserInfo that) { long rhs = that.ordinal(); long lhs = this.ordinal(); - if(rhs>lhs) return 1; - if(rhs() {// for jobs in the view + protected TopLevelItem get(String key) { return getItem(key); } + protected Collection all() { return getItems(); } + @Override + protected String getName(TopLevelItem o) { + // return the name instead of the display for suggestion searching + return o.getName(); + } + }); + } + @Override public SearchIndexBuilder makeSearchIndex() { SearchIndexBuilder sib = super.makeSearchIndex(); - sib.add(new CollectionSearchIndex() {// for jobs in the view - protected TopLevelItem get(String key) { return getItem(key); } - protected Collection all() { return getItems(); } - @Override - protected String getName(TopLevelItem o) { - // return the name instead of the display for suggestion searching - return o.getName(); - } - }); + makeSearchIndex(sib); // add the display name for each item in the search index addDisplayNamesToSearchIndex(sib, getItems()); @@ -985,7 +1004,7 @@ public abstract class View extends AbstractModelObject implements AccessControll * * Subtypes should override the {@link #submit(StaplerRequest)} method. */ - @RequirePOST + @POST public final synchronized void doConfigSubmit( StaplerRequest req, StaplerResponse rsp ) throws IOException, ServletException, FormException { checkPermission(CONFIGURE); @@ -1053,7 +1072,7 @@ public abstract class View extends AbstractModelObject implements AccessControll try { Jenkins.checkGoodName(value); value = value.trim(); // why trim *after* checkGoodName? not sure, but ItemGroupMixIn.createTopLevelItem does the same - Jenkins.getInstance().getProjectNamingStrategy().checkName(value); + Jenkins.get().getProjectNamingStrategy().checkName(value); } catch (Failure e) { return FormValidation.error(e.getMessage()); } @@ -1124,11 +1143,11 @@ public abstract class View extends AbstractModelObject implements AccessControll } public void doRssAll( StaplerRequest req, StaplerResponse rsp ) throws IOException, ServletException { - rss(req, rsp, " all builds", getBuilds()); + RSS.rss(req, rsp, "Jenkins:" + getDisplayName() + " (all builds)", getUrl(), getBuilds().newBuilds()); } public void doRssFailed( StaplerRequest req, StaplerResponse rsp ) throws IOException, ServletException { - rss(req, rsp, " failed builds", getBuilds().failureOnly()); + RSS.rss(req, rsp, "Jenkins:" + getDisplayName() + " (failed builds)", getUrl(), getBuilds().failureOnly().newBuilds()); } public RunList getBuilds() { @@ -1139,11 +1158,6 @@ public abstract class View extends AbstractModelObject implements AccessControll return new BuildTimelineWidget(getBuilds()); } - private void rss(StaplerRequest req, StaplerResponse rsp, String suffix, RunList runs) throws IOException, ServletException { - RSS.forwardToRss(getDisplayName()+ suffix, getUrl(), - runs.newBuilds(), Run.FEED_ADAPTER, req, rsp ); - } - public void doRssLatest( StaplerRequest req, StaplerResponse rsp ) throws IOException, ServletException { List lastBuilds = new ArrayList<>(); for (TopLevelItem item : getItems()) { @@ -1153,8 +1167,7 @@ public abstract class View extends AbstractModelObject implements AccessControll if(lb!=null) lastBuilds.add(lb); } } - RSS.forwardToRss(getDisplayName()+" last builds only", getUrl(), - lastBuilds, Run.FEED_ADAPTER_LATEST, req, rsp ); + RSS.rss(req, rsp, "Jenkins:" + getDisplayName() + " (latest builds)", getUrl(), RunList.fromRuns(lastBuilds), Run.FEED_ADAPTER_LATEST); } /** @@ -1195,7 +1208,7 @@ public abstract class View extends AbstractModelObject implements AccessControll /** * Updates the View with the new XML definition. * @param source source of the Item's new definition. - * The source should be either a StreamSource or SAXSource, other sources + * The source should be either a {@link StreamSource} or {@link SAXSource}, other sources * may not be handled. */ public void updateByXml(Source source) throws IOException { @@ -1252,7 +1265,7 @@ public abstract class View extends AbstractModelObject implements AccessControll * Returns all the registered {@link ViewDescriptor}s. */ public static DescriptorExtensionList all() { - return Jenkins.getInstance().getDescriptorList(View.class); + return Jenkins.get().getDescriptorList(View.class); } /** @@ -1355,7 +1368,7 @@ public abstract class View extends AbstractModelObject implements AccessControll private static View copy(StaplerRequest req, ViewGroup owner, String name) throws IOException { View v; String from = req.getParameter("from"); - View src = src = owner.getView(from); + View src = owner.getView(from); if(src==null) { if(Util.fixEmpty(from)==null) diff --git a/core/src/main/java/hudson/model/ViewDescriptor.java b/core/src/main/java/hudson/model/ViewDescriptor.java index fe3ced2bda..7e4a38f0f2 100644 --- a/core/src/main/java/hudson/model/ViewDescriptor.java +++ b/core/src/main/java/hudson/model/ViewDescriptor.java @@ -91,7 +91,7 @@ public abstract class ViewDescriptor extends Descriptor { DirectlyModifiableTopLevelItemGroup modifiableContainer = (DirectlyModifiableTopLevelItemGroup) container; Iterator it = candidates.getValues().iterator(); while (it.hasNext()) { - TopLevelItem item = Jenkins.getInstance().getItem(it.next(), container, TopLevelItem.class); + TopLevelItem item = Jenkins.get().getItem(it.next(), container, TopLevelItem.class); if (item == null) { continue; // ? } diff --git a/core/src/main/java/hudson/model/ViewGroup.java b/core/src/main/java/hudson/model/ViewGroup.java index 6becb90bd2..628667157a 100644 --- a/core/src/main/java/hudson/model/ViewGroup.java +++ b/core/src/main/java/hudson/model/ViewGroup.java @@ -67,7 +67,7 @@ public interface ViewGroup extends Saveable, ModelObject, AccessControlled { * @return * can be empty but never null. * - * @since TODO + * @since 2.174 */ @Nonnull default Collection getAllViews() { @@ -141,7 +141,7 @@ public interface ViewGroup extends Saveable, ModelObject, AccessControlled { * @since 1.417 */ default ItemGroup getItemGroup() { - return Jenkins.getInstance(); + return Jenkins.get(); } /** @@ -157,7 +157,7 @@ public interface ViewGroup extends Saveable, ModelObject, AccessControlled { * @since 1.417 */ default List getViewActions() { - return Jenkins.getInstance().getActions(); + return Jenkins.get().getActions(); } } diff --git a/core/src/main/java/hudson/model/ViewGroupMixIn.java b/core/src/main/java/hudson/model/ViewGroupMixIn.java index c22ac8a608..c3c7fb8aa8 100644 --- a/core/src/main/java/hudson/model/ViewGroupMixIn.java +++ b/core/src/main/java/hudson/model/ViewGroupMixIn.java @@ -29,7 +29,6 @@ import org.kohsuke.stapler.export.Exported; import java.io.IOException; import java.util.ArrayList; import java.util.Collection; -import java.util.Collections; import java.util.List; import javax.annotation.CheckForNull; import javax.annotation.Nonnull; @@ -48,7 +47,7 @@ import javax.annotation.Nonnull; * private ViewsTabBar viewsTabBar; * } *
  • - * Define a transient field and store ViewGroupMixIn subype, then wire up getters and setters: + * Define a transient field and store ViewGroupMixIn subtype, then wire up getters and setters: *
      * private transient ViewGroupMixIn = new ViewGroupMixIn() {
      *     List<View> views() { return views; }
    @@ -164,12 +163,14 @@ public abstract class ViewGroupMixIn {
         }
     
         /**
    -     * Returns the primary {@link View} that renders the top-page of Hudson.
    +     * Returns the primary {@link View} that renders the top-page of Hudson or
    +     * {@code null} if there is no primary one defined.
          */
         @Exported
    +    @CheckForNull
         public View getPrimaryView() {
             View v = getView(primaryView());
    -        if(v==null) // fallback
    +        if(v==null && !views().isEmpty()) // fallback
                 v = views().get(0);
             return v;
         }
    diff --git a/core/src/main/java/hudson/model/ViewJob.java b/core/src/main/java/hudson/model/ViewJob.java
    index dc16020834..492d6eddd0 100644
    --- a/core/src/main/java/hudson/model/ViewJob.java
    +++ b/core/src/main/java/hudson/model/ViewJob.java
    @@ -198,7 +198,7 @@ public abstract class ViewJob, RunT extends Run<
             }
     
             private boolean terminating() {
    -            return Jenkins.getInstance().isTerminating();
    +            return Jenkins.get().isTerminating();
             }
     
             @Override
    diff --git a/core/src/main/java/hudson/model/ViewProperty.java b/core/src/main/java/hudson/model/ViewProperty.java
    index d93ab75cf0..2ace3390f9 100644
    --- a/core/src/main/java/hudson/model/ViewProperty.java
    +++ b/core/src/main/java/hudson/model/ViewProperty.java
    @@ -38,9 +38,9 @@ import org.kohsuke.stapler.StaplerRequest;
      * persisted with the view object.
      *
      * 

    - * Configuration screen should be defined in config.jelly. + * Configuration screen should be defined in {@code config.jelly}. * Within this page, the {@link ViewProperty} instance is available as - * the instance EL variable (while the it EL variable + * the {@code instance} EL variable (while the {@code it} EL variable * refers to the {@link View}. * * @author Stephen Connolly @@ -59,11 +59,11 @@ public class ViewProperty implements ReconfigurableDescribable, Ex } public ViewPropertyDescriptor getDescriptor() { - return (ViewPropertyDescriptor) Jenkins.getInstance().getDescriptorOrDie(getClass()); + return (ViewPropertyDescriptor) Jenkins.get().getDescriptorOrDie(getClass()); } public static DescriptorExtensionList all() { - return Jenkins.getInstance().getDescriptorList(ViewProperty.class); + return Jenkins.get().getDescriptorList(ViewProperty.class); } public ViewProperty reconfigure(StaplerRequest req, JSONObject form) throws Descriptor.FormException { diff --git a/core/src/main/java/hudson/model/WorkspaceBrowser.java b/core/src/main/java/hudson/model/WorkspaceBrowser.java index 037420d53d..cc685bb061 100644 --- a/core/src/main/java/hudson/model/WorkspaceBrowser.java +++ b/core/src/main/java/hudson/model/WorkspaceBrowser.java @@ -46,7 +46,7 @@ public abstract class WorkspaceBrowser implements ExtensionPoint { /** * Provide access to job's workspace * @param job - * @return null if this WorkspaceBrowser don't have a workspace for this job + * @return {@code null} if this WorkspaceBrowser don't have a workspace for this job */ public abstract @CheckForNull FilePath getWorkspace(Job job); diff --git a/core/src/main/java/hudson/model/WorkspaceCleanupThread.java b/core/src/main/java/hudson/model/WorkspaceCleanupThread.java index 056bb2c712..865da597c6 100644 --- a/core/src/main/java/hudson/model/WorkspaceCleanupThread.java +++ b/core/src/main/java/hudson/model/WorkspaceCleanupThread.java @@ -66,7 +66,7 @@ public class WorkspaceCleanupThread extends AsyncPeriodicWork { return; } List nodes = new ArrayList<>(); - Jenkins j = Jenkins.getInstance(); + Jenkins j = Jenkins.get(); nodes.add(j); nodes.addAll(j.getNodes()); for (TopLevelItem item : j.allItems(TopLevelItem.class)) { diff --git a/core/src/main/java/hudson/model/labels/LabelAssignmentAction.java b/core/src/main/java/hudson/model/labels/LabelAssignmentAction.java index c91284aef3..e51a4028be 100644 --- a/core/src/main/java/hudson/model/labels/LabelAssignmentAction.java +++ b/core/src/main/java/hudson/model/labels/LabelAssignmentAction.java @@ -33,7 +33,7 @@ public interface LabelAssignmentAction extends Action { * @param task * Never null. * @return - * null to let other {@link LabelAssignmentAction}s take control, eventually to {@code SubTask#getAssignedLabel()}. + * null to let other {@link LabelAssignmentAction}s take control, eventually to {@link SubTask#getAssignedLabel()}. * If non-null value is returned, that label will be authoritative. */ Label getAssignedLabel(@Nonnull SubTask task); diff --git a/core/src/main/java/hudson/model/labels/LabelAtom.java b/core/src/main/java/hudson/model/labels/LabelAtom.java index d2a634cd4c..c7c4d525d0 100644 --- a/core/src/main/java/hudson/model/labels/LabelAtom.java +++ b/core/src/main/java/hudson/model/labels/LabelAtom.java @@ -44,6 +44,7 @@ import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerResponse; import org.kohsuke.stapler.export.Exported; import org.kohsuke.stapler.interceptor.RequirePOST; +import org.kohsuke.stapler.verb.POST; import javax.servlet.ServletException; import java.io.File; @@ -162,7 +163,7 @@ public class LabelAtom extends Label implements Saveable { } /*package*/ XmlFile getConfigFile() { - return new XmlFile(XSTREAM, new File(Jenkins.getInstance().root, "labels/"+name+".xml")); + return new XmlFile(XSTREAM, new File(Jenkins.get().root, "labels/"+name+".xml")); } public void save() throws IOException { @@ -199,9 +200,9 @@ public class LabelAtom extends Label implements Saveable { /** * Accepts the update to the node configuration. */ - @RequirePOST + @POST public void doConfigSubmit( StaplerRequest req, StaplerResponse rsp ) throws IOException, ServletException, FormException { - final Jenkins app = Jenkins.getInstance(); + final Jenkins app = Jenkins.get(); app.checkPermission(Jenkins.ADMINISTER); @@ -221,7 +222,7 @@ public class LabelAtom extends Label implements Saveable { @RequirePOST @Restricted(DoNotUse.class) public synchronized void doSubmitDescription( StaplerRequest req, StaplerResponse rsp ) throws IOException, ServletException { - Jenkins.getInstance().checkPermission(Jenkins.ADMINISTER); + Jenkins.get().checkPermission(Jenkins.ADMINISTER); setDescription(req.getParameter("description")); rsp.sendRedirect("."); // go to the top page @@ -232,12 +233,12 @@ public class LabelAtom extends Label implements Saveable { * @see Jenkins#getLabelAtom */ public static @Nullable LabelAtom get(@CheckForNull String l) { - return Jenkins.getInstance().getLabelAtom(l); + return Jenkins.get().getLabelAtom(l); } public static LabelAtom findNearest(String name) { List candidates = new ArrayList<>(); - for (LabelAtom a : Jenkins.getInstance().getLabelAtoms()) { + for (LabelAtom a : Jenkins.get().getLabelAtoms()) { candidates.add(a.getName()); } return get(EditDistance.findNearest(name, candidates)); diff --git a/core/src/main/java/hudson/model/labels/LabelAtomProperty.java b/core/src/main/java/hudson/model/labels/LabelAtomProperty.java index d2c2cc9825..e7ae7670b8 100644 --- a/core/src/main/java/hudson/model/labels/LabelAtomProperty.java +++ b/core/src/main/java/hudson/model/labels/LabelAtomProperty.java @@ -61,6 +61,6 @@ public class LabelAtomProperty extends AbstractDescribableImpl all() { - return Jenkins.getInstance().getDescriptorList(LabelAtomProperty.class); + return Jenkins.get().getDescriptorList(LabelAtomProperty.class); } } diff --git a/core/src/main/java/hudson/model/labels/LabelAtomPropertyDescriptor.java b/core/src/main/java/hudson/model/labels/LabelAtomPropertyDescriptor.java index 82312097dc..b9b9312939 100644 --- a/core/src/main/java/hudson/model/labels/LabelAtomPropertyDescriptor.java +++ b/core/src/main/java/hudson/model/labels/LabelAtomPropertyDescriptor.java @@ -33,7 +33,7 @@ import hudson.model.Descriptor; * Put {@link Extension} on your descriptor implementation to have it auto-registered. * *

    - * When extending this class, override Descriptor.getDisplayName(). In the + * When extending this class, override {@link Descriptor#getDisplayName()}. In the * context of LabelAtomPropertyDescriptor, this function is used to determine the label of * the checkbox shown in the label's configuration page to activate the extension. * diff --git a/core/src/main/java/hudson/model/listeners/ItemListener.java b/core/src/main/java/hudson/model/listeners/ItemListener.java index 20be92f1c2..b87db51150 100644 --- a/core/src/main/java/hudson/model/listeners/ItemListener.java +++ b/core/src/main/java/hudson/model/listeners/ItemListener.java @@ -183,11 +183,11 @@ public class ItemListener implements ExtensionPoint { } public static void fireOnCopied(final Item src, final Item result) { - forAll(new Function() { - @Override public Void apply(ItemListener l) { + forAll(l -> { + if (l != null) { l.onCopied(src, result); - return null; } + return null; }); } @@ -213,30 +213,30 @@ public class ItemListener implements ExtensionPoint { } public static void fireOnCreated(final Item item) { - forAll(new Function() { - @Override public Void apply(ItemListener l) { + forAll(l -> { + if (l != null) { l.onCreated(item); - return null; } + return null; }); } public static void fireOnUpdated(final Item item) { - forAll(new Function() { - @Override public Void apply(ItemListener l) { + forAll(l -> { + if (l != null) { l.onUpdated(item); - return null; } + return null; }); } /** @since 1.548 */ public static void fireOnDeleted(final Item item) { - forAll(new Function() { - @Override public Void apply(ItemListener l) { + forAll(l -> { + if (l != null) { l.onDeleted(item); - return null; } + return null; }); } @@ -258,18 +258,18 @@ public class ItemListener implements ExtensionPoint { final String oldName = oldFullName.substring(prefixS); final String newName = rootItem.getName(); assert newName.equals(newFullName.substring(prefixS)); - forAll(new Function() { - @Override public Void apply(ItemListener l) { + forAll(l -> { + if (l != null) { l.onRenamed(rootItem, oldName, newName); - return null; } + return null; }); } - forAll(new Function() { - @Override public Void apply(ItemListener l) { + forAll(l -> { + if (l!= null) { l.onLocationChanged(rootItem, oldFullName, newFullName); - return null; } + return null; }); if (rootItem instanceof ItemGroup) { for (final Item child : Items.allItems(ACL.SYSTEM, (ItemGroup)rootItem, Item.class)) { @@ -277,11 +277,11 @@ public class ItemListener implements ExtensionPoint { assert childNew.startsWith(newFullName); assert childNew.charAt(newFullName.length()) == '/'; final String childOld = oldFullName + childNew.substring(newFullName.length()); - forAll(new Function() { - @Override public Void apply(ItemListener l) { + forAll(l -> { + if (l != null) { l.onLocationChanged(child, childOld, childNew); - return null; } + return null; }); } } diff --git a/core/src/main/java/hudson/model/listeners/RunListener.java b/core/src/main/java/hudson/model/listeners/RunListener.java index 1803386d2a..e0bbb2a3c7 100644 --- a/core/src/main/java/hudson/model/listeners/RunListener.java +++ b/core/src/main/java/hudson/model/listeners/RunListener.java @@ -28,6 +28,7 @@ import hudson.ExtensionListView; import hudson.Extension; import hudson.ExtensionList; import hudson.FilePath; +import hudson.Functions; import hudson.Launcher; import hudson.model.AbstractBuild; import hudson.model.BuildListener; @@ -36,7 +37,6 @@ import hudson.model.JobProperty; import hudson.model.Run; import hudson.model.Run.RunnerAbortedException; import hudson.model.TaskListener; -import jenkins.model.Jenkins; import hudson.scm.SCM; import hudson.tasks.BuildWrapper; import hudson.util.CopyOnWriteList; @@ -246,7 +246,7 @@ public abstract class RunListener implements ExtensionPoint { * Fires the {@link #onFinalized(Run)} event. */ public static void fireFinalized(Run r) { - if (Jenkins.getInstanceOrNull() == null) { // TODO use !Functions.isExtensionsAvailable() once JENKINS-33377 + if (!Functions.isExtensionsAvailable()) { return; } for (RunListener l : all()) { diff --git a/core/src/main/java/hudson/model/listeners/SCMListener.java b/core/src/main/java/hudson/model/listeners/SCMListener.java index 3f9c9089a0..7bc27b6be1 100644 --- a/core/src/main/java/hudson/model/listeners/SCMListener.java +++ b/core/src/main/java/hudson/model/listeners/SCMListener.java @@ -140,12 +140,12 @@ public abstract class SCMListener implements ExtensionPoint { /** @deprecated Use {@link Extension} instead. */ @Deprecated public final void register() { - Jenkins.getInstance().getSCMListeners().add(this); + Jenkins.get().getSCMListeners().add(this); } /** @deprecated Use {@link Extension} instead. */ @Deprecated public final boolean unregister() { - return Jenkins.getInstance().getSCMListeners().remove(this); + return Jenkins.get().getSCMListeners().remove(this); } } diff --git a/core/src/main/java/hudson/model/queue/AbstractQueueSorterImpl.java b/core/src/main/java/hudson/model/queue/AbstractQueueSorterImpl.java index 0752dadab4..b0d6ce25ab 100644 --- a/core/src/main/java/hudson/model/queue/AbstractQueueSorterImpl.java +++ b/core/src/main/java/hudson/model/queue/AbstractQueueSorterImpl.java @@ -1,8 +1,10 @@ package hudson.model.queue; +import hudson.RestrictedSince; import hudson.model.Queue.BuildableItem; +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.NoExternalUse; -import java.util.Collections; import java.util.Comparator; import java.util.List; @@ -29,24 +31,28 @@ public abstract class AbstractQueueSorterImpl extends QueueSorter implements Com * The default implementation does FIFO. */ public int compare(BuildableItem lhs, BuildableItem rhs) { - return compare(lhs.buildableStartMilliseconds,rhs.buildableStartMilliseconds); + return Long.compare(lhs.buildableStartMilliseconds,rhs.buildableStartMilliseconds); } /** + * @deprecated Use Long.compare instead. * sign(a-b). */ + @Deprecated + @Restricted(NoExternalUse.class) + @RestrictedSince("TODO") protected static int compare(long a, long b) { - if (a>b) return 1; - if (ab) return 1; - if (a loads = new ArrayList<>(); - for (BuildableItem bi : Jenkins.getInstance().getQueue().getBuildableItems()) { + for (BuildableItem bi : Jenkins.get().getQueue().getBuildableItems()) { TentativePlan tp = bi.getAction(TentativePlan.class); if (tp==null) {// do this even for bi==plan.item ensures that we have FIFO semantics in tentative plans. tp = makeTentativePlan(bi); @@ -95,7 +95,7 @@ public class BackFiller extends LoadPredictor { try { // pretend for now that all executors are available and decide some assignment that's executable. List slots = new ArrayList<>(); - for (Computer c : Jenkins.getInstance().getComputers()) { + for (Computer c : Jenkins.get().getComputers()) { if (c.isOffline()) continue; for (Executor e : c.getExecutors()) { slots.add(new PseudoExecutorSlot(e)); @@ -105,7 +105,7 @@ public class BackFiller extends LoadPredictor { // also ignore all load predictions as we just want to figure out some executable assignment // and we are not trying to figure out if this task is executable right now. MappingWorksheet worksheet = new MappingWorksheet(bi, slots, Collections.emptyList()); - Mapping m = Jenkins.getInstance().getQueue().getLoadBalancer().map(bi.task, worksheet); + Mapping m = Jenkins.get().getQueue().getLoadBalancer().map(bi.task, worksheet); if (m==null) return null; // figure out how many executors we need on each computer? diff --git a/core/src/main/java/hudson/model/queue/FutureImpl.java b/core/src/main/java/hudson/model/queue/FutureImpl.java index 172fd6bb47..d7151f644c 100644 --- a/core/src/main/java/hudson/model/queue/FutureImpl.java +++ b/core/src/main/java/hudson/model/queue/FutureImpl.java @@ -70,7 +70,7 @@ public final class FutureImpl extends AsyncFutureImpl implements Que @Override public boolean cancel(boolean mayInterruptIfRunning) { - Queue q = Jenkins.getInstance().getQueue(); + Queue q = Jenkins.get().getQueue(); synchronized (q) { synchronized (this) { if(!executors.isEmpty()) { diff --git a/core/src/main/java/hudson/model/queue/QueueSorter.java b/core/src/main/java/hudson/model/queue/QueueSorter.java index 97d314f22f..6c9d865240 100644 --- a/core/src/main/java/hudson/model/queue/QueueSorter.java +++ b/core/src/main/java/hudson/model/queue/QueueSorter.java @@ -8,12 +8,11 @@ import hudson.model.LoadBalancer; import hudson.model.Queue; import hudson.model.Queue.BuildableItem; -import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.logging.Logger; -import static hudson.init.InitMilestone.JOB_LOADED; +import static hudson.init.InitMilestone.JOB_CONFIG_ADAPTED; /** * Singleton extension point for sorting buildable items @@ -69,12 +68,12 @@ public abstract class QueueSorter implements ExtensionPoint { * * {@link Queue#Queue(LoadBalancer)} is too early to do this */ - @Initializer(after=JOB_LOADED) + @Initializer(after=JOB_CONFIG_ADAPTED) public static void installDefaultQueueSorter() { ExtensionList all = all(); if (all.isEmpty()) return; - Queue q = Jenkins.getInstance().getQueue(); + Queue q = Jenkins.get().getQueue(); if (q.getSorter()!=null) return; // someone has already installed something. leave that alone. q.setSorter(all.get(0)); diff --git a/core/src/main/java/hudson/model/queue/ScheduleResult.java b/core/src/main/java/hudson/model/queue/ScheduleResult.java index 0ba9b08944..95ebf0394a 100644 --- a/core/src/main/java/hudson/model/queue/ScheduleResult.java +++ b/core/src/main/java/hudson/model/queue/ScheduleResult.java @@ -1,7 +1,9 @@ package hudson.model.queue; +import hudson.model.Action; import hudson.model.Queue; import hudson.model.Queue.Item; +import hudson.model.Queue.Task; import hudson.model.Queue.WaitingItem; import javax.annotation.CheckForNull; diff --git a/core/src/main/java/hudson/model/queue/WorkUnitContext.java b/core/src/main/java/hudson/model/queue/WorkUnitContext.java index 82a9ef343d..1196c32ec0 100644 --- a/core/src/main/java/hudson/model/queue/WorkUnitContext.java +++ b/core/src/main/java/hudson/model/queue/WorkUnitContext.java @@ -28,6 +28,8 @@ import hudson.model.Executor; import hudson.model.Queue; import hudson.model.Queue.BuildableItem; import hudson.model.Queue.Task; +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.NoExternalUse; import java.util.ArrayList; import java.util.Collections; @@ -107,13 +109,19 @@ public final class WorkUnitContext { /** * All the {@link Executor}s that jointly execute a {@link Task} call this method to synchronize on the start. */ + @Restricted(NoExternalUse.class) public void synchronizeStart() throws InterruptedException { - startLatch.synchronize(); - // the main thread will send a notification - Executor e = Executor.currentExecutor(); - WorkUnit wu = e.getCurrentWorkUnit(); - if (wu.isMainWork()) { - future.start.set(e.getCurrentExecutable()); + // Let code waiting for the start (future.start.get()) finishes when there is a faulty SubTask by setting the + // future always. + try { + startLatch.synchronize(); + } finally { + // the main thread will send a notification + Executor e = Executor.currentExecutor(); + WorkUnit wu = e.getCurrentWorkUnit(); + if (wu.isMainWork()) { + future.start.set(e.getCurrentExecutable()); + } } } @@ -129,18 +137,23 @@ public final class WorkUnitContext { * If any of the member thread is interrupted while waiting for other threads to join, all * the member threads will report {@link InterruptedException}. */ + @Restricted(NoExternalUse.class) public void synchronizeEnd(Executor e, Queue.Executable executable, Throwable problems, long duration) throws InterruptedException { - endLatch.synchronize(); - - // the main thread will send a notification - WorkUnit wu = e.getCurrentWorkUnit(); - if (wu.isMainWork()) { - if (problems == null) { - future.set(executable); - e.getOwner().taskCompleted(e, task, duration); - } else { - future.set(problems); - e.getOwner().taskCompletedWithProblems(e, task, duration, problems); + // Let code waiting for the build to finish (future.get()) finishes when there is a faulty SubTask by setting + // the future always. + try { + endLatch.synchronize(); + } finally { + // the main thread will send a notification + WorkUnit wu = e.getCurrentWorkUnit(); + if (wu.isMainWork()) { + if (problems == null) { + future.set(executable); + e.getOwner().taskCompleted(e, task, duration); + } else { + future.set(problems); + e.getOwner().taskCompletedWithProblems(e, task, duration, problems); + } } } } diff --git a/core/src/main/java/hudson/node_monitors/AbstractAsyncNodeMonitorDescriptor.java b/core/src/main/java/hudson/node_monitors/AbstractAsyncNodeMonitorDescriptor.java index 5ef4eff637..5b567ab8ad 100644 --- a/core/src/main/java/hudson/node_monitors/AbstractAsyncNodeMonitorDescriptor.java +++ b/core/src/main/java/hudson/node_monitors/AbstractAsyncNodeMonitorDescriptor.java @@ -85,7 +85,7 @@ public abstract class AbstractAsyncNodeMonitorDescriptor extends AbstractNode Map> futures = new HashMap<>(); Set skipped = new HashSet<>(); - for (Computer c : Jenkins.getInstance().getComputers()) { + for (Computer c : Jenkins.get().getComputers()) { try { VirtualChannel ch = c.getChannel(); futures.put(c,null); // sentinel value @@ -124,6 +124,11 @@ public abstract class AbstractAsyncNodeMonitorDescriptor extends AbstractNode } private void error(Computer c, Throwable x) { + // JENKINS-54496: don't log if c was removed from Jenkins after we'd started monitoring + final boolean cIsStillCurrent = Jenkins.get().getComputer(c.getName()) == c; + if (!cIsStillCurrent) { + return; + } if (c instanceof SlaveComputer) { Functions.printStackTrace(x, ((SlaveComputer) c).getListener().error("Failed to monitor for " + getDisplayName())); } else { diff --git a/core/src/main/java/hudson/node_monitors/AbstractNodeMonitorDescriptor.java b/core/src/main/java/hudson/node_monitors/AbstractNodeMonitorDescriptor.java index 80ae4d36fb..267a24390a 100644 --- a/core/src/main/java/hudson/node_monitors/AbstractNodeMonitorDescriptor.java +++ b/core/src/main/java/hudson/node_monitors/AbstractNodeMonitorDescriptor.java @@ -31,6 +31,7 @@ import hudson.model.ComputerSet; import hudson.model.AdministrativeMonitor; import hudson.triggers.SafeTimerTask; import hudson.slaves.OfflineCause; +import jenkins.util.SystemProperties; import jenkins.util.Timer; import javax.annotation.concurrent.GuardedBy; @@ -53,13 +54,15 @@ import java.util.logging.Logger; * @author Kohsuke Kawaguchi */ public abstract class AbstractNodeMonitorDescriptor extends Descriptor { + private static long PERIOD = TimeUnit.MINUTES.toMillis(SystemProperties.getInteger(AbstractNodeMonitorDescriptor.class.getName() + ".periodMinutes", 60)); + /** * @deprecated as of 1.522 * Extend from {@link AbstractAsyncNodeMonitorDescriptor} */ @Deprecated protected AbstractNodeMonitorDescriptor() { - this(HOUR); + this(PERIOD); } /** @@ -77,7 +80,7 @@ public abstract class AbstractNodeMonitorDescriptor extends Descriptor clazz) { - this(clazz,HOUR); + this(clazz, PERIOD); } /** @@ -141,7 +144,7 @@ public abstract class AbstractNodeMonitorDescriptor extends Descriptor monitor() throws InterruptedException { Map data = new HashMap<>(); - for( Computer c : Jenkins.getInstance().getComputers() ) { + for( Computer c : Jenkins.get().getComputers() ) { try { Thread.currentThread().setName("Monitoring "+c.getDisplayName()+" for "+getDisplayName()); @@ -192,7 +195,7 @@ public abstract class AbstractNodeMonitorDescriptor extends Descriptor extends Descriptor DESCRIPTOR; diff --git a/core/src/main/java/hudson/node_monitors/DiskSpaceMonitor.java b/core/src/main/java/hudson/node_monitors/DiskSpaceMonitor.java index 9f185b5891..36714979d2 100644 --- a/core/src/main/java/hudson/node_monitors/DiskSpaceMonitor.java +++ b/core/src/main/java/hudson/node_monitors/DiskSpaceMonitor.java @@ -57,7 +57,7 @@ public class DiskSpaceMonitor extends AbstractDiskSpaceMonitor { @Override public String getColumnCaption() { // Hide this column from non-admins - return Jenkins.getInstance().hasPermission(Jenkins.ADMINISTER) ? super.getColumnCaption() : null; + return Jenkins.get().hasPermission(Jenkins.ADMINISTER) ? super.getColumnCaption() : null; } public static final DiskSpaceMonitorDescriptor DESCRIPTOR = new DiskSpaceMonitorDescriptor() { diff --git a/core/src/main/java/hudson/node_monitors/DiskSpaceMonitorDescriptor.java b/core/src/main/java/hudson/node_monitors/DiskSpaceMonitorDescriptor.java index 3fb8297100..13bd79093a 100644 --- a/core/src/main/java/hudson/node_monitors/DiskSpaceMonitorDescriptor.java +++ b/core/src/main/java/hudson/node_monitors/DiskSpaceMonitorDescriptor.java @@ -71,7 +71,10 @@ public abstract class DiskSpaceMonitorDescriptor extends AbstractAsyncNodeMonito @Override public String toString() { - return Messages.DiskSpaceMonitorDescriptor_DiskSpace_FreeSpaceTooLow(getGbLeft(), path); + if(triggered) { + return Messages.DiskSpaceMonitorDescriptor_DiskSpace_FreeSpaceTooLow(getGbLeft(), path); + } + return Messages.DiskSpaceMonitorDescriptor_DiskSpace_FreeSpace(getGbLeft(), path); } /** diff --git a/core/src/main/java/hudson/node_monitors/NodeMonitor.java b/core/src/main/java/hudson/node_monitors/NodeMonitor.java index 68cd1898a8..b0e5f2fe40 100644 --- a/core/src/main/java/hudson/node_monitors/NodeMonitor.java +++ b/core/src/main/java/hudson/node_monitors/NodeMonitor.java @@ -81,7 +81,7 @@ public abstract class NodeMonitor implements ExtensionPoint, Describable getDescriptor() { - return (AbstractNodeMonitorDescriptor) Jenkins.getInstance().getDescriptorOrDie(getClass()); + return (AbstractNodeMonitorDescriptor) Jenkins.get().getDescriptorOrDie(getClass()); } /** @@ -146,6 +146,6 @@ public abstract class NodeMonitor implements ExtensionPoint, Describable> all() { - return Jenkins.getInstance().getDescriptorList(NodeMonitor.class); + return Jenkins.get().getDescriptorList(NodeMonitor.class); } } diff --git a/core/src/main/java/hudson/node_monitors/NodeMonitorUpdater.java b/core/src/main/java/hudson/node_monitors/NodeMonitorUpdater.java index c23b069f8f..eb33c99238 100644 --- a/core/src/main/java/hudson/node_monitors/NodeMonitorUpdater.java +++ b/core/src/main/java/hudson/node_monitors/NodeMonitorUpdater.java @@ -24,7 +24,7 @@ public class NodeMonitorUpdater extends ComputerListener { private static final Runnable MONITOR_UPDATER = new Runnable() { @Override public void run() { - for (NodeMonitor nm : Jenkins.getInstance().getComputer().getMonitors()) { + for (NodeMonitor nm : Jenkins.get().getComputer().getMonitors()) { nm.triggerUpdate(); } } diff --git a/core/src/main/java/hudson/node_monitors/SwapSpaceMonitor.java b/core/src/main/java/hudson/node_monitors/SwapSpaceMonitor.java index 1e2d530e21..b05d52cd3c 100644 --- a/core/src/main/java/hudson/node_monitors/SwapSpaceMonitor.java +++ b/core/src/main/java/hudson/node_monitors/SwapSpaceMonitor.java @@ -78,13 +78,14 @@ public class SwapSpaceMonitor extends NodeMonitor { @Override public String getColumnCaption() { // Hide this column from non-admins - return Jenkins.getInstance().hasPermission(Jenkins.ADMINISTER) ? super.getColumnCaption() : null; + return Jenkins.get().hasPermission(Jenkins.ADMINISTER) ? super.getColumnCaption() : null; } /** * @deprecated as of 2.0 * use injection */ + @Deprecated public static /*almost final*/ AbstractNodeMonitorDescriptor DESCRIPTOR; @Extension @Symbol("swapSpace") diff --git a/core/src/main/java/hudson/node_monitors/TemporarySpaceMonitor.java b/core/src/main/java/hudson/node_monitors/TemporarySpaceMonitor.java index 05e148cf6a..d495ee4823 100644 --- a/core/src/main/java/hudson/node_monitors/TemporarySpaceMonitor.java +++ b/core/src/main/java/hudson/node_monitors/TemporarySpaceMonitor.java @@ -59,13 +59,14 @@ public class TemporarySpaceMonitor extends AbstractDiskSpaceMonitor { @Override public String getColumnCaption() { // Hide this column from non-admins - return Jenkins.getInstance().hasPermission(Jenkins.ADMINISTER) ? super.getColumnCaption() : null; + return Jenkins.get().hasPermission(Jenkins.ADMINISTER) ? super.getColumnCaption() : null; } /** * @deprecated as of 2.0 * Use injection */ + @Deprecated public static /*almost final*/ DiskSpaceMonitorDescriptor DESCRIPTOR; @Extension @Symbol("tmpSpace") @@ -93,6 +94,7 @@ public class TemporarySpaceMonitor extends AbstractDiskSpaceMonitor { /** * @deprecated as of 2.0 */ + @Deprecated public static DiskSpaceMonitorDescriptor install() { return DESCRIPTOR; } 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 1e532b9f31..796ac39776 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 @@ -23,8 +23,11 @@ package hudson.org.apache.tools.tar; +import hudson.RestrictedSince; import org.apache.tools.tar.TarBuffer; import org.apache.tools.tar.TarEntry; +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.NoExternalUse; import java.io.FilterInputStream; import java.io.IOException; @@ -40,6 +43,8 @@ import java.io.ByteArrayOutputStream; * @deprecated Use {@link org.apache.commons.compress.archivers.tar.TarArchiveInputStream} instead */ @Deprecated +@Restricted(NoExternalUse.class) +@RestrictedSince("2.200") public class TarInputStream extends FilterInputStream { // CheckStyle:VisibilityModifier OFF - bc diff --git a/core/src/main/java/hudson/org/apache/tools/tar/TarOutputStream.java b/core/src/main/java/hudson/org/apache/tools/tar/TarOutputStream.java index 09d994027d..79fe3f5a02 100644 --- a/core/src/main/java/hudson/org/apache/tools/tar/TarOutputStream.java +++ b/core/src/main/java/hudson/org/apache/tools/tar/TarOutputStream.java @@ -23,9 +23,12 @@ package hudson.org.apache.tools.tar; +import hudson.RestrictedSince; import org.apache.tools.tar.TarBuffer; import org.apache.tools.tar.TarConstants; import org.apache.tools.tar.TarEntry; +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.NoExternalUse; import java.io.FilterOutputStream; import java.io.OutputStream; @@ -41,6 +44,8 @@ import java.nio.charset.StandardCharsets; * */ @Deprecated +@Restricted(NoExternalUse.class) +@RestrictedSince("2.200") public class TarOutputStream extends FilterOutputStream { /** Fail if a long file name is required in the archive. */ public static final int LONGFILE_ERROR = 0; diff --git a/core/src/test/java/hudson/os/WindowsUtil.java b/core/src/main/java/hudson/os/WindowsUtil.java similarity index 84% rename from core/src/test/java/hudson/os/WindowsUtil.java rename to core/src/main/java/hudson/os/WindowsUtil.java index 6e528827a3..77f72b6c4a 100644 --- a/core/src/test/java/hudson/os/WindowsUtil.java +++ b/core/src/main/java/hudson/os/WindowsUtil.java @@ -34,15 +34,21 @@ import java.util.Arrays; import java.util.regex.Pattern; import java.util.stream.Collectors; -import static org.junit.Assert.assertTrue; - -// adapted from: -// https://blogs.msdn.microsoft.com/twistylittlepassagesallalike/2011/04/23/everyone-quotes-command-line-arguments-the-wrong-way/ +/** + * Utilities for the Windows Platform. + * Adapted from: + * https://blogs.msdn.microsoft.com/twistylittlepassagesallalike/2011/04/23/everyone-quotes-command-line-arguments-the-wrong-way/ + * + * @since 2.183 + */ public class WindowsUtil { private static final Pattern NEEDS_QUOTING = Pattern.compile("[\\s\"]"); /** * Quotes an argument while escaping special characters interpreted by CreateProcess. + * + * @param argument argument to be quoted or escaped for windows shells. + * @return properly quoted and escaped windows arguments. */ public static @Nonnull String quoteArgument(@Nonnull String argument) { if (!NEEDS_QUOTING.matcher(argument).find()) return argument; @@ -80,6 +86,8 @@ public class WindowsUtil { /** * Quotes an argument while escaping special characters suitable for use as an argument to {@code cmd.exe}. + * @param argument argument to be quoted or escaped for {@code cmd.exe}. + * @return properly quoted and escaped arguments to {@code cmd.exe}. */ public static @Nonnull String quoteArgumentForCmd(@Nonnull String argument) { return CMD_METACHARS.matcher(quoteArgument(argument)).replaceAll("^$0"); @@ -87,6 +95,8 @@ public class WindowsUtil { /** * Executes a command and arguments using {@code cmd.exe /C ...}. + * @param argv arguments to be quoted or escaped for {@code cmd.exe /C ...}. + * @return properly quoted and escaped arguments to {@code cmd.exe /C ...}. */ public static @Nonnull Process execCmd(String... argv) throws IOException { String command = Arrays.stream(argv).map(WindowsUtil::quoteArgumentForCmd).collect(Collectors.joining(" ")); @@ -101,10 +111,12 @@ public class WindowsUtil { * @return the newly created junction point * @throws IOException if the call to mklink exits with a non-zero status code * @throws InterruptedException if the call to mklink is interrupted before completing - * @throws AssertionError if this method is called on a non-Windows platform + * @throws UnsupportedOperationException if this method is called on a non-Windows platform */ public static @Nonnull File createJunction(@Nonnull File junction, @Nonnull File target) throws IOException, InterruptedException { - assertTrue(Functions.isWindows()); + if (!Functions.isWindows()) { + throw new UnsupportedOperationException("Can only be called on windows platform"); + } Process mklink = execCmd("mklink", "/J", junction.getAbsolutePath(), target.getAbsolutePath()); int result = mklink.waitFor(); if (result != 0) { diff --git a/core/src/main/java/hudson/os/solaris/ZFSInstaller.java b/core/src/main/java/hudson/os/solaris/ZFSInstaller.java index f22a0b7879..15397b8d58 100644 --- a/core/src/main/java/hudson/os/solaris/ZFSInstaller.java +++ b/core/src/main/java/hudson/os/solaris/ZFSInstaller.java @@ -108,7 +108,7 @@ public class ZFSInstaller extends AdministrativeMonitor implements Serializable return false; // no active ZFS pool // if we don't run on a ZFS file system, activate - ZFSFileSystem hudsonZfs = zfs.getFileSystemByMountPoint(Jenkins.getInstance().getRootDir()); + ZFSFileSystem hudsonZfs = zfs.getFileSystemByMountPoint(Jenkins.get().getRootDir()); if(hudsonZfs!=null) return false; // already on ZFS @@ -132,7 +132,7 @@ public class ZFSInstaller extends AdministrativeMonitor implements Serializable */ @RequirePOST public HttpResponse doAct(StaplerRequest req) throws ServletException, IOException { - Jenkins.getInstance().checkPermission(Jenkins.ADMINISTER); + Jenkins.get().checkPermission(Jenkins.ADMINISTER); if(req.hasParameter("n")) { // we'll shut up @@ -165,7 +165,7 @@ public class ZFSInstaller extends AdministrativeMonitor implements Serializable throw new IOException("Failed to obtain the current user information for "+uid); final String userName = pwd.pw_name; - final File home = Jenkins.getInstance().getRootDir(); + final File home = Jenkins.get().getRootDir(); // this is the actual creation of the file system. // return true indicating a success @@ -233,7 +233,7 @@ public class ZFSInstaller extends AdministrativeMonitor implements Serializable */ @RequirePOST public void doStart(StaplerRequest req, StaplerResponse rsp, @QueryParameter String username, @QueryParameter String password) throws ServletException, IOException { - Jenkins hudson = Jenkins.getInstance(); + Jenkins hudson = Jenkins.get(); hudson.checkPermission(Jenkins.ADMINISTER); final String datasetName; @@ -335,7 +335,7 @@ public class ZFSInstaller extends AdministrativeMonitor implements Serializable private static boolean migrate(TaskListener listener, String target) throws IOException, InterruptedException { PrintStream out = listener.getLogger(); - File home = Jenkins.getInstance().getRootDir(); + File home = Jenkins.get().getRootDir(); // do the migration LibZFS zfs = new LibZFS(); ZFSFileSystem existing = zfs.getFileSystemByMountPoint(home); diff --git a/core/src/main/java/hudson/scheduler/CronTabList.java b/core/src/main/java/hudson/scheduler/CronTabList.java index eba4f007f8..edeb6e0a37 100644 --- a/core/src/main/java/hudson/scheduler/CronTabList.java +++ b/core/src/main/java/hudson/scheduler/CronTabList.java @@ -106,11 +106,12 @@ public final class CronTabList { line = line.trim(); if(lineNumber == 1 && line.startsWith("TZ=")) { - timezone = getValidTimezone(line.replace("TZ=","")); + final String timezoneString = line.replace("TZ=", ""); + timezone = getValidTimezone(timezoneString); if(timezone != null) { LOGGER.log(Level.CONFIG, "CRON with timezone {0}", timezone); } else { - throw new ANTLRException("Invalid or unsupported timezone '" + timezone + "'"); + throw new ANTLRException("Invalid or unsupported timezone '" + timezoneString + "'"); } continue; } diff --git a/core/src/main/java/hudson/scheduler/Hash.java b/core/src/main/java/hudson/scheduler/Hash.java index 43c9937572..833ee87e1c 100644 --- a/core/src/main/java/hudson/scheduler/Hash.java +++ b/core/src/main/java/hudson/scheduler/Hash.java @@ -23,7 +23,8 @@ */ package hudson.scheduler; -import java.io.UnsupportedEncodingException; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; + import java.nio.charset.StandardCharsets; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; @@ -52,10 +53,10 @@ public abstract class Hash { * Produces an integer in [0,n) */ public abstract int next(int n); - + public static Hash from(String seed) { try { - MessageDigest md5 = MessageDigest.getInstance("MD5"); + MessageDigest md5 = getMd5(); md5.update(seed.getBytes(StandardCharsets.UTF_8)); byte[] digest = md5.digest(); @@ -78,6 +79,12 @@ public abstract class Hash { } } + // TODO JENKINS-60563 remove MD5 from all usages in Jenkins + @SuppressFBWarnings(value = "WEAK_MESSAGE_DIGEST_MD5", justification = "Should not be used for security.") + private static MessageDigest getMd5() throws NoSuchAlgorithmException { + return MessageDigest.getInstance("MD5"); + } + /** * Creates a hash that always return 0. */ diff --git a/core/src/main/java/hudson/scm/AutoBrowserHolder.java b/core/src/main/java/hudson/scm/AutoBrowserHolder.java index 001d314871..d704ad4516 100644 --- a/core/src/main/java/hudson/scm/AutoBrowserHolder.java +++ b/core/src/main/java/hudson/scm/AutoBrowserHolder.java @@ -60,7 +60,7 @@ final class AutoBrowserHolder { cacheGeneration = -1; return cache; } - int g = d.generation; + int g = d.getGeneration(); if(g!=cacheGeneration) { cacheGeneration = g; cache = infer(); @@ -76,7 +76,7 @@ final class AutoBrowserHolder { * null if no applicable configuration was found. */ private RepositoryBrowser infer() { - for( AbstractProject p : Jenkins.getInstance().allItems(AbstractProject.class) ) { + for( AbstractProject p : Jenkins.get().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/EmptyChangeLogSet.java b/core/src/main/java/hudson/scm/EmptyChangeLogSet.java index 6329a6fa5c..1a933b2fd6 100644 --- a/core/src/main/java/hudson/scm/EmptyChangeLogSet.java +++ b/core/src/main/java/hudson/scm/EmptyChangeLogSet.java @@ -27,6 +27,6 @@ final class EmptyChangeLogSet extends ChangeLogSet { } public Iterator iterator() { - return Collections.emptySet().iterator(); + return Collections.emptyIterator(); } } diff --git a/core/src/main/java/hudson/scm/RepositoryBrowser.java b/core/src/main/java/hudson/scm/RepositoryBrowser.java index a4719a3090..d890d9970c 100644 --- a/core/src/main/java/hudson/scm/RepositoryBrowser.java +++ b/core/src/main/java/hudson/scm/RepositoryBrowser.java @@ -100,7 +100,7 @@ public abstract class RepositoryBrowser extends Ab * Returns all the registered {@link RepositoryBrowser} descriptors. */ public static DescriptorExtensionList,Descriptor>> all() { - return (DescriptorExtensionList) Jenkins.getInstance().getDescriptorList(RepositoryBrowser.class); + return (DescriptorExtensionList) Jenkins.get().getDescriptorList(RepositoryBrowser.class); } private static final long serialVersionUID = 1L; diff --git a/core/src/main/java/hudson/scm/SCM.java b/core/src/main/java/hudson/scm/SCM.java index b49f3f10fb..13e66c3873 100644 --- a/core/src/main/java/hudson/scm/SCM.java +++ b/core/src/main/java/hudson/scm/SCM.java @@ -97,6 +97,7 @@ public abstract class SCM implements Describable, ExtensionPoint { * Stores {@link AutoBrowserHolder}. Lazily created. * @deprecated Unused by default. */ + @Deprecated private transient AutoBrowserHolder autoBrowserHolder; /** @@ -642,7 +643,7 @@ public abstract class SCM implements Describable, ExtensionPoint { * all the module roots that were checked out from SCM. * *

    - * For normal SCMs, the array will be of length 1 and it's contents + * For normal SCMs, the array will be of length {@code 1} and it's contents * will be identical to calling {@link #getModuleRoot(FilePath, AbstractBuild)}. * * @param workspace The workspace root directory @@ -683,7 +684,7 @@ public abstract class SCM implements Describable, ExtensionPoint { public abstract ChangeLogParser createChangeLogParser(); public SCMDescriptor getDescriptor() { - return (SCMDescriptor) Jenkins.getInstance().getDescriptorOrDie(getClass()); + return (SCMDescriptor) Jenkins.get().getDescriptorOrDie(getClass()); } // @@ -727,7 +728,7 @@ public abstract class SCM implements Describable, ExtensionPoint { * Returns all the registered {@link SCMDescriptor}s. */ public static DescriptorExtensionList> all() { - return Jenkins.getInstance().>getDescriptorList(SCM.class); + return Jenkins.get().>getDescriptorList(SCM.class); } /** @@ -740,8 +741,8 @@ public abstract class SCM implements Describable, ExtensionPoint { public static List> _for(@CheckForNull final Job project) { if(project==null) return all(); - final Descriptor pd = Jenkins.getInstance().getDescriptor((Class) project.getClass()); - List> r = new ArrayList>(); + final Descriptor pd = Jenkins.get().getDescriptor((Class) project.getClass()); + List> r = new ArrayList<>(); for (SCMDescriptor scmDescriptor : all()) { if(!scmDescriptor.isApplicable(project)) continue; diff --git a/core/src/main/java/hudson/scm/SCMDescriptor.java b/core/src/main/java/hudson/scm/SCMDescriptor.java index 1479c2463f..f156aabeaf 100644 --- a/core/src/main/java/hudson/scm/SCMDescriptor.java +++ b/core/src/main/java/hudson/scm/SCMDescriptor.java @@ -23,14 +23,20 @@ */ package hudson.scm; +import hudson.RestrictedSince; import hudson.Util; import hudson.model.AbstractProject; import hudson.model.Descriptor; import hudson.model.Job; +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.NoExternalUse; + import java.lang.reflect.Field; import java.util.Collections; import java.util.List; import static java.util.logging.Level.WARNING; + +import java.util.concurrent.atomic.AtomicInteger; import java.util.logging.Logger; /** @@ -47,16 +53,8 @@ public abstract class SCMDescriptor extends Descriptor { * that type. Otherwise this SCM will not have any repository browser. */ public transient final Class repositoryBrowser; - - /** - * Incremented every time a new {@link SCM} instance is created from this descriptor. - * This is used to invalidate cache of {@link SCM#getEffectiveBrowser}. Due to the lack of synchronization and serialization, - * this field doesn't really count the # of instances created to date, - * but it's good enough for the cache invalidation. - * @deprecated No longer used by default. - */ - @Deprecated - public volatile int generation = 1; + + private transient final AtomicInteger atomicGeneration = new AtomicInteger(1); protected SCMDescriptor(Class clazz, Class repositoryBrowser) { super(clazz); @@ -74,6 +72,29 @@ public abstract class SCMDescriptor extends Descriptor { this.repositoryBrowser = repositoryBrowser; } + /** + * Incremented every time a new {@link SCM} instance is created from this descriptor. + * This is used to invalidate cache of {@link SCM#getEffectiveBrowser}. Due to the lack of synchronization and serialization, + * this field doesn't really count the # of instances created to date, + * but it's good enough for the cache invalidation. + * @deprecated No longer used by default. + */ + @Deprecated + @Restricted(NoExternalUse.class) @RestrictedSince("TODO") + public int getGeneration() { + return atomicGeneration.get(); + } + + /** + * Increments the generation value {@link SCMDescriptor#getGeneration} by one atomically. + * @deprecated No longer used by default. + */ + @Deprecated + @Restricted(NoExternalUse.class) @RestrictedSince("TODO") + public void incrementGeneration() { + atomicGeneration.incrementAndGet(); + } + // work around HUDSON-4514. The repositoryBrowser field was marked as non-transient until 1.325, // causing the field to be persisted and overwritten on the load method. @SuppressWarnings({"ConstantConditions"}) diff --git a/core/src/main/java/hudson/scm/SCMS.java b/core/src/main/java/hudson/scm/SCMS.java index 64a0c02cd8..975d41259b 100644 --- a/core/src/main/java/hudson/scm/SCMS.java +++ b/core/src/main/java/hudson/scm/SCMS.java @@ -60,7 +60,7 @@ public class SCMS { if (scm == null) { scm = new NullSCM(); // JENKINS-36043 workaround for AbstractMultiBranchProject.submit } - scm.getDescriptor().generation++; + scm.getDescriptor().incrementGeneration(); return scm; } diff --git a/core/src/main/java/hudson/search/Search.java b/core/src/main/java/hudson/search/Search.java index d799078f93..e21014a8d4 100644 --- a/core/src/main/java/hudson/search/Search.java +++ b/core/src/main/java/hudson/search/Search.java @@ -29,8 +29,6 @@ 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; @@ -68,10 +66,6 @@ import org.kohsuke.stapler.export.Flavor; * @see SearchableModelObject */ public class Search implements StaplerProxy { - @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(); @@ -194,7 +188,7 @@ public class Search implements StaplerProxy { @ExportedBean public static class Result { @Exported - public List suggestions = new ArrayList(); + public List suggestions = new ArrayList<>(); } @ExportedBean(defaultVisibility=999) @@ -310,7 +304,7 @@ public class Search implements StaplerProxy { } } - List buf = new ArrayList(); + List buf = new ArrayList<>(); List items = find(Mode.SUGGEST, index, tokenList, searchContext); // sort them @@ -372,9 +366,9 @@ public class Search implements StaplerProxy { List[] paths = new List[tokens.length()+1]; // we won't use [0]. for(int i=1;i<=tokens.length();i++) - paths[i] = new ArrayList(); + paths[i] = new ArrayList<>(); - List items = new ArrayList(); // items found in 1 step + List items = new ArrayList<>(); // items found in 1 step LOGGER.log(Level.FINE, "tokens={0}", tokens); @@ -413,7 +407,7 @@ public class Search implements StaplerProxy { @Restricted(NoExternalUse.class) public Object getTarget() { if (!SKIP_PERMISSION_CHECK) { - Jenkins.getInstance().checkPermission(Jenkins.READ); + Jenkins.get().checkPermission(Jenkins.READ); } return this; } diff --git a/core/src/main/java/hudson/security/ACL.java b/core/src/main/java/hudson/security/ACL.java index 1f39620c66..e02083e6aa 100644 --- a/core/src/main/java/hudson/security/ACL.java +++ b/core/src/main/java/hudson/security/ACL.java @@ -69,8 +69,12 @@ public abstract class ACL { if (a == SYSTEM) { return; } - if(!hasPermission(a,p)) + if (!hasPermission(a,p)) { + while (!p.enabled && p.impliedBy != null) { + p = p.impliedBy; + } throw new AccessDeniedException2(a,p); + } } /** diff --git a/core/src/main/java/hudson/security/ACLContext.java b/core/src/main/java/hudson/security/ACLContext.java index aa8455737b..ffcdf4b951 100644 --- a/core/src/main/java/hudson/security/ACLContext.java +++ b/core/src/main/java/hudson/security/ACLContext.java @@ -58,7 +58,6 @@ public class ACLContext implements AutoCloseable { return previousContext; } - /** {@inheritDoc} */ @Override public void close() { SecurityContextHolder.setContext(previousContext); diff --git a/core/src/main/java/hudson/security/AbstractPasswordBasedSecurityRealm.java b/core/src/main/java/hudson/security/AbstractPasswordBasedSecurityRealm.java index 5557f28979..fa72720272 100644 --- a/core/src/main/java/hudson/security/AbstractPasswordBasedSecurityRealm.java +++ b/core/src/main/java/hudson/security/AbstractPasswordBasedSecurityRealm.java @@ -35,7 +35,7 @@ public abstract class AbstractPasswordBasedSecurityRealm extends SecurityRealm i binding.setVariable("authenticator", new Authenticator()); BeanBuilder builder = new BeanBuilder(); - builder.parse(Jenkins.getInstance().servletContext.getResourceAsStream("/WEB-INF/security/AbstractPasswordBasedSecurityRealm.groovy"),binding); + builder.parse(Jenkins.get().servletContext.getResourceAsStream("/WEB-INF/security/AbstractPasswordBasedSecurityRealm.groovy"),binding); WebApplicationContext context = builder.createApplicationContext(); return new SecurityComponents( findBean(AuthenticationManager.class, context), diff --git a/core/src/main/java/hudson/security/AccessDeniedHandlerImpl.java b/core/src/main/java/hudson/security/AccessDeniedHandlerImpl.java index 94497cf87c..b784a3d37d 100644 --- a/core/src/main/java/hudson/security/AccessDeniedHandlerImpl.java +++ b/core/src/main/java/hudson/security/AccessDeniedHandlerImpl.java @@ -53,7 +53,7 @@ public class AccessDeniedHandlerImpl implements AccessDeniedHandler { ((AccessDeniedException2)cause).reportAsHeaders(rsp); } - WebApp.get(Jenkins.getInstance().servletContext).getSomeStapler() - .invoke(req,rsp, Jenkins.getInstance(), "/accessDenied"); + WebApp.get(Jenkins.get().servletContext).getSomeStapler() + .invoke(req,rsp, Jenkins.get(), "/accessDenied"); } } diff --git a/core/src/main/java/hudson/security/AuthorizationStrategy.java b/core/src/main/java/hudson/security/AuthorizationStrategy.java index ffd4be34c6..e95b0c426f 100644 --- a/core/src/main/java/hudson/security/AuthorizationStrategy.java +++ b/core/src/main/java/hudson/security/AuthorizationStrategy.java @@ -29,19 +29,17 @@ import hudson.ExtensionPoint; import hudson.model.*; import hudson.slaves.Cloud; import hudson.util.DescriptorList; - -import java.io.Serializable; -import java.util.Collection; -import java.util.Collections; -import javax.annotation.Nonnull; - import jenkins.model.Jenkins; import jenkins.security.stapler.StaplerAccessibleType; import net.sf.json.JSONObject; - import org.jenkinsci.Symbol; import org.kohsuke.stapler.StaplerRequest; +import javax.annotation.Nonnull; +import java.io.Serializable; +import java.util.Collection; +import java.util.Collections; + /** * Controls authorization throughout Hudson. * @@ -184,7 +182,7 @@ public abstract class AuthorizationStrategy extends AbstractDescribableImpl> all() { - return Jenkins.getInstance().getDescriptorList(AuthorizationStrategy.class); + return Jenkins.get().getDescriptorList(AuthorizationStrategy.class); } /** diff --git a/core/src/main/java/hudson/security/BasicAuthenticationFilter.java b/core/src/main/java/hudson/security/BasicAuthenticationFilter.java index c75b619acb..2c1c379d7d 100644 --- a/core/src/main/java/hudson/security/BasicAuthenticationFilter.java +++ b/core/src/main/java/hudson/security/BasicAuthenticationFilter.java @@ -23,6 +23,7 @@ */ package hudson.security; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import hudson.model.User; import jenkins.model.Jenkins; import hudson.util.Scrambler; @@ -31,6 +32,8 @@ import org.acegisecurity.Authentication; import jenkins.security.BasicApiTokenHelper; import org.acegisecurity.context.SecurityContextHolder; import org.acegisecurity.userdetails.UserDetails; +import org.kohsuke.stapler.StaplerRequest; +import org.kohsuke.stapler.StaplerResponse; import javax.servlet.Filter; import javax.servlet.FilterChain; @@ -102,7 +105,7 @@ public class BasicAuthenticationFilter implements Filter { String path = req.getServletPath(); if(authorization==null || req.getUserPrincipal() !=null || path.startsWith("/secured/") - || !Jenkins.getInstance().isUseSecurity()) { + || !Jenkins.get().isUseSecurity()) { // normal requests, or security not enabled if(req.getUserPrincipal()!=null) { // before we route this request, integrate the container authentication @@ -160,8 +163,7 @@ public class BasicAuthenticationFilter implements Filter { path += '?'+q; // prepare a redirect - rsp.setStatus(HttpServletResponse.SC_MOVED_TEMPORARILY); - rsp.setHeader("Location",path); + prepareRedirect(rsp, path); // ... but first let the container authenticate this request RequestDispatcher d = servletContext.getRequestDispatcher("/j_security_check?j_username="+ @@ -169,6 +171,12 @@ public class BasicAuthenticationFilter implements Filter { d.include(req,rsp); } + @SuppressFBWarnings(value = "UNVALIDATED_REDIRECT", justification = "Redirect is validated as processed.") + private void prepareRedirect(HttpServletResponse rsp, String path) { + rsp.setStatus(HttpServletResponse.SC_MOVED_TEMPORARILY); + rsp.setHeader("Location",path); + } + //public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // HttpServletRequest req = (HttpServletRequest) request; // String authorization = req.getHeader("Authorization"); diff --git a/core/src/main/java/hudson/security/ContainerAuthentication.java b/core/src/main/java/hudson/security/ContainerAuthentication.java index 28a8c34029..ea6f404bde 100644 --- a/core/src/main/java/hudson/security/ContainerAuthentication.java +++ b/core/src/main/java/hudson/security/ContainerAuthentication.java @@ -61,7 +61,7 @@ public final class ContainerAuthentication implements Authentication { // Servlet API doesn't provide a way to list up all roles the current user // has, so we need to ask AuthorizationStrategy what roles it is going to check against. List l = new ArrayList<>(); - for( String g : Jenkins.getInstance().getAuthorizationStrategy().getGroups()) { + for( String g : Jenkins.get().getAuthorizationStrategy().getGroups()) { if(request.isUserInRole(g)) l.add(new GrantedAuthorityImpl(g)); } diff --git a/core/src/main/java/hudson/security/DeferredCreationLdapAuthoritiesPopulator.java b/core/src/main/java/hudson/security/DeferredCreationLdapAuthoritiesPopulator.java index f6ae9ca44d..ac3a228b57 100644 --- a/core/src/main/java/hudson/security/DeferredCreationLdapAuthoritiesPopulator.java +++ b/core/src/main/java/hudson/security/DeferredCreationLdapAuthoritiesPopulator.java @@ -21,9 +21,6 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ -/** - * - */ package hudson.security; import org.acegisecurity.GrantedAuthority; diff --git a/core/src/main/java/hudson/security/FederatedLoginService.java b/core/src/main/java/hudson/security/FederatedLoginService.java index 908a8e25a0..c659e66c21 100644 --- a/core/src/main/java/hudson/security/FederatedLoginService.java +++ b/core/src/main/java/hudson/security/FederatedLoginService.java @@ -189,7 +189,7 @@ public abstract class FederatedLoginService implements ExtensionPoint { User u = locateUser(); if (u!=null) { // login as this user - UserDetails d = Jenkins.getInstance().getSecurityRealm().loadUserByUsername(u.getId()); + UserDetails d = Jenkins.get().getSecurityRealm().loadUserByUsername(u.getId()); UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(d,"",d.getAuthorities()); token.setDetails(d); @@ -246,7 +246,7 @@ public abstract class FederatedLoginService implements ExtensionPoint { } public void generateResponse(StaplerRequest req, StaplerResponse rsp, Object node) throws IOException, ServletException { - SecurityRealm sr = Jenkins.getInstance().getSecurityRealm(); + SecurityRealm sr = Jenkins.get().getSecurityRealm(); if (sr.allowsSignup()) { try { sr.commenceSignup(identity).generateResponse(req,rsp,node); diff --git a/core/src/main/java/hudson/security/FullControlOnceLoggedInAuthorizationStrategy.java b/core/src/main/java/hudson/security/FullControlOnceLoggedInAuthorizationStrategy.java index 9c009f3ae6..13c01a5130 100644 --- a/core/src/main/java/hudson/security/FullControlOnceLoggedInAuthorizationStrategy.java +++ b/core/src/main/java/hudson/security/FullControlOnceLoggedInAuthorizationStrategy.java @@ -90,6 +90,7 @@ public class FullControlOnceLoggedInAuthorizationStrategy extends AuthorizationS * @deprecated as of 1.643 * Inject descriptor via {@link Inject}. */ + @Deprecated @Restricted(NoExternalUse.class) public static Descriptor DESCRIPTOR; diff --git a/core/src/main/java/hudson/security/GlobalSecurityConfiguration.java b/core/src/main/java/hudson/security/GlobalSecurityConfiguration.java index a2e78eeffc..f5ba2c38b5 100644 --- a/core/src/main/java/hudson/security/GlobalSecurityConfiguration.java +++ b/core/src/main/java/hudson/security/GlobalSecurityConfiguration.java @@ -53,7 +53,7 @@ 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.interceptor.RequirePOST; +import org.kohsuke.stapler.verb.POST; /** * Security configuration. @@ -68,11 +68,11 @@ public class GlobalSecurityConfiguration extends ManagementLink implements Descr private static final Logger LOGGER = Logger.getLogger(GlobalSecurityConfiguration.class.getName()); public MarkupFormatter getMarkupFormatter() { - return Jenkins.getInstance().getMarkupFormatter(); + return Jenkins.get().getMarkupFormatter(); } public int getSlaveAgentPort() { - return Jenkins.getInstance().getSlaveAgentPort(); + return Jenkins.get().getSlaveAgentPort(); } /** @@ -81,25 +81,25 @@ public class GlobalSecurityConfiguration extends ManagementLink implements Descr */ @Restricted(NoExternalUse.class) public boolean isSlaveAgentPortEnforced() { - return Jenkins.getInstance().isSlaveAgentPortEnforced(); + return Jenkins.get().isSlaveAgentPortEnforced(); } public Set getAgentProtocols() { - return Jenkins.getInstance().getAgentProtocols(); + return Jenkins.get().getAgentProtocols(); } public boolean isDisableRememberMe() { - return Jenkins.getInstance().isDisableRememberMe(); + return Jenkins.get().isDisableRememberMe(); } - @RequirePOST + @POST public synchronized void doConfigure(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException, FormException { // for compatibility reasons, the actual value is stored in Jenkins - BulkChange bc = new BulkChange(Jenkins.getInstance()); + BulkChange bc = new BulkChange(Jenkins.get()); try{ boolean result = configure(req, req.getSubmittedForm()); LOGGER.log(Level.FINE, "security saved: "+result); - Jenkins.getInstance().save(); + Jenkins.get().save(); FormApply.success(req.getContextPath()+"/manage").generateResponse(req, rsp, null); } finally { bc.commit(); @@ -108,16 +108,12 @@ public class GlobalSecurityConfiguration extends ManagementLink implements Descr public boolean configure(StaplerRequest req, JSONObject json) throws hudson.model.Descriptor.FormException { // for compatibility reasons, the actual value is stored in Jenkins - Jenkins j = Jenkins.getInstance(); + Jenkins j = Jenkins.get(); j.checkPermission(Jenkins.ADMINISTER); - if (json.has("useSecurity")) { - JSONObject security = json.getJSONObject("useSecurity"); - j.setDisableRememberMe(security.optBoolean("disableRememberMe", false)); - j.setSecurityRealm(SecurityRealm.all().newInstanceFromRadioList(security, "realm")); - j.setAuthorizationStrategy(AuthorizationStrategy.all().newInstanceFromRadioList(security, "authorization")); - } else { - j.disableSecurity(); - } + + j.setDisableRememberMe(json.optBoolean("disableRememberMe", false)); + j.setSecurityRealm(SecurityRealm.all().newInstanceFromRadioList(json, "realm")); + j.setAuthorizationStrategy(AuthorizationStrategy.all().newInstanceFromRadioList(json, "authorization")); if (json.has("markupFormatter")) { j.setMarkupFormatter(req.bindJSON(MarkupFormatter.class, json.getJSONObject("markupFormatter"))); @@ -201,7 +197,7 @@ public class GlobalSecurityConfiguration extends ManagementLink implements Descr @SuppressWarnings("unchecked") @Override public Descriptor getDescriptor() { - return Jenkins.getInstance().getDescriptorOrDie(getClass()); + return Jenkins.get().getDescriptorOrDie(getClass()); } @Extension @Symbol("security") diff --git a/core/src/main/java/hudson/security/HttpSessionContextIntegrationFilter2.java b/core/src/main/java/hudson/security/HttpSessionContextIntegrationFilter2.java index 7a67c77dd0..aafc93af3b 100644 --- a/core/src/main/java/hudson/security/HttpSessionContextIntegrationFilter2.java +++ b/core/src/main/java/hudson/security/HttpSessionContextIntegrationFilter2.java @@ -84,7 +84,13 @@ public class HttpSessionContextIntegrationFilter2 extends HttpSessionContextInte return false; } - User userFromSession = User.getById(authentication.getName(), false); + User userFromSession; + try { + userFromSession = User.getById(authentication.getName(), false); + } catch (IllegalStateException ise) { + logger.warn("Encountered IllegalStateException trying to get a user. System init may not have completed yet. Invalidating user session."); + return false; + } if (userFromSession == null) { // no requirement for further test as there is no user inside return false; diff --git a/core/src/main/java/hudson/security/HudsonAuthenticationEntryPoint.java b/core/src/main/java/hudson/security/HudsonAuthenticationEntryPoint.java index b590dce408..43798635ad 100644 --- a/core/src/main/java/hudson/security/HudsonAuthenticationEntryPoint.java +++ b/core/src/main/java/hudson/security/HudsonAuthenticationEntryPoint.java @@ -23,6 +23,7 @@ */ package hudson.security; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import hudson.Functions; import com.google.common.base.Strings; @@ -100,21 +101,13 @@ public class HudsonAuthenticationEntryPoint extends AuthenticationProcessingFilt } catch (IllegalStateException e) { out = rsp.getWriter(); } - out.printf( - "" + - "" + - "" + - "" + - "\n" + - "\n\n"+ - "Authentication required\n"+ - "\n\n"+ + "-->%n%n"+ ""); // Turn Off "Show Friendly HTTP Error Messages" Feature on the Server Side. // See http://support.microsoft.com/kb/294807 @@ -123,4 +116,17 @@ public class HudsonAuthenticationEntryPoint extends AuthenticationProcessingFilt out.close(); } } + + @SuppressFBWarnings(value = "XSS_SERVLET", justification = "Intermediate step for redirecting users to login page.") + private void printResponse(String loginForm, PrintWriter out) { + out.printf( + "" + + "" + + "" + + "" + + "%n" + + "%n%n"+ + "Authentication required%n"+ + " - - - - - - - -

    - - - - - - -

    - This Jenkins is configured to receive updates from the following sources: -

    - - - - - - - - - -
    - - - -
    -
    - - - diff --git a/core/src/main/resources/hudson/PluginManager/sites_bg.properties b/core/src/main/resources/hudson/PluginManager/sites_bg.properties deleted file mode 100644 index 52e24f2840..0000000000 --- a/core/src/main/resources/hudson/PluginManager/sites_bg.properties +++ /dev/null @@ -1,29 +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. - -Remove=\ - \u041f\u0440\u0435\u043c\u0430\u0445\u0432\u0430\u043d\u0435 -Add...=\ - \u0414\u043e\u0431\u0430\u0432\u044f\u043d\u0435\u2026 -Update\ Center=\ - \u0421\u0430\u0439\u0442 \u0437\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f - diff --git a/core/src/main/resources/hudson/PluginManager/sites_de.properties b/core/src/main/resources/hudson/PluginManager/sites_de.properties deleted file mode 100644 index 0ef4d33c03..0000000000 --- a/core/src/main/resources/hudson/PluginManager/sites_de.properties +++ /dev/null @@ -1,25 +0,0 @@ -# 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...=Hinzufügen... -Remove=Entfernen -Update\ Center=Update-Center diff --git a/core/src/main/resources/hudson/PluginManager/sites_sr.properties b/core/src/main/resources/hudson/PluginManager/sites_sr.properties deleted file mode 100644 index 008225b821..0000000000 --- a/core/src/main/resources/hudson/PluginManager/sites_sr.properties +++ /dev/null @@ -1,5 +0,0 @@ -# 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/sites_zh_TW.properties b/core/src/main/resources/hudson/PluginManager/sites_zh_TW.properties deleted file mode 100644 index 8570fe63bb..0000000000 --- a/core/src/main/resources/hudson/PluginManager/sites_zh_TW.properties +++ /dev/null @@ -1,25 +0,0 @@ -# The MIT License -# -# Copyright (c) 2013, Chunghwa Telecom Co., Ltd., Pei-Tang Huang -# -# 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. - -Update\ Center=\u66f4\u65b0\u4e2d\u5fc3 -Add...=\u65b0\u589e... -Remove=\u79fb\u9664 diff --git a/core/src/main/resources/hudson/PluginManager/tabBar.jelly b/core/src/main/resources/hudson/PluginManager/tabBar.jelly index 39a81e53d6..f29d556105 100644 --- a/core/src/main/resources/hudson/PluginManager/tabBar.jelly +++ b/core/src/main/resources/hudson/PluginManager/tabBar.jelly @@ -31,8 +31,7 @@ THE SOFTWARE. - - + diff --git a/core/src/main/resources/hudson/PluginManager/tabBar_ja.properties b/core/src/main/resources/hudson/PluginManager/tabBar_ja.properties index a598632826..20f6086a73 100644 --- a/core/src/main/resources/hudson/PluginManager/tabBar_ja.properties +++ b/core/src/main/resources/hudson/PluginManager/tabBar_ja.properties @@ -23,4 +23,4 @@ Updates=\u30a2\u30c3\u30d7\u30c7\u30fc\u30c8 Available=\u5229\u7528\u53ef\u80fd Installed=\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u6e08\u307f -Advanced=\u9ad8\u5ea6\u306a\u8a2d\u5b9a \ No newline at end of file +Advanced=\u9ad8\u5ea6\u306a\u8a2d\u5b9a diff --git a/core/src/main/resources/hudson/PluginManager/table.jelly b/core/src/main/resources/hudson/PluginManager/table.jelly index 050b0952a8..1d4423eb7d 100644 --- a/core/src/main/resources/hudson/PluginManager/table.jelly +++ b/core/src/main/resources/hudson/PluginManager/table.jelly @@ -96,31 +96,47 @@ THE SOFTWARE.
    - +
    -
    ${%compatWarning}
    +
    ${%compatWarning} + +
    ${%parentCompatWarning} +
      + +
    • +
      +
    +
    +
    -
    ${%coreWarning(p.requiredCore)}
    +
    ${%coreWarning(p.requiredCore)}
    -
    ${%javaWarning(p.minimumJavaVersion)}
    +
    ${%javaWarning(p.minimumJavaVersion)}
    -
    ${%depCompatWarning}
    +
    ${%depCompatWarning} +
    ${%parentDepCompatWarning} +
      + +
    • +
      +
    +
    -
    ${%depCoreWarning(p.getNeededDependenciesRequiredCore().toString())}
    +
    ${%depCoreWarning(p.getNeededDependenciesRequiredCore().toString())}
    -
    ${%depJavaWarning(p.getNeededDependenciesMinimumJavaVersion().toString())}
    +
    ${%depJavaWarning(p.getNeededDependenciesMinimumJavaVersion().toString())}
    -
    ${%securityWarning} +
    ${%securityWarning}
    • ${warning.message}
    • @@ -172,5 +188,11 @@ THE SOFTWARE. + diff --git a/core/src/main/resources/hudson/PluginManager/table.properties b/core/src/main/resources/hudson/PluginManager/table.properties index 0849059887..e2297fdde1 100644 --- a/core/src/main/resources/hudson/PluginManager/table.properties +++ b/core/src/main/resources/hudson/PluginManager/table.properties @@ -23,6 +23,8 @@ compatWarning=\ Warning: the new version of this plugin claims to use a different settings format than the installed version. \ Jobs using this 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. +parentDepCompatWarning=The following plugins are incompatible: +parentCompatWarning=The following plugins are affected by this: coreWarning=\ Warning: This plugin is built for Jenkins {0} or newer. \ Jenkins will refuse to load this plugin if installed. diff --git a/core/src/main/resources/hudson/PluginManager/table_de.properties b/core/src/main/resources/hudson/PluginManager/table_de.properties index 8f46aef19d..771d899c60 100644 --- a/core/src/main/resources/hudson/PluginManager/table_de.properties +++ b/core/src/main/resources/hudson/PluginManager/table_de.properties @@ -31,6 +31,8 @@ Filter=Filter Update\ Center=Update-Center Install\ without\ restart=Installieren ohne Neustart Download\ now\ and\ install\ after\ restart=Jetzt herunterladen und bei Neustart installieren +parentDepCompatWarning=Die folgenden Plugins sind inkompatibel: +parentCompatWarning=Die folgenden Plugins werden dadurch beeintr\u00E4chtigt: compatWarning=Achtung: Die neue Version gibt an, mit der installierten Version inkompatibel zu sein. Projekte, welche dieses Plugin verwenden, m\u00FCssen gegebenenfalls neu konfiguriert werden. N\u00E4here Informationen finden Sie in den Versionshinweisen der Plugins. coreWarning=Achtung: Dieses Plugin wurde f\u00FCr Jenkins {0} oder neuer entwickelt. Jenkins wird daher dieses Plugin nicht laden. Click\ this\ heading\ to\ sort\ by\ category=Hier klicken, um nach der Kategorie zu sortieren diff --git a/core/src/main/resources/hudson/PluginManager/table_pl.properties b/core/src/main/resources/hudson/PluginManager/table_pl.properties index 475890ea44..17d4e19055 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-2017, Sun Microsystems, Inc., Damian Szczepanik +# Copyright (c) 2004-2019, 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,4 +32,6 @@ 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 +Update\ Center=Centrum aktualizacji +securityWarning= \ +Ostrze\u017Cenie: Ta wtyczka mo\u017Ce nie by\u0107 bezpieczna. Sprawd\u017A nast\u0119puj\u0105ce ostrze\u017Cenia dotycz\u0105ce bezpiecze\u0144stwa: diff --git a/core/src/main/resources/hudson/PluginWrapper/PluginWrapperAdministrativeMonitor/message.jelly b/core/src/main/resources/hudson/PluginWrapper/PluginWrapperAdministrativeMonitor/message.jelly index 067f0c1c97..d7adbe4b57 100644 --- a/core/src/main/resources/hudson/PluginWrapper/PluginWrapperAdministrativeMonitor/message.jelly +++ b/core/src/main/resources/hudson/PluginWrapper/PluginWrapperAdministrativeMonitor/message.jelly @@ -4,12 +4,12 @@
      -

      ${%Dependency errors}:

      ${%blurbOriginal}

      +

      ${%DirectlyDependentPlugins.title}

      -
      ${plugin.longName} version ${plugin.version}
      +
      ${plugin.longName} (${plugin.version})
      ${d}
      @@ -17,12 +17,12 @@ -

      ${%Downstream dependency errors}:

      ${%blurbDerived}

      +

      ${%IndirectlyDependentPlugins.title}

      -
      ${plugin.displayName} version ${plugin.version}
      +
      ${plugin.displayName} (${plugin.version})
      ${d}
      diff --git a/core/src/main/resources/hudson/PluginWrapper/PluginWrapperAdministrativeMonitor/message.properties b/core/src/main/resources/hudson/PluginWrapper/PluginWrapperAdministrativeMonitor/message.properties index 9313dac39c..01f084bd15 100644 --- a/core/src/main/resources/hudson/PluginWrapper/PluginWrapperAdministrativeMonitor/message.properties +++ b/core/src/main/resources/hudson/PluginWrapper/PluginWrapperAdministrativeMonitor/message.properties @@ -19,5 +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. -blurbOriginal=Some plugins could not be loaded due to unsatisfied dependencies. Fix these issues and restart Jenkins to restore the functionality provided by these plugins. -blurbDerived=These plugins failed to load because of one or more of the errors above. Fix those and these plugins will load again. +blurbOriginal=Some plugins could not be loaded due to unsatisfied dependencies. Fix these issues and restart Jenkins to re-enable these plugins. +blurbDerived=Some of the above failures also result in additional indirectly dependent plugins not being able to load. +DirectlyDependentPlugins.title=Dependency errors: +IndirectlyDependentPlugins.title=Indirectly dependent plugins: diff --git a/core/src/main/resources/hudson/PluginWrapper/PluginWrapperAdministrativeMonitor/message_bg.properties b/core/src/main/resources/hudson/PluginWrapper/PluginWrapperAdministrativeMonitor/message_bg.properties index 4c826414ea..0081ab8a84 100644 --- a/core/src/main/resources/hudson/PluginWrapper/PluginWrapperAdministrativeMonitor/message_bg.properties +++ b/core/src/main/resources/hudson/PluginWrapper/PluginWrapperAdministrativeMonitor/message_bg.properties @@ -23,5 +23,5 @@ Correct=\ \u041e\u0442\u0433\u043e\u0432\u0430\u0440\u044f # There are dependency errors loading some plugins -Dependency\ errors=\ - \u0418\u043c\u0430 \u0433\u0440\u0435\u0448\u043a\u0438 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438\u0442\u0435 \u043d\u0430 \u043d\u044f\u043a\u043e\u0438 \u043f\u0440\u0438\u0441\u0442\u0430\u0432\u043a\u0438 +DirectlyDependentPlugins.title=\ + \u0418\u043c\u0430 \u0433\u0440\u0435\u0448\u043a\u0438 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438\u0442\u0435 \u043d\u0430 \u043d\u044f\u043a\u043e\u0438 \u043f\u0440\u0438\u0441\u0442\u0430\u0432\u043a\u0438: diff --git a/core/src/main/resources/hudson/PluginWrapper/PluginWrapperAdministrativeMonitor/message_de.properties b/core/src/main/resources/hudson/PluginWrapper/PluginWrapperAdministrativeMonitor/message_de.properties index 92f7e07ee1..57dd7bca1c 100644 --- a/core/src/main/resources/hudson/PluginWrapper/PluginWrapperAdministrativeMonitor/message_de.properties +++ b/core/src/main/resources/hudson/PluginWrapper/PluginWrapperAdministrativeMonitor/message_de.properties @@ -21,4 +21,4 @@ # THE SOFTWARE. Correct=Korrigieren -Dependency\ errors=Beim Laden einiger Plugins sind Fehler aufgetreten. +DirectlyDependentPlugins.title=Beim Laden einiger Plugins sind Fehler aufgetreten: diff --git a/core/src/main/resources/hudson/PluginWrapper/PluginWrapperAdministrativeMonitor/message_it.properties b/core/src/main/resources/hudson/PluginWrapper/PluginWrapperAdministrativeMonitor/message_it.properties index 96a114d9bd..7702217297 100644 --- a/core/src/main/resources/hudson/PluginWrapper/PluginWrapperAdministrativeMonitor/message_it.properties +++ b/core/src/main/resources/hudson/PluginWrapper/PluginWrapperAdministrativeMonitor/message_it.properties @@ -20,5 +20,5 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Dependency\ errors=Si sono verificati degli errori relativi alle dipendenze durante il caricamento di alcuni plugin +DirectlyDependentPlugins.title=Si sono verificati degli errori relativi alle dipendenze durante il caricamento di alcuni plugin: Correct=Correggi diff --git a/core/src/main/resources/hudson/PluginWrapper/PluginWrapperAdministrativeMonitor/message_pl.properties b/core/src/main/resources/hudson/PluginWrapper/PluginWrapperAdministrativeMonitor/message_pl.properties index 3d164add4d..e7a9b7523a 100644 --- a/core/src/main/resources/hudson/PluginWrapper/PluginWrapperAdministrativeMonitor/message_pl.properties +++ b/core/src/main/resources/hudson/PluginWrapper/PluginWrapperAdministrativeMonitor/message_pl.properties @@ -1,6 +1,6 @@ # The MIT License # -# Copyright (c) 2016, Damian Szczepanik +# Copyright (c) 2016-2019, 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,6 @@ # 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 +DirectlyDependentPlugins.title=Wyst\u0105pi\u0142y b\u0142\u0119dy podczas \u0142adowania niekt\u00F3rych wtyczek +blurbOriginal=Niekt\u00F3re wtyczki nie mog\u0142y zosta\u0107 za\u0142adowane z powodu niewystarczaj\u0105cych zale\u017Cno\u015Bci. Rozwi\u0105\u017C te problemy i uruchom ponownie Jenkinsa, aby korzysta\u0107 z funkcjonalno\u015Bci oferowanych przez te wtyczki. +blurbDerived=Nast\u0119puj\u0105ce wtyczki nie mog\u0142y zosta\u0107 za\u0142adowane z powodu problem\u00F3w wymienionych wy\u017Cej. Rozwi\u0105\u017C je, a wtyczki zostan\u0105 za\u0142adowane ponownie. diff --git a/core/src/main/resources/hudson/PluginWrapper/thirdPartyLicenses_pt.properties b/core/src/main/resources/hudson/PluginWrapper/thirdPartyLicenses_pt.properties index 5b87cb299c..a990bdee0e 100644 --- a/core/src/main/resources/hudson/PluginWrapper/thirdPartyLicenses_pt.properties +++ b/core/src/main/resources/hudson/PluginWrapper/thirdPartyLicenses_pt.properties @@ -23,4 +23,4 @@ # About {0} about=Sobre No\ information\ recorded=Sem informa\u00e7\u00e3o registrada -3rd\ Party\ Dependencies=Depend\u00eancia de terceiros \ No newline at end of file +3rd\ Party\ Dependencies=Depend\u00eancia de terceiros diff --git a/core/src/main/resources/hudson/PluginWrapper/uninstall_ja.properties b/core/src/main/resources/hudson/PluginWrapper/uninstall_ja.properties index 9ca3e224a7..a0dd01b6a0 100644 --- a/core/src/main/resources/hudson/PluginWrapper/uninstall_ja.properties +++ b/core/src/main/resources/hudson/PluginWrapper/uninstall_ja.properties @@ -3,4 +3,4 @@ msg=\ $JENKINS_HOME\u304b\u3089\u30d7\u30e9\u30b0\u30a4\u30f3\u306e\u30d0\u30a4\u30ca\u30ea\u304c\u524a\u9664\u3055\u308c\u307e\u3059\u3002\ \u3057\u304b\u3057\u3001\u30a2\u30f3\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3057\u306a\u3044\u30d7\u30e9\u30b0\u30a4\u30f3\u306e\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u306f\u305d\u306e\u307e\u307e\u6b8b\u308a\u307e\u3059\u3002 Yes=\u306f\u3044 -title={0}\u30d7\u30e9\u30b0\u30a4\u30f3\u306e\u30a2\u30f3\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb \ No newline at end of file +title={0}\u30d7\u30e9\u30b0\u30a4\u30f3\u306e\u30a2\u30f3\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb diff --git a/core/src/main/resources/hudson/PluginWrapper/uninstall_pl.properties b/core/src/main/resources/hudson/PluginWrapper/uninstall_pl.properties index 8ac4bef575..af05c934e3 100644 --- a/core/src/main/resources/hudson/PluginWrapper/uninstall_pl.properties +++ b/core/src/main/resources/hudson/PluginWrapper/uninstall_pl.properties @@ -1,3 +1,3 @@ msg=Czy na pewno chcesz usun\u0105\u0107 wtyczk\u0119 {0}? Ta operacja usunie wtyczk\u0119 z folderu $JENKINS_HOME, ale pozostawi pliki konfiguracyjne. title=Odinstalowywanie wtyczki {0} -Yes=Tak \ No newline at end of file +Yes=Tak diff --git a/core/src/main/resources/hudson/PluginWrapper/uninstall_sr.properties b/core/src/main/resources/hudson/PluginWrapper/uninstall_sr.properties index cf1a20a90e..2e93b89e17 100644 --- a/core/src/main/resources/hudson/PluginWrapper/uninstall_sr.properties +++ b/core/src/main/resources/hudson/PluginWrapper/uninstall_sr.properties @@ -2,4 +2,4 @@ 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 +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. diff --git a/core/src/main/resources/hudson/ProxyConfiguration/config.groovy b/core/src/main/resources/hudson/ProxyConfiguration/config.groovy index 8ecce1ee51..0be2a539b6 100644 --- a/core/src/main/resources/hudson/ProxyConfiguration/config.groovy +++ b/core/src/main/resources/hudson/ProxyConfiguration/config.groovy @@ -11,8 +11,8 @@ f.entry(title:_("Port"),field:"port") { f.entry(title:_("User name"),field:"userName") { f.textbox() } -f.entry(title:_("Password"),field:"password") { - f.password(value:instance?.encryptedPassword) +f.entry(title:_("Password"),field:"secretPassword") { + f.password() } f.entry(title:_("No Proxy Host"),field:"noProxyHost") { f.textarea() diff --git a/core/src/main/resources/hudson/ProxyConfiguration/config_ja.properties b/core/src/main/resources/hudson/ProxyConfiguration/config_ja.properties index 65a6bca960..c59634b6f4 100644 --- a/core/src/main/resources/hudson/ProxyConfiguration/config_ja.properties +++ b/core/src/main/resources/hudson/ProxyConfiguration/config_ja.properties @@ -26,4 +26,4 @@ User\ name=\u30e6\u30fc\u30b6\u30fc\u540d Password=\u30d1\u30b9\u30ef\u30fc\u30c9 No\ Proxy\ Host=\u5bfe\u8c61\u5916\u30db\u30b9\u30c8 Test\ URL=\u30c6\u30b9\u30c8URL -Validate\ Proxy=Proxy\u306e\u63a5\u7d9a\u78ba\u8a8d \ No newline at end of file +Validate\ Proxy=Proxy\u306e\u63a5\u7d9a\u78ba\u8a8d diff --git a/core/src/main/resources/hudson/ProxyConfiguration/config_sr.properties b/core/src/main/resources/hudson/ProxyConfiguration/config_sr.properties index 3e622e98ad..141ed9e30f 100644 --- a/core/src/main/resources/hudson/ProxyConfiguration/config_sr.properties +++ b/core/src/main/resources/hudson/ProxyConfiguration/config_sr.properties @@ -18,4 +18,4 @@ Upload\ Plugin=\u041E\u0442\u043F\u0440\u0435\u043C\u0438 \u043C\u043E\u0434\u04 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 +Update\ Site=\u0410\u0436\u0443\u0440\u0438\u0440\u0430\u0458 \u0441\u0442\u0440\u0430\u043D\u0443 diff --git a/core/src/main/resources/hudson/TcpSlaveAgentListener/index.jelly b/core/src/main/resources/hudson/TcpSlaveAgentListener/index.jelly index b837be4264..1b04d3c2c9 100644 --- a/core/src/main/resources/hudson/TcpSlaveAgentListener/index.jelly +++ b/core/src/main/resources/hudson/TcpSlaveAgentListener/index.jelly @@ -40,7 +40,8 @@ THE SOFTWARE. - + + Jenkins diff --git a/core/src/main/resources/hudson/atom.jelly b/core/src/main/resources/hudson/atom.jelly index de99ef25bc..7023f08f65 100644 --- a/core/src/main/resources/hudson/atom.jelly +++ b/core/src/main/resources/hudson/atom.jelly @@ -23,40 +23,39 @@ THE SOFTWARE. --> -<?xml version="1.0" encoding="UTF-8"?> - - + + <?xml version="1.0" encoding="UTF-8"?> + + + ${title} + - - - ${title} - + + + 2001-01-01T00:00:00Z + + + ${h.xsDate(adapter.getEntryTimestamp(entries[0]))} + + + + Jenkins Server + + urn:uuid:903deee0-7bfa-11db-9fe1-0800200c9a66 - - - 2001-01-01T00:00:00Z - - - ${h.xsDate(adapter.getEntryTimestamp(entries[0]))} - - - - Jenkins Server - - urn:uuid:903deee0-7bfa-11db-9fe1-0800200c9a66 - - - - ${adapter.getEntryTitle(e)} - - ${adapter.getEntryID(e)} - ${h.xsDate(adapter.getEntryTimestamp(e))} - ${h.xsDate(adapter.getEntryTimestamp(e))} - - - ${desc} - - - - + + + ${adapter.getEntryTitle(e)} + + ${adapter.getEntryID(e)} + ${h.xsDate(adapter.getEntryTimestamp(e))} + ${h.xsDate(adapter.getEntryTimestamp(e))} + + + ${desc} + + + + + diff --git a/core/src/main/resources/hudson/cli/CLIAction/example.jelly b/core/src/main/resources/hudson/cli/CLIAction/example.jelly index a7e6e2cc10..5a4c4cef32 100644 --- a/core/src/main/resources/hudson/cli/CLIAction/example.jelly +++ b/core/src/main/resources/hudson/cli/CLIAction/example.jelly @@ -34,6 +34,6 @@ THE SOFTWARE. } -
      java -jar jenkins-cli.jar -s ${h.inferHudsonURL(request)} ${commandArgs}
      +
      java -jar jenkins-cli.jar -s ${h.inferHudsonURL(request)} -webSocket ${commandArgs}
      diff --git a/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index_da.properties b/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index_da.properties index 1a98b30ed3..4c52441124 100644 --- a/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index_da.properties +++ b/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index_da.properties @@ -20,12 +20,12 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -description.1=\ +description.1=\ Dit JENKINS_HOME ({0}) er n\u00e6sten fyldt. \ N\u00e5r dette direktorie fylder helt op vil det sprede d\u00f8d og \u00f8del\u00e6ggelse, da Jenkins ikke vil kunne gemme mere data. -solution.2=\ +solution.2=\ Flyt JENKINS_HOME til et st\u00f8rre diskafsnit. -JENKINS_HOME\ is\ almost\ full=JENKINS_HOME\ er\ n\u00e6sten\ fyldt\ op +JENKINS_HOME\ is\ almost\ full=JENKINS_HOME er n\u00e6sten fyldt op blurb=JENKINS_HOME er n\u00e6sten fyldt op solution.1=Slet nogle filer p\u00e5 dette diskafsnit for at frig\u00f8re mere plads description.2=For at undg\u00e5 problemer skal du handle nu. 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 b1e7f81355..cefd9be60c 100644 --- a/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index_pt.properties +++ b/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index_pt.properties @@ -22,9 +22,9 @@ JENKINS_HOME\ is\ almost\ full=o JENKINS_HOME est\u00e1 quase cheio description.2=Para previnir esse problema, fa\u00e7a alguma coisa agora. -description.1=O seu JENKINS_HOME ({0}) est\u00e1 quase cheio. \ +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. \ +solution.2=Mova o JENKINS_HOME para uma parti\u00e7\u00e3o maior. \ 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_sr.properties b/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index_sr.properties index 82dbe60492..4f8525caa2 100644 --- a/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index_sr.properties +++ b/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/index_sr.properties @@ -11,4 +11,4 @@ solution.2=\ \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 +# TODO FIXME This file looks completely messed up? diff --git a/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/message_ja.properties b/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/message_ja.properties index 81cd4d4d0a..5cf5889aeb 100644 --- a/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/message_ja.properties +++ b/core/src/main/resources/hudson/diagnosis/HudsonHomeDiskUsageMonitor/message_ja.properties @@ -1,3 +1,3 @@ Tell\ me\ more=\u8A73\u7D30 Dismiss=\u7121\u8996 -blurb=Jenkins\u306E\u30C7\u30FC\u30BF\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA "{0}" (JENKINS_HOME)\u306E\u5BB9\u91CF\u304C\u307B\u307C\u3044\u3063\u3071\u3044\u306B\u306A\u3063\u3066\u3044\u307E\u3059\u3002\u5BB9\u91CF\u30AA\u30FC\u30D0\u30FC\u306B\u306A\u308B\u524D\u306B\u5BFE\u51E6\u3057\u3066\u304F\u3060\u3055\u3044\u3002 \ No newline at end of file +blurb=Jenkins\u306E\u30C7\u30FC\u30BF\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA "{0}" (JENKINS_HOME)\u306E\u5BB9\u91CF\u304C\u307B\u307C\u3044\u3063\u3071\u3044\u306B\u306A\u3063\u3066\u3044\u307E\u3059\u3002\u5BB9\u91CF\u30AA\u30FC\u30D0\u30FC\u306B\u306A\u308B\u524D\u306B\u5BFE\u51E6\u3057\u3066\u304F\u3060\u3055\u3044\u3002 diff --git a/core/src/main/resources/hudson/diagnosis/Messages_pl.properties b/core/src/main/resources/hudson/diagnosis/Messages_pl.properties index d06325b6ae..ef9b80b04f 100644 --- a/core/src/main/resources/hudson/diagnosis/Messages_pl.properties +++ b/core/src/main/resources/hudson/diagnosis/Messages_pl.properties @@ -1,6 +1,6 @@ # The MIT License # -# Copyright (c) 2016 Damian Szczepanik +# Copyright (c) 2016-2019 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,5 @@ # THE SOFTWARE. OldDataMonitor.DisplayName=Zarz\u0105dzanie starymi danymi OldDataMonitor.Description=Usuwanie danych po nieu\u017Cywanych lub starszych wersjach wtyczek. +HudsonHomeDiskUsageMonitor.DisplayName=Monitoring zu\u017Cycia dysku +TooManyJobsButNoView.DisplayName=Zbyt wiele projekt\u00F3w jest nie przypisanych do widok\u00F3w diff --git a/core/src/main/resources/hudson/diagnosis/Messages_ru.properties b/core/src/main/resources/hudson/diagnosis/Messages_ru.properties index 3bddb6e1be..de440e214a 100644 --- a/core/src/main/resources/hudson/diagnosis/Messages_ru.properties +++ b/core/src/main/resources/hudson/diagnosis/Messages_ru.properties @@ -25,4 +25,4 @@ OldDataMonitor.Description=\u041E\u0447\u0438\u0441\u0442\u043A\u0430 \u043A\u04 OldDataMonitor.DisplayName=\u0423\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0435 \u0443\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0438\u043C\u0438 \u0434\u0430\u043D\u043D\u044B\u043C\u0438 HudsonHomeDiskUsageMonitor.DisplayName=\u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u043C\u043E\u0435 \u0434\u0438\u0441\u043A\u043E\u0432\u043E\u0435 \u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432\u043E NullIdDescriptorMonitor.DisplayName=\u041E\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0438\u0434\u0435\u043D\u0442\u0438\u0444\u0438\u043A\u0430\u0442\u043E\u0440 \u0434\u0435\u0441\u043A\u0440\u0438\u043F\u0442\u043E\u0440\u0430 -ReverseProxySetupMonitor.DisplayName=\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0430 Reverse Proxy \ No newline at end of file +ReverseProxySetupMonitor.DisplayName=\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0430 Reverse Proxy diff --git a/core/src/main/resources/hudson/diagnosis/Messages_sr.properties b/core/src/main/resources/hudson/diagnosis/Messages_sr.properties index b070f89027..671408b144 100644 --- a/core/src/main/resources/hudson/diagnosis/Messages_sr.properties +++ b/core/src/main/resources/hudson/diagnosis/Messages_sr.properties @@ -2,4 +2,4 @@ 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 +OldDataMonitor.DisplayName=\u0423\u0440\u0435\u0434\u0438 \u0441\u0442\u0430\u0440\u0435 \u043F\u043E\u0434\u0430\u0442\u043A\u0435 diff --git a/core/src/main/resources/hudson/diagnosis/NullIdDescriptorMonitor/message_ja.properties b/core/src/main/resources/hudson/diagnosis/NullIdDescriptorMonitor/message_ja.properties index 4956a88dd1..99f3138e65 100644 --- a/core/src/main/resources/hudson/diagnosis/NullIdDescriptorMonitor/message_ja.properties +++ b/core/src/main/resources/hudson/diagnosis/NullIdDescriptorMonitor/message_ja.properties @@ -23,4 +23,4 @@ blurb=\ \u6b21\u306e\u30d7\u30e9\u30b0\u30a4\u30f3\u306f\u3001ID\u3092\u6301\u3063\u3066\u3044\u306a\u3044\u306e\u3067\u554f\u984c\u3092\u8d77\u3053\u3059\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002\u30d7\u30e9\u30b0\u30a4\u30f3\u3092\u6700\u65b0\u306e\u7269\u306b\u30a2\u30c3\u30d7\u30b0\u30ec\u30fc\u30c9\u3057\u3066\u304f\u3060\u3055\u3044\u3002\ \u6700\u65b0\u306e\u7269\u3067\u3042\u308c\u3070\u3001\u4fee\u6b63\u3067\u304d\u308b\u3088\u3046\u306bJIRA\u306b\u30d0\u30b0\u3068\u3057\u3066\u767b\u9332\u3057\u3066\u304f\u3060\u3055\u3044\u3002 -problem=\u30d7\u30e9\u30b0\u30a4\u30f3 {2} \u306e\u30c7\u30a3\u30b9\u30af\u30ea\u30d7\u30bf {0} (\u8868\u793a\u540d {1}) \ No newline at end of file +problem=\u30d7\u30e9\u30b0\u30a4\u30f3 {2} \u306e\u30c7\u30a3\u30b9\u30af\u30ea\u30d7\u30bf {0} (\u8868\u793a\u540d {1}) diff --git a/core/src/main/resources/hudson/diagnosis/OldDataMonitor/manage_pt.properties b/core/src/main/resources/hudson/diagnosis/OldDataMonitor/manage_pt.properties index 7f3656053f..de3f82b6f9 100644 --- a/core/src/main/resources/hudson/diagnosis/OldDataMonitor/manage_pt.properties +++ b/core/src/main/resources/hudson/diagnosis/OldDataMonitor/manage_pt.properties @@ -25,10 +25,10 @@ Discard\ Unreadable\ Data=Descartar dados ileg\u00edveis Version=Vers\u00e3o Upgrade=Upgrade Resave\ data\ files\ with\ structure\ changes\ no\ newer\ than\ Jenkins=Regravar os arquivos de dados com a mudan\u00e7a de estrutura sem ser mais nova que o Jenkins -blurb.2=Algumas vezes ocorre erro ao ler os dados (se o plugin adiciona algum dado que depois \u00e9 \ -desativado, se o c\u00f3digo de migra\u00e7\u00e3o n\u00e3o estiver escrito com as mudan\u00e7as de estrutura, ou se o Jenkins sofreu \ -downgraded depois de tiver escrito algum dado que \u00e9 ileg\u00edvel por uma vers\u00e3o mais antiga). \ -Esses erros s\u00e3o logados,mas o dado ileg\u00edvel ser\u00e1 ignorado, permitindo ao Jenkins iniciar e \ +blurb.2=Algumas vezes ocorre erro ao ler os dados (se o plugin adiciona algum dado que depois \u00e9 \ +desativado, se o c\u00f3digo de migra\u00e7\u00e3o n\u00e3o estiver escrito com as mudan\u00e7as de estrutura, ou se o Jenkins sofreu \ +downgraded depois de tiver escrito algum dado que \u00e9 ileg\u00edvel por uma vers\u00e3o mais antiga). \ +Esses erros s\u00e3o logados,mas o dado ileg\u00edvel ser\u00e1 ignorado, permitindo ao Jenkins iniciar e \ funcionar corretamente. Error=Erro Unreadable\ Data=Dado ileg\u00edvel 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 6406a4c114..a93f96e844 100644 --- a/core/src/main/resources/hudson/diagnosis/OldDataMonitor/message_de.properties +++ b/core/src/main/resources/hudson/diagnosis/OldDataMonitor/message_de.properties @@ -24,4 +24,4 @@ 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 + Es liegen Daten in einem veralteten Format und/oder nicht lesbare Daten vor. diff --git a/core/src/main/resources/hudson/diagnosis/ReverseProxySetupMonitor/message_ja.properties b/core/src/main/resources/hudson/diagnosis/ReverseProxySetupMonitor/message_ja.properties index ebf8306cb2..8e527fef16 100644 --- a/core/src/main/resources/hudson/diagnosis/ReverseProxySetupMonitor/message_ja.properties +++ b/core/src/main/resources/hudson/diagnosis/ReverseProxySetupMonitor/message_ja.properties @@ -22,4 +22,4 @@ More\ Info=\u8a73\u7d30 Dismiss=\u4e2d\u6b62 -blurb=\u30ea\u30d0\u30fc\u30b9\u30d7\u30ed\u30ad\u30b7\u30fc\u306e\u8a2d\u5b9a\u304c\u304a\u304b\u3057\u3044\u3088\u3046\u3067\u3059\u3002 \ No newline at end of file +blurb=\u30ea\u30d0\u30fc\u30b9\u30d7\u30ed\u30ad\u30b7\u30fc\u306e\u8a2d\u5b9a\u304c\u304a\u304b\u3057\u3044\u3088\u3046\u3067\u3059\u3002 diff --git a/core/src/main/resources/hudson/diagnosis/TooManyJobsButNoView/message_ja.properties b/core/src/main/resources/hudson/diagnosis/TooManyJobsButNoView/message_ja.properties index f6b3e858bf..6ba21f6f0e 100644 --- a/core/src/main/resources/hudson/diagnosis/TooManyJobsButNoView/message_ja.properties +++ b/core/src/main/resources/hudson/diagnosis/TooManyJobsButNoView/message_ja.properties @@ -24,4 +24,4 @@ Create\ a\ view\ now=\u30D3\u30E5\u30FC\u3092\u65B0\u898F\u4F5C\u6210 Dismiss=\u7121\u8996 blurb=\ \u30B8\u30E7\u30D6\u304C\u305F\u304F\u3055\u3093\u3042\u308B\u3088\u3046\u3067\u3059\u3002\u30B8\u30E7\u30D6\u3092\u9055\u3046\u30D3\u30E5\u30FC\u306B\u5206\u3051\u3066\u8868\u793A\u3059\u308B\u3053\u3068\u304C\u3067\u304D\u307E\u3059\u3002\ - \u30C8\u30C3\u30D7\u30DA\u30FC\u30B8\u3067'+'\u3092\u30AF\u30EA\u30C3\u30AF\u3059\u308B\u3068\u3001\u3044\u3064\u3067\u3082\u65B0\u3057\u3044\u30D3\u30E5\u30FC\u3092\u4F5C\u6210\u3067\u304D\u307E\u3059\u3002 \ No newline at end of file + \u30C8\u30C3\u30D7\u30DA\u30FC\u30B8\u3067'+'\u3092\u30AF\u30EA\u30C3\u30AF\u3059\u308B\u3068\u3001\u3044\u3064\u3067\u3082\u65B0\u3057\u3044\u30D3\u30E5\u30FC\u3092\u4F5C\u6210\u3067\u304D\u307E\u3059\u3002 diff --git a/core/src/main/resources/hudson/fsp/Messages_da.properties b/core/src/main/resources/hudson/fsp/Messages_da.properties index 5f9ad9a99e..ab915ab316 100644 --- a/core/src/main/resources/hudson/fsp/Messages_da.properties +++ b/core/src/main/resources/hudson/fsp/Messages_da.properties @@ -24,7 +24,7 @@ WorkspaceSnapshotSCM.NoSuchPermalink=Intet permalink ''{0}'' eksisterer for {1} WorkspaceSnapshotSCM.NoBuild=Der er intet kvalificeret byg til {0} permalinket i {1} WorkspaceSnapshotSCM.IncorrectJobType={0} er ikke en jobtype der har et arbejdsomr\u00e5de. WorkspaceSnapshotSCM.NoWorkspace=\ -{0} {1} har ikke noget arbejdsomr\u00e5de\u00f8jebliksbillede tilknyttet,\n\ +{0} {1} har ikke noget arbejdsomr\u00e5de\u00f8jebliksbillede tilknyttet,\n\ formentlig skyldes dette at ingen andre jobs havde behov for dette jobs arbejdsomr\u00e5de\u00f8jebliksbillede da bygget afsluttede\n\ K\u00f8r endnu et byg i {0} for at f\u00e5 taget et arbejdsomr\u00e5de\u00f8jebliksbillede. WorkspaceSnapshotSCM.NoSuchJob=Intet job ''{0}'' eksisterer. M\u00e5ske mente du ''{1}''? diff --git a/core/src/main/resources/hudson/fsp/Messages_de.properties b/core/src/main/resources/hudson/fsp/Messages_de.properties index 1c79c862df..e4a3f28ce8 100644 --- a/core/src/main/resources/hudson/fsp/Messages_de.properties +++ b/core/src/main/resources/hudson/fsp/Messages_de.properties @@ -28,4 +28,4 @@ WorkspaceSnapshotSCM.NoWorkspace=\ Mit {0} {1} ist kein Schnappschuss eines Arbeitsbereiches verknüpft,\n\ vermutlich weil zum Zeitpunkt des Builds kein anderer Job den Schnappschuss benötigte.\n\ Starten Sie einen neuen Build in {0}, um einen Schnappschuss des Arbeitsbereiches erstellen zu lassen. - \ No newline at end of file + diff --git a/core/src/main/resources/hudson/fsp/Messages_fr.properties b/core/src/main/resources/hudson/fsp/Messages_fr.properties index f3d2b30e44..6c129b6407 100644 --- a/core/src/main/resources/hudson/fsp/Messages_fr.properties +++ b/core/src/main/resources/hudson/fsp/Messages_fr.properties @@ -27,4 +27,4 @@ WorkspaceSnapshotSCM.NoSuchPermalink=Il n''y a pas de permalink ''{0}'' pour {1} WorkspaceSnapshotSCM.NoWorkspace=\ {0} {1} n''a pas de snapshot de workspace attach\u00E9,\n\ probablement parce que quand le build s''est achev\u00E9, pas d''autre job n''avait besoin de son snapshot de workspace.\n\ - Veuillez lancer un nouveau build dans {0} pour capturer le snapshot de workspace. \ No newline at end of file + Veuillez lancer un nouveau build dans {0} pour capturer le snapshot de workspace. diff --git a/core/src/main/resources/hudson/fsp/Messages_sr.properties b/core/src/main/resources/hudson/fsp/Messages_sr.properties index b4e48fe8ec..067891e392 100644 --- a/core/src/main/resources/hudson/fsp/Messages_sr.properties +++ b/core/src/main/resources/hudson/fsp/Messages_sr.properties @@ -1,3 +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 +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}"? diff --git a/core/src/main/resources/hudson/init/impl/Messages_de.properties b/core/src/main/resources/hudson/init/impl/Messages_de.properties index 2fe6d88021..36f205d9fb 100644 --- a/core/src/main/resources/hudson/init/impl/Messages_de.properties +++ b/core/src/main/resources/hudson/init/impl/Messages_de.properties @@ -21,4 +21,4 @@ # THE SOFTWARE. GroovyInitScript.init=Führe benutzerdefiniertes Initialisierungsskript aus -InitialUserContent.init=Initialisiere benutzerdefinierte Inhalte \ No newline at end of file +InitialUserContent.init=Initialisiere benutzerdefinierte Inhalte diff --git a/core/src/main/resources/hudson/init/impl/Messages_sr.properties b/core/src/main/resources/hudson/init/impl/Messages_sr.properties index 643a509371..14020b9080 100644 --- a/core/src/main/resources/hudson/init/impl/Messages_sr.properties +++ b/core/src/main/resources/hudson/init/impl/Messages_sr.properties @@ -1,4 +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 +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 diff --git a/core/src/main/resources/hudson/lifecycle/Messages_fr.properties b/core/src/main/resources/hudson/lifecycle/Messages_fr.properties index 0a1e92ad36..aa09ad4eb7 100644 --- a/core/src/main/resources/hudson/lifecycle/Messages_fr.properties +++ b/core/src/main/resources/hudson/lifecycle/Messages_fr.properties @@ -21,4 +21,4 @@ # THE SOFTWARE. WindowsInstallerLink.DisplayName=Installer en tant que Service Windows -WindowsInstallerLink.Description=Installe Jenkins comme un service Windows pour ce syst\u00E8me, afin que Jenkins puisse se lancer automatiquement au d\u00E9marrage de la machine. \ No newline at end of file +WindowsInstallerLink.Description=Installe Jenkins comme un service Windows pour ce syst\u00E8me, afin que Jenkins puisse se lancer automatiquement au d\u00E9marrage de la machine. diff --git a/core/src/main/resources/hudson/lifecycle/Messages_sr.properties b/core/src/main/resources/hudson/lifecycle/Messages_sr.properties index 8c6981247c..2e9ab44fab 100644 --- a/core/src/main/resources/hudson/lifecycle/Messages_sr.properties +++ b/core/src/main/resources/hudson/lifecycle/Messages_sr.properties @@ -5,4 +5,4 @@ WindowsInstallerLink.Description=\u0418\u043D\u0441\u0442\u0430\u043B\u0438\u044 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 +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. diff --git a/core/src/main/resources/hudson/logging/LogRecorderManager/all.jelly b/core/src/main/resources/hudson/logging/LogRecorderManager/all.jelly index 9e38528207..3e10f7f12e 100644 --- a/core/src/main/resources/hudson/logging/LogRecorderManager/all.jelly +++ b/core/src/main/resources/hudson/logging/LogRecorderManager/all.jelly @@ -31,6 +31,9 @@ THE SOFTWARE.

      ${%Jenkins Log}

      +
      + Log messages at a level lower than INFO are never recorded in the Jenkins log. Use log recorders to record these log messages. +
      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 6917971793..65c66713aa 100644 --- a/core/src/main/resources/hudson/logging/LogRecorderManager/levels_de.properties +++ b/core/src/main/resources/hudson/logging/LogRecorderManager/levels_de.properties @@ -26,4 +26,4 @@ Name=Name Level=Priorit\u00e4t Adjust\ Levels=Priorit\u00e4ten (levels) anpassen defaultLoggerMsg=Der Logger ohne Namen ist der Default-Logger. Seine Priorit\u00e4t \ - wird von allen Loggern \u00fcbernommen, f\u00fcr die keine Priorit\u00e4t explizit angegeben wurde. \ No newline at end of file + wird von allen Loggern \u00fcbernommen, f\u00fcr die keine Priorit\u00e4t explizit angegeben wurde. diff --git a/core/src/main/resources/hudson/logging/LogRecorderManager/levels_sr.properties b/core/src/main/resources/hudson/logging/LogRecorderManager/levels_sr.properties index a775c74c34..7cb927c3b8 100644 --- a/core/src/main/resources/hudson/logging/LogRecorderManager/levels_sr.properties +++ b/core/src/main/resources/hudson/logging/LogRecorderManager/levels_sr.properties @@ -5,4 +5,4 @@ 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 \ No newline at end of file +Adjust\ Levels=\u041F\u043E\u0434\u0435\u0441\u0438 \u043D\u0438\u0432\u043E\u0435 diff --git a/core/src/main/resources/hudson/logging/LogRecorderManager/sidepanel.jelly b/core/src/main/resources/hudson/logging/LogRecorderManager/sidepanel.jelly index c27d64b58a..f15d0032c5 100644 --- a/core/src/main/resources/hudson/logging/LogRecorderManager/sidepanel.jelly +++ b/core/src/main/resources/hudson/logging/LogRecorderManager/sidepanel.jelly @@ -32,9 +32,10 @@ THE SOFTWARE. - - - + + + + diff --git a/core/src/main/resources/hudson/logging/LogRecorderManager/sidepanel_de.properties b/core/src/main/resources/hudson/logging/LogRecorderManager/sidepanel_de.properties index 235732d9b5..8542245208 100644 --- a/core/src/main/resources/hudson/logging/LogRecorderManager/sidepanel_de.properties +++ b/core/src/main/resources/hudson/logging/LogRecorderManager/sidepanel_de.properties @@ -3,4 +3,4 @@ Logger\ List=Logger-Liste All\ Logs=Alle Logs New\ Log\ Recorder=Neuer Log-Rekorder Log\ Levels=Log-Priorit\u00e4ten (Levels) -Manage\ Jenkins=Jenkins verwalten \ No newline at end of file +Manage\ Jenkins=Jenkins verwalten diff --git a/core/src/main/resources/hudson/logging/Messages.properties b/core/src/main/resources/hudson/logging/Messages.properties index d759f412ee..c1fc7a4557 100644 --- a/core/src/main/resources/hudson/logging/Messages.properties +++ b/core/src/main/resources/hudson/logging/Messages.properties @@ -21,4 +21,4 @@ # THE SOFTWARE. LogRecorderManager.init=Initialing log recorders -LogRecorderManager.DisplayName=log \ No newline at end of file +LogRecorderManager.DisplayName=System Log \ No newline at end of file diff --git a/core/src/main/resources/hudson/logging/Messages_ja.properties b/core/src/main/resources/hudson/logging/Messages_ja.properties index 28b56c0c3c..fd51f08d24 100644 --- a/core/src/main/resources/hudson/logging/Messages_ja.properties +++ b/core/src/main/resources/hudson/logging/Messages_ja.properties @@ -21,4 +21,4 @@ # THE SOFTWARE. LogRecorderManager.init=\u30ed\u30b0\u30ec\u30b3\u30fc\u30c0\u30fc\u306e\u521d\u671f\u5316\u4e2d -LogRecorderManager.DisplayName=\u30ed\u30b0 \ No newline at end of file +LogRecorderManager.DisplayName=\u30ed\u30b0 diff --git a/core/src/main/resources/hudson/logging/Messages_sr.properties b/core/src/main/resources/hudson/logging/Messages_sr.properties index 9cc510fd61..205ec70bdc 100644 --- a/core/src/main/resources/hudson/logging/Messages_sr.properties +++ b/core/src/main/resources/hudson/logging/Messages_sr.properties @@ -1,4 +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 +LogRecorderManager.DisplayName=\u0436\u0443\u0440\u043D\u0430\u043B diff --git a/core/src/main/resources/hudson/markup/Messages_sr.properties b/core/src/main/resources/hudson/markup/Messages_sr.properties index 5f8d6dcd1f..fca7c4aaf0 100644 --- a/core/src/main/resources/hudson/markup/Messages_sr.properties +++ b/core/src/main/resources/hudson/markup/Messages_sr.properties @@ -1,3 +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 +EscapedMarkupFormatter.DisplayName=\u041E\u0431\u0438\u0447\u0430\u043D \u0442\u0435\u043A\u0441\u0442 diff --git a/core/src/main/resources/hudson/model/AbstractBuild/changes_ja.properties b/core/src/main/resources/hudson/model/AbstractBuild/changes_ja.properties index 3de1f83a3d..a7236dbf4c 100644 --- a/core/src/main/resources/hudson/model/AbstractBuild/changes_ja.properties +++ b/core/src/main/resources/hudson/model/AbstractBuild/changes_ja.properties @@ -20,4 +20,4 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Changes=\u5909\u66f4\u5c65\u6b74 \ No newline at end of file +Changes=\u5909\u66f4\u5c65\u6b74 diff --git a/core/src/main/resources/hudson/model/AbstractBuild/index_ja.properties b/core/src/main/resources/hudson/model/AbstractBuild/index_ja.properties index 0e2637a59e..ac57eeb2de 100644 --- a/core/src/main/resources/hudson/model/AbstractBuild/index_ja.properties +++ b/core/src/main/resources/hudson/model/AbstractBuild/index_ja.properties @@ -33,4 +33,4 @@ Upstream\ Builds=\u4e0a\u6d41\u30d3\u30eb\u30c9 Downstream\ Builds=\u4e0b\u6d41\u30d3\u30eb\u30c9 none=\u306a\u3057 on=on -beingExecuted=\u30d3\u30eb\u30c9\u304c\u5b9f\u884c\u4e2d\u3067\u3059\u3002{0} \ No newline at end of file +beingExecuted=\u30d3\u30eb\u30c9\u304c\u5b9f\u884c\u4e2d\u3067\u3059\u3002{0} diff --git a/core/src/main/resources/hudson/model/AbstractBuild/index_tr.properties b/core/src/main/resources/hudson/model/AbstractBuild/index_tr.properties index 8a342342f1..52776c9b91 100644 --- a/core/src/main/resources/hudson/model/AbstractBuild/index_tr.properties +++ b/core/src/main/resources/hudson/model/AbstractBuild/index_tr.properties @@ -26,11 +26,11 @@ Build\ Artifacts=Yap\u0131land\u0131rma Hatalar\u0131 Changes\ in\ dependency=Ba\u011f\u0131ml\u0131l\u0131ktaki de\u011fi\u015fiklikler beingExecuted=Yap\u0131land\u0131rma {0} d\u0131r \u00E7al\u0131\u015Fmaktad\u0131r detail=detay -Not\ yet\ determined=Hen\u00fcz\ belirlenmedi +Not\ yet\ determined=Hen\u00fcz belirlenmedi Failed\ to\ determine=Belirleme esnas\u0131nda hata olu\u015ftu log=log -Upstream\ Builds=Upstream\ Yap\u0131land\u0131rmalar -Downstream\ Builds=Downstream\ Yap\u0131land\u0131rmalar +Upstream\ Builds=Upstream Yap\u0131land\u0131rmalar +Downstream\ Builds=Downstream Yap\u0131land\u0131rmalar none=hi\u00e7birisi Permalinks=Permalinks Build\ number=Yap\u0131land\u0131rma numaras\u0131 diff --git a/core/src/main/resources/hudson/model/AbstractBuild/sidepanel_ja.properties b/core/src/main/resources/hudson/model/AbstractBuild/sidepanel_ja.properties index a048b68550..88a9e6bd37 100644 --- a/core/src/main/resources/hudson/model/AbstractBuild/sidepanel_ja.properties +++ b/core/src/main/resources/hudson/model/AbstractBuild/sidepanel_ja.properties @@ -21,4 +21,4 @@ # THE SOFTWARE. Previous\ Build=\u524D\u306E\u30D3\u30EB\u30C9 -Next\ Build=\u6B21\u306E\u30D3\u30EB\u30C9 \ No newline at end of file +Next\ Build=\u6B21\u306E\u30D3\u30EB\u30C9 diff --git a/core/src/main/resources/hudson/model/AbstractBuild/sidepanel_tr.properties b/core/src/main/resources/hudson/model/AbstractBuild/sidepanel_tr.properties index 7f69781518..5e65db5af0 100644 --- a/core/src/main/resources/hudson/model/AbstractBuild/sidepanel_tr.properties +++ b/core/src/main/resources/hudson/model/AbstractBuild/sidepanel_tr.properties @@ -20,5 +20,5 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Previous\ Build=\u00d6nceki\ Yap\u0131land\u0131rma -Next\ Build=Sonraki\ Yap\u0131land\u0131rma +Previous\ Build=\u00d6nceki Yap\u0131land\u0131rma +Next\ Build=Sonraki Yap\u0131land\u0131rma diff --git a/core/src/main/resources/hudson/model/AbstractBuild/tasks_tr.properties b/core/src/main/resources/hudson/model/AbstractBuild/tasks_tr.properties index 488b75c906..e6a2d92a98 100644 --- a/core/src/main/resources/hudson/model/AbstractBuild/tasks_tr.properties +++ b/core/src/main/resources/hudson/model/AbstractBuild/tasks_tr.properties @@ -24,7 +24,7 @@ Back\ to\ Project=Projeye geri d\u00F6n Changes=De\u011Fi\u015Fiklikler Console\ Output=Konsol \u00C7\u0131kt\u0131s\u0131 View\ Build\ Information=in\u015Fa bilgisi g\u00F6r\u00FCnt\u00FCle -View\ as\ plain\ text=D\u00fcz\ metin\ olarak\ g\u00f6ster +View\ as\ plain\ text=D\u00fcz metin olarak g\u00f6ster Edit\ Build\ Information=S\u00FCr\u00FCm Bilgisini D\u00FCzenle Status=Durum raw=ham diff --git a/core/src/main/resources/hudson/model/AbstractItem/confirm-rename_pl.properties b/core/src/main/resources/hudson/model/AbstractItem/confirm-rename_pl.properties new file mode 100644 index 0000000000..d0cc0858d1 --- /dev/null +++ b/core/src/main/resources/hudson/model/AbstractItem/confirm-rename_pl.properties @@ -0,0 +1,25 @@ +# The MIT License +# +# Copyright (c) 2019, 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. + +Rename=Zmie\u0144 nazw\u0119 +DescribeRename=Zmie\u0144 nazw\u0119 {0} +NewName=Nowa nazwa diff --git a/core/src/main/resources/hudson/model/AbstractItem/delete_fr.properties b/core/src/main/resources/hudson/model/AbstractItem/delete_fr.properties index 2b290a25c3..91e17f1422 100644 --- a/core/src/main/resources/hudson/model/AbstractItem/delete_fr.properties +++ b/core/src/main/resources/hudson/model/AbstractItem/delete_fr.properties @@ -22,4 +22,4 @@ Are\ you\ sure\ about\ deleting\ the\ job?=Etes-vous sûr de vouloir supprimer ce job? Yes=Oui -blurb=\u00CAtes-vous s\u00FBr de vouloir supprimer ce {0} "{1}"? \ No newline at end of file +blurb=\u00CAtes-vous s\u00FBr de vouloir supprimer ce {0} "{1}"? diff --git a/core/src/main/resources/hudson/model/AbstractItem/delete_ja.properties b/core/src/main/resources/hudson/model/AbstractItem/delete_ja.properties index aaa9dcb6b9..69d36e4751 100644 --- a/core/src/main/resources/hudson/model/AbstractItem/delete_ja.properties +++ b/core/src/main/resources/hudson/model/AbstractItem/delete_ja.properties @@ -21,4 +21,4 @@ # THE SOFTWARE. blurb={0} "{1}"\u3092\u524a\u9664\u3057\u307e\u3059\u304b? -Yes=\u306f\u3044 \ No newline at end of file +Yes=\u306f\u3044 diff --git a/core/src/main/resources/hudson/model/AbstractItem/delete_tr.properties b/core/src/main/resources/hudson/model/AbstractItem/delete_tr.properties index ea6133d792..07eca89db6 100644 --- a/core/src/main/resources/hudson/model/AbstractItem/delete_tr.properties +++ b/core/src/main/resources/hudson/model/AbstractItem/delete_tr.properties @@ -20,6 +20,6 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Are\ you\ sure\ about\ deleting\ the\ job?=Bu\ i\u015fi\ silmek\ istedi\u011finize\ emin\ misiniz? +Are\ you\ sure\ about\ deleting\ the\ job?=Bu i\u015fi silmek istedi\u011finize emin misiniz? Yes=Evet blurb={0} ''''{1}'''' Silmek istedi\u011Finizden eminmisiniz ? diff --git a/core/src/main/resources/hudson/model/AbstractItem/noWorkspace_ar.properties b/core/src/main/resources/hudson/model/AbstractItem/noWorkspace_ar.properties index f66e9b37f6..3abb203009 100644 --- a/core/src/main/resources/hudson/model/AbstractItem/noWorkspace_ar.properties +++ b/core/src/main/resources/hudson/model/AbstractItem/noWorkspace_ar.properties @@ -1,4 +1,4 @@ # This file is under the MIT License by authors -Error:\ no\ workspace=\u062E\u0637\u0627: \u0644\u0627\u064A\u0648\u062C\u062F \u0623\u064A \u0645\u0633\u0627\u062D\u0629 \u0639\u0645\u0644 +Error\:\ no\ workspace=\u062E\u0637\u0627: \u0644\u0627\u064A\u0648\u062C\u062F \u0623\u064A \u0645\u0633\u0627\u062D\u0629 \u0639\u0645\u0644 text=\u0646\u0641\u0630 \u0628\u0646\u0627\u0621 \u0644\u0643\u064A \u064A\u0646\u0634\u0623 \u062C\u0646\u0643\u0646\u0632 \u0645\u0633\u0627\u062D\u0629 \u0639\u0645\u0644. diff --git a/core/src/main/resources/hudson/model/AbstractItem/noWorkspace_ca.properties b/core/src/main/resources/hudson/model/AbstractItem/noWorkspace_ca.properties index 4684976a8f..8dae3702bb 100644 --- a/core/src/main/resources/hudson/model/AbstractItem/noWorkspace_ca.properties +++ b/core/src/main/resources/hudson/model/AbstractItem/noWorkspace_ca.properties @@ -1,4 +1,4 @@ # This file is under the MIT License by authors -Error:\ no\ workspace=Error: sense espai de treball +Error\:\ no\ workspace=Error: sense espai de treball text=Construir ara perqu\u00E8 Jenkins construeixi un espai de treball. diff --git a/core/src/main/resources/hudson/model/AbstractItem/noWorkspace_es.properties b/core/src/main/resources/hudson/model/AbstractItem/noWorkspace_es.properties index 58f2750bb3..873d4814c7 100644 --- a/core/src/main/resources/hudson/model/AbstractItem/noWorkspace_es.properties +++ b/core/src/main/resources/hudson/model/AbstractItem/noWorkspace_es.properties @@ -20,10 +20,9 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -There''s\ no\ workspace\ for\ this\ project.\ Possible\ reasons\ are:=No hay un espacio de trabajo para este proyecto. Las posibles razones son: +There''s\ no\ workspace\ for\ this\ project.\ Possible\ reasons\ are\:=No hay un espacio de trabajo para este proyecto. Las posibles razones son: li3=El directorio de trabajo ({0}) se moverá fuera de Jenkins. text=Lanzar una ejecución para que Jenkins cree el directorio de trabajo. -There''s\ no\ workspace\ for\ this\ project.\ Possible\ reasons\ are\:=No hay espacio de trabajo para este proyecto, las causas posibles son: The\ project\ was\ renamed\ recently\ and\ no\ build\ was\ done\ under\ the\ new\ name.=El proyecto se ha renombrado y no se a ejecutado desde entonces Error\:\ no\ workspace=Error, no hay espacio de trabajo The\ agent\ this\ project\ has\ run\ on\ for\ the\ last\ time\ was\ removed.=El agente donde se ejecutó la última vez se ha eliminado diff --git a/core/src/main/resources/hudson/model/AbstractItem/noWorkspace_et.properties b/core/src/main/resources/hudson/model/AbstractItem/noWorkspace_et.properties index 96416836ec..8ad854612e 100644 --- a/core/src/main/resources/hudson/model/AbstractItem/noWorkspace_et.properties +++ b/core/src/main/resources/hudson/model/AbstractItem/noWorkspace_et.properties @@ -1,6 +1,6 @@ # This file is under the MIT License by authors -Error:\ no\ workspace=Viga: sellist t\u00F6\u00F6 keskkonda pole -There''s\ no\ workspace\ for\ this\ project.\ Possible\ reasons\ are:=Sellel projektil ei ole t\u00F6\u00F6keskkonda. V\u00F5imalikud p\u00F5hjused on: +Error\:\ no\ workspace=Viga: sellist t\u00F6\u00F6 keskkonda pole +There''s\ no\ workspace\ for\ this\ project.\ Possible\ reasons\ are\:=Sellel projektil ei ole t\u00F6\u00F6keskkonda. V\u00F5imalikud p\u00F5hjused on: li3=T\u00F6\u00F6 keskkonna kataloog {{0}} on eemaldatud v\u00E4ljaspool Jenkinsit. text=Kompileeri bild t\u00F6\u00F6 keskkonna loomiseks. diff --git a/core/src/main/resources/hudson/model/AbstractItem/noWorkspace_ja.properties b/core/src/main/resources/hudson/model/AbstractItem/noWorkspace_ja.properties index f8332b3369..3a4395e7c2 100644 --- a/core/src/main/resources/hudson/model/AbstractItem/noWorkspace_ja.properties +++ b/core/src/main/resources/hudson/model/AbstractItem/noWorkspace_ja.properties @@ -30,4 +30,4 @@ The\ project\ was\ renamed\ recently\ and\ no\ build\ was\ done\ under\ the\ new li3=\u30ef\u30fc\u30af\u30b9\u30da\u30fc\u30b9\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\uff08{0}\uff09\u304cJenkins\u306e\u7ba1\u7406\u5916\u3078\u53d6\u308a\u9664\u304b\u308c\u305f\u3002 text=\u30d3\u30eb\u30c9\u3092\u5b9f\u884c\u3057\u3066\u3001\u30ef\u30fc\u30af\u30b9\u30da\u30fc\u30b9\u3092\u4f5c\u6210\u3057\u3066\u304f\u3060\u3055\u3044\u3002 The\ workspace\ was\ wiped\ out\ and\ no\ build\ has\ been\ done\ since\ then.=\ - \u30ef\u30fc\u30af\u30b9\u30da\u30fc\u30b9\u304c\u524a\u9664\u3055\u308c\u3066\u304b\u3089\u4e00\u5ea6\u3082\u30d3\u30eb\u30c9\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002 \ No newline at end of file + \u30ef\u30fc\u30af\u30b9\u30da\u30fc\u30b9\u304c\u524a\u9664\u3055\u308c\u3066\u304b\u3089\u4e00\u5ea6\u3082\u30d3\u30eb\u30c9\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002 diff --git a/core/src/main/resources/hudson/model/AbstractItem/noWorkspace_ko.properties b/core/src/main/resources/hudson/model/AbstractItem/noWorkspace_ko.properties index 759f87e84c..4773b9ccac 100644 --- a/core/src/main/resources/hudson/model/AbstractItem/noWorkspace_ko.properties +++ b/core/src/main/resources/hudson/model/AbstractItem/noWorkspace_ko.properties @@ -1,4 +1,4 @@ # This file is under the MIT License by authors -Error:\ no\ workspace=\uC5D0\uB7EC: \uC791\uC5C5\uACF5\uAC04\uC774 \uC5C6\uC2B5\uB2C8\uB2E4. +Error\:\ no\ workspace=\uC5D0\uB7EC: \uC791\uC5C5\uACF5\uAC04\uC774 \uC5C6\uC2B5\uB2C8\uB2E4. text=\uC820\uD0A8\uC2A4\uAC00 \uC791\uC5C5\uACF5\uAC04\uC744 \uB9CC\uB4E4\uAE30 \uC704\uD574 \uBE4C\uB4DC\uC2E4\uD589. diff --git a/core/src/main/resources/hudson/model/AbstractItem/noWorkspace_lt.properties b/core/src/main/resources/hudson/model/AbstractItem/noWorkspace_lt.properties index c4c43f0c11..10ca7cd673 100644 --- a/core/src/main/resources/hudson/model/AbstractItem/noWorkspace_lt.properties +++ b/core/src/main/resources/hudson/model/AbstractItem/noWorkspace_lt.properties @@ -1,4 +1,4 @@ # This file is under the MIT License by authors -Error:\ no\ workspace=Klaida: n\u0117ra darbalaukio +Error\:\ no\ workspace=Klaida: n\u0117ra darbalaukio text=Paleisti konstrukcij\u0105, kad Jenkins sukurt\u0173 darbalauk\u012F. diff --git a/core/src/main/resources/hudson/model/AbstractItem/noWorkspace_lv.properties b/core/src/main/resources/hudson/model/AbstractItem/noWorkspace_lv.properties index 6274786530..3e34d61d04 100644 --- a/core/src/main/resources/hudson/model/AbstractItem/noWorkspace_lv.properties +++ b/core/src/main/resources/hudson/model/AbstractItem/noWorkspace_lv.properties @@ -20,5 +20,5 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -There''s\ no\ workspace\ for\ this\ project.\ Possible\ reasons\ are:=\u0160im projektam nav nevienas darbavietas. Tam var\u0113tu b\u016Bt \u0161\u0101di iemesli: +There''s\ no\ workspace\ for\ this\ project.\ Possible\ reasons\ are\:=\u0160im projektam nav nevienas darbavietas. Tam var\u0113tu b\u016Bt \u0161\u0101di iemesli: text=Palaist b\u016Bv\u0113jumu lai izveidotu darbavietu priek\u0161 Jenkins. diff --git a/core/src/main/resources/hudson/model/AbstractItem/noWorkspace_pt_PT.properties b/core/src/main/resources/hudson/model/AbstractItem/noWorkspace_pt_PT.properties index a2abb2fce8..2f8d8ff147 100644 --- a/core/src/main/resources/hudson/model/AbstractItem/noWorkspace_pt_PT.properties +++ b/core/src/main/resources/hudson/model/AbstractItem/noWorkspace_pt_PT.properties @@ -1,4 +1,4 @@ # This file is under the MIT License by authors -Error:\ no\ workspace=Erro: nenhum espa\u00E7od e trabalho +Error\:\ no\ workspace=Erro: nenhum espa\u00E7od e trabalho text=Executa um build para que o Jenkins crie um espa\u00E7o de trabalho. 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 a76a9c1b57..8511a31998 100644 --- a/core/src/main/resources/hudson/model/AbstractItem/noWorkspace_ru.properties +++ b/core/src/main/resources/hudson/model/AbstractItem/noWorkspace_ru.properties @@ -32,4 +32,4 @@ text=\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u04 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 + \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. diff --git a/core/src/main/resources/hudson/model/AbstractItem/noWorkspace_sk.properties b/core/src/main/resources/hudson/model/AbstractItem/noWorkspace_sk.properties index 3a9ca92f10..9e867a30cd 100644 --- a/core/src/main/resources/hudson/model/AbstractItem/noWorkspace_sk.properties +++ b/core/src/main/resources/hudson/model/AbstractItem/noWorkspace_sk.properties @@ -1,6 +1,6 @@ # This file is under the MIT License by authors -Error:\ no\ workspace=Chyba: neexistuje pracovn\u00FD priestor -There''s\ no\ workspace\ for\ this\ project.\ Possible\ reasons\ are:=Neexistuje pracovn\u00FD priestor pre tento projekt. Mo\u017En\u00E9 pr\u00ED\u010Diny s\u00FA: +Error\:\ no\ workspace=Chyba: neexistuje pracovn\u00FD priestor +There''s\ no\ workspace\ for\ this\ project.\ Possible\ reasons\ are\:=Neexistuje pracovn\u00FD priestor pre tento projekt. Mo\u017En\u00E9 pr\u00ED\u010Diny s\u00FA: li3=Adres\u00E1r pracovn\u00E9ho priestoru ({0}) bol odstr\u00E1nen\u00FD mimo Jenkinsu. text=Spusti zostavenie a Jenkins vytvor\u00ED pracovn\u00FD priestor. diff --git a/core/src/main/resources/hudson/model/AbstractItem/noWorkspace_tr.properties b/core/src/main/resources/hudson/model/AbstractItem/noWorkspace_tr.properties index 0696ad6f25..6d52903a1c 100644 --- a/core/src/main/resources/hudson/model/AbstractItem/noWorkspace_tr.properties +++ b/core/src/main/resources/hudson/model/AbstractItem/noWorkspace_tr.properties @@ -20,9 +20,9 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -li3=\u00c7al\u0131\u015fma alan\u0131 dizini ({0}), Jenkins''\u0131n kontrol\u00fc d\u0131\u015f\u0131nda silindi. -text=Jenkins''\u0131n bir \u00e7al\u0131\u015fma alan\u0131 yaratmas\u0131 i\u00e7in bir yap\u0131land\u0131rma \u00e7al\u0131\u015ft\u0131r\u0131n. -Error\:\ no\ workspace=Hata\:\ \u00c7al\u0131\u015fma Alan\u0131 mevcut de\u011fil -A\ project\ won't\ have\ any\ workspace\ until\ at\ least\ one\ build\ is\ performed.=Bir\ proje,\ en\ az\u0131ndan\ bir\ yap\u0131land\u0131rma\ \u00e7al\u0131\u015ft\u0131r\u0131lmadan\ bir\ \u00e7al\u0131\u015fma\ alan\u0131na\ sahip\ olamaz. -There's\ no\ workspace\ for\ this\ project.\ Possible\ reasons\ are\:=Bu\ projenin\ bir\ \u00e7al\u0131\u015fma\ alan\u0131\ yok.\ Muhtemel\ sebepler\: -The\ project\ was\ renamed\ recently\ and\ no\ build\ was\ done\ under\ the\ new\ name.=Projenin\ ismi\ yeni\ de\u011fi\u015ftirildi\ ve\ yeni\ isim\ alt\u0131nda\ herhangi\ bir\ yap\u0131land\u0131rma\ \u00e7al\u0131\u015ft\u0131r\u0131lmad\u0131. +li3=\u00c7al\u0131\u015fma alan\u0131 dizini ({0}), Jenkins''in kontrol\u00fc d\u0131\u015f\u0131nda silindi. +text=Jenkins''in bir \u00e7al\u0131\u015fma alan\u0131 yaratmas\u0131 i\u00e7in bir yap\u0131land\u0131rma \u00e7al\u0131\u015ft\u0131r\u0131n. +Error\:\ no\ workspace=Hata\: \u00c7al\u0131\u015fma Alan\u0131 mevcut de\u011fil +A\ project\ won't\ have\ any\ workspace\ until\ at\ least\ one\ build\ is\ performed.=Bir proje, en az\u0131ndan bir yap\u0131land\u0131rma \u00e7al\u0131\u015ft\u0131r\u0131lmadan bir \u00e7al\u0131\u015fma alan\u0131na sahip olamaz. +There's\ no\ workspace\ for\ this\ project.\ Possible\ reasons\ are\:=Bu projenin bir \u00e7al\u0131\u015fma alan\u0131 yok. Muhtemel sebepler\: +The\ project\ was\ renamed\ recently\ and\ no\ build\ was\ done\ under\ the\ new\ name.=Projenin ismi yeni de\u011fi\u015ftirildi ve yeni isim alt\u0131nda herhangi bir yap\u0131land\u0131rma \u00e7al\u0131\u015ft\u0131r\u0131lmad\u0131. diff --git a/core/src/main/resources/hudson/model/AbstractProject/changes_ja.properties b/core/src/main/resources/hudson/model/AbstractProject/changes_ja.properties index c6457516f1..eb551492af 100644 --- a/core/src/main/resources/hudson/model/AbstractProject/changes_ja.properties +++ b/core/src/main/resources/hudson/model/AbstractProject/changes_ja.properties @@ -24,4 +24,4 @@ changes.title={0}\u306e\u5909\u66f4 Changes=\u5909\u66f4\u5c65\u6b74 from.label=#{0} \u304b\u3089 to.label=#{0} \u307e\u3067 -range.label=#{0} \u304b\u3089 #{1} \u307e\u3067 \ No newline at end of file +range.label=#{0} \u304b\u3089 #{1} \u307e\u3067 diff --git a/core/src/main/resources/hudson/model/AbstractProject/changes_lv.properties b/core/src/main/resources/hudson/model/AbstractProject/changes_lv.properties index 1bf3c61ec6..0bc7170878 100644 --- a/core/src/main/resources/hudson/model/AbstractProject/changes_lv.properties +++ b/core/src/main/resources/hudson/model/AbstractProject/changes_lv.properties @@ -23,4 +23,4 @@ Changes=Izmai\u0146as from.label=no #{0} to.label=l\u012Bdz #{0} -range.label=no #{0} l\u012Bdz #{1} \ No newline at end of file +range.label=no #{0} l\u012Bdz #{1} diff --git a/core/src/main/resources/hudson/model/AbstractProject/changes_ru.properties b/core/src/main/resources/hudson/model/AbstractProject/changes_ru.properties index 9ac01a770f..4f52ea693e 100644 --- a/core/src/main/resources/hudson/model/AbstractProject/changes_ru.properties +++ b/core/src/main/resources/hudson/model/AbstractProject/changes_ru.properties @@ -23,4 +23,4 @@ Changes=\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f from.label=\u0441 #{0} to.label=\u0434\u043E #{0} -range.label=\u0441 #{0} \u0434\u043E #{1} \ No newline at end of file +range.label=\u0441 #{0} \u0434\u043E #{1} diff --git a/core/src/main/resources/hudson/model/AbstractProject/changes_tr.properties b/core/src/main/resources/hudson/model/AbstractProject/changes_tr.properties index 678996f3ad..b8de2b1c31 100644 --- a/core/src/main/resources/hudson/model/AbstractProject/changes_tr.properties +++ b/core/src/main/resources/hudson/model/AbstractProject/changes_tr.properties @@ -24,4 +24,4 @@ Changes=De\u011fi\u015fiklikler changes.title={0} degi\u015fiklik from.label=#{0}'dan to.label=#{0}'a -range.label=#{0}'dan #{1}'a \ No newline at end of file +range.label=#{0}'dan #{1}'a diff --git a/core/src/main/resources/hudson/model/AbstractProject/configure-common_tr.properties b/core/src/main/resources/hudson/model/AbstractProject/configure-common_tr.properties index 369ac68c65..9fdb13988f 100644 --- a/core/src/main/resources/hudson/model/AbstractProject/configure-common_tr.properties +++ b/core/src/main/resources/hudson/model/AbstractProject/configure-common_tr.properties @@ -20,7 +20,7 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Advanced\ Project\ Options=Geli\u015fmi\u015f\ Proje\ Se\u00e7enekleri +Advanced\ Project\ Options=Geli\u015fmi\u015f Proje Se\u00e7enekleri JDK\ to\ be\ used\ for\ this\ project=Bu proje i\u00e7in kullan\u0131lacak olan JDK default.value=(Varsay\u0131lan) Tie\ this\ project\ to\ a\ node=Bu projeyi bir noda ba\u011fla diff --git a/core/src/main/resources/hudson/model/AbstractProject/main_tr.properties b/core/src/main/resources/hudson/model/AbstractProject/main_tr.properties index b1ea9d029b..7b8cee0e83 100644 --- a/core/src/main/resources/hudson/model/AbstractProject/main_tr.properties +++ b/core/src/main/resources/hudson/model/AbstractProject/main_tr.properties @@ -20,6 +20,6 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Workspace=\u00c7al\u0131\u015fma\ Alan\u0131 +Workspace=\u00c7al\u0131\u015fma Alan\u0131 Last\ Successful\ Artifacts=Son Ba\u015far\u0131l\u0131 Artefaktlar Recent\ Changes=Son De\u011fi\u015fiklikler diff --git a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_ja.properties b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_ja.properties index 3c841671ad..2c71c780aa 100644 --- a/core/src/main/resources/hudson/model/AbstractProject/sidepanel_ja.properties +++ b/core/src/main/resources/hudson/model/AbstractProject/sidepanel_ja.properties @@ -26,4 +26,4 @@ Changes=\u5909\u66f4\u5c65\u6b74 Workspace=\u30ef\u30fc\u30af\u30b9\u30da\u30fc\u30b9 Wipe\ Out\ Workspace=\u30ef\u30fc\u30af\u30b9\u30da\u30fc\u30b9\u306e\u30af\u30ea\u30a2 wipe.out.confirm=\u30ef\u30fc\u30af\u30b9\u30da\u30fc\u30b9\u3092\u30af\u30ea\u30a2\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -Up=\u4e0a\u3078 \ No newline at end of file +Up=\u4e0a\u3078 diff --git a/core/src/main/resources/hudson/model/AbstractProject/wipeOutWorkspaceBlocked_fr.properties b/core/src/main/resources/hudson/model/AbstractProject/wipeOutWorkspaceBlocked_fr.properties index 035978424c..b522c2f6d3 100644 --- a/core/src/main/resources/hudson/model/AbstractProject/wipeOutWorkspaceBlocked_fr.properties +++ b/core/src/main/resources/hudson/model/AbstractProject/wipeOutWorkspaceBlocked_fr.properties @@ -20,5 +20,5 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Error:\ Wipe\ Out\ Workspace\ blocked\ by\ SCM=Erreur : La suppression de l''espace de travail a été bloquée par le SCM +Error\:\ Wipe\ Out\ Workspace\ blocked\ by\ SCM=Erreur : La suppression de l''espace de travail a été bloquée par le SCM The\ SCM\ for\ this\ project\ has\ blocked\ this\ attempt\ to\ wipe\ out\ the\ project''s\ workspace.=Le SCM de ce projet a bloqué la tentative de suppression de l''espace de travail de ce projet diff --git a/core/src/main/resources/hudson/model/AllView/newViewDetail_da.properties b/core/src/main/resources/hudson/model/AllView/newViewDetail_da.properties index fc56cfa960..af651eb07d 100644 --- a/core/src/main/resources/hudson/model/AllView/newViewDetail_da.properties +++ b/core/src/main/resources/hudson/model/AllView/newViewDetail_da.properties @@ -21,4 +21,3 @@ # THE SOFTWARE. blurb=Denne visning viser all jobs i Jenkins. -suários \ No newline at end of file diff --git a/core/src/main/resources/hudson/model/AllView/noJob_tr.properties b/core/src/main/resources/hudson/model/AllView/noJob_tr.properties index 1f083c8726..d3d0413321 100644 --- a/core/src/main/resources/hudson/model/AllView/noJob_tr.properties +++ b/core/src/main/resources/hudson/model/AllView/noJob_tr.properties @@ -23,4 +23,4 @@ newJob=L\u00FCtfen ba\u015Flamak i\u00E7in yeni i\u015Fler olu\u015Fturun login=Yeni i\u015F olu\u015Fturmak i\u00E7in l\u00FCtfen giri\u015F yap\u0131n. signup=E\u011fer bir hesab\u0131n\u0131z yoksa, hemen kaydolun. -Welcome\ to\ Jenkins\!=Jenkins'a\ Ho\u015fgeldiniz\! +Welcome\ to\ Jenkins\!=Jenkins''e Ho\u015fgeldiniz\! diff --git a/core/src/main/resources/hudson/model/BuildAuthorizationToken/config_de.properties b/core/src/main/resources/hudson/model/BuildAuthorizationToken/config_de.properties index f72b60617d..659d997c01 100644 --- a/core/src/main/resources/hudson/model/BuildAuthorizationToken/config_de.properties +++ b/core/src/main/resources/hudson/model/BuildAuthorizationToken/config_de.properties @@ -5,4 +5,4 @@ Use\ the\ following\ URL\ to\ trigger\ build\ remotely\:=Folgende URL verwenden, Optionally\ append\ &cause\=Cause+Text\ to\ provide\ text\ that\ will\ be\ included\ in\ the\ recorded\ build\ cause.=\ Fügen Sie optional ein &cause=Grund+des+Builds an die URL an. \ Dieser Text wird dann in den aufgezeichneten Grund für diesen Build aufgenommen. -or=oder \ No newline at end of file +or=oder diff --git a/core/src/main/resources/hudson/model/BuildAuthorizationToken/config_ja.properties b/core/src/main/resources/hudson/model/BuildAuthorizationToken/config_ja.properties index 32870a116c..c13599615c 100644 --- a/core/src/main/resources/hudson/model/BuildAuthorizationToken/config_ja.properties +++ b/core/src/main/resources/hudson/model/BuildAuthorizationToken/config_ja.properties @@ -26,4 +26,4 @@ Trigger\ builds\ remotely=\u30ea\u30e2\u30fc\u30c8\u304b\u3089\u30d3\u30eb\u30c9 e.g.,\ from\ scripts=\u4f8b: \u30b9\u30af\u30ea\u30d7\u30c8\u304b\u3089 Optionally\ append\ &cause\=Cause+Text\ to\ provide\ text\ that\ will\ be\ included\ in\ the\ recorded\ build\ cause.=\ &cause=\u8981\u56e0\u3092\u8ffd\u52a0\u3059\u308b(\u30aa\u30d7\u30b7\u30e7\u30f3\uff09\u3068\u3001\u30d3\u30eb\u30c9\u3092\u5b9f\u884c\u3057\u305f\u8981\u56e0\u3068\u3057\u3066\u8a18\u9332\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002 -or=\u3082\u3057\u304f\u306f\u3001 \ No newline at end of file +or=\u3082\u3057\u304f\u306f\u3001 diff --git a/core/src/main/resources/hudson/model/BuildAuthorizationToken/config_ko.properties b/core/src/main/resources/hudson/model/BuildAuthorizationToken/config_ko.properties index a4867282d1..5027f76760 100644 --- a/core/src/main/resources/hudson/model/BuildAuthorizationToken/config_ko.properties +++ b/core/src/main/resources/hudson/model/BuildAuthorizationToken/config_ko.properties @@ -1,5 +1,5 @@ # This file is under the MIT License by authors Trigger\ builds\ remotely=\uBE4C\uB4DC\uB97C \uC6D0\uACA9\uC73C\uB85C \uC720\uBC1C -Use\ the\ following\ URL\ to\ trigger\ build\ remotely:=\uB2E4\uC74C URL\uC744 \uC0AC\uC6A9\uD558\uC5EC \uC6D0\uACA9 \uBE4C\uB4DC \uC720\uBC1C: +Use\ the\ following\ URL\ to\ trigger\ build\ remotely\:=\uB2E4\uC74C URL\uC744 \uC0AC\uC6A9\uD558\uC5EC \uC6D0\uACA9 \uBE4C\uB4DC \uC720\uBC1C: e.g.,\ from\ scripts=\uC608: \uC2A4\uD06C\uB9BD\uD2B8 \uC0AC\uC6A9 diff --git a/core/src/main/resources/hudson/model/BuildAuthorizationToken/config_sr.properties b/core/src/main/resources/hudson/model/BuildAuthorizationToken/config_sr.properties index b0b2e90cf5..2cd0e800ef 100644 --- a/core/src/main/resources/hudson/model/BuildAuthorizationToken/config_sr.properties +++ b/core/src/main/resources/hudson/model/BuildAuthorizationToken/config_sr.properties @@ -5,4 +5,4 @@ e.g.,\ from\ scripts=\u043D\u043F\u0440. \u043E\u0434 \u0441\u043A\u0440\u0438\u 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 +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 diff --git a/core/src/main/resources/hudson/model/Cause/UpstreamCause/description_ja.properties b/core/src/main/resources/hudson/model/Cause/UpstreamCause/description_ja.properties index 7631f49ad6..897136e188 100644 --- a/core/src/main/resources/hudson/model/Cause/UpstreamCause/description_ja.properties +++ b/core/src/main/resources/hudson/model/Cause/UpstreamCause/description_ja.properties @@ -22,4 +22,4 @@ started_by_project=\u4e0a\u6d41\u30d7\u30ed\u30b8\u30a7\u30af\u30c8{0}\u306e#{1}\u304c\u5b9f\u884c started_by_project_with_deleted_build=\u4e0a\u6d41\u30d7\u30ed\u30b8\u30a7\u30af\u30c8{0}\u306e#{1}\u304c\u5b9f\u884c -caused_by=\u5143\u306e\u539f\u56e0: \ No newline at end of file +caused_by=\u5143\u306e\u539f\u56e0: diff --git a/core/src/main/resources/hudson/model/Cause/UserIdCause/description_ja.properties b/core/src/main/resources/hudson/model/Cause/UserIdCause/description_ja.properties index 1b849d6102..9186d3e0d3 100644 --- a/core/src/main/resources/hudson/model/Cause/UserIdCause/description_ja.properties +++ b/core/src/main/resources/hudson/model/Cause/UserIdCause/description_ja.properties @@ -21,4 +21,4 @@ # THE SOFTWARE. started_by_user=\u30e6\u30fc\u30b6\u30fc{1}\u304c\u5b9f\u884c -started_by_anonymous=\u533f\u540d\u30e6\u30fc\u30b6\u30fc\u304c\u5b9f\u884c \ No newline at end of file +started_by_anonymous=\u533f\u540d\u30e6\u30fc\u30b6\u30fc\u304c\u5b9f\u884c diff --git a/core/src/main/resources/hudson/model/Computer/_scriptText.jelly b/core/src/main/resources/hudson/model/Computer/_scriptText.jelly index 0867147550..f87b23b69d 100644 --- a/core/src/main/resources/hudson/model/Computer/_scriptText.jelly +++ b/core/src/main/resources/hudson/model/Computer/_scriptText.jelly @@ -26,5 +26,8 @@ THE SOFTWARE. Called from doScriptText() to display the execution result. --> - - + + + + + diff --git a/core/src/main/resources/hudson/model/Computer/builds.jelly b/core/src/main/resources/hudson/model/Computer/builds.jelly index 1ef0f89f50..09a524e510 100644 --- a/core/src/main/resources/hudson/model/Computer/builds.jelly +++ b/core/src/main/resources/hudson/model/Computer/builds.jelly @@ -31,6 +31,9 @@ THE SOFTWARE. ${%title(it.displayName)} +

      + ${%disclaimer} +

      diff --git a/core/src/main/resources/hudson/model/Computer/builds.properties b/core/src/main/resources/hudson/model/Computer/builds.properties index 9e53dba33a..c7cf214409 100644 --- a/core/src/main/resources/hudson/model/Computer/builds.properties +++ b/core/src/main/resources/hudson/model/Computer/builds.properties @@ -20,4 +20,5 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -title=Build History on {0} \ No newline at end of file +title=Build History on {0} +disclaimer=This history is not guaranteed to include all subtasks executed on the node, e.g. Jenkins Pipeline subtasks will not be displayed. diff --git a/core/src/main/resources/hudson/model/Computer/builds_ja.properties b/core/src/main/resources/hudson/model/Computer/builds_ja.properties index 0b14d3341f..9df69bee9b 100644 --- a/core/src/main/resources/hudson/model/Computer/builds_ja.properties +++ b/core/src/main/resources/hudson/model/Computer/builds_ja.properties @@ -20,4 +20,4 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -title={0}\u306E\u30D3\u30EB\u30C9\u5C65\u6B74 \ No newline at end of file +title={0}\u306E\u30D3\u30EB\u30C9\u5C65\u6B74 diff --git a/core/src/main/resources/hudson/model/Computer/configure_ja.properties b/core/src/main/resources/hudson/model/Computer/configure_ja.properties index b8994d41a3..3f29a85059 100644 --- a/core/src/main/resources/hudson/model/Computer/configure_ja.properties +++ b/core/src/main/resources/hudson/model/Computer/configure_ja.properties @@ -22,4 +22,4 @@ title={0} \u306E\u8A2D\u5B9A Name=\u30CE\u30FC\u30C9\u540D -Save=\u4FDD\u5B58 \ No newline at end of file +Save=\u4FDD\u5B58 diff --git a/core/src/main/resources/hudson/model/Computer/delete_ja.properties b/core/src/main/resources/hudson/model/Computer/delete_ja.properties index 22f770e0f0..6a14428184 100644 --- a/core/src/main/resources/hudson/model/Computer/delete_ja.properties +++ b/core/src/main/resources/hudson/model/Computer/delete_ja.properties @@ -20,4 +20,4 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Yes=\u306F\u3044 \ No newline at end of file +Yes=\u306F\u3044 diff --git a/core/src/main/resources/hudson/model/Computer/index.jelly b/core/src/main/resources/hudson/model/Computer/index.jelly index ecd9dbf11e..015283e4fd 100644 --- a/core/src/main/resources/hudson/model/Computer/index.jelly +++ b/core/src/main/resources/hudson/model/Computer/index.jelly @@ -71,22 +71,6 @@ THE SOFTWARE.

      ${%title.no_manual_launch(it.retentionStrategy.descriptor.displayName)}

      - - - -

      - ${%Created by} - - - ${%anonymous user} - - - ${user.displayName} - - -

      -
      -

      ${%Labels}

      diff --git a/core/src/main/resources/hudson/model/Computer/index_cs.properties b/core/src/main/resources/hudson/model/Computer/index_cs.properties index ac0cf2d9f9..820e6a867a 100644 --- a/core/src/main/resources/hudson/model/Computer/index_cs.properties +++ b/core/src/main/resources/hudson/model/Computer/index_cs.properties @@ -20,6 +20,6 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Labels:=Popisky: +Labels=Popisky submit.not.temporarilyOffline=Ozna\u010Dit uzel jako do\u010Dasn\u011B nedostupn\u00FD submit.temporarilyOffline=P\u0159ipojit uzel zp\u011Bt diff --git a/core/src/main/resources/hudson/model/Computer/index_he.properties b/core/src/main/resources/hudson/model/Computer/index_he.properties index 339f1b7023..2b964eef05 100644 --- a/core/src/main/resources/hudson/model/Computer/index_he.properties +++ b/core/src/main/resources/hudson/model/Computer/index_he.properties @@ -1,5 +1,5 @@ # This file is under the MIT License by authors -Labels:=\u05EA\u05D2\u05D9\u05D5\u05EA: +Labels=\u05EA\u05D2\u05D9\u05D5\u05EA None=\u05DC\u05DC\u05D0 title.projects_tied_on=\u05E4\u05E8\u05D5\u05D9\u05D9\u05E7\u05D8\u05D9\u05DD \u05D4\u05DE\u05E7\u05D5\u05E9\u05E8\u05D9\u05DD \u05DC diff --git a/core/src/main/resources/hudson/model/Computer/index_ja.properties b/core/src/main/resources/hudson/model/Computer/index_ja.properties index 16b6e48a21..705dbbf99a 100644 --- a/core/src/main/resources/hudson/model/Computer/index_ja.properties +++ b/core/src/main/resources/hudson/model/Computer/index_ja.properties @@ -23,7 +23,7 @@ submit.temporarilyOffline=\u3053\u306e\u30ce\u30fc\u30c9\u3092\u30aa\u30f3\u30e9\u30a4\u30f3\u306b\u623b\u3059 submit.not.temporarilyOffline=\u3053\u306e\u30ce\u30fc\u30c9\u3092\u4e00\u6642\u7684\u306b\u30aa\u30d5\u30e9\u30a4\u30f3\u306b\u3059\u308b None=\u306a\u3057 -Labels\=\u30e9\u30d9\u30eb +Labels=\u30e9\u30d9\u30eb title.projects_tied_on={0}\u3067\u306e\u307f\u8d77\u52d5\u3059\u308b\u30d7\u30ed\u30b8\u30a7\u30af\u30c8 title.no_manual_launch=\u3053\u306e\u30ce\u30fc\u30c9\u306e\u53ef\u7528\u6027\u306e\u30dd\u30ea\u30b7\u30fc\u306f''{0}''\u3067\u3059\u3002\u73fe\u5728\u3001\u305d\u306e\u30dd\u30ea\u30b7\u30fc\u306b\u57fa\u3065\u3044\u3066\u3001\u3053\u306e\u30ce\u30fc\u30c9\u306f\u30aa\u30d5\u30e9\u30a4\u30f3\u306b\u306a\u3063\u3066\u3044\u307e\u3059\u3002 Created\ by=\u30ce\u30fc\u30c9\u4f5c\u6210\u8005 diff --git a/core/src/main/resources/hudson/model/Computer/index_ko.properties b/core/src/main/resources/hudson/model/Computer/index_ko.properties index 603d74658e..a8fb5c0115 100644 --- a/core/src/main/resources/hudson/model/Computer/index_ko.properties +++ b/core/src/main/resources/hudson/model/Computer/index_ko.properties @@ -20,7 +20,7 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Labels:=\uB808\uC774\uBE14 +Labels=\uB808\uC774\uBE14 None=\uC5C6\uC74C submit.not.temporarilyOffline=\uC784\uC2DC\uB85C \uB178\uB4DC \uC624\uD504\uB77C\uC778\uC73C\uB85C \uBCC0\uACBD title.projects_tied_on={0}\uC5D0 \uC5F0\uACB0\uB41C \uD504\uB85C\uC81D\uD2B8 diff --git a/core/src/main/resources/hudson/model/Computer/index_lv.properties b/core/src/main/resources/hudson/model/Computer/index_lv.properties index 35a7a4017a..54ab4aba3a 100644 --- a/core/src/main/resources/hudson/model/Computer/index_lv.properties +++ b/core/src/main/resources/hudson/model/Computer/index_lv.properties @@ -20,6 +20,6 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Labels:=Birkas: +Labels=Birkas None=Neveins title.projects_tied_on=Projekti, kuri piesaist\u012Bti pie {0} diff --git a/core/src/main/resources/hudson/model/Computer/index_ru.properties b/core/src/main/resources/hudson/model/Computer/index_ru.properties index 72365b9001..cc1e2c52b6 100644 --- a/core/src/main/resources/hudson/model/Computer/index_ru.properties +++ b/core/src/main/resources/hudson/model/Computer/index_ru.properties @@ -20,7 +20,7 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Labels:=\u041c\u0435\u0442\u043a\u0438: +Labels=\u041c\u0435\u0442\u043a\u0438 None=\u041d\u0435\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 submit.not.temporarilyOffline=\u041f\u043e\u043c\u0435\u0442\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0443\u0437\u0435\u043b \u043a\u0430\u043a \u043a\u0430\u043a \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0439 submit.temporarilyOffline=\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0439 \u0443\u0437\u0435\u043b diff --git a/core/src/main/resources/hudson/model/Computer/index_sk.properties b/core/src/main/resources/hudson/model/Computer/index_sk.properties index d74f30e95f..c54cc0404d 100644 --- a/core/src/main/resources/hudson/model/Computer/index_sk.properties +++ b/core/src/main/resources/hudson/model/Computer/index_sk.properties @@ -1,7 +1,7 @@ # This file is under the MIT License by authors Created\ by=Vytvoren\u00FD pou\u017E\u00EDvate\u013Eom -Labels:=Zna\u010Dky: +Labels=Zna\u010Dky None=\u017Diadny submit.not.temporarilyOffline=Ozna\u010D stroj ako do\u010Dasne odpojen\u00FD title.projects_tied_on=Projekty naviazan\u00E9 na {0} diff --git a/core/src/main/resources/hudson/model/Computer/index_sv_SE.properties b/core/src/main/resources/hudson/model/Computer/index_sv_SE.properties index 829118db6f..eeb75ab584 100644 --- a/core/src/main/resources/hudson/model/Computer/index_sv_SE.properties +++ b/core/src/main/resources/hudson/model/Computer/index_sv_SE.properties @@ -20,7 +20,7 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Labels:=Etiketter +Labels=Etiketter None=Inga submit.not.temporarilyOffline=Markera noden som tillf\u00E4lligt ifr\u00E5nkopplad submit.temporarilyOffline=Noden \u00E4r online igen diff --git a/core/src/main/resources/hudson/model/Computer/sidepanel_tr.properties b/core/src/main/resources/hudson/model/Computer/sidepanel_tr.properties index 87af65f9c3..446874afed 100644 --- a/core/src/main/resources/hudson/model/Computer/sidepanel_tr.properties +++ b/core/src/main/resources/hudson/model/Computer/sidepanel_tr.properties @@ -24,5 +24,5 @@ Back\ to\ List=Listeye D\u00f6n Build\ History=Yap\u0131land\u0131rma Ge\u00e7mi\u015fi Configure=Yap\u0131land\u0131r Load\ Statistics=Y\u00FCklenme istatistikleri -Script\ Console=Script\ Konsolu +Script\ Console=Script Konsolu Status=Durum diff --git a/core/src/main/resources/hudson/model/ComputerSet/_new_ja.properties b/core/src/main/resources/hudson/model/ComputerSet/_new_ja.properties index 31a51ca5be..58f28c6e62 100644 --- a/core/src/main/resources/hudson/model/ComputerSet/_new_ja.properties +++ b/core/src/main/resources/hudson/model/ComputerSet/_new_ja.properties @@ -22,4 +22,4 @@ Name=\u30CE\u30FC\u30C9\u540D Name\ is\ mandatory=\u30CE\u30FC\u30C9\u540D\u306F\u5FC5\u9808\u3067\u3059 -Save=\u4FDD\u5B58 \ No newline at end of file +Save=\u4FDD\u5B58 diff --git a/core/src/main/resources/hudson/model/ComputerSet/configure_ja.properties b/core/src/main/resources/hudson/model/ComputerSet/configure_ja.properties index 6d0826b1c1..53267021f1 100644 --- a/core/src/main/resources/hudson/model/ComputerSet/configure_ja.properties +++ b/core/src/main/resources/hudson/model/ComputerSet/configure_ja.properties @@ -22,4 +22,4 @@ Node\ Monitoring\ Configuration=\u30ce\u30fc\u30c9\u76e3\u8996\u306e\u8a2d\u5b9a Preventive\ Node\ Monitoring=\u30ce\u30fc\u30c9\u76e3\u8996\u9805\u76ee -OK=\u4fdd\u5b58 \ No newline at end of file +OK=\u4fdd\u5b58 diff --git a/core/src/main/resources/hudson/model/ComputerSet/index_ja.properties b/core/src/main/resources/hudson/model/ComputerSet/index_ja.properties index 3d16712929..d43820de59 100644 --- a/core/src/main/resources/hudson/model/ComputerSet/index_ja.properties +++ b/core/src/main/resources/hudson/model/ComputerSet/index_ja.properties @@ -24,4 +24,4 @@ Nodes=\u30ce\u30fc\u30c9 Name=\u540d\u524d Refresh\ status=\u30b9\u30c6\u30fc\u30bf\u30b9\u66f4\u65b0 Configure=\u8a2d\u5b9a -Data\ obtained=\u30c7\u30fc\u30bf\u53d6\u5f97 \ No newline at end of file +Data\ obtained=\u30c7\u30fc\u30bf\u53d6\u5f97 diff --git a/core/src/main/resources/hudson/model/ComputerSet/new_ja.properties b/core/src/main/resources/hudson/model/ComputerSet/new_ja.properties index 93096da41f..c767af79b2 100644 --- a/core/src/main/resources/hudson/model/ComputerSet/new_ja.properties +++ b/core/src/main/resources/hudson/model/ComputerSet/new_ja.properties @@ -21,4 +21,4 @@ # THE SOFTWARE. Node\ name=\u30CE\u30FC\u30C9\u540D -Copy\ Existing\ Node=\u30CE\u30FC\u30C9\u3092\u30B3\u30D4\u30FC \ No newline at end of file +Copy\ Existing\ Node=\u30CE\u30FC\u30C9\u3092\u30B3\u30D4\u30FC diff --git a/core/src/main/resources/hudson/model/ComputerSet/sidepanel.jelly b/core/src/main/resources/hudson/model/ComputerSet/sidepanel.jelly index 59973506f5..919e67e648 100644 --- a/core/src/main/resources/hudson/model/ComputerSet/sidepanel.jelly +++ b/core/src/main/resources/hudson/model/ComputerSet/sidepanel.jelly @@ -32,9 +32,10 @@ THE SOFTWARE. - + - + + diff --git a/core/src/main/resources/hudson/model/ComputerSet/sidepanel_tr.properties b/core/src/main/resources/hudson/model/ComputerSet/sidepanel_tr.properties index 2c9e96636f..2869102c99 100644 --- a/core/src/main/resources/hudson/model/ComputerSet/sidepanel_tr.properties +++ b/core/src/main/resources/hudson/model/ComputerSet/sidepanel_tr.properties @@ -21,4 +21,4 @@ # THE SOFTWARE. Back\ to\ Dashboard=Kontrol Merkezi'ne D\u00f6n -Manage\ Jenkins=Jenkins''\u0131 Y\u00f6net \ No newline at end of file +Manage\ Jenkins=Jenkins''i Y\u00f6net diff --git a/core/src/main/resources/hudson/model/DirectoryBrowserSupport/dir_ja.properties b/core/src/main/resources/hudson/model/DirectoryBrowserSupport/dir_ja.properties index 84c7fce975..3d7f988d57 100644 --- a/core/src/main/resources/hudson/model/DirectoryBrowserSupport/dir_ja.properties +++ b/core/src/main/resources/hudson/model/DirectoryBrowserSupport/dir_ja.properties @@ -22,4 +22,4 @@ No\ files\ in\ directory=\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u5185\u306B\u30D5\u30A1\u30A4\u30EB\u304C\u5B58\u5728\u3057\u307E\u305B\u3093 view=\u53C2\u7167 -all\ files\ in\ zip=\u5168\u3066\u306E\u30D5\u30A1\u30A4\u30EB\u3092zip\u3067 \ No newline at end of file +all\ files\ in\ zip=\u5168\u3066\u306E\u30D5\u30A1\u30A4\u30EB\u3092zip\u3067 diff --git a/core/src/main/resources/hudson/model/DirectoryBrowserSupport/dir_tr.properties b/core/src/main/resources/hudson/model/DirectoryBrowserSupport/dir_tr.properties index c1e6a63942..9418b0af16 100644 --- a/core/src/main/resources/hudson/model/DirectoryBrowserSupport/dir_tr.properties +++ b/core/src/main/resources/hudson/model/DirectoryBrowserSupport/dir_tr.properties @@ -20,6 +20,6 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -all\ files\ in\ zip=Zip\ halinde\ t\u00fcm\ dosyalar +all\ files\ in\ zip=Zip halinde t\u00fcm dosyalar No\ files\ in\ directory=Dizin i\u00e7erisinde dosya bulunmuyor view=G\u00F6r\u00FCn\u00FCm diff --git a/core/src/main/resources/hudson/model/DirectoryBrowserSupport/plaindir.jelly b/core/src/main/resources/hudson/model/DirectoryBrowserSupport/plaindir.jelly new file mode 100644 index 0000000000..547bbe1acb --- /dev/null +++ b/core/src/main/resources/hudson/model/DirectoryBrowserSupport/plaindir.jelly @@ -0,0 +1,56 @@ + + + + + + + + + + ..
      +
      + +

      ${%No files in directory}

      +
      + + + + + + + + ${t.title} + + + ${t.title} + + + + / + +
      +
      +
      +
      + + +
      +
      diff --git a/core/src/main/resources/hudson/model/EnvironmentContributor/EnvVarsHtml/index_de.properties b/core/src/main/resources/hudson/model/EnvironmentContributor/EnvVarsHtml/index_de.properties index 310eb53216..c01a5bb92d 100644 --- a/core/src/main/resources/hudson/model/EnvironmentContributor/EnvVarsHtml/index_de.properties +++ b/core/src/main/resources/hudson/model/EnvironmentContributor/EnvVarsHtml/index_de.properties @@ -1,2 +1,2 @@ Available\ Environmental\ Variables=Verf\u00FCgbare Umgebungsvariablen -The\ following\ variables\ are\ available\ to\ shell\ scripts=Die folgenden Variablen sind innerhalb von Shell-Skripten sichtbar: \ No newline at end of file +The\ following\ variables\ are\ available\ to\ shell\ scripts=Die folgenden Variablen sind innerhalb von Shell-Skripten sichtbar: diff --git a/core/src/main/resources/hudson/model/EnvironmentContributor/EnvVarsHtml/index_fr.properties b/core/src/main/resources/hudson/model/EnvironmentContributor/EnvVarsHtml/index_fr.properties index 3aca3348ca..f937abbc85 100644 --- a/core/src/main/resources/hudson/model/EnvironmentContributor/EnvVarsHtml/index_fr.properties +++ b/core/src/main/resources/hudson/model/EnvironmentContributor/EnvVarsHtml/index_fr.properties @@ -1,2 +1,2 @@ Available\ Environmental\ Variables=Variables d'environnement disponibles -The\ following\ variables\ are\ available\ to\ shell\ scripts=Les variables suivantes sont mises \u00E0 disposition des scripts shell \ No newline at end of file +The\ following\ variables\ are\ available\ to\ shell\ scripts=Les variables suivantes sont mises \u00E0 disposition des scripts shell diff --git a/core/src/main/resources/hudson/model/EnvironmentContributor/EnvVarsHtml/index_ja.properties b/core/src/main/resources/hudson/model/EnvironmentContributor/EnvVarsHtml/index_ja.properties index 8f3d270266..785aa635b7 100644 --- a/core/src/main/resources/hudson/model/EnvironmentContributor/EnvVarsHtml/index_ja.properties +++ b/core/src/main/resources/hudson/model/EnvironmentContributor/EnvVarsHtml/index_ja.properties @@ -1,2 +1,2 @@ Available\ Environmental\ Variables=\u5229\u7528\u53EF\u80FD\u306A\u74B0\u5883\u5909\u6570 -The\ following\ variables\ are\ available\ to\ shell\ scripts=\u30B7\u30A7\u30EB\u30B9\u30AF\u30EA\u30D7\u30C8\u3067\u306F\u3001\u6B21\u306E\u5909\u6570\u3092\u5229\u7528\u3067\u304D\u307E\u3059\u3002 \ No newline at end of file +The\ following\ variables\ are\ available\ to\ shell\ scripts=\u30B7\u30A7\u30EB\u30B9\u30AF\u30EA\u30D7\u30C8\u3067\u306F\u3001\u6B21\u306E\u5909\u6570\u3092\u5229\u7528\u3067\u304D\u307E\u3059\u3002 diff --git a/core/src/main/resources/hudson/model/EnvironmentContributor/EnvVarsHtml/index_nl.properties b/core/src/main/resources/hudson/model/EnvironmentContributor/EnvVarsHtml/index_nl.properties index 4fad8879de..1e16e54b83 100644 --- a/core/src/main/resources/hudson/model/EnvironmentContributor/EnvVarsHtml/index_nl.properties +++ b/core/src/main/resources/hudson/model/EnvironmentContributor/EnvVarsHtml/index_nl.properties @@ -1,2 +1,2 @@ Available\ Environmental\ Variables=Beschikbare omgevingsparameters -The\ following\ variables\ are\ available\ to\ shell\ scripts=Volgende parameters zijn beschikbaar voor gebruik in uw scripts: \ No newline at end of file +The\ following\ variables\ are\ available\ to\ shell\ scripts=Volgende parameters zijn beschikbaar voor gebruik in uw scripts: diff --git a/core/src/main/resources/hudson/model/EnvironmentContributor/EnvVarsHtml/index_sr.properties b/core/src/main/resources/hudson/model/EnvironmentContributor/EnvVarsHtml/index_sr.properties index 612256967d..afcfba7fc8 100644 --- a/core/src/main/resources/hudson/model/EnvironmentContributor/EnvVarsHtml/index_sr.properties +++ b/core/src/main/resources/hudson/model/EnvironmentContributor/EnvVarsHtml/index_sr.properties @@ -1,4 +1,4 @@ # This file is under the MIT License by authors Available\ Environmental\ Variables=\u0421\u043B\u043E\u0431\u043E\u0434\u043D\u0438\u0445 \u0413\u043B\u043E\u0431\u0430\u043B\u043D\u0438\u0445 \u041F\u0440\u043E\u043C\u0435\u043D\u0459\u0438\u0432\u0430 -The\ following\ variables\ are\ available\ to\ shell\ scripts=\u041F\u0440\u0430\u0442\u0435\u045B\u0430 \u043F\u0440\u043E\u043C\u0435\u043D\u0459\u0438\u0432\u0430 \u0441\u0443 \u0434\u043E\u0441\u0442\u0443\u043F\u043Da \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u0438\u043C\u0430 \ No newline at end of file +The\ following\ variables\ are\ available\ to\ shell\ scripts=\u041F\u0440\u0430\u0442\u0435\u045B\u0430 \u043F\u0440\u043E\u043C\u0435\u043D\u0459\u0438\u0432\u0430 \u0441\u0443 \u0434\u043E\u0441\u0442\u0443\u043F\u043Da \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u0438\u043C\u0430 diff --git a/core/src/main/resources/hudson/model/FileParameterDefinition/config_ru.properties b/core/src/main/resources/hudson/model/FileParameterDefinition/config_ru.properties index 2b63b2488f..b48a89376d 100644 --- a/core/src/main/resources/hudson/model/FileParameterDefinition/config_ru.properties +++ b/core/src/main/resources/hudson/model/FileParameterDefinition/config_ru.properties @@ -21,4 +21,4 @@ # THE SOFTWARE. File\ location=\u041c\u0435\u0441\u0442\u043e\u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u0430 -Description=\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \ No newline at end of file +Description=\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 diff --git a/core/src/main/resources/hudson/model/Fingerprint/index_tr.properties b/core/src/main/resources/hudson/model/Fingerprint/index_tr.properties index 52c9eeb740..37d0106d8e 100644 --- a/core/src/main/resources/hudson/model/Fingerprint/index_tr.properties +++ b/core/src/main/resources/hudson/model/Fingerprint/index_tr.properties @@ -21,7 +21,7 @@ # THE SOFTWARE. introduced={0} \u00f6nce ba\u015flad\u0131 -outside\ Jenkins=Jenkins''\u0131n d\u0131\u015f\u0131nda +outside\ Jenkins=Jenkins''in d\u0131\u015f\u0131nda This\ file\ has\ not\ been\ used\ anywhere\ else.=Bu dosya ba\u015fka yerde kullan\u0131lmamaktad\u0131r. This\ file\ has\ been\ used\ in\ the\ following\ places=Bu dosya belirtilen yerlerde kullan\u0131lmaktad\u0131r Back\ to\ Dashboard=Kontrol Merkezi''ne D\u00f6n diff --git a/core/src/main/resources/hudson/model/Job/buildTimeTrend.jelly b/core/src/main/resources/hudson/model/Job/buildTimeTrend.jelly index d88ebc1094..9fb615cc2d 100644 --- a/core/src/main/resources/hudson/model/Job/buildTimeTrend.jelly +++ b/core/src/main/resources/hudson/model/Job/buildTimeTrend.jelly @@ -47,7 +47,8 @@ THE SOFTWARE. var e = data[x]; var tr = new Element('tr'); tr.insert(new Element('td', {data: e.iconColorOrdinal}). - insert(new Element('img', {width: 16, height: 16, src: '${imagesURL}/16x16/' + e.buildStatusUrl, alt: e.iconColorDescription}))); + insert(new Element('a', {href: e.number + '/console'}). + insert(new Element('img', {width: 16, height: 16, src: '${imagesURL}/16x16/' + e.buildStatusUrl, alt: e.iconColorDescription})))); tr.insert(new Element('td', {data: e.number}). insert(new Element('a', {href: e.number + '/', 'class': 'model-link inside'}). update(e.displayName.escapeHTML()))); 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 6933e0887e..96b5aaeacd 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-2016, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributors +# Copyright (c) 2004-2019, 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,8 +19,9 @@ # 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\ Time\ Trend=Trend czasu trwania zada\u0144 +Build\ Time\ Trend=Trend czasu zada\u0144 Build=Zadanie Duration=Czas trwania Timeline=Linia czasu +title=Trend czasu zadania {0} + 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 e52af56367..c975d9eb91 100644 --- a/core/src/main/resources/hudson/model/Job/buildTimeTrend_ru.properties +++ b/core/src/main/resources/hudson/model/Job/buildTimeTrend_ru.properties @@ -25,4 +25,4 @@ 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 Duration=\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c 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 +title={0} \u0413\u0440\u0430\u0444\u0438\u043a \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0441\u0431\u043e\u0440\u043a\u0438 diff --git a/core/src/main/resources/hudson/model/Job/index_ja.properties b/core/src/main/resources/hudson/model/Job/index_ja.properties index 4cf10f00b9..de3ae9fbd7 100644 --- a/core/src/main/resources/hudson/model/Job/index_ja.properties +++ b/core/src/main/resources/hudson/model/Job/index_ja.properties @@ -21,4 +21,4 @@ # THE SOFTWARE. Project\ name=\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u540d -Full\ project\ name=\u7d76\u5bfe\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u540d \ No newline at end of file +Full\ project\ name=\u7d76\u5bfe\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u540d 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 ef43b96950..5dff2694c9 100644 --- a/core/src/main/resources/hudson/model/Job/index_ru.properties +++ b/core/src/main/resources/hudson/model/Job/index_ru.properties @@ -21,4 +21,4 @@ # THE SOFTWARE. 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 +Project\ name=\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 diff --git a/core/src/main/resources/hudson/model/Job/rssHeader.jelly b/core/src/main/resources/hudson/model/Job/rssHeader.jelly index 18e20db56f..2558f9b87d 100644 --- a/core/src/main/resources/hudson/model/Job/rssHeader.jelly +++ b/core/src/main/resources/hudson/model/Job/rssHeader.jelly @@ -24,8 +24,8 @@ THE SOFTWARE. - + - + - \ No newline at end of file + diff --git a/core/src/main/resources/hudson/model/Label/sidepanel_ja.properties b/core/src/main/resources/hudson/model/Label/sidepanel_ja.properties index c1483cf11a..67827954ce 100644 --- a/core/src/main/resources/hudson/model/Label/sidepanel_ja.properties +++ b/core/src/main/resources/hudson/model/Label/sidepanel_ja.properties @@ -23,4 +23,4 @@ Back\ to\ Dashboard=\u30c0\u30c3\u30b7\u30e5\u30dc\u30fc\u30c9\u3078\u623b\u308b Overview=\u6982\u8981 Load\ Statistics=\u8ca0\u8377\u7d71\u8a08 -Configure=\u8a2d\u5b9a \ No newline at end of file +Configure=\u8a2d\u5b9a diff --git a/core/src/main/resources/hudson/model/Messages.properties b/core/src/main/resources/hudson/model/Messages.properties index ece9c435ed..690479c6ad 100644 --- a/core/src/main/resources/hudson/model/Messages.properties +++ b/core/src/main/resources/hudson/model/Messages.properties @@ -163,6 +163,9 @@ 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 \ (within the scope granted by the underlying OS.) +Jenkins.Manage.Description=\ + This permission grants the ability to configure parts of the overall system configuration \ + that are not expected to have an impact on the overall stability and security of the system. Hudson.ReadPermission.Description=\ The read permission is necessary for viewing almost all pages of Jenkins. \ This permission is useful when you don\u2019t want unauthenticated users to see \ @@ -206,6 +209,8 @@ Queue.WaitingForNextAvailableExecutorOn=Waiting for next available executor on \ 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 +Queue.ExceptionCanTake=Exception evaluating if the node can take the task +Queue.ExceptionCanRun=Exception evaluating if the queue can run the task ResultTrend.Aborted=Aborted ResultTrend.Failure=Failure @@ -394,3 +399,6 @@ 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. + +TimeZoneProperty.DisplayName=User Defined Time Zone +TimeZoneProperty.DisplayDefaultTimeZone=Default \ No newline at end of file diff --git a/core/src/main/resources/hudson/model/Messages_ar.properties b/core/src/main/resources/hudson/model/Messages_ar.properties index 6ff7b6edcf..6d27ef301b 100644 --- a/core/src/main/resources/hudson/model/Messages_ar.properties +++ b/core/src/main/resources/hudson/model/Messages_ar.properties @@ -1 +1 @@ -FreeStyleProject.Description=\u0647\u0630\u0647 \u0647\u064A \u0627\u0644\u0645\u064A\u0632\u0629 \u0627\u0644\u0631\u0626\u064A\u0633\u064A\u0629 \u0641\u064A \u062C\u0646\u0643\u0646\u0632. \u062C\u0646\u0643\u0646\u0632 \u0633\u064A\u0628\u0646\u064A \u0644\u0643 \u0645\u0634\u0631\u0648\u0639\u0643\u060C \u064A\u0633\u062A\u062E\u062F\u0645 \u0623\u062F\u0648\u0627\u062A \u0645\u0631\u0627\u0642\u0628\u0629 \u0627\u0644\u0645\u0635\u062F\u0631 \u0627\u0644\u0628\u0631\u0645\u062C\u064A\u060C \u0648\u064A\u0645\u0643\u0646 \u062D\u062A\u0649 \u0627\u0633\u062A\u062E\u062F\u0627\u0645\u0647\u0627 \uFEF7\u0634\u064A\u0627\u0621 \u063A\u064A\u0631 \u0628\u0646\u0627\u0621 \u0627\u0644\u0645\u0634\u0631\u0648\u0639. \ No newline at end of file +FreeStyleProject.Description=\u0647\u0630\u0647 \u0647\u064A \u0627\u0644\u0645\u064A\u0632\u0629 \u0627\u0644\u0631\u0626\u064A\u0633\u064A\u0629 \u0641\u064A \u062C\u0646\u0643\u0646\u0632. \u062C\u0646\u0643\u0646\u0632 \u0633\u064A\u0628\u0646\u064A \u0644\u0643 \u0645\u0634\u0631\u0648\u0639\u0643\u060C \u064A\u0633\u062A\u062E\u062F\u0645 \u0623\u062F\u0648\u0627\u062A \u0645\u0631\u0627\u0642\u0628\u0629 \u0627\u0644\u0645\u0635\u062F\u0631 \u0627\u0644\u0628\u0631\u0645\u062C\u064A\u060C \u0648\u064A\u0645\u0643\u0646 \u062D\u062A\u0649 \u0627\u0633\u062A\u062E\u062F\u0627\u0645\u0647\u0627 \uFEF7\u0634\u064A\u0627\u0621 \u063A\u064A\u0631 \u0628\u0646\u0627\u0621 \u0627\u0644\u0645\u0634\u0631\u0648\u0639. diff --git a/core/src/main/resources/hudson/model/Messages_bg.properties b/core/src/main/resources/hudson/model/Messages_bg.properties index d6bb585efd..dc32dc706e 100644 --- a/core/src/main/resources/hudson/model/Messages_bg.properties +++ b/core/src/main/resources/hudson/model/Messages_bg.properties @@ -104,7 +104,7 @@ AbstractProject.LabelLink=\ {3,choice,0#0 \u043c\u0430\u0448\u0438\u043d\u0438|1#1 \u043c\u0430\u0448\u0438\u043d\u0430|1<{3} \u043c\u0430\u0448\u0438\u043d\u0438}{4,choice,0#|1# \u0438 1 \u043e\u0431\u043b\u0430\u043a|1< \u0438 {4} \u043e\u0431\u043b\u0430\u043a\u0430} Api.MultipleMatch=\ - \u0418\u0437\u0440\u0430\u0437\u044a\u0442 \u0447\u0440\u0435\u0437 XPath \u201e{0}\u201c \u043e\u0442\u0433\u043e\u0432\u0430\u0440\u044f \u043d\u0430 {1} \u043c\u0430\u0448\u0438\u043d\u0438. \u0417\u0430\u0434\u0430\u0439\u0442\u0435 \u0438\u0437\u0440\u0430\u0437, \u043a\u043e\u0439\u0442\u043e \u0434\u0430 + \u0418\u0437\u0440\u0430\u0437\u044a\u0442 \u0447\u0440\u0435\u0437 XPath \u201e{0}\u201c \u043e\u0442\u0433\u043e\u0432\u0430\u0440\u044f \u043d\u0430 {1} \u043c\u0430\u0448\u0438\u043d\u0438. \u0417\u0430\u0434\u0430\u0439\u0442\u0435 \u0438\u0437\u0440\u0430\u0437, \u043a\u043e\u0439\u0442\u043e \u0434\u0430 \ \u043d\u0430\u043f\u0430\u0441\u0432\u0430 \u0441\u0430\u043c\u043e \u0435\u0434\u043d\u0430 \u043c\u0430\u0448\u0438\u043d\u0430 \u0438\u043b\u0438 \u0438\u0437\u043f\u043e\u043b\u0437\u0432\u0430\u0439\u0442\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u044a\u0440\u0430 \u201ewrapper\u201c, \u0437\u0430 \u0434\u0430 \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u0435\ \u0432\u0441\u0438\u0447\u043a\u0438 \u0442\u0435\u0437\u0438 \u043c\u0430\u0448\u0438\u043d\u0438 \u0432 \u043e\u0431\u0449 \u0435\u043b\u0435\u043c\u0435\u043d\u0442. Api.NoXPathMatch=\ diff --git a/core/src/main/resources/hudson/model/Messages_cs.properties b/core/src/main/resources/hudson/model/Messages_cs.properties index 11de8e6c7a..0473be9a4d 100644 --- a/core/src/main/resources/hudson/model/Messages_cs.properties +++ b/core/src/main/resources/hudson/model/Messages_cs.properties @@ -1,3 +1,3 @@ ManageJenkinsAction.DisplayName=Administrace -FreeStyleProject.Description=Toto je hlavn\u00ED funkce Jenkins. Jenkins sestav\u00ED v\u00E1\u0161 projekt, spoj\u00ED jak\u00FDkoli syst\u00E9m pro spr\u00E1vu verz\u00ED se syst\u00E9mem pro sestaven\u00ED. Nemus\u00ED b\u00FDt pou\u017Eit jen pro sestaven\u00ED softwaru. \ No newline at end of file +FreeStyleProject.Description=Toto je hlavn\u00ED funkce Jenkins. Jenkins sestav\u00ED v\u00E1\u0161 projekt, spoj\u00ED jak\u00FDkoli syst\u00E9m pro spr\u00E1vu verz\u00ED se syst\u00E9mem pro sestaven\u00ED. Nemus\u00ED b\u00FDt pou\u017Eit jen pro sestaven\u00ED softwaru. diff --git a/core/src/main/resources/hudson/model/Messages_da.properties b/core/src/main/resources/hudson/model/Messages_da.properties index 4140fe9722..a4de3e95a1 100644 --- a/core/src/main/resources/hudson/model/Messages_da.properties +++ b/core/src/main/resources/hudson/model/Messages_da.properties @@ -217,4 +217,4 @@ MultiStageTimeSeries.EMPTY_STRING= ManageJenkinsAction.DisplayName=Bestyr Jenkins ParametersDefinitionProperty.DisplayName=Dette byg er parameteriseret AbstractItem.NewNameInUse=Navnet {0} er allerede i brug -Job.NoRenameWhileBuilding=Kan ikke omd\u00f8be et job imens det bygger \ No newline at end of file +Job.NoRenameWhileBuilding=Kan ikke omd\u00f8be et job imens det bygger diff --git a/core/src/main/resources/hudson/model/Messages_es.properties b/core/src/main/resources/hudson/model/Messages_es.properties index b61a753a64..91f9d7e1ed 100644 --- a/core/src/main/resources/hudson/model/Messages_es.properties +++ b/core/src/main/resources/hudson/model/Messages_es.properties @@ -120,7 +120,7 @@ Job.NOfMFailed={0} de las {1} \u00faltimas ejecuciones fallaron. Job.NoRecentBuildFailed=No hay ejecuciones recientes con fallos. Job.Pronoun=Proyecto Job.minutes=Min -Job.NoRenameWhileBuilding=No es posible renombrar un proyecto mientras se está ejecutando. +Job.NoRenameWhileBuilding=No es posible renombrar un proyecto mientras se est\u00E1 ejecutando. Label.GroupOf=grupo de {0} Label.InvalidLabel=etiqueta inv\u00e1lida @@ -135,6 +135,8 @@ Queue.Unknown=? Queue.WaitingForNextAvailableExecutor=Esperando por un ejecutor Queue.WaitingForNextAvailableExecutorOn=Esperando por un ejecutor en {0} Queue.init=Restaurando la cola de tareas +Queue.ExceptionCanTake=Excepci\u00f3n evaluando si el nodo puede coger la tarea +Queue.ExceptionCanRun=Excepci\u00f3n evaluando si la cola puede ejecutar la tarea Run.BuildAborted=La ejecuci\u00f3n fu\u00e9 cancelada Run.MarkedExplicitly=marcado para mantener el registro @@ -268,35 +270,35 @@ Run.ArtifactsPermission.Description=\ Este permiso sirve para poder utilizar los artefactos producidos en los proyectos. AbstractProject.AssignedLabelString.InvalidBooleanExpression=Expresi\u00f3n booleana incorrecta: {0} ManageJenkinsAction.DisplayName=Administrar Jenkins -Computer.NoSuchSlaveExists=El nodo {0} no existe. ¿Quizás se esté refiriendo a {1}? -ResultTrend.StillFailing=Todavía falla -Computer.DisconnectPermission.Description=Este permiso permite que los usuarios puedan desconectar nodos o marcarlos como fuera de línea. +Computer.NoSuchSlaveExists=El nodo {0} no existe. \u00BFQuiz\u00E1s se est\u00E1 refiriendo a {1}? +ResultTrend.StillFailing=Todav\u00EDa falla +Computer.DisconnectPermission.Description=Este permiso permite que los usuarios puedan desconectar nodos o marcarlos como fuera de l\u00EDnea. Computer.CreatePermission.Description=Este permiso permite que los usuarios puedan crear nuevos nodos. -ResultTrend.StillUnstable=Todavía inestable +ResultTrend.StillUnstable=Todav\u00EDa inestable View.ReadPermission.Description=Este permiso permite que los usuarion puedan crear vistas (implica acceso de lectura) Hudson.RunScriptsPermission.Description=El permiso "run scripts' es necesario para ejecutar scripts de groovy usando la consola groovy o el "cli" de groovy. ResultTrend.Fixed=Arreglado ResultTrend.Failure=Fallo UpdateCenter.PluginCategory.listview-column=Columnas de la lista ResultTrend.Aborted=Cancelado -TextParameterDefinition.DisplayName=Parámetro de texto -AbstractProject.AssignedLabelString_NoMatch_DidYouMean=No hay ningún nodo que cumpla esta asignación. ¿Quizás se refiera a ''{1}'' en lugar de ''{0}''? +TextParameterDefinition.DisplayName=Par\u00E1metro de texto +AbstractProject.AssignedLabelString_NoMatch_DidYouMean=No hay ning\u00FAn nodo que cumpla esta asignaci\u00F3n. \u00BFQuiz\u00E1s se refiera a ''{1}'' en lugar de ''{0}''? ResultTrend.Success=Correcto AbstractProject.CancelPermission.Description=Este permiso permite que se pueda cancelar un trabajo. Run.Summary.NotBuilt=no se ha ejecutado AbstractProject.DiscoverPermission.Description=Este permiso garantiza que se pueda descubrir tareas. \ - Siendo de menos valor que el permiso de lectura, permite que puedas redireccionar a usuarios anónimos a la página de login. \ - Sin este permiso, los usuarios anónimos recibirán un error 404, no siendo capaces de descubrir esas tareas. -Jenkins.CheckDisplayName.NameNotUniqueWarning=El nombre "{0}" ya se usa para el numbre de una tarea, lo que puede producir confusión en los resultados de búsquedas. + Siendo de menos valor que el permiso de lectura, permite que puedas redireccionar a usuarios an\u00EDnimos a la p\u00E1gina de login. \ + Sin este permiso, los usuarios an\u00F3nimos recibir\u00E1n un error 404, no siendo capaces de descubrir esas tareas. +Jenkins.CheckDisplayName.NameNotUniqueWarning=El nombre "{0}" ya se usa para el numbre de una tarea, lo que puede producir confusi\u00F3n en los resultados de b\u00FAsquedas. ResultTrend.NotBuilt=Sin ejecutar ResultTrend.NowUnstable=Ahora es inestable AbstractBuild.BuildingInWorkspace=en el espacio de trabajo {0} Descriptor.From=(desde {0}) ResultTrend.Unstable=Inestable -Jenkins.CheckDisplayName.DisplayNameNotUniqueWarning=El nombre "{0}" ya se está usando en otro trabajo, pudiendo producir confusión. +Jenkins.CheckDisplayName.DisplayNameNotUniqueWarning=El nombre "{0}" ya se est\u00E1 usando en otro trabajo, pudiendo producir confusi\u00F3n. AbstractProject.WipeOutPermission.Description=Este permiso permite que se pueda borrar todo el contenido del espacio de trabajo de una tarea. -UpdateCenter.DownloadButNotActivated=Descarga correcta. Se activará en el próximo arranque. +UpdateCenter.DownloadButNotActivated=Descarga correcta. Se activar\u00E1 en el pr\u00F3ximo arranque. Computer.ConnectPermission.Description=Este permiso permite que los usuarios puedan conectar nodos o marcarlos como activos. BallColor.NotBuilt=Sin ejecutar. AbstractBuild_Building=Ejecutando. -ParametersDefinitionProperty.DisplayName=Esta ejecución debe parametrizarse +ParametersDefinitionProperty.DisplayName=Esta ejecuci\u00F3n debe parametrizarse diff --git a/core/src/main/resources/hudson/model/Messages_et.properties b/core/src/main/resources/hudson/model/Messages_et.properties index ff3d7fc8bd..d3aa3c2fe4 100644 --- a/core/src/main/resources/hudson/model/Messages_et.properties +++ b/core/src/main/resources/hudson/model/Messages_et.properties @@ -1 +1 @@ -FreeStyleProject.Description=See on Jenkinsi p\u00F5hifunktsioon! Jenkins ehitab su projekti, kombineerides sinu versioonihalduse mistahes ehitusprotsessiga. Sa v\u00F5id seda kasutada ka muudeks asjadeks kui tarkvara ehitamine. \ No newline at end of file +FreeStyleProject.Description=See on Jenkinsi p\u00F5hifunktsioon! Jenkins ehitab su projekti, kombineerides sinu versioonihalduse mistahes ehitusprotsessiga. Sa v\u00F5id seda kasutada ka muudeks asjadeks kui tarkvara ehitamine. diff --git a/core/src/main/resources/hudson/model/Messages_fi.properties b/core/src/main/resources/hudson/model/Messages_fi.properties index cc62c20834..e72139179a 100644 --- a/core/src/main/resources/hudson/model/Messages_fi.properties +++ b/core/src/main/resources/hudson/model/Messages_fi.properties @@ -1,3 +1,3 @@ ManageJenkinsAction.DisplayName=Hallitse Jenkinsia -FreeStyleProject.Description=T\u00E4m\u00E4 on Jenkins t\u00E4rkein ominaisuus. Jenkins rakentaa projektisi k\u00E4ytt\u00E4en versionhallintaa ja buildij\u00E4rjestelmi\u00E4. Voit k\u00E4ytt\u00E4\u00E4 t\u00E4t\u00E4 my\u00F6s muuhun kuin ohjelmien k\u00E4\u00E4nt\u00E4miseen. \ No newline at end of file +FreeStyleProject.Description=T\u00E4m\u00E4 on Jenkins t\u00E4rkein ominaisuus. Jenkins rakentaa projektisi k\u00E4ytt\u00E4en versionhallintaa ja buildij\u00E4rjestelmi\u00E4. Voit k\u00E4ytt\u00E4\u00E4 t\u00E4t\u00E4 my\u00F6s muuhun kuin ohjelmien k\u00E4\u00E4nt\u00E4miseen. diff --git a/core/src/main/resources/hudson/model/Messages_fr.properties b/core/src/main/resources/hudson/model/Messages_fr.properties index 7b65394ff0..17f92336f4 100644 --- a/core/src/main/resources/hudson/model/Messages_fr.properties +++ b/core/src/main/resources/hudson/model/Messages_fr.properties @@ -101,7 +101,7 @@ Job.NoRecentBuildFailed=Aucun build r\u00e9cent n''a \u00e9chou\u00e9. Job.Pronoun=job Job.minutes=mn -Queue.AllNodesOffline=Tous les esclaves avec le libell\u00e9 ''{0}'' sont hors ligne +Queue.AllNodesOffline=Tous les noeuds avec le libell\u00e9 ''{0}'' sont hors ligne Queue.BlockedBy=Bloqu\u00e9 par {0} Queue.HudsonIsAboutToShutDown=Jenkins est sur le point de se fermer Queue.InProgress=Un build est d\u00e9j\u00e0 en cours @@ -157,7 +157,7 @@ ChoiceParameterDefinition.MissingChoices=Choix requis. RunParameterDefinition.DisplayName=Param\u00e8tre d''ex\u00e9cution PasswordParameterDefinition.DisplayName=Param\u00e8tre "Mot de passe" -Node.Mode.NORMAL=Utiliser cet esclave autant que possible +Node.Mode.NORMAL=Utiliser ce noeud autant que possible Node.Mode.EXCLUSIVE=R\u00e9server cette machine pour les jobs qui lui sont attach\u00e9s seulement ListView.DisplayName=Vue liste @@ -178,5 +178,5 @@ MyViewsProperty.DisplayName=Mes vues MyViewsProperty.GlobalAction.DisplayName=Mes vues ManageJenkinsAction.DisplayName=Administrer Jenkins -ParametersDefinitionProperty.DisplayName=Ce build a des paramètres +ParametersDefinitionProperty.DisplayName=Ce build a des param\u00e8tres diff --git a/core/src/main/resources/hudson/model/Messages_ja.properties b/core/src/main/resources/hudson/model/Messages_ja.properties index 5bb5a55d67..d26b03892d 100644 --- a/core/src/main/resources/hudson/model/Messages_ja.properties +++ b/core/src/main/resources/hudson/model/Messages_ja.properties @@ -58,8 +58,8 @@ AbstractProject.WipeOutPermission.Description=\ AbstractProject.CancelPermission.Description=\ \u30d3\u30eb\u30c9\u306e\u30ad\u30e3\u30f3\u30bb\u30eb\u3092\u8a31\u53ef\u3057\u307e\u3059\u3002 AbstractProject.AssignedLabelString.InvalidBooleanExpression=\ - \u30e9\u30d9\u30eb\u5f0f\u306b\u9593\u9055\u3044\u304c\u3042\u308a\u307e\u3059\u3002: {0} - \u8a72\u5f53\u3059\u308b\u30b9\u30ec\u30fc\u30d6\u3082\u3057\u304f\u306f\u30af\u30e9\u30a6\u30c9\u306f\u3042\u308a\u307e\u305b\u3093\u3002 + \u30e9\u30d9\u30eb\u5f0f\u306b\u9593\u9055\u3044\u304c\u3042\u308a\u307e\u3059\u3002: {0} \ + \u8a72\u5f53\u3059\u308b\u30b9\u30ec\u30fc\u30d6\u3082\u3057\u304f\u306f\u30af\u30e9\u30a6\u30c9\u306f\u3042\u308a\u307e\u305b\u3093\u3002 \ AbstractProject.CustomWorkspaceEmpty=\u30ab\u30b9\u30bf\u30e0\u30ef\u30fc\u30af\u30b9\u30da\u30fc\u30b9\u304c\u5165\u529b\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002 Api.MultipleMatch=XPath "{0}" \u306f {1} \u500b\u306e\u30ce\u30fc\u30c9\u3068\u4e00\u81f4\u3057\u307e\u3057\u305f\u3002 \ diff --git a/core/src/main/resources/hudson/model/Messages_ko.properties b/core/src/main/resources/hudson/model/Messages_ko.properties index 02b6a1d0ae..e1f9500488 100644 --- a/core/src/main/resources/hudson/model/Messages_ko.properties +++ b/core/src/main/resources/hudson/model/Messages_ko.properties @@ -1,4 +1,4 @@ ManageJenkinsAction.DisplayName=Jenkins \uAD00\uB9AC ParametersDefinitionProperty.DisplayName=\uC774 \uBE4C\uB4DC\uB294 \uB9E4\uAC1C\uBCC0\uC218\uAC00 \uC788\uC2B5\uB2C8\uB2E4 -FreeStyleProject.Description=\uC774\uAC83\uC740 Jenkins\uC758 \uC8FC\uC694 \uAE30\uB2A5\uC785\uB2C8\uB2E4. Jenkins\uC740 \uC5B4\uB290 \uBE4C\uB4DC \uC2DC\uC2A4\uD15C\uACFC \uC5B4\uB5A4 SCM(\uD615\uC0C1\uAD00\uB9AC)\uC73C\uB85C \uBB36\uC778 \uB2F9\uC2E0\uC758 \uD504\uB85C\uC81D\uD2B8\uB97C \uBE4C\uB4DC\uD560 \uAC83\uC774\uACE0, \uC18C\uD504\uD2B8\uC6E8\uC5B4 \uBE4C\uB4DC\uBCF4\uB2E4 \uB2E4\uB978 \uC5B4\uB5A4 \uAC83\uC5D0 \uC790\uC8FC \uC0AC\uC6A9\uB420 \uC218 \uC788\uC2B5\uB2C8\uB2E4. \ No newline at end of file +FreeStyleProject.Description=\uC774\uAC83\uC740 Jenkins\uC758 \uC8FC\uC694 \uAE30\uB2A5\uC785\uB2C8\uB2E4. Jenkins\uC740 \uC5B4\uB290 \uBE4C\uB4DC \uC2DC\uC2A4\uD15C\uACFC \uC5B4\uB5A4 SCM(\uD615\uC0C1\uAD00\uB9AC)\uC73C\uB85C \uBB36\uC778 \uB2F9\uC2E0\uC758 \uD504\uB85C\uC81D\uD2B8\uB97C \uBE4C\uB4DC\uD560 \uAC83\uC774\uACE0, \uC18C\uD504\uD2B8\uC6E8\uC5B4 \uBE4C\uB4DC\uBCF4\uB2E4 \uB2E4\uB978 \uC5B4\uB5A4 \uAC83\uC5D0 \uC790\uC8FC \uC0AC\uC6A9\uB420 \uC218 \uC788\uC2B5\uB2C8\uB2E4. diff --git a/core/src/main/resources/hudson/model/Messages_pl.properties b/core/src/main/resources/hudson/model/Messages_pl.properties index 988d71ab09..84936f2f08 100644 --- a/core/src/main/resources/hudson/model/Messages_pl.properties +++ b/core/src/main/resources/hudson/model/Messages_pl.properties @@ -65,7 +65,7 @@ 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 +UpdateCenter.Status.Success=Zako\u0144czono 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. @@ -80,3 +80,11 @@ Hudson.ViewName=Wszystkie RunParameterDefinition.DisplayName=Parametr uruchomienia# SCM check out aborted Hudson.JobAlreadyExists=Projekt o nazwie \u2018{0}\u2019 ju\u017C istnieje AbstractProject.CustomWorkspaceEmpty=Nie wprowadzono dedykowanego katalogu projektu. +AbstractItem.NewNameUnchanged=Nowa nazwa jest taka sama, jak aktualna. +Hudson.NoName=Nazwa nie zosta\u0142a podana +Node.LabelMissing=\u2018{0}\u2019 nie ma etykiety \u2018{1}\u2019 +Job.minutes=minuty +Cause.UserCause.ShortDescription=Uruchomiono przez u\u017Cytkownika {0} +Cause.UserIdCause.ShortDescription=Uruchomiono przez u\u017Cytkownika {0} +Descriptor.From=(na podstawie {0}) + diff --git a/core/src/main/resources/hudson/model/Messages_tr.properties b/core/src/main/resources/hudson/model/Messages_tr.properties index ee48426b3b..ac5fceeddf 100644 --- a/core/src/main/resources/hudson/model/Messages_tr.properties +++ b/core/src/main/resources/hudson/model/Messages_tr.properties @@ -51,7 +51,7 @@ Executor.NotAvailable=Mevcut De\u011fil FreeStyleProject.DisplayName=Serbest-stil yaz\u0131l\u0131m projesi yap\u0131land\u0131r FreeStyleProject.Description=\ - Jenkins''\u0131n merkezi \u00f6zelli\u011fi, projelerinizi yap\u0131land\u0131rman\u0131za yard\u0131m etmesidir. Bu proje t\u00fcr\u00fcn\u00fc kullanarak, \ + Jenkins''in merkezi \u00f6zelli\u011fi, projelerinizi yap\u0131land\u0131rman\u0131za yard\u0131m etmesidir. Bu proje t\u00fcr\u00fcn\u00fc kullanarak, \ herhangi bir yap\u0131land\u0131rma sistemini herhangi bir Kaynak Kodu Y\u00f6netimi arac\u0131 ile birle\u015ftirebilirsiniz,\ ve hatta yaz\u0131l\u0131m yap\u0131land\u0131rman\u0131n d\u0131\u015f\u0131nda ba\u015fka t\u00fcr projeler i\u00e7in dahi kullanabilirsiniz. @@ -97,5 +97,5 @@ Permalink.LastBuild=Son yap\u0131land\u0131rma Permalink.LastStableBuild=Son stabil yap\u0131land\u0131rma Permalink.LastSuccessfulBuild=Son ba\u015far\u0131l\u0131 yap\u0131land\u0131rma Permalink.LastFailedBuild=Son ba\u015far\u0131s\u0131z yap\u0131land\u0131rma -ManageJenkinsAction.DisplayName=Jenkins''\u0131 Y\u00f6net +ManageJenkinsAction.DisplayName=Jenkins''i Y\u00f6net ParametersDefinitionProperty.DisplayName=Bu yap\u0131land\u0131rma parametrele\u015ftirilmi\u015ftir. diff --git a/core/src/main/resources/hudson/model/Messages_uk.properties b/core/src/main/resources/hudson/model/Messages_uk.properties index 59c4b0bc96..812ebc5406 100644 --- a/core/src/main/resources/hudson/model/Messages_uk.properties +++ b/core/src/main/resources/hudson/model/Messages_uk.properties @@ -1,3 +1,3 @@ ParametersDefinitionProperty.DisplayName=\u0426\u044F \u0431\u0443\u0434\u043E\u0432\u0430 \u043C\u0430\u0454 \u043F\u0430\u0440\u0430\u043C\u0435\u0442\u0440\u0438 -FreeStyleProject.Description=\u0426\u0435 - \u043E\u0441\u043D\u043E\u0432\u043D\u0430 \u0432\u0456\u0434\u043C\u0456\u043D\u043D\u0456\u0441\u0442\u044C Jenkins. Jenkins \u043F\u043E\u0431\u0443\u0434\u0443\u0454 \u0432\u0430\u0448 \u043F\u0440\u043E\u0435\u043A\u0442, \u043A\u043E\u043C\u0431\u0456\u043D\u0443\u044E\u0447\u0438 \u0431\u0443\u0434\u044C-\u044F\u043A\u0456 \u0441\u0438\u0441\u0442\u0435\u043C\u0438 \u0443\u043F\u0440\u0430\u0432\u043B\u0456\u043D\u043D\u044F \u043A\u043E\u0434\u043E\u043C \u0437 \u0431\u0443\u0434\u044C-\u044F\u043A\u0438\u043C\u0438 \u0441\u0438\u0441\u0442\u0435\u043C\u0430\u043C\u0438 \u0437\u0431\u0456\u0440\u043A\u0438, \u0449\u043E \u043C\u043E\u0436\u0435 \u0431\u0443\u0442\u0438 \u0432\u0438\u043A\u043E\u0440\u0438\u0441\u0442\u0430\u043D\u043E \u043D\u0430\u0432\u0456\u0442\u044C \u0434\u043B\u044F \u0446\u0456\u043B\u0435\u0439 \u0432\u0456\u0434\u043C\u0456\u043D\u043D\u0438\u0445 \u0432\u0456\u0434 \u0437\u0431\u0456\u0440\u043A\u0438 \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u043D\u043E\u0433\u043E \u0437\u0430\u0431\u0435\u0437\u043F\u0435\u0447\u0435\u043D\u043D\u044F. \ No newline at end of file +FreeStyleProject.Description=\u0426\u0435 - \u043E\u0441\u043D\u043E\u0432\u043D\u0430 \u0432\u0456\u0434\u043C\u0456\u043D\u043D\u0456\u0441\u0442\u044C Jenkins. Jenkins \u043F\u043E\u0431\u0443\u0434\u0443\u0454 \u0432\u0430\u0448 \u043F\u0440\u043E\u0435\u043A\u0442, \u043A\u043E\u043C\u0431\u0456\u043D\u0443\u044E\u0447\u0438 \u0431\u0443\u0434\u044C-\u044F\u043A\u0456 \u0441\u0438\u0441\u0442\u0435\u043C\u0438 \u0443\u043F\u0440\u0430\u0432\u043B\u0456\u043D\u043D\u044F \u043A\u043E\u0434\u043E\u043C \u0437 \u0431\u0443\u0434\u044C-\u044F\u043A\u0438\u043C\u0438 \u0441\u0438\u0441\u0442\u0435\u043C\u0430\u043C\u0438 \u0437\u0431\u0456\u0440\u043A\u0438, \u0449\u043E \u043C\u043E\u0436\u0435 \u0431\u0443\u0442\u0438 \u0432\u0438\u043A\u043E\u0440\u0438\u0441\u0442\u0430\u043D\u043E \u043D\u0430\u0432\u0456\u0442\u044C \u0434\u043B\u044F \u0446\u0456\u043B\u0435\u0439 \u0432\u0456\u0434\u043C\u0456\u043D\u043D\u0438\u0445 \u0432\u0456\u0434 \u0437\u0431\u0456\u0440\u043A\u0438 \u043F\u0440\u043E\u0433\u0440\u0430\u043C\u043D\u043E\u0433\u043E \u0437\u0430\u0431\u0435\u0437\u043F\u0435\u0447\u0435\u043D\u043D\u044F. 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 dbf2b55745..a2ef8a6b54 100644 --- a/core/src/main/resources/hudson/model/Messages_zh_TW.properties +++ b/core/src/main/resources/hudson/model/Messages_zh_TW.properties @@ -60,7 +60,7 @@ AbstractProject.WipeOutPermission.Description=\ AbstractProject.CancelPermission.Description=\ \u6388\u8207\u53d6\u6d88\u5efa\u7f6e\u7684\u80fd\u529b\u3002 AbstractProject.AssignedLabelString.InvalidBooleanExpression=\ - \u7121\u6548\u7684\u5e03\u6797\u8868\u793a\u5f0f: {0} + \u7121\u6548\u7684\u5e03\u6797\u8868\u793a\u5f0f: {0} \ \u6c92\u6709\u7b26\u5408\u7684\u7bc0\u9ede AbstractProject.CustomWorkspaceEmpty=\u81ea\u8a02\u5de5\u4f5c\u5340\u662f\u7a7a\u7684\u3002 diff --git a/core/src/main/resources/hudson/model/MyView/newViewDetail_ja.properties b/core/src/main/resources/hudson/model/MyView/newViewDetail_ja.properties index 956f0ca339..4ae3232d03 100644 --- a/core/src/main/resources/hudson/model/MyView/newViewDetail_ja.properties +++ b/core/src/main/resources/hudson/model/MyView/newViewDetail_ja.properties @@ -21,4 +21,4 @@ # THE SOFTWARE. blurb=\ - \u73FE\u5728\u306E\u30E6\u30FC\u30B6\u30FC\u304C\u30A2\u30AF\u30BB\u30B9\u53EF\u80FD\u306A\u30B8\u30E7\u30D6\u3092\u3059\u3079\u3066\u81EA\u52D5\u7684\u306B\u8868\u793A\u3059\u308B\u30D3\u30E5\u30FC\u3067\u3059\u3002 \ No newline at end of file + \u73FE\u5728\u306E\u30E6\u30FC\u30B6\u30FC\u304C\u30A2\u30AF\u30BB\u30B9\u53EF\u80FD\u306A\u30B8\u30E7\u30D6\u3092\u3059\u3079\u3066\u81EA\u52D5\u7684\u306B\u8868\u793A\u3059\u308B\u30D3\u30E5\u30FC\u3067\u3059\u3002 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 c1696ffbf7..592b032c04 100644 --- a/core/src/main/resources/hudson/model/MyViewsProperty/config_de.properties +++ b/core/src/main/resources/hudson/model/MyViewsProperty/config_de.properties @@ -21,4 +21,4 @@ # THE SOFTWARE. Default\ View=Standardansicht -description=Die Ansicht wird als Vorgabe ausgewählt, wenn der Anwender seine privaten Ansichten öffnet. \ No newline at end of file +description=Die Ansicht wird als Vorgabe ausgewählt, wenn der Anwender seine privaten Ansichten öffnet. diff --git a/core/src/main/resources/hudson/model/ParametersAction/index_ja.properties b/core/src/main/resources/hudson/model/ParametersAction/index_ja.properties index bb8ee6f261..1076650270 100644 --- a/core/src/main/resources/hudson/model/ParametersAction/index_ja.properties +++ b/core/src/main/resources/hudson/model/ParametersAction/index_ja.properties @@ -21,4 +21,4 @@ # THE SOFTWARE. Build=\u30D3\u30EB\u30C9 -Parameters=\u30D1\u30E9\u30E1\u30FC\u30BF \ No newline at end of file +Parameters=\u30D1\u30E9\u30E1\u30FC\u30BF diff --git a/core/src/main/resources/hudson/model/ParametersDefinitionProperty/index_ja.properties b/core/src/main/resources/hudson/model/ParametersDefinitionProperty/index_ja.properties index 25a047baf5..1608864599 100644 --- a/core/src/main/resources/hudson/model/ParametersDefinitionProperty/index_ja.properties +++ b/core/src/main/resources/hudson/model/ParametersDefinitionProperty/index_ja.properties @@ -22,4 +22,4 @@ description=\u3053\u306e\u30d3\u30eb\u30c9\u306f\u30d1\u30e9\u30e1\u30fc\u30bf\u304c\u5fc5\u8981\u3067\u3059\u3002 Build=\u30d3\u30eb\u30c9 -LOADING=\u30ed\u30fc\u30c9\u4e2d \ No newline at end of file +LOADING=\u30ed\u30fc\u30c9\u4e2d diff --git a/core/src/main/resources/hudson/model/PasswordParameterDefinition/config_ja.properties b/core/src/main/resources/hudson/model/PasswordParameterDefinition/config_ja.properties index c46ccab1f6..100892f388 100644 --- a/core/src/main/resources/hudson/model/PasswordParameterDefinition/config_ja.properties +++ b/core/src/main/resources/hudson/model/PasswordParameterDefinition/config_ja.properties @@ -22,4 +22,4 @@ Name=\u540D\u524D Default\ Value=\u30C7\u30D5\u30A9\u30EB\u30C8\u5024 -Description=\u8AAC\u660E \ No newline at end of file +Description=\u8AAC\u660E 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 8e833e78bf..109d6b36d0 100644 --- a/core/src/main/resources/hudson/model/ProxyView/newViewDetail_de.properties +++ b/core/src/main/resources/hudson/model/ProxyView/newViewDetail_de.properties @@ -21,4 +21,4 @@ # THE SOFTWARE. Shows\ the\ content\ of\ a\ global\ view.=\ - Zeigt den Inhalt einer globalen Ansicht. \ No newline at end of file + Zeigt den Inhalt einer globalen Ansicht. diff --git a/core/src/main/resources/hudson/model/Run/configure_ja.properties b/core/src/main/resources/hudson/model/Run/configure_ja.properties index 2ce335a25d..f48213f2f0 100644 --- a/core/src/main/resources/hudson/model/Run/configure_ja.properties +++ b/core/src/main/resources/hudson/model/Run/configure_ja.properties @@ -23,4 +23,4 @@ LOADING=\u30ed\u30fc\u30c9\u4e2d DisplayName=\u8868\u793a\u540d Description=\u8aac\u660e -Save=\u4fdd\u5b58 \ No newline at end of file +Save=\u4fdd\u5b58 diff --git a/core/src/main/resources/hudson/model/Run/console_tr.properties b/core/src/main/resources/hudson/model/Run/console_tr.properties index 79afa5fdab..9c03c22807 100644 --- a/core/src/main/resources/hudson/model/Run/console_tr.properties +++ b/core/src/main/resources/hudson/model/Run/console_tr.properties @@ -20,5 +20,5 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Console\ Output=Konsol\ Ç\u0131kt\u0131s\u0131 +Console\ Output=Konsol \u00C7\u0131kt\u0131s\u0131 skipSome={0,number,integer} KB atlan\u0131yor.. T\u00FCm Tutanak diff --git a/core/src/main/resources/hudson/model/Run/delete-retry_ja.properties b/core/src/main/resources/hudson/model/Run/delete-retry_ja.properties index 154d4927d0..f6a534eb64 100644 --- a/core/src/main/resources/hudson/model/Run/delete-retry_ja.properties +++ b/core/src/main/resources/hudson/model/Run/delete-retry_ja.properties @@ -22,4 +22,4 @@ Not\ successful=\u30d3\u30eb\u30c9\u306e\u524a\u9664\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3002 Retry\ delete=\u30ea\u30c8\u30e9\u30a4 -Show\ reason=\u539f\u56e0\u3092\u8868\u793a \ No newline at end of file +Show\ reason=\u539f\u56e0\u3092\u8868\u793a diff --git a/core/src/main/resources/hudson/model/Run/delete_ja.properties b/core/src/main/resources/hudson/model/Run/delete_ja.properties index 3db1723d47..3180a421dc 100644 --- a/core/src/main/resources/hudson/model/Run/delete_ja.properties +++ b/core/src/main/resources/hudson/model/Run/delete_ja.properties @@ -20,4 +20,4 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Delete\ this\ build=\u30D3\u30EB\u30C9\u3092\u524A\u9664 \ No newline at end of file +Delete\ this\ build=\u30D3\u30EB\u30C9\u3092\u524A\u9664 diff --git a/core/src/main/resources/hudson/model/Run/delete_pl.properties b/core/src/main/resources/hudson/model/Run/delete_pl.properties index 2ae6db4937..12c3de72bb 100644 --- a/core/src/main/resources/hudson/model/Run/delete_pl.properties +++ b/core/src/main/resources/hudson/model/Run/delete_pl.properties @@ -1,6 +1,6 @@ # The MIT License # -# Copyright (c) 2004-2010, Sun Microsystems, Inc. +# Copyright (c) 2004-2019, 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 @@ -21,3 +21,4 @@ # THE SOFTWARE. Delete\ this\ build=Usu\u0144 to zadanie +delete.build=Usu\u0144 zadanie \u2018{0}\u2019 diff --git a/core/src/main/resources/hudson/model/Run/logKeep.jelly b/core/src/main/resources/hudson/model/Run/logKeep.jelly index 19ccd4820f..ded35123d4 100644 --- a/core/src/main/resources/hudson/model/Run/logKeep.jelly +++ b/core/src/main/resources/hudson/model/Run/logKeep.jelly @@ -27,7 +27,7 @@ THE SOFTWARE. --> - +
      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 17cce8de95..b914b2cdf4 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-2016, Sun Microsystems, Inc, Damian Szczepanik +# Copyright (c) 2004-2019, 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,4 +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. -Keep\ this\ build\ forever=Zachowaj to zadanie +Keep\ this\ build\ forever=Zachowaj to zadanie na zawsze +Don't\ keep\ this\ build\ forever=Nie zachowuj tego zadania na zawsze diff --git a/core/src/main/resources/hudson/model/RunParameterDefinition/config_ja.properties b/core/src/main/resources/hudson/model/RunParameterDefinition/config_ja.properties index 10d25aa6bd..3cd6a5ff9d 100644 --- a/core/src/main/resources/hudson/model/RunParameterDefinition/config_ja.properties +++ b/core/src/main/resources/hudson/model/RunParameterDefinition/config_ja.properties @@ -27,4 +27,4 @@ Filter=\u30d5\u30a3\u30eb\u30bf\u30fc All\ Builds=\u5168\u30d3\u30eb\u30c9 Completed\ Builds\ Only=\u5b8c\u4e86\u30d3\u30eb\u30c9\u306e\u307f Successful\ Builds\ Only=\u6210\u529f\u30d3\u30eb\u30c9\u306e\u307f -Stable\ Builds\ Only=\u5b89\u5b9a\u30d3\u30eb\u30c9\u306e\u307f \ No newline at end of file +Stable\ Builds\ Only=\u5b89\u5b9a\u30d3\u30eb\u30c9\u306e\u307f diff --git a/core/src/main/resources/hudson/model/TextParameterDefinition/config_ja.properties b/core/src/main/resources/hudson/model/TextParameterDefinition/config_ja.properties index bdfa1edd0c..daf1fdf36a 100644 --- a/core/src/main/resources/hudson/model/TextParameterDefinition/config_ja.properties +++ b/core/src/main/resources/hudson/model/TextParameterDefinition/config_ja.properties @@ -22,4 +22,4 @@ Name=\u540d\u524d Default\ Value=\u30c7\u30d5\u30a9\u30eb\u30c8\u5024 -Description=\u8aac\u660e \ No newline at end of file +Description=\u8aac\u660e diff --git a/test-jdk8/pom.xml b/core/src/main/resources/hudson/model/TimeZoneProperty/config.jelly similarity index 62% rename from test-jdk8/pom.xml rename to core/src/main/resources/hudson/model/TimeZoneProperty/config.jelly index 70c4870837..2c3bde11f7 100644 --- a/test-jdk8/pom.xml +++ b/core/src/main/resources/hudson/model/TimeZoneProperty/config.jelly @@ -2,8 +2,6 @@ - - 4.0.0 - - org.jenkins-ci.main - jenkins-test-parent - ${revision}${changelist} - ../test-pom - - - jenkins-test-jdk8 - - JDK8-only tests for Jenkins core - JDK8-only Functional tests for Jenkins core - - + + + + + + diff --git a/core/src/main/resources/hudson/model/TimeZoneProperty/config.properties b/core/src/main/resources/hudson/model/TimeZoneProperty/config.properties new file mode 100644 index 0000000000..bb7f46fc42 --- /dev/null +++ b/core/src/main/resources/hudson/model/TimeZoneProperty/config.properties @@ -0,0 +1,21 @@ +# The MIT License +# +# 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. +title=Time Zone +description=Specify user defined time zone for displaying time rather than system default. diff --git a/core/src/main/resources/hudson/model/UpdateCenter/CompleteBatchJob/Failure/status.jelly b/core/src/main/resources/hudson/model/UpdateCenter/CompleteBatchJob/Failure/status.jelly new file mode 100644 index 0000000000..4c1e2ffeac --- /dev/null +++ b/core/src/main/resources/hudson/model/UpdateCenter/CompleteBatchJob/Failure/status.jelly @@ -0,0 +1,34 @@ + + + + +
      + ${%Failure} + - + ${%Details} +
      +
      ${it.problemStackTrace}
      +
      diff --git a/test/src/test/resources/hudson/model/DownloadServiceTest/testPost.jelly b/core/src/main/resources/hudson/model/UpdateCenter/CompleteBatchJob/Pending/status.jelly similarity index 78% rename from test/src/test/resources/hudson/model/DownloadServiceTest/testPost.jelly rename to core/src/main/resources/hudson/model/UpdateCenter/CompleteBatchJob/Pending/status.jelly index d8d9e15d7d..21e0f59484 100644 --- a/test/src/test/resources/hudson/model/DownloadServiceTest/testPost.jelly +++ b/core/src/main/resources/hudson/model/UpdateCenter/CompleteBatchJob/Pending/status.jelly @@ -1,7 +1,7 @@ - - - - - - - \ No newline at end of file + + ${%Pending} + diff --git a/core/src/main/resources/hudson/PluginManager/sites_da.properties b/core/src/main/resources/hudson/model/UpdateCenter/CompleteBatchJob/Pending/status_pl.properties similarity index 90% rename from core/src/main/resources/hudson/PluginManager/sites_da.properties rename to core/src/main/resources/hudson/model/UpdateCenter/CompleteBatchJob/Pending/status_pl.properties index 866155c8aa..736b5d2172 100644 --- a/core/src/main/resources/hudson/PluginManager/sites_da.properties +++ b/core/src/main/resources/hudson/model/UpdateCenter/CompleteBatchJob/Pending/status_pl.properties @@ -1,6 +1,6 @@ # The MIT License # -# Copyright (c) 2004-2010, Sun Microsystems, Inc. Kohsuke Kawaguchi. Knud Poulsen. +# Copyright (c) 2019, 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,4 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Add...=Tilf\u00f8j... -Remove=Slet +Pending=W trakcie diff --git a/core/src/main/resources/hudson/model/DownloadService/footer.jelly b/core/src/main/resources/hudson/model/UpdateCenter/CompleteBatchJob/Running/status.jelly similarity index 75% rename from core/src/main/resources/hudson/model/DownloadService/footer.jelly rename to core/src/main/resources/hudson/model/UpdateCenter/CompleteBatchJob/Running/status.jelly index 952945b014..a8d871fe18 100644 --- a/core/src/main/resources/hudson/model/DownloadService/footer.jelly +++ b/core/src/main/resources/hudson/model/UpdateCenter/CompleteBatchJob/Running/status.jelly @@ -1,7 +1,7 @@ - - - + + ${%Running} diff --git a/core/src/main/resources/hudson/model/UpdateCenter/PageDecoratorImpl/footer.jelly b/core/src/main/resources/hudson/model/UpdateCenter/CompleteBatchJob/Success/status.jelly similarity index 60% rename from core/src/main/resources/hudson/model/UpdateCenter/PageDecoratorImpl/footer.jelly rename to core/src/main/resources/hudson/model/UpdateCenter/CompleteBatchJob/Success/status.jelly index 684bc26bb0..9a3854624c 100644 --- a/core/src/main/resources/hudson/model/UpdateCenter/PageDecoratorImpl/footer.jelly +++ b/core/src/main/resources/hudson/model/UpdateCenter/CompleteBatchJob/Success/status.jelly @@ -1,7 +1,7 @@ - - - - - - - - - + ${%Success} diff --git a/core/src/main/resources/hudson/PluginManager/sites_es.properties b/core/src/main/resources/hudson/model/UpdateCenter/CompleteBatchJob/Success/status_pl.properties similarity index 89% rename from core/src/main/resources/hudson/PluginManager/sites_es.properties rename to core/src/main/resources/hudson/model/UpdateCenter/CompleteBatchJob/Success/status_pl.properties index 11ac2ce99b..9d55cf00dc 100644 --- a/core/src/main/resources/hudson/PluginManager/sites_es.properties +++ b/core/src/main/resources/hudson/model/UpdateCenter/CompleteBatchJob/Success/status_pl.properties @@ -1,6 +1,6 @@ # The MIT License # -# Copyright (c) 2004-2010, Sun Microsystems, Inc. +# Copyright (c) 2019, 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,6 +20,4 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Add...=Añadir... -Remove=Borrar -Update\ Center=Centro de actualizaciones +Success=Sukces diff --git a/core/src/main/resources/hudson/model/UpdateCenter/CompleteBatchJob/row.jelly b/core/src/main/resources/hudson/model/UpdateCenter/CompleteBatchJob/row.jelly new file mode 100644 index 0000000000..9a6e44e27a --- /dev/null +++ b/core/src/main/resources/hudson/model/UpdateCenter/CompleteBatchJob/row.jelly @@ -0,0 +1,10 @@ + + + + ${%Loading plugin extensions} + + + + + + diff --git a/core/src/main/resources/jenkins/model/DownloadSettings/config_ja.properties b/core/src/main/resources/hudson/model/UpdateCenter/CompleteBatchJob/row_pl.properties similarity index 89% rename from core/src/main/resources/jenkins/model/DownloadSettings/config_ja.properties rename to core/src/main/resources/hudson/model/UpdateCenter/CompleteBatchJob/row_pl.properties index 3f7949a961..ea99c2da3a 100644 --- a/core/src/main/resources/jenkins/model/DownloadSettings/config_ja.properties +++ b/core/src/main/resources/hudson/model/UpdateCenter/CompleteBatchJob/row_pl.properties @@ -1,17 +1,17 @@ # The MIT License -# -# Copyright (c) 2014-2015, Harald Albers, Seiji Sogabe -# +# +# Copyright (c) 2019, 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 @@ -20,4 +20,4 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Use\ Browser = \u30d6\u30e9\u30a6\u30b6\u3092\u4f7f\u7528 +Loading\ plugin\ extensions=\u0141adowanie wtyczki diff --git a/core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message.jelly b/core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message.jelly index 5708767b80..8419f13ce0 100644 --- a/core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message.jelly +++ b/core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message.jelly @@ -51,7 +51,7 @@ THE SOFTWARE. ${%UpgradeProgress(ucData.core.version,rootURL+'/updateCenter/')} - + ${%NewVersionAvailable(ucData.core.version,ucData.core.url,changelog_url)} diff --git a/core/src/filter/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message.properties b/core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message.properties similarity index 92% rename from core/src/filter/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message.properties rename to core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message.properties index bd792f42c1..115404cdf1 100644 --- a/core/src/filter/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message.properties +++ b/core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message.properties @@ -20,9 +20,8 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -NewVersionAvailable=New version of Jenkins ({0}) is available for download \ +NewVersionAvailable=New version of Jenkins ({0}) is available for download \ (changelog). -ChangelogUrl=${changelog.url} UpgradeComplete=Upgrade to Jenkins {0} is complete, awaiting restart. UpgradeCompleteRestartNotSupported=Upgrade to Jenkins {0} is complete, awaiting restart. UpgradeProgress=Upgrade to Jenkins {0} is in progress. diff --git a/core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_bg.properties b/core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_bg.properties index fe4ef9b629..5c76d4878e 100644 --- a/core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_bg.properties +++ b/core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_bg.properties @@ -20,17 +20,17 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -UpgradeProgress=\ - \u0415\u0442\u0430\u043f \u043d\u0430 \u043e\u0431\u043d\u043e\u0432\u044f\u0432\u0430\u043d\u0435 +UpgradeProgress=\u0418\u0437\u043f\u044a\u043b\u043d\u044f\u0432\u0430 \u0441\u0435 \u043e\u0431\u043d\u043e\u0432\u044f\u0432\u0430\u043d\u0435 \u043a\u044a\u043c Jenkins {0}. Retry=\ \u041d\u043e\u0432 \u043e\u043f\u0438\u0442 UpgradeComplete=\ - \u041e\u0431\u043d\u043e\u0432\u044f\u0432\u0430\u043d\u0435\u0442\u043e \u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e -UpgradeFailed=\ - \u041e\u0431\u043d\u043e\u0432\u044f\u0432\u0430\u043d\u0435\u0442\u043e \u0435 \u043d\u0435\u0443\u0441\u043f\u0435\u0448\u043d\u043e + \u041e\u0431\u043d\u043e\u0432\u044f\u0432\u0430\u043d\u0435\u0442\u043e \u043a\u044a\u043c \u043d\u043e\u0432\u0430\u0442\u0430 \u0432\u0435\u0440\u0441\u0438\u044f Jenkins {0} \u043f\u0440\u0438\u043a\u043b\u044e\u0447\u0438. \u0422\u0440\u044f\u0431\u0432\u0430 \u0434\u0430 \u0440\u0435\u0441\u0442\u0430\u0440\u0442\u0438\u0440\u0430\u0442\u0435. +UpgradeFailed=\u041d\u0435\u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043e\u0431\u043d\u043e\u0432\u044f\u0432\u0430\u043d\u0435 \u043a\u044a\u043c Jenkins {0}: {1}. NewVersionAvailable=\ - \u0418\u043c\u0430 \u043d\u043e\u0432\u0430 \u0432\u0435\u0440\u0441\u0438\u044f + \u041d\u043e\u0432\u0430\u0442\u0430 \u0432\u0435\u0440\u0441\u0438\u044f \u043d\u0430 Jenkins ({0}) \u0435 \u043d\u0430\u043b\u0438\u0447\u043d\u0430 \u0437\u0430 \u0438\u0437\u0442\u0435\u0433\u043b\u044f\u043d\u0435\ + (\u0441\u043f\u0438\u0441\u044a\u043a \u0441 \u043f\u0440\u043e\u043c\u0435\u043d\u0438\u0442\u0435). Or\ Upgrade\ Automatically=\ \u0418\u043b\u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u043d\u043e \u043e\u0431\u043d\u043e\u0432\u044f\u0432\u0430\u043d\u0435 UpgradeCompleteRestartNotSupported=\ - \u041e\u0431\u043d\u043e\u0432\u044f\u0432\u0430\u043d\u0435\u0442\u043e \u0437\u0430\u0432\u044a\u0440\u0448\u0438, \u043d\u043e \u043d\u0435 \u0441\u0435 \u043f\u043e\u0434\u0434\u044a\u0440\u0436\u0430 \u0440\u0435\u0441\u0442\u0430\u0440\u0442\u0438\u0440\u0430\u043d\u0435 + \u041e\u0431\u043d\u043e\u0432\u044f\u0432\u0430\u043d\u0435\u0442\u043e \u043a\u044a\u043c \u043d\u043e\u0432\u0430\u0442\u0430 \u0432\u0435\u0440\u0441\u0438\u044f Jenkins {0} \u043f\u0440\u0438\u043a\u043b\u044e\u0447\u0438. \u0422\u0440\u044f\u0431\u0432\u0430 \u0434\u0430 \u0440\u0435\u0441\u0442\u0430\u0440\u0442\u0438\u0440\u0430\u0442\u0435. diff --git a/core/src/filter/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_cs.properties b/core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_cs.properties similarity index 94% rename from core/src/filter/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_cs.properties rename to core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_cs.properties index 691b46b7f0..2fbdd8a13f 100644 --- a/core/src/filter/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_cs.properties +++ b/core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_cs.properties @@ -20,7 +20,7 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -NewVersionAvailable=Nov\u00E1 verze Jenkins-u ({0}) je k dispozici ke sta\u017Een\u00ED (changelog). +NewVersionAvailable=Nov\u00E1 verze Jenkins-u ({0}) je k dispozici ke sta\u017Een\u00ED (changelog). Or\ Upgrade\ Automatically=Nebo Upgradovat Automaticky UpgradeComplete=Upgrade na Jenkinse {0} je hotov, \u010Dek\u00E1 na restart. UpgradeCompleteRestartNotSupported=Upgrade na Jenkinse {0} je hotov, \u010Dek\u00E1 na restart. diff --git a/core/src/filter/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_da.properties b/core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_da.properties similarity index 97% rename from core/src/filter/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_da.properties rename to core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_da.properties index 8b5776e534..d23b600857 100644 --- a/core/src/filter/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_da.properties +++ b/core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_da.properties @@ -25,4 +25,4 @@ UpgradeCompleteRestartNotSupported=Opdatering til Jenkins {0} er fuldf\u00f8rt, UpgradeProgress=Opdatering til Jenkins {0} er i gang eller er fejlet. Or\ Upgrade\ Automatically=Eller opdater automatisk NewVersionAvailable=En ny version af Jenkins ({0}) er tilg\u00e6ngelig til hentning \ - (changelog). + (changelog). diff --git a/core/src/filter/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_de.properties b/core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_de.properties similarity index 94% rename from core/src/filter/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_de.properties rename to core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_de.properties index 344e457118..98b368fc36 100644 --- a/core/src/filter/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_de.properties +++ b/core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_de.properties @@ -23,5 +23,5 @@ UpgradeComplete=Aktualisierung auf Jenkins {0} abgeschlossen. Neustart von Jenkins erforderlich. UpgradeCompleteRestartNotSupported=Aktualisierung auf Jenkins {0} abgeschlossen. Neustart von Jenkins erforderlich. UpgradeProgress=Aktualisierung auf Jenkins {0} in Arbeit oder fehlgeschlagen. -NewVersionAvailable=Eine neue Version von Jenkins ({0}) kann hier heruntergeladen werden (Was ist neu?). +NewVersionAvailable=Eine neue Version von Jenkins ({0}) kann hier heruntergeladen werden (Was ist neu?). Or\ Upgrade\ Automatically=Automatisch aktualisieren diff --git a/core/src/filter/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_es.properties b/core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_es.properties similarity index 94% rename from core/src/filter/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_es.properties rename to core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_es.properties index 6016d4d17c..77a67a8252 100644 --- a/core/src/filter/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_es.properties +++ b/core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_es.properties @@ -20,7 +20,7 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -NewVersionAvailable=Hay una nueva versi\u00f3n de Jenkins disponible ({0}). descargar (listado de cambios). +NewVersionAvailable=Hay una nueva versi\u00f3n de Jenkins disponible ({0}). descargar (listado de cambios). Or\ Upgrade\ Automatically=O actualizar autom\u00e1ticamente UpgradeComplete=La actualizaci\u00f3n a Jenkins {0} se ha completado, esperando para reiniciar. UpgradeCompleteRestartNotSupported=La actualizaci\u00f3n a Jenkins {0} se ha completado, esperando para reiniciar. diff --git a/core/src/filter/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_et.properties b/core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_et.properties similarity index 57% rename from core/src/filter/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_et.properties rename to core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_et.properties index 1df6054b14..eee3e46823 100644 --- a/core/src/filter/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_et.properties +++ b/core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_et.properties @@ -1,3 +1,3 @@ # This file is under the MIT License by authors -NewVersionAvailable=Jenkinsi uus versioon ({0}) on saadaval allalaadimiseks (muudatuste nimekiri). +NewVersionAvailable=Jenkinsi uus versioon ({0}) on saadaval allalaadimiseks (muudatuste nimekiri). diff --git a/core/src/filter/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_fi.properties b/core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_fi.properties similarity index 65% rename from core/src/filter/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_fi.properties rename to core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_fi.properties index 8243a6f685..162f2da6f5 100644 --- a/core/src/filter/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_fi.properties +++ b/core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_fi.properties @@ -1,3 +1,3 @@ # This file is under the MIT License by authors -NewVersionAvailable=Uusi Jenkinsin versio ({0}) on saatavana (muutosloki). +NewVersionAvailable=Uusi Jenkinsin versio ({0}) on saatavana (muutosloki). diff --git a/core/src/filter/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_fr.properties b/core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_fr.properties similarity index 95% rename from core/src/filter/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_fr.properties rename to core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_fr.properties index 0dbdae69d7..df31af25d9 100644 --- a/core/src/filter/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_fr.properties +++ b/core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_fr.properties @@ -20,7 +20,7 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -NewVersionAvailable=Une nouvelle version de Jenkins ({0}) est disponible (changelog). +NewVersionAvailable=Une nouvelle version de Jenkins ({0}) est disponible (changelog). Or\ Upgrade\ Automatically=Ou mettre \u00E0 jour automatiquement UpgradeProgress=Mise \u00E0 jour vers Jenkins {0} est en cours ou en \u00E9chec. UpgradeComplete=La mise \u00E0 jour de Jenkins en {0} est termin\u00E9e, en attente de red\u00E9marrage. diff --git a/core/src/filter/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_hu.properties b/core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_hu.properties similarity index 92% rename from core/src/filter/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_hu.properties rename to core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_hu.properties index 19587285ca..1f781852b2 100644 --- a/core/src/filter/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_hu.properties +++ b/core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_hu.properties @@ -20,5 +20,5 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -NewVersionAvailable=A Jenkins \u00FAj verzi\u00F3ja ({0}) el\u00E9rhet\u0151 let\u00F6lt\u00E9sre (v\u00E1ltoz\u00E1sok). +NewVersionAvailable=A Jenkins \u00FAj verzi\u00F3ja ({0}) el\u00E9rhet\u0151 let\u00F6lt\u00E9sre (v\u00E1ltoz\u00E1sok). Or\ Upgrade\ Automatically=Vagy friss\u00EDtsen automatikusan diff --git a/core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_it.properties b/core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_it.properties index 6d4a729976..4102ffeced 100644 --- a/core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_it.properties +++ b/core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_it.properties @@ -20,11 +20,11 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -NewVersionAvailable=Una nuova versione di Jenkins ({0}) è disponibile per il download \ - (elenco delle modifiche). +NewVersionAvailable=Una nuova versione di Jenkins ({0}) \u00e8 disponibile per il download \ + (log delle modifiche). Retry=Riprova -UpgradeCompleteRestartNotSupported=L''aggiornamento a Jenkins {0} è stato completato, in attesa del riavvio. +UpgradeCompleteRestartNotSupported=Aggiornamento a Jenkins {0} completato, in attesa del riavvio. UpgradeProgress=Aggiornamento a Jenkins {0} in corso. Or\ Upgrade\ Automatically=O esegui l''aggiornamento automaticamente -UpgradeComplete=L''aggiornamento a Jenkins {0} è stato completato, in attesa del riavvio. +UpgradeComplete=Aggiornamento a Jenkins {0} completato, in attesa del riavvio. UpgradeFailed=Aggiornamento a Jenkins {0} non riuscito: {1}. diff --git a/core/src/filter/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_ja.properties b/core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_ja.properties similarity index 94% rename from core/src/filter/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_ja.properties rename to core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_ja.properties index 5738b71b76..3f32d0544b 100644 --- a/core/src/filter/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_ja.properties +++ b/core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_ja.properties @@ -20,7 +20,7 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -NewVersionAvailable=Jenkins\u306E\u65B0\u3057\u3044\u30D0\u30FC\u30B8\u30E7\u30F3({0})\u3092\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u3067\u304D\u307E\u3059 (\u5909\u66F4\u5C65\u6B74)\u3002 +NewVersionAvailable=Jenkins\u306E\u65B0\u3057\u3044\u30D0\u30FC\u30B8\u30E7\u30F3({0})\u3092\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u3067\u304D\u307E\u3059 (\u5909\u66F4\u5C65\u6B74)\u3002 Or\ Upgrade\ Automatically=\u81EA\u52D5\u3067\u30A2\u30C3\u30D7\u30B0\u30EC\u30FC\u30C9 UpgradeComplete=Jenkins {0} \u3078\u306E\u30A2\u30C3\u30D7\u30B0\u30EC\u30FC\u30C9\u306F\u5B8C\u4E86\u3057\u307E\u3057\u305F\u3002\u518D\u8D77\u52D5\u5F85\u3061\u3067\u3059\u3002 UpgradeProgress=Jenkins {0}\u3078\u306E\u30A2\u30C3\u30D7\u30B0\u30EC\u30FC\u30C9\u306F\u5B9F\u884C\u4E2D\u304B\u3001\u5931\u6557\u3057\u307E\u3057\u305F\u3002 diff --git a/core/src/filter/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_ko.properties b/core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_ko.properties similarity index 94% rename from core/src/filter/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_ko.properties rename to core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_ko.properties index f5f6a77276..d7d6899922 100644 --- a/core/src/filter/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_ko.properties +++ b/core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_ko.properties @@ -20,5 +20,5 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -NewVersionAvailable=Jenkins \uC2E0\uADDC\uBC84\uC804({0})\uC744 \uC5EC\uAE30\uC11C \uBC1B\uC744 \uC218 \uC788\uC2B5\uB2C8\uB2E4.(\uBCC0\uACBD\uC0AC\uD56D). +NewVersionAvailable=Jenkins \uC2E0\uADDC\uBC84\uC804({0})\uC744 \uC5EC\uAE30\uC11C \uBC1B\uC744 \uC218 \uC788\uC2B5\uB2C8\uB2E4.(\uBCC0\uACBD\uC0AC\uD56D). Or\ Upgrade\ Automatically=\uB610\uB294 \uC790\uB3D9 \uC5C5\uADF8\uB808\uC774\uB4DC diff --git a/core/src/filter/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_lt.properties b/core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_lt.properties similarity index 67% rename from core/src/filter/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_lt.properties rename to core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_lt.properties index 2a16d979f6..09a40375ad 100644 --- a/core/src/filter/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_lt.properties +++ b/core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_lt.properties @@ -1,4 +1,4 @@ # This file is under the MIT License by authors -NewVersionAvailable=Galima parsisi\u0173sti nauj\u0105 ({0}) Jenkins versij\u0105. (pakeitimai). +NewVersionAvailable=Galima parsisi\u0173sti nauj\u0105 ({0}) Jenkins versij\u0105. (pakeitimai). Or\ Upgrade\ Automatically=Parsi\u0173sti automati\u0161kai diff --git a/core/src/filter/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_lv.properties b/core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_lv.properties similarity index 95% rename from core/src/filter/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_lv.properties rename to core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_lv.properties index 9193a28385..77c8207456 100644 --- a/core/src/filter/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_lv.properties +++ b/core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_lv.properties @@ -20,7 +20,7 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -NewVersionAvailable=Jauna Jenkins ({0}) versija ir pieejama lejupl\u0101dei (izmai\u0146as). +NewVersionAvailable=Jauna Jenkins ({0}) versija ir pieejama lejupl\u0101dei (izmai\u0146as). Or\ Upgrade\ Automatically=Vai atjaunin\u0101t autom\u0101tiski UpgradeComplete=Atjaunin\u0101s\u0101na uz Jenkins {0} ir pabeigta; gaidu p\u0101rstart\u0113\u0161anos. UpgradeCompleteRestartNotSupported=Atjaunin\u0101s\u0101na uz Jenkins {0} ir pabeigta; gaidu p\u0101rstart\u0113\u0161anos. diff --git a/core/src/filter/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_nb_NO.properties b/core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_nb_NO.properties similarity index 94% rename from core/src/filter/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_nb_NO.properties rename to core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_nb_NO.properties index b15161b442..c5cac2d1bf 100644 --- a/core/src/filter/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_nb_NO.properties +++ b/core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_nb_NO.properties @@ -20,4 +20,4 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -NewVersionAvailable=En ny versjon av Jenkins ({0}) er n\u00E5 tilgjengelig (Endringer). +NewVersionAvailable=En ny versjon av Jenkins ({0}) er n\u00E5 tilgjengelig (Endringer). diff --git a/core/src/filter/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_nl.properties b/core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_nl.properties similarity index 94% rename from core/src/filter/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_nl.properties rename to core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_nl.properties index 9c291b0fdd..d9a5180a47 100644 --- a/core/src/filter/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_nl.properties +++ b/core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_nl.properties @@ -20,7 +20,7 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -NewVersionAvailable=Er is een nieuwere versie van Jenkins ({0}) beschikbaar. downloaden (changelog). +NewVersionAvailable=Er is een nieuwere versie van Jenkins ({0}) beschikbaar. downloaden (changelog). Or\ Upgrade\ Automatically=Of werk automatisch bij UpgradeComplete=Upgrade naar Jenkins {0} is volledig; aan het wachten op herstart. UpgradeCompleteRestartNotSupported=Upgrade naar Jenkins {0} is volledig; aan het wachten op herstart. diff --git a/core/src/filter/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_pl.properties b/core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_pl.properties similarity index 94% rename from core/src/filter/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_pl.properties rename to core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_pl.properties index 18a2cbe3c3..5793e7f5da 100644 --- a/core/src/filter/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_pl.properties +++ b/core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_pl.properties @@ -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. -NewVersionAvailable=Nowa wersja Jenkinsa ({0}) jest dost\u0119pna do pobrania (historia zmian). +NewVersionAvailable=Nowa wersja Jenkinsa ({0}) jest dost\u0119pna do pobrania (historia zmian). 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/filter/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_pt_BR.properties b/core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_pt_BR.properties similarity index 97% rename from core/src/filter/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_pt_BR.properties rename to core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_pt_BR.properties index 216eee44d9..f604966589 100644 --- a/core/src/filter/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_pt_BR.properties +++ b/core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_pt_BR.properties @@ -27,5 +27,5 @@ UpgradeCompleteRestartNotSupported=Atualiza\u00e7\u00e3o do Jenkins {0} completa UpgradeProgress=Atualiza\u00e7\u00e3o para Jenkins {0} est\u00e1 em andamento ou falhou. Or\ Upgrade\ Automatically=Ou fazer a atualiza\u00e7\u00e3o automaticamente. # New version of Jenkins ({0}) is available for download \ -# (changelog). +# (changelog). NewVersionAvailable=Nova vers\u00e3o do Jenkins ({0}) est\u00e1 dispon\u00edvel em download diff --git a/core/src/filter/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_pt_PT.properties b/core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_pt_PT.properties similarity index 58% rename from core/src/filter/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_pt_PT.properties rename to core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_pt_PT.properties index dd2d81456d..f927f4cf83 100644 --- a/core/src/filter/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_pt_PT.properties +++ b/core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_pt_PT.properties @@ -1,4 +1,4 @@ # This file is under the MIT License by authors -NewVersionAvailable=Uma nova vers\u00E3o do Jenkins ({0}) est\u00E1 dispon\u00EDvel para download (registo de altera\u00E7\u00F5es). +NewVersionAvailable=Uma nova vers\u00E3o do Jenkins ({0}) est\u00E1 dispon\u00EDvel para download (registo de altera\u00E7\u00F5es). Or\ Upgrade\ Automatically=Ou atualizar automaticamente 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 index 0995f00f6c..18d52aa12a 100644 --- a/core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_ru.properties +++ b/core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_ru.properties @@ -20,7 +20,10 @@ # 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 +NewVersionAvailable=\u041d\u043e\u0432\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f Jenkins ({0}) \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 (\u0441\u043f\u0438\u0441\u043e\u043a \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439). 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 +UpgradeComplete=\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u043e Jenkins {0} \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u043e, \u043e\u0436\u0438\u0434\u0430\u0435\u0442 \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438. UpgradeFailed=\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c +Or\ Upgrade\ Automatically=\u0418\u043b\u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 +UpgradeCompleteRestartNotSupported=\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u043e Jenkins {0} \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u043e, \u043e\u0436\u0438\u0434\u0430\u0435\u0442 \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438. +UpgradeProgress=\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u0430 Jenkins {0} \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0438\u043b\u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u043e\u0441\u044c \u043d\u0435\u0443\u0434\u0430\u0447\u0435\u0439. diff --git a/core/src/filter/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_sk.properties b/core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_sk.properties similarity index 93% rename from core/src/filter/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_sk.properties rename to core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_sk.properties index 96543df586..e5f4de3439 100644 --- a/core/src/filter/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_sk.properties +++ b/core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_sk.properties @@ -20,4 +20,4 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -NewVersionAvailable=Nov\u00E1 verzia Jenkins ({0}) je dostupn\u00E1 na stiahnutie (zoznam zmien). +NewVersionAvailable=Nov\u00E1 verzia Jenkins ({0}) je dostupn\u00E1 na stiahnutie (zoznam zmien). diff --git a/core/src/filter/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_sl.properties b/core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_sl.properties similarity index 66% rename from core/src/filter/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_sl.properties rename to core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_sl.properties index 649104bcf5..fa461eb53a 100644 --- a/core/src/filter/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_sl.properties +++ b/core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_sl.properties @@ -1,4 +1,4 @@ # This file is under the MIT License by authors -NewVersionAvailable=Nova razli\u010Dica Jenkins-a ({0}) je na voljo za prenos (seznam sprememb). +NewVersionAvailable=Nova razli\u010Dica Jenkins-a ({0}) je na voljo za prenos (seznam sprememb). Or\ Upgrade\ Automatically=ali posodobi samodejno diff --git a/core/src/filter/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_sv_SE.properties b/core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_sv_SE.properties similarity index 100% rename from core/src/filter/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_sv_SE.properties rename to core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_sv_SE.properties diff --git a/core/src/filter/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_uk.properties b/core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_uk.properties similarity index 93% rename from core/src/filter/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_uk.properties rename to core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_uk.properties index 625195c351..2c3fdbb332 100644 --- a/core/src/filter/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_uk.properties +++ b/core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_uk.properties @@ -20,5 +20,5 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -NewVersionAvailable=\u041D\u043E\u0432\u0430 \u0432\u0435\u0440\u0441\u0456\u044F \u0414\u0436\u0435\u043D\u043A\u0456\u043D\u0441 ({0}) \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0430 \u0434\u043B\u044F \u0437\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0435\u043D\u043D\u044F (\u0437\u043C\u0456\u043D\u0438). +NewVersionAvailable=\u041D\u043E\u0432\u0430 \u0432\u0435\u0440\u0441\u0456\u044F \u0414\u0436\u0435\u043D\u043A\u0456\u043D\u0441 ({0}) \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0430 \u0434\u043B\u044F \u0437\u0430\u0432\u0430\u043D\u0442\u0430\u0436\u0435\u043D\u043D\u044F (\u0437\u043C\u0456\u043D\u0438). Or\ Upgrade\ Automatically=\u0410\u0431\u043E \u043E\u043D\u043E\u0432\u0456\u0442\u044C \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u043D\u043E diff --git a/core/src/filter/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_zh_TW.properties b/core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_zh_TW.properties similarity index 94% rename from core/src/filter/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_zh_TW.properties rename to core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_zh_TW.properties index 76967e8ea1..e6305137c8 100644 --- a/core/src/filter/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_zh_TW.properties +++ b/core/src/main/resources/hudson/model/UpdateCenter/CoreUpdateMonitor/message_zh_TW.properties @@ -24,5 +24,5 @@ UpgradeComplete=Jenkins {0} \u5347\u7248\u5b8c\u6210\uff0c\u7b49\u5019\u91cd\u65b0\u555f\u52d5\u3002 UpgradeCompleteRestartNotSupported=Jenkins {0} \u5347\u7248\u5b8c\u6210\uff0c\u7b49\u5019\u91cd\u65b0\u555f\u52d5\u3002 UpgradeProgress=Jenkins {0} \u5347\u7d1a\u4f5c\u696d\u6b63\u5728\u9032\u884c\u4e2d\u6216\u662f\u5df2\u7d93\u5931\u6557\u3002 -NewVersionAvailable=\u65b0\u7248\u7684 Jenkins ({0}) \u5df2\u7d93\u53ef\u4ee5\u4e0b\u8f09 (\u6539\u7248\u8a18\u9304)\u3002 +NewVersionAvailable=\u65b0\u7248\u7684 Jenkins ({0}) \u5df2\u7d93\u53ef\u4ee5\u4e0b\u8f09 (\u6539\u7248\u8a18\u9304)\u3002 Or\ Upgrade\ Automatically=\u6216\u662f\u81ea\u52d5\u5347\u7248 diff --git a/core/src/main/resources/hudson/model/UpdateCenter/DownloadJob/Failure/status_ja.properties b/core/src/main/resources/hudson/model/UpdateCenter/DownloadJob/Failure/status_ja.properties index af168194cf..68a76991b9 100644 --- a/core/src/main/resources/hudson/model/UpdateCenter/DownloadJob/Failure/status_ja.properties +++ b/core/src/main/resources/hudson/model/UpdateCenter/DownloadJob/Failure/status_ja.properties @@ -21,4 +21,4 @@ # THE SOFTWARE. Failure=\u5931\u6557 -Details=\u8a73\u7d30 \ No newline at end of file +Details=\u8a73\u7d30 diff --git a/core/src/main/resources/hudson/model/UpdateCenter/DownloadJob/Installing/status_ja.properties b/core/src/main/resources/hudson/model/UpdateCenter/DownloadJob/Installing/status_ja.properties index a2347bb520..eb48f7be5c 100644 --- a/core/src/main/resources/hudson/model/UpdateCenter/DownloadJob/Installing/status_ja.properties +++ b/core/src/main/resources/hudson/model/UpdateCenter/DownloadJob/Installing/status_ja.properties @@ -20,4 +20,4 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Installing=\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u4e2d \ No newline at end of file +Installing=\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u4e2d diff --git a/core/src/main/resources/hudson/model/UpdateCenter/DownloadJob/Success/status_ja.properties b/core/src/main/resources/hudson/model/UpdateCenter/DownloadJob/Success/status_ja.properties index 5c9002387a..b85d8e2157 100644 --- a/core/src/main/resources/hudson/model/UpdateCenter/DownloadJob/Success/status_ja.properties +++ b/core/src/main/resources/hudson/model/UpdateCenter/DownloadJob/Success/status_ja.properties @@ -20,4 +20,4 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Success=\u6210\u529f \ No newline at end of file +Success=\u6210\u529f diff --git a/core/src/main/resources/hudson/model/UpdateCenter/DownloadJob/row.jelly b/core/src/main/resources/hudson/model/UpdateCenter/DownloadJob/row.jelly index 1ea067b9f0..7dd6d3cd9d 100644 --- a/core/src/main/resources/hudson/model/UpdateCenter/DownloadJob/row.jelly +++ b/core/src/main/resources/hudson/model/UpdateCenter/DownloadJob/row.jelly @@ -25,7 +25,7 @@ THE SOFTWARE. - ${it.name} + ${it.displayName} 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 index e2a00fa012..1ef586772a 100644 --- a/core/src/main/resources/hudson/model/UpdateCenter/NoOpJob/row_ru.properties +++ b/core/src/main/resources/hudson/model/UpdateCenter/NoOpJob/row_ru.properties @@ -20,4 +20,4 @@ # 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 +Already\ Installed=\u0423\u0436\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e diff --git a/core/src/main/resources/hudson/model/UpdateCenter/RestartJenkinsJob/Failure/status_ru.properties b/core/src/main/resources/hudson/model/UpdateCenter/RestartJenkinsJob/Failure/status_ru.properties index 742c133e61..e4b1841057 100644 --- a/core/src/main/resources/hudson/model/UpdateCenter/RestartJenkinsJob/Failure/status_ru.properties +++ b/core/src/main/resources/hudson/model/UpdateCenter/RestartJenkinsJob/Failure/status_ru.properties @@ -20,4 +20,4 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Failure=\u041e\u0448\u0438\u0431\u043a\u0430 \ No newline at end of file +Failure=\u041e\u0448\u0438\u0431\u043a\u0430 diff --git a/core/src/main/resources/hudson/model/UpdateCenter/RestartJenkinsJob/Pending/status_ja.properties b/core/src/main/resources/hudson/model/UpdateCenter/RestartJenkinsJob/Pending/status_ja.properties index 44db8e6f55..05861439a7 100644 --- a/core/src/main/resources/hudson/model/UpdateCenter/RestartJenkinsJob/Pending/status_ja.properties +++ b/core/src/main/resources/hudson/model/UpdateCenter/RestartJenkinsJob/Pending/status_ja.properties @@ -20,4 +20,4 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Pending=\u4fdd\u7559 \ No newline at end of file +Pending=\u4fdd\u7559 diff --git a/core/src/main/resources/hudson/model/UpdateCenter/body.jelly b/core/src/main/resources/hudson/model/UpdateCenter/body.jelly index ba358666a4..baea05105a 100644 --- a/core/src/main/resources/hudson/model/UpdateCenter/body.jelly +++ b/core/src/main/resources/hudson/model/UpdateCenter/body.jelly @@ -42,6 +42,12 @@ THE SOFTWARE. ${%Go back to the top page}
      (${%you can start using the installed plugins right away})

      +

      diff --git a/core/src/main/resources/hudson/model/UpdateCenter/body_tr.properties b/core/src/main/resources/hudson/model/UpdateCenter/body_tr.properties index 925baf803b..e7340c9577 100644 --- a/core/src/main/resources/hudson/model/UpdateCenter/body_tr.properties +++ b/core/src/main/resources/hudson/model/UpdateCenter/body_tr.properties @@ -1,5 +1,5 @@ # This file is under the MIT License by authors Go\ back\ to\ the\ top\ page=\u00DCst sayfaya geri d\u00F6n -warning=Y\u00FCkleme tamamland\u0131\u011F\u0131nda ve bekleyen bir i\u015F yoksa Jenkins''\u0131 yeniden ba\u015Flat. +warning=Y\u00FCkleme tamamland\u0131\u011F\u0131nda ve bekleyen bir i\u015F yoksa Jenkins''i yeniden ba\u015Flat. you\ can\ start\ using\ the\ installed\ plugins\ right\ away=Kurulmu\u015F eklentileri kullanmaya hemen ba\u015Flayabilirsiniz diff --git a/core/src/main/resources/hudson/model/UpdateCenter/sidepanel_pl.properties b/core/src/main/resources/hudson/model/UpdateCenter/sidepanel_pl.properties index 30d61be913..c462b7ebb4 100644 --- a/core/src/main/resources/hudson/model/UpdateCenter/sidepanel_pl.properties +++ b/core/src/main/resources/hudson/model/UpdateCenter/sidepanel_pl.properties @@ -1,6 +1,6 @@ # The MIT License # -# Copyright (c) 2004-2010, Sun Microsystems, Inc. +# Copyright (c) 2004-2019, 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 @@ -21,5 +21,5 @@ # THE SOFTWARE. Back\ to\ Dashboard=Powr\u00F3t do tablicy -Manage\ Jenkins=Zarz\u0105dzanie Jenkinsem -Manage\ Plugins=Zarz\u0105dzanie wtyczkami +Manage\ Jenkins=Zarz\u0105dzaj Jenkinsem +Manage\ Plugins=Zarz\u0105dzaj wtyczkami diff --git a/core/src/main/resources/hudson/model/UpdateCenter/sidepanel_tr.properties b/core/src/main/resources/hudson/model/UpdateCenter/sidepanel_tr.properties index 57b9f40ed0..56c5438119 100644 --- a/core/src/main/resources/hudson/model/UpdateCenter/sidepanel_tr.properties +++ b/core/src/main/resources/hudson/model/UpdateCenter/sidepanel_tr.properties @@ -21,5 +21,5 @@ # THE SOFTWARE. Back\ to\ Dashboard=Kontrol Merkezi''ne D\u00F6n -Manage\ Jenkins=Jenkins''\u0131 Y\u00F6net +Manage\ Jenkins=Jenkins''i Y\u00F6net Manage\ Plugins=Eklentileri y\u00F6net diff --git a/core/src/main/resources/hudson/model/UsageStatistics/global_sr.properties b/core/src/main/resources/hudson/model/UsageStatistics/global_sr.properties index 0d9545b6dc..c1f91ec46e 100644 --- a/core/src/main/resources/hudson/model/UsageStatistics/global_sr.properties +++ b/core/src/main/resources/hudson/model/UsageStatistics/global_sr.properties @@ -1,3 +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 +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. diff --git a/core/src/main/resources/hudson/model/User/builds.jelly b/core/src/main/resources/hudson/model/User/builds.jelly index cae284074b..5f9d042f95 100644 --- a/core/src/main/resources/hudson/model/User/builds.jelly +++ b/core/src/main/resources/hudson/model/User/builds.jelly @@ -30,6 +30,10 @@ THE SOFTWARE. ${%title(it)} +

      + ${%disclaimer} +

      + diff --git a/core/src/main/resources/hudson/model/User/builds.properties b/core/src/main/resources/hudson/model/User/builds.properties index b3a7cb0edc..efbcf60db2 100644 --- a/core/src/main/resources/hudson/model/User/builds.properties +++ b/core/src/main/resources/hudson/model/User/builds.properties @@ -20,3 +20,4 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. title=Builds for {0} +disclaimer=This does not include stages from pipeline jobs. diff --git a/core/src/main/resources/hudson/model/User/configure_ja.properties b/core/src/main/resources/hudson/model/User/configure_ja.properties index a81d4c5c93..b74d4ecec1 100644 --- a/core/src/main/resources/hudson/model/User/configure_ja.properties +++ b/core/src/main/resources/hudson/model/User/configure_ja.properties @@ -23,4 +23,4 @@ Full\ name=\u3042\u306a\u305f\u306e\u540d\u524d Description=\u8aac\u660e Save=\u4fdd\u5b58 -title=\u30e6\u30fc\u30b6\u30fc ''{0}'' \u306e\u8a2d\u5b9a \ No newline at end of file +title=\u30e6\u30fc\u30b6\u30fc ''{0}'' \u306e\u8a2d\u5b9a diff --git a/core/src/main/resources/hudson/model/User/index_ja.properties b/core/src/main/resources/hudson/model/User/index_ja.properties index 41d2c2264d..94bfe229ff 100644 --- a/core/src/main/resources/hudson/model/User/index_ja.properties +++ b/core/src/main/resources/hudson/model/User/index_ja.properties @@ -21,4 +21,4 @@ # THE SOFTWARE. Jenkins\ User\ Id=Jenkins \u30e6\u30fc\u30b6\u30fcID -Groups=\u30b0\u30eb\u30fc\u30d7 \ No newline at end of file +Groups=\u30b0\u30eb\u30fc\u30d7 diff --git a/core/src/main/resources/hudson/model/User/sidepanel_tr.properties b/core/src/main/resources/hudson/model/User/sidepanel_tr.properties index fe2bf4f34f..865c954d8c 100644 --- a/core/src/main/resources/hudson/model/User/sidepanel_tr.properties +++ b/core/src/main/resources/hudson/model/User/sidepanel_tr.properties @@ -24,4 +24,4 @@ My\ Views=Benim G\u00F6r\u00FCn\u00FCmlerim People=\u0130nsanlar Status=Durum Builds=Yap\u0131land\u0131rmalar -Configure=Konfig\u00fcrasyonu\ De\u011fi\u015ftir +Configure=Konfig\u00fcrasyonu De\u011fi\u015ftir diff --git a/core/src/main/resources/hudson/model/View/AsynchPeople/index.jelly b/core/src/main/resources/hudson/model/View/AsynchPeople/index.jelly index ffdcd6d2f3..f3da56cbcd 100644 --- a/core/src/main/resources/hudson/model/View/AsynchPeople/index.jelly +++ b/core/src/main/resources/hudson/model/View/AsynchPeople/index.jelly @@ -100,7 +100,7 @@ THE SOFTWARE. - diff --git a/core/src/main/resources/hudson/model/View/AsynchPeople/index_ja.properties b/core/src/main/resources/hudson/model/View/AsynchPeople/index_ja.properties index 2dad93275b..fa8162178b 100644 --- a/core/src/main/resources/hudson/model/View/AsynchPeople/index_ja.properties +++ b/core/src/main/resources/hudson/model/View/AsynchPeople/index_ja.properties @@ -25,4 +25,4 @@ Name=\u540d\u524d Last\ Active=\u6700\u8fd1\u306e\u6d3b\u52d5 On=\u5834\u6240 People=\u958b\u767a\u8005 -All\ People=\u3059\u3079\u3066 \ No newline at end of file +All\ People=\u3059\u3079\u3066 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 253a5acf3e..72113ae5fb 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-2016, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributors +# Copyright (c) 2004-2019, 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,7 +23,6 @@ Name=Nazwa On=Na People=U\u017Cytkownicy -User\ Id=Identyfikator u\u017Cytkownika +User\ ID=Identyfikator u\u017Cytkownika Last\ Commit\ Activity=Ostatnia zmiana blurb=Prezentuje wszystkich uwierzytelnionych u\u017Cytkownik\u00F3w w\u0142\u0105cznie z identyfikatorem oraz osoby wymienione w opisach zarejestrowanych zmian. - diff --git a/core/src/main/resources/hudson/model/View/People/index_ja.properties b/core/src/main/resources/hudson/model/View/People/index_ja.properties index 9cfcc200c1..46ad6088eb 100644 --- a/core/src/main/resources/hudson/model/View/People/index_ja.properties +++ b/core/src/main/resources/hudson/model/View/People/index_ja.properties @@ -20,4 +20,4 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -People=\u958b\u767a\u8005 \ No newline at end of file +People=\u958b\u767a\u8005 diff --git a/core/src/main/resources/hudson/model/View/builds.jelly b/core/src/main/resources/hudson/model/View/builds.jelly index 398ccff65f..536f47c88a 100644 --- a/core/src/main/resources/hudson/model/View/builds.jelly +++ b/core/src/main/resources/hudson/model/View/builds.jelly @@ -32,6 +32,9 @@ THE SOFTWARE. ${%buildHistory(it.class.name=='hudson.model.AllView' ? app.displayName : it.displayName)} +

      + ${%disclaimer} +

      diff --git a/core/src/main/resources/hudson/model/View/builds.properties b/core/src/main/resources/hudson/model/View/builds.properties index b65bd65a59..9d25cb555e 100644 --- a/core/src/main/resources/hudson/model/View/builds.properties +++ b/core/src/main/resources/hudson/model/View/builds.properties @@ -20,4 +20,5 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -buildHistory=Build History of {0} \ No newline at end of file +buildHistory=Build History of {0} +disclaimer=This history is not guaranteed to include all subtasks executed on the node, e.g. Jenkins Pipeline subtasks will not be displayed. diff --git a/core/src/main/resources/hudson/model/View/configure.jelly b/core/src/main/resources/hudson/model/View/configure.jelly index 5d1193b409..8f2364c7b8 100644 --- a/core/src/main/resources/hudson/model/View/configure.jelly +++ b/core/src/main/resources/hudson/model/View/configure.jelly @@ -52,7 +52,7 @@ THE SOFTWARE. - + diff --git a/core/src/main/resources/hudson/model/View/configure_tr.properties b/core/src/main/resources/hudson/model/View/configure_tr.properties index ce3e6444c6..2eb6710963 100644 --- a/core/src/main/resources/hudson/model/View/configure_tr.properties +++ b/core/src/main/resources/hudson/model/View/configure_tr.properties @@ -21,4 +21,4 @@ # THE SOFTWARE. Name=\u0130sim -Description=A\u00e7\u0131klama \ No newline at end of file +Description=A\u00e7\u0131klama diff --git a/core/src/main/resources/hudson/model/View/delete_ja.properties b/core/src/main/resources/hudson/model/View/delete_ja.properties index f2d09254fb..e5e0aa994c 100644 --- a/core/src/main/resources/hudson/model/View/delete_ja.properties +++ b/core/src/main/resources/hudson/model/View/delete_ja.properties @@ -21,4 +21,4 @@ # THE SOFTWARE. Are\ you\ sure\ about\ deleting\ the\ view?=\u3053\u306e\u30d3\u30e5\u30fc\u3092\u524a\u9664\u3057\u307e\u3059\u304b\uff1f -Yes=\u306f\u3044 \ No newline at end of file +Yes=\u306f\u3044 diff --git a/core/src/main/resources/hudson/model/View/delete_tr.properties b/core/src/main/resources/hudson/model/View/delete_tr.properties index e292a581f1..06edb5477f 100644 --- a/core/src/main/resources/hudson/model/View/delete_tr.properties +++ b/core/src/main/resources/hudson/model/View/delete_tr.properties @@ -20,5 +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\ view?=G\u00f6r\u00fcnt\u00fcy\u00fc\ silmek\ istedi\u011finize\ emin\ misiniz? +Are\ you\ sure\ about\ deleting\ the\ view?=G\u00f6r\u00fcnt\u00fcy\u00fc silmek istedi\u011finize emin misiniz? Yes=Evet diff --git a/core/src/main/resources/hudson/model/View/index.jelly b/core/src/main/resources/hudson/model/View/index.jelly index 5fd54a3de3..ec0e6d458e 100644 --- a/core/src/main/resources/hudson/model/View/index.jelly +++ b/core/src/main/resources/hudson/model/View/index.jelly @@ -45,7 +45,9 @@ THE SOFTWARE. diff --git a/core/src/main/resources/hudson/model/View/index_ja.properties b/core/src/main/resources/hudson/model/View/index_ja.properties index 9a0edb7262..a5e9f61c23 100644 --- a/core/src/main/resources/hudson/model/View/index_ja.properties +++ b/core/src/main/resources/hudson/model/View/index_ja.properties @@ -20,4 +20,4 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Dashboard=\u30c0\u30c3\u30b7\u30e5\u30dc\u30fc\u30c9 \ No newline at end of file +Dashboard=\u30c0\u30c3\u30b7\u30e5\u30dc\u30fc\u30c9 diff --git a/core/src/main/resources/hudson/model/View/index_tr.properties b/core/src/main/resources/hudson/model/View/index_tr.properties index 8a586ea4d4..3c513a3bdb 100644 --- a/core/src/main/resources/hudson/model/View/index_tr.properties +++ b/core/src/main/resources/hudson/model/View/index_tr.properties @@ -20,4 +20,4 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Dashboard=Kontrol\ Merkezi +Dashboard=Kontrol Merkezi diff --git a/core/src/main/resources/hudson/model/View/newJob_ja.properties b/core/src/main/resources/hudson/model/View/newJob_ja.properties index d1f954d904..89aac75619 100644 --- a/core/src/main/resources/hudson/model/View/newJob_ja.properties +++ b/core/src/main/resources/hudson/model/View/newJob_ja.properties @@ -22,4 +22,4 @@ NewJob=\u65b0\u898f{0}\u4f5c\u6210 JobName={0}\u540d -CopyExisting=\u65e2\u5b58{0}\u306e\u30b3\u30d4\u30fc \ No newline at end of file +CopyExisting=\u65e2\u5b58{0}\u306e\u30b3\u30d4\u30fc diff --git a/core/src/main/resources/hudson/model/View/newJob_tr.properties b/core/src/main/resources/hudson/model/View/newJob_tr.properties index 265e611f4c..9d998a09d2 100644 --- a/core/src/main/resources/hudson/model/View/newJob_tr.properties +++ b/core/src/main/resources/hudson/model/View/newJob_tr.properties @@ -20,8 +20,8 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -#JobName=\u0130\u015f\ ad\u0131 -#CopyExisting=Varolan\ bir\ i\u015fi\ kopyala +#JobName=\u0130\u015f ad\u0131 +#CopyExisting=Varolan bir i\u015fi kopyala #Copy\ from=Kopyalanacak i\u015f CopyExisting=Varolandan kopyala {0} JobName=isim diff --git a/core/src/main/resources/hudson/model/View/noJob_ja.properties b/core/src/main/resources/hudson/model/View/noJob_ja.properties index 98c9930d49..13a5011c3e 100644 --- a/core/src/main/resources/hudson/model/View/noJob_ja.properties +++ b/core/src/main/resources/hudson/model/View/noJob_ja.properties @@ -21,4 +21,4 @@ # THE SOFTWARE. description_1=\u3053\u306E\u30D3\u30E5\u30FC\u306B\u306F\u30B8\u30E7\u30D6\u306F\u3042\u308A\u307E\u305B\u3093\u3002 -description_2=\u4F55\u304B\u767B\u9332\u3057\u3066\u304F\u3060\u3055\u3044\u3002 \ No newline at end of file +description_2=\u4F55\u304B\u767B\u9332\u3057\u3066\u304F\u3060\u3055\u3044\u3002 diff --git a/core/src/main/resources/hudson/model/View/sidepanel.jelly b/core/src/main/resources/hudson/model/View/sidepanel.jelly index 98cbbbd637..a8d1b128dd 100644 --- a/core/src/main/resources/hudson/model/View/sidepanel.jelly +++ b/core/src/main/resources/hudson/model/View/sidepanel.jelly @@ -29,9 +29,9 @@ THE SOFTWARE. - + - + diff --git a/core/src/main/resources/hudson/model/labels/LabelAtom/configure_ja.properties b/core/src/main/resources/hudson/model/labels/LabelAtom/configure_ja.properties index 36f9adb83f..9652424a99 100644 --- a/core/src/main/resources/hudson/model/labels/LabelAtom/configure_ja.properties +++ b/core/src/main/resources/hudson/model/labels/LabelAtom/configure_ja.properties @@ -23,4 +23,4 @@ Name=\u540d\u524d Save=\u4fdd\u5b58 title={0} \u306e\u8a2d\u5b9a -Description=\u8aac\u660e \ No newline at end of file +Description=\u8aac\u660e diff --git a/core/src/main/resources/hudson/model/queue/CauseOfBlockage/BecauseLabelIsBusy/summary_de.properties b/core/src/main/resources/hudson/model/queue/CauseOfBlockage/BecauseLabelIsBusy/summary_de.properties index 53f9c7ca6c..3a1991cadf 100644 --- a/core/src/main/resources/hudson/model/queue/CauseOfBlockage/BecauseLabelIsBusy/summary_de.properties +++ b/core/src/main/resources/hudson/model/queue/CauseOfBlockage/BecauseLabelIsBusy/summary_de.properties @@ -21,4 +21,4 @@ # THE SOFTWARE. # DO NOT REMOVE EVEN IF SHOWN AS UNUSED -description=Alle Knoten des Labels \u201E{0}\u201C sind besch\u00E4ftigt \ No newline at end of file +description=Alle Knoten des Labels \u201E{0}\u201C sind besch\u00E4ftigt 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 index f1a07f832d..40314e6f56 100644 --- 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 @@ -1,4 +1,4 @@ # This file is under the MIT License by authors # DO NOT REMOVE EVEN IF SHOWN AS UNUSED -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 +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} diff --git a/core/src/main/resources/hudson/model/queue/CauseOfBlockage/BecauseLabelIsOffline/summary_de.properties b/core/src/main/resources/hudson/model/queue/CauseOfBlockage/BecauseLabelIsOffline/summary_de.properties index 7a5d5d73fc..06f3bd4ad7 100644 --- a/core/src/main/resources/hudson/model/queue/CauseOfBlockage/BecauseLabelIsOffline/summary_de.properties +++ b/core/src/main/resources/hudson/model/queue/CauseOfBlockage/BecauseLabelIsOffline/summary_de.properties @@ -22,4 +22,4 @@ # DO NOT REMOVE EVEN IF SHOWN AS UNUSED description=Alle Knoten des Labels \u201E{0}\u201C sind offline -description_no_nodes=Es gibt keine Knoten mit dem Label \u201E{0}\u201C \ No newline at end of file +description_no_nodes=Es gibt keine Knoten mit dem Label \u201E{0}\u201C 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 index 22f0255405..58838d1a31 100644 --- 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 @@ -2,4 +2,4 @@ # DO NOT REMOVE EVEN IF SHOWN AS UNUSED 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 +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 diff --git a/core/src/main/resources/hudson/model/queue/CauseOfBlockage/BecauseNodeIsBusy/summary_de.properties b/core/src/main/resources/hudson/model/queue/CauseOfBlockage/BecauseNodeIsBusy/summary_de.properties index efdb35f8da..4a971157e4 100644 --- a/core/src/main/resources/hudson/model/queue/CauseOfBlockage/BecauseNodeIsBusy/summary_de.properties +++ b/core/src/main/resources/hudson/model/queue/CauseOfBlockage/BecauseNodeIsBusy/summary_de.properties @@ -21,4 +21,4 @@ # THE SOFTWARE. # DO NOT REMOVE EVEN IF SHOWN AS UNUSED -description=Warte auf den n\u00E4chsten freien Build-Prozessor auf {0} \ No newline at end of file +description=Warte auf den n\u00E4chsten freien Build-Prozessor auf {0} 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 index 32ed271ae0..362a50f466 100644 --- 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 @@ -1,4 +1,4 @@ # This file is under the MIT License by authors # DO NOT REMOVE EVEN IF SHOWN AS UNUSED -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 +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} diff --git a/core/src/main/resources/hudson/model/queue/CauseOfBlockage/BecauseNodeIsOffline/summary_de.properties b/core/src/main/resources/hudson/model/queue/CauseOfBlockage/BecauseNodeIsOffline/summary_de.properties index d509b3197b..3a5c2e2bd3 100644 --- a/core/src/main/resources/hudson/model/queue/CauseOfBlockage/BecauseNodeIsOffline/summary_de.properties +++ b/core/src/main/resources/hudson/model/queue/CauseOfBlockage/BecauseNodeIsOffline/summary_de.properties @@ -21,4 +21,4 @@ # THE SOFTWARE. # DO NOT REMOVE EVEN IF SHOWN AS UNUSED -description={0} ist offline \ No newline at end of file +description={0} ist offline 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 index 1535ae53cd..6a686260d7 100644 --- 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 @@ -1,4 +1,4 @@ # This file is under the MIT License by authors # DO NOT REMOVE EVEN IF SHOWN AS UNUSED -description={0} \u0458\u0435 \u0432\u0430\u043D \u043D\u0440\u0435\u0436\u0435 \ No newline at end of file +description={0} \u0458\u0435 \u0432\u0430\u043D \u043D\u0440\u0435\u0436\u0435 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 5eeedc6b3e..d6412638d6 100644 --- a/core/src/main/resources/hudson/model/queue/Messages_de.properties +++ b/core/src/main/resources/hudson/model/queue/Messages_de.properties @@ -20,4 +20,4 @@ # 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 +QueueSorter.installDefaultQueueSorter=Installiere Default-Sortierung der Build-Warteschlage (build queue) diff --git a/core/src/main/resources/hudson/model/queue/Messages_sr.properties b/core/src/main/resources/hudson/model/queue/Messages_sr.properties index db51451ccd..5b1f88d64b 100644 --- a/core/src/main/resources/hudson/model/queue/Messages_sr.properties +++ b/core/src/main/resources/hudson/model/queue/Messages_sr.properties @@ -1,3 +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 +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 diff --git a/core/src/main/resources/hudson/model/queue/_api.jelly b/core/src/main/resources/hudson/model/queue/_api.jelly new file mode 100644 index 0000000000..453f2e5114 --- /dev/null +++ b/core/src/main/resources/hudson/model/queue/_api.jelly @@ -0,0 +1,17 @@ + + + +

      Canceling the build of an item in the Queue

      +

      + To programmatically cancel the build of an item in the Queue, post to this URL. + The id of the item to cancel is expected. + + Response will be: +

        +
      • 204 if the run tied with the given id was successfully cancelled
      • +
      • 422 if the provided id does not exist or match an item that cannot be cancelled
      • +
      • 500 if the provided id exists but Jenkins could not cancel the run
      • +
      +

      + +
      \ 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 753ce023dd..414313947b 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 @@ -20,4 +20,4 @@ # 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 +Free\ Space\ Threshold=Freier Plattenplatz Mindestgrenze diff --git a/core/src/main/resources/hudson/node_monitors/AbstractDiskSpaceMonitor/config_ja.properties b/core/src/main/resources/hudson/node_monitors/AbstractDiskSpaceMonitor/config_ja.properties index 896e36d81a..5936e31e69 100644 --- a/core/src/main/resources/hudson/node_monitors/AbstractDiskSpaceMonitor/config_ja.properties +++ b/core/src/main/resources/hudson/node_monitors/AbstractDiskSpaceMonitor/config_ja.properties @@ -20,4 +20,4 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Free\ Space\ Threshold=\u7A7A\u304D\u5BB9\u91CF\u306E\u95BE\u5024 \ No newline at end of file +Free\ Space\ Threshold=\u7A7A\u304D\u5BB9\u91CF\u306E\u95BE\u5024 diff --git a/core/src/main/resources/hudson/node_monitors/Messages.properties b/core/src/main/resources/hudson/node_monitors/Messages.properties index 658a75aeb9..749b326d2a 100644 --- a/core/src/main/resources/hudson/node_monitors/Messages.properties +++ b/core/src/main/resources/hudson/node_monitors/Messages.properties @@ -32,4 +32,5 @@ 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}. +DiskSpaceMonitorDescriptor.DiskSpace.FreeSpace={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_ru.properties b/core/src/main/resources/hudson/node_monitors/Messages_ru.properties index 3527df350e..fdd829736a 100644 --- a/core/src/main/resources/hudson/node_monitors/Messages_ru.properties +++ b/core/src/main/resources/hudson/node_monitors/Messages_ru.properties @@ -22,4 +22,4 @@ ArchitectureMonitor.DisplayName=\u0410\u0440\u0445\u0438\u0442\u0435\u043A\u0442\u0443\u0440\u0430 ClockMonitor.DisplayName=\u0420\u0430\u0437\u043D\u0438\u0446\u0430 \u0432 \u043D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0435 \u0441\u0438\u0441\u0442\u0435\u043C\u043D\u043E\u0433\u043E \u0432\u0440\u0435\u043C\u0435\u043D\u0438 -DiskSpaceMonitor.DisplayName=\u0421\u0432\u043E\u0431\u043E\u0434\u043D\u043E\u0435 \u0434\u0438\u0441\u043A\u043E\u0432\u043E\u0435 \u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432\u043E \ No newline at end of file +DiskSpaceMonitor.DisplayName=\u0421\u0432\u043E\u0431\u043E\u0434\u043D\u043E\u0435 \u0434\u0438\u0441\u043A\u043E\u0432\u043E\u0435 \u043F\u0440\u043E\u0441\u0442\u0440\u0430\u043D\u0441\u0442\u0432\u043E diff --git a/core/src/main/resources/hudson/node_monitors/Messages_sr.properties b/core/src/main/resources/hudson/node_monitors/Messages_sr.properties index fa6d7a521d..f55592c234 100644 --- a/core/src/main/resources/hudson/node_monitors/Messages_sr.properties +++ b/core/src/main/resources/hudson/node_monitors/Messages_sr.properties @@ -11,4 +11,4 @@ ResponseTimeMonitor.TimeOut=\u0418\u0437\u0441\u0442\u043A\u043B\u043E \u0432\u0 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 +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. diff --git a/core/src/main/resources/hudson/node_monitors/Messages_tr.properties b/core/src/main/resources/hudson/node_monitors/Messages_tr.properties index 02f603ae3f..e433d9be92 100644 --- a/core/src/main/resources/hudson/node_monitors/Messages_tr.properties +++ b/core/src/main/resources/hudson/node_monitors/Messages_tr.properties @@ -22,4 +22,4 @@ ArchitectureMonitor.DisplayName=Mimari ClockMonitor.DisplayName=Saat Fark\u0131 -DiskSpaceMonitor.DisplayName=Diskteki Bo\u015F Alan \ No newline at end of file +DiskSpaceMonitor.DisplayName=Diskteki Bo\u015F Alan diff --git a/core/src/main/resources/hudson/node_monitors/MonitorMarkedNodeOffline/message_bg.properties b/core/src/main/resources/hudson/node_monitors/MonitorMarkedNodeOffline/message_bg.properties index dea163dd1e..a0925ea0c4 100644 --- a/core/src/main/resources/hudson/node_monitors/MonitorMarkedNodeOffline/message_bg.properties +++ b/core/src/main/resources/hudson/node_monitors/MonitorMarkedNodeOffline/message_bg.properties @@ -22,7 +22,7 @@ Dismiss=\ \u041e\u0442\u043a\u0430\u0437\u0432\u0430\u043d\u0435 -# Jenkins took some agents offline because their key health metrics went below a threshold. \ +# Jenkins took some agents offline because their key health metrics went below a threshold. \ # If you don\u2019t want Jenkins to do this, \ # change the setting. blurb=\ 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 c001d0bf65..816f25b9a8 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 @@ -20,4 +20,4 @@ # 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 + Ping-Anwortzeit zu groß bzw. Time-out aufgetreten. diff --git a/core/src/main/resources/hudson/node_monitors/ResponseTimeMonitor/Data/cause_ja.properties b/core/src/main/resources/hudson/node_monitors/ResponseTimeMonitor/Data/cause_ja.properties index 34604111af..2e230b3fda 100644 --- a/core/src/main/resources/hudson/node_monitors/ResponseTimeMonitor/Data/cause_ja.properties +++ b/core/src/main/resources/hudson/node_monitors/ResponseTimeMonitor/Data/cause_ja.properties @@ -20,4 +20,4 @@ # 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\u306E\u5FDC\u7B54\u6642\u9593\u304C\u9577\u3059\u304E\u308B\u304B\u3001\u30BF\u30A4\u30E0\u30A2\u30A6\u30C8\u3067\u3059\u3002 \ No newline at end of file + Ping\u306E\u5FDC\u7B54\u6642\u9593\u304C\u9577\u3059\u304E\u308B\u304B\u3001\u30BF\u30A4\u30E0\u30A2\u30A6\u30C8\u3067\u3059\u3002 diff --git a/core/src/main/resources/hudson/os/solaris/ZFSInstaller/MigrationFailedNotice/message_de.properties b/core/src/main/resources/hudson/os/solaris/ZFSInstaller/MigrationFailedNotice/message_de.properties index f459a5d296..91192a6596 100644 --- a/core/src/main/resources/hudson/os/solaris/ZFSInstaller/MigrationFailedNotice/message_de.properties +++ b/core/src/main/resources/hudson/os/solaris/ZFSInstaller/MigrationFailedNotice/message_de.properties @@ -1,2 +1,2 @@ ZFS\ migration\ failed.=ZFS-Migration fehlgeschlagen. -See\ the\ log\ for\ more\ details=Konsultieren Sie die Logdatei für weitere Details. \ No newline at end of file +See\ the\ log\ for\ more\ details=Konsultieren Sie die Logdatei für weitere Details. diff --git a/core/src/main/resources/hudson/os/solaris/ZFSInstaller/askRootPassword_ja.properties b/core/src/main/resources/hudson/os/solaris/ZFSInstaller/askRootPassword_ja.properties index 04599dca66..d7a87d65e8 100644 --- a/core/src/main/resources/hudson/os/solaris/ZFSInstaller/askRootPassword_ja.properties +++ b/core/src/main/resources/hudson/os/solaris/ZFSInstaller/askRootPassword_ja.properties @@ -26,4 +26,4 @@ Password=\u30D1\u30B9\u30EF\u30FC\u30C9 OK=OK See\ errors...=\u30A8\u30E9\u30FC\u306E\u8A73\u7D30... blurb=\u73FE\u5728\u306E\u30E6\u30FC\u30B6\u30FC\u30A2\u30AB\u30A6\u30F3\u30C8\u306B\u306F\u3001ZFS\u306E\u4F5C\u6210\u306B\u5FC5\u8981\u306A\u6A29\u9650\u304C\u306A\u3044\u3088\u3046\u3067\u3059\u3002 \ - root\u306E\u3088\u3046\u306AZFS\u3092\u4F5C\u6210\u3067\u304D\u308B\u30E6\u30FC\u30B6\u30FC\u540D\u3068\u30D1\u30B9\u30EF\u30FC\u30C9\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002. \ No newline at end of file + root\u306E\u3088\u3046\u306AZFS\u3092\u4F5C\u6210\u3067\u304D\u308B\u30E6\u30FC\u30B6\u30FC\u540D\u3068\u30D1\u30B9\u30EF\u30FC\u30C9\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002. diff --git a/core/src/main/resources/hudson/os/solaris/ZFSInstaller/confirm_ja.properties b/core/src/main/resources/hudson/os/solaris/ZFSInstaller/confirm_ja.properties index 26dbcf3985..7f53a79878 100644 --- a/core/src/main/resources/hudson/os/solaris/ZFSInstaller/confirm_ja.properties +++ b/core/src/main/resources/hudson/os/solaris/ZFSInstaller/confirm_ja.properties @@ -29,4 +29,4 @@ create=ZFS {0} \u3092\u65B0\u898F\u306B\u4F5C\u6210\u3057\u3001\u30C7\u rename={0} \u3092 {0}.backup \u306B\u30EA\u30CD\u30FC\u30E0\u3057\u307E\u3059\u3002 mount=\u4F5C\u6210\u3057\u305FZFS\u3092 {0} \u306B\u30DE\u30A6\u30F3\u30C8\u3057\u307E\u3059\u3002 delete={0}.backup \u3092\u524A\u9664\u3057\u307E\u3059\u3002 -Start\ migration=\u79FB\u884C\u958B\u59CB \ No newline at end of file +Start\ migration=\u79FB\u884C\u958B\u59CB 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 index 2959bbffe9..a4616ae0cb 100644 --- a/core/src/main/resources/hudson/os/solaris/ZFSInstaller/message_sr.properties +++ b/core/src/main/resources/hudson/os/solaris/ZFSInstaller/message_sr.properties @@ -2,4 +2,4 @@ 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 +No,\ thank\ you=\u041D\u0435 \u0445\u0432\u0430\u043B\u0430 diff --git a/core/src/main/resources/hudson/rss20.jelly b/core/src/main/resources/hudson/rss20.jelly index 64a7c9f387..a4076cbe1e 100644 --- a/core/src/main/resources/hudson/rss20.jelly +++ b/core/src/main/resources/hudson/rss20.jelly @@ -23,30 +23,29 @@ THE SOFTWARE. --> -<?xml version="1.0" encoding="UTF-8"?> - - + + <?xml version="1.0" encoding="UTF-8"?> + + + + ${title} + ${app.rootUrl}${url} + ${title} - - - - ${title} - ${rootURL}${url} - ${title} - - - - ${adapter.getEntryTitle(e)} - ${rootURL}${h.encode(adapter.getEntryUrl(e))} - ${adapter.getEntryID(e)} - ${h.rfc822Date(adapter.getEntryTimestamp(e))} - - - - ${desc} - - - - - + + + ${adapter.getEntryTitle(e)} + ${app.rootUrl}${h.encode(adapter.getEntryUrl(e))} + ${adapter.getEntryID(e)} + ${h.rfc822Date(adapter.getEntryTimestamp(e))} + + + + ${desc} + + + + + + diff --git a/core/src/main/resources/hudson/scheduler/Messages_de.properties b/core/src/main/resources/hudson/scheduler/Messages_de.properties index 2ae265b481..28fb211420 100644 --- a/core/src/main/resources/hudson/scheduler/Messages_de.properties +++ b/core/src/main/resources/hudson/scheduler/Messages_de.properties @@ -23,7 +23,7 @@ BaseParser.StartEndReversed=Meinten Sie {0}-{1}? BaseParser.MustBePositive=Schrittweite muss positiv sein, ist aber {0} BaseParser.OutOfRange={0} ist ein ungültiger Wert. Muss zwischen {1} und {2} liegen. -CronTab.do_you_really_mean_every_minute_when_you=Meinen sie mit \u201E{0}\u201C wirklich \u201Ejede Minute\u201C? Vielleicht meinen Sie eher \u201E{1}\u201C +CronTab.do_you_really_mean_every_minute_when_you=Meinen Sie mit \u201E{0}\u201C wirklich \u201Ejede Minute\u201C? Vielleicht meinen Sie eher \u201E{1}\u201C CronTab.short_cycles_in_the_day_of_month_field_w=Kleine Schrittweiten im Tag-Feld führen am Monatsende zu Unregelmäßigkeiten. CronTab.spread_load_evenly_by_using_rather_than_=Verwenden Sie zur gleichmäßigen Lastverteilung \u201E{0}\u201C statt \u201E{1}\u201C CronTabList.InvalidInput=Ungültige Eingabe: \u201E{0}\u201C: {1} diff --git a/core/src/main/resources/hudson/scheduler/Messages_ja.properties b/core/src/main/resources/hudson/scheduler/Messages_ja.properties index c411cfa636..4567783958 100644 --- a/core/src/main/resources/hudson/scheduler/Messages_ja.properties +++ b/core/src/main/resources/hudson/scheduler/Messages_ja.properties @@ -27,4 +27,4 @@ CronTab.do_you_really_mean_every_minute_when_you="{0}"\u3068\u8a2d\u5b9a\u3057\u CronTab.short_cycles_in_the_day_of_month_field_w=\ Short cycles in the day-of-month field will behave oddly near the end of a month CronTab.spread_load_evenly_by_using_rather_than_="{1}"\u3088\u308a\u3082\u3001"{0}"\u3092\u4f7f\u7528\u3057\u3066\u9593\u9694\u3092\u305b\u3063\u3066\u3044\u3057\u3066\u304f\u3060\u3055\u3044\u3002 -CronTabList.InvalidInput=\u4e0d\u6b63\u306a\u5165\u529b: "{0}": {1} \ No newline at end of file +CronTabList.InvalidInput=\u4e0d\u6b63\u306a\u5165\u529b: "{0}": {1} diff --git a/core/src/main/resources/hudson/scheduler/Messages_nl.properties b/core/src/main/resources/hudson/scheduler/Messages_nl.properties index d27aaa0652..e480452b8b 100644 --- a/core/src/main/resources/hudson/scheduler/Messages_nl.properties +++ b/core/src/main/resources/hudson/scheduler/Messages_nl.properties @@ -23,4 +23,4 @@ BaseParser.StartEndReversed=U bedoelde misschien {0}-{1}? BaseParser.MustBePositive=Stapgroote moet positief zijn, maar {0} werd opgegeven. BaseParser.OutOfRange={0} is een ongeldige waarde. Waarde moet tussen {1} en {2} liggen -CronTabList.InvalidInput=Ongeldige invoer: "{0}": {1} \ No newline at end of file +CronTabList.InvalidInput=Ongeldige invoer: "{0}": {1} diff --git a/core/src/main/resources/hudson/scheduler/Messages_ru.properties b/core/src/main/resources/hudson/scheduler/Messages_ru.properties index 12c207ea02..34e385597d 100644 --- a/core/src/main/resources/hudson/scheduler/Messages_ru.properties +++ b/core/src/main/resources/hudson/scheduler/Messages_ru.properties @@ -23,4 +23,4 @@ BaseParser.StartEndReversed=\u0412\u044b \u0438\u043c\u0435\u043b\u0438 \u0432 \u0432\u0438\u0434\u0443 {0}-{1}? BaseParser.MustBePositive=\u0448\u0430\u0433 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c, \u043d\u043e \u044f \u0432\u0438\u0436\u0443 {0} BaseParser.OutOfRange={0} \u043d\u0435\u0432\u0435\u0440\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u0414\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 {1} \u0438 {2} -CronTabList.InvalidInput=\u041d\u0435\u0432\u0435\u0440\u043d\u043e \u0432\u0432\u0435\u0434\u0435\u043d\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: "{0}": {1} \ No newline at end of file +CronTabList.InvalidInput=\u041d\u0435\u0432\u0435\u0440\u043d\u043e \u0432\u0432\u0435\u0434\u0435\u043d\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435: "{0}": {1} diff --git a/core/src/main/resources/hudson/scheduler/Messages_sr.properties b/core/src/main/resources/hudson/scheduler/Messages_sr.properties index 5b115ec973..12bda89edf 100644 --- a/core/src/main/resources/hudson/scheduler/Messages_sr.properties +++ b/core/src/main/resources/hudson/scheduler/Messages_sr.properties @@ -6,4 +6,4 @@ CronTab.do_you_really_mean_every_minute_when_you=\u0414\u0430\u043B\u0438 \u0437 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 +CronTabList.InvalidInput=\u041D\u0435\u0438\u0441\u043F\u0440\u0430\u0432\u0430\u043D \u0443\u043D\u043E\u0441: "{0}": {1} diff --git a/core/src/main/resources/hudson/scheduler/Messages_tr.properties b/core/src/main/resources/hudson/scheduler/Messages_tr.properties index 8bfabf772f..70f795debf 100644 --- a/core/src/main/resources/hudson/scheduler/Messages_tr.properties +++ b/core/src/main/resources/hudson/scheduler/Messages_tr.properties @@ -23,4 +23,4 @@ BaseParser.StartEndReversed=Bunu mu demek istediniz : {0}-{1}? BaseParser.MustBePositive=ad\u0131m\u0131n pozitif olmas\u0131 laz\u0131m, ama {0} bulundu BaseParser.OutOfRange={0} ge\u00e7ersiz bir de\u011fer. {1} ile {2} aras\u0131\u0131nda olmal\u0131. -CronTabList.InvalidInput=Ge\u00e7ersiz de\u011fer: "{0}": {1} \ No newline at end of file +CronTabList.InvalidInput=Ge\u00e7ersiz de\u011fer: "{0}": {1} diff --git a/core/src/main/resources/hudson/scm/AbstractScmTagAction/badge.jelly b/core/src/main/resources/hudson/scm/AbstractScmTagAction/badge.jelly index 2cc2b6391e..05010a6bbd 100644 --- a/core/src/main/resources/hudson/scm/AbstractScmTagAction/badge.jelly +++ b/core/src/main/resources/hudson/scm/AbstractScmTagAction/badge.jelly @@ -25,6 +25,6 @@ THE SOFTWARE. - + \ No newline at end of file diff --git a/core/src/main/resources/hudson/scm/EmptyChangeLogSet/digest_tr.properties b/core/src/main/resources/hudson/scm/EmptyChangeLogSet/digest_tr.properties index 40ac076fb4..13ff5647f7 100644 --- a/core/src/main/resources/hudson/scm/EmptyChangeLogSet/digest_tr.properties +++ b/core/src/main/resources/hudson/scm/EmptyChangeLogSet/digest_tr.properties @@ -20,4 +20,4 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -No\ changes.=Herhangi\ bir\ de\u011fi\u015fiklik\ yok. +No\ changes.=Herhangi bir de\u011fi\u015fiklik yok. diff --git a/core/src/main/resources/hudson/scm/Messages_pl.properties b/core/src/main/resources/hudson/scm/Messages_pl.properties index 89b69764f0..a602a90f2e 100644 --- a/core/src/main/resources/hudson/scm/Messages_pl.properties +++ b/core/src/main/resources/hudson/scm/Messages_pl.properties @@ -1,6 +1,6 @@ # The MIT License # -# Copyright (c) 2016, Damian Szczepanik +# Copyright (c) 2016-2019, 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,4 +21,4 @@ # THE SOFTWARE. NullSCM.DisplayName=Brak SCM.Permissions.Title=Repozytorium kodu -SCM.TagPermission.Description=To uprawnienie pozwala u\u017Cytkownikom tworzy\u0107w repozytorium kodu etykiety dla danego budowania. +SCM.TagPermission.Description=To uprawnienie pozwala u\u017Cytkownikom tworzy\u0107 w 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 index da10fd769e..d979f215c9 100644 --- a/core/src/main/resources/hudson/scm/Messages_sr.properties +++ b/core/src/main/resources/hudson/scm/Messages_sr.properties @@ -2,4 +2,4 @@ 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 +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. diff --git a/core/src/main/resources/hudson/scm/SCM/project-changes_ja.properties b/core/src/main/resources/hudson/scm/SCM/project-changes_ja.properties index a86d6e720c..e9c8a5568f 100644 --- a/core/src/main/resources/hudson/scm/SCM/project-changes_ja.properties +++ b/core/src/main/resources/hudson/scm/SCM/project-changes_ja.properties @@ -22,4 +22,4 @@ No\ builds.=\u30d3\u30eb\u30c9\u3057\u3066\u3044\u307e\u305b\u3093\u3002 No\ changes\ in\ any\ of\ the\ builds.=\u4eca\u307e\u3067\u306e\u30d3\u30eb\u30c9\u3067\u5909\u66f4\u70b9\u306f\u3042\u308a\u307e\u305b\u3093\u3002 -detail=\u8a73\u7d30 \ No newline at end of file +detail=\u8a73\u7d30 diff --git a/core/src/main/resources/hudson/scm/SCM/project-changes_tr.properties b/core/src/main/resources/hudson/scm/SCM/project-changes_tr.properties index 73d879d528..bb1ca7b874 100644 --- a/core/src/main/resources/hudson/scm/SCM/project-changes_tr.properties +++ b/core/src/main/resources/hudson/scm/SCM/project-changes_tr.properties @@ -21,4 +21,4 @@ # THE SOFTWARE. No\ builds.=Herhangi bir yap\u0131land\u0131rm\a yok. -No\ changes\ in\ any\ of\ the\ builds.=Yap\u0131land\u0131rmalarda\ hi\u00e7birinde\ de\u011fi\u015fiklik\ yok. +No\ changes\ in\ any\ of\ the\ builds.=Yap\u0131land\u0131rmalarda hi\u00e7birinde de\u011fi\u015fiklik yok. diff --git a/core/src/main/resources/hudson/search/Messages_sr.properties b/core/src/main/resources/hudson/search/Messages_sr.properties index 3fc20ed360..7abcdada48 100644 --- a/core/src/main/resources/hudson/search/Messages_sr.properties +++ b/core/src/main/resources/hudson/search/Messages_sr.properties @@ -1,3 +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 +UserSearchProperty.DisplayName=\u041E\u043F\u0446\u0438\u0458\u0435 \u043F\u0440\u0435\u0442\u0440\u0430\u0433\u0435 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 da02086828..9248533959 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 100 more + result has been truncated, see 100 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 5e617081e6..c2d2e2fe3f 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 @@ -21,4 +21,4 @@ # THE SOFTWARE. Nothing\ seems\ to\ match.=Keine Treffer gefunden. -Search\ for=Suche nach \ No newline at end of file +Search\ for=Suche nach diff --git a/core/src/main/resources/hudson/security/FederatedLoginService/UnclaimedIdentityException/error_bg.properties b/core/src/main/resources/hudson/security/FederatedLoginService/UnclaimedIdentityException/error_bg.properties index 886bed9418..50ff8022a6 100644 --- a/core/src/main/resources/hudson/security/FederatedLoginService/UnclaimedIdentityException/error_bg.properties +++ b/core/src/main/resources/hudson/security/FederatedLoginService/UnclaimedIdentityException/error_bg.properties @@ -36,4 +36,4 @@ blurb=\
    • \u043d\u0430\u0442\u0438\u0441\u043d\u0435\u0442\u0435 \u0438\u043c\u0435\u0442\u043e \u0441\u0438;
    • \
    • \u043d\u0430\u0442\u0438\u0441\u043d\u0435\u0442\u0435 \u0432\u0440\u044a\u0437\u043a\u0430\u0442\u0430 \u0437\u0430 \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438;
    • \
    • \u0441\u0432\u044a\u0440\u0436\u0435\u0442\u0435 \u043d\u043e\u0432 {0}.
    • \ - \ No newline at end of file + diff --git a/core/src/main/resources/hudson/security/FullControlOnceLoggedInAuthorizationStrategy/help_tr.html b/core/src/main/resources/hudson/security/FullControlOnceLoggedInAuthorizationStrategy/help_tr.html index 942af29935..35ed338f46 100644 --- a/core/src/main/resources/hudson/security/FullControlOnceLoggedInAuthorizationStrategy/help_tr.html +++ b/core/src/main/resources/hudson/security/FullControlOnceLoggedInAuthorizationStrategy/help_tr.html @@ -5,7 +5,7 @@

      Bu mod, kullanıcları, aksiyon almak için giriş yapmaya zorlar. Böylece kimin ne yaptığı ile ilgili kayıtları tutabilirsiniz. Bu ayarı açmanın bir sebebi de - Jenkins'ı public olarak kullanıma açmış olmaktır. Bu şekilde, sadece güvenilir + Jenkins'i public olarak kullanıma açmış olmaktır. Bu şekilde, sadece güvenilir kullanıcların kullanıcı hesapları olur, diğer tüm herkes kullanıcı girişi yapmadan (anonymous olarak) kullanır. \ 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 index 5d8616dada..f0aaca4cc7 100644 --- a/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/config_sr.properties +++ b/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/config_sr.properties @@ -20,4 +20,4 @@ slaves.description=\u0421\u043F\u0438\u0441\u0430\u043A \u043F\u043E\u043C\u043E 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 +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 diff --git a/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/config_tr.properties b/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/config_tr.properties index abbb44ecbb..a8a0f390c1 100644 --- a/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/config_tr.properties +++ b/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/config_tr.properties @@ -21,7 +21,7 @@ # THE SOFTWARE. slaves.description=\ - Bu master Jenkins'a kaydolmu\u015f slave nodlar\u0131n listesidir. B\u00fcy\u00fck i\u015flerin idare edilebilmesi i\u00e7in i\u015fler\ + Bu master Jenkins'e kaydolmu\u015f slave nodlar\u0131n listesidir. B\u00fcy\u00fck i\u015flerin idare edilebilmesi i\u00e7in i\u015fler\ slave nodlarda \u00e7al\u0131\u015ft\u0131r\u0131lmak \u00fczere ayarlanabilir. no.such.JDK=Herhangi bir JDK yok Home\ directory=Ana dizin 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 651dab0aef..70a68be87f 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 @@ -6,12 +6,12 @@ $TOMCAT_HOME/conf/tomcat-users.xml dosyası dikkate alınır)

      - Jenkins'ı intranet (veya başka "güvenilir" bir ortamda) içerisinde kullanıyorsanız, bu kutucuğu + Jenkins'i intranet (veya başka "güvenilir" bir ortamda) içerisinde kullanıyorsanız, bu kutucuğu işaretlemeyebilirsiniz. Bu durumda proje sahipleri, sizi rahatsız etmeden projelerini yapılandırabilirler.

      - Jenkins'ı internete açacaksanız, güvenliği mutlaka devreye alın. Jenkins'ın çalıştırdığı işlemleri + Jenkins'i internete açacaksanız, güvenliği mutlaka devreye alın. Jenkins'in çalıştırdığı işlemleri düşünürseniz, güvenlik ayarı olamayan bir Jenkins, hacklenmenin kesin bir yoludur.

      diff --git a/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/index.groovy b/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/index.groovy index 8a28265d1a..6e19623d43 100644 --- a/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/index.groovy +++ b/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/index.groovy @@ -25,14 +25,21 @@ l.layout(norefresh:true, permission:app.ADMINISTER, title:my.displayName, csscla set("instance",my) set("descriptor", my.descriptor) - f.optionalBlock( field:"useSecurity", title:_("Enable security"), checked:app.useSecurity) { + f.section(title:_("Authentication")) { f.entry() { f.checkbox(title:_("Disable remember me"), field: "disableRememberMe") } - f.entry(title:_("Access Control")) { + f.entry(title:_("Security Realm")) { table(style:"width:100%") { f.descriptorRadioList(title:_("Security Realm"),varName:"realm", instance:app.securityRealm, descriptors:h.filterDescriptors(app, SecurityRealm.all())) + } + } + } + + f.section(title:_("Authorization")) { + f.entry(title:_("Strategy")) { + table(style:"width:100%") { f.descriptorRadioList(title:_("Authorization"), varName:"authorization", instance:app.authorizationStrategy, descriptors:h.filterDescriptors(app, AuthorizationStrategy.all())) } } diff --git a/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/index_sr.properties b/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/index_sr.properties index abb41de481..f0548da6c8 100644 --- a/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/index_sr.properties +++ b/core/src/main/resources/hudson/security/GlobalSecurityConfiguration/index_sr.properties @@ -8,4 +8,4 @@ Security\ Realm=\u041E\u0431\u043B\u0430\u0441\u0442 \u0431\u0435\u0437\u0431\u0 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 +TCP\ port\ for\ JNLP\ agents=\u041F\u043E\u0440\u0442 TCP \u0437\u0430 JNLP \u0430\u0433\u0435\u043D\u0442\u0435 diff --git a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/_entryForm.jelly b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/_entryForm.jelly index 69509462d5..3a0bd5627b 100644 --- a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/_entryForm.jelly +++ b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/_entryForm.jelly @@ -24,23 +24,41 @@ THE SOFTWARE. - + + + + Context where the page is loaded. + + + Title of the HTML page. Rendered in the page content inside a <h1>. + + + The method to call from within the HudsonPrivateSecurityRealm. + + + Determines if the tag will include the captcha. + + + The wrapper for the data provided by the user and the error message(s) if any. Is null on first form display. + + +

      ${title}

      -
      +
      -
      +
      ${data.errorMessage}
      -
      +
      ${error.value}
      + ${%User ID} ${%Name} ${%Last Commit Activity}
      - + @@ -55,17 +73,17 @@ THE SOFTWARE. - - - - + + + + diff --git a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/_entryFormPage.jelly b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/_entryFormPage.jelly index 8009ad6518..cb30e27bdf 100644 --- a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/_entryFormPage.jelly +++ b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/_entryFormPage.jelly @@ -22,28 +22,36 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --> - + - + + + + Corresponds to the "it" of Jelly, meaning the context where the page is loaded. + + + Title of the HTML page. + Rendered into <title> tag, in the page content inside a <h1> and as the label of the submit button. + + + The method to call from within the HudsonPrivateSecurityRealm. + + + Determines if the tag will include the captcha. + + + The wrapper for the data provided by the user and the error message(s) if any. Is null on first form display. + + - - - + - - + + - diff --git a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/_entryFormPage/resources.css b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/_entryFormPage/resources.css new file mode 100644 index 0000000000..18e0744642 --- /dev/null +++ b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/_entryFormPage/resources.css @@ -0,0 +1,12 @@ +input { + /* match width with captcha image */ + width:200px; +} + +.form-content { + margin: 2em; +} + +.form-content .error { + margin-bottom: 1em; +} diff --git a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/_entryForm_ja.properties b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/_entryForm_ja.properties index 11335ecb98..64b5158a3d 100644 --- a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/_entryForm_ja.properties +++ b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/_entryForm_ja.properties @@ -26,4 +26,4 @@ Password=\u30d1\u30b9\u30ef\u30fc\u30c9 Confirm\ password=\u30d1\u30b9\u30ef\u30fc\u30c9\u306e\u78ba\u8a8d Full\ name=\u30d5\u30eb\u30cd\u30fc\u30e0 E-mail\ address=\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9 -Enter\ text\ as\ shown=\u30c6\u30ad\u30b9\u30c8 \ No newline at end of file +Enter\ text\ as\ shown=\u30c6\u30ad\u30b9\u30c8 diff --git a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/addUser.jelly b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/addUser.jelly index daacc17bfc..b9b3f246c7 100644 --- a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/addUser.jelly +++ b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/addUser.jelly @@ -26,6 +26,6 @@ THE SOFTWARE. Page for admin to create a new user --> - - - \ No newline at end of file + + + diff --git a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/addUser_ja.properties b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/addUser_ja.properties index 72d070a158..c94702844c 100644 --- a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/addUser_ja.properties +++ b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/addUser_ja.properties @@ -20,4 +20,4 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Create\ User=\u30e6\u30fc\u30b6\u30fc\u4f5c\u6210 \ No newline at end of file +Create\ User=\u30e6\u30fc\u30b6\u30fc\u4f5c\u6210 diff --git a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/config.jelly b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/config.jelly index 9757152168..a36f9c14f0 100644 --- a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/config.jelly +++ b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/config.jelly @@ -23,8 +23,7 @@ THE SOFTWARE. --> - + diff --git a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/config_ja.properties b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/config_ja.properties index dcca0f1b99..0e2419458c 100644 --- a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/config_ja.properties +++ b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/config_ja.properties @@ -22,4 +22,4 @@ Allow\ users\ to\ sign\ up=\u30e6\u30fc\u30b6\u30fc\u306b\u30b5\u30a4\u30f3\u30a2\u30c3\u30d7\u3092\u8a31\u53ef Enable\ captcha\ on\ sign\ up=\u30b5\u30a4\u30f3\u30a2\u30c3\u30d7\u306b\u30ad\u30e3\u30d7\u30c1\u30e3\u3092\u4f7f\u7528\u3059\u308b -Captcha\ Support=\u30ad\u30e3\u30d7\u30c1\u30e3\u306e\u30b5\u30dd\u30fc\u30c8 \ No newline at end of file +Captcha\ Support=\u30ad\u30e3\u30d7\u30c1\u30e3\u306e\u30b5\u30dd\u30fc\u30c8 diff --git a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/firstUser.jelly b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/firstUser.jelly index 6ebd369ae0..b3568d1a6e 100644 --- a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/firstUser.jelly +++ b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/firstUser.jelly @@ -26,6 +26,6 @@ THE SOFTWARE. This is used to create the first user. --> - - - \ No newline at end of file + + + diff --git a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/firstUser_ja.properties b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/firstUser_ja.properties index 4f55a66ebe..935d69865e 100644 --- a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/firstUser_ja.properties +++ b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/firstUser_ja.properties @@ -20,4 +20,4 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Create\ First\ Admin\ User=\u7ba1\u7406\u8005\u306e\u4f5c\u6210 \ No newline at end of file +Create\ First\ Admin\ User=\u7ba1\u7406\u8005\u306e\u4f5c\u6210 diff --git a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/index.jelly b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/index.jelly index a7cad84726..29d3ffc4a2 100644 --- a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/index.jelly +++ b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/index.jelly @@ -23,7 +23,7 @@ THE SOFTWARE. --> - + @@ -32,20 +32,20 @@ THE SOFTWARE.
      ${%Username}:
      ${%Password}:
      ${%E-mail address}:
      ${%E-mail address}:
      ${%Enter text as shown}:
      - [${%captcha}] + [${%captcha}]
      - - - + diff --git a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/index_fr.properties b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/index_fr.properties index 48ff3aa21d..a9b251eb4d 100644 --- a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/index_fr.properties +++ b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/index_fr.properties @@ -21,5 +21,5 @@ # THE SOFTWARE. Users=Utilisateurs -blurb=Ces utilisateurs peuvent se logguer sur Jenkins. C''est le groupe contenant cette liste, qui contient \u00E9galement les utilisateurs cr\u00E9\u00E9s automatiquement qui ont simplement fait des commits sur certains projets et n''ont pas d''acc\u00E8s direct \u00E0 Jenkins. +blurb=Ces utilisateurs peuvent se logguer sur Jenkins. C''est le groupe contenant cette liste, qui contient \u00E9galement les utilisateurs cr\u00E9\u00E9s automatiquement qui ont simplement fait des commits sur certains projets et n''ont pas d''acc\u00E8s direct \u00E0 Jenkins. Name=Nom diff --git a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/index_nl.properties b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/index_nl.properties index f8ec6653a7..0274709c47 100644 --- a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/index_nl.properties +++ b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/index_nl.properties @@ -3,4 +3,4 @@ Name=Naam User\ Id=Gebruikersnaam Users=Gebruikers -blurb=Deze gebruikers kunnen op Jenkins inloggen. Dit is een sub set van deze lijst, deze bevat ook automatisch aangemaakte gebruikers die hebben bijgedragen bij een of meer projecten maar die geen directe toegang tot Jenkins hebben. +blurb=Deze gebruikers kunnen op Jenkins inloggen. Dit is een sub set van deze lijst, deze bevat ook automatisch aangemaakte gebruikers die hebben bijgedragen bij een of meer projecten maar die geen directe toegang tot Jenkins hebben. diff --git a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/index_tr.properties b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/index_tr.properties index 027da6ee70..2cffc93a78 100644 --- a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/index_tr.properties +++ b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/index_tr.properties @@ -21,7 +21,7 @@ # THE SOFTWARE. blurb=\ -Bu kullan\u0131c\u0131vlar Jenkins'da oturum a\u00e7abilir. Bu liste, buradakinin bir \u00fcst k\u00fcmesidir, +Bu kullan\u0131c\u0131vlar Jenkins''de oturum a\u00e7abilir. Bu liste, buradakinin bir \u00fcst k\u00fcmesidir, \ ayn\u0131 zamanda baz\u0131 projelerde commit i\u015flemi yapan, fakat direk Jenkins eri\u015fimi olmayan ve otomatik olarak yarat\u0131lan \ kullan\u0131c\u0131lar\u0131 da i\u00e7erir Name=\u0130sim diff --git a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/loginLink.jelly b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/loginLink.jelly index c2ef8305fa..ba75e740a8 100644 --- a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/loginLink.jelly +++ b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/loginLink.jelly @@ -23,10 +23,10 @@ THE SOFTWARE. --> - + | ${%sign up} - \ No newline at end of file + diff --git a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/sidepanel.jelly b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/sidepanel.jelly index 8d864d01e9..8e3c84edcc 100644 --- a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/sidepanel.jelly +++ b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/sidepanel.jelly @@ -23,13 +23,13 @@ THE SOFTWARE. --> - + - - - + + + - \ No newline at end of file + diff --git a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/sidepanel_ja.properties b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/sidepanel_ja.properties index 877461fa0a..bf7d7f43c4 100644 --- a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/sidepanel_ja.properties +++ b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/sidepanel_ja.properties @@ -22,4 +22,4 @@ Back\ to\ Dashboard=\u30c0\u30c3\u30b7\u30e5\u30dc\u30fc\u30c9\u3078\u623b\u308b Manage\ Jenkins=Jenkins\u306e\u7ba1\u7406 -Create\ User=\u30e6\u30fc\u30b6\u30fc\u4f5c\u6210 \ No newline at end of file +Create\ User=\u30e6\u30fc\u30b6\u30fc\u4f5c\u6210 diff --git a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/signup.jelly b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/signup.jelly index 3792702fd8..f06d8cf782 100644 --- a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/signup.jelly +++ b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/signup.jelly @@ -27,19 +27,14 @@ THE SOFTWARE. --> - + - - - - - ${h.initPageVariables(context)} @@ -305,4 +300,5 @@ THE SOFTWARE. + diff --git a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/signupWithFederatedIdentity.jelly b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/signupWithFederatedIdentity.jelly index 8daec8d381..83f9eef9ec 100644 --- a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/signupWithFederatedIdentity.jelly +++ b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/signupWithFederatedIdentity.jelly @@ -26,6 +26,6 @@ THE SOFTWARE. User self sign up page. --> - - - \ No newline at end of file + + + diff --git a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/signupWithFederatedIdentity_ja.properties b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/signupWithFederatedIdentity_ja.properties index 270ea682f4..4c7d697adf 100644 --- a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/signupWithFederatedIdentity_ja.properties +++ b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/signupWithFederatedIdentity_ja.properties @@ -20,4 +20,4 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Sign\ up=\u30b5\u30a4\u30f3\u30a2\u30c3\u30d7 \ No newline at end of file +Sign\ up=\u30b5\u30a4\u30f3\u30a2\u30c3\u30d7 diff --git a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/signup_ja.properties b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/signup_ja.properties index 270ea682f4..4c7d697adf 100644 --- a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/signup_ja.properties +++ b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/signup_ja.properties @@ -20,4 +20,4 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Sign\ up=\u30b5\u30a4\u30f3\u30a2\u30c3\u30d7 \ No newline at end of file +Sign\ up=\u30b5\u30a4\u30f3\u30a2\u30c3\u30d7 diff --git a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/success.jelly b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/success.jelly index 59363c6d1c..a6f137e1a2 100644 --- a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/success.jelly +++ b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/success.jelly @@ -23,7 +23,7 @@ THE SOFTWARE. --> - + diff --git a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/success_ja.properties b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/success_ja.properties index 8003fe97fd..f981da90b1 100644 --- a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/success_ja.properties +++ b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/success_ja.properties @@ -21,4 +21,4 @@ # THE SOFTWARE. Success=\u6210\u529F -description=\u30ED\u30B0\u30A4\u30F3\u3057\u307E\u3057\u305F\u3002\u30C8\u30C3\u30D7\u306B\u623B\u308A\u307E\u3059\u3002 \ No newline at end of file +description=\u30ED\u30B0\u30A4\u30F3\u3057\u307E\u3057\u305F\u3002\u30C8\u30C3\u30D7\u306B\u623B\u308A\u307E\u3059\u3002 diff --git a/core/src/main/resources/hudson/security/LegacyAuthorizationStrategy/help_tr.html b/core/src/main/resources/hudson/security/LegacyAuthorizationStrategy/help_tr.html index 492da226ab..f42f63b82d 100644 --- a/core/src/main/resources/hudson/security/LegacyAuthorizationStrategy/help_tr.html +++ b/core/src/main/resources/hudson/security/LegacyAuthorizationStrategy/help_tr.html @@ -1,5 +1,5 @@
      - Jenkins'ın 1.164 sürümünden önceki güvenlik davranışıdır. Yani, kullanıcı "admin" + Jenkins'in 1.164 sürümünden önceki güvenlik davranışıdır. Yani, kullanıcı "admin" rolünde ise Jenkins üzerinde tam kontrole sahiptir, aksi takdirde sadece okuma hakkına sahip olacaktır.
      \ No newline at end of file diff --git a/core/src/main/resources/hudson/security/LegacySecurityRealm/help_tr.html b/core/src/main/resources/hudson/security/LegacySecurityRealm/help_tr.html index 592048fca3..ff43926126 100644 --- a/core/src/main/resources/hudson/security/LegacySecurityRealm/help_tr.html +++ b/core/src/main/resources/hudson/security/LegacySecurityRealm/help_tr.html @@ -4,10 +4,10 @@
      1. - Jenkins'ı 1.164'ten önceki bir versiyonundan beri kullanıyor ve davranış şeklini değiştirmek istemiyorsanız. + Jenkins'i 1.164'ten önceki bir versiyonundan beri kullanıyor ve davranış şeklini değiştirmek istemiyorsanız.
      2. - Container'ınızı doğru güvenlik ayarları ile konfigüre ettiyseniz ve Jenkins'ının da buna uymasını istiyorsanız. + Container'ınızı doğru güvenlik ayarları ile konfigüre ettiyseniz ve Jenkins'in de buna uymasını istiyorsanız. (Bazı durumlarda, container, kullanıcının kullanmak istediği güvenlik metodu için daha iyi dokümantasyon veya daha kendine has altyapı sağlayabilir)
      3. diff --git a/core/src/main/resources/hudson/security/Messages.properties b/core/src/main/resources/hudson/security/Messages.properties index 06df37e231..03774c8251 100644 --- a/core/src/main/resources/hudson/security/Messages.properties +++ b/core/src/main/resources/hudson/security/Messages.properties @@ -69,3 +69,5 @@ PAMSecurityRealm.Uid=uid: {0} # not in use Permission.Permissions.Title=N/A AccessDeniedException2.MissingPermission={0} is missing the {1} permission + +NoneSecurityRealm.DisplayName=None diff --git a/core/src/main/resources/hudson/security/Messages_sr.properties b/core/src/main/resources/hudson/security/Messages_sr.properties index 0e944f27fb..d615ba2e37 100644 --- a/core/src/main/resources/hudson/security/Messages_sr.properties +++ b/core/src/main/resources/hudson/security/Messages_sr.properties @@ -33,4 +33,4 @@ 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 +AccessDeniedException2.MissingPermission={0} \u0444\u0430\u043B\u0438 \u043E\u0432\u043B\u0430\u0448\u045B\u0435\u045A\u0435 {1} diff --git a/core/src/main/resources/hudson/security/SecurityRealm/signup.jelly b/core/src/main/resources/hudson/security/SecurityRealm/signup.jelly index 9f054b876c..3609d38405 100644 --- a/core/src/main/resources/hudson/security/SecurityRealm/signup.jelly +++ b/core/src/main/resources/hudson/security/SecurityRealm/signup.jelly @@ -22,7 +22,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --> - + diff --git a/core/src/main/resources/hudson/security/WhoAmI/index.jelly b/core/src/main/resources/hudson/security/WhoAmI/index.jelly index baa2c046b0..695340024b 100644 --- a/core/src/main/resources/hudson/security/WhoAmI/index.jelly +++ b/core/src/main/resources/hudson/security/WhoAmI/index.jelly @@ -61,31 +61,35 @@ THE SOFTWARE. -
      - - - - - - -
      + ${%User ID} ${%Name} +
      ${user.id} ${user} - + - +
      Details:${auth.details}
      toString:${auth}

      Request Headers

      - - - - - - - - - - + + + + + + + + + + + + + + + + + + + +
      ${n} - ${values[0]} -
      ${v}
      ${n} + (redacted for security reasons) +
      ${n} + ${values[0]} +
      ${v}
      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 index e81a8855ea..15a86fb60a 100644 --- a/core/src/main/resources/hudson/security/csrf/GlobalCrumbIssuerConfiguration/config_sr.properties +++ b/core/src/main/resources/hudson/security/csrf/GlobalCrumbIssuerConfiguration/config_sr.properties @@ -2,4 +2,4 @@ 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 +Crumb\ Algorithm=\u0410\u043B\u0433\u043E\u0440\u0438\u0442\u0430\u043C \u043C\u0440\u0432\u0438\u0446\u0430 diff --git a/core/src/main/resources/hudson/security/csrf/Messages_sr.properties b/core/src/main/resources/hudson/security/csrf/Messages_sr.properties index b67ab3e3df..cf47eed5d8 100644 --- a/core/src/main/resources/hudson/security/csrf/Messages_sr.properties +++ b/core/src/main/resources/hudson/security/csrf/Messages_sr.properties @@ -1,3 +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 +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 diff --git a/core/src/main/resources/hudson/PluginManager/sites_ja.properties b/core/src/main/resources/hudson/slaves/DumbSlave/newInstanceDetail_pl.properties similarity index 70% rename from core/src/main/resources/hudson/PluginManager/sites_ja.properties rename to core/src/main/resources/hudson/slaves/DumbSlave/newInstanceDetail_pl.properties index 509914943f..6ebde5e1c4 100644 --- a/core/src/main/resources/hudson/PluginManager/sites_ja.properties +++ b/core/src/main/resources/hudson/slaves/DumbSlave/newInstanceDetail_pl.properties @@ -1,6 +1,6 @@ # The MIT License # -# Copyright (c) 2004-2010, Sun Microsystems, Inc., Kohsuke Kawaguchi, Seiji Sogabe +# Copyright (c) 2019, 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,8 @@ # 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...=\u8ffd\u52a0... -Remove=\u524a\u9664 -Update\ Center=\u30a2\u30c3\u30d7\u30c7\u30fc\u30c8\u30bb\u30f3\u30bf\u30fc +detail=\ + Dodaje do Jenkinsa sta\u0142ego agenta. Jest on nazwany "sta\u0142ym", poniewa\u017C Jenkins nie wspiera \ + zaawansowanej integracji z takimi agentami, takiej jak dynamiczny provisioning. \ + Wybierz ten typ agenta, je\u015Bli inne typy nie pasuj\u0105 — na przyk\u0142ad, je\u015Bli dodano \ + komputer fizyczny lub wirtualn\u0105 maszyn\u0119 zarz\u0105dzan\u0105 poza Jenkinsem itp. diff --git a/core/src/main/resources/hudson/slaves/JNLPLauncher/config.jelly b/core/src/main/resources/hudson/slaves/JNLPLauncher/config.jelly index d0765ddb5b..6b33de6b80 100644 --- a/core/src/main/resources/hudson/slaves/JNLPLauncher/config.jelly +++ b/core/src/main/resources/hudson/slaves/JNLPLauncher/config.jelly @@ -28,6 +28,9 @@ THE SOFTWARE. + + + diff --git a/core/src/main/resources/hudson/slaves/JNLPLauncher/help-webSocket.html b/core/src/main/resources/hudson/slaves/JNLPLauncher/help-webSocket.html new file mode 100644 index 0000000000..90f5c28f90 --- /dev/null +++ b/core/src/main/resources/hudson/slaves/JNLPLauncher/help-webSocket.html @@ -0,0 +1,4 @@ +
      + Use WebSocket to connect to the Jenkins master rather than the TCP port. + See JEP-222 for background. +
      diff --git a/core/src/main/resources/hudson/slaves/JNLPLauncher/help_bg.properties b/core/src/main/resources/hudson/slaves/JNLPLauncher/help_bg.properties index 6e9390b1d1..8de8edf0b3 100644 --- a/core/src/main/resources/hudson/slaves/JNLPLauncher/help_bg.properties +++ b/core/src/main/resources/hudson/slaves/JNLPLauncher/help_bg.properties @@ -20,7 +20,7 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -# Allows an agent to be launched using Java Web Start.
      \ +# Allows an agent to be launched using Java Web Start.
      \ # In this case, a JNLP file must be opened on the agent machine, which will \ # establish a TCP connection to the Jenkins master.
      \ # This means that the agent need not be reachable from the master; the agent \ diff --git a/core/src/main/resources/hudson/slaves/JNLPLauncher/help_sr.properties b/core/src/main/resources/hudson/slaves/JNLPLauncher/help_sr.properties index fba74a2438..d25ea7795d 100644 --- a/core/src/main/resources/hudson/slaves/JNLPLauncher/help_sr.properties +++ b/core/src/main/resources/hudson/slaves/JNLPLauncher/help_sr.properties @@ -8,4 +8,4 @@ blurb=\u041E\u043C\u043E\u0433\u0443\u045B\u0430\u0432\u0430 \u0434\u0430 \u0441 \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 + 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. diff --git a/core/src/main/resources/hudson/slaves/JNLPLauncher/main.jelly b/core/src/main/resources/hudson/slaves/JNLPLauncher/main.jelly index 1348373933..404e30b9f0 100644 --- a/core/src/main/resources/hudson/slaves/JNLPLauncher/main.jelly +++ b/core/src/main/resources/hudson/slaves/JNLPLauncher/main.jelly @@ -25,7 +25,7 @@ THE SOFTWARE. - +
      ${%slaveAgentPort.disabled} ${%configure.link.text}. diff --git a/core/src/main/resources/hudson/slaves/JNLPLauncher/main_fr.properties b/core/src/main/resources/hudson/slaves/JNLPLauncher/main_fr.properties index e0bca578cf..60428c5489 100644 --- a/core/src/main/resources/hudson/slaves/JNLPLauncher/main_fr.properties +++ b/core/src/main/resources/hudson/slaves/JNLPLauncher/main_fr.properties @@ -20,7 +20,7 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Run\ from\ agent\ command\ line:=Ex\u00E9cuter l''esclave \u00E0 partir de l\u2019interpr\u00E8te de commandes +Run\ from\ agent\ command\ line\:=Ex\u00E9cuter l''esclave \u00E0 partir de l\u2019interpr\u00E8te de commandes launch\ agent=lancer l''agent -Connect\ agent\ to\ Jenkins\ one\ of\ these\ ways:=Connecter l''esclave \u00E0 Jenkins avec l''une des mani\u00E8res suivantes: +Connect\ agent\ to\ Jenkins\ one\ of\ these\ ways\:=Connecter l''esclave \u00E0 Jenkins avec l''une des mani\u00E8res suivantes: Connected\ via\ JNLP\ agent.=Connect\u00E9 via l\u2019agent JNLP. diff --git a/core/src/main/resources/hudson/slaves/JNLPLauncher/main_ru.properties b/core/src/main/resources/hudson/slaves/JNLPLauncher/main_ru.properties index 0fc4329cd2..174db0d3b7 100644 --- a/core/src/main/resources/hudson/slaves/JNLPLauncher/main_ru.properties +++ b/core/src/main/resources/hudson/slaves/JNLPLauncher/main_ru.properties @@ -21,5 +21,5 @@ # THE SOFTWARE. Connected\ via\ JNLP\ agent.=\u041F\u043E\u0434\u043A\u043B\u044E\u0447\u0435\u043D \u0447\u0435\u0440\u0435\u0437 JNLP \u0430\u0433\u0435\u043D\u0442\u0430. -Run\ from\ agent\ command\ line:=\u0412\u044B\u043F\u043E\u043B\u043D\u0438\u0442\u044C \u0432 \u043A\u043E\u043C\u043C\u0430\u043D\u0434\u043D\u043E\u0439 \u0441\u0442\u0440\u043E\u043A\u0435 \u043F\u043E\u0434\u0447\u0438\u043D\u0435\u043D\u043D\u043E\u0433\u043E \u0443\u0437\u043B\u0430 +Run\ from\ agent\ command\ line\:=\u0412\u044B\u043F\u043E\u043B\u043D\u0438\u0442\u044C \u0432 \u043A\u043E\u043C\u043C\u0430\u043D\u0434\u043D\u043E\u0439 \u0441\u0442\u0440\u043E\u043A\u0435 \u043F\u043E\u0434\u0447\u0438\u043D\u0435\u043D\u043D\u043E\u0433\u043E \u0443\u0437\u043B\u0430 launch\ agent=\u0437\u0430\u043F\u0443\u0441\u0442\u0438\u0442\u044C \u0430\u0433\u0435\u043D\u0442\u0430 diff --git a/core/src/main/resources/hudson/slaves/Messages_de.properties b/core/src/main/resources/hudson/slaves/Messages_de.properties index 0509d510ff..a98fcd4020 100644 --- a/core/src/main/resources/hudson/slaves/Messages_de.properties +++ b/core/src/main/resources/hudson/slaves/Messages_de.properties @@ -29,7 +29,7 @@ ComputerLauncher.UnknownJavaVersion=Konnte Java-Version von {0} nicht bestimmen. ConnectionActivityMonitor.OfflineCause=Ping-Versuche scheiterten wiederholt DumbSlave.displayName=Statischer Agent EnvironmentVariablesNodeProperty.displayName=Umgebungsvariablen -JNLPLauncher.displayName=Agent via Java Web Start starten +JNLPLauncher.displayName=Agent \u00FCber eine Verbindung zum Master-Knoten starten NodeDescriptor.CheckName.Mandatory=Name ist ein Pflichtfeld. NodeProvisioner.EmptyString= OfflineCause.connection_was_broken_=Verbindung wurde unterbrochen: {0} diff --git a/core/src/main/resources/hudson/slaves/Messages_pl.properties b/core/src/main/resources/hudson/slaves/Messages_pl.properties index f09693fdf4..b07fbb56e2 100644 --- a/core/src/main/resources/hudson/slaves/Messages_pl.properties +++ b/core/src/main/resources/hudson/slaves/Messages_pl.properties @@ -1,6 +1,6 @@ # The MIT License # -# Copyright (c) 2016, Damian Szczepanik +# Copyright (c) 2016-2019, 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,5 @@ # THE SOFTWARE. # Environment variables EnvironmentVariablesNodeProperty.displayName=Zmienne \u015Brodowiskowe +DumbSlave.displayName=Sta\u0142y Agent + 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 70ae2479d6..da5485d06f 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 @@ -20,4 +20,4 @@ # 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 +Connection\ was\ broken=Verbindung abgebrochen diff --git a/core/src/main/resources/hudson/slaves/OfflineCause/ChannelTermination/cause_ja.properties b/core/src/main/resources/hudson/slaves/OfflineCause/ChannelTermination/cause_ja.properties index ac6770fdff..f20c73da93 100644 --- a/core/src/main/resources/hudson/slaves/OfflineCause/ChannelTermination/cause_ja.properties +++ b/core/src/main/resources/hudson/slaves/OfflineCause/ChannelTermination/cause_ja.properties @@ -20,4 +20,4 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Connection\ was\ broken=\u30B3\u30CD\u30AF\u30B7\u30E7\u30F3\u304C\u5207\u65AD\u3055\u308C\u307E\u3057\u305F\u3002 \ No newline at end of file +Connection\ was\ broken=\u30B3\u30CD\u30AF\u30B7\u30E7\u30F3\u304C\u5207\u65AD\u3055\u308C\u307E\u3057\u305F\u3002 diff --git a/core/src/main/resources/hudson/slaves/SimpleScheduledRetentionStrategy/config_bg.properties b/core/src/main/resources/hudson/slaves/SimpleScheduledRetentionStrategy/config_bg.properties index 990f58ac3d..f8475582c9 100644 --- a/core/src/main/resources/hudson/slaves/SimpleScheduledRetentionStrategy/config_bg.properties +++ b/core/src/main/resources/hudson/slaves/SimpleScheduledRetentionStrategy/config_bg.properties @@ -32,4 +32,4 @@ uptime.description=\ \u041c\u0430\u0448\u0438\u043d\u0430\u0442\u0430 \u0434\u0430 \u0435 \u043e\u043d\u043b\u0430\u0439\u043d \u0442\u043e\u0437\u0438 \u0431\u0440\u043e\u0439 \u043c\u0438\u043d\u0443\u0442\u0438. \u0410\u043a\u043e \u043f\u0435\u0440\u0438\u043e\u0434\u044a\u0442 \u0435 \u043f\u043e \u0434\u044a\u043b\u044a\u0433 \u043e\u0442 \u0432\u0440\u0435\u043c\u0435\u0442\u043e \u0437\u0430\ \u0441\u0442\u0430\u0440\u0442\u0438\u0440\u0430\u043d\u0435, \u043c\u0430\u0448\u0438\u043d\u0430\u0442\u0430 \u0449\u0435 \u0435 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u043d\u0430 \u043b\u0438\u043d\u0438\u044f. Scheduled\ Uptime\ is\ mandatory\ and\ must\ be\ a\ number.=\ - \u0417\u0430\u043f\u043b\u0430\u043d\u0443\u0432\u0430\u043d\u043e\u0442\u043e \u0432\u0440\u0435\u043c\u0435 \u0437\u0430 \u0440\u0430\u0431\u043e\u0442\u0430 \u0435 \u0437\u0430\u0434\u044a\u043b\u0436\u0438\u0442\u0435\u043b\u0435\u043d \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u044a\u0440 \u2014 \u0447\u0438\u0441\u043b\u043e. \ No newline at end of file + \u0417\u0430\u043f\u043b\u0430\u043d\u0443\u0432\u0430\u043d\u043e\u0442\u043e \u0432\u0440\u0435\u043c\u0435 \u0437\u0430 \u0440\u0430\u0431\u043e\u0442\u0430 \u0435 \u0437\u0430\u0434\u044a\u043b\u0436\u0438\u0442\u0435\u043b\u0435\u043d \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u044a\u0440 \u2014 \u0447\u0438\u0441\u043b\u043e. diff --git a/core/src/main/resources/hudson/slaves/SlaveComputer/log_sr.properties b/core/src/main/resources/hudson/slaves/SlaveComputer/log_sr.properties index 342f76eea2..e524cf0890 100644 --- a/core/src/main/resources/hudson/slaves/SlaveComputer/log_sr.properties +++ b/core/src/main/resources/hudson/slaves/SlaveComputer/log_sr.properties @@ -1,3 +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 +Log\ Records=\u0416\u0443\u0440\u043D\u0430\u043B \u043F\u043E\u0434\u0430\u0446\u0438 diff --git a/core/src/main/resources/hudson/slaves/SlaveComputer/sidepanel2_ja.properties b/core/src/main/resources/hudson/slaves/SlaveComputer/sidepanel2_ja.properties index d389806f9b..0eb086248f 100644 --- a/core/src/main/resources/hudson/slaves/SlaveComputer/sidepanel2_ja.properties +++ b/core/src/main/resources/hudson/slaves/SlaveComputer/sidepanel2_ja.properties @@ -22,4 +22,4 @@ Log=\u30ED\u30B0 System\ Information=\u30B7\u30B9\u30C6\u30E0\u60C5\u5831 -Disconnect=\u5207\u65AD \ No newline at end of file +Disconnect=\u5207\u65AD diff --git a/core/src/main/resources/hudson/slaves/SlaveComputer/sidepanel_sr.properties b/core/src/main/resources/hudson/slaves/SlaveComputer/sidepanel_sr.properties index 5986eb659e..d7fd74f4d7 100644 --- a/core/src/main/resources/hudson/slaves/SlaveComputer/sidepanel_sr.properties +++ b/core/src/main/resources/hudson/slaves/SlaveComputer/sidepanel_sr.properties @@ -5,4 +5,4 @@ Back\ to\ List=\u041D\u0430\u0437\u0430\u0434 \u043A\u0430 \u0441\u043F\u0438\u0 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 +Build\ History=\u0418\u0441\u0442\u043E\u0440\u0438\u0458\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 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 f515203c0e..173a897e9c 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 @@ -24,8 +24,7 @@ THE SOFTWARE. - - + - + ${h.initPageVariables(context)} diff --git a/core/src/main/resources/hudson/util/HudsonIsLoading/index_ru.properties b/core/src/main/resources/hudson/util/HudsonIsLoading/index_ru.properties index e2d4d7c96e..02cdc4f1d2 100644 --- a/core/src/main/resources/hudson/util/HudsonIsLoading/index_ru.properties +++ b/core/src/main/resources/hudson/util/HudsonIsLoading/index_ru.properties @@ -21,4 +21,4 @@ # THE SOFTWARE. Please\ wait\ while\ Jenkins\ is\ getting\ ready\ to\ work=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043f\u043e\u0434\u043e\u0436\u0434\u0438\u0442\u0435. Jenkins \u0433\u043e\u0442\u043e\u0432\u0438\u0442\u0441\u044f \u043a \u0440\u0430\u0431\u043e\u0442\u0435 -Your\ browser\ will\ reload\ automatically\ when\ Jenkins\ is\ ready.=\u042d\u0442\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u0430 \u043a\u043e\u0433\u0434\u0430 Jenkins \u0431\u0443\u0434\u0435\u0442 \u0433\u043e\u0442\u043e\u0432. +Your\ browser\ will\ reload\ automatically\ when\ Jenkins\ is\ ready.=\u042d\u0442\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u0430, \u043a\u043e\u0433\u0434\u0430 Jenkins \u0431\u0443\u0434\u0435\u0442 \u0433\u043e\u0442\u043e\u0432. diff --git a/core/src/main/resources/hudson/util/HudsonIsLoading/index_tr.properties b/core/src/main/resources/hudson/util/HudsonIsLoading/index_tr.properties index d83050db64..e9cd2bc0e8 100644 --- a/core/src/main/resources/hudson/util/HudsonIsLoading/index_tr.properties +++ b/core/src/main/resources/hudson/util/HudsonIsLoading/index_tr.properties @@ -20,5 +20,5 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Please\ wait\ while\ Jenkins\ is\ getting\ ready\ to\ work=Jenkins\ kullan\u0131ma haz\u0131r\ oluncaya\ kadar\ l\u00fctfen\ bekleyiniz -Your\ browser\ will\ reload\ automatically\ when\ Jenkins\ is\ ready.=Jenkins\ haz\u0131r\ oldu\u011funda\ taray\u0131c\u0131n\u0131z\ otomatik\ olarak\ yeniden\ y\u00fcklenecektir. +Please\ wait\ while\ Jenkins\ is\ getting\ ready\ to\ work=Jenkins kullan\u0131ma haz\u0131r oluncaya kadar l\u00fctfen bekleyiniz +Your\ browser\ will\ reload\ automatically\ when\ Jenkins\ is\ ready.=Jenkins haz\u0131r oldu\u011funda taray\u0131c\u0131n\u0131z otomatik olarak yeniden y\u00fcklenecektir. diff --git a/core/src/main/resources/hudson/util/HudsonIsRestarting/index.jelly b/core/src/main/resources/hudson/util/HudsonIsRestarting/index.jelly index a372dda355..de7874d9df 100644 --- a/core/src/main/resources/hudson/util/HudsonIsRestarting/index.jelly +++ b/core/src/main/resources/hudson/util/HudsonIsRestarting/index.jelly @@ -31,7 +31,7 @@ THE SOFTWARE. - + ${h.initPageVariables(context)} diff --git a/core/src/main/resources/hudson/util/IncompatibleAntVersionDetected/index_tr.properties b/core/src/main/resources/hudson/util/IncompatibleAntVersionDetected/index_tr.properties index 6e188f6c42..82603e686f 100644 --- a/core/src/main/resources/hudson/util/IncompatibleAntVersionDetected/index_tr.properties +++ b/core/src/main/resources/hudson/util/IncompatibleAntVersionDetected/index_tr.properties @@ -21,9 +21,9 @@ # THE SOFTWARE. errorMessage=\ - Jenkins''\u0131n \u00fczerinde y\u00fcr\u00fct\u00fcld\u00fc\u011f\u00fc servlet container''\u0131n eski bir Ant versiyonu y\u00fckledi\u011fi tespit edildi,\ - bu da Jenkins''\u0131n kendi, daha yeni kopyas\u0131n\u0131 y\u00fcklemesini engelliyor.\ + Jenkins''in \u00fczerinde y\u00fcr\u00fct\u00fcld\u00fc\u011f\u00fc servlet container''\u0131n eski bir Ant versiyonu y\u00fckledi\u011fi tespit edildi,\ + bu da Jenkins''in kendi, daha yeni kopyas\u0131n\u0131 y\u00fcklemesini engelliyor.\ (Ant s\u0131n\u0131flar\u0131 {0} i\u00e7erisinden y\u00fckleniyor}
      \ - Container i\u00e7erisindeki kopyay\u0131 Jenkins''\u0131n WEB-INF/lib dizinindeki ile ezmeniz gerekebilir,\ - veya classloader''\u0131 delegasyonunu Jenkins''a vererek, Jenkins''\u0131n kendi kopyas\u0131n\u0131 y\u00fcklemesini sa\u011flayabilirsiniz. + Container i\u00e7erisindeki kopyay\u0131 Jenkins''in WEB-INF/lib dizinindeki ile ezmeniz gerekebilir,\ + veya classloader''\u0131 delegasyonunu Jenkins''e vererek, Jenkins''in kendi kopyas\u0131n\u0131 y\u00fcklemesini sa\u011flayabilirsiniz. Error=Hata diff --git a/core/src/main/resources/hudson/util/IncompatibleServletVersionDetected/index_nl.properties b/core/src/main/resources/hudson/util/IncompatibleServletVersionDetected/index_nl.properties index 1479f8f9b9..7548d3e6bf 100644 --- a/core/src/main/resources/hudson/util/IncompatibleServletVersionDetected/index_nl.properties +++ b/core/src/main/resources/hudson/util/IncompatibleServletVersionDetected/index_nl.properties @@ -23,4 +23,4 @@ Error=Fout errorMessage=\ We merken dat uw servletcontainer de servlet versie 2.4 niet ondersteunt!\ -(De servlet api wordt vanuit volgend pad geladen. : {0}) \ No newline at end of file +(De servlet api wordt vanuit volgend pad geladen. : {0}) 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 2f5904304a..82059ee248 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 @@ -29,12 +29,12 @@ # way to fix the problem is simply to turn the security manager off. errorMessage.1=N\u00f3s detectamos que o Jenkins n\u00e3 tem permiss\u00f5es suficiente para executar. \ como indicado pela informa\u00e7\u00e3o abaixo. Normalmente a causa desse problema \ -est\u00e1 no gerenciador de seguran\u00e7a. Se voc\u00ea n\u00e3o sabe como configurar o gerenciador \ +est\u00e1 no gerenciador de seguran\u00e7a. Se voc\u00ea n\u00e3o sabe como configurar o gerenciador \ 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/JNADoublyLoaded/index_bg.properties b/core/src/main/resources/hudson/util/JNADoublyLoaded/index_bg.properties index 23ca3bf353..58ec935275 100644 --- a/core/src/main/resources/hudson/util/JNADoublyLoaded/index_bg.properties +++ b/core/src/main/resources/hudson/util/JNADoublyLoaded/index_bg.properties @@ -28,4 +28,4 @@ blurb=\ JNA \u0432\u0435\u0447\u0435 \u0435 \u0437\u0430\u0440\u0435\u0434\u0435\u043d \u043e\u0442 \u0434\u0440\u0443\u0433 \u043a\u043b\u0430\u0441 \u0437\u0430 \u0437\u0430\u0440\u0435\u0436\u0434\u0430\u043d\u0435 \u043d\u0430 \u043a\u043b\u0430\u0441\u043e\u0432\u0435 \u0438 Jenkins \u043d\u0435 \u043c\u043e\u0436\u0435 \u0434\u0430\ \u0437\u0430\u0440\u0435\u0434\u0438 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u0430\u0442\u0430 \u0441\u0438 \u0432\u0435\u0440\u0441\u0438\u044f \u043d\u0430 JNA. \u0417\u0430 \u043f\u043e\u0432\u0435\u0447\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \ - \u043f\u0440\u0435\u0433\u043b\u0435\u0434\u0430\u0439\u0442\u0435 \u0443\u0438\u043a\u0438\u0442\u043e. \ No newline at end of file + \u043f\u0440\u0435\u0433\u043b\u0435\u0434\u0430\u0439\u0442\u0435 \u0443\u0438\u043a\u0438\u0442\u043e. diff --git a/core/src/main/resources/hudson/util/JenkinsReloadFailed/index_sr.properties b/core/src/main/resources/hudson/util/JenkinsReloadFailed/index_sr.properties index 2a99f9eb88..f878a09bf8 100644 --- a/core/src/main/resources/hudson/util/JenkinsReloadFailed/index_sr.properties +++ b/core/src/main/resources/hudson/util/JenkinsReloadFailed/index_sr.properties @@ -1,4 +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 +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. diff --git a/core/src/main/resources/hudson/util/Messages_es.properties b/core/src/main/resources/hudson/util/Messages_es.properties index 3b428dfc76..3046e66746 100644 --- a/core/src/main/resources/hudson/util/Messages_es.properties +++ b/core/src/main/resources/hudson/util/Messages_es.properties @@ -36,4 +36,4 @@ Retrier.NoSuccess=Se intent\u00F3 la acci\u00F3n {0} por {1} vez(ces) sin \u00E9 Retrier.Success=Realizada la acci\u00F3n {0} con \u00E9xito en el intento #{1} Retrier.ExceptionThrown=El intento #{0} de hacer la acci\u00F3n {1} lanz\u00F3 una excepci\u00F3n no permitida, relanzando Retrier.ExceptionFailed=El intento #{0} de hacer la acci\u00F3n {1} fall\u00F3 con una excepci\u00F3n permitida: -Retrier.CallingListener=Llamando al listener de la excepci\u00F3n permitida ''{0}'' en el intento #{1} para hacer la acci\u00F3n {2} \ No newline at end of file +Retrier.CallingListener=Llamando al listener de la excepci\u00F3n permitida ''{0}'' en el intento #{1} para hacer la acci\u00F3n {2} diff --git a/core/src/main/resources/hudson/util/Messages_fr.properties b/core/src/main/resources/hudson/util/Messages_fr.properties index f6dbaaaf69..449cafeb1f 100644 --- a/core/src/main/resources/hudson/util/Messages_fr.properties +++ b/core/src/main/resources/hudson/util/Messages_fr.properties @@ -23,4 +23,4 @@ ClockDifference.InSync=Synchronis\u00e9 ClockDifference.Ahead={0} en avance ClockDifference.Behind={0} en retard -ClockDifference.Failed=Impossible \u00e0 v\u00e9rifier \ No newline at end of file +ClockDifference.Failed=Impossible \u00e0 v\u00e9rifier diff --git a/core/src/main/resources/hudson/util/Messages_sr.properties b/core/src/main/resources/hudson/util/Messages_sr.properties index a813bf1695..1a52198f3a 100644 --- a/core/src/main/resources/hudson/util/Messages_sr.properties +++ b/core/src/main/resources/hudson/util/Messages_sr.properties @@ -7,4 +7,4 @@ ClockDifference.Failed=\u041F\u0440\u043E\u0432\u0435\u0440\u0430 \u043D\u0438\u 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 +HttpResponses.Saved=\u0421\u0430\u0447\u0443\u0432\u0430\u043D\u043E diff --git a/core/src/main/resources/hudson/util/NoHomeDir/index_sr.properties b/core/src/main/resources/hudson/util/NoHomeDir/index_sr.properties index 57863766bf..6297d8414a 100644 --- a/core/src/main/resources/hudson/util/NoHomeDir/index_sr.properties +++ b/core/src/main/resources/hudson/util/NoHomeDir/index_sr.properties @@ -6,4 +6,4 @@ 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 + \u0437\u0430 \u0458\u043E\u0448 \u0434\u0435\u0442\u0430\u0459\u0430. diff --git a/core/src/main/resources/hudson/util/NoTempDir/index_nl.properties b/core/src/main/resources/hudson/util/NoTempDir/index_nl.properties index d30aa6e24c..4c0b234e32 100644 --- a/core/src/main/resources/hudson/util/NoTempDir/index_nl.properties +++ b/core/src/main/resources/hudson/util/NoTempDir/index_nl.properties @@ -27,4 +27,4 @@ hiervoor is een verkeerde configuratie van de container.\ De JVM werd geconfigureerd om volgende folder als tijdelijke \ map te gebruiken :{0}\ Bestaat deze map? Is deze map wijzigbaar door de gebruiker\ - waarmee de container opgestart werd? \ No newline at end of file + waarmee de container opgestart werd? diff --git a/core/src/main/resources/jenkins/model/DownloadSettings/config_de.properties b/core/src/main/resources/hudson/views/BuildButtonColumn/column_pl.properties similarity index 84% rename from core/src/main/resources/jenkins/model/DownloadSettings/config_de.properties rename to core/src/main/resources/hudson/views/BuildButtonColumn/column_pl.properties index be68d8e226..86b12e0e11 100644 --- a/core/src/main/resources/jenkins/model/DownloadSettings/config_de.properties +++ b/core/src/main/resources/hudson/views/BuildButtonColumn/column_pl.properties @@ -1,6 +1,6 @@ # The MIT License # -# Copyright (c) 2014-2015, Harald Albers +# Copyright (c) 2019, 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. - -Use\ browser\ for\ metadata\ download = Browser zum Download von Metadaten verwenden +Task_scheduled={0} dodano do kolejki +Schedule_a_task=Dodaj {1} do kolejki na {0} +Schedule_a_task_with_parameters=Dodaj {1} z parametrami do kolejki na {0} diff --git a/core/src/main/resources/hudson/views/GlobalDefaultViewConfiguration/config_sr.properties b/core/src/main/resources/hudson/views/GlobalDefaultViewConfiguration/config_sr.properties index 136fa5e105..df3705f4cb 100644 --- a/core/src/main/resources/hudson/views/GlobalDefaultViewConfiguration/config_sr.properties +++ b/core/src/main/resources/hudson/views/GlobalDefaultViewConfiguration/config_sr.properties @@ -1,3 +1,3 @@ # 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 \ No newline at end of file +Default\ view=\u0421\u0442\u0430\u043D\u0434\u0430\u0440\u0434\u043D\u0438 \u043F\u0440\u0435\u0433\u043B\u0435\u0434 diff --git a/core/src/main/resources/hudson/views/LastDurationColumn/column_tr.properties b/core/src/main/resources/hudson/views/LastDurationColumn/column_tr.properties index e2c05a3a06..36c1f29912 100644 --- a/core/src/main/resources/hudson/views/LastDurationColumn/column_tr.properties +++ b/core/src/main/resources/hudson/views/LastDurationColumn/column_tr.properties @@ -20,4 +20,4 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -N/A=Mevcut De\u011fil \ No newline at end of file +N/A=Mevcut De\u011fil diff --git a/core/src/main/resources/hudson/views/Messages_ja.properties b/core/src/main/resources/hudson/views/Messages_ja.properties index 2233aa8f26..61fd9805e9 100644 --- a/core/src/main/resources/hudson/views/Messages_ja.properties +++ b/core/src/main/resources/hudson/views/Messages_ja.properties @@ -29,4 +29,4 @@ LastSuccessColumn.DisplayName=\u6700\u65b0\u306e\u6210\u529f\u30d3\u30eb\u30c9 StatusColumn.DisplayName=\u30b9\u30c6\u30fc\u30bf\u30b9 WeatherColumn.DisplayName=\u7a7a\u6a21\u69d8 DefaultViewsTabsBar.DisplayName=Default Views TabBar -DefaultMyViewsTabsBar.DisplayName=Default My Views TabBar \ No newline at end of file +DefaultMyViewsTabsBar.DisplayName=Default My Views TabBar diff --git a/core/src/main/resources/hudson/views/Messages_sr.properties b/core/src/main/resources/hudson/views/Messages_sr.properties index 0ed7e3366a..1fb44dfbad 100644 --- a/core/src/main/resources/hudson/views/Messages_sr.properties +++ b/core/src/main/resources/hudson/views/Messages_sr.properties @@ -9,4 +9,4 @@ LastStableColumn.DisplayName=\u041F\u043E\u0441\u043B\u0435\u0434\u045A\u0430 \u StatusColumn.DisplayName=\u0421\u0442\u0430\u045A\u0435 WeatherColumn.DisplayName=\u0412\u0440\u0435\u043C\u0435\u043D\u0441\u043A\u0430 \u043F\u0440\u043E\u0433\u043D\u043E\u0437\u0430 DefaultViewsTabsBar.DisplayName=\u0422\u0440\u0430\u043A\u0430 \u0437\u0430 \u0441\u0442\u0430\u043D\u0434\u0430\u0440\u0434\u043D\u0435 \u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0435 -DefaultMyViewsTabsBar.DisplayName=\u0422\u0440\u0430\u043A\u0430 \u0437\u0430 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u0447\u043A\u0435 \u0441\u0442\u0430\u043D\u0434\u0430\u0440\u0434\u043D\u0435 \u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0435 \ No newline at end of file +DefaultMyViewsTabsBar.DisplayName=\u0422\u0440\u0430\u043A\u0430 \u0437\u0430 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u0447\u043A\u0435 \u0441\u0442\u0430\u043D\u0434\u0430\u0440\u0434\u043D\u0435 \u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0435 diff --git a/core/src/main/resources/hudson/views/MyViewsTabBar/GlobalConfigurationImpl/config_sr.properties b/core/src/main/resources/hudson/views/MyViewsTabBar/GlobalConfigurationImpl/config_sr.properties index c99dc05905..7f9c91e933 100644 --- a/core/src/main/resources/hudson/views/MyViewsTabBar/GlobalConfigurationImpl/config_sr.properties +++ b/core/src/main/resources/hudson/views/MyViewsTabBar/GlobalConfigurationImpl/config_sr.properties @@ -1,4 +1,4 @@ # This file is under the MIT License by authors My\ Views\ Tab\ Bar=\u0422\u0440\u0430\u043A\u0430 \u043A\u043E\u0440\u0438\u0441\u043D\u0438\u0447\u043A\u0438\u0445 \u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0430 -Views\ Tab\ Bar=\u0422\u0440\u0430\u043A\u0430 \u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0430 \ No newline at end of file +Views\ Tab\ Bar=\u0422\u0440\u0430\u043A\u0430 \u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0430 diff --git a/core/src/main/resources/hudson/views/ViewsTabBar/GlobalConfigurationImpl/config_sr.properties b/core/src/main/resources/hudson/views/ViewsTabBar/GlobalConfigurationImpl/config_sr.properties index d8d6bba6d0..12b658cf05 100644 --- a/core/src/main/resources/hudson/views/ViewsTabBar/GlobalConfigurationImpl/config_sr.properties +++ b/core/src/main/resources/hudson/views/ViewsTabBar/GlobalConfigurationImpl/config_sr.properties @@ -1,3 +1,3 @@ # This file is under the MIT License by authors -Views\ Tab\ Bar=\u0422\u0440\u0430\u043A\u0430 \u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0430 \ No newline at end of file +Views\ Tab\ Bar=\u0422\u0440\u0430\u043A\u0430 \u043F\u0440\u0435\u0433\u043B\u0435\u0434\u0430 diff --git a/core/src/main/resources/hudson/widgets/HistoryWidget/entry.jelly b/core/src/main/resources/hudson/widgets/HistoryWidget/entry.jelly index 4da92969ab..a11e2e3504 100644 --- a/core/src/main/resources/hudson/widgets/HistoryWidget/entry.jelly +++ b/core/src/main/resources/hudson/widgets/HistoryWidget/entry.jelly @@ -23,7 +23,7 @@ THE SOFTWARE. --> @@ -40,8 +40,12 @@ THE SOFTWARE. ${build.displayName}
      - +
      diff --git a/core/src/main/resources/hudson/widgets/HistoryWidget/entry_ja.properties b/core/src/main/resources/hudson/widgets/HistoryWidget/entry_ja.properties index 3d7a5f4e2b..5b44d52b8c 100644 --- a/core/src/main/resources/hudson/widgets/HistoryWidget/entry_ja.properties +++ b/core/src/main/resources/hudson/widgets/HistoryWidget/entry_ja.properties @@ -20,4 +20,4 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Console\ Output=\u30b3\u30f3\u30bd\u30fc\u30eb\u51fa\u529b \ No newline at end of file +Console\ Output=\u30b3\u30f3\u30bd\u30fc\u30eb\u51fa\u529b diff --git a/core/src/main/resources/hudson/widgets/HistoryWidget/entry_pl.properties b/core/src/main/resources/hudson/widgets/HistoryWidget/entry_pl.properties index d648319d06..6e35ee1bbf 100644 --- a/core/src/main/resources/hudson/widgets/HistoryWidget/entry_pl.properties +++ b/core/src/main/resources/hudson/widgets/HistoryWidget/entry_pl.properties @@ -1,6 +1,6 @@ # The MIT License # -# Copyright (c) 2004-2010, Sun Microsystems, Inc. +# Copyright (c) 2004-2019, 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 @@ -21,3 +21,4 @@ # THE SOFTWARE. Console\ Output=Logi konsoli +confirm=Na pewno chcesz przerwa\u0107 {0}? diff --git a/core/src/main/resources/hudson/widgets/HistoryWidget/index.jelly b/core/src/main/resources/hudson/widgets/HistoryWidget/index.jelly index b4ffcd3885..b0121b6bdf 100644 --- a/core/src/main/resources/hudson/widgets/HistoryWidget/index.jelly +++ b/core/src/main/resources/hudson/widgets/HistoryWidget/index.jelly @@ -41,13 +41,13 @@ THE SOFTWARE. RSS link --> - Feed + Atom feed - RSS ${%for all} + Atom feed ${%for all} - Feed + Atom feed - RSS ${%for failures} + Atom feed ${%for failures} diff --git a/core/src/main/resources/hudson/widgets/HistoryWidget/index_ja.properties b/core/src/main/resources/hudson/widgets/HistoryWidget/index_ja.properties index 37ba0dcc1d..6226bc1685 100644 --- a/core/src/main/resources/hudson/widgets/HistoryWidget/index_ja.properties +++ b/core/src/main/resources/hudson/widgets/HistoryWidget/index_ja.properties @@ -23,4 +23,4 @@ trend=\u63a8\u79fb for\ all=\u5168\u30d3\u30eb\u30c9 for\ failures=\u5931\u6557\u30d3\u30eb\u30c9 -More\ ...=\u3082\u3063\u3068 ... \ No newline at end of file +More\ ...=\u3082\u3063\u3068 ... diff --git a/core/src/main/resources/hudson/widgets/Messages_sr.properties b/core/src/main/resources/hudson/widgets/Messages_sr.properties index ba1355710a..c81aa20b79 100644 --- a/core/src/main/resources/hudson/widgets/Messages_sr.properties +++ b/core/src/main/resources/hudson/widgets/Messages_sr.properties @@ -1,3 +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 +BuildHistoryWidget.DisplayName=\u0418\u0441\u0442\u043E\u0440\u0438\u0458\u0430 \u0438\u0437\u0433\u0440\u0430\u0434\u045A\u0430 diff --git a/core/src/main/resources/hudson/win32errors.properties b/core/src/main/resources/hudson/win32errors.properties index 9286f38bef..8d62add911 100644 --- a/core/src/main/resources/hudson/win32errors.properties +++ b/core/src/main/resources/hudson/win32errors.properties @@ -2034,7 +2034,7 @@ Cannot complete this function error1004= \ Invalid flags error1005= \ -The volume does not contain a recognized file system. +The volume does not contain a recognized file system. \ Please make sure that all required file system drivers are loaded and that the volume is not corrupted error1006= \ The volume for a file has been externally altered so that the opened file is no longer valid diff --git a/core/src/main/resources/hudson/win32errors_es.properties b/core/src/main/resources/hudson/win32errors_es.properties index 6b74c728b1..80c3d006bf 100644 --- a/core/src/main/resources/hudson/win32errors_es.properties +++ b/core/src/main/resources/hudson/win32errors_es.properties @@ -2034,7 +2034,7 @@ Cannot complete this function error1004= \ Invalid flags error1005= \ -The volume does not contain a recognized file system. +The volume does not contain a recognized file system. \ Please make sure that all required file system drivers are loaded and that the volume is not corrupted error1006= \ The volume for a file has been externally altered so that the opened file is no longer valid diff --git a/core/src/main/resources/hudson/win32errors_it.properties b/core/src/main/resources/hudson/win32errors_it.properties index d9bab2dd69..5ac8c7c0eb 100644 --- a/core/src/main/resources/hudson/win32errors_it.properties +++ b/core/src/main/resources/hudson/win32errors_it.properties @@ -1384,4 +1384,3 @@ error679= \ Errore sconosciuto (0x2a7) error680= \ Errore sconosciuto (0x2a8) -error681 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 5c8c783f41..c8e19190a5 100644 --- a/core/src/main/resources/jenkins/diagnosis/HsErrPidList/index_ja.properties +++ b/core/src/main/resources/jenkins/diagnosis/HsErrPidList/index_ja.properties @@ -28,4 +28,4 @@ blurb=Jenkins\u306eJVM\u30af\u30e9\u30c3\u30b7\u30e5\u30ec\u30dd\u30fc\u30c8\u30 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 +ago={0} \u524d diff --git a/core/src/main/resources/jenkins/diagnosis/HsErrPidList/message_ja.properties b/core/src/main/resources/jenkins/diagnosis/HsErrPidList/message_ja.properties index ab0409a9a4..7d981b6837 100644 --- a/core/src/main/resources/jenkins/diagnosis/HsErrPidList/message_ja.properties +++ b/core/src/main/resources/jenkins/diagnosis/HsErrPidList/message_ja.properties @@ -20,4 +20,4 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -blurb=\u3053\u306eJenkins\u306f\u30af\u30e9\u30c3\u30b7\u30e5\u3057\u305f\u3088\u3046\u3067\u3059\u3002\u30ed\u30b0\u3092\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002 \ No newline at end of file +blurb=\u3053\u306eJenkins\u306f\u30af\u30e9\u30c3\u30b7\u30e5\u3057\u305f\u3088\u3046\u3067\u3059\u3002\u30ed\u30b0\u3092\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002 diff --git a/core/src/main/resources/jenkins/install/SetupWizard/authenticate-security-token_de.properties b/core/src/main/resources/jenkins/install/SetupWizard/authenticate-security-token_de.properties index 9b666c0bc3..41a9e47caa 100644 --- a/core/src/main/resources/jenkins/install/SetupWizard/authenticate-security-token_de.properties +++ b/core/src/main/resources/jenkins/install/SetupWizard/authenticate-security-token_de.properties @@ -23,7 +23,7 @@ authenticate-security-token.error=FEHLER: authenticate-security-token.getting.started= authenticate-security-token.password.administrator=Administrator-Passwort -authenticate-security-token.copy.password=Bitte kopieren Sie dass Passwort von einer dieser Quellen und f\u00FCgen Sie es unten ein. +authenticate-security-token.copy.password=Bitte kopieren Sie das Passwort von einer dieser Quellen und f\u00FCgen Sie es unten ein. authenticate-security-token.unlock.jenkins=Jenkins entsperren authenticate-security-token.continue=Weiter jenkins.install.findSecurityTokenMessage=Um sicher zu stellen, dass Jenkins von einem autorisierten Administrator sicher initialisiert wird, wurde ein zuf\u00E4llig generiertes Passwort in das Log\ diff --git a/core/src/main/resources/jenkins/install/SetupWizard/authenticate-security-token_fr.properties b/core/src/main/resources/jenkins/install/SetupWizard/authenticate-security-token_fr.properties index 4a62fa8f78..8ea28cf869 100644 --- a/core/src/main/resources/jenkins/install/SetupWizard/authenticate-security-token_fr.properties +++ b/core/src/main/resources/jenkins/install/SetupWizard/authenticate-security-token_fr.properties @@ -10,4 +10,4 @@ authenticate-security-token.error=ERREUR: authenticate-security-token.password.incorrect=Le mot de passe saisi est incorrect, veuillez v\u00e9rifier \ dans le fichier le mot de passe correct authenticate-security-token.password.administrator=Mot de passe administrateur -authenticate-security-token.continue=Continuer \ No newline at end of file +authenticate-security-token.continue=Continuer diff --git a/core/src/main/resources/jenkins/install/SetupWizard/setupWizardConfigureInstance_pl.properties b/core/src/main/resources/jenkins/install/SetupWizard/setupWizardConfigureInstance_pl.properties index a12767f701..4c371fe910 100644 --- a/core/src/main/resources/jenkins/install/SetupWizard/setupWizardConfigureInstance_pl.properties +++ b/core/src/main/resources/jenkins/install/SetupWizard/setupWizardConfigureInstance_pl.properties @@ -21,4 +21,4 @@ # THE SOFTWARE. Jenkins\ URL=URL Jenkinsa -Instance\ Configuration=Konfiguracja instancji \ No newline at end of file +Instance\ Configuration=Konfiguracja instancji diff --git a/core/src/main/resources/jenkins/install/SetupWizard/setupWizardFirstUser.jelly b/core/src/main/resources/jenkins/install/SetupWizard/setupWizardFirstUser.jelly index 96e972b9ca..04b94bae9a 100644 --- a/core/src/main/resources/jenkins/install/SetupWizard/setupWizardFirstUser.jelly +++ b/core/src/main/resources/jenkins/install/SetupWizard/setupWizardFirstUser.jelly @@ -18,6 +18,7 @@ #create-admin-user h1 { font-family: 'roboto', sans-serif; font-size: 48px; + line-height: 48px; margin-top: 30px; font-weight: 500; } 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 index f397fc69a2..3780ea9607 100644 --- a/core/src/main/resources/jenkins/install/UpgradeWizard/client-scripts_sr.properties +++ b/core/src/main/resources/jenkins/install/UpgradeWizard/client-scripts_sr.properties @@ -2,4 +2,4 @@ msg.before=\u0414\u043E\u0431\u0440\u043E\u0434\u043E\u0448\u043B\u0438 \u043D\u0430 Jenkins {0}!\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 +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 diff --git a/core/src/main/resources/jenkins/install/platform-plugins.json b/core/src/main/resources/jenkins/install/platform-plugins.json index 48af4a4007..c70c9bf12e 100644 --- a/core/src/main/resources/jenkins/install/platform-plugins.json +++ b/core/src/main/resources/jenkins/install/platform-plugins.json @@ -4,6 +4,7 @@ "plugins": [ { "name": "dashboard-view" }, { "name": "cloudbees-folder", "suggested": true }, + { "name": "configuration-as-code" }, { "name": "antisamy-markup-formatter", "suggested": true } ] }, @@ -49,7 +50,6 @@ { "name": "github-branch-source", "suggested": true, "added": "2.0" }, { "name": "pipeline-github-lib", "suggested": true, "added": "2.0" }, { "name": "pipeline-stage-view", "suggested": true, "added": "2.0" }, - { "name": "build-pipeline-plugin" }, { "name": "conditional-buildstep" }, { "name": "jenkins-multijob-plugin" }, { "name": "parameterized-trigger" }, @@ -69,7 +69,6 @@ { "name": "p4" }, { "name": "repo" }, { "name": "subversion", "suggested": true }, - { "name": "teamconcert" }, { "name": "tfs" } ] }, diff --git a/core/src/main/resources/jenkins/install/pluginSetupWizard.properties b/core/src/main/resources/jenkins/install/pluginSetupWizard.properties index 6dc6e00099..3b99dc3cb4 100644 --- a/core/src/main/resources/jenkins/install/pluginSetupWizard.properties +++ b/core/src/main/resources/jenkins/install/pluginSetupWizard.properties @@ -91,7 +91,7 @@ installWizard_installingConsole_dependencyIndicatorNote=** - required dependency installWizard_websiteLinkLabel=Website installWizard_pluginInstallFailure_title=Installation Failures installWizard_pluginInstallFailure_message=Some plugins failed to install properly, you may retry installing them or continue \ -with the failed plugins +without the failed plugins installWizard_continue=Continue installWizard_retry=Retry installWizard_upgradePanel_title=Upgrade diff --git a/core/src/main/resources/jenkins/install/pluginSetupWizard_sr.properties b/core/src/main/resources/jenkins/install/pluginSetupWizard_sr.properties index 23f5e061f7..ece535dc12 100644 --- a/core/src/main/resources/jenkins/install/pluginSetupWizard_sr.properties +++ b/core/src/main/resources/jenkins/install/pluginSetupWizard_sr.properties @@ -71,4 +71,4 @@ installWizard_upgradeSkipped_message=
      \u

      \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 +installWizard_upgradeComplete_finishButtonLabel=\u0417\u0430\u0432\u0440\u0448\u0438 diff --git a/core/src/main/resources/jenkins/management/AdministrativeMonitorsConfiguration/config.groovy b/core/src/main/resources/jenkins/management/AdministrativeMonitorsConfiguration/config.groovy index 18416259db..5698abc807 100644 --- a/core/src/main/resources/jenkins/management/AdministrativeMonitorsConfiguration/config.groovy +++ b/core/src/main/resources/jenkins/management/AdministrativeMonitorsConfiguration/config.groovy @@ -34,7 +34,8 @@ f.section(title: _("Administrative monitors configuration")) { f.entry(title: _("Enabled administrative monitors")) { p(_("blurb")) table(width: "100%") { - for (AdministrativeMonitor am : AdministrativeMonitor.all()) { + for (AdministrativeMonitor am : new ArrayList<>(AdministrativeMonitor.all()) + .sort({ o1, o2 -> o1.getDisplayName() <=> o2.getDisplayName() })) { f.block() { f.checkbox(name: "administrativeMonitor", title: am.displayName, diff --git a/core/src/main/resources/jenkins/management/Messages.properties b/core/src/main/resources/jenkins/management/Messages.properties index ce99fecf14..8e5e595a83 100644 --- a/core/src/main/resources/jenkins/management/Messages.properties +++ b/core/src/main/resources/jenkins/management/Messages.properties @@ -50,7 +50,7 @@ CliLink.Description=Access/manage Jenkins from your shell, or from your script. ConsoleLink.DisplayName=Script Console ConsoleLink.Description=Executes arbitrary script for administration/trouble-shooting/diagnostics. -NodesLink.DisplayName=Manage Nodes +NodesLink.DisplayName=Manage Nodes and Clouds NodesLink.Description=Add, remove, control and monitor the various nodes that Jenkins runs jobs on. ShutdownLink.DisplayName_prepare=Prepare for Shutdown diff --git a/core/src/main/resources/jenkins/management/Messages_nb_NO.properties b/core/src/main/resources/jenkins/management/Messages_nb_NO.properties index af5b743d7b..0321ca51e6 100644 --- a/core/src/main/resources/jenkins/management/Messages_nb_NO.properties +++ b/core/src/main/resources/jenkins/management/Messages_nb_NO.properties @@ -26,7 +26,7 @@ NodesLink.Description=Legg til, fjern, kontroller og overv\u00E5k de forskjellig PluginsLink.Description=Legg til, fjern, deaktivere eller aktivere programtillegg som kan utvide funksjonaliteten til Jenkins. ConfigureLink.DisplayName=Konfigurere systemet ConfigureLink.Description=Konfigurere globale verdier og stier -CliLink.DisplayName (Command Line Interface - Kommandolinjegrensesnitt) +CliLink.DisplayName=Command Line Interface - Kommandolinjegrensesnitt CliLink.Description=F\u00E5 tilgang til/styr Jenkins fra et shell eller skript. StatisticsLink.DisplayName=Serverlast-statistikk StatisticsLink.Description=Kontroller ressursutnyttelsen og se om du trenger flere datamaskiner for dine bygg. diff --git a/core/src/main/resources/jenkins/management/Messages_sr.properties b/core/src/main/resources/jenkins/management/Messages_sr.properties index 276429a4ad..4f4fb089f6 100644 --- a/core/src/main/resources/jenkins/management/Messages_sr.properties +++ b/core/src/main/resources/jenkins/management/Messages_sr.properties @@ -23,4 +23,4 @@ NodesLink.Description=\u0414\u043E\u0434\u0430\u0458\u0442\u0435, \u0443\u043A\u 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 +Manage\ Jenkins=\u0423\u043F\u0440\u0430\u0432\u0459\u0430\u045A\u0435 Jenkins-\u043E\u043C diff --git a/core/src/main/resources/jenkins/management/Messages_tr.properties b/core/src/main/resources/jenkins/management/Messages_tr.properties index 32d022deee..677e1ce113 100644 --- a/core/src/main/resources/jenkins/management/Messages_tr.properties +++ b/core/src/main/resources/jenkins/management/Messages_tr.properties @@ -22,7 +22,7 @@ # THE SOFTWARE. # -SystemLogLink.Description=Sistem logu Jenkins''la ilgili olan java.util.logging \u00E7\u0131kt\u0131lar\u0131n\u0131 yakalar. +SystemLogLink.Description=Sistem logu Jenkins''le ilgili olan java.util.logging \u00E7\u0131kt\u0131lar\u0131n\u0131 yakalar. ReloadLink.DisplayName=Konfig\u00FCrasayonu Disk''ten Y\u00FCkle ReloadLink.Description=Haf\u0131zada tutulan yap\u0131lm\u0131\u015F t\u00FCm de\u011Fi\u015Fiklikleri iptal et ve her\u015Feyi dosya sisteminden y\u00FCkle.\n\ Konfig\u00FCrasyon dosyalar\u0131n\u0131 do\u011Frudan diskten de\u011Fi\u015Ftirdiyseniz kullan\u0131\u015Fl\u0131d\u0131r @@ -31,9 +31,9 @@ SystemInfoLink.DisplayName=Sistem Bilgisi SystemInfoLink.Description=Sorun \u00E7\u00F6zebilmek i\u00E7in \u00E7e\u015Fitli ortam de\u011Fi\u015Fkenlerini g\u00F6sterir. ConsoleLink.DisplayName=Script Konsolu ConsoleLink.Description=Y\u00F6netim/sorun \u00E7\u00F6zme/te\u015Fhis i\u00E7in scriptleri \u00E7al\u0131\u015Ft\u0131r\u0131r. -ShutdownLink.DisplayName_cancel=Kapatma i\u015Flemini iptal\ et +ShutdownLink.DisplayName_cancel=Kapatma i\u015Flemini iptal et ShutdownLink.DisplayName_prepare=Kapatma i\u015Flemine haz\u0131rlan ShutdownLink.Description=Sistemin g\u00FCvenli bir \u015Fekilde kapat\u0131labilmesi i\u00E7in, yeni yap\u0131land\u0131rma \u00E7al\u0131\u015Ft\u0131r\u0131lmas\u0131n\u0131 durdurur. -ConfigureLink.DisplayName=Sistem Konfig\u00FCrasyonunu\ De\u011Fi\u015Ftir +ConfigureLink.DisplayName=Sistem Konfig\u00FCrasyonunu De\u011Fi\u015Ftir ConfigureLink.Description=Evrensel ayarlar\u0131 ve path'lari konfig\u00FCre et PluginsLink.Description=Jenkins fonksiyonalitesini art\u0131rmak i\u00E7in kullan\u0131lan eklentileri ekle, \u00E7\u0131kar, devreye al veya devre d\u0131\u015F\u0131 b\u0131rak diff --git a/core/src/main/resources/jenkins/management/PluginsLink/info_da.properties b/core/src/main/resources/jenkins/management/PluginsLink/info_da.properties index 6a42db1d34..c1cfb28eee 100644 --- a/core/src/main/resources/jenkins/management/PluginsLink/info_da.properties +++ b/core/src/main/resources/jenkins/management/PluginsLink/info_da.properties @@ -22,4 +22,4 @@ # THE SOFTWARE. # -updates\ available=opdateringer tilg\u00e6ngelige \ No newline at end of file +updates\ available=opdateringer tilg\u00e6ngelige diff --git a/core/src/main/resources/jenkins/management/PluginsLink/info_fr.properties b/core/src/main/resources/jenkins/management/PluginsLink/info_fr.properties index e147fa8ae6..4d04db4dc4 100644 --- a/core/src/main/resources/jenkins/management/PluginsLink/info_fr.properties +++ b/core/src/main/resources/jenkins/management/PluginsLink/info_fr.properties @@ -22,4 +22,4 @@ # THE SOFTWARE. # -updates\ available=mises \u00E0 jour disponibles \ No newline at end of file +updates\ available=mises \u00E0 jour disponibles diff --git a/core/src/main/resources/jenkins/model/BuildDiscarderProperty/help_tr.html b/core/src/main/resources/jenkins/model/BuildDiscarderProperty/help_tr.html index 8af15246d5..fd68839b0f 100644 --- a/core/src/main/resources/jenkins/model/BuildDiscarderProperty/help_tr.html +++ b/core/src/main/resources/jenkins/model/BuildDiscarderProperty/help_tr.html @@ -1,15 +1,15 @@
      - Bu kısım, yapılandırmaların kayıtlarını tutma sürelerinizi yöneterek Jenkins'ın disk + Bu kısım, yapılandırmaların kayıtlarını tutma sürelerinizi yöneterek Jenkins'in disk kullanımını kontrol eder (konsol çıktısı, yapılandırma artefaktları gibi).
      Jenkins bu yönetim için iki kriter sunar:
      1. - Tarih ile yönetme. Jenkins'ın belli bir tarihe ulaşmış dosyaları silmesini sağlayabilirsiniz. + Tarih ile yönetme. Jenkins'in belli bir tarihe ulaşmış dosyaları silmesini sağlayabilirsiniz. (mesela, 7 günlük olanlar)
      2. - Sayı ile yönetme. Jenkins'ın N yapılandırmayı yönetmesini sağlayabilirsiniz. N sayısına ulaşıldığında, yeni bir yapılandırma, + Sayı ile yönetme. Jenkins'in N yapılandırmayı yönetmesini sağlayabilirsiniz. N sayısına ulaşıldığında, yeni bir yapılandırma, en eski yapılandırmanın kayıtlarını siler.
      diff --git a/core/src/main/resources/jenkins/model/CoreEnvironmentContributor/buildEnv.groovy b/core/src/main/resources/jenkins/model/CoreEnvironmentContributor/buildEnv.groovy index 015f433e9d..090610ce76 100644 --- a/core/src/main/resources/jenkins/model/CoreEnvironmentContributor/buildEnv.groovy +++ b/core/src/main/resources/jenkins/model/CoreEnvironmentContributor/buildEnv.groovy @@ -3,7 +3,7 @@ package jenkins.model.CoreEnvironmentContributor def l = namespace(lib.JenkinsTagLib) // also advertises those contributed by Run.getCharacteristicEnvVars() -["BUILD_NUMBER","BUILD_ID","BUILD_DISPLAY_NAME","JOB_NAME", "JOB_BASE_NAME","BUILD_TAG","EXECUTOR_NUMBER","NODE_NAME","NODE_LABELS","WORKSPACE","JENKINS_HOME","JENKINS_URL","BUILD_URL","JOB_URL"].each { name -> +["BUILD_NUMBER","BUILD_ID","BUILD_DISPLAY_NAME","JOB_NAME", "JOB_BASE_NAME","BUILD_TAG","EXECUTOR_NUMBER","NODE_NAME","NODE_LABELS","WORKSPACE","WORKSPACE_TMP","JENKINS_HOME","JENKINS_URL","BUILD_URL","JOB_URL"].each { name -> l.buildEnvVar(name:name) { raw(_("${name}.blurb")) } diff --git a/core/src/main/resources/jenkins/model/CoreEnvironmentContributor/buildEnv.properties b/core/src/main/resources/jenkins/model/CoreEnvironmentContributor/buildEnv.properties index b244378815..f41589973d 100644 --- a/core/src/main/resources/jenkins/model/CoreEnvironmentContributor/buildEnv.properties +++ b/core/src/main/resources/jenkins/model/CoreEnvironmentContributor/buildEnv.properties @@ -12,6 +12,9 @@ EXECUTOR_NUMBER.blurb=\ NODE_NAME.blurb=Name of the agent if the build is on an agent, or "master" if run on master NODE_LABELS.blurb=Whitespace-separated list of labels that the node is assigned. WORKSPACE.blurb=The absolute path of the directory assigned to the build as a workspace. +WORKSPACE_TMP.blurb=\ + A temporary directory near the workspace that will not be browsable and will not interfere with SCM checkouts. \ + May not initially exist, so be sure to create the directory as needed (e.g., mkdir -p on Linux). JENKINS_HOME.blurb=The absolute path of the directory assigned on the master node for Jenkins to store data. JENKINS_URL.blurb=Full URL of Jenkins, like http://server:port/jenkins/ (note: only available if Jenkins URL set in system configuration) BUILD_URL.blurb=Full URL of this build, like http://server:port/jenkins/job/foo/15/ (Jenkins URL must be set) diff --git a/core/src/main/resources/jenkins/model/CoreEnvironmentContributor/buildEnv_sr.properties b/core/src/main/resources/jenkins/model/CoreEnvironmentContributor/buildEnv_sr.properties index 8772ef9dd5..be55e99003 100644 --- a/core/src/main/resources/jenkins/model/CoreEnvironmentContributor/buildEnv_sr.properties +++ b/core/src/main/resources/jenkins/model/CoreEnvironmentContributor/buildEnv_sr.properties @@ -13,4 +13,4 @@ WORKSPACE.blurb=\u0420\u0430\u0437\u043C\u0430\u043A-\u043E\u0434\u0432\u043E\u0 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 +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) diff --git a/core/src/main/resources/jenkins/model/DownloadSettings/Warning/message.properties b/core/src/main/resources/jenkins/model/DownloadSettings/Warning/message.properties deleted file mode 100644 index 57c6a3b68d..0000000000 --- a/core/src/main/resources/jenkins/model/DownloadSettings/Warning/message.properties +++ /dev/null @@ -1,26 +0,0 @@ -# The MIT License -# -# Copyright 2015 Jesse Glick. -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -# THE SOFTWARE. - -blurb=\ - You currently are using browser-based download to retrieve metadata for Jenkins plugins and tools. \ - This has reliability issues and is not considered fully secure. \ - Consider switching to server-based download. diff --git a/core/src/main/resources/jenkins/model/DownloadSettings/Warning/message_bg.properties b/core/src/main/resources/jenkins/model/DownloadSettings/Warning/message_bg.properties deleted file mode 100644 index 9ad0da03e4..0000000000 --- a/core/src/main/resources/jenkins/model/DownloadSettings/Warning/message_bg.properties +++ /dev/null @@ -1,33 +0,0 @@ -# The MIT License -# -# Bulgarian translation: Copyright (c) 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. - -# \ -# You currently are using browser-based download to retrieve metadata for Jenkins plugins and tools. \ -# This has reliability issues and is not considered fully secure. \ -# Consider switching to server-based download. -blurb=\ - \u0412 \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u043f\u043e\u043b\u0437\u0432\u0430\u0442\u0435 \u0438\u0437\u0442\u0435\u0433\u043b\u044f\u043d\u0435 \u043d\u0430 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u0438\u0442\u0435 \u0437\u0430 \u043f\u0440\u0438\u0441\u0442\u0430\u0432\u043a\u0438\u0442\u0435 \u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0438\u0442\u0435 \u043d\u0430\ - Jenkins \u043f\u0440\u0435\u0437 \u0431\u0440\u0430\u0443\u0437\u044a\u0440\u0430. \u0422\u043e\u0432\u0430 \u043d\u0435 \u0435 \u0441\u044a\u0432\u0441\u0435\u043c \u043d\u0430\u0434\u0435\u0436\u0434\u043d\u043e, \u0430 \u0438 \u043d\u0435 \u0435 \u0441\u044a\u0432\u0441\u0435\u043c \u0441\u0438\u0433\u0443\u0440\u043d\u043e.\ - \u041f\u043e\u043c\u0438\u0441\u043b\u0435\u0442\u0435 \u0437\u0430 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430 \u043d\u0430 \u0438\u0437\u0442\u0435\u0433\u043b\u044f\u043d\u0438\u044f \u043f\u0440\u0435\u0437\ - \u0441\u044a\u0440\u0432\u044a\u0440\u0430. -Dismiss=\ - \u041e\u0442\u043a\u0430\u0437 diff --git a/core/src/main/resources/jenkins/model/DownloadSettings/Warning/message_de.properties b/core/src/main/resources/jenkins/model/DownloadSettings/Warning/message_de.properties deleted file mode 100644 index e0bb5e6898..0000000000 --- a/core/src/main/resources/jenkins/model/DownloadSettings/Warning/message_de.properties +++ /dev/null @@ -1,27 +0,0 @@ -# The MIT License -# -# Copyright 2015 Jesse Glick, Harald Albers. -# -# 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. - -blurb=\ - Sie verwenden momentan Ihren Browser zum Download von Metadaten über Plugins und Tools. \ - Dieses Verfahren gilt als unzuverlässig und unsicher. \ - Sie sollten erwägen, zu Server-basierten Downloads zu wechseln. -Dismiss=Ignorieren \ No newline at end of file diff --git a/core/src/main/resources/jenkins/model/DownloadSettings/Warning/message_it.properties b/core/src/main/resources/jenkins/model/DownloadSettings/Warning/message_it.properties deleted file mode 100644 index fecfaf66e9..0000000000 --- a/core/src/main/resources/jenkins/model/DownloadSettings/Warning/message_it.properties +++ /dev/null @@ -1,29 +0,0 @@ -# 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. - -blurb=\ - Si sta attualmente utilizzando il download basato su browser per recuperare \ - i metadati per i plugin e gli strumenti di Jenkins. \ - Quest''opzione ha problemi di affidabilità e non è considerata completamente \ - sicura. \ - Si consideri il passaggio alla modalità download basato sul server. -Dismiss=Ignora diff --git a/core/src/main/resources/jenkins/model/DownloadSettings/Warning/message_lt.properties b/core/src/main/resources/jenkins/model/DownloadSettings/Warning/message_lt.properties deleted file mode 100644 index c6c204e38e..0000000000 --- a/core/src/main/resources/jenkins/model/DownloadSettings/Warning/message_lt.properties +++ /dev/null @@ -1,5 +0,0 @@ -blurb=\ - J\u016bs dabar naudojate nar\u0161ykl\u0117s atsiuntim\u0105, kad gautum\u0117te metaduomenis Jenkinso priedams ir \u012frankiams. \ - Tai turi patikimumo problem\u0173 ir n\u0117ra visi\u0161kai saugu. \ - Apsvarstykite persijungim\u0105 \u012f serverio-pus\u0117s atsiuntim\u0105. -Dismiss=Praleisti 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 deleted file mode 100644 index e8fb16b532..0000000000 --- a/core/src/main/resources/jenkins/model/DownloadSettings/Warning/message_sr.properties +++ /dev/null @@ -1,7 +0,0 @@ -# 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.groovy b/core/src/main/resources/jenkins/model/DownloadSettings/config.groovy deleted file mode 100644 index e84d34ade1..0000000000 --- a/core/src/main/resources/jenkins/model/DownloadSettings/config.groovy +++ /dev/null @@ -1,9 +0,0 @@ -package jenkins.security.DownloadSettings - -def f = namespace(lib.FormTagLib) - -f.section(title:_("Plugin Manager")) { - f.entry() { - f.checkbox(field: "useBrowser", title: _("Use browser for metadata download")) - } -} diff --git a/core/src/main/resources/jenkins/model/DownloadSettings/config_sr.properties b/core/src/main/resources/jenkins/model/DownloadSettings/config_sr.properties deleted file mode 100644 index 76414275dd..0000000000 --- a/core/src/main/resources/jenkins/model/DownloadSettings/config_sr.properties +++ /dev/null @@ -1,4 +0,0 @@ -# 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/DownloadSettings/help-useBrowser.html b/core/src/main/resources/jenkins/model/DownloadSettings/help-useBrowser.html deleted file mode 100644 index 56218d082a..0000000000 --- a/core/src/main/resources/jenkins/model/DownloadSettings/help-useBrowser.html +++ /dev/null @@ -1,11 +0,0 @@ -

      - Check to force the user’s browser to download metadata (lists of available plugins, tools, etc.) - rather than Jenkins itself doing it. - Actual file downloads (plugins, tools) will still happen from Jenkins itself, - but this can be used to at least see new metadata when Jenkins cannot access the Internet - (but your own browser can, perhaps using some special proxy that Jenkins is not configured to use). -

      -

      - Use of browser mode is discouraged. - It has robustness problems and has been limited to users with Overall/Administer. -

      diff --git a/core/src/main/resources/jenkins/model/DownloadSettings/help-useBrowser_bg.html b/core/src/main/resources/jenkins/model/DownloadSettings/help-useBrowser_bg.html deleted file mode 100644 index 189121a8e7..0000000000 --- a/core/src/main/resources/jenkins/model/DownloadSettings/help-useBrowser_bg.html +++ /dev/null @@ -1,12 +0,0 @@ -

      - Настройване браузърът, а не Jenkins, да изтегля метаданните (списъци с наличните - приставки, инструменти и т.н.). Самото изтегляне на приставките и инструментите - ще се извърши от Jenkins, но така ще получите достъп поне да разгледате - обновените метаданни, когато Jenkins няма достъп до Internet, но вашия браузър - има (примерно защото ползва определен сървър-посредник, който е недостъпен за - Jenkins). -

      -

      - Използването на този режим не се препоръчва. Той не е надежден и е ограничен - единствено до администраторите, защото само те могат да се възползват от него. -

      diff --git a/core/src/main/resources/jenkins/model/DownloadSettings/help-useBrowser_de.html b/core/src/main/resources/jenkins/model/DownloadSettings/help-useBrowser_de.html deleted file mode 100644 index 7db0c3ad49..0000000000 --- a/core/src/main/resources/jenkins/model/DownloadSettings/help-useBrowser_de.html +++ /dev/null @@ -1,12 +0,0 @@ -
      - Aktivieren Sie diese Einstellung, wenn Sie Metadaten (Listen verfügbarer Plugins, - Tools etc.) anstelle von Jenkins selbst mit dem Browser herunterladen möchten. - - Die Downloads der in den Metadaten beschriebenen Dateien werden nach wie vor von - Jenkins übernommen. - - Diese Einstellung ist nützlich, wenn Jenkins ohne Internetzugriff betrieben wird, - Sie aber über Ihren Browser durch besondere Proxy- oder Firewalleinstellungen auf - das Internet zugreifen können. - In diesen Fällen können Sie neue Metadaten zumindest sehen. -
      diff --git a/core/src/main/resources/jenkins/model/DownloadSettings/help-useBrowser_it.html b/core/src/main/resources/jenkins/model/DownloadSettings/help-useBrowser_it.html deleted file mode 100644 index f128f15ebe..0000000000 --- a/core/src/main/resources/jenkins/model/DownloadSettings/help-useBrowser_it.html +++ /dev/null @@ -1,16 +0,0 @@ -

      - Selezionare quest'opzione per forzare il browser dell'utente a scaricare i - metadati (elenchi dei plugin/strumenti disponibili, ecc.) anziché lasciar - eseguire tale operazione a Jenkins stesso. - I download dei file veri e propri (plugin, strumenti) continueranno a - essere operati da Jenkins stesso, ma quest'opzione può essere utilizzata - almeno per visualizzare nuovi metadati quando Jenkins non può - accedere a Internet (ma il proprio browser è in grado di farlo, forse - utilizzando qualche proxy speciale che Jenkins non è configurato per - usare). -

      -

      - L'utilizzo della modalità browser non è raccomandato. - Ha problemi di robustezza ed è stato limitato agli utenti con il privilegio - Globale/Amministra. -

      diff --git a/core/src/main/resources/jenkins/model/DownloadSettings/help-useBrowser_ja.html b/core/src/main/resources/jenkins/model/DownloadSettings/help-useBrowser_ja.html deleted file mode 100644 index 5d819f0ae2..0000000000 --- a/core/src/main/resources/jenkins/model/DownloadSettings/help-useBrowser_ja.html +++ /dev/null @@ -1,7 +0,0 @@ -
      - チェックすると、Jenkinsではなく使用しているブラウザで、使用可能なプラグインやツールなどのメタ情報をダウンロードします。 - プラグインやツールのファイルはjenkins自身がダウンロードしますが、 - ブラウザを使用することで、Jenkinsがインターネットにアクセスできないときでも、少なくとも新規のメタ情報を参照することができます - (おそらく、ある特別なプロキシーを使用していて、Jenkinsがそれを使用するように設定できなくても、 - ブラウザは設定できるでしょう)。 -
      diff --git a/core/src/main/resources/jenkins/model/GlobalBuildDiscarderConfiguration/config.groovy b/core/src/main/resources/jenkins/model/GlobalBuildDiscarderConfiguration/config.groovy new file mode 100644 index 0000000000..1c96790de9 --- /dev/null +++ b/core/src/main/resources/jenkins/model/GlobalBuildDiscarderConfiguration/config.groovy @@ -0,0 +1,33 @@ +/* + * The MIT License + * + * Copyright 2019 Daniel Beck + * + * 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.GlobalBuildDiscarderConfiguration + +f = namespace(lib.FormTagLib) + +f.section(title: _("Global Build Discarders")) { + f.block() { + f.repeatableHeteroProperty(field: "configuredBuildDiscarders", hasHeader: true, oneEach: true) + } +} diff --git a/core/src/main/resources/jenkins/model/GlobalCloudConfiguration/config.groovy b/core/src/main/resources/jenkins/model/GlobalCloudConfiguration/config.groovy deleted file mode 100644 index ac31668d48..0000000000 --- a/core/src/main/resources/jenkins/model/GlobalCloudConfiguration/config.groovy +++ /dev/null @@ -1,16 +0,0 @@ -package jenkins.model.GlobalCloudConfiguration - -import hudson.slaves.Cloud - -def f=namespace(lib.FormTagLib) - -def clouds = Cloud.all() - -if (!clouds.isEmpty()) { - f.section(title:_("Cloud")) { - f.block { - f.hetero_list(name:"cloud", hasHeader:true, descriptors:Cloud.all(), items:app.clouds, - addCaption:_("Add a new cloud"), deleteCaption:_("Delete cloud")) - } - } -} diff --git a/core/src/main/resources/jenkins/model/GlobalCloudConfiguration/index.groovy b/core/src/main/resources/jenkins/model/GlobalCloudConfiguration/index.groovy new file mode 100644 index 0000000000..0d0657763e --- /dev/null +++ b/core/src/main/resources/jenkins/model/GlobalCloudConfiguration/index.groovy @@ -0,0 +1,51 @@ +package jenkins.model.GlobalCloudConfiguration + +import hudson.slaves.Cloud + + +def f = namespace(lib.FormTagLib) +def l = namespace(lib.LayoutTagLib) +def st = namespace("jelly:stapler") + +l.layout(norefresh:true, permission:app.ADMINISTER, title:my.displayName) { + l.side_panel { + l.tasks { + l.task(icon:"icon-up icon-md", href:rootURL+'/', title:_("Back to Dashboard")) + l.task(icon:"icon-gear2 icon-md", href:"${rootURL}/computer/", title:_("Manage Nodes")) + } + } + l.main_panel { + h1 { + l.icon(class: 'icon-health-40to59 icon-xlg') + // TODO more appropriate icon + text(my.displayName) + } + + def clouds = Cloud.all() + + if (!clouds.isEmpty()) { + p() + div(class:"behavior-loading", _("LOADING")) + + f.form(method:"post",name:"config",action:"configure") { + f.block { + f.hetero_list(name:"cloud", hasHeader:true, descriptors:Cloud.all(), items:app.clouds, + addCaption:_("Add a new cloud"), deleteCaption:_("Delete cloud")) + } + + f.bottomButtonBar { + f.submit(value:_("Save")) + f.apply(value:_("Apply")) + } + } + st.adjunct(includes: "lib.form.confirm") + } else { + p { + _("There are no cloud implementations for dynamically allocated agents installed.") + a(href: rootURL + "/pluginManager/available") { + _("Go to plugin manager.") + } + } + } + } +} diff --git a/core/src/main/resources/jenkins/model/GlobalCloudConfiguration/config_da.properties b/core/src/main/resources/jenkins/model/GlobalCloudConfiguration/index_da.properties similarity index 100% rename from core/src/main/resources/jenkins/model/GlobalCloudConfiguration/config_da.properties rename to core/src/main/resources/jenkins/model/GlobalCloudConfiguration/index_da.properties diff --git a/core/src/main/resources/jenkins/model/GlobalCloudConfiguration/config_de.properties b/core/src/main/resources/jenkins/model/GlobalCloudConfiguration/index_de.properties similarity index 100% rename from core/src/main/resources/jenkins/model/GlobalCloudConfiguration/config_de.properties rename to core/src/main/resources/jenkins/model/GlobalCloudConfiguration/index_de.properties diff --git a/core/src/main/resources/jenkins/model/GlobalCloudConfiguration/config_es.properties b/core/src/main/resources/jenkins/model/GlobalCloudConfiguration/index_es.properties similarity index 100% rename from core/src/main/resources/jenkins/model/GlobalCloudConfiguration/config_es.properties rename to core/src/main/resources/jenkins/model/GlobalCloudConfiguration/index_es.properties diff --git a/core/src/main/resources/jenkins/model/GlobalCloudConfiguration/config_fr.properties b/core/src/main/resources/jenkins/model/GlobalCloudConfiguration/index_fr.properties similarity index 100% rename from core/src/main/resources/jenkins/model/GlobalCloudConfiguration/config_fr.properties rename to core/src/main/resources/jenkins/model/GlobalCloudConfiguration/index_fr.properties diff --git a/core/src/main/resources/jenkins/model/GlobalCloudConfiguration/config_it.properties b/core/src/main/resources/jenkins/model/GlobalCloudConfiguration/index_it.properties similarity index 100% rename from core/src/main/resources/jenkins/model/GlobalCloudConfiguration/config_it.properties rename to core/src/main/resources/jenkins/model/GlobalCloudConfiguration/index_it.properties diff --git a/core/src/main/resources/jenkins/model/GlobalCloudConfiguration/config_ja.properties b/core/src/main/resources/jenkins/model/GlobalCloudConfiguration/index_ja.properties similarity index 100% rename from core/src/main/resources/jenkins/model/GlobalCloudConfiguration/config_ja.properties rename to core/src/main/resources/jenkins/model/GlobalCloudConfiguration/index_ja.properties diff --git a/core/src/main/resources/jenkins/model/GlobalCloudConfiguration/config_pt_BR.properties b/core/src/main/resources/jenkins/model/GlobalCloudConfiguration/index_pt_BR.properties similarity index 100% rename from core/src/main/resources/jenkins/model/GlobalCloudConfiguration/config_pt_BR.properties rename to core/src/main/resources/jenkins/model/GlobalCloudConfiguration/index_pt_BR.properties diff --git a/core/src/main/resources/jenkins/model/GlobalCloudConfiguration/config_sr.properties b/core/src/main/resources/jenkins/model/GlobalCloudConfiguration/index_sr.properties similarity index 91% rename from core/src/main/resources/jenkins/model/GlobalCloudConfiguration/config_sr.properties rename to core/src/main/resources/jenkins/model/GlobalCloudConfiguration/index_sr.properties index 29a7fbccd4..5452b6e8e1 100644 --- a/core/src/main/resources/jenkins/model/GlobalCloudConfiguration/config_sr.properties +++ b/core/src/main/resources/jenkins/model/GlobalCloudConfiguration/index_sr.properties @@ -2,4 +2,4 @@ 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 +Add\ a\ new\ cloud=\u0414\u043E\u0434\u0430\u0458 \u043D\u043E\u0432\u0438 cloud diff --git a/core/src/main/resources/jenkins/model/GlobalCloudConfiguration/config_zh_TW.properties b/core/src/main/resources/jenkins/model/GlobalCloudConfiguration/index_zh_TW.properties similarity index 100% rename from core/src/main/resources/jenkins/model/GlobalCloudConfiguration/config_zh_TW.properties rename to core/src/main/resources/jenkins/model/GlobalCloudConfiguration/index_zh_TW.properties diff --git a/core/src/main/resources/jenkins/model/GlobalNodePropertiesConfiguration/config_sr.properties b/core/src/main/resources/jenkins/model/GlobalNodePropertiesConfiguration/config_sr.properties index f3244eb9c9..99c0033bf9 100644 --- a/core/src/main/resources/jenkins/model/GlobalNodePropertiesConfiguration/config_sr.properties +++ b/core/src/main/resources/jenkins/model/GlobalNodePropertiesConfiguration/config_sr.properties @@ -1,3 +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 +Global\ properties=\u0413\u043B\u043E\u0431\u0430\u043B\u043D\u0430 \u043F\u043E\u0434\u0435\u0448\u0430\u0432\u0430\u045A\u0430 diff --git a/core/src/main/resources/jenkins/model/GlobalProjectNamingStrategyConfiguration/config_fr.properties b/core/src/main/resources/jenkins/model/GlobalProjectNamingStrategyConfiguration/config_fr.properties index 06891b5c74..9cc873522f 100644 --- a/core/src/main/resources/jenkins/model/GlobalProjectNamingStrategyConfiguration/config_fr.properties +++ b/core/src/main/resources/jenkins/model/GlobalProjectNamingStrategyConfiguration/config_fr.properties @@ -1,3 +1,3 @@ useNamingStrategy=Restreindre le nommage de projet namingStrategyTitle=Strat\u00E9gie de nommage -strategy=Strat\u00E9gie \ No newline at end of file +strategy=Strat\u00E9gie diff --git a/core/src/main/resources/jenkins/model/GlobalProjectNamingStrategyConfiguration/config_sr.properties b/core/src/main/resources/jenkins/model/GlobalProjectNamingStrategyConfiguration/config_sr.properties index bc04a65926..96acef24d2 100644 --- a/core/src/main/resources/jenkins/model/GlobalProjectNamingStrategyConfiguration/config_sr.properties +++ b/core/src/main/resources/jenkins/model/GlobalProjectNamingStrategyConfiguration/config_sr.properties @@ -2,4 +2,4 @@ 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 namingStrategyTitle=\u0428\u0435\u043C\u0430 \u0438\u043C\u0435\u043D\u043E\u0432\u0430\u045A\u0430 -strategy=\u0428\u0435\u043C\u0430 \ No newline at end of file +strategy=\u0428\u0435\u043C\u0430 diff --git a/core/src/main/resources/jenkins/model/GlobalQuietPeriodConfiguration/help-quietPeriod_tr.html b/core/src/main/resources/jenkins/model/GlobalQuietPeriodConfiguration/help-quietPeriod_tr.html index 58b51fbe5c..e124b298b6 100644 --- a/core/src/main/resources/jenkins/model/GlobalQuietPeriodConfiguration/help-quietPeriod_tr.html +++ b/core/src/main/resources/jenkins/model/GlobalQuietPeriodConfiguration/help-quietPeriod_tr.html @@ -14,7 +14,7 @@
    • Eğer Jenkins, çok fazla yapılandırma ile uğraşıyorsa, sessiz periyodu uzatmak, - Jenkins'ı yükünü ve yapılandırma sayısını azaltacaktır. + Jenkins'i yükünü ve yapılandırma sayısını azaltacaktır.
    Proje-seviyesinde belirlenmez ise, sistemdeki varolan değer alınır. diff --git a/core/src/main/resources/jenkins/model/GlobalSCMRetryCountConfiguration/config_sr.properties b/core/src/main/resources/jenkins/model/GlobalSCMRetryCountConfiguration/config_sr.properties index 583c36f8a6..aaef0b2a20 100644 --- a/core/src/main/resources/jenkins/model/GlobalSCMRetryCountConfiguration/config_sr.properties +++ b/core/src/main/resources/jenkins/model/GlobalSCMRetryCountConfiguration/config_sr.properties @@ -1,3 +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 +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 diff --git a/core/src/main/resources/jenkins/model/Jenkins/EnforceSlaveAgentPortAdministrativeMonitor/message_de.properties b/core/src/main/resources/jenkins/model/Jenkins/EnforceSlaveAgentPortAdministrativeMonitor/message_de.properties index 8df926efe9..213275c7de 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/EnforceSlaveAgentPortAdministrativeMonitor/message_de.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/EnforceSlaveAgentPortAdministrativeMonitor/message_de.properties @@ -20,5 +20,5 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -description=Der JNLP-Agent-Port wurde ver\u00E4ndert, obwohl er durch die System-Eigenschaft {0} beim Start festgelegt wurde. Der Wert wird beim Neustart auf {1,number,#} zur\u00FCckgesetzt. +description=Der TCP-Agent-Port wurde ver\u00E4ndert, obwohl er durch die System-Eigenschaft {0} beim Start festgelegt wurde. Der Wert wird beim Neustart auf {1,number,#} zur\u00FCckgesetzt. reset=Auf {0,number,#} zur\u00FCcksetzen diff --git a/core/src/main/resources/jenkins/model/Jenkins/MasterComputer/configure_da.properties b/core/src/main/resources/jenkins/model/Jenkins/MasterComputer/configure_da.properties index 4edfee2c67..044345cffa 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/MasterComputer/configure_da.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/MasterComputer/configure_da.properties @@ -23,4 +23,4 @@ \#\ of\ executors=# afviklere Labels=Etiketter Node\ Properties=Nodeegenskaber -Save=Gem \ No newline at end of file +Save=Gem diff --git a/core/src/main/resources/jenkins/model/Jenkins/MasterComputer/configure_es.properties b/core/src/main/resources/jenkins/model/Jenkins/MasterComputer/configure_es.properties index 6727022cf8..2d9d462116 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/MasterComputer/configure_es.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/MasterComputer/configure_es.properties @@ -23,4 +23,4 @@ \#\ of\ executors=N\u00FAmero de ejecutores Labels=Etiquetas Node\ Properties=Propiedades del nodo -Save=Guardar \ No newline at end of file +Save=Guardar diff --git a/core/src/main/resources/jenkins/model/Jenkins/MasterComputer/configure_fi.properties b/core/src/main/resources/jenkins/model/Jenkins/MasterComputer/configure_fi.properties index 6a9ee3e96d..817dbcfb38 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/MasterComputer/configure_fi.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/MasterComputer/configure_fi.properties @@ -23,4 +23,4 @@ \#\ of\ executors=Suorittaajien lukum\u00E4\u00E4r\u00E4 Labels= Node\ Properties= -Save=Tallenna \ No newline at end of file +Save=Tallenna diff --git a/core/src/main/resources/jenkins/model/Jenkins/MasterComputer/configure_nl.properties b/core/src/main/resources/jenkins/model/Jenkins/MasterComputer/configure_nl.properties index 9ade3c9fc1..d2de775079 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/MasterComputer/configure_nl.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/MasterComputer/configure_nl.properties @@ -23,4 +23,4 @@ \#\ of\ executors=Uitvoerders Labels=Labels Node\ Properties= -Save=Bewaar \ No newline at end of file +Save=Bewaar diff --git a/core/src/main/resources/jenkins/model/Jenkins/MasterComputer/configure_tr.properties b/core/src/main/resources/jenkins/model/Jenkins/MasterComputer/configure_tr.properties index 1ed8cd6ac7..b9a08b753c 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/MasterComputer/configure_tr.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/MasterComputer/configure_tr.properties @@ -23,4 +23,4 @@ \#\ of\ executors=Yap\u0131land\u0131rma i\u015flemleri say\u0131s\u0131 Labels=Etiketler Node\ Properties= -Save=Kaydet \ No newline at end of file +Save=Kaydet diff --git a/core/src/main/resources/jenkins/model/Jenkins/_cli_sr.properties b/core/src/main/resources/jenkins/model/Jenkins/_cli_sr.properties index 9eb1d202ee..a832e8a8db 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/_cli_sr.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/_cli_sr.properties @@ -1,4 +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 +Available\ Commands=\u0414\u043E\u0441\u0442\u0443\u043F\u043D\u0435 \u043A\u043E\u043C\u0430\u043D\u0434\u0435 diff --git a/core/src/main/resources/jenkins/model/Jenkins/_cloud-note.groovy b/core/src/main/resources/jenkins/model/Jenkins/_cloud-note.groovy new file mode 100644 index 0000000000..9b4a929d97 --- /dev/null +++ b/core/src/main/resources/jenkins/model/Jenkins/_cloud-note.groovy @@ -0,0 +1,19 @@ +package jenkins.model.Jenkins + +import hudson.slaves.Cloud + +// TODO remove this once it's been long enough that users got used to this. + +def f = namespace(lib.FormTagLib) + +def clouds = Cloud.all() + +if (!clouds.isEmpty()) { + f.section(title: _("Cloud")) { + f.block { + div(class: 'alert alert-info') { + raw(_("note", rootURL)) + } + } + } +} diff --git a/core/src/main/resources/jenkins/model/Jenkins/_cloud-note.properties b/core/src/main/resources/jenkins/model/Jenkins/_cloud-note.properties new file mode 100644 index 0000000000..d9cada5eb8 --- /dev/null +++ b/core/src/main/resources/jenkins/model/Jenkins/_cloud-note.properties @@ -0,0 +1 @@ +note=The cloud configuration has moved to a separate configuration page. 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 4307ac5593..a61b38b6a9 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/_restart_ru.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/_restart_ru.properties @@ -2,4 +2,4 @@ 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 +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. 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 2f018764b1..3f5d9f5282 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/_safeRestart_ru.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/_safeRestart_ru.properties @@ -1,3 +1,3 @@ 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 +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. diff --git a/core/src/main/resources/jenkins/model/Jenkins/_scriptText.jelly b/core/src/main/resources/jenkins/model/Jenkins/_scriptText.jelly index 0867147550..d3ec942025 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/_scriptText.jelly +++ b/core/src/main/resources/jenkins/model/Jenkins/_scriptText.jelly @@ -26,5 +26,8 @@ THE SOFTWARE. Called from doScriptText() to display the execution result. --> - - + + + + + diff --git a/core/src/main/resources/jenkins/model/Jenkins/accessDenied_ru.properties b/core/src/main/resources/jenkins/model/Jenkins/accessDenied_ru.properties index 6606e23c61..9062c16a54 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/accessDenied_ru.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/accessDenied_ru.properties @@ -21,4 +21,4 @@ # 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 +Jenkins\ Login=\u0412\u0445\u043e\u0434 \u0432 Jenkins diff --git a/core/src/main/resources/jenkins/model/Jenkins/configure.jelly b/core/src/main/resources/jenkins/model/Jenkins/configure.jelly index a6154bbc4e..97df594a8a 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/configure.jelly +++ b/core/src/main/resources/jenkins/model/Jenkins/configure.jelly @@ -27,7 +27,7 @@ THE SOFTWARE. --> - + @@ -52,6 +52,10 @@ THE SOFTWARE. + + + + 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 f3c3260e49..b5ca36cd29 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_bg.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_bg.properties @@ -31,7 +31,7 @@ Check\ File\ Fingerprint=\ # Find that out by checking the fingerprint against \ # the database in Jenkins 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?
    + \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://jenkins.io/redirect/fingerprint fingerprint.link=\ 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 e31d158af4..21554b3384 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_cs.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_cs.properties @@ -3,7 +3,7 @@ Check=Ov\u011B\u0159it 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?
    +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://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 09123b2192..c7f395b6d7 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_da.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_da.properties @@ -24,7 +24,7 @@ Check\ File\ Fingerprint=Check filfingeraftryk File\ to\ check=Fil der skal checkes fingerprint.link=https://jenkins.io/redirect/fingerprint description=\ -Har du f\u00e5et en jar fil, men ved ikke hvilken version den har?
    \ +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 more\ details=flere detaljer Check=Check diff --git a/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_tr.properties b/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_tr.properties index 45faf26931..592726095f 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_tr.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/fingerprintCheck_tr.properties @@ -20,9 +20,9 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Check\ File\ Fingerprint=Dosya\ \u00fczerindeki\ parmakizini\ kontrol\ et -File\ to\ check=Kontrol\ edilecek\ dosya -Check=Kontrol\ Et +Check\ File\ Fingerprint=Dosya \u00fczerindeki parmakizini kontrol et +File\ to\ check=Kontrol edilecek dosya +Check=Kontrol Et description=\ Bir jar dosyan\u0131z var ve hangi versiyon oldu\u011funu bilmiyor musunuz?
    \ Parmakizini Jenkins i\u00e7erisindeki veritaban\u0131nda aratarak bulabilirsiniz. diff --git a/core/src/main/resources/jenkins/model/Jenkins/legend_ja.properties b/core/src/main/resources/jenkins/model/Jenkins/legend_ja.properties index fab5274e81..3f5cd32582 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/legend_ja.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/legend_ja.properties @@ -33,4 +33,4 @@ health-81plus=\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u306E\u72B6\u614B\u304C81%\u4 health-61to80=\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u306E\u72B6\u614B\u304C61%\u4EE5\u4E0A\u300180%\u4EE5\u4E0B\u3002\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u306E\u30A2\u30A4\u30B3\u30F3\u306E\u4E0A\u306B\u30DE\u30A6\u30B9\u3092\u304B\u3056\u3059\u3068\u3001\u8A73\u7D30\u306A\u8AAC\u660E\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002 health-41to60=\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u306E\u72B6\u614B\u304C41%\u4EE5\u4E0A\u300160%\u4EE5\u4E0B\u3002\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u306E\u30A2\u30A4\u30B3\u30F3\u306E\u4E0A\u306B\u30DE\u30A6\u30B9\u3092\u304B\u3056\u3059\u3068\u3001\u8A73\u7D30\u306A\u8AAC\u660E\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002 health-21to40=\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u306E\u72B6\u614B\u304C21%\u4EE5\u4E0A\u300140%\u4EE5\u4E0B\u3002\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u306E\u30A2\u30A4\u30B3\u30F3\u306E\u4E0A\u306B\u30DE\u30A6\u30B9\u3092\u304B\u3056\u3059\u3068\u3001\u8A73\u7D30\u306A\u8AAC\u660E\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002 -health-00to20=\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u306E\u72B6\u614B\u304C20%\u672A\u6E80\u3002 \u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u306E\u30A2\u30A4\u30B3\u30F3\u306E\u4E0A\u306B\u30DE\u30A6\u30B9\u3092\u304B\u3056\u3059\u3068\u3001\u8A73\u7D30\u306A\u8AAC\u660E\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002 \ No newline at end of file +health-00to20=\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u306E\u72B6\u614B\u304C20%\u672A\u6E80\u3002 \u30D7\u30ED\u30B8\u30A7\u30AF\u30C8\u306E\u30A2\u30A4\u30B3\u30F3\u306E\u4E0A\u306B\u30DE\u30A6\u30B9\u3092\u304B\u3056\u3059\u3068\u3001\u8A73\u7D30\u306A\u8AAC\u660E\u304C\u8868\u793A\u3055\u308C\u307E\u3059\u3002 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 e4c1928f3a..ebabe62edc 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/legend_pl.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/legend_pl.properties @@ -1,6 +1,6 @@ # The MIT License # -# Copyright (c) 2013-2016, Sun Microsystems., Inc, Damian Szczepanik +# Copyright (c) 2013-2019, 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,11 +19,15 @@ # 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. +grey=Projekt jest wy\u0142\u0105czony. +grey_anime=Projekt jest wy\u0142\u0105czony, ale trwa pierwsze jego zadanie. +darkgrey=Zadanie zosta\u0142o przerwane. +darkgrey_anime=Ostatnie zadanie zosta\u0142o przerwane. Nowe zadanie trwa. +lightgrey=Projekt nie by\u0142 nigdy zbudowany. +lightgrey_anime=Pierwsze zadanie jest w trakcie. 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. -grey_anime=Trwa pierwsze zadanie projektu. -red=Ostatnie zadanie projektu nie powiod\u0142o si\u0119. +red=Ostatnie budowanie 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. diff --git a/core/src/main/resources/jenkins/model/Jenkins/load-statistics_ja.properties b/core/src/main/resources/jenkins/model/Jenkins/load-statistics_ja.properties index dcc47e5198..8829274a69 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/load-statistics_ja.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/load-statistics_ja.properties @@ -20,4 +20,4 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Load\ Statistics=\u8ca0\u8377\u7d71\u8a08 \ No newline at end of file +Load\ Statistics=\u8ca0\u8377\u7d71\u8a08 diff --git a/core/src/main/resources/jenkins/model/Jenkins/login.jelly b/core/src/main/resources/jenkins/model/Jenkins/login.jelly index a2d20b3b76..c65dd137b9 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/login.jelly +++ b/core/src/main/resources/jenkins/model/Jenkins/login.jelly @@ -24,10 +24,10 @@ THE SOFTWARE. + - ${h.advertiseHeaders(response)} @@ -35,14 +35,12 @@ THE SOFTWARE. - - - + ${h.initPageVariables(context)} @@ -159,4 +157,5 @@ THE SOFTWARE. + diff --git a/core/src/main/resources/jenkins/model/Jenkins/loginError_tr.properties b/core/src/main/resources/jenkins/model/Jenkins/loginError_tr.properties index 8145edd56b..fbd4b1649e 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/loginError_tr.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/loginError_tr.properties @@ -21,5 +21,5 @@ # THE SOFTWARE. If\ you\ are\ a\ system\ administrator\ and\ suspect\ this\ to\ be\ a\ configuration\ problem,\ see\ the\ server\ console\ output\ for\ more\ details.=E\u011Fer bir sistem y\u00F6neticisi vard\u0131r ve bu bir yap\u0131land\u0131rma sorunu oldu\u011Fundan \u015F\u00FCpheleniyorsan\u0131z, sunucu konsolu \u00E7\u0131k\u0131\u015F\u0131 Daha fazla bilgi i\u00E7in bkz -Invalid\ login\ information.\ Please\ try\ again.=Ge\u00e7ersiz\ giri\u015f\ bilgisi.\ L\u00fctfen\ tekrar\ deneyiniz. -Try\ again=Tekrar\ deneyiniz +Invalid\ login\ information.\ Please\ try\ again.=Ge\u00e7ersiz giri\u015f bilgisi. L\u00fctfen tekrar deneyiniz. +Try\ again=Tekrar deneyiniz diff --git a/core/src/main/resources/jenkins/model/Jenkins/login_ja.properties b/core/src/main/resources/jenkins/model/Jenkins/login_ja.properties index 9e64a67725..db6afd3619 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/login_ja.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/login_ja.properties @@ -24,4 +24,4 @@ User=\u30E6\u30FC\u30B6\u30FC\u540D Password=\u30D1\u30B9\u30EF\u30FC\u30C9 login=\u30ED\u30B0\u30A4\u30F3 Remember\ me\ on\ this\ computer=\u6B21\u56DE\u304B\u3089\u5165\u529B\u3092\u7701\u7565 -signUp=\u30E1\u30F3\u30D0\u30FC\u3067\u306A\u3044\u4EBA\u306F\u3001\u30A2\u30AB\u30A6\u30F3\u30C8\u3092\u767B\u9332\u3057\u3066\u304F\u3060\u3055\u3044 \ No newline at end of file +signUp=\u30E1\u30F3\u30D0\u30FC\u3067\u306A\u3044\u4EBA\u306F\u3001\u30A2\u30AB\u30A6\u30F3\u30C8\u3092\u767B\u9332\u3057\u3066\u304F\u3060\u3055\u3044 diff --git a/core/src/main/resources/jenkins/model/Jenkins/login_tr.properties b/core/src/main/resources/jenkins/model/Jenkins/login_tr.properties index d3d0214f07..dd754814e7 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/login_tr.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/login_tr.properties @@ -23,5 +23,5 @@ signUp=E\u011fer \u00fcye de\u011filseniz bir kullan\u0131c\u0131 yarat\u0131n. User=Kullan\u0131c\u0131 Password=\u015eifre -Remember\ me\ on\ this\ computer=Beni\ bu\ bilgisayarda\ hat\u0131rla +Remember\ me\ on\ this\ computer=Beni bu bilgisayarda hat\u0131rla login=giri\u015f diff --git a/core/src/main/resources/jenkins/model/Jenkins/manage.jelly b/core/src/main/resources/jenkins/model/Jenkins/manage.jelly index d9dd6de40d..16a54119f6 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/manage.jelly +++ b/core/src/main/resources/jenkins/model/Jenkins/manage.jelly @@ -27,7 +27,7 @@ THE SOFTWARE. --> - + diff --git a/core/src/main/resources/jenkins/model/Jenkins/manage_ja.properties b/core/src/main/resources/jenkins/model/Jenkins/manage_ja.properties index 9b470c4b21..98323d1c09 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/manage_ja.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/manage_ja.properties @@ -21,4 +21,4 @@ # THE SOFTWARE. Manage\ Jenkins=Jenkins\u306e\u7ba1\u7406 -are.you.sure={0}: \u3088\u308d\u3057\u3044\u3067\u3059\u304b? \ No newline at end of file +are.you.sure={0}: \u3088\u308d\u3057\u3044\u3067\u3059\u304b? diff --git a/core/src/main/resources/jenkins/model/Jenkins/manage_tr.properties b/core/src/main/resources/jenkins/model/Jenkins/manage_tr.properties index b22e438404..bbcdc89662 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/manage_tr.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/manage_tr.properties @@ -20,5 +20,5 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Manage\ Jenkins=Jenkins''\u0131 Y\u00F6net +Manage\ Jenkins=Jenkins''i Y\u00F6net are.you.sure={0}: emin misin? diff --git a/core/src/main/resources/jenkins/model/Jenkins/newView_ja.properties b/core/src/main/resources/jenkins/model/Jenkins/newView_ja.properties index 453fb20f36..fc495090b3 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/newView_ja.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/newView_ja.properties @@ -21,4 +21,4 @@ # THE SOFTWARE. New\ View=\u65b0\u898f\u30d3\u30e5\u30fc -View\ name=\u30d3\u30e5\u30fc\u540d \ No newline at end of file +View\ name=\u30d3\u30e5\u30fc\u540d diff --git a/core/src/main/resources/jenkins/model/Jenkins/oops_pl.properties b/core/src/main/resources/jenkins/model/Jenkins/oops_pl.properties index a70107665c..d4418e81b9 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/oops_pl.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/oops_pl.properties @@ -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. -Twitter\:\ @jenkinsci=Twitter\:\ @jenkinsci +Twitter\:\ @jenkinsci=Twitter\: @jenkinsci Mailing\ Lists=Lista mailingowa Oops!=Oops! Bug\ tracker=Zg\u0142aszanie b\u0142\u0119d\u00F3w diff --git a/core/src/main/resources/jenkins/model/Jenkins/opensearch.xml.jelly b/core/src/main/resources/jenkins/model/Jenkins/opensearch.xml.jelly index 9b74bcf40e..20481de4e0 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/opensearch.xml.jelly +++ b/core/src/main/resources/jenkins/model/Jenkins/opensearch.xml.jelly @@ -26,10 +26,9 @@ THE SOFTWARE. OpenSearch description for using search box from browsers --> - - + + + Jenkins Jenkins at ${rootURL} @@ -38,4 +37,5 @@ THE SOFTWARE. + \ No newline at end of file diff --git a/core/src/main/resources/jenkins/model/Jenkins/projectRelationship-help_et.properties b/core/src/main/resources/jenkins/model/Jenkins/projectRelationship-help_et.properties index f16d6f0955..9967d4a849 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/projectRelationship-help_et.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/projectRelationship-help_et.properties @@ -1,6 +1,6 @@ # This file is under the MIT License by authors -For\ this\ feature\ to\ work,\ the\ following\ conditions\ need\ to\ be\ met:=Selle funktsiooni t\u00F6\u00F6tamiseks peavad olema t\u00E4idetud j\u00E4rgnevad tingimused: +For\ this\ feature\ to\ work,\ the\ following\ conditions\ need\ to\ be\ met\:=Selle funktsiooni t\u00F6\u00F6tamiseks peavad olema t\u00E4idetud j\u00E4rgnevad tingimused: The\ downstream\ project\ records\ the\ fingerprints\ of\ the\ upstream\ files\ it\ uses.=Allavoolu projekt salvestab nende \u00FClesvoolu failide s\u00F5rmej\u00E4ljed mida ta kasutab. The\ upstream\ project\ records\ the\ fingerprints\ of\ its\ build\ artifacts.=\u00DClesvoolu projekt salvestab oma j\u00E4rkude tulemuste s\u00F5rmej\u00E4ljed. This\ allows\ Jenkins\ to\ correlate\ two\ projects.=See lubab Jenkinsil seostada kaks projekti. diff --git a/core/src/main/resources/jenkins/model/Jenkins/projectRelationship-help_tr.properties b/core/src/main/resources/jenkins/model/Jenkins/projectRelationship-help_tr.properties index 9885e1fb9c..64af732691 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/projectRelationship-help_tr.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/projectRelationship-help_tr.properties @@ -25,7 +25,7 @@ body=\ E\u011fer birbirine ba\u011fl\u0131 projeleriniz varsa, Jenkins parmakizi deste\u011fi\ ile olu\u015fturulan kay\u0131tlar\u0131 kullanarak hangi upstream projenin hangi downstream proje taraf\u0131ndan\ kullan\u0131ld\u0131\u011f\u0131n\u0131 takip edebilir. -For\ this\ feature\ to\ work,\ the\ following\ conditions\ need\ to\ be\ met\:=Bu\ \u00f6zelli\u011fin\ \u00e7al\u0131\u015fabilmesi\ i\u00e7in\ devam\u0131ndaki\ \u015fartlar\u0131n\ sa\u011flanmas\u0131\ gerekir: -The\ upstream\ project\ records\ the\ fingerprints\ of\ its\ build\ artifacts.=Upstream\ proje\, kendi yap\u0131land\u0131rma artefaktlar\u0131n\u0131n\ parmakizlerini\ kaydeder. -The\ downstream\ project\ records\ the\ fingerprints\ of\ the\ upstream\ jar\ files\ it\ uses.=Downstream\ proje,\ upstream\ projeden\ kulland\u0131\u011f\u0131\ jar\'lar\u0131n\ parmakizini\ kaydeder. -This\ allows\ Jenkins\ to\ correlate\ two\ projects.=Bu,\ Jenkins\'a\ iki\ projeyi\ kar\u015f\u0131l\u0131kl\u0131\ ili\u015fkilendirme\ yetene\u011fini\ verir. +For\ this\ feature\ to\ work,\ the\ following\ conditions\ need\ to\ be\ met\:=Bu \u00f6zelli\u011fin \u00e7al\u0131\u015fabilmesi i\u00e7in devam\u0131ndaki \u015fartlar\u0131n sa\u011flanmas\u0131 gerekir: +The\ upstream\ project\ records\ the\ fingerprints\ of\ its\ build\ artifacts.=Upstream proje\, kendi yap\u0131land\u0131rma artefaktlar\u0131n\u0131n parmakizlerini kaydeder. +The\ downstream\ project\ records\ the\ fingerprints\ of\ the\ upstream\ jar\ files\ it\ uses.=Downstream proje, upstream projeden kulland\u0131\u011f\u0131 jar\'lar\u0131n parmakizini kaydeder. +This\ allows\ Jenkins\ to\ correlate\ two\ projects.=Bu, Jenkins\'e iki projeyi kar\u015f\u0131l\u0131kl\u0131 ili\u015fkilendirme yetene\u011fini verir. diff --git a/core/src/main/resources/jenkins/model/Jenkins/projectRelationship_de.properties b/core/src/main/resources/jenkins/model/Jenkins/projectRelationship_de.properties index 722fc6beaa..698d2c9ebf 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/projectRelationship_de.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/projectRelationship_de.properties @@ -25,4 +25,4 @@ upstream\ project=Vorgelagertes Projekt downstream\ project=Nachgelagertes Projekt Compare=Vergleichen There\ are\ no\ fingerprint\ records\ that\ connect\ these\ two\ projects.=\ - Es existieren keine Fingerabdrücke, welche diese beiden Projekte miteinander verbinden. \ No newline at end of file + Es existieren keine Fingerabdrücke, welche diese beiden Projekte miteinander verbinden. diff --git a/core/src/main/resources/jenkins/model/Jenkins/projectRelationship_ru.properties b/core/src/main/resources/jenkins/model/Jenkins/projectRelationship_ru.properties index 3809249d0d..547fb75159 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/projectRelationship_ru.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/projectRelationship_ru.properties @@ -24,4 +24,4 @@ Project\ Relationship=\u041e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f \u0 upstream\ project=\u0432\u043e\u0441\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 downstream\ project=\u043d\u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0438\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 Compare=\u0421\u0440\u0430\u0432\u043d\u0438\u0442\u044c -There\ are\ no\ fingerprint\ records\ that\ connect\ these\ two\ projects.=\u041d\u0435\u0442 \u043e\u0442\u043f\u0435\u0447\u0430\u0442\u043a\u043e\u0432 (fingerprints), \u0441\u043e\u0435\u0434\u0438\u043d\u044f\u044e\u0449\u0438\u0445 \u044d\u0442\u0438 \u0434\u0432\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \ No newline at end of file +There\ are\ no\ fingerprint\ records\ that\ connect\ these\ two\ projects.=\u041d\u0435\u0442 \u043e\u0442\u043f\u0435\u0447\u0430\u0442\u043a\u043e\u0432 (fingerprints), \u0441\u043e\u0435\u0434\u0438\u043d\u044f\u044e\u0449\u0438\u0445 \u044d\u0442\u0438 \u0434\u0432\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430. diff --git a/core/src/main/resources/jenkins/model/Jenkins/projectRelationship_tr.properties b/core/src/main/resources/jenkins/model/Jenkins/projectRelationship_tr.properties index 7bdfbdbde8..434dfdd2b8 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/projectRelationship_tr.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/projectRelationship_tr.properties @@ -21,6 +21,6 @@ # THE SOFTWARE. Project\ Relationship=Projelerin \u0130li\u015fkisi -upstream\ project=upstream\ proje -downstream\ project=downstream\ proje +upstream\ project=upstream proje +downstream\ project=downstream proje Compare=Kar\u015f\u0131la\u015ft\u0131r diff --git a/core/src/main/resources/jenkins/model/Jenkins/systemInfo.jelly b/core/src/main/resources/jenkins/model/Jenkins/systemInfo.jelly index a1224ebc48..7e5b30538d 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/systemInfo.jelly +++ b/core/src/main/resources/jenkins/model/Jenkins/systemInfo.jelly @@ -59,6 +59,53 @@ THE SOFTWARE. +

    ${%Memory Usage}

    + + + + + + + + + + +
    + ${%Timespan}: + + + ${%Short} + + + ${%Short} + + + + + + ${%Medium} + + + ${%Medium} + + + + + + ${%Long} + + + ${%Long} + + +
    + +

    ${%Thread Dumps}

    ${%threadDump_blurb('threadDump')}

    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 3c05d3719e..598e6bc8e1 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/systemInfo_ru.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/systemInfo_ru.properties @@ -29,4 +29,4 @@ 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 +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. diff --git a/core/src/main/resources/jenkins/model/Jenkins/systemInfo_tr.properties b/core/src/main/resources/jenkins/model/Jenkins/systemInfo_tr.properties index 8612528f97..15402a0854 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/systemInfo_tr.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/systemInfo_tr.properties @@ -20,5 +20,5 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -System\ Properties=Sistem\ \u00d6zellikleri -Environment\ Variables=Ortam\ De\u011fi\u015fkenleri +System\ Properties=Sistem \u00d6zellikleri +Environment\ Variables=Ortam De\u011fi\u015fkenleri diff --git a/core/src/main/resources/jenkins/model/Jenkins/threadDump_ru.properties b/core/src/main/resources/jenkins/model/Jenkins/threadDump_ru.properties index 0b9bf301ee..2de3307ce3 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/threadDump_ru.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/threadDump_ru.properties @@ -21,4 +21,4 @@ # THE SOFTWARE. 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 +Thread\ Dump=\u0414\u0430\u043c\u043f \u043f\u043e\u0442\u043e\u043a\u0430 diff --git a/core/src/main/resources/jenkins/model/JenkinsLocationConfiguration/config_ja.properties b/core/src/main/resources/jenkins/model/JenkinsLocationConfiguration/config_ja.properties index 5094fbbb71..15ac114a5c 100644 --- a/core/src/main/resources/jenkins/model/JenkinsLocationConfiguration/config_ja.properties +++ b/core/src/main/resources/jenkins/model/JenkinsLocationConfiguration/config_ja.properties @@ -22,4 +22,4 @@ Jenkins\ Location=Jenkins\u306e\u4f4d\u7f6e Jenkins\ URL=Jenkins URL -System\ Admin\ e-mail\ address=\u30b7\u30b9\u30c6\u30e0\u7ba1\u7406\u8005\u306e\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9 \ No newline at end of file +System\ Admin\ e-mail\ address=\u30b7\u30b9\u30c6\u30e0\u7ba1\u7406\u8005\u306e\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9 diff --git a/core/src/main/resources/jenkins/model/JenkinsLocationConfiguration/config_sr.properties b/core/src/main/resources/jenkins/model/JenkinsLocationConfiguration/config_sr.properties index 4ce696abc8..7029b7b4cc 100644 --- a/core/src/main/resources/jenkins/model/JenkinsLocationConfiguration/config_sr.properties +++ b/core/src/main/resources/jenkins/model/JenkinsLocationConfiguration/config_sr.properties @@ -3,4 +3,4 @@ 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 +Jenkins\ Location=Jenkins \u043B\u043E\u043A\u0430\u0446\u0438\u0458\u0430 diff --git a/core/src/main/resources/jenkins/model/JenkinsLocationConfiguration/config_tr.properties b/core/src/main/resources/jenkins/model/JenkinsLocationConfiguration/config_tr.properties index 6559200e04..ee75c83e3e 100644 --- a/core/src/main/resources/jenkins/model/JenkinsLocationConfiguration/config_tr.properties +++ b/core/src/main/resources/jenkins/model/JenkinsLocationConfiguration/config_tr.properties @@ -20,5 +20,5 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -System\ Admin\ e-mail\ address=Sistem\ Admin\ e-posta\ Adresi -Jenkins\ URL=Jenkins\ URL'i +System\ Admin\ e-mail\ address=Sistem Admin e-posta Adresi +Jenkins\ URL=Jenkins URL'i diff --git a/core/src/main/resources/jenkins/model/JobGlobalBuildDiscarderStrategy/config.jelly b/core/src/main/resources/jenkins/model/JobGlobalBuildDiscarderStrategy/config.jelly new file mode 100644 index 0000000000..c694ee8558 --- /dev/null +++ b/core/src/main/resources/jenkins/model/JobGlobalBuildDiscarderStrategy/config.jelly @@ -0,0 +1,30 @@ + + + + + + ${%blurb} + + diff --git a/core/src/main/resources/jenkins/model/JobGlobalBuildDiscarderStrategy/config.properties b/core/src/main/resources/jenkins/model/JobGlobalBuildDiscarderStrategy/config.properties new file mode 100644 index 0000000000..3e19a30f35 --- /dev/null +++ b/core/src/main/resources/jenkins/model/JobGlobalBuildDiscarderStrategy/config.properties @@ -0,0 +1,3 @@ +blurb = Build discarders configured for a job are only run after a build finishes. \ + This option runs jobs'' configured build discarders periodically, applying configuration changes even when no new builds are run. \ + This option has no effect if there is no build discarder configured for a job. diff --git a/core/src/main/resources/jenkins/model/MasterBuildConfiguration/config_sr.properties b/core/src/main/resources/jenkins/model/MasterBuildConfiguration/config_sr.properties index 57dfb3ee19..c6b5cfab6e 100644 --- a/core/src/main/resources/jenkins/model/MasterBuildConfiguration/config_sr.properties +++ b/core/src/main/resources/jenkins/model/MasterBuildConfiguration/config_sr.properties @@ -1,4 +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 +\#\ of\ executors=\u0431\u0440\u043E\u0458 \u0438\u0437\u0432\u0440\u0448\u0438\u0442\u0435\u0459\u0430 diff --git a/core/src/main/resources/jenkins/model/Messages.properties b/core/src/main/resources/jenkins/model/Messages.properties index df216cc5cd..64bf784b3c 100644 --- a/core/src/main/resources/jenkins/model/Messages.properties +++ b/core/src/main/resources/jenkins/model/Messages.properties @@ -58,6 +58,7 @@ IdStrategy.CaseSensitiveEmailAddress.DisplayName=Case sensitive (email address) Mailer.Address.Not.Configured=address not configured yet Mailer.Localhost.Error=Please set a valid host name, instead of localhost +Mailer.NotHttp.Error=The URL is invalid, please ensure you are using http:// or https:// with a valid domain. NewViewLink.NewView=New View @@ -70,7 +71,11 @@ BlockedBecauseOfBuildInProgress.shortDescription=Build #{0} is already in progre BlockedBecauseOfBuildInProgress.ETA=\ (ETA: {0}) BuildDiscarderProperty.displayName=Discard old builds -DownloadSettings.Warning.DisplayName=Browser-based metadata download EnforceSlaveAgentPortAdministrativeMonitor.displayName=Enforce TCP Agent Port CLI.disable-job.shortDescription=Disables a job. CLI.enable-job.shortDescription=Enables a job. + +GlobalCloudConfiguration.DisplayName=Configure Clouds + +SimpleGlobalBuildDiscarderStrategy.displayName=Specific Build Discarder +JobGlobalBuildDiscarderStrategy.displayName=Project Build Discarder diff --git a/core/src/main/resources/jenkins/model/Messages_bg.properties b/core/src/main/resources/jenkins/model/Messages_bg.properties index 264a216106..7ec1be6cca 100644 --- a/core/src/main/resources/jenkins/model/Messages_bg.properties +++ b/core/src/main/resources/jenkins/model/Messages_bg.properties @@ -111,9 +111,6 @@ CLI.disable-job.shortDescription=\ \u0418\u0437\u043a\u043b\u044e\u0447\u0432\u0430\u043d\u0435 \u043d\u0430 \u0437\u0430\u0434\u0430\u0447\u0430. CLI.enable-job.shortDescription=\ \u0412\u043a\u043b\u044e\u0447\u0432\u0430\u043d\u0435 \u043d\u0430 \u0437\u0430\u0434\u0430\u0447\u0430. -# Browser-based metadata download -DownloadSettings.Warning.DisplayName=\ - \u0418\u0437\u0442\u0435\u0433\u043b\u044f\u043d\u0430 \u043d\u0430 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u0438\u0442\u0435 \u0447\u0440\u0435\u0437 \u0431\u0440\u0430\u0443\u0437\u044a\u0440 # Enforce JNLP Slave Agent Port EnforceSlaveAgentPortAdministrativeMonitor.displayName=\ \u041a\u043e\u043d\u043a\u0440\u0435\u0442\u0435\u043d \u043f\u043e\u0440\u0442 \u0437\u0430 JNLP \u043d\u0430 \u043f\u043e\u0434\u0447\u0438\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u043c\u043f\u044e\u0442\u044a\u0440 diff --git a/core/src/main/resources/jenkins/model/Messages_da.properties b/core/src/main/resources/jenkins/model/Messages_da.properties index dedadb72f3..d640aaad0e 100644 --- a/core/src/main/resources/jenkins/model/Messages_da.properties +++ b/core/src/main/resources/jenkins/model/Messages_da.properties @@ -32,13 +32,13 @@ Hudson.NodeBeingRemoved=Node bliver fjernet Hudson.UnsafeChar=''{0}'' er et usikkert tegn Hudson.ViewAlreadyExists=En visning ved navn "{0}" findes allerede Hudson.ViewName=Alle -Hudson.NotUsesUTF8ToDecodeURL=\ -Din container bruger ikke UTF-8 til at afkode URLer. Hvis du bruger ikke-ASCII tegn i jobnavne etc, \ +Hudson.NotUsesUTF8ToDecodeURL=\ +Din container bruger ikke UTF-8 til at afkode URLer. Hvis du bruger ikke-ASCII tegn i jobnavne etc, \ vil dette skabe problemer. Hudson.ReadPermission.Description=\ L\u00e6serettigheden er n\u00f8dvendig for at se n\u00e6sten alle sider i Jenkins. \ Denne rettighed kan bruges n\u00e5r du ikke vil have uauthentificerede brugere til at \ -se Jenkins sider — tilbagekald denne rettighed fra den anonyme bruger, tilf\u00f8j \ +se Jenkins sider — tilbagekald denne rettighed fra den anonyme bruger, tilf\u00f8j \ derefter en "authentificeret" pseudo-bruger og giv denne l\u00e6serettigheder. Hudson.NodeDescription=master Jenkins noden diff --git a/core/src/main/resources/jenkins/model/Messages_de.properties b/core/src/main/resources/jenkins/model/Messages_de.properties index 687729c835..d19189566a 100644 --- a/core/src/main/resources/jenkins/model/Messages_de.properties +++ b/core/src/main/resources/jenkins/model/Messages_de.properties @@ -60,7 +60,6 @@ BlockedBecauseOfBuildInProgress.shortDescription=Build #{0} ist bereits in Arbei BlockedBecauseOfBuildInProgress.ETA=\ (ETA: {0}) BuildDiscarderProperty.displayName=Alte Builds verwerfen IdStrategy.CaseSensitive.DisplayName=Gro\u00DF- und Kleinschreibung beachtend -DownloadSettings.Warning.DisplayName=Browser-basierter Download von Metadaten CLI.shutdown.shortDescription=F\u00E4hrt Jenkins sofort herunter. EnforceSlaveAgentPortAdministrativeMonitor.displayName=Agent-Port wird bei Neustart zur\u00FCckgesetzt CauseOfInterruption.ShortDescription=Abgebrochen von {0} diff --git a/core/src/main/resources/jenkins/model/Messages_it.properties b/core/src/main/resources/jenkins/model/Messages_it.properties index 867bcfdd07..e064f3d7d7 100644 --- a/core/src/main/resources/jenkins/model/Messages_it.properties +++ b/core/src/main/resources/jenkins/model/Messages_it.properties @@ -26,7 +26,6 @@ Mailer.Address.Not.Configured=Indirizzo non ancora configurato IdStrategy.CaseSensitiveEmailAddress.DisplayName=Distinzione maiuscole/minuscole (indirizzo di posta elettronica) CauseOfInterruption.ShortDescription=Interrotto da {0} CLI.shutdown.shortDescription=Spegne immediatamente il server Jenkins. -DownloadSettings.Warning.DisplayName=Scaricamento metadati basato sul browser IdStrategy.CaseSensitive.DisplayName=Differenza maiuscole/minuscole Hudson.NotUsesUTF8ToDecodeURL=\ Il container non utilizza UTF-8 per decodificare gli URL. Se si utilizzano caratteri non ASCII come nomi \ diff --git a/core/src/main/resources/jenkins/model/ProjectNamingStrategy/PatternProjectNamingStrategy/config_fr.properties b/core/src/main/resources/jenkins/model/ProjectNamingStrategy/PatternProjectNamingStrategy/config_fr.properties index 058bb4c878..60552b8cea 100644 --- a/core/src/main/resources/jenkins/model/ProjectNamingStrategy/PatternProjectNamingStrategy/config_fr.properties +++ b/core/src/main/resources/jenkins/model/ProjectNamingStrategy/PatternProjectNamingStrategy/config_fr.properties @@ -1,3 +1,3 @@ namePattern=Pattern du nom description=Description -forceExistingJobs=Forcer les jobs existants \ No newline at end of file +forceExistingJobs=Forcer les jobs existants 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 index 20c36676bd..7afe0fe574 100644 --- a/core/src/main/resources/jenkins/model/ProjectNamingStrategy/PatternProjectNamingStrategy/config_sr.properties +++ b/core/src/main/resources/jenkins/model/ProjectNamingStrategy/PatternProjectNamingStrategy/config_sr.properties @@ -2,4 +2,4 @@ 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 +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 diff --git a/core/src/main/resources/jenkins/model/DownloadSettings/config_it.properties b/core/src/main/resources/jenkins/model/RenameAction/action_pl.properties similarity index 88% rename from core/src/main/resources/jenkins/model/DownloadSettings/config_it.properties rename to core/src/main/resources/jenkins/model/RenameAction/action_pl.properties index 9a8666c16d..50641f4479 100644 --- a/core/src/main/resources/jenkins/model/DownloadSettings/config_it.properties +++ b/core/src/main/resources/jenkins/model/RenameAction/action_pl.properties @@ -1,17 +1,17 @@ # The MIT License -# -# Copyright (c) 2014-2015, Harald Albers -# +# +# Copyright (c) 2019 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 @@ -20,4 +20,4 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Use\ browser\ for\ metadata\ download=Utilizza il browser per scaricare i metadati +Rename=Zmie\u0144 nazw\u0119 diff --git a/core/src/main/resources/jenkins/model/SimpleGlobalBuildDiscarderStrategy/config.jelly b/core/src/main/resources/jenkins/model/SimpleGlobalBuildDiscarderStrategy/config.jelly new file mode 100644 index 0000000000..8e9f880f9a --- /dev/null +++ b/core/src/main/resources/jenkins/model/SimpleGlobalBuildDiscarderStrategy/config.jelly @@ -0,0 +1,7 @@ + + + + ${%blurb} + + + diff --git a/core/src/main/resources/jenkins/model/SimpleGlobalBuildDiscarderStrategy/config.properties b/core/src/main/resources/jenkins/model/SimpleGlobalBuildDiscarderStrategy/config.properties new file mode 100644 index 0000000000..621323e43a --- /dev/null +++ b/core/src/main/resources/jenkins/model/SimpleGlobalBuildDiscarderStrategy/config.properties @@ -0,0 +1 @@ +blurb = The selected build discarder with be applied after any build finishes, as well as periodically. diff --git a/core/src/main/resources/jenkins/mvn/FilePathGlobalSettingsProvider/config_ja.properties b/core/src/main/resources/jenkins/mvn/FilePathGlobalSettingsProvider/config_ja.properties index dc4cdb00fa..7b415721fe 100644 --- a/core/src/main/resources/jenkins/mvn/FilePathGlobalSettingsProvider/config_ja.properties +++ b/core/src/main/resources/jenkins/mvn/FilePathGlobalSettingsProvider/config_ja.properties @@ -20,4 +20,4 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -File\ path=\u30d5\u30a1\u30a4\u30eb\u30d1\u30b9 \ No newline at end of file +File\ path=\u30d5\u30a1\u30a4\u30eb\u30d1\u30b9 diff --git a/core/src/main/resources/jenkins/mvn/FilePathSettingsProvider/config_ja.properties b/core/src/main/resources/jenkins/mvn/FilePathSettingsProvider/config_ja.properties index dc4cdb00fa..7b415721fe 100644 --- a/core/src/main/resources/jenkins/mvn/FilePathSettingsProvider/config_ja.properties +++ b/core/src/main/resources/jenkins/mvn/FilePathSettingsProvider/config_ja.properties @@ -20,4 +20,4 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -File\ path=\u30d5\u30a1\u30a4\u30eb\u30d1\u30b9 \ No newline at end of file +File\ path=\u30d5\u30a1\u30a4\u30eb\u30d1\u30b9 diff --git a/core/src/main/resources/jenkins/mvn/GlobalMavenConfig/config_fr.properties b/core/src/main/resources/jenkins/mvn/GlobalMavenConfig/config_fr.properties index 922175ad86..927d5d3e23 100644 --- a/core/src/main/resources/jenkins/mvn/GlobalMavenConfig/config_fr.properties +++ b/core/src/main/resources/jenkins/mvn/GlobalMavenConfig/config_fr.properties @@ -1,3 +1,3 @@ Maven\ Configuration=Configuration Maven Default\ settings\ provider=Fournisseur de r\u00e9glages par d\u00e9faut -Default\ global\ settings\ provider=Fournisseur de r\u00e9glages globaux par d\u00e9faut \ No newline at end of file +Default\ global\ settings\ provider=Fournisseur de r\u00e9glages globaux par d\u00e9faut diff --git a/core/src/main/resources/jenkins/mvn/GlobalMavenConfig/config_sr.properties b/core/src/main/resources/jenkins/mvn/GlobalMavenConfig/config_sr.properties index 5688142032..04e1038ed5 100644 --- a/core/src/main/resources/jenkins/mvn/GlobalMavenConfig/config_sr.properties +++ b/core/src/main/resources/jenkins/mvn/GlobalMavenConfig/config_sr.properties @@ -2,4 +2,4 @@ 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 +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 diff --git a/core/src/main/resources/jenkins/mvn/Messages_fr.properties b/core/src/main/resources/jenkins/mvn/Messages_fr.properties index e97f3b9e29..d48b601526 100644 --- a/core/src/main/resources/jenkins/mvn/Messages_fr.properties +++ b/core/src/main/resources/jenkins/mvn/Messages_fr.properties @@ -1,4 +1,4 @@ DefaultSettingsProvider.DisplayName=Utiliser les r\u00e9glages Maven par d\u00e9faut DefaultGlobalSettingsProvider.DisplayName=Utiliser les r\u00e9glages globaux Maven par d\u00e9faut FilePathGlobalSettingsProvider.DisplayName=Fichier de r\u00e9glages globaux Maven sur le syst\u00e8me de fichiers -FilePathSettingsProvider.DisplayName=Fichier de r\u00e9glages Maven sur le syst\u00e8me de fichiers \ No newline at end of file +FilePathSettingsProvider.DisplayName=Fichier de r\u00e9glages Maven sur le syst\u00e8me de fichiers diff --git a/core/src/main/resources/hudson/PluginManager/sites_pt_BR.properties b/core/src/main/resources/jenkins/security/ApiTokenProperty/config_pl.properties similarity index 86% rename from core/src/main/resources/hudson/PluginManager/sites_pt_BR.properties rename to core/src/main/resources/jenkins/security/ApiTokenProperty/config_pl.properties index 248960b9fa..14b2752cda 100644 --- a/core/src/main/resources/hudson/PluginManager/sites_pt_BR.properties +++ b/core/src/main/resources/jenkins/security/ApiTokenProperty/config_pl.properties @@ -1,6 +1,6 @@ # The MIT License # -# Copyright (c) 2004-2010, Sun Microsystems, Inc., Cleiber Silva +# Copyright (c) 2019 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,6 +20,6 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Remove=Remover -Add...=Adicionar... -Update\ Center=Central de atualiza\u00e7\u00f5es +NoTokenYet=Nie ma zarejestrowanych token\u00F3w dla tego u\u017Cytkownika +CurrentTokens=Aktualny token +AddNewToken=Dodaj nowy token diff --git a/core/src/main/resources/jenkins/security/Messages.properties b/core/src/main/resources/jenkins/security/Messages.properties index e9a8685477..5ff4e1274b 100644 --- a/core/src/main/resources/jenkins/security/Messages.properties +++ b/core/src/main/resources/jenkins/security/Messages.properties @@ -31,3 +31,19 @@ RekeySecretAdminMonitor.DisplayName=Re-keying UpdateSiteWarningsMonitor.DisplayName=Update Site Warnings QueueItemAuthenticatorMonitor.DisplayName=Access Control for Builds Token.Created.on=Token created on {0} + +ResourceDomainConfiguration.DisplayName=Resource Domain Recommendation +ResourceDomainConfiguration.NeedsRootURL=Can only set resource root URL if regular root URL is set. +ResourceDomainConfiguration.InvalidRootURL=Jenkins root URL is set to an invalid value, please report a bug: {0} +ResourceDomainConfiguration.Empty=Without a resource root URL, resources will be served from the main domain with Content-Security-Policy set. +ResourceDomainConfiguration.NotJenkins=The specified URL does not appear to point to a Jenkins instance. +ResourceDomainConfiguration.ThisJenkins=The specified URL is a valid resource root URL candidate. +ResourceDomainConfiguration.OtherJenkins=The specified URL points to a different Jenkins instance. +ResourceDomainConfiguration.SomeJenkins=The specified URL points to a Jenkins instance, but failed to determine whether it is this or another instance. +ResourceDomainConfiguration.ResourceResponse=The specified URL points to a previously set up Jenkins resource URL. +ResourceDomainConfiguration.FailedIdentityCheck=An error occurred when checking the instance identity at that URL: {0} {1} +ResourceDomainConfiguration.Exception=An exception occurred with the URL: {0} +ResourceDomainConfiguration.IOException=Failed to connect: {0} +ResourceDomainConfiguration.Invalid=Not a valid URL. +ResourceDomainConfiguration.SameAsJenkinsRoot=Cannot use the same host name for both Jenkins root URL and resource root URL. +ResourceDomainConfiguration.SameAsCurrent=You are currently accessing Jenkins through a URL similar to the proposed resource root URL. Saving this URL might remove your access to Jenkins. diff --git a/core/src/main/resources/jenkins/security/Messages_ja.properties b/core/src/main/resources/jenkins/security/Messages_ja.properties index cb047f0c2d..c09a07db22 100644 --- a/core/src/main/resources/jenkins/security/Messages_ja.properties +++ b/core/src/main/resources/jenkins/security/Messages_ja.properties @@ -22,4 +22,4 @@ ApiTokenProperty.DisplayName=API\u30c8\u30fc\u30af\u30f3 ApiTokenProperty.ChangeToken.Success=
    \u66f4\u65b0\u3057\u307e\u3057\u305f
    -RekeySecretAdminMonitor.DisplayName=\u30ad\u30fc\u306e\u518d\u751f\u6210 \ No newline at end of file +RekeySecretAdminMonitor.DisplayName=\u30ad\u30fc\u306e\u518d\u751f\u6210 diff --git a/core/src/main/resources/jenkins/security/Messages_sr.properties b/core/src/main/resources/jenkins/security/Messages_sr.properties index 5e74fc20dd..b5304f6aa5 100644 --- a/core/src/main/resources/jenkins/security/Messages_sr.properties +++ b/core/src/main/resources/jenkins/security/Messages_sr.properties @@ -4,4 +4,4 @@ ApiTokenProperty.DisplayName=\u0422\u043E\u043A\u0435\u043D \u0437\u0430 \u0410\ 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 +RekeySecretAdminMonitor.DisplayName=\u041F\u043E\u043D\u043E\u0432\u043E \u0445\u0435\u0448\u0438\u0440\u0430\u045A\u0435 diff --git a/core/src/main/resources/jenkins/security/Messages_zh_TW.properties b/core/src/main/resources/jenkins/security/Messages_zh_TW.properties index 73fc0f1b32..825a64b9f6 100644 --- a/core/src/main/resources/jenkins/security/Messages_zh_TW.properties +++ b/core/src/main/resources/jenkins/security/Messages_zh_TW.properties @@ -22,4 +22,4 @@ ApiTokenProperty.DisplayName=API Token ApiTokenProperty.ChangeToken.Success=
    \u5DF2\u66F4\u65B0
    -RekeySecretAdminMonitor.DisplayName=\u91D1\u9470\u91CD\u5957 \ No newline at end of file +RekeySecretAdminMonitor.DisplayName=\u91D1\u9470\u91CD\u5957 diff --git a/core/src/main/resources/jenkins/security/RekeySecretAdminMonitor/message_sr.properties b/core/src/main/resources/jenkins/security/RekeySecretAdminMonitor/message_sr.properties index 02192317a7..7fa69a4cb9 100644 --- a/core/src/main/resources/jenkins/security/RekeySecretAdminMonitor/message_sr.properties +++ b/core/src/main/resources/jenkins/security/RekeySecretAdminMonitor/message_sr.properties @@ -16,4 +16,4 @@ rekeySuccessful=\ \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 + \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. diff --git a/core/src/main/resources/jenkins/model/DownloadSettings/Warning/message.jelly b/core/src/main/resources/jenkins/security/ResourceDomainConfiguration/config.jelly similarity index 83% rename from core/src/main/resources/jenkins/model/DownloadSettings/Warning/message.jelly rename to core/src/main/resources/jenkins/security/ResourceDomainConfiguration/config.jelly index 8f842d0506..a28d4dc3c2 100644 --- a/core/src/main/resources/jenkins/model/DownloadSettings/Warning/message.jelly +++ b/core/src/main/resources/jenkins/security/ResourceDomainConfiguration/config.jelly @@ -2,7 +2,7 @@ - -
    -
    - - - -
    + + + + +
    diff --git a/core/src/main/resources/jenkins/security/ResourceDomainConfiguration/help-url.html b/core/src/main/resources/jenkins/security/ResourceDomainConfiguration/help-url.html new file mode 100644 index 0000000000..105e75fb7d --- /dev/null +++ b/core/src/main/resources/jenkins/security/ResourceDomainConfiguration/help-url.html @@ -0,0 +1,51 @@ +

    + Jenkins serves many files that are potentially created by untrusted users, such as files in project workspaces or archived artifacts. + When no resource root URL is defined, Jenkins will serve these files with the HTTP header Content-Security-Policy ("CSP"). + By default it is set to a value that disables many modern web features to prevent cross-site scripting (XSS) and other attacks on Jenkins users accessing these files. + While the specific value for the CSP header is user configurable (and can even be disabled), doing so is a trade-off between security and functionality. +

    +

    + If the resource root URL is defined, Jenkins will instead redirect requests for user-created resource files to URLs starting with the URL configured here. + These URLs will not set the CSP header, allowing Javascript and similar features to work. + For this option to work as expected, the following constraints and considerations apply: +

    +
      +
    • The resource root URL must be a valid alternative choice for the Jenkins root URL for requests to be processed correctly.
    • +
    • The Jenkins root URL must be set and it must be different from this resource root URL (in fact, a different host name is required).
    • +
    • + Once set, Jenkins will only serve resource URL requests via the resource root URL. + All other requests will get HTTP 404 Not Found responses. +
    • +
    +

    + Once this URL has been set up correctly, Jenkins will redirect requests to workspaces, archived artifacts, and similar collections of usually user-generated content to URLs starting with the resource root URL. + Instead of a path like job/name_here/ws, resource URLs will contain a token encoding that path, the user for which the URL was created, and when it was created. + These resource URLs access static files as if the user for which they were created would access them: + If the user’s permission to access these files is removed, the corresponding resource URLs will not work anymore either. + These URLs are accessible to anyone without authentication until they expire, so sharing these URLs is akin to sharing the files directly. +

    +

    Security considerations

    +

    Authentication

    +

    + Resource URLs do not require authentication (users will not have a valid session for the resource root URL). + Sharing a resource URL with another user, even one lacking Overall/Read permission for Jenkins, will grant that user access to these files until the URLs expire. +

    +

    Expiration

    +

    + Resource URLs expire after 30 minutes by default. + Expired resource URLs will redirect users to their equivalent Jenkins URLs, so that the user can reauthenticate, if necessary, and then be redirected back to a new resource URL that will be valid for another 30 minutes. + This will generally be transparent to the user if they have a valid Jenkins session. + Otherwise, they will need to authenticate with Jenkins again. + However, when browsing pages with HTML frames, like Javadoc sites, the login form cannot appear in a frame. + In these cases, users will need to reload the top-level frame to make the login form appear. +

    +

    + To change how quickly resource URLs expire, set the system property jenkins.security.ResourceDomainRootAction.validForMinutes to the desired value in minutes. + Earlier expiration might make it harder to use these URLs, while later expiration increases the likelihood of unauthorized users gaining access through URLs shared with them by authorized users. +

    +

    Authenticity

    +

    + Resource URLs encode the URL, the user for which they were created, and their creation timestamp. + Additionally, this string contains an HMAC to ensure the authenticity of the URL. + This prevents attackers from forging URLs that would grant them access to resource files as if they were another user. +

    \ No newline at end of file diff --git a/core/src/main/resources/jenkins/security/ResourceDomainRecommendation/message.groovy b/core/src/main/resources/jenkins/security/ResourceDomainRecommendation/message.groovy new file mode 100644 index 0000000000..1d7422033b --- /dev/null +++ b/core/src/main/resources/jenkins/security/ResourceDomainRecommendation/message.groovy @@ -0,0 +1,38 @@ +/* + * The MIT License + * + * Copyright 2019 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.ResourceDomainRecommendation + +def f = namespace(lib.FormTagLib) + +dl { + div(class: "alert alert-info") { + a(name: "resource-root-url") + form(method: "post", action: "${rootURL}/${my.url}/act") { + f.submit(name: 'redirect', value: _("Go to resource root URL configuration")) + f.submit(name: 'dismiss', value: _("Dismiss")) + } + + raw(_("blurb")) + } +} diff --git a/core/src/main/resources/jenkins/security/ResourceDomainRecommendation/message.properties b/core/src/main/resources/jenkins/security/ResourceDomainRecommendation/message.properties new file mode 100644 index 0000000000..8a237ecc72 --- /dev/null +++ b/core/src/main/resources/jenkins/security/ResourceDomainRecommendation/message.properties @@ -0,0 +1,2 @@ +blurb = The default Content-Security-Policy is currently overridden using the hudson.model.DirectoryBrowserSupport.CSP system property, which is a potential security issue when browsing untrusted files. \ + As an alternative, you can set up a Resource Root URL that Jenkins will use to serve some static files without adding Content-Security-Policy headers. diff --git a/core/src/main/resources/jenkins/security/csrf/CSRFAdministrativeMonitor/message_it.properties b/core/src/main/resources/jenkins/security/csrf/CSRFAdministrativeMonitor/message_it.properties index ad2e646e3e..b86414da24 100644 --- a/core/src/main/resources/jenkins/security/csrf/CSRFAdministrativeMonitor/message_it.properties +++ b/core/src/main/resources/jenkins/security/csrf/CSRFAdministrativeMonitor/message_it.properties @@ -25,4 +25,4 @@ warningMessage=L''emittente CSRF non Per ulteriori informazioni, fare riferimento a {0}. actionMessage=È possibile modificare la configurazione corrente nella sezione {0} della categoria Sicurezza. referenceUrlContent=questa pagina -actionUrlContent=Protezione CSRF \ No newline at end of file +actionUrlContent=Protezione CSRF 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 128a924bf3..19dba8c4b9 100644 --- a/core/src/main/resources/jenkins/security/s2m/AdminWhitelistRule/index.jelly +++ b/core/src/main/resources/jenkins/security/s2m/AdminWhitelistRule/index.jelly @@ -94,17 +94,17 @@ THE SOFTWARE.

     # deny access to anything in the SkunkWorks folder, regardless of what later rules say
    -deny read <JENKINS_HOME>/jobs/SkunkWorks/.*
    +deny read &lt;JENKINS_HOME>/jobs/SkunkWorks/.*
     
     # allow any access under builds
    -allow all <BUILDDIR>/.*
    +allow all &lt;BUILDDIR>/.*
     
     # allow read-only access under userContent
    -allow read,stat <JENKINS_HOME>/userContent/.*
    -
    -# GENERAL SYNTAX: (allow|deny) Op,Op,Op,... PathRegExp
    +allow read,stat &lt;JENKINS_HOME>/userContent/.*
     
    - +

    + General syntax: (allow|deny) Op,Op,Op,... PathRegExp, +

    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 bd5c7db995..8719f15b74 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. +blurb=O agente para o master security subsystem est\u00e1 desligado. \ Por favor leia a documenta\u00e7\u00e3o e ligue novamente. diff --git a/core/src/main/resources/hudson/PluginManager/sites_it.properties b/core/src/main/resources/jenkins/security/seed/UserSeedProperty/config_pl.properties similarity index 76% rename from core/src/main/resources/hudson/PluginManager/sites_it.properties rename to core/src/main/resources/jenkins/security/seed/UserSeedProperty/config_pl.properties index 9dc12245d2..4374a9b0d8 100644 --- a/core/src/main/resources/hudson/PluginManager/sites_it.properties +++ b/core/src/main/resources/jenkins/security/seed/UserSeedProperty/config_pl.properties @@ -1,6 +1,6 @@ # The MIT License # -# Copyright (c) 2004-, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributors +# Copyright (c) 2019, 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,6 +20,8 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Update\ Center=Centro aggiornamenti -Remove=Rimuovi -Add...=Aggiungi... +resetSeed.button=Zako\u0144cz wszystkie sesje +resetSeed.result=Operacja zako\u0144czona pomy\u015Blnie. Wszystkie sesje zako\u0144czone. +resetSeed.confirmation=Wszystkie aktywne sesje zostan\u0105 zako\u0144czone. \n\ +B\u0119dzie wymagane ponowne zalogowanie si\u0119. \n\ +Czy kontynuowa\u0107? diff --git a/core/src/main/resources/jenkins/security/stapler/default-views-whitelist.txt b/core/src/main/resources/jenkins/security/stapler/default-views-whitelist.txt new file mode 100644 index 0000000000..2f46c52312 --- /dev/null +++ b/core/src/main/resources/jenkins/security/stapler/default-views-whitelist.txt @@ -0,0 +1,34 @@ +# This file contains the built-in whitelist of allows views for Stapler dispatch filtering. +# This is provided as part of SECURITY-534 for backward compatibility. + +# Format: fully qualified class name of model class, a space, and then a space-separated list of view names to allow or deny (prefix with !) +# * class names can be repeated +# * subclasses of classes listed here are also whitelisted with the same view names +# Example: +# io.jenkins.plugins.example.ModelClass viewA viewB !viewC + +# https://plugins.jenkins.io/gerrit-trigger +com.sonyericsson.hudson.plugins.gerrit.trigger.hudsontrigger.actions.manual.ManualTriggerAction help-Search + +# https://plugins.jenkins.io/depgraph-view +# This works experimentally even without this entry, but probably only because of buffer size, so be safe +hudson.plugins.depgraph_view.AbstractDependencyGraphAction jsplumb + +# https://plugins.jenkins.io/multi-slave-config-plugin +com.sonyericsson.hudson.plugins.multislaveconfigplugin.NodeManageLink slavefilter + +# https://plugins.jenkins.io/coverity +jenkins.plugins.coverity.CheckConfig$DescriptorImpl checkConfig +jenkins.plugins.coverity.CIMStream$DescriptorImpl defectFilters + +# https://plugins.jenkins.io/sounds +net.hurstfrost.hudson.sounds.SoundsAgentAction jsonpdemo + +# https://plugins.jenkins.io/scm2job +com.unitedinternet.jenkins.plugins.scm2job.SCM2Job showResultsPlain + +# https://plugins.jenkins.io/serenity +com.ikokoon.serenity.hudson.SerenityProjectAction nocoverage + +# https://plugins.jenkins.io/pipeline-config-history +org.jenkinsci.plugins.pipelineConfigHistory.view.PipelineConfigHistoryProjectAction configSingleFile diff --git a/core/src/main/resources/jenkins/security/whitelisted-classes.txt b/core/src/main/resources/jenkins/security/whitelisted-classes.txt index 3ddb8d841a..8007fc52ea 100644 --- a/core/src/main/resources/jenkins/security/whitelisted-classes.txt +++ b/core/src/main/resources/jenkins/security/whitelisted-classes.txt @@ -124,6 +124,7 @@ java.util.TreeSet java.util.UUID java.util.Vector java.util.concurrent.ConcurrentHashMap +java.util.concurrent.ConcurrentLinkedDeque java.util.concurrent.ConcurrentLinkedQueue java.util.concurrent.ConcurrentSkipListMap java.util.concurrent.CopyOnWriteArrayList diff --git a/core/src/main/resources/jenkins/slaves/DeprecatedAgentProtocolMonitor/message.jelly b/core/src/main/resources/jenkins/slaves/DeprecatedAgentProtocolMonitor/message.jelly deleted file mode 100644 index e81dd150c9..0000000000 --- a/core/src/main/resources/jenkins/slaves/DeprecatedAgentProtocolMonitor/message.jelly +++ /dev/null @@ -1,7 +0,0 @@ - - -
    - ${%blurb(it.deprecatedProtocols)} - ${%See Protocol Configuration(rootURL)} -
    -
    diff --git a/core/src/main/resources/jenkins/slaves/DeprecatedAgentProtocolMonitor/message.properties b/core/src/main/resources/jenkins/slaves/DeprecatedAgentProtocolMonitor/message.properties deleted file mode 100644 index a418a180c6..0000000000 --- a/core/src/main/resources/jenkins/slaves/DeprecatedAgentProtocolMonitor/message.properties +++ /dev/null @@ -1,5 +0,0 @@ -blurb=This Jenkins instance uses deprecated protocols: {0}. \ - It may impact stability of the instance. \ - If newer protocol versions are supported by all system components (agents, CLI and other clients), \ - it is highly recommended to disable the deprecated protocols. -Protocol\ Configuration=Protocol Configuration. diff --git a/core/src/main/resources/jenkins/slaves/DeprecatedAgentProtocolMonitor/message_bg.properties b/core/src/main/resources/jenkins/slaves/DeprecatedAgentProtocolMonitor/message_bg.properties deleted file mode 100644 index a001cdd2ab..0000000000 --- a/core/src/main/resources/jenkins/slaves/DeprecatedAgentProtocolMonitor/message_bg.properties +++ /dev/null @@ -1,35 +0,0 @@ -# The MIT License -# -# Bulgarian translation: Copyright (c) 2017, 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. - -# This Jenkins instance uses deprecated protocols: {0}. \ -# It may impact stability of the instance. \ -# If newer protocol versions are supported by all system components (agents, CLI and other clients), \ -# it is highly recommended to disable the deprecated protocols. -blurb=\ - \u0422\u0430\u0437\u0438 \u0438\u043D\u0441\u0442\u0430\u043B\u0430\u0446\u0438\u044F \u043D\u0430 Jenkins \u0438\u0437\u043F\u043E\u043B\u0437\u0432\u0430 \u043E\u0441\u0442\u0430\u0440\u0435\u043B\u0438 \u043F\u0440\u043E\u0442\u043E\u043A\u043E\u043B\u0438: {0}. \u0422\u043E\u0432\u0430 \u043C\u043E\u0436\u0435 \u0434\u0430 \u0441\u0435\ - \u043E\u0442\u0440\u0430\u0437\u0438 \u043D\u0430 \u0441\u0442\u0430\u0431\u0438\u043B\u043D\u043E\u0441\u0442\u0442\u0430 \u045D. \u0410\u043A\u043E \u0432\u0441\u0438\u0447\u043A\u0438 \u0441\u0438\u0441\u0442\u0435\u043C\u043D\u0438 \u043A\u043E\u043C\u043F\u043E\u043D\u0435\u043D\u0442\u0438, \u043A\u0430\u0442\u043E \u0430\u0433\u0435\u043D\u0442\u0438\u0442\u0435,\ - \u043A\u043E\u043C\u0430\u043D\u0434\u043D\u0438\u044F \u0440\u0435\u0434 \u0438 \u0434\u0440\u0443\u0433\u0438\u0442\u0435 \u043A\u043B\u0438\u0435\u043D\u0442\u0438 \u043F\u043E\u0434\u0434\u044A\u0440\u0436\u0430\u0442 \u043D\u043E\u0432\u0438\u0442\u0435 \u043F\u0440\u043E\u0442\u043E\u043A\u043E\u043B\u0438, \u0441\u0438\u043B\u043D\u043E \u043F\u0440\u0435\u043F\u043E\u0440\u044A\u0447\u0432\u0430\u043C\u0435\ - \u0434\u0430 \u0438\u0437\u043A\u043B\u044E\u0447\u0438\u0442\u0435 \u043E\u0441\u0442\u0430\u0440\u0435\u043B\u0438\u0442\u0435. -# It may impact stability of the instance. \ -# If newer protocol versions are supported by all system components (agents, CLI and other clients), \ -# it is highly recommended to disable the deprecated protocols. - diff --git a/core/src/main/resources/jenkins/slaves/DeprecatedAgentProtocolMonitor/message_it.properties b/core/src/main/resources/jenkins/slaves/DeprecatedAgentProtocolMonitor/message_it.properties deleted file mode 100644 index 78f92b4903..0000000000 --- a/core/src/main/resources/jenkins/slaves/DeprecatedAgentProtocolMonitor/message_it.properties +++ /dev/null @@ -1,28 +0,0 @@ -# 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. - -blurb=Quest''istanza di Jenkins utilizza protocolli deprecati: {0}. \ - Ci\uFFFD potrebbe influenzare la stabilit\uFFFD dell''istanza. \ - Se le nuove versioni dei protocolli sono supportate da tutti i componenti di sistema (agenti, \ - interfaccia da riga di comando e altri client), \uFFFD fortemente raccomandato disabilitare i \ - protocolli deprecati. -See\ Protocol\ Configuration=Vedi Configurazione protocollo. diff --git a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol/deprecationCause.jelly b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol/deprecationCause.jelly deleted file mode 100644 index 9704ac6557..0000000000 --- a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol/deprecationCause.jelly +++ /dev/null @@ -1,4 +0,0 @@ - - - ${%message} - diff --git a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol/deprecationCause.properties b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol/deprecationCause.properties deleted file mode 100644 index 714d1f68ea..0000000000 --- a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol/deprecationCause.properties +++ /dev/null @@ -1,2 +0,0 @@ -message=This protocol is an obsolete protocol, which has been replaced by version 4. \ - It is also not encrypted. diff --git a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol/deprecationCause_bg.properties b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol/deprecationCause_bg.properties deleted file mode 100644 index 2f66522f0e..0000000000 --- a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol/deprecationCause_bg.properties +++ /dev/null @@ -1,26 +0,0 @@ -# The MIT License -# -# Bulgarian translation: Copyright (c) 2017, 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. - -# This protocol is an obsolete protocol, which has been replaced by JNLP2-connect. \ -# It is also not encrypted. -message=\ - \u0422\u043e\u0437\u0438 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u0435 \u043e\u0441\u0442\u0430\u0440\u044f\u043b \u0438 \u0435 \u0431\u0435\u0437 \u0448\u0438\u0444\u0440\u0438\u0440\u0430\u043d\u0435. \u0417\u0430\u043c\u0435\u043d\u0435\u043d \u0435 \u043e\u0442 JNLP2-connect. diff --git a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol/deprecationCause_it.properties b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol/deprecationCause_it.properties deleted file mode 100644 index bd2140b934..0000000000 --- a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol/deprecationCause_it.properties +++ /dev/null @@ -1,24 +0,0 @@ -# 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. - -message=Questo protocollo è un protocollo obsoleto rimpiazzato da JNLP2-connect. \ - Inoltre, non è criptato. diff --git a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol/description.jelly b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol/description.jelly deleted file mode 100644 index 55e2c974b5..0000000000 --- a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol/description.jelly +++ /dev/null @@ -1,4 +0,0 @@ - - - ${%summary} - diff --git a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol/description.properties b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol/description.properties deleted file mode 100644 index f4a0f9073c..0000000000 --- a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol/description.properties +++ /dev/null @@ -1,2 +0,0 @@ -summary=Accepts connections from remote clients so that they can be used as additional agents. \ - This protocol is unencrypted. diff --git a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol/description_bg.properties b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol/description_bg.properties deleted file mode 100644 index 4e35de871c..0000000000 --- a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol/description_bg.properties +++ /dev/null @@ -1,30 +0,0 @@ -# The MIT License -# -# Bulgarian translation: Copyright (c) 2016, 2017, 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. - -Accepts\ connections\ from\ remote\ clients\ so\ that\ they\ can\ be\ used\ as\ additional\ build\ agents=\ - \u041f\u0440\u0438\u0435\u043c\u0430\u043d\u0435 \u043d\u0430 \u0432\u0440\u044a\u0437\u043a\u0438 \u043e\u0442 \u043e\u0442\u0434\u0430\u043b\u0435\u0447\u0435\u043d\u0438 \u043a\u043b\u0438\u0435\u043d\u0442\u0438, \u0442\u0430\u043a\u0430 \u0447\u0435 \u0442\u0435 \u0434\u0430 \u0441\u0435 \u0438\u0437\u043f\u043e\u043b\u0437\u0432\u0430\u0442 \u043a\u0430\u0442\u043e\ - \u0434\u043e\u043f\u044a\u043b\u043d\u0438\u0442\u0435\u043b\u043d\u0438 \u043c\u0430\u0448\u0438\u043d\u0438 \u0437\u0430 \u0438\u0437\u0433\u0440\u0430\u0436\u0434\u0430\u043d\u0435. -# Accepts connections from remote clients so that they can be used as additional agents. \ -# This protocol is unencrypted. -summary=\ - \u041f\u0440\u0438\u0435\u043c\u0430\u043d\u0435 \u043d\u0430 \u0432\u0440\u044a\u0437\u043a\u0438 \u043e\u0442 \u043e\u0442\u0434\u0430\u043b\u0435\u0447\u0435\u043d\u0438 \u043a\u043b\u0438\u0435\u043d\u0442\u0438, \u0442\u0430\u043a\u0430 \u0447\u0435 \u0442\u0435 \u0434\u0430 \u0441\u0435 \u0438\u0437\u043f\u043e\u043b\u0437\u0432\u0430\u0442 \u043a\u0430\u0442\u043e\ - \u0434\u043e\u043f\u044a\u043b\u043d\u0438\u0442\u0435\u043b\u043d\u0438 \u043c\u0430\u0448\u0438\u043d\u0438 \u0437\u0430 \u0438\u0437\u0433\u0440\u0430\u0436\u0434\u0430\u043d\u0435. \u041f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u044a\u0442 \u043d\u0435 \u0435 \u0437\u0430\u0449\u0438\u0442\u0435\u043d \u0441 \u0448\u0438\u0444\u0440\u0438\u0440\u0430\u043d\u0435. diff --git a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol/description_de.properties b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol/description_de.properties deleted file mode 100644 index 61f21fa183..0000000000 --- a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol/description_de.properties +++ /dev/null @@ -1,24 +0,0 @@ -# The MIT License -# -# Copyright (c) 2017 Daniel Beck 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. - -summary=Bedient Verbindungen von entfernten Clients, damit diese als Agenten verwendet werden k\u00F6nnen. \ - Dieses Protokoll ist unverschl\u00FCsselt. diff --git a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol/description_it.properties b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol/description_it.properties deleted file mode 100644 index c42ad94e0c..0000000000 --- a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol/description_it.properties +++ /dev/null @@ -1,24 +0,0 @@ -# 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. - -summary=Accetta connessioni dai client remoti in modo che questi possano essere utilizzati \ - come agenti di compilazione aggiuntivi. Questo protocollo non è criptato. diff --git a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol/description_sr.properties b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol/description_sr.properties deleted file mode 100644 index 3f5c9d27c2..0000000000 --- a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol/description_sr.properties +++ /dev/null @@ -1,3 +0,0 @@ -# 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/deprecationCause.jelly b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol2/deprecationCause.jelly deleted file mode 100644 index 17138fc4fe..0000000000 --- a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol2/deprecationCause.jelly +++ /dev/null @@ -1,5 +0,0 @@ - - - ${%message} - ${%TCP Agent Protocol 2 Errata} - diff --git a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol2/deprecationCause.properties b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol2/deprecationCause.properties deleted file mode 100644 index e84662a073..0000000000 --- a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol2/deprecationCause.properties +++ /dev/null @@ -1,3 +0,0 @@ -message=This protocol has known stability issues, and it is replaced by version 4. \ - It is also not encrypted. \ - See more information in the protocol Errata. diff --git a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol2/deprecationCause_bg.properties b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol2/deprecationCause_bg.properties deleted file mode 100644 index 35fdea705a..0000000000 --- a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol2/deprecationCause_bg.properties +++ /dev/null @@ -1,30 +0,0 @@ -# The MIT License -# -# Bulgarian translation: Copyright (c) 2017, 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. - -JNLP2\ Protocol\ Errata=\ - \u0413\u0440\u0435\u0448\u043a\u0438 \u0432 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 JNLP2 -# This protocol has known stability issues, and it is replaced by JNLP4. \ -# It is also not encrypted. \ -# See more information in the protocol Errata. -message=\ - \u0422\u043e\u0437\u0438 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u043d\u0435 \u0435 \u0441\u0442\u0430\u0431\u0438\u043b\u0435\u043d \u0438 \u0435 \u0437\u0430\u043c\u0435\u043d\u0435\u043d \u043e\u0442 JNLP4. \u0412 JNLP2 \u043b\u0438\u043f\u0441\u0432\u0430 \u0448\u0438\u0444\u0440\u0438\u0440\u0430\u043d\u0435.\ - \u0417\u0430 \u043f\u043e\u0432\u0435\u0447\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0432\u0438\u0436\u0442\u0435 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f\u0442\u0430 \u0437\u0430 \u0433\u0440\u0435\u0448\u043a\u0438\u0442\u0435 \u0432 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430. diff --git a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol2/deprecationCause_it.properties b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol2/deprecationCause_it.properties deleted file mode 100644 index 8ae8437b43..0000000000 --- a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol2/deprecationCause_it.properties +++ /dev/null @@ -1,26 +0,0 @@ -# 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. - -message=Questo protocollo ha problemi di stabilità noti ed è stato sostituito da JNLP4. \ - Non è inoltre criptato. \ - Si vedano ulteriori informazioni nell''Errata corrige del protocollo. -JNLP2\ Protocol\ Errata=Errata corrige protocollo JNLP2 diff --git a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol2/description.jelly b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol2/description.jelly deleted file mode 100644 index 55e2c974b5..0000000000 --- a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol2/description.jelly +++ /dev/null @@ -1,4 +0,0 @@ - - - ${%summary} - diff --git a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol2/description.properties b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol2/description.properties deleted file mode 100644 index edb6b96c46..0000000000 --- a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol2/description.properties +++ /dev/null @@ -1,3 +0,0 @@ -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_bg.properties b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol2/description_bg.properties deleted file mode 100644 index e49efb0715..0000000000 --- a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol2/description_bg.properties +++ /dev/null @@ -1,33 +0,0 @@ -# The MIT License -# -# Bulgarian translation: Copyright (c) 2016, 2017, 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. - -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=\ - \u0420\u0430\u0437\u0448\u0438\u0440\u044f\u0432\u0430\u043d\u0435 \u043d\u0430 \u0432\u0435\u0440\u0441\u0438\u044f 1 \u043d\u0430 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430, \u043a\u0430\u0442\u043e \u0441\u0435 \u0434\u043e\u0431\u0430\u0432\u044f \u0431\u0438\u0441\u043a\u0432\u0438\u0442\u043a\u0430 \u0437\u0430 \u0432\u0441\u0435\u043a\u0438\ - \u043a\u043b\u0438\u0435\u043d\u0442. \u0422\u043e\u0432\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0432\u0430 \u043e\u0442\u043a\u0440\u0438\u0432\u0430\u043d\u0435\u0442\u043e \u043d\u0430 \u0432\u044a\u0437\u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0432\u0430\u043d\u0435\u0442\u043e \u043d\u0430 \u0432\u0440\u044a\u0437\u043a\u0438\u0442\u0435 \u043e\u0442\ - \u0430\u0433\u0435\u043d\u0442\u0438\u0442\u0435 \u0438 \u043f\u0440\u0435\u0434\u043f\u0440\u0438\u0435\u043c\u0430\u043d\u0435 \u043d\u0430 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u043e\u0442\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435. -# 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. -summary=\ - \u0420\u0430\u0437\u0448\u0438\u0440\u044f\u0432\u0430\u043d\u0435 \u043d\u0430 \u0432\u0435\u0440\u0441\u0438\u044f 1 \u043d\u0430 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430, \u043a\u0430\u0442\u043e \u0441\u0435 \u0434\u043e\u0431\u0430\u0432\u044f \u0431\u0438\u0441\u043a\u0432\u0438\u0442\u043a\u0430 \u0437\u0430 \u0432\u0441\u0435\u043a\u0438\ - \u043a\u043b\u0438\u0435\u043d\u0442. \u0422\u043e\u0432\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0432\u0430 \u043e\u0442\u043a\u0440\u0438\u0432\u0430\u043d\u0435\u0442\u043e \u043d\u0430 \u0432\u044a\u0437\u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0432\u0430\u043d\u0435\u0442\u043e \u043d\u0430 \u0432\u0440\u044a\u0437\u043a\u0438\u0442\u0435 \u043e\u0442\ - \u0430\u0433\u0435\u043d\u0442\u0438\u0442\u0435 \u0438 \u043f\u0440\u0435\u0434\u043f\u0440\u0438\u0435\u043c\u0430\u043d\u0435 \u043d\u0430 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u043e\u0442\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435. \u0422\u043e\u0437\u0438 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u0435 \u043d\u0435\u0437\u0430\u0449\u0438\u0442\u0435\u043d. diff --git a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol2/description_de.properties b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol2/description_de.properties deleted file mode 100644 index b4b1383d45..0000000000 --- a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol2/description_de.properties +++ /dev/null @@ -1,23 +0,0 @@ -# The MIT License -# -# Copyright (c) 2017 Daniel Beck 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. - -summary=Erweitert das Protokoll Version 1 um Identifikations-Cookies f\u00FCr Clients, so dass erneute Verbindungsversuche desselben Agenten identifiziert und entsprechend behandelt werden k\u00F6nnen. Dieses Protkoll ist unverschl\u00FCsselt. diff --git a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol2/description_it.properties b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol2/description_it.properties deleted file mode 100644 index 3c298bbc12..0000000000 --- a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol2/description_it.properties +++ /dev/null @@ -1,25 +0,0 @@ -# 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. - -summary=Estende la versione 1 del protocollo aggiungendo un cookie per ogni client \ - in modo da rilevare una nuova connessione da parte dell''agent e intraprendere le azioni opportune. \ - Questo protocollo non è criptato. diff --git a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol2/description_sr.properties b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol2/description_sr.properties deleted file mode 100644 index f96b74e2e0..0000000000 --- a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol2/description_sr.properties +++ /dev/null @@ -1,3 +0,0 @@ -# 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/deprecationCause.jelly b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol3/deprecationCause.jelly deleted file mode 100644 index 780b7239db..0000000000 --- a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol3/deprecationCause.jelly +++ /dev/null @@ -1,5 +0,0 @@ - - - ${%This protocol is unstable. See the protocol documentation for more info.} - ${%TCP Agent Protocol 3 Errata} - diff --git a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol3/deprecationCause.properties b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol3/deprecationCause.properties deleted file mode 100644 index 8b13789179..0000000000 --- a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol3/deprecationCause.properties +++ /dev/null @@ -1 +0,0 @@ - diff --git a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol3/deprecationCause_bg.properties b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol3/deprecationCause_bg.properties deleted file mode 100644 index c0ffc66602..0000000000 --- a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol3/deprecationCause_bg.properties +++ /dev/null @@ -1,26 +0,0 @@ -# The MIT License -# -# Bulgarian translation: Copyright (c) 2017, 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. - -JNLP3\ Protocol\ Errata=\ - \u0413\u0440\u0435\u0448\u043a\u0438 \u0432 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 JNLP3 -This\ protocol\ is\ unstable.\ See\ the\ protocol\ documentation\ for\ more\ info.=\ - \u0422\u043e\u0437\u0438 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u0435 \u043d\u0435\u0441\u0442\u0430\u0431\u0438\u043b\u0435\u043d. \u0417\u0430 \u043f\u043e\u0432\u0435\u0447\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0432\u0438\u0436\u0442\u0435 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f\u0442\u0430 \u043c\u0443. diff --git a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol3/deprecationCause_it.properties b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol3/deprecationCause_it.properties deleted file mode 100644 index 9032ff199c..0000000000 --- a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol3/deprecationCause_it.properties +++ /dev/null @@ -1,24 +0,0 @@ -# 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. - -JNLP3\ Protocol\ Errata=Errata corrige protocollo JNLP3 -This\ protocol\ is\ unstable.\ See\ the\ protocol\ documentation\ for\ more\ info.=Questo protocollo non è stabile. Si veda la documentazione del protocollo per ulteriori informazioni. diff --git a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol3/description.jelly b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol3/description.jelly deleted file mode 100644 index 55e2c974b5..0000000000 --- a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol3/description.jelly +++ /dev/null @@ -1,4 +0,0 @@ - - - ${%summary} - diff --git a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol3/description.properties b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol3/description.properties deleted file mode 100644 index ec1f6a2c89..0000000000 --- a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol3/description.properties +++ /dev/null @@ -1 +0,0 @@ -summary=Extends the version 2 protocol by adding basic encryption but requires a thread per client. diff --git a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol3/description_bg.properties b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol3/description_bg.properties deleted file mode 100644 index 2a41070810..0000000000 --- a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol3/description_bg.properties +++ /dev/null @@ -1,35 +0,0 @@ -# The MIT License -# -# Bulgarian translation: Copyright (c) 2016, 2017 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. - -Extends\ the\ version\ 2\ protocol\ by\ adding\ basic\ encryption\ but\ requires\ a\ thread\ per\ client=\ - \u0420\u0430\u0437\u0448\u0438\u0440\u044f\u0432\u0430\u043d\u0435 \u043d\u0430 \u0432\u0435\u0440\u0441\u0438\u044f 2 \u043d\u0430 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 \u043a\u0430\u0442\u043e \u0441\u0435 \u0434\u043e\u0431\u0430\u0432\u044f \u0448\u0438\u0444\u0440\u0438\u0440\u0430\u043d\u0435, \u043d\u043e \u0442\u043e\u0432\u0430\ - \u0438\u0437\u0438\u0441\u043a\u0432\u0430 \u043f\u043e \u0435\u0434\u043d\u0430 \u043d\u0438\u0448\u043a\u0430 \u0437\u0430 \u0432\u0441\u0435\u043a\u0438 \u043a\u043b\u0438\u0435\u043d\u0442 -# 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. -summary=\ - \u0420\u0430\u0437\u0448\u0438\u0440\u044f\u0432\u0430\u043d\u0435 \u043d\u0430 \u0432\u0435\u0440\u0441\u0438\u044f 2 \u043d\u0430 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 \u043a\u0430\u0442\u043e \u0441\u0435 \u0434\u043e\u0431\u0430\u0432\u044f \u0448\u0438\u0444\u0440\u0438\u0440\u0430\u043d\u0435, \u043d\u043e \u0442\u043e\u0432\u0430\ - \u0438\u0437\u0438\u0441\u043a\u0432\u0430 \u043f\u043e \u0435\u0434\u043d\u0430 \u043d\u0438\u0448\u043a\u0430 \u0437\u0430 \u0432\u0441\u0435\u043a\u0438 \u043a\u043b\u0438\u0435\u043d\u0442. \u041a\u043e\u0433\u0430\u0442\u043e \u043d\u0435 \u043c\u043e\u0436\u0435 \u0434\u0430 \u0441\u0435 \u0441\u044a\u0437\u0434\u0430\u0434\u0435 \u0437\u0430\u0449\u0438\u0442\u0435\u043d\u0430\ - \u0432\u0440\u044a\u0437\u043a\u0430, \u0442\u043e\u0437\u0438 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u043f\u0440\u0438\u0431\u044f\u0433\u0432\u0430 \u0434\u043e Java Web Start Agent Protocol/2, \u043a\u043e\u0439\u0442\u043e \u043d\u0435 \u0435\ - \u0448\u0438\u0444\u0440\u0438\u0440\u0430\u043d. \u0422\u043e\u0432\u0430 \u043d\u0435 \u0435 \u043f\u0440\u0435\u043f\u043e\u0440\u044a\u0447\u0438\u0442\u0435\u043b\u043d\u043e \u2014 \u0438\u0437\u043f\u043e\u043b\u0437\u0432\u0430\u0439\u0442e Java Web Start Agent\ - Protocol/4 \u0432\u043c\u0435\u0441\u0442\u043e \u0442\u043e\u0432\u0430. diff --git a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol3/description_de.properties b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol3/description_de.properties deleted file mode 100644 index 6280077683..0000000000 --- a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol3/description_de.properties +++ /dev/null @@ -1,23 +0,0 @@ -# The MIT License -# -# Copyright (c) 2017 Daniel Beck 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. - -summary=Erweitert das Protokoll Version 2 um einfache Verschl\u00fcsselung, aber erfordert einen Thread pro Client. diff --git a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol3/description_it.properties b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol3/description_it.properties deleted file mode 100644 index d62d8a0aea..0000000000 --- a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol3/description_it.properties +++ /dev/null @@ -1,23 +0,0 @@ -# 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. - -summary=Estende la versione 2 del protocollo aggiungendo crittografia di base ma richiede un thread per client. diff --git a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol3/description_sr.properties b/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol3/description_sr.properties deleted file mode 100644 index 8c185f3e4b..0000000000 --- a/core/src/main/resources/jenkins/slaves/JnlpSlaveAgentProtocol3/description_sr.properties +++ /dev/null @@ -1,3 +0,0 @@ -# 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/systemInfo/EnvVarsSlaveInfo/systemInfo.jelly b/core/src/main/resources/jenkins/slaves/systemInfo/EnvVarsSlaveInfo/systemInfo.jelly index 37af3c7c75..9525653a7b 100644 --- a/core/src/main/resources/jenkins/slaves/systemInfo/EnvVarsSlaveInfo/systemInfo.jelly +++ b/core/src/main/resources/jenkins/slaves/systemInfo/EnvVarsSlaveInfo/systemInfo.jelly @@ -29,5 +29,5 @@ THE SOFTWARE. --> - + \ No newline at end of file diff --git a/core/src/main/resources/jenkins/slaves/systemInfo/Messages_ja.properties b/core/src/main/resources/jenkins/slaves/systemInfo/Messages_ja.properties index 7bcbfb2cff..ae77c87ea4 100644 --- a/core/src/main/resources/jenkins/slaves/systemInfo/Messages_ja.properties +++ b/core/src/main/resources/jenkins/slaves/systemInfo/Messages_ja.properties @@ -22,4 +22,4 @@ SystemPropertySlaveInfo.DisplayName=\u30B7\u30B9\u30C6\u30E0\u30D7\u30ED\u30D1\u30C6\u30A3 EnvVarsSlaveInfo.DisplayName=\u74B0\u5883\u5909\u6570 -ThreadDumpSlaveInfo.DisplayName=\u30B9\u30EC\u30C3\u30C9\u30C0\u30F3\u30D7 \ No newline at end of file +ThreadDumpSlaveInfo.DisplayName=\u30B9\u30EC\u30C3\u30C9\u30C0\u30F3\u30D7 diff --git a/core/src/main/resources/jenkins/split-plugins.txt b/core/src/main/resources/jenkins/split-plugins.txt index 6b09bbe877..0547f25558 100644 --- a/core/src/main/resources/jenkins/split-plugins.txt +++ b/core/src/main/resources/jenkins/split-plugins.txt @@ -28,3 +28,6 @@ jdk-tool 2.112 1.0 # JENKINS-55681 jaxb 2.163 2.3.0 11 + +#JENKINS-43610 Split Trilead out from Core +trilead-api 2.184 1.0.4 diff --git a/core/src/main/resources/jenkins/telemetry/impl/AutoRefresh/description.jelly b/core/src/main/resources/jenkins/telemetry/impl/AutoRefresh/description.jelly new file mode 100644 index 0000000000..e38f0f15cb --- /dev/null +++ b/core/src/main/resources/jenkins/telemetry/impl/AutoRefresh/description.jelly @@ -0,0 +1,5 @@ + + + This trial collects information about the "Auto Refresh" feature to determine whether the feature is used enough to not remove it in a future release of Jenkins. + We collect the number of HTTP sessions that have the feature (typically controlled via a cookie) enabled or disabled. + diff --git a/core/src/main/resources/jenkins/telemetry/impl/Messages.properties b/core/src/main/resources/jenkins/telemetry/impl/Messages.properties new file mode 100644 index 0000000000..da589e5dba --- /dev/null +++ b/core/src/main/resources/jenkins/telemetry/impl/Messages.properties @@ -0,0 +1 @@ +AutoRefresh.DisplayName = Use of auto refresh feature \ No newline at end of file diff --git a/core/src/main/resources/jenkins/tools/GlobalToolConfiguration/index_fr.properties b/core/src/main/resources/jenkins/tools/GlobalToolConfiguration/index_fr.properties index d5801fd695..4b217a6ef7 100644 --- a/core/src/main/resources/jenkins/tools/GlobalToolConfiguration/index_fr.properties +++ b/core/src/main/resources/jenkins/tools/GlobalToolConfiguration/index_fr.properties @@ -1,4 +1,4 @@ Back\ to\ Dashboard=Retour au tableau de bord Manage\ Jenkins=Administrer Jenkins Save=Enregistrer -Apply=Appliquer \ No newline at end of file +Apply=Appliquer diff --git a/core/src/main/resources/jenkins/tools/GlobalToolConfiguration/index_sr.properties b/core/src/main/resources/jenkins/tools/GlobalToolConfiguration/index_sr.properties index 0d6d81f5bc..055450a8e2 100644 --- a/core/src/main/resources/jenkins/tools/GlobalToolConfiguration/index_sr.properties +++ b/core/src/main/resources/jenkins/tools/GlobalToolConfiguration/index_sr.properties @@ -3,4 +3,4 @@ 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 +Apply=\u041F\u0440\u0438\u043C\u0435\u043D\u0438 diff --git a/core/src/main/resources/jenkins/triggers/Messages_es.properties b/core/src/main/resources/jenkins/triggers/Messages_es.properties index 0d0afe5f28..8e805a31e0 100644 --- a/core/src/main/resources/jenkins/triggers/Messages_es.properties +++ b/core/src/main/resources/jenkins/triggers/Messages_es.properties @@ -20,4 +20,4 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -ReverseBuildTrigger.build_after_other_projects_are_built=Construir tras otros proyectos \ No newline at end of file +ReverseBuildTrigger.build_after_other_projects_are_built=Construir tras otros proyectos diff --git a/core/src/main/resources/jenkins/triggers/Messages_sr.properties b/core/src/main/resources/jenkins/triggers/Messages_sr.properties index 6a6c113a30..01c6e553f8 100644 --- a/core/src/main/resources/jenkins/triggers/Messages_sr.properties +++ b/core/src/main/resources/jenkins/triggers/Messages_sr.properties @@ -2,4 +2,4 @@ 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 +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} 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 75c162d626..620aa85057 100644 --- a/core/src/main/resources/jenkins/triggers/ReverseBuildTrigger/config_de.properties +++ b/core/src/main/resources/jenkins/triggers/ReverseBuildTrigger/config_de.properties @@ -23,4 +23,4 @@ Projects\ to\ watch=Zu überwachende Projekte Trigger\ only\ if\ build\ is\ stable=Nur auslösen, wenn der Build stabil ist Trigger\ even\ if\ the\ build\ is\ unstable=Auslösen, selbst wenn der Build instabil ist -Trigger\ even\ if\ the\ build\ fails=Auslösen, selbst wenn der Build fehlschlägt \ No newline at end of file +Trigger\ even\ if\ the\ build\ fails=Auslösen, selbst wenn der Build fehlschlägt diff --git a/core/src/main/resources/lib/form/advanced_ja.properties b/core/src/main/resources/lib/form/advanced_ja.properties index 9344f691e7..70fd1f0f81 100644 --- a/core/src/main/resources/lib/form/advanced_ja.properties +++ b/core/src/main/resources/lib/form/advanced_ja.properties @@ -21,4 +21,4 @@ # THE SOFTWARE. Advanced=\u9ad8\u5ea6\u306a\u8a2d\u5b9a -customizedFields=\u3053\u306e\u30d6\u30ed\u30c3\u30af\u306e1\u3064\u4ee5\u4e0a\u306e\u9805\u76ee\u304c\u7de8\u96c6\u3055\u308c\u3066\u3044\u307e\u3059\u3002 \ No newline at end of file +customizedFields=\u3053\u306e\u30d6\u30ed\u30c3\u30af\u306e1\u3064\u4ee5\u4e0a\u306e\u9805\u76ee\u304c\u7de8\u96c6\u3055\u308c\u3066\u3044\u307e\u3059\u3002 diff --git a/core/src/main/resources/lib/form/booleanRadio_ja.properties b/core/src/main/resources/lib/form/booleanRadio_ja.properties index 3cf88137dc..1f2f7f5db7 100644 --- a/core/src/main/resources/lib/form/booleanRadio_ja.properties +++ b/core/src/main/resources/lib/form/booleanRadio_ja.properties @@ -20,4 +20,4 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. Yes=\u306F\u3044 -No=\u3044\u3044\u3048 \ No newline at end of file +No=\u3044\u3044\u3048 diff --git a/core/src/main/resources/lib/form/breadcrumb-config-outline_pl.properties b/core/src/main/resources/lib/form/breadcrumb-config-outline_pl.properties index f28de3a558..80087ba039 100644 --- a/core/src/main/resources/lib/form/breadcrumb-config-outline_pl.properties +++ b/core/src/main/resources/lib/form/breadcrumb-config-outline_pl.properties @@ -1,3 +1,3 @@ # This file is under the MIT License by authors -configuration=konfiguracja +configuration=Konfiguracja diff --git a/core/src/main/resources/lib/form/expandableTextbox_ja.properties b/core/src/main/resources/lib/form/expandableTextbox_ja.properties index bd1813ca8f..0fa1642fc7 100644 --- a/core/src/main/resources/lib/form/expandableTextbox_ja.properties +++ b/core/src/main/resources/lib/form/expandableTextbox_ja.properties @@ -22,4 +22,4 @@ tooltip=\ \u30AF\u30EA\u30C3\u30AF\u3059\u308B\u3068\u8907\u6570\u884C\u306B\u62E1\u5F35\u3057\u307E\u3059\u3002
    \u30B9\u30DA\u30FC\u30B9\u306E\u4EE3\u308F\u308A\u306B\u6539\u884C\u3092\u4F7F\u7528\u3059\u308B\u3053\u3068\u304C\u3067\u304D\u307E\u3059\u3002
    \ - 1\u884C\u306B\u623B\u3059\u306B\u306F\u30011\u884C\u306B\u3059\u3079\u3066\u3092\u8A18\u8FF0\u3057\u3066\u9001\u4FE1\u3057\u3066\u304F\u3060\u3055\u3044\u3002 \ No newline at end of file + 1\u884C\u306B\u623B\u3059\u306B\u306F\u30011\u884C\u306B\u3059\u3079\u3066\u3092\u8A18\u8FF0\u3057\u3066\u9001\u4FE1\u3057\u3066\u304F\u3060\u3055\u3044\u3002 diff --git a/core/src/main/resources/lib/form/expandableTextbox_pt_BR.properties b/core/src/main/resources/lib/form/expandableTextbox_pt_BR.properties index 5cf246c45b..ddb2ef68b8 100644 --- a/core/src/main/resources/lib/form/expandableTextbox_pt_BR.properties +++ b/core/src/main/resources/lib/form/expandableTextbox_pt_BR.properties @@ -23,5 +23,5 @@ # \ # Click to expand to multiple lineswhere you can use new lines instead of space # To revert back to single line, write everything in one line then submit. -tooltip=Clique para expandir para v\u00E1rias linhas
    onde voc\u00EA pode usar novas linhas em vez de espa\u00E7os.
    Para reverter em uma \u00FAnica linha, escrever tudo em uma \u00FAnica linha, em seguida, submeta. +tooltip=Clique para expandir para v\u00E1rias linhas
    onde voc\u00EA pode usar novas linhas em vez de espa\u00E7os.
    Para reverter em uma \u00FAnica linha, escrever tudo em uma \u00FAnica linha, em seguida, submeta.
    \ Para reverter de volta em uma linha, escreva tudo em uma linha ent\u00e3o envie. diff --git a/core/src/main/resources/lib/form/helpArea_ja.properties b/core/src/main/resources/lib/form/helpArea_ja.properties index ff2569ee24..2aa08576e9 100644 --- a/core/src/main/resources/lib/form/helpArea_ja.properties +++ b/core/src/main/resources/lib/form/helpArea_ja.properties @@ -20,4 +20,4 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Loading...=\u30ED\u30FC\u30C9\u4E2D \ No newline at end of file +Loading...=\u30ED\u30FC\u30C9\u4E2D diff --git a/core/src/main/resources/lib/form/helpLink_ru.properties b/core/src/main/resources/lib/form/helpLink_ru.properties index 5c2fbd6a4a..a33225846a 100644 --- a/core/src/main/resources/lib/form/helpLink_ru.properties +++ b/core/src/main/resources/lib/form/helpLink_ru.properties @@ -20,4 +20,4 @@ # 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 +Help\ for\ feature\:=\u041f\u043e\u043c\u043e\u0449\u044c \u0434\u043b\u044f: diff --git a/core/src/main/resources/lib/form/hetero-list_ja.properties b/core/src/main/resources/lib/form/hetero-list_ja.properties index 26be1530bd..1fa4c4a2c0 100644 --- a/core/src/main/resources/lib/form/hetero-list_ja.properties +++ b/core/src/main/resources/lib/form/hetero-list_ja.properties @@ -20,4 +20,4 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Add=\u8FFD\u52A0 \ No newline at end of file +Add=\u8FFD\u52A0 diff --git a/core/src/main/resources/lib/form/optionalProperty.jelly b/core/src/main/resources/lib/form/optionalProperty.jelly index d27dcdf4a7..1afe8e5f53 100644 --- a/core/src/main/resources/lib/form/optionalProperty.jelly +++ b/core/src/main/resources/lib/form/optionalProperty.jelly @@ -35,7 +35,7 @@ THE SOFTWARE. @@ -43,4 +43,4 @@ THE SOFTWARE. -
    \ No newline at end of file + diff --git a/core/src/main/resources/lib/form/password.jelly b/core/src/main/resources/lib/form/password.jelly index eae77c32b0..caaf04e0ff 100644 --- a/core/src/main/resources/lib/form/password.jelly +++ b/core/src/main/resources/lib/form/password.jelly @@ -61,12 +61,73 @@ THE SOFTWARE. - - + + + + + + +
    + +
    +
    + + + + + + + + + ${%Concealed} +
    +
    + +
    +
    +
    +
    + + + + +
    +
    + + + +
    diff --git a/core/src/main/resources/lib/form/password/password.css b/core/src/main/resources/lib/form/password/password.css new file mode 100644 index 0000000000..250c55c7de --- /dev/null +++ b/core/src/main/resources/lib/form/password/password.css @@ -0,0 +1,55 @@ +/* + * The MIT License + * + * Copyright (c) 2019 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. + */ + +.hidden-password-placeholder { + display: flex; +} + +.hidden-password-legend { + border: 1px solid #ccc; + border-radius: 3px; + background: #f9f9f9; + flex-grow: 1; + align-items: center; + display: inline-flex; +} + +.hidden-password-legend > svg { + margin-right: 1em; + margin-left: 0.5em; +} + +.hidden-password input[type='button'] { + background: #4b99d0; + color: #fff; + border-radius: 4px; + border: none; + padding: 7px; + margin-left: 5px; +} + +.hidden-password input[type='button']:hover { + background: #5092be; + cursor: pointer; +} diff --git a/core/src/main/resources/lib/form/password/password.js b/core/src/main/resources/lib/form/password/password.js new file mode 100644 index 0000000000..e4f44cceff --- /dev/null +++ b/core/src/main/resources/lib/form/password/password.js @@ -0,0 +1,38 @@ +/* + * The MIT License + * + * Copyright (c) 2019 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. + */ + +Behaviour.specify('.hidden-password', 'hidden-password-button', 0, function (e) { + var secretUpdateBtn = e.querySelector('.hidden-password-update-btn'); + if (secretUpdateBtn === null) return; + + var id = 'hidden-password-' + (iota++); + + secretUpdateBtn.onclick = function () { + e.querySelector('.hidden-password-field').setAttribute('type', 'password'); + e.querySelector('.hidden-password-placeholder').remove(); + secretUpdateBtn.remove(); + // fix UI bug when DOM changes + Event.fire(window, 'jenkins:bottom-sticker-adjust'); + }; +}); diff --git a/core/src/main/resources/lib/form/repeatableDeleteButton_ja.properties b/core/src/main/resources/lib/form/repeatableDeleteButton_ja.properties index 13df96c20e..00cf846d53 100644 --- a/core/src/main/resources/lib/form/repeatableDeleteButton_ja.properties +++ b/core/src/main/resources/lib/form/repeatableDeleteButton_ja.properties @@ -20,4 +20,4 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Delete=\u524a\u9664 \ No newline at end of file +Delete=\u524a\u9664 diff --git a/core/src/main/resources/lib/form/repeatableProperty.jelly b/core/src/main/resources/lib/form/repeatableProperty.jelly index d2198b2742..b5aa38291c 100644 --- a/core/src/main/resources/lib/form/repeatableProperty.jelly +++ b/core/src/main/resources/lib/form/repeatableProperty.jelly @@ -30,11 +30,17 @@ THE SOFTWARE. Unless that nested config.jelly already adds a delete button (deprecated), you should normally put the following inside this tag: - +
    -
    + + + Due to a bug in Stapler data binding the model elements are only set if they consist of one or more values. + If all values have been removed in the user interface (i.e. the associated form is empty), then the setter is not + invoked anymore. As a workaround, you need to override the corresponding configure method and clear the model + property manually before invoking the data binding. See warnings-ng-plugin PR#266. + ]]> diff --git a/core/src/main/resources/lib/form/serverTcpPort_ja.properties b/core/src/main/resources/lib/form/serverTcpPort_ja.properties index 620837b781..ff9e3b96d7 100644 --- a/core/src/main/resources/lib/form/serverTcpPort_ja.properties +++ b/core/src/main/resources/lib/form/serverTcpPort_ja.properties @@ -22,4 +22,4 @@ Fixed=\u56fa\u5b9a Random=\u30e9\u30f3\u30c0\u30e0 -Disable=\u7121\u52b9 \ No newline at end of file +Disable=\u7121\u52b9 diff --git a/core/src/main/resources/lib/form/serverTcpPort_sr.properties b/core/src/main/resources/lib/form/serverTcpPort_sr.properties index 132f0a20ab..0da4c13e54 100644 --- a/core/src/main/resources/lib/form/serverTcpPort_sr.properties +++ b/core/src/main/resources/lib/form/serverTcpPort_sr.properties @@ -2,4 +2,4 @@ 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 +Disable=\u041E\u043D\u0435\u043C\u043E\u0433\u0443\u045B\u0438 diff --git a/core/src/main/resources/lib/form/textarea/textarea.js b/core/src/main/resources/lib/form/textarea/textarea.js index d1f89de8f2..d988ae462b 100644 --- a/core/src/main/resources/lib/form/textarea/textarea.js +++ b/core/src/main/resources/lib/form/textarea/textarea.js @@ -11,8 +11,13 @@ Behaviour.specify("TEXTAREA.codemirror", 'textarea', 0, function(e) { var h = e.clientHeight || getTextareaHeight(); var config = e.getAttribute("codemirror-config"); - config += (config ? ", " : " ") + "onBlur: function(editor){editor.save()}"; + if (!config) { + config = ''; + } config = eval('({'+config+'})'); + if (!config.onBlur) { + config.onBlur = function(editor) { editor.save(); }; + } var codemirror = CodeMirror.fromTextArea(e,config); e.codemirrorObject = codemirror; if(typeof(codemirror.getScrollerElement) !== "function") { diff --git a/core/src/main/resources/lib/form/textarea_ja.properties b/core/src/main/resources/lib/form/textarea_ja.properties index 8baff08362..1ff4dd7410 100644 --- a/core/src/main/resources/lib/form/textarea_ja.properties +++ b/core/src/main/resources/lib/form/textarea_ja.properties @@ -21,4 +21,4 @@ # THE SOFTWARE. Preview=\u30d7\u30ec\u30d3\u30e5\u30fc -Hide\ preview=\u9589\u3058\u308b \ No newline at end of file +Hide\ preview=\u9589\u3058\u308b diff --git a/core/src/main/resources/lib/hudson/artifactList_ja.properties b/core/src/main/resources/lib/hudson/artifactList_ja.properties index 3bb6a35a62..42f4729826 100644 --- a/core/src/main/resources/lib/hudson/artifactList_ja.properties +++ b/core/src/main/resources/lib/hudson/artifactList_ja.properties @@ -23,4 +23,4 @@ view=\u53c2\u7167 View=\u53c2\u7167 Expand\ all=\u5c55\u958b -Collapse\ all=\u9589\u3058\u308b \ No newline at end of file +Collapse\ all=\u9589\u3058\u308b diff --git a/core/src/main/resources/lib/hudson/artifactList_nl.properties b/core/src/main/resources/lib/hudson/artifactList_nl.properties index 199a23f927..479160f84d 100644 --- a/core/src/main/resources/lib/hudson/artifactList_nl.properties +++ b/core/src/main/resources/lib/hudson/artifactList_nl.properties @@ -2,4 +2,4 @@ View=Overzicht Collapse\ all=Alles inklappen. -Expand\ all=Alles uitvouwen. \ No newline at end of file +Expand\ all=Alles uitvouwen. diff --git a/core/src/main/resources/lib/hudson/buildCaption_ru.properties b/core/src/main/resources/lib/hudson/buildCaption_ru.properties index a3c2131882..08d40362eb 100644 --- a/core/src/main/resources/lib/hudson/buildCaption_ru.properties +++ b/core/src/main/resources/lib/hudson/buildCaption_ru.properties @@ -23,4 +23,4 @@ Progress=\u041f\u0440\u043e\u0433\u0440\u0435\u0441\u0441 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 +confirm=\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u044c diff --git a/core/src/main/resources/lib/hudson/buildHealth_ja.properties b/core/src/main/resources/lib/hudson/buildHealth_ja.properties index be996113e8..d8af5dd775 100644 --- a/core/src/main/resources/lib/hudson/buildHealth_ja.properties +++ b/core/src/main/resources/lib/hudson/buildHealth_ja.properties @@ -20,4 +20,4 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Description=\u8AAC\u660E \ No newline at end of file +Description=\u8AAC\u660E diff --git a/core/src/main/resources/lib/hudson/buildListTable_ja.properties b/core/src/main/resources/lib/hudson/buildListTable_ja.properties index 6fbacf8e7e..9f0f760505 100644 --- a/core/src/main/resources/lib/hudson/buildListTable_ja.properties +++ b/core/src/main/resources/lib/hudson/buildListTable_ja.properties @@ -24,4 +24,4 @@ Build=\u30d3\u30eb\u30c9 Time\ Since=\u6642\u671f Status=\u72b6\u614b Console\ output=\u30b3\u30f3\u30bd\u30fc\u30eb\u51fa\u529b -Click\ to\ center\ timeline\ on\ event=\u30af\u30ea\u30c3\u30af\u3067\u3001\u3053\u306e\u30a4\u30d9\u30f3\u30c8\u3092\u30bf\u30a4\u30e0\u30e9\u30a4\u30f3\u306e\u4e2d\u5fc3\u306b \ No newline at end of file +Click\ to\ center\ timeline\ on\ event=\u30af\u30ea\u30c3\u30af\u3067\u3001\u3053\u306e\u30a4\u30d9\u30f3\u30c8\u3092\u30bf\u30a4\u30e0\u30e9\u30a4\u30f3\u306e\u4e2d\u5fc3\u306b diff --git a/core/src/main/resources/lib/hudson/buildProgressBar_ko.properties b/core/src/main/resources/lib/hudson/buildProgressBar_ko.properties index d1cc19cd4e..134c24582d 100644 --- a/core/src/main/resources/lib/hudson/buildProgressBar_ko.properties +++ b/core/src/main/resources/lib/hudson/buildProgressBar_ko.properties @@ -20,5 +20,4 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -text="{0} \uC804\uC5D0 \uC2DC\uC791 -\uC608\uC0C1 \uC794\uC5EC \uC2DC\uAC04: {1}" +text="{0} \uC804\uC5D0 \uC2DC\uC791
    \uC608\uC0C1 \uC794\uC5EC \uC2DC\uAC04: {1}" diff --git a/core/src/main/resources/lib/hudson/buildProgressBar_sk.properties b/core/src/main/resources/lib/hudson/buildProgressBar_sk.properties index 20c378adb1..c754fff7ff 100644 --- a/core/src/main/resources/lib/hudson/buildProgressBar_sk.properties +++ b/core/src/main/resources/lib/hudson/buildProgressBar_sk.properties @@ -21,4 +21,3 @@ # THE SOFTWARE. text=Spusten\u00E9 pred {0}
    Predpokladan\u00FD zost\u00E1vaj\u00FAci \u010Das: {1} -Predpokladan\u00FD zost\u00E1vaj\u00FAci \u010Das: {1} diff --git a/core/src/main/resources/lib/hudson/buildProgressBar_sl.properties b/core/src/main/resources/lib/hudson/buildProgressBar_sl.properties index 97e9164f80..bab5dd206e 100644 --- a/core/src/main/resources/lib/hudson/buildProgressBar_sl.properties +++ b/core/src/main/resources/lib/hudson/buildProgressBar_sl.properties @@ -1,4 +1,3 @@ # This file is under the MIT License by authors -text=Startan pred {0}
    -Predviden preostali \u010Das: {1} +text=Startan pred {0}
    Predviden preostali \u010Das: {1} diff --git a/core/src/main/resources/lib/hudson/buildProgressBar_sr.properties b/core/src/main/resources/lib/hudson/buildProgressBar_sr.properties index 77cb22b833..6b7288eb4b 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=\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 +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} diff --git a/core/src/main/resources/lib/hudson/executors.jelly b/core/src/main/resources/lib/hudson/executors.jelly index 578808d47f..663d7b64e2 100644 --- a/core/src/main/resources/lib/hudson/executors.jelly +++ b/core/src/main/resources/lib/hudson/executors.jelly @@ -35,7 +35,20 @@ THE SOFTWARE. ${title} - (${%offline}) + + + + + ( ${%offline}) + + + (${%launching}) + + + (${%offline}) + + + (${%suspended}) @@ -110,7 +123,7 @@ THE SOFTWARE. - + diff --git a/core/src/main/resources/lib/hudson/executors.properties b/core/src/main/resources/lib/hudson/executors.properties index 3d8ebc248e..d21742283c 100644 --- a/core/src/main/resources/lib/hudson/executors.properties +++ b/core/src/main/resources/lib/hudson/executors.properties @@ -1,2 +1,3 @@ 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}? +launching=launching... diff --git a/core/src/main/resources/lib/hudson/executors_ja.properties b/core/src/main/resources/lib/hudson/executors_ja.properties index 48907df12e..878ff595bc 100644 --- a/core/src/main/resources/lib/hudson/executors_ja.properties +++ b/core/src/main/resources/lib/hudson/executors_ja.properties @@ -29,4 +29,4 @@ Offline=\u30aa\u30d5\u30e9\u30a4\u30f3 Dead=\u6b7b\u4ea1 suspended=\u4e00\u6642\u4e2d\u6b62 Unknown\ Task=\u672a\u77e5\u306e\u30bf\u30b9\u30af -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)} diff --git a/core/src/main/resources/lib/hudson/executors_tr.properties b/core/src/main/resources/lib/hudson/executors_tr.properties index e0ddd9c707..7b0b90de3d 100644 --- a/core/src/main/resources/lib/hudson/executors_tr.properties +++ b/core/src/main/resources/lib/hudson/executors_tr.properties @@ -27,5 +27,5 @@ offline=\u00e7evrim d\u0131\u015f\u0131 Dead=\u00d6l\u00fc Idle=Beklemede Building=Yap\u0131land\u0131r\u0131yor -terminate\ this\ build=Bu yap\u0131land\u0131rmay\u0131\ durdur +terminate\ this\ build=Bu yap\u0131land\u0131rmay\u0131 durdur suspended=durdurulmu\u015f diff --git a/core/src/main/resources/lib/hudson/iconSize_ja.properties b/core/src/main/resources/lib/hudson/iconSize_ja.properties index 2fe413ec9e..4ad65986b8 100644 --- a/core/src/main/resources/lib/hudson/iconSize_ja.properties +++ b/core/src/main/resources/lib/hudson/iconSize_ja.properties @@ -20,4 +20,4 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Icon=\u30a2\u30a4\u30b3\u30f3 \ No newline at end of file +Icon=\u30a2\u30a4\u30b3\u30f3 diff --git a/core/src/main/resources/lib/hudson/listScmBrowsers_tr.properties b/core/src/main/resources/lib/hudson/listScmBrowsers_tr.properties index eddab7dc20..6a8cc4d061 100644 --- a/core/src/main/resources/lib/hudson/listScmBrowsers_tr.properties +++ b/core/src/main/resources/lib/hudson/listScmBrowsers_tr.properties @@ -20,5 +20,5 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Repository\ browser=Repository\ taray\u0131c\u0131s\u0131 +Repository\ browser=Repository taray\u0131c\u0131s\u0131 Auto=Otomatik diff --git a/core/src/main/resources/lib/hudson/project/build-permalink_ja.properties b/core/src/main/resources/lib/hudson/project/build-permalink_ja.properties index 01dd2de143..24d716b113 100644 --- a/core/src/main/resources/lib/hudson/project/build-permalink_ja.properties +++ b/core/src/main/resources/lib/hudson/project/build-permalink_ja.properties @@ -20,4 +20,4 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -format={0} (#{1}), {2} \ No newline at end of file +format={0} (#{1}), {2} diff --git a/core/src/main/resources/lib/hudson/project/config-blockWhenDownstreamBuilding_de.properties b/core/src/main/resources/lib/hudson/project/config-blockWhenDownstreamBuilding_de.properties index ba8e70ed8a..4178ee6ea1 100644 --- a/core/src/main/resources/lib/hudson/project/config-blockWhenDownstreamBuilding_de.properties +++ b/core/src/main/resources/lib/hudson/project/config-blockWhenDownstreamBuilding_de.properties @@ -20,4 +20,4 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Block\ build\ when\ downstream\ project\ is\ building=Build blockieren, solange nachgelagertes Projekt gebaut wird. \ No newline at end of file +Block\ build\ when\ downstream\ project\ is\ building=Build blockieren, solange nachgelagertes Projekt gebaut wird. diff --git a/core/src/main/resources/lib/hudson/project/config-blockWhenDownstreamBuilding_ja.properties b/core/src/main/resources/lib/hudson/project/config-blockWhenDownstreamBuilding_ja.properties index 2501ba338f..4d3a8a2e3c 100644 --- a/core/src/main/resources/lib/hudson/project/config-blockWhenDownstreamBuilding_ja.properties +++ b/core/src/main/resources/lib/hudson/project/config-blockWhenDownstreamBuilding_ja.properties @@ -21,4 +21,4 @@ # THE SOFTWARE. Block\ build\ when\ downstream\ project\ is\ building=\ - \u4e0b\u6d41\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u304c\u30d3\u30eb\u30c9\u4e2d\u306e\u5834\u5408\u306f\u30d3\u30eb\u30c9\u3057\u306a\u3044 \ No newline at end of file + \u4e0b\u6d41\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u304c\u30d3\u30eb\u30c9\u4e2d\u306e\u5834\u5408\u306f\u30d3\u30eb\u30c9\u3057\u306a\u3044 diff --git a/core/src/main/resources/lib/hudson/project/config-blockWhenUpstreamBuilding_de.properties b/core/src/main/resources/lib/hudson/project/config-blockWhenUpstreamBuilding_de.properties index 07a22594f0..3c000f79ad 100644 --- a/core/src/main/resources/lib/hudson/project/config-blockWhenUpstreamBuilding_de.properties +++ b/core/src/main/resources/lib/hudson/project/config-blockWhenUpstreamBuilding_de.properties @@ -20,4 +20,4 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Block\ build\ when\ upstream\ project\ is\ building=Build blockieren, solange vorgelagertes Projekt gebaut wird. \ No newline at end of file +Block\ build\ when\ upstream\ project\ is\ building=Build blockieren, solange vorgelagertes Projekt gebaut wird. 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 0737289e39..7efce546a8 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 @@ -21,4 +21,4 @@ # 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 +Directory=\u30c7\u30a3\u30ec\u30af\u30c8\u30ea diff --git a/core/src/main/resources/lib/hudson/project/config-publishers2_ja.properties b/core/src/main/resources/lib/hudson/project/config-publishers2_ja.properties index fb08bfff79..394caab4b8 100644 --- a/core/src/main/resources/lib/hudson/project/config-publishers2_ja.properties +++ b/core/src/main/resources/lib/hudson/project/config-publishers2_ja.properties @@ -21,4 +21,4 @@ # THE SOFTWARE. Post-build\ Actions=\u30d3\u30eb\u30c9\u5f8c\u306e\u51e6\u7406 -Add\ post-build\ action=\u30d3\u30eb\u30c9\u5f8c\u306e\u51e6\u7406\u306e\u8ffd\u52a0 \ No newline at end of file +Add\ post-build\ action=\u30d3\u30eb\u30c9\u5f8c\u306e\u51e6\u7406\u306e\u8ffd\u52a0 diff --git a/core/src/main/resources/lib/hudson/project/config-publishers_nl.properties b/core/src/main/resources/lib/hudson/project/config-publishers_nl.properties index ae58ca6e69..806b2b6787 100644 --- a/core/src/main/resources/lib/hudson/project/config-publishers_nl.properties +++ b/core/src/main/resources/lib/hudson/project/config-publishers_nl.properties @@ -20,4 +20,4 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Post-build\ Actions=Acties voor na de bouwpoging \ No newline at end of file +Post-build\ Actions=Acties voor na de bouwpoging diff --git a/core/src/main/resources/lib/hudson/project/config-scm_ja.properties b/core/src/main/resources/lib/hudson/project/config-scm_ja.properties index f878e01f78..6451f3e5af 100644 --- a/core/src/main/resources/lib/hudson/project/config-scm_ja.properties +++ b/core/src/main/resources/lib/hudson/project/config-scm_ja.properties @@ -22,4 +22,4 @@ Source\ Code\ Management=\u30bd\u30fc\u30b9\u30b3\u30fc\u30c9\u7ba1\u7406 Advanced\ Source\ Code\ Management=\u9ad8\u5ea6\u306a\u30bd\u30fc\u30b9\u30b3\u30fc\u30c9\u7ba1\u7406 -SCM\ Checkout\ Strategy=SCM\u30c1\u30a7\u30c3\u30af\u30a2\u30a6\u30c8\u65b9\u6cd5 \ No newline at end of file +SCM\ Checkout\ Strategy=SCM\u30c1\u30a7\u30c3\u30af\u30a2\u30a6\u30c8\u65b9\u6cd5 diff --git a/core/src/main/resources/lib/hudson/project/config-scm_tr.properties b/core/src/main/resources/lib/hudson/project/config-scm_tr.properties index b904007813..964c308907 100644 --- a/core/src/main/resources/lib/hudson/project/config-scm_tr.properties +++ b/core/src/main/resources/lib/hudson/project/config-scm_tr.properties @@ -20,4 +20,4 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Source\ Code\ Management=Kaynak\ Kodu\ Y\u00f6netimi +Source\ Code\ Management=Kaynak Kodu Y\u00f6netimi 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 index 125c054cbe..d255d9cba2 100644 --- a/core/src/main/resources/lib/hudson/project/console-link_ru.properties +++ b/core/src/main/resources/lib/hudson/project/console-link_ru.properties @@ -21,4 +21,4 @@ # 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 +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 diff --git a/core/src/main/resources/lib/hudson/project/upstream-downstream.jelly b/core/src/main/resources/lib/hudson/project/upstream-downstream.jelly index e254af5447..2040d25c5c 100644 --- a/core/src/main/resources/lib/hudson/project/upstream-downstream.jelly +++ b/core/src/main/resources/lib/hudson/project/upstream-downstream.jelly @@ -31,7 +31,7 @@ THE SOFTWARE. - + 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 3ce2c7835b..68afeebabd 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 \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 +Upstream\ Projects=Upstream \u043F\u0440\u043E\u0458\u0435\u043A\u0442\u0438 diff --git a/core/src/main/resources/lib/hudson/project/upstream-downstream_tr.properties b/core/src/main/resources/lib/hudson/project/upstream-downstream_tr.properties index 35deccf279..4c9d275fe6 100644 --- a/core/src/main/resources/lib/hudson/project/upstream-downstream_tr.properties +++ b/core/src/main/resources/lib/hudson/project/upstream-downstream_tr.properties @@ -20,5 +20,5 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Upstream\ Projects=Upstream\ Projeler -Downstream\ Projects=Downstream\ Projeler +Upstream\ Projects=Upstream Projeler +Downstream\ Projects=Downstream Projeler diff --git a/core/src/main/resources/lib/hudson/queue.jelly b/core/src/main/resources/lib/hudson/queue.jelly index 6f64358ef1..914657dad6 100644 --- a/core/src/main/resources/lib/hudson/queue.jelly +++ b/core/src/main/resources/lib/hudson/queue.jelly @@ -74,7 +74,7 @@ THE SOFTWARE. - + diff --git a/core/src/main/resources/lib/hudson/queue_pl.properties b/core/src/main/resources/lib/hudson/queue_pl.properties index 1520fdffaa..a6716f8f88 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-2016, Kohsuke Kawaguchi, Sun Microsystems, Inc., and a number of other of contributors +# Copyright (c) 2004-2019, 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,9 +19,10 @@ # 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\ Queue=Kolejka zada\u0144{0,choice,0#|0< ({0,number})} +Filtered\ Build\ Queue=Odfiltrowana 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} +WaitingFor=Czeka od {0} cancel=anuluj +confirm=Na pewno chcesz usun\u0105\u0107 z kolejki zadanie {0}? diff --git a/core/src/main/resources/lib/hudson/queue_tr.properties b/core/src/main/resources/lib/hudson/queue_tr.properties index 1c13c2548e..b3abee66be 100644 --- a/core/src/main/resources/lib/hudson/queue_tr.properties +++ b/core/src/main/resources/lib/hudson/queue_tr.properties @@ -22,6 +22,6 @@ Build\ Queue=Yap\u0131land\u0131rma Listesi{0,choice,0#|0< ({0,number})} No\ builds\ in\ the\ queue.=S\u0131rada bekleyen yap\u0131land\u0131rma yok. -Jenkins\ is\ going\ to\ shut\ down.\ No\ further\ builds\ will\ be\ performed.=Jenkins\ kapat\u0131lacakt\u0131r.\ Bundan\ sonra\ ba\u015fka\ yap\u0131land\u0131rma\ ba\u015flat\u0131lmayacakt\u0131r. +Jenkins\ is\ going\ to\ shut\ down.\ No\ further\ builds\ will\ be\ performed.=Jenkins kapat\u0131lacakt\u0131r. Bundan sonra ba\u015fka yap\u0131land\u0131rma ba\u015flat\u0131lmayacakt\u0131r. WaitingFor={0} bekleniyor cancel=iptal diff --git a/core/src/main/resources/lib/hudson/rssBar.jelly b/core/src/main/resources/lib/hudson/rssBar.jelly index 4db12af6c9..1727106111 100644 --- a/core/src/main/resources/lib/hudson/rssBar.jelly +++ b/core/src/main/resources/lib/hudson/rssBar.jelly @@ -27,19 +27,19 @@ THE SOFTWARE. diff --git a/core/src/main/resources/lib/hudson/rssBar_ja.properties b/core/src/main/resources/lib/hudson/rssBar_ja.properties index f5b6251e61..e5a1f7f7a1 100644 --- a/core/src/main/resources/lib/hudson/rssBar_ja.properties +++ b/core/src/main/resources/lib/hudson/rssBar_ja.properties @@ -23,4 +23,4 @@ Legend=\u51E1\u4F8B for\ all=\u5168\u30D3\u30EB\u30C9 for\ failures=\u5931\u6557\u30D3\u30EB\u30C9 -for\ just\ latest\ builds=\u6700\u65B0\u30D3\u30EB\u30C9\u306E\u307F \ No newline at end of file +for\ just\ latest\ builds=\u6700\u65B0\u30D3\u30EB\u30C9\u306E\u307F diff --git a/core/src/main/resources/lib/hudson/scriptConsole_bg.properties b/core/src/main/resources/lib/hudson/scriptConsole_bg.properties index b271dfcbf9..be4c62b772 100644 --- a/core/src/main/resources/lib/hudson/scriptConsole_bg.properties +++ b/core/src/main/resources/lib/hudson/scriptConsole_bg.properties @@ -33,7 +33,7 @@ description2=\ It\ is\ not\ possible\ to\ run\ scripts\ when\ slave\ is\ offline.=\ \u041a\u043e\u0433\u0430\u0442\u043e \u043f\u043e\u0434\u0447\u0438\u043d\u0435\u043d\u0438\u044f\u0442 \u043a\u043e\u043c\u043f\u044e\u0442\u044a\u0440 \u043d\u0435 \u0435 \u043d\u0430 \u043b\u0438\u043d\u0438\u044f, \u043d\u0435 \u043c\u043e\u0436\u0435 \u0434\u0430 \u0441\u0435 \u0438\u0437\u043f\u044a\u043b\u043d\u044f\u0432\u0430\u0442 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432\u0435. # \ -# Type in an arbitrary Groovy script and \ +# Type in an arbitrary Groovy script and \ # execute it on the server. Useful for trouble-shooting and diagnostics. \ # Use the \u2018println\u2019 command to see the output (if you use System.out, \ # it will go to the server\u2019s stdout, which is harder to see.) Example: diff --git a/core/src/main/resources/lib/hudson/scriptConsole_ja.properties b/core/src/main/resources/lib/hudson/scriptConsole_ja.properties index 1360878239..b3c84b2c7d 100644 --- a/core/src/main/resources/lib/hudson/scriptConsole_ja.properties +++ b/core/src/main/resources/lib/hudson/scriptConsole_ja.properties @@ -31,4 +31,4 @@ description= \ description2= \ \u30d7\u30e9\u30b0\u30a4\u30f3\u306e\u3059\u3079\u3066\u306e\u30af\u30e9\u30b9\u3092\u5229\u7528\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002 \ - \u307e\u305f\u3001jenkins.*\u3001jenkins.model.*\u3001hudson.*\u3001\u304a\u3088\u3073 hudson.model.* \u306f\u3042\u3089\u304b\u3058\u3081\u30a4\u30f3\u30dd\u30fc\u30c8\u6e08\u307f\u3067\u3059\u3002 \ No newline at end of file + \u307e\u305f\u3001jenkins.*\u3001jenkins.model.*\u3001hudson.*\u3001\u304a\u3088\u3073 hudson.model.* \u306f\u3042\u3089\u304b\u3058\u3081\u30a4\u30f3\u30dd\u30fc\u30c8\u6e08\u307f\u3067\u3059\u3002 diff --git a/core/src/main/resources/lib/hudson/scriptConsole_ko.properties b/core/src/main/resources/lib/hudson/scriptConsole_ko.properties index 523c9f7126..31b7f20020 100644 --- a/core/src/main/resources/lib/hudson/scriptConsole_ko.properties +++ b/core/src/main/resources/lib/hudson/scriptConsole_ko.properties @@ -23,8 +23,4 @@ Result=\uACB0\uACFC Run=\uC2E4\uD589 Script\ Console=\uC2A4\uD06C\uB9BD\uD2B8 \uCF58\uC194 -description=\uC784\uC758\uC758 Groovy\uC2A4\uD06C\uB9BD\uD2B8\uB97C \uC785\uB825\uD558\uC5EC \uC11C\uBC84\uC5D0\uC11C \uC2E4\uD589\uD569\uB2C8\uB2E4.
    \uBB38\uC81C\uD574\uACB0\uACFC \uC9C4\uB2E8\uC2DC\uC5D0 \uC720\uC6A9\uD569\uB2C8\uB2E4. \uCD9C\uB825\uBB3C\uC744 \uBCF4\uB824\uBA74 ''println'' \uBA85\uB839\uC744 \uC0AC\uC6A9\uD558\uC138\uC694.
    (System.out\uB97C \uC0AC\uC6A9\uD558\uBA74 \uC11C\uBC84\uC758 \uD45C\uC900\uCD9C\uB825\uC73C\uB85C \uBCF4\uB0B4\uC9C0\uACE0, \uAC00\uB3C5\uC131\uC774 \uB5A8\uC5B4\uC9D1\uB2C8\uB2E4.)

    -\uC608\uC81C:
    - -\uC608\uC81C:
    - +description=\uC784\uC758\uC758 Groovy\uC2A4\uD06C\uB9BD\uD2B8\uB97C \uC785\uB825\uD558\uC5EC \uC11C\uBC84\uC5D0\uC11C \uC2E4\uD589\uD569\uB2C8\uB2E4.
    \uBB38\uC81C\uD574\uACB0\uACFC \uC9C4\uB2E8\uC2DC\uC5D0 \uC720\uC6A9\uD569\uB2C8\uB2E4. \uCD9C\uB825\uBB3C\uC744 \uBCF4\uB824\uBA74 ''println'' \uBA85\uB839\uC744 \uC0AC\uC6A9\uD558\uC138\uC694.
    (System.out\uB97C \uC0AC\uC6A9\uD558\uBA74 \uC11C\uBC84\uC758 \uD45C\uC900\uCD9C\uB825\uC73C\uB85C \uBCF4\uB0B4\uC9C0\uACE0, \uAC00\uB3C5\uC131\uC774 \uB5A8\uC5B4\uC9D1\uB2C8\uB2E4.)

    \uC608\uC81C: diff --git a/core/src/main/resources/lib/hudson/scriptConsole_nb_NO.properties b/core/src/main/resources/lib/hudson/scriptConsole_nb_NO.properties index ef03bcb2ec..4855b5d7f0 100644 --- a/core/src/main/resources/lib/hudson/scriptConsole_nb_NO.properties +++ b/core/src/main/resources/lib/hudson/scriptConsole_nb_NO.properties @@ -22,7 +22,4 @@ Run=Kj\u00F8r Script\ Console=Skript-konsoll -description=Skriv inn et vilk\u00E5rlig Groovy script og kj\u00F8r det p\u00E5 serveren. Nyttig i forbindelse med feils\u00F8king og diagnostisering. Bruke "println"-kommandoen for \u00E5 se utdataene. (Hvis du bruker System.out havner det i serverens STDOUT, som er vanskeligere \u00E5 se. -Eksempel: -println(hudson.model.Hudson.instance.pluginManager.plugins) - +description=Skriv inn et vilk\u00E5rlig Groovy script og kj\u00F8r det p\u00E5 serveren. Nyttig i forbindelse med feils\u00F8king og diagnostisering. Bruke "println"-kommandoen for \u00E5 se utdataene. (Hvis du bruker System.out havner det i serverens STDOUT, som er vanskeligere \u00E5 se. Eksempel: diff --git a/core/src/main/resources/lib/hudson/scriptConsole_tr.properties b/core/src/main/resources/lib/hudson/scriptConsole_tr.properties index d11cf3ad7e..59a1ae2f17 100644 --- a/core/src/main/resources/lib/hudson/scriptConsole_tr.properties +++ b/core/src/main/resources/lib/hudson/scriptConsole_tr.properties @@ -20,6 +20,6 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. -Script\ Console=Script\ Konsolu +Script\ Console=Script Konsolu Run=\u0130al\u0131\u015ft\u0131r Result=Sonu\u00e7 diff --git a/core/src/main/resources/lib/hudson/thirdPartyLicenses.jelly b/core/src/main/resources/lib/hudson/thirdPartyLicenses.jelly index 072f859fa9..7d2e816ad7 100644 --- a/core/src/main/resources/lib/hudson/thirdPartyLicenses.jelly +++ b/core/src/main/resources/lib/hudson/thirdPartyLicenses.jelly @@ -39,7 +39,7 @@ THE SOFTWARE. - ${attrs.name} + ${attrs.name} ${attrs.groupId}:${attrs.artifactId}:${attrs.version} @@ -51,7 +51,7 @@ THE SOFTWARE. - ${attrs.name}
    + ${attrs.name}
    diff --git a/core/src/main/resources/lib/hudson/thirdPartyLicenses_ru.properties b/core/src/main/resources/lib/hudson/thirdPartyLicenses_ru.properties index 8e2816f89c..88f4d0647e 100644 --- a/core/src/main/resources/lib/hudson/thirdPartyLicenses_ru.properties +++ b/core/src/main/resources/lib/hudson/thirdPartyLicenses_ru.properties @@ -22,4 +22,4 @@ License=\u041b\u0438\u0446\u0435\u043d\u0437\u0438\u044f Maven\ ID=ID Maven'\u0430 -Name=\u0418\u043c\u044f \ No newline at end of file +Name=\u0418\u043c\u044f diff --git a/core/src/main/resources/lib/layout/ajax.jelly b/core/src/main/resources/lib/layout/ajax.jelly index 9d9ef3b2d5..49b25db7db 100644 --- a/core/src/main/resources/lib/layout/ajax.jelly +++ b/core/src/main/resources/lib/layout/ajax.jelly @@ -50,13 +50,10 @@ THE SOFTWARE.
    - - - - ${h.initPageVariables(context)} - - + + +
    \ No newline at end of file diff --git a/core/src/main/resources/lib/layout/breadcrumbBar_pt.properties b/core/src/main/resources/lib/layout/breadcrumbBar_pt.properties index fb0a34b562..e2df18bc05 100644 --- a/core/src/main/resources/lib/layout/breadcrumbBar_pt.properties +++ b/core/src/main/resources/lib/layout/breadcrumbBar_pt.properties @@ -21,4 +21,4 @@ # THE SOFTWARE. ENABLE\ AUTO\ REFRESH=Ativar atualiza\u00E7\u00E3o autom\u00E1tica -DISABLE\ AUTO\ REFRESH=Desativar atualiza\u00E7\u00E3o autom\u00E1tica \ No newline at end of file +DISABLE\ AUTO\ REFRESH=Desativar atualiza\u00E7\u00E3o autom\u00E1tica diff --git a/core/src/main/resources/lib/layout/breadcrumbBar_sr.properties b/core/src/main/resources/lib/layout/breadcrumbBar_sr.properties index b09138e3ce..335d0c0346 100644 --- a/core/src/main/resources/lib/layout/breadcrumbBar_sr.properties +++ b/core/src/main/resources/lib/layout/breadcrumbBar_sr.properties @@ -1,4 +1,4 @@ # This file is under the MIT License by authors 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 +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 diff --git a/core/src/main/resources/lib/layout/breadcrumbs.css b/core/src/main/resources/lib/layout/breadcrumbs.css index 5dcc7624eb..26c4683a8a 100644 --- a/core/src/main/resources/lib/layout/breadcrumbs.css +++ b/core/src/main/resources/lib/layout/breadcrumbs.css @@ -24,6 +24,7 @@ margin: 0; height: 2em; border-bottom: 1px solid #d3d7cf; + display:block; } #breadcrumbs LI { @@ -31,6 +32,7 @@ line-height:2em; height: 2em; color:#555753; + display:inline-block; } #breadcrumbs LI A { @@ -46,6 +48,12 @@ #breadcrumbs LI A:link, #breadcrumbs LI A:visited { text-decoration:none; color:#555753; + display: block; + max-width: 1330px; + float: left; + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; } #breadcrumbs LI A:hover, #crumbs LI A:focus { diff --git a/core/src/main/resources/lib/layout/hasPermission.jelly b/core/src/main/resources/lib/layout/hasPermission.jelly index d42a5f9689..6371acc382 100644 --- a/core/src/main/resources/lib/layout/hasPermission.jelly +++ b/core/src/main/resources/lib/layout/hasPermission.jelly @@ -26,7 +26,13 @@ THE SOFTWARE. Renders the body only if the current user has the specified permission - + + By default it will reuse the current context. + If the provided value does not inherit from hudson.security.AccessControlled, + the tag will look for the first ancestor satisfying the condition. + The hasPermission will be performed against that value. + + permission object to check. If this is null, the body will be also rendered. @@ -34,4 +40,4 @@ THE SOFTWARE. - \ 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 f364ff17f9..0a56c939ad 100644 --- a/core/src/main/resources/lib/layout/html.jelly +++ b/core/src/main/resources/lib/layout/html.jelly @@ -56,13 +56,11 @@ THE SOFTWARE. (The permission will be checked against the "it" object.)
    + - - -${h.initPageVariables(context)} +