diff --git a/.github/workflows/changelog.yml b/.github/workflows/changelog.yml index b1e18b9bc429..8383062fcc20 100644 --- a/.github/workflows/changelog.yml +++ b/.github/workflows/changelog.yml @@ -35,7 +35,7 @@ jobs: env: GITHUB_AUTH: github-actions:${{ secrets.GITHUB_TOKEN }} - name: Upload Changelog YAML - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: changelog.yaml path: changelog.yaml diff --git a/.github/workflows/publish-release-artifact.yml b/.github/workflows/publish-release-artifact.yml index 86d55282ebba..3bb991579de8 100644 --- a/.github/workflows/publish-release-artifact.yml +++ b/.github/workflows/publish-release-artifact.yml @@ -16,11 +16,11 @@ jobs: is-rc: ${{ steps.set-version.outputs.is-rc }} steps: - uses: actions/checkout@v4 - - name: Set up JDK 11 + - name: Set up JDK 17 uses: actions/setup-java@v4 with: distribution: "temurin" - java-version: 11 + java-version: 17 cache: "maven" - name: Set version id: set-version diff --git a/.mvn/extensions.xml b/.mvn/extensions.xml index 1f36364094f1..a64ab6f242ca 100644 --- a/.mvn/extensions.xml +++ b/.mvn/extensions.xml @@ -1,4 +1,4 @@ - + io.jenkins.tools.incrementals git-changelist-maven-extension diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 0e6dbffdda9d..77c012b44c68 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -9,7 +9,7 @@ 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 necessary development tools. In order to develop Jenkins, you need the following: - - Java Development Kit (JDK) 11 or 17. + - Java Development Kit (JDK) 11, 17 or 21. In the Jenkins project we usually use [Eclipse Temurin](https://adoptium.net/) or [OpenJDK](https://openjdk.java.net/), but you can use other JDKs as well. - Apache Maven 3.8.1 or above. You can [download Maven here](https://maven.apache.org/download.cgi). In the Jenkins project we usually use the most recent Maven release. diff --git a/ath.sh b/ath.sh index db84a79fff2a..a084a1cc7b58 100644 --- a/ath.sh +++ b/ath.sh @@ -6,7 +6,7 @@ set -o xtrace cd "$(dirname "$0")" # https://github.com/jenkinsci/acceptance-test-harness/releases -export ATH_VERSION=5740.vd30f30408987 +export ATH_VERSION=5770.v81b_784f28b_d7 if [[ $# -eq 0 ]]; then export JDK=17 diff --git a/bom/pom.xml b/bom/pom.xml index 28a945e2321e..4ecb6251acea 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -22,7 +22,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. --> - + 4.0.0 @@ -39,7 +39,7 @@ THE SOFTWARE. 9.6 - 2.0.9 + 2.0.10 1822.v120278426e1c 2.4.21 @@ -64,7 +64,7 @@ THE SOFTWARE. org.springframework.security spring-security-bom - 5.8.8 + 5.8.9 pom import @@ -82,7 +82,7 @@ THE SOFTWARE. com.google.guava guava - 32.1.3-jre + 33.0.0-jre @@ -196,9 +196,9 @@ THE SOFTWARE. ${groovy.version} - org.connectbot.jbcrypt + org.connectbot jbcrypt - 1.0.0 + 1.0.2 diff --git a/cli/pom.xml b/cli/pom.xml index 21aabc88e649..50588e3e692b 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -1,5 +1,5 @@ - + 4.0.0 diff --git a/core/pom.xml b/core/pom.xml index 45539865962a..4280e9075da9 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -23,7 +23,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. --> - + 4.0.0 @@ -282,7 +282,7 @@ THE SOFTWARE. groovy-all - org.connectbot.jbcrypt + org.connectbot jbcrypt diff --git a/core/src/main/java/hudson/ClassicPluginStrategy.java b/core/src/main/java/hudson/ClassicPluginStrategy.java index 1047ec5a3dbc..10b0d179fdd7 100644 --- a/core/src/main/java/hudson/ClassicPluginStrategy.java +++ b/core/src/main/java/hudson/ClassicPluginStrategy.java @@ -86,11 +86,6 @@ public class ClassicPluginStrategy implements PluginStrategy { private final PluginManager pluginManager; - /** - * All the plugins eventually delegate this classloader to load core, servlet APIs, and SE runtime. - */ - private final MaskingClassLoader coreClassLoader = new MaskingClassLoader(getClass().getClassLoader()); - public ClassicPluginStrategy(PluginManager pluginManager) { this.pluginManager = pluginManager; } @@ -235,16 +230,8 @@ private static Manifest loadLinkedManifest(File archive) throws IOException { fix(atts, optionalDependencies); - // Register global classpath mask. This is useful for hiding JavaEE APIs that you might see from the container, - // such as database plugin for JPA support. The Mask-Classes attribute is insufficient because those classes - // also need to be masked by all the other plugins that depend on the database plugin. - String masked = atts.getValue("Global-Mask-Classes"); - if (masked != null) { - for (String pkg : masked.trim().split("[ \t\r\n]+")) - coreClassLoader.add(pkg); - } - - ClassLoader dependencyLoader = new DependencyClassLoader(coreClassLoader, archive, Util.join(dependencies, optionalDependencies), pluginManager); + ClassLoader dependencyLoader = new DependencyClassLoader( + getClass().getClassLoader(), archive, Util.join(dependencies, optionalDependencies), pluginManager); dependencyLoader = getBaseClassLoader(atts, dependencyLoader); return new PluginWrapper(pluginManager, archive, manifest, baseResourceURL, diff --git a/core/src/main/java/hudson/ExtensionList.java b/core/src/main/java/hudson/ExtensionList.java index 202a76732bc2..c333b2de9ff2 100644 --- a/core/src/main/java/hudson/ExtensionList.java +++ b/core/src/main/java/hudson/ExtensionList.java @@ -468,7 +468,7 @@ public static ExtensionList create(Jenkins jenkins, Class type) { * @return the singleton instance of the given type in its list. * @throws IllegalStateException if there are no instances * - * @since TODO + * @since 2.435 */ public static @NonNull U lookupFirst(Class type) { var all = lookup(type); diff --git a/core/src/main/java/hudson/FilePath.java b/core/src/main/java/hudson/FilePath.java index cdc057ef9c54..1da338d6e549 100644 --- a/core/src/main/java/hudson/FilePath.java +++ b/core/src/main/java/hudson/FilePath.java @@ -28,6 +28,7 @@ import static hudson.Util.fileToPath; import static hudson.Util.fixEmpty; +import static hudson.Util.fixEmptyAndTrim; import com.google.common.annotations.VisibleForTesting; import com.jcraft.jzlib.GZIPInputStream; @@ -962,7 +963,7 @@ public Void invoke(File dir, VirtualChannel channel) throws IOException { * * * @param archive - * The resource that represents the tgz/zip file. This URL must support the {@code Last-Modified} header. + * The resource that represents the tgz/zip file. This URL must support the {@code Last-Modified} header or the {@code ETag} header. * (For example, you could use {@link ClassLoader#getResource}.) * @param listener * If non-null, a message will be printed to this listener once this method decides to @@ -984,12 +985,18 @@ private boolean installIfNecessaryFrom(@NonNull URL archive, @NonNull TaskListen try { FilePath timestamp = this.child(".timestamp"); long lastModified = timestamp.lastModified(); + // https://httpwg.org/specs/rfc9110.html#field.etag is the ETag specification + // Read previously stored ETag if timestamp is available + String etag = timestamp.exists() ? fixEmptyAndTrim(timestamp.readToString()) : null; URLConnection con; try { con = ProxyConfiguration.open(archive); if (lastModified != 0) { con.setIfModifiedSince(lastModified); } + if (etag != null) { + con.setRequestProperty("If-None-Match", etag); + } con.connect(); } catch (IOException x) { if (this.exists()) { @@ -1016,7 +1023,7 @@ private boolean installIfNecessaryFrom(@NonNull URL archive, @NonNull TaskListen return false; } } - if (lastModified != 0) { + if (lastModified != 0 || etag != null) { if (responseCode == HttpURLConnection.HTTP_NOT_MODIFIED) { return false; } else if (responseCode != HttpURLConnection.HTTP_OK) { @@ -1027,8 +1034,12 @@ private boolean installIfNecessaryFrom(@NonNull URL archive, @NonNull TaskListen } long sourceTimestamp = con.getLastModified(); + String resultEtag = fixEmptyAndTrim(con.getHeaderField("ETag")); if (this.exists()) { + if (equalETags(etag, resultEtag)) { + return false; // already up to date + } if (lastModified != 0 && sourceTimestamp == lastModified) return false; // already up to date this.deleteContents(); @@ -1042,6 +1053,10 @@ private boolean installIfNecessaryFrom(@NonNull URL archive, @NonNull TaskListen // First try to download from the agent machine. try { act(new Unpack(archive)); + if (resultEtag != null && !equalETags(etag, resultEtag)) { + /* Store the ETag value in the timestamp file for later use */ + timestamp.write(resultEtag, "UTF-8"); + } timestamp.touch(sourceTimestamp); return true; } catch (IOException x) { @@ -1061,6 +1076,10 @@ private boolean installIfNecessaryFrom(@NonNull URL archive, @NonNull TaskListen throw new IOException(String.format("Failed to unpack %s (%d bytes read of total %d)", archive, cis.getByteCount(), con.getContentLength()), e); } + if (resultEtag != null && !equalETags(etag, resultEtag)) { + /* Store the ETag value in the timestamp file for later use */ + timestamp.write(resultEtag, "UTF-8"); + } timestamp.touch(sourceTimestamp); return true; } catch (IOException e) { @@ -1068,6 +1087,25 @@ private boolean installIfNecessaryFrom(@NonNull URL archive, @NonNull TaskListen } } + /* Return true if etag1 equals etag2 as defined by the etag specification + https://httpwg.org/specs/rfc9110.html#field.etag + */ + private boolean equalETags(String etag1, String etag2) { + if (etag1 == null || etag2 == null) { + return false; + } + if (etag1.equals(etag2)) { + return true; + } + /* Weak tags are identified by leading characters "W/" as a marker */ + /* Weak tag marker must not be considered in tag comparison. + This implements the weak comparison in the specification at + https://httpwg.org/specs/rfc9110.html#field.etag */ + String opaqueTag1 = etag1.startsWith("W/") ? etag1.substring(2) : etag1; + String opaqueTag2 = etag2.startsWith("W/") ? etag2.substring(2) : etag2; + return opaqueTag1.equals(opaqueTag2); + } + // this reads from arbitrary URL private static final class Unpack extends MasterToSlaveFileCallable { private final URL archive; diff --git a/core/src/main/java/hudson/Functions.java b/core/src/main/java/hudson/Functions.java index 0d5786815ed0..d27160aaa8a2 100644 --- a/core/src/main/java/hudson/Functions.java +++ b/core/src/main/java/hudson/Functions.java @@ -692,13 +692,13 @@ public static String getUserTimeZone() { } @Restricted(NoExternalUse.class) - public static String getUserTimeZonePostfix() { + public static String getUserTimeZonePostfix(Date date) { if (!isUserTimeZoneOverride()) { return ""; } TimeZone tz = TimeZone.getTimeZone(getUserTimeZone()); - return tz.getDisplayName(tz.observesDaylightTime(), TimeZone.SHORT); + return tz.getDisplayName(tz.inDaylightTime(date), TimeZone.SHORT, getCurrentLocale()); } @Restricted(NoExternalUse.class) @@ -1909,7 +1909,7 @@ public static String joinPath(String... components) { * Computes the link to the console for the run for the specified executable, taking {@link ConsoleUrlProvider} into account. * @param executable the executable (normally a {@link Run}) * @return the absolute URL for accessing the build console for the executable, or null if there is no build associated with the executable - * @since TODO + * @since 2.433 */ public static @CheckForNull String getConsoleUrl(Queue.Executable executable) { if (executable == null) { diff --git a/core/src/main/java/hudson/WebAppMain.java b/core/src/main/java/hudson/WebAppMain.java index 99603ac1e411..9f328328c710 100644 --- a/core/src/main/java/hudson/WebAppMain.java +++ b/core/src/main/java/hudson/WebAppMain.java @@ -48,6 +48,7 @@ import java.io.File; import java.io.IOException; import java.io.OutputStream; +import java.lang.reflect.InvocationTargetException; import java.net.URL; import java.net.URLClassLoader; import java.nio.charset.Charset; @@ -261,13 +262,36 @@ public void run() { new HudsonFailedToLoad(e).publish(context, _home); throw e; } catch (Exception e) { - new HudsonFailedToLoad(e).publish(context, _home); + // Allow plugins to override error page on boot with custom BootFailure subclass thrown + Throwable error = unwrapException(e); + if (error instanceof InvocationTargetException) { + Throwable targetException = ((InvocationTargetException) error).getTargetException(); + + if (targetException instanceof BootFailure) { + ((BootFailure) targetException).publish(context, _home); + } else { + new HudsonFailedToLoad(e).publish(context, _home); + } + } else { + new HudsonFailedToLoad(e).publish(context, _home); + } } finally { Jenkins instance = Jenkins.getInstanceOrNull(); if (!success && instance != null) instance.cleanUp(); } } + + private Throwable unwrapException(Exception e) { + Throwable error = e; + while (error.getCause() != null) { + if (error.getCause() instanceof InvocationTargetException) { + return error.getCause(); + } + error = error.getCause(); + } + return error; + } }; initThread.start(); } catch (BootFailure e) { diff --git a/core/src/main/java/hudson/cli/declarative/CLIMethod.java b/core/src/main/java/hudson/cli/declarative/CLIMethod.java index 7b9c35202bb9..3a6bc3c7f2c9 100644 --- a/core/src/main/java/hudson/cli/declarative/CLIMethod.java +++ b/core/src/main/java/hudson/cli/declarative/CLIMethod.java @@ -28,12 +28,12 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME; import hudson.cli.CLICommand; -import hudson.util.ListBoxModel.Option; import java.lang.annotation.Documented; import java.lang.annotation.Retention; import java.lang.annotation.Target; import org.jvnet.hudson.annotation_indexer.Indexed; import org.kohsuke.args4j.Argument; +import org.kohsuke.args4j.Option; /** * Annotates methods on model objects to expose them as CLI commands. diff --git a/core/src/main/java/hudson/model/BuildTimelineWidget.java b/core/src/main/java/hudson/model/BuildTimelineWidget.java index 8849e95555dc..23a372b659c7 100644 --- a/core/src/main/java/hudson/model/BuildTimelineWidget.java +++ b/core/src/main/java/hudson/model/BuildTimelineWidget.java @@ -40,9 +40,9 @@ * * @author Kohsuke Kawaguchi * @since 1.372 - * @deprecated since TODO + * @deprecated since 2.431 */ -@Deprecated +@Deprecated(since = "2.431") public class BuildTimelineWidget { protected final RunList builds; diff --git a/core/src/main/java/hudson/model/ComputerSet.java b/core/src/main/java/hudson/model/ComputerSet.java index cad9089b776f..5cb798978dea 100644 --- a/core/src/main/java/hudson/model/ComputerSet.java +++ b/core/src/main/java/hudson/model/ComputerSet.java @@ -352,15 +352,33 @@ public synchronized HttpResponse doConfigSubmit(StaplerRequest req) throws IOExc BulkChange bc = new BulkChange(MONITORS_OWNER); try { Jenkins.get().checkPermission(Jenkins.MANAGE); - monitors.rebuild(req, req.getSubmittedForm(), getNodeMonitorDescriptors()); + JSONObject json = req.getSubmittedForm(); + monitors.rebuild(req, json, getNodeMonitorDescriptors()); // add in the rest of instances are ignored instances - for (Descriptor d : NodeMonitor.all()) - if (monitors.get(d) == null) { + for (Descriptor d : NodeMonitor.all()) { + NodeMonitor monitor = monitors.get(d); + if (monitor == null) { NodeMonitor i = createDefaultInstance(d, true); if (i != null) monitors.add(i); + } else { + /* + * Some monitors in plugins do not have a DataBoundConstructor + * but a Descriptor that overrides newInstance. For those the ignored + * field is not set, so we have to explicitly set it. + */ + String name = d.getJsonSafeClassName(); + JSONObject o = json.optJSONObject(name); + boolean ignored = true; + if (o != null) { + if (o.containsKey("ignored")) { + ignored = o.getBoolean("ignored"); + } + } + monitor.setIgnored(ignored); } + } // recompute the data for (NodeMonitor nm : monitors) { diff --git a/core/src/main/java/hudson/model/Run.java b/core/src/main/java/hudson/model/Run.java index 23358ade11f4..103d0c41ee98 100644 --- a/core/src/main/java/hudson/model/Run.java +++ b/core/src/main/java/hudson/model/Run.java @@ -2480,10 +2480,12 @@ public EnvVars getEnvironment() throws IOException, InterruptedException { } Jenkins j = Jenkins.getInstanceOrNull(); if (j == null) { + LOGGER.fine(() -> "Jenkins not running"); return null; } Job job = j.getItemByFullName(jobName, Job.class); if (job == null) { + LOGGER.fine(() -> "no such job " + jobName + " when running as " + Jenkins.getAuthentication2().getName()); return null; } return job.getBuildByNumber(number); diff --git a/core/src/main/java/hudson/model/RunMap.java b/core/src/main/java/hudson/model/RunMap.java index ca16fee660d2..b7bb97037940 100644 --- a/core/src/main/java/hudson/model/RunMap.java +++ b/core/src/main/java/hudson/model/RunMap.java @@ -239,6 +239,7 @@ protected R retrieve(File d) throws IOException { LOGGER.log(Level.WARNING, "could not load " + d, e); } } + LOGGER.fine(() -> "no config.xml in " + d); return null; } diff --git a/core/src/main/java/hudson/model/View.java b/core/src/main/java/hudson/model/View.java index c752adc24247..6bd923cd0268 100644 --- a/core/src/main/java/hudson/model/View.java +++ b/core/src/main/java/hudson/model/View.java @@ -406,7 +406,7 @@ public boolean isFilterExecutors() { } /** - * @since TODO + * @since 2.426 */ @DataBoundSetter public void setFilterExecutors(boolean filterExecutors) { @@ -421,7 +421,7 @@ public boolean isFilterQueue() { } /** - * @since TODO + * @since 2.426 */ @DataBoundSetter public void setFilterQueue(boolean filterQueue) { diff --git a/core/src/main/java/hudson/node_monitors/AbstractNodeMonitorDescriptor.java b/core/src/main/java/hudson/node_monitors/AbstractNodeMonitorDescriptor.java index 4a2386c2a1b1..7cd1c75abc8d 100644 --- a/core/src/main/java/hudson/node_monitors/AbstractNodeMonitorDescriptor.java +++ b/core/src/main/java/hudson/node_monitors/AbstractNodeMonitorDescriptor.java @@ -65,6 +65,25 @@ protected AbstractNodeMonitorDescriptor() { this(PERIOD); } + /** + * Indicates if this monitor is capable to take agents offline in case it detects a problem. + * If true, this will enable the configuration option to ignore the monitor. + * Defaults to {@code true} so plugins that do not override this method behave as before. + * Plugins that do implement a monitor that will not take agents offline should override this + * method and return false. + * + * @return true if this monitor might take agents offline + * @since 2.437 + */ + public boolean canTakeOffline() { + return true; + } + + @Override + public String getConfigPage() { + return getViewPage(clazz, "configure.jelly"); + } + /** * @deprecated as of 1.522 * Extend from {@link AbstractAsyncNodeMonitorDescriptor} diff --git a/core/src/main/java/hudson/node_monitors/ArchitectureMonitor.java b/core/src/main/java/hudson/node_monitors/ArchitectureMonitor.java index d2c60a2544d0..e9c63ab74433 100644 --- a/core/src/main/java/hudson/node_monitors/ArchitectureMonitor.java +++ b/core/src/main/java/hudson/node_monitors/ArchitectureMonitor.java @@ -30,10 +30,8 @@ import hudson.remoting.Callable; import java.io.IOException; import jenkins.security.MasterToSlaveCallable; -import net.sf.json.JSONObject; import org.jenkinsci.Symbol; import org.kohsuke.stapler.DataBoundConstructor; -import org.kohsuke.stapler.StaplerRequest; /** * Discovers the architecture of the system to display in the agent list page. @@ -60,8 +58,8 @@ public String getDisplayName() { } @Override - public NodeMonitor newInstance(StaplerRequest req, JSONObject formData) throws FormException { - return new ArchitectureMonitor(); + public boolean canTakeOffline() { + return false; } } diff --git a/core/src/main/java/hudson/node_monitors/ClockMonitor.java b/core/src/main/java/hudson/node_monitors/ClockMonitor.java index b958df61d776..b9c0f77b5c99 100644 --- a/core/src/main/java/hudson/node_monitors/ClockMonitor.java +++ b/core/src/main/java/hudson/node_monitors/ClockMonitor.java @@ -32,12 +32,10 @@ import hudson.remoting.Callable; import hudson.util.ClockDifference; import java.io.IOException; -import net.sf.json.JSONObject; import org.jenkinsci.Symbol; import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.restrictions.NoExternalUse; import org.kohsuke.stapler.DataBoundConstructor; -import org.kohsuke.stapler.StaplerRequest; /** * {@link NodeMonitor} that checks clock of {@link Node} to @@ -72,6 +70,11 @@ public DescriptorImpl() { DESCRIPTOR = this; } + @Override + public boolean canTakeOffline() { + return false; + } + @Override protected Callable createCallable(Computer c) { Node n = c.getNode(); @@ -84,10 +87,5 @@ protected Callable createCallable(Computer c) { public String getDisplayName() { return Messages.ClockMonitor_DisplayName(); } - - @Override - public NodeMonitor newInstance(StaplerRequest req, JSONObject formData) throws FormException { - return new ClockMonitor(); - } } } diff --git a/core/src/main/java/hudson/node_monitors/DiskSpaceMonitorDescriptor.java b/core/src/main/java/hudson/node_monitors/DiskSpaceMonitorDescriptor.java index 18bc935e3689..03038c054cdb 100644 --- a/core/src/main/java/hudson/node_monitors/DiskSpaceMonitorDescriptor.java +++ b/core/src/main/java/hudson/node_monitors/DiskSpaceMonitorDescriptor.java @@ -183,11 +183,11 @@ public long getFreeSize() { /** * Gets GB left. * - * @deprecated since TODO + * @deprecated * Directly use the size field or to get a human-readable value with units use * {@link Functions#humanReadableByteSize(long)} */ - @Deprecated + @Deprecated(since = "2.434") public String getGbLeft() { long space = size; space /= 1024L; // convert to KB diff --git a/core/src/main/java/hudson/node_monitors/DiskSpaceMonitorNodeProperty.java b/core/src/main/java/hudson/node_monitors/DiskSpaceMonitorNodeProperty.java index 37cb8a56f683..3ac836f3238c 100644 --- a/core/src/main/java/hudson/node_monitors/DiskSpaceMonitorNodeProperty.java +++ b/core/src/main/java/hudson/node_monitors/DiskSpaceMonitorNodeProperty.java @@ -11,7 +11,7 @@ /** * {@link NodeProperty} that allows users to set agent specific disk space thresholds. * - * @since TODO + * @since 2.434 */ public class DiskSpaceMonitorNodeProperty extends NodeProperty { private final String freeDiskSpaceThreshold; diff --git a/core/src/main/java/hudson/node_monitors/NodeMonitor.java b/core/src/main/java/hudson/node_monitors/NodeMonitor.java index 0fb737a7677a..61ac5d67b7d4 100644 --- a/core/src/main/java/hudson/node_monitors/NodeMonitor.java +++ b/core/src/main/java/hudson/node_monitors/NodeMonitor.java @@ -37,6 +37,7 @@ import hudson.util.DescriptorList; import java.util.List; import jenkins.model.Jenkins; +import org.kohsuke.stapler.DataBoundSetter; import org.kohsuke.stapler.export.Exported; import org.kohsuke.stapler.export.ExportedBean; @@ -133,6 +134,7 @@ public boolean isIgnored() { return ignored; } + @DataBoundSetter public void setIgnored(boolean ignored) { this.ignored = ignored; } diff --git a/core/src/main/java/hudson/node_monitors/ResponseTimeMonitor.java b/core/src/main/java/hudson/node_monitors/ResponseTimeMonitor.java index 5a7223039696..a2bf84ea817f 100644 --- a/core/src/main/java/hudson/node_monitors/ResponseTimeMonitor.java +++ b/core/src/main/java/hudson/node_monitors/ResponseTimeMonitor.java @@ -34,10 +34,8 @@ import java.util.Map; import java.util.logging.Logger; import jenkins.security.MasterToSlaveCallable; -import net.sf.json.JSONObject; import org.jenkinsci.Symbol; import org.kohsuke.stapler.DataBoundConstructor; -import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.export.Exported; import org.kohsuke.stapler.export.ExportedBean; @@ -103,11 +101,6 @@ protected Map monitor() throws InterruptedException { public String getDisplayName() { return Messages.ResponseTimeMonitor_DisplayName(); } - - @Override - public NodeMonitor newInstance(StaplerRequest req, JSONObject formData) throws FormException { - return new ResponseTimeMonitor(); - } } private static final class Step1 extends MasterToSlaveCallable { diff --git a/core/src/main/java/hudson/node_monitors/SwapSpaceMonitor.java b/core/src/main/java/hudson/node_monitors/SwapSpaceMonitor.java index 09064ccb4a82..fa7f53eab70b 100644 --- a/core/src/main/java/hudson/node_monitors/SwapSpaceMonitor.java +++ b/core/src/main/java/hudson/node_monitors/SwapSpaceMonitor.java @@ -33,12 +33,10 @@ import java.io.IOException; import jenkins.model.Jenkins; import jenkins.security.MasterToSlaveCallable; -import net.sf.json.JSONObject; import org.jenkinsci.Symbol; import org.jvnet.hudson.MemoryMonitor; import org.jvnet.hudson.MemoryUsage; import org.kohsuke.stapler.DataBoundConstructor; -import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.export.Exported; import org.kohsuke.stapler.export.ExportedBean; @@ -103,6 +101,11 @@ public DescriptorImpl() { DESCRIPTOR = this; } + @Override + public boolean canTakeOffline() { + return false; + } + @Override protected MonitorTask createCallable(Computer c) { return new MonitorTask(); @@ -113,11 +116,6 @@ protected MonitorTask createCallable(Computer c) { public String getDisplayName() { return Messages.SwapSpaceMonitor_DisplayName(); } - - @Override - public NodeMonitor newInstance(StaplerRequest req, JSONObject formData) throws FormException { - return new SwapSpaceMonitor(); - } } /** diff --git a/core/src/main/java/hudson/slaves/JNLPLauncher.java b/core/src/main/java/hudson/slaves/JNLPLauncher.java index 3e11407ef6ba..4645f3ffbeeb 100644 --- a/core/src/main/java/hudson/slaves/JNLPLauncher.java +++ b/core/src/main/java/hudson/slaves/JNLPLauncher.java @@ -53,11 +53,11 @@ * @author Stephen Connolly * @author Kohsuke Kawaguchi */ +@SuppressWarnings("deprecation") // see comments about CasC public class JNLPLauncher extends ComputerLauncher { /** * Deprecated (only used with deprecated {@code -jnlpUrl} mode), but cannot mark it as such without breaking CasC. */ - @DataBoundSetter @CheckForNull public String tunnel; @@ -67,11 +67,9 @@ public class JNLPLauncher extends ComputerLauncher { @Deprecated public final transient String vmargs = null; - @Deprecated @NonNull private RemotingWorkDirSettings workDirSettings = RemotingWorkDirSettings.getEnabledDefaults(); - @Deprecated private boolean webSocket; /** @@ -131,7 +129,9 @@ protected Object readResolve() { return this; } - @Deprecated + /** + * Deprecated (only used with deprecated {@code -jnlpUrl} mode), but cannot mark it as such without breaking CasC. + */ public RemotingWorkDirSettings getWorkDirSettings() { return workDirSettings; } @@ -149,7 +149,9 @@ public boolean isLaunchSupported() { return false; } - @Deprecated + /** + * Deprecated (only used with deprecated {@code -jnlpUrl} mode), but cannot mark it as such without breaking CasC. + */ public boolean isWebSocket() { return webSocket; } @@ -162,6 +164,21 @@ public void setWebSocket(boolean webSocket) { this.webSocket = webSocket; } + /** + * Deprecated (only used with deprecated {@code -jnlpUrl} mode), but cannot mark it as such without breaking CasC. + */ + public String getTunnel() { + return tunnel; + } + + /** + * Deprecated (only used with deprecated {@code -jnlpUrl} mode), but cannot mark it as such without breaking CasC. + */ + @DataBoundSetter + public void setTunnel(String tunnel) { + this.tunnel = tunnel; + } + @Override public void launch(SlaveComputer computer, TaskListener listener) { // do nothing as we cannot self start diff --git a/core/src/main/java/hudson/slaves/SimpleScheduledRetentionStrategy.java b/core/src/main/java/hudson/slaves/SimpleScheduledRetentionStrategy.java index 6f09e8109973..ef6e3d0c8658 100644 --- a/core/src/main/java/hudson/slaves/SimpleScheduledRetentionStrategy.java +++ b/core/src/main/java/hudson/slaves/SimpleScheduledRetentionStrategy.java @@ -169,6 +169,11 @@ public boolean isManualLaunchAllowed(final SlaveComputer c) { return isOnlineScheduled(); } + @Override + public boolean isAcceptingTasks(SlaveComputer c) { + return isOnlineScheduled(); + } + @Override @GuardedBy("hudson.model.Queue.lock") public synchronized long check(final SlaveComputer c) { @@ -191,7 +196,6 @@ public void run() { LOGGER.log(INFO, "Enabling new jobs for computer {0} as it has started its scheduled uptime", new Object[]{c.getName()}); - c.setAcceptingTasks(true); } } catch (InterruptedException | ExecutionException e) { } @@ -199,45 +203,44 @@ public void run() { }); } } else if (!shouldBeOnline && c.isOnline()) { - if (keepUpWhenActive) { - if (!c.isIdle() && c.isAcceptingTasks()) { - c.setAcceptingTasks(false); - LOGGER.log(INFO, - "Disabling new jobs for computer {0} as it has finished its scheduled uptime", - new Object[]{c.getName()}); - return 1; - } else if (c.isIdle() && c.isAcceptingTasks()) { - Queue.withLock(new Runnable() { - @Override - public void run() { - if (c.isIdle()) { - LOGGER.log(INFO, "Disconnecting computer {0} as it has finished its scheduled uptime", - new Object[]{c.getName()}); - c.disconnect(OfflineCause - .create(Messages._SimpleScheduledRetentionStrategy_FinishedUpTime())); - } else { - c.setAcceptingTasks(false); + if (c.isLaunchSupported()) { + if (keepUpWhenActive) { + if (!c.isIdle() && c.isAcceptingTasks()) { + LOGGER.log(INFO, + "Disabling new jobs for computer {0} as it has finished its scheduled uptime", + new Object[]{c.getName()}); + return 1; + } else if (c.isIdle() && c.isAcceptingTasks()) { + Queue.withLock(new Runnable() { + @Override + public void run() { + if (c.isIdle()) { + LOGGER.log(INFO, "Disconnecting computer {0} as it has finished its scheduled uptime", + new Object[]{c.getName()}); + c.disconnect(OfflineCause + .create(Messages._SimpleScheduledRetentionStrategy_FinishedUpTime())); + } } - } - }); - } else if (c.isIdle() && !c.isAcceptingTasks()) { - Queue.withLock(new Runnable() { - @Override - public void run() { - if (c.isIdle()) { - LOGGER.log(INFO, "Disconnecting computer {0} as it has finished all jobs running when " - + "it completed its scheduled uptime", new Object[]{c.getName()}); - c.disconnect(OfflineCause - .create(Messages._SimpleScheduledRetentionStrategy_FinishedUpTime())); + }); + } else if (c.isIdle() && !c.isAcceptingTasks()) { + Queue.withLock(new Runnable() { + @Override + public void run() { + if (c.isIdle()) { + LOGGER.log(INFO, "Disconnecting computer {0} as it has finished all jobs running when " + + "it completed its scheduled uptime", new Object[]{c.getName()}); + c.disconnect(OfflineCause + .create(Messages._SimpleScheduledRetentionStrategy_FinishedUpTime())); + } } - } - }); + }); + } + } else { + // no need to get the queue lock as the user has selected the break builds option! + LOGGER.log(INFO, "Disconnecting computer {0} as it has finished its scheduled uptime", + new Object[]{c.getName()}); + c.disconnect(OfflineCause.create(Messages._SimpleScheduledRetentionStrategy_FinishedUpTime())); } - } else { - // no need to get the queue lock as the user has selected the break builds option! - LOGGER.log(INFO, "Disconnecting computer {0} as it has finished its scheduled uptime", - new Object[]{c.getName()}); - c.disconnect(OfflineCause.create(Messages._SimpleScheduledRetentionStrategy_FinishedUpTime())); } } return 1; diff --git a/core/src/main/java/hudson/util/AtomicFileWriter.java b/core/src/main/java/hudson/util/AtomicFileWriter.java index 4e871b3262f0..fabe15c5a6b6 100644 --- a/core/src/main/java/hudson/util/AtomicFileWriter.java +++ b/core/src/main/java/hudson/util/AtomicFileWriter.java @@ -26,11 +26,13 @@ import edu.umd.cs.findbugs.annotations.NonNull; import edu.umd.cs.findbugs.annotations.Nullable; +import hudson.Functions; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.Writer; import java.lang.ref.Cleaner; +import java.nio.channels.FileChannel; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.nio.file.AtomicMoveNotSupportedException; @@ -62,6 +64,9 @@ public class AtomicFileWriter extends Writer { private static /* final */ boolean DISABLE_FORCED_FLUSH = SystemProperties.getBoolean( AtomicFileWriter.class.getName() + ".DISABLE_FORCED_FLUSH"); + private static /* final */ boolean REQUIRES_DIR_FSYNC = SystemProperties.getBoolean( + AtomicFileWriter.class.getName() + ".REQUIRES_DIR_FSYNC", !Functions.isWindows()); + static { if (DISABLE_FORCED_FLUSH) { LOGGER.log(Level.WARNING, "DISABLE_FORCED_FLUSH flag used, this could result in dataloss if failures happen in your storage subsystem."); @@ -234,6 +239,18 @@ public void commit() throws IOException { throw replaceFailed; } } + + /* + * From fsync(2) on Linux: + * + * Calling fsync() does not necessarily ensure that the entry in the directory containing the file has also + * reached disk. For that an explicit fsync() on a file descriptor for the directory is also needed. + */ + if (!DISABLE_FORCED_FLUSH && REQUIRES_DIR_FSYNC) { + try (FileChannel parentChannel = FileChannel.open(destPath.getParent())) { + parentChannel.force(true); + } + } } private static final class CleanupChecker implements Runnable { diff --git a/core/src/main/java/hudson/util/MaskingClassLoader.java b/core/src/main/java/hudson/util/MaskingClassLoader.java index efb05831ccce..74bbbe1a9863 100644 --- a/core/src/main/java/hudson/util/MaskingClassLoader.java +++ b/core/src/main/java/hudson/util/MaskingClassLoader.java @@ -31,7 +31,7 @@ import java.util.Collections; import java.util.Enumeration; import java.util.List; -import java.util.concurrent.CopyOnWriteArrayList; +import java.util.stream.Collectors; /** * {@link ClassLoader} that masks a specified set of classes @@ -46,9 +46,9 @@ public class MaskingClassLoader extends ClassLoader { /** * Prefix of the packages that should be hidden. */ - private final List masksClasses = new CopyOnWriteArrayList<>(); + private final List masksClasses; - private final List masksResources = new CopyOnWriteArrayList<>(); + private final List masksResources; static { registerAsParallelCapable(); @@ -60,14 +60,13 @@ public MaskingClassLoader(ClassLoader parent, String... masks) { public MaskingClassLoader(ClassLoader parent, Collection masks) { super(parent); - this.masksClasses.addAll(masks); + this.masksClasses = List.copyOf(masks); /* * The name of a resource is a '/'-separated path name */ - for (String mask : masks) { - masksResources.add(mask.replace('.', '/')); - } + this.masksResources = + masks.stream().map(mask -> mask.replace('.', '/')).collect(Collectors.toUnmodifiableList()); } @Override @@ -94,13 +93,6 @@ public Enumeration getResources(String name) throws IOException { return super.getResources(name); } - public void add(String prefix) { - masksClasses.add(prefix); - if (prefix != null) { - masksResources.add(prefix.replace('.', '/')); - } - } - private boolean isMasked(String name) { for (String mask : masksResources) { if (name.startsWith(mask)) diff --git a/core/src/main/java/jenkins/console/ConsoleUrlProvider.java b/core/src/main/java/jenkins/console/ConsoleUrlProvider.java index ba4e5a000cbc..0b9e70c3db53 100644 --- a/core/src/main/java/jenkins/console/ConsoleUrlProvider.java +++ b/core/src/main/java/jenkins/console/ConsoleUrlProvider.java @@ -52,7 +52,7 @@ * Pipeline flow graph, there may be various edge cases where your visualization does not work at all, but the classic * console view is unaffected. * @see Functions#getConsoleUrl - * @since TODO + * @since 2.433 */ public interface ConsoleUrlProvider extends Describable { @Restricted(NoExternalUse.class) diff --git a/core/src/main/java/jenkins/console/ConsoleUrlProviderGlobalConfiguration.java b/core/src/main/java/jenkins/console/ConsoleUrlProviderGlobalConfiguration.java index 260321b009eb..a63fe679f200 100644 --- a/core/src/main/java/jenkins/console/ConsoleUrlProviderGlobalConfiguration.java +++ b/core/src/main/java/jenkins/console/ConsoleUrlProviderGlobalConfiguration.java @@ -48,7 +48,7 @@ /** * Allows administrators to activate and sort {@link ConsoleUrlProvider} extensions to set defaults for all users. * @see ConsoleUrlProviderUserProperty - * @since TODO + * @since 2.433 */ @Extension @Symbol("consoleUrlProvider") diff --git a/core/src/main/java/jenkins/console/ConsoleUrlProviderUserProperty.java b/core/src/main/java/jenkins/console/ConsoleUrlProviderUserProperty.java index d741a0f16fd4..3763036b9686 100644 --- a/core/src/main/java/jenkins/console/ConsoleUrlProviderUserProperty.java +++ b/core/src/main/java/jenkins/console/ConsoleUrlProviderUserProperty.java @@ -39,7 +39,7 @@ /** * Allows users to activate and sort {@link ConsoleUrlProvider} extensions based on their preferences. * @see ConsoleUrlProviderGlobalConfiguration - * @since TODO + * @since 2.433 */ @Restricted(NoExternalUse.class) public class ConsoleUrlProviderUserProperty extends UserProperty { diff --git a/core/src/main/java/jenkins/console/DefaultConsoleUrlProvider.java b/core/src/main/java/jenkins/console/DefaultConsoleUrlProvider.java index 34722301529d..59b2e8f64be3 100644 --- a/core/src/main/java/jenkins/console/DefaultConsoleUrlProvider.java +++ b/core/src/main/java/jenkins/console/DefaultConsoleUrlProvider.java @@ -36,7 +36,7 @@ * Default implementation of {@link ConsoleUrlProvider} that uses the standard Jenkins console view. *

Exists so that users have a way to override {@link ConsoleUrlProviderGlobalConfiguration} and specify the default * console view if desired via {@link ConsoleUrlProviderUserProperty}. - * @since TODO + * @since 2.433 */ @Restricted(value = NoExternalUse.class) public class DefaultConsoleUrlProvider implements ConsoleUrlProvider { diff --git a/core/src/main/java/jenkins/model/Loadable.java b/core/src/main/java/jenkins/model/Loadable.java index a8fd2eca4c56..76350cc2f4ef 100644 --- a/core/src/main/java/jenkins/model/Loadable.java +++ b/core/src/main/java/jenkins/model/Loadable.java @@ -6,7 +6,7 @@ /** * Object whose state can be loaded from disk. In general, also implements {@link Saveable}. * - * @since TODO + * @since 2.428 */ public interface Loadable { diff --git a/core/src/main/java/jenkins/model/PeepholePermalink.java b/core/src/main/java/jenkins/model/PeepholePermalink.java index 40297b6e406c..62185f39f1ae 100644 --- a/core/src/main/java/jenkins/model/PeepholePermalink.java +++ b/core/src/main/java/jenkins/model/PeepholePermalink.java @@ -242,7 +242,7 @@ public void onCompleted(Run run, @NonNull TaskListener listener) { } /** - * @since TODO + * @since 2.436 */ public static final Permalink LAST_STABLE_BUILD = new PeepholePermalink() { @Override @@ -262,7 +262,7 @@ public boolean apply(Run run) { }; /** - * @since TODO + * @since 2.436 */ public static final Permalink LAST_SUCCESSFUL_BUILD = new PeepholePermalink() { @Override @@ -283,7 +283,7 @@ public boolean apply(Run run) { }; /** - * @since TODO + * @since 2.436 */ public static final Permalink LAST_FAILED_BUILD = new PeepholePermalink() { @Override @@ -303,7 +303,7 @@ public boolean apply(Run run) { }; /** - * @since TODO + * @since 2.436 */ public static final Permalink LAST_UNSTABLE_BUILD = new PeepholePermalink() { @Override @@ -323,7 +323,7 @@ public boolean apply(Run run) { }; /** - * @since TODO + * @since 2.436 */ public static final Permalink LAST_UNSUCCESSFUL_BUILD = new PeepholePermalink() { @Override @@ -343,7 +343,7 @@ public boolean apply(Run run) { }; /** - * @since TODO + * @since 2.436 */ public static final Permalink LAST_COMPLETED_BUILD = new PeepholePermalink() { @Override diff --git a/core/src/main/java/jenkins/model/lazy/AbstractLazyLoadRunMap.java b/core/src/main/java/jenkins/model/lazy/AbstractLazyLoadRunMap.java index 4d2710282ade..95e647cfdfdc 100644 --- a/core/src/main/java/jenkins/model/lazy/AbstractLazyLoadRunMap.java +++ b/core/src/main/java/jenkins/model/lazy/AbstractLazyLoadRunMap.java @@ -518,15 +518,21 @@ public R getByNumber(int n) { Index snapshot = index; if (snapshot.byNumber.containsKey(n)) { BuildReference ref = snapshot.byNumber.get(n); - if (ref == null) return null; // known failure + if (ref == null) { + LOGGER.fine(() -> "known failure of #" + n + " in " + dir); + return null; + } R v = unwrap(ref); - if (v != null) return v; // already in memory + if (v != null) { + return v; // already in memory + } // otherwise fall through to load } synchronized (this) { if (index.byNumber.containsKey(n)) { // JENKINS-22767: recheck inside lock BuildReference ref = index.byNumber.get(n); if (ref == null) { + LOGGER.fine(() -> "known failure of #" + n + " in " + dir); return null; } R v = unwrap(ref); @@ -655,7 +661,10 @@ private R load(File dataDir, Index editInPlace) { assert Thread.holdsLock(this); try { R r = retrieve(dataDir); - if (r == null) return null; + if (r == null) { + LOGGER.fine(() -> "nothing in " + dataDir); + return null; + } Index copy = editInPlace != null ? editInPlace : new Index(index); diff --git a/core/src/main/java/jenkins/security/FIPS140.java b/core/src/main/java/jenkins/security/FIPS140.java index 527c90085996..8901f8932168 100644 --- a/core/src/main/java/jenkins/security/FIPS140.java +++ b/core/src/main/java/jenkins/security/FIPS140.java @@ -32,7 +32,7 @@ * The environment (host, JVM and servlet container), must be suitably configured which is outside the scope of the Jenkins project. * @see FIPS-140-2 * @see JEP-237 - * @since TODO + * @since 2.426 */ public class FIPS140 { diff --git a/core/src/main/java/jenkins/telemetry/impl/JavaSystemProperties.java b/core/src/main/java/jenkins/telemetry/impl/JavaSystemProperties.java new file mode 100644 index 000000000000..90b66fd6f5bd --- /dev/null +++ b/core/src/main/java/jenkins/telemetry/impl/JavaSystemProperties.java @@ -0,0 +1,92 @@ +/* + * The MIT License + * + * Copyright (c) 2023, 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.telemetry.impl; + +import edu.umd.cs.findbugs.annotations.NonNull; +import hudson.Extension; +import java.time.LocalDate; +import java.util.Map; +import java.util.TreeMap; +import jenkins.telemetry.Telemetry; +import net.sf.json.JSONObject; +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.NoExternalUse; + +/** + * Collect the value of various Java system properties describing the environment. + */ +@Extension +@Restricted(NoExternalUse.class) +public class JavaSystemProperties extends Telemetry { + private static final String[] PROPERTIES = new String[] { + "file.encoding", + "file.separator", + "java.vm.name", + "java.vm.vendor", + "java.vm.version", + "os.arch", + "os.name", + "os.version", + "user.language", + }; + + public Map getProperties() { + Map properties = new TreeMap<>(); + for (String property : PROPERTIES) { + final String value = System.getProperty(property); + properties.put(property, value); + } + return properties; + } + + @NonNull + @Override + public String getDisplayName() { + return "System Properties"; + } + + @NonNull + @Override + public LocalDate getStart() { + return LocalDate.of(2023, 12, 17); + } + + @NonNull + @Override + public LocalDate getEnd() { + return LocalDate.of(2024, 4, 1); + } + + @Override + public JSONObject createContent() { + JSONObject o = new JSONObject(); + for (Map.Entry entry : getProperties().entrySet()) { + final String value = entry.getValue(); + o = o.element(entry.getKey(), value == null ? "(undefined)" : value); + } + o.put("components", buildComponentInformation()); + return o; + } +} diff --git a/core/src/main/java/jenkins/util/DefaultScriptListener.java b/core/src/main/java/jenkins/util/DefaultScriptListener.java index 3f3c966a8fd6..24957bbf68af 100644 --- a/core/src/main/java/jenkins/util/DefaultScriptListener.java +++ b/core/src/main/java/jenkins/util/DefaultScriptListener.java @@ -37,7 +37,7 @@ /** * Basic default implementation of {@link jenkins.util.ScriptListener} that just logs. * - * @since TODO + * @since 2.427 */ @Extension @Restricted(NoExternalUse.class) diff --git a/core/src/main/java/jenkins/util/ResourceBundleUtil.java b/core/src/main/java/jenkins/util/ResourceBundleUtil.java index f663926e8263..f9f9310f5662 100644 --- a/core/src/main/java/jenkins/util/ResourceBundleUtil.java +++ b/core/src/main/java/jenkins/util/ResourceBundleUtil.java @@ -24,15 +24,12 @@ package jenkins.util; -import edu.umd.cs.findbugs.annotations.CheckForNull; import edu.umd.cs.findbugs.annotations.NonNull; -import hudson.PluginWrapper; import java.util.Locale; import java.util.Map; import java.util.MissingResourceException; import java.util.ResourceBundle; import java.util.concurrent.ConcurrentHashMap; -import java.util.logging.Logger; import jenkins.model.Jenkins; import net.sf.json.JSONObject; import org.kohsuke.accmod.Restricted; @@ -44,9 +41,8 @@ * @since 2.0 */ @Restricted(NoExternalUse.class) -public class ResourceBundleUtil { - - private static final Logger logger = Logger.getLogger("jenkins.util.ResourceBundle"); +public final class ResourceBundleUtil { + // TODO proper cache eviction private static final Map bundles = new ConcurrentHashMap<>(); private ResourceBundleUtil() { @@ -70,55 +66,20 @@ private ResourceBundleUtil() { * @throws MissingResourceException Missing resource bundle. */ public static @NonNull JSONObject getBundle(@NonNull String baseName, @NonNull Locale locale) throws MissingResourceException { - String bundleKey = baseName + ":" + locale; - JSONObject bundleJSON = bundles.get(bundleKey); + var bundleKey = baseName + ":" + locale; + var bundleJSON = bundles.get(bundleKey); if (bundleJSON != null) { return bundleJSON; } - - ResourceBundle bundle = getBundle(baseName, locale, Jenkins.class.getClassLoader()); - if (bundle == null) { - // Not in Jenkins core. Check the plugins. - Jenkins jenkins = Jenkins.getInstanceOrNull(); - if (jenkins != null) { - for (PluginWrapper plugin : jenkins.getPluginManager().getPlugins()) { - bundle = getBundle(baseName, locale, plugin.classLoader); - if (bundle != null) { - break; - } - } - } - } - if (bundle == null) { - throw new MissingResourceException("Can't find bundle for base name " - + baseName + ", locale " + locale, baseName + "_" + locale, ""); - } - - bundleJSON = toJSONObject(bundle); + var noFallbackControl = ResourceBundle.Control.getNoFallbackControl(ResourceBundle.Control.FORMAT_DEFAULT); + var uberClassLoader = Jenkins.get().getPluginManager().uberClassLoader; + bundleJSON = toJSONObject(ResourceBundle.getBundle(baseName, locale, uberClassLoader, noFallbackControl)); bundles.put(bundleKey, bundleJSON); return bundleJSON; } - /** - * Get a plugin bundle using the supplied Locale and classLoader - * - * @param baseName The bundle base name. - * @param locale The Locale. - * @param classLoader The classLoader - * @return The bundle JSON. - */ - private static @CheckForNull ResourceBundle getBundle(@NonNull String baseName, @NonNull Locale locale, @NonNull ClassLoader classLoader) { - try { - return ResourceBundle.getBundle(baseName, locale, classLoader); - } catch (MissingResourceException e) { - // fall through and return null. - logger.finer(e.getMessage()); - } - return null; - } - /** * Create a JSON representation of a resource bundle * diff --git a/core/src/main/java/jenkins/util/ScriptListener.java b/core/src/main/java/jenkins/util/ScriptListener.java index e1f642e9d9e9..b07603c17f2a 100644 --- a/core/src/main/java/jenkins/util/ScriptListener.java +++ b/core/src/main/java/jenkins/util/ScriptListener.java @@ -49,7 +49,7 @@ * @see hudson.cli.GroovyshCommand * @see jenkins.util.groovy.GroovyHookScript * - * @since TODO + * @since 2.427 */ public interface ScriptListener extends ExtensionPoint { diff --git a/core/src/main/resources/hudson/PluginManager/sidepanel.jelly b/core/src/main/resources/hudson/PluginManager/sidepanel.jelly index 21755b32072d..0d3fc3fb43d3 100644 --- a/core/src/main/resources/hudson/PluginManager/sidepanel.jelly +++ b/core/src/main/resources/hudson/PluginManager/sidepanel.jelly @@ -27,7 +27,7 @@ THE SOFTWARE. --> - + diff --git a/core/src/main/resources/hudson/model/ComputerSet/configure.jelly b/core/src/main/resources/hudson/model/ComputerSet/configure.jelly index 4bbd52b4c4dc..9e58aeda59e6 100644 --- a/core/src/main/resources/hudson/model/ComputerSet/configure.jelly +++ b/core/src/main/resources/hudson/model/ComputerSet/configure.jelly @@ -42,7 +42,8 @@ THE SOFTWARE. + instances="${it.monitors}" + forceRowSet="true"/> diff --git a/core/src/main/resources/hudson/model/ComputerSet/configure.properties b/core/src/main/resources/hudson/model/ComputerSet/configure.properties index e2e74cba5ece..1df5cc610747 100644 --- a/core/src/main/resources/hudson/model/ComputerSet/configure.properties +++ b/core/src/main/resources/hudson/model/ComputerSet/configure.properties @@ -1 +1,2 @@ -description=Jenkins monitors each attached node for disk space, free temp space, free swap, clock time/sync, and response time. Nodes will be taken offline if any of these values go outside of the configured threshold. +description=Jenkins monitors each attached node for various metrics like free disk space, free temp space, free swap, clock time/sync, response time and others provided by plugins. \ + Some of these monitors are able to mark nodes temporarily offline, when the values go outside the configured thresholds. diff --git a/core/src/main/resources/hudson/model/ComputerSet/index.jelly b/core/src/main/resources/hudson/model/ComputerSet/index.jelly index ec4d2ab97883..1725b24b6fbc 100644 --- a/core/src/main/resources/hudson/model/ComputerSet/index.jelly +++ b/core/src/main/resources/hudson/model/ComputerSet/index.jelly @@ -56,8 +56,8 @@ THE SOFTWARE. - - + +
@@ -123,6 +123,7 @@ THE SOFTWARE.
S
+
diff --git a/core/src/main/resources/hudson/model/Job/configure.jelly b/core/src/main/resources/hudson/model/Job/configure.jelly index 040a54159041..d226a966558d 100644 --- a/core/src/main/resources/hudson/model/Job/configure.jelly +++ b/core/src/main/resources/hudson/model/Job/configure.jelly @@ -36,7 +36,7 @@ THE SOFTWARE. - +

diff --git a/core/src/main/resources/hudson/model/Messages.properties b/core/src/main/resources/hudson/model/Messages.properties index e0721b8fd0af..96950428fee4 100644 --- a/core/src/main/resources/hudson/model/Messages.properties +++ b/core/src/main/resources/hudson/model/Messages.properties @@ -119,8 +119,8 @@ Executor.NotAvailable=N/A FreeStyleProject.DisplayName=Freestyle project FreeStyleProject.Description=\ - This is the central feature of Jenkins. Jenkins will build your project, combining any SCM with any build system, \ - and this can be even used for something other than software build. + Classic, general-purpose job type that checks out from up to one SCM, executes build steps serially, \ + followed by post-build steps like archiving artifacts and sending email notifications. HealthReport.EmptyString= diff --git a/core/src/main/resources/hudson/model/Messages_bg.properties b/core/src/main/resources/hudson/model/Messages_bg.properties index b6468b07f70e..8117419f0a71 100644 --- a/core/src/main/resources/hudson/model/Messages_bg.properties +++ b/core/src/main/resources/hudson/model/Messages_bg.properties @@ -163,11 +163,6 @@ Executor.NotAvailable=\ FreeStyleProject.DisplayName=\ Потребителска задача -FreeStyleProject.Description=\ - Това е основна функционалност в Jenkins. Jenkins може да изгради проект като\ - комбинира произволна система за управление на версиите с произволна система за\ - изграждане на проект. Това ви позволява да ползвате Jenkins и за различни от\ - основната му цели. Hudson.BadPortNumber=\ diff --git a/core/src/main/resources/hudson/model/Messages_ca.properties b/core/src/main/resources/hudson/model/Messages_ca.properties index c92afa092c78..c952bcda1e90 100644 --- a/core/src/main/resources/hudson/model/Messages_ca.properties +++ b/core/src/main/resources/hudson/model/Messages_ca.properties @@ -1,3 +1,2 @@ ManageJenkinsAction.DisplayName=Configuració de Jenkins -FreeStyleProject.Description=Aquesta és la funcionalitat principal de Jenkins. Jenkins farà un build del vostre projecte combinant qualsevol SCM amb qualsevol sistema de build. Això també es pot usar per tasques que no siguin un build de software diff --git a/core/src/main/resources/hudson/model/Messages_cs.properties b/core/src/main/resources/hudson/model/Messages_cs.properties index 7ae3f033c417..6efe7371a14d 100644 --- a/core/src/main/resources/hudson/model/Messages_cs.properties +++ b/core/src/main/resources/hudson/model/Messages_cs.properties @@ -1,3 +1,2 @@ ManageJenkinsAction.DisplayName=Administrace -FreeStyleProject.Description=Toto je hlavní funkce Jenkins. Jenkins sestaví váš projekt, spojí jakýkoli systém pro správu verzí se systémem pro sestavení. Nemusí být použit jen pro sestavení softwaru. diff --git a/core/src/main/resources/hudson/model/Messages_da.properties b/core/src/main/resources/hudson/model/Messages_da.properties index c4818f58b170..9047645c5c27 100644 --- a/core/src/main/resources/hudson/model/Messages_da.properties +++ b/core/src/main/resources/hudson/model/Messages_da.properties @@ -59,7 +59,6 @@ Run.Summary.BrokenForALongTime=fejlet længe CLI.safe-restart.shortDescription=Sikker genstart af Jenkins FreeStyleProject.DisplayName=Byg et free-style projekt -FreeStyleProject.Description=Dette er den centrale feature i Jenkins. Jenkins vil bygge dit projekt i enhver kombination af kildekodestyring (SCM) med ethvert byggesystem og dette kan bruges til meget andet end at bygge software. ProxyView.DisplayName=Inkluder en global visning Run.Permissions.Title=Kør diff --git a/core/src/main/resources/hudson/model/Messages_de.properties b/core/src/main/resources/hudson/model/Messages_de.properties index 917c6238b57e..e03f38f6403b 100644 --- a/core/src/main/resources/hudson/model/Messages_de.properties +++ b/core/src/main/resources/hudson/model/Messages_de.properties @@ -114,7 +114,9 @@ Executor.NotAvailable=nicht verfügbar FreeStyleProject.DisplayName="Free Style"-Softwareprojekt bauen -FreeStyleProject.Description=Dieses Profil ist das meistgenutzte in Jenkins. Jenkins baut Ihr Projekt, wobei Sie universell jedes SCM System mit jedem Build-Verfahren kombinieren können. Dieses Profil ist nicht nur auf das Bauen von Software beschränkt, sondern kann darüber hinaus auch für weitere Anwendungsgebiete verwendet werden. +FreeStyleProject.Description=Der klassische, generische Projekt-Typ in Jenkins. Ein Build kann ein SCM auschecken, \ + verschiedene Buildschritte nacheinander ausführen und anschließend Post-Build-Aktionen, wie E-Mailversand oder \ + Archivierung von Artefakten, durchführen. HealthReport.EmptyString= diff --git a/core/src/main/resources/hudson/model/Messages_es.properties b/core/src/main/resources/hudson/model/Messages_es.properties index d57de3106e8e..f725a5070e39 100644 --- a/core/src/main/resources/hudson/model/Messages_es.properties +++ b/core/src/main/resources/hudson/model/Messages_es.properties @@ -72,7 +72,6 @@ Executor.NotAvailable=N/D FreeStyleProject.DisplayName=Crear un proyecto de estilo libre -FreeStyleProject.Description=Esta es la característica principal de Jenkins, la de ejecutar el proyecto combinando cualquier tipo de repositorio de software (SCM) con cualquier modo de construcción o ejecución (make, ant, mvn, rake, script ...). Por tanto se podrá tanto compilar y empaquetar software, como ejecutar cualquier proceso que requiera monitorización. Hudson.BadPortNumber=Número erróneo de puerto {0} Hudson.Computer.Caption=Principal diff --git a/core/src/main/resources/hudson/model/Messages_et.properties b/core/src/main/resources/hudson/model/Messages_et.properties index 72f77a12ac0c..67e791fe6163 100644 --- a/core/src/main/resources/hudson/model/Messages_et.properties +++ b/core/src/main/resources/hudson/model/Messages_et.properties @@ -1,2 +1 @@ -FreeStyleProject.Description=See on Jenkinsi põhifunktsioon! Jenkins ehitab su projekti, kombineerides sinu versioonihalduse mistahes ehitusprotsessiga. Sa võid seda kasutada ka muudeks asjadeks kui tarkvara ehitamine. ParametersDefinitionProperty.BuildButtonText=Bild diff --git a/core/src/main/resources/hudson/model/Messages_fi.properties b/core/src/main/resources/hudson/model/Messages_fi.properties index 3b101c72919e..b059ff22aac8 100644 --- a/core/src/main/resources/hudson/model/Messages_fi.properties +++ b/core/src/main/resources/hudson/model/Messages_fi.properties @@ -1,3 +1,2 @@ ManageJenkinsAction.DisplayName=Hallitse Jenkinsia -FreeStyleProject.Description=Tämä on Jenkins tärkein ominaisuus. Jenkins rakentaa projektisi käyttäen versionhallintaa ja buildijärjestelmiä. Voit käyttää tätä myös muuhun kuin ohjelmien kääntämiseen. diff --git a/core/src/main/resources/hudson/model/Messages_fr.properties b/core/src/main/resources/hudson/model/Messages_fr.properties index 073805ad5139..f2a938f9c9e4 100644 --- a/core/src/main/resources/hudson/model/Messages_fr.properties +++ b/core/src/main/resources/hudson/model/Messages_fr.properties @@ -113,7 +113,6 @@ Descriptor.From=(de {0}< Executor.NotAvailable=N/A FreeStyleProject.DisplayName=Construire un projet free-style -FreeStyleProject.Description=Ceci est la fonction principale de Jenkins qui sert à builder (construire) votre projet. Vous pouvez intégrer tous les outils de gestion de version avec tous les systèmes de build. Il est même possible d''utiliser Jenkins pour toute autre chose qu''un build logiciel. HealthReport.EmptyString= diff --git a/core/src/main/resources/hudson/model/Messages_it.properties b/core/src/main/resources/hudson/model/Messages_it.properties index 23938f9ea828..b61b7fe92c18 100644 --- a/core/src/main/resources/hudson/model/Messages_it.properties +++ b/core/src/main/resources/hudson/model/Messages_it.properties @@ -160,11 +160,6 @@ Descriptor.From=(da {0}) Executor.NotAvailable=N/D FileParameterDefinition.DisplayName=Parametro file FileParameterValue.IndexTitle=Parametri file -FreeStyleProject.Description=Questa è la funzionalità principale di Jenkins. \ - Jenkins eseguirà la compilazione del progetto, combinando qualunque sistema \ - di gestione del codice sorgente con qualunque sistema di compilazione, e \ - questo progetto può essere anche utilizzato per compiti diversi dalla \ - compilazione di software. FreeStyleProject.DisplayName=Progetto libero HealthReport.EmptyString= Hudson.AdministerPermission.Description=Questo permesso concede la capacità \ diff --git a/core/src/main/resources/hudson/model/Messages_ja.properties b/core/src/main/resources/hudson/model/Messages_ja.properties index 475606108217..155fed39f632 100644 --- a/core/src/main/resources/hudson/model/Messages_ja.properties +++ b/core/src/main/resources/hudson/model/Messages_ja.properties @@ -85,10 +85,6 @@ Executor.NotAvailable=N/A FreeStyleProject.DisplayName=フリースタイル・プロジェクトのビルド -FreeStyleProject.Description=\ - もっとも汎用性の高いJenkinsの中核機能です。任意のSCMからソースコードをチェックアウトし、\ - 任意のビルドシステムでプロジェクトがビルドできます。往々にして、ソフトウェアのビルド以外にも\ - 様々な仕事の自動化に利用することができます。 HealthReport.EmptyString= diff --git a/core/src/main/resources/hudson/model/Messages_ko.properties b/core/src/main/resources/hudson/model/Messages_ko.properties index 1b1194608e72..53667c659a42 100644 --- a/core/src/main/resources/hudson/model/Messages_ko.properties +++ b/core/src/main/resources/hudson/model/Messages_ko.properties @@ -1,5 +1,4 @@ ManageJenkinsAction.DisplayName=Jenkins 관리 ParametersDefinitionProperty.DisplayName=이 빌드는 매개변수가 있습니다 -FreeStyleProject.Description=이것은 Jenkins의 주요 기능입니다. Jenkins은 어느 빌드 시스템과 어떤 SCM(형상관리)으로 묶인 당신의 프로젝트를 빌드할 것이고, 소프트웨어 빌드보다 다른 어떤 것에 자주 사용될 수 있습니다. ParametersDefinitionProperty.BuildButtonText=매개변수가 필요한 빌드입니다. diff --git a/core/src/main/resources/hudson/model/Messages_lt.properties b/core/src/main/resources/hudson/model/Messages_lt.properties index 3248fdb97d67..dc319685ad2a 100644 --- a/core/src/main/resources/hudson/model/Messages_lt.properties +++ b/core/src/main/resources/hudson/model/Messages_lt.properties @@ -85,9 +85,6 @@ Descriptor.From=(iš {0}) Executor.NotAvailable=Nėra FreeStyleProject.DisplayName=Laisvo stiliaus projektas -FreeStyleProject.Description=\ - Pagrindinė Jenkinso funkcija. Jenkinsas sukurs jūsų projektą, kombinuojant bet kokią SCM su bet kokia kūrimo sistema, \ - ir visa tai galima naudoti nebūtinai programų kūrimui. HealthReport.EmptyString= diff --git a/core/src/main/resources/hudson/model/Messages_nb_NO.properties b/core/src/main/resources/hudson/model/Messages_nb_NO.properties index fa756d519fe5..99ac81854dbe 100644 --- a/core/src/main/resources/hudson/model/Messages_nb_NO.properties +++ b/core/src/main/resources/hudson/model/Messages_nb_NO.properties @@ -1,4 +1,3 @@ ManageJenkinsAction.DisplayName=Konfigurer Jenkins ParametersDefinitionProperty.DisplayName=Denne build har parametre -FreeStyleProject.Description=Dette er en sentral egenskap ved Jenkins. Jenkins bygger dine prosjekter, kombinerer SCM (Source Control Management - Kildekodekontrollsystem ) med forskjellige byggsystemer og denne kan også brukes til mer enn bare å bygge applikasjoner. diff --git a/core/src/main/resources/hudson/model/Messages_nl.properties b/core/src/main/resources/hudson/model/Messages_nl.properties index 2e81c05617b4..1ce8a56458d4 100644 --- a/core/src/main/resources/hudson/model/Messages_nl.properties +++ b/core/src/main/resources/hudson/model/Messages_nl.properties @@ -49,7 +49,6 @@ Executor.NotAvailable=Niet beschikbaar FreeStyleProject.DisplayName=Bouw een vrije stijl type software project -FreeStyleProject.Description=Dit is de basisfunctionaliteit van Jenkins. Bij dit type project kun je gebruik maken van een willekeurige combinatie van versiebeheer- en bouwsysteem. Je zou Jenkins zelfs kunnen gebruiken voor andere zaken dan het bouwen van software. Hudson.BadPortNumber=Verkeerd poortnummer {0} Hudson.Computer.Caption=Hoofdnode diff --git a/core/src/main/resources/hudson/model/Messages_pl.properties b/core/src/main/resources/hudson/model/Messages_pl.properties index a9d2c94080d5..4da9a364a8da 100644 --- a/core/src/main/resources/hudson/model/Messages_pl.properties +++ b/core/src/main/resources/hudson/model/Messages_pl.properties @@ -68,7 +68,6 @@ UpdateCenter.Status.CheckingJavaNet=Sprawdzanie połączenia z centrum aktualiza UpdateCenter.Status.Success=Zakończono MyViewsProperty.DisplayName=Moje widoki MyViewsProperty.GlobalAction.DisplayName=Moje widoki -FreeStyleProject.Description=To jest podstawowa funkcja Jenkinsa. Jenkins stworzy projekt łączący dowolny SCM z dowolnym systemem budującym, może to być również wykorzystane do czegoś innego niż budowanie oprogramowania. FreeStyleProject.DisplayName=Ogólny projekt Node.Mode.NORMAL=Wykorzystuj ten węzeł tak bardzo, jak to tylko możliwe ComputerSet.DisplayName=Węzły diff --git a/core/src/main/resources/hudson/model/Messages_pt_BR.properties b/core/src/main/resources/hudson/model/Messages_pt_BR.properties index 9643b131f2a9..f07c6fc49da0 100644 --- a/core/src/main/resources/hudson/model/Messages_pt_BR.properties +++ b/core/src/main/resources/hudson/model/Messages_pt_BR.properties @@ -45,9 +45,6 @@ BallColor.Success=Sucesso BallColor.Unstable=Instável Executor.NotAvailable=N/D FreeStyleProject.DisplayName=Construir um projeto de software de estilo livre. -FreeStyleProject.Description=Esta é a central de funcionalidades do Jenkins. Ela construirá seu projeto e você pode \ - combinar qualquer SCM com qualquer sistema de construção, e ele até mesmo pode ser usado para outras tarefas \ - diferentes de construções de software. Hudson.BadPortNumber=Número de porta ruim {0} Hudson.Computer.Caption=Mestre Hudson.Computer.DisplayName=mestre diff --git a/core/src/main/resources/hudson/model/Messages_pt_PT.properties b/core/src/main/resources/hudson/model/Messages_pt_PT.properties index 6978146ab722..585168602775 100644 --- a/core/src/main/resources/hudson/model/Messages_pt_PT.properties +++ b/core/src/main/resources/hudson/model/Messages_pt_PT.properties @@ -1,3 +1,2 @@ ManageJenkinsAction.DisplayName=Gerir o Jenkins -FreeStyleProject.Description=Isto é uma característica central do Jenkins. Jenkins vai construir o seu projecto, combinando qualquer SCM com qualquer sistema de compilação e isto pode ser usado mesmo em qualquer outra compilação de software. diff --git a/core/src/main/resources/hudson/model/Messages_ro.properties b/core/src/main/resources/hudson/model/Messages_ro.properties index c0a2697b2e0e..2911c11d5d8c 100644 --- a/core/src/main/resources/hudson/model/Messages_ro.properties +++ b/core/src/main/resources/hudson/model/Messages_ro.properties @@ -1,3 +1,2 @@ ParametersDefinitionProperty.DisplayName=Acest build este parametrizat -FreeStyleProject.Description=Aceasta este funcționalitatea principală a lui Jenkins. Jenkins va construi proiectul dvs, combinând orice SCM cu orice sistem de build-uri, și aceasta poate fi folosită chiar și la altceva decât build-uri de aplicații. diff --git a/core/src/main/resources/hudson/model/Messages_ru.properties b/core/src/main/resources/hudson/model/Messages_ru.properties index 2217b2289be5..2ce7869ed999 100644 --- a/core/src/main/resources/hudson/model/Messages_ru.properties +++ b/core/src/main/resources/hudson/model/Messages_ru.properties @@ -56,10 +56,6 @@ Executor.NotAvailable=Неизвестно FreeStyleProject.DisplayName=Создать задачу со свободной конфигурацией -FreeStyleProject.Description=\ - Это - основной и наиболее универсальный тип задач в Jenkins. \ - Jenkins будет собирать ваш проект, комбинируя любую SCM с любой сборочной системой. \ - Данный тип проектов может использоваться для задач, отличных от сборки ПО. Hudson.BadPortNumber=Некорректный номер порта: {0} Hudson.Computer.Caption=Мастер diff --git a/core/src/main/resources/hudson/model/Messages_sv_SE.properties b/core/src/main/resources/hudson/model/Messages_sv_SE.properties index eae53e2bafe4..e5dc7d4759a4 100644 --- a/core/src/main/resources/hudson/model/Messages_sv_SE.properties +++ b/core/src/main/resources/hudson/model/Messages_sv_SE.properties @@ -6,5 +6,4 @@ Job.Pronoun=Projekt ManageJenkinsAction.DisplayName=Hantera Jenkins ParametersDefinitionProperty.DisplayName=Detta bygge är parametriserat -FreeStyleProject.Description=Detta är en central del i Jenkins. Jenkins kommer att bygga ditt projekt med valfri versionshanterare och med vilket byggsystem som helst, och detta kan även användas för något annat än mjukvarubyggen. ParametersDefinitionProperty.BuildButtonText=Bygg diff --git a/core/src/main/resources/hudson/model/Messages_tr.properties b/core/src/main/resources/hudson/model/Messages_tr.properties index 9a199011159d..5df1c7a3b5b9 100644 --- a/core/src/main/resources/hudson/model/Messages_tr.properties +++ b/core/src/main/resources/hudson/model/Messages_tr.properties @@ -52,9 +52,6 @@ BallColor.Unstable=Dengesiz Executor.NotAvailable=Mevcut Değil FreeStyleProject.DisplayName=Serbest stil proje -FreeStyleProject.Description=\ - Bu Jenkins''in en temel kullanım alanıdır. Jenkins, herhangi bir SCM''yi herhangi bir yapılandırma sistemiyle birleştirerek projenizi yapılandırır, \ - ve hatta yazılım yapılandırması dışında başka işler için bile kullanılabilir. Hudson.BadPortNumber=Yanlış Port Numarası {0} Hudson.Computer.Caption=Master diff --git a/core/src/main/resources/hudson/model/Messages_uk.properties b/core/src/main/resources/hudson/model/Messages_uk.properties index 0e17bda155e3..ed5b6dadb9b7 100644 --- a/core/src/main/resources/hudson/model/Messages_uk.properties +++ b/core/src/main/resources/hudson/model/Messages_uk.properties @@ -1,3 +1,2 @@ ParametersDefinitionProperty.DisplayName=Ця будова має параметри -FreeStyleProject.Description=Це - основна відмінність Jenkins. Jenkins побудує ваш проект, комбінуючи будь-які системи управління кодом з будь-якими системами збірки, що може бути використано навіть для цілей відмінних від збірки програмного забезпечення. 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 b0a151aced77..94d7c8f1a342 100644 --- a/core/src/main/resources/hudson/model/Messages_zh_TW.properties +++ b/core/src/main/resources/hudson/model/Messages_zh_TW.properties @@ -84,10 +84,6 @@ Descriptor.From=(from {0}) Executor.NotAvailable=N/A FreeStyleProject.DisplayName=建置 Free-Style 軟體專案 -FreeStyleProject.Description=\ - 這是 Jenkins 的主要功能。\ - Jenkins 能搭配各式程式碼管理、建置系統來建置您的專案,\ - 甚至還能做軟體建置以外的其他事情。 Hudson.BadPortNumber=連接埠號 {0} 無效 Hudson.Computer.Caption=Master diff --git a/core/src/main/resources/hudson/model/UsageStatistics/help-usageStatisticsCollected.jelly b/core/src/main/resources/hudson/model/UsageStatistics/help-usageStatisticsCollected.jelly index 80237768112a..a1bef14d4e22 100644 --- a/core/src/main/resources/hudson/model/UsageStatistics/help-usageStatisticsCollected.jelly +++ b/core/src/main/resources/hudson/model/UsageStatistics/help-usageStatisticsCollected.jelly @@ -48,7 +48,7 @@
${collector.displayName}
- +

Start date: ${collector.start}
End date: ${collector.end} diff --git a/core/src/main/resources/hudson/node_monitors/ArchitectureMonitor/help.html b/core/src/main/resources/hudson/node_monitors/ArchitectureMonitor/help.html index 23efe3bdeff0..a67b11024f35 100644 --- a/core/src/main/resources/hudson/node_monitors/ArchitectureMonitor/help.html +++ b/core/src/main/resources/hudson/node_monitors/ArchitectureMonitor/help.html @@ -1,4 +1,4 @@

This monitor just shows the architecture of the agent for your information. It - never marks the agent offline. + never marks an agent offline.
diff --git a/core/src/main/resources/hudson/node_monitors/ClockMonitor/help.html b/core/src/main/resources/hudson/node_monitors/ClockMonitor/help.html index f9a1a868b1ab..ee5e795f2ce7 100644 --- a/core/src/main/resources/hudson/node_monitors/ClockMonitor/help.html +++ b/core/src/main/resources/hudson/node_monitors/ClockMonitor/help.html @@ -4,6 +4,8 @@ systems, version control activities and distributed file access (such as NFS, Windows file shares) tend to have strange problems when systems involved have different clocks. +
+ It never marks an agent offline.

To keep clocks in sync, refer to NTP.

diff --git a/core/src/main/resources/hudson/node_monitors/NodeMonitor/configure.jelly b/core/src/main/resources/hudson/node_monitors/NodeMonitor/configure.jelly new file mode 100644 index 000000000000..a2016d12307f --- /dev/null +++ b/core/src/main/resources/hudson/node_monitors/NodeMonitor/configure.jelly @@ -0,0 +1,24 @@ + + + +
+ ${descriptor.displayName} + +
+ +
+
+ + + + + + + + + + + +
+
+
\ No newline at end of file diff --git a/core/src/main/resources/hudson/node_monitors/NodeMonitor/help-ignored.html b/core/src/main/resources/hudson/node_monitors/NodeMonitor/help-ignored.html new file mode 100644 index 000000000000..7dfe9ac4071a --- /dev/null +++ b/core/src/main/resources/hudson/node_monitors/NodeMonitor/help-ignored.html @@ -0,0 +1,7 @@ +
+ When checked the agent will + not + be marked temporarily offline in case the monitor detects a problem. But the + monitor will still run to collect data and the corresponding field will be + highlighted in case of a problem. +
diff --git a/core/src/main/resources/hudson/node_monitors/ResponseTimeMonitor/help.html b/core/src/main/resources/hudson/node_monitors/ResponseTimeMonitor/help.html index ed324b07d50c..978d0a28dfb9 100644 --- a/core/src/main/resources/hudson/node_monitors/ResponseTimeMonitor/help.html +++ b/core/src/main/resources/hudson/node_monitors/ResponseTimeMonitor/help.html @@ -1,7 +1,6 @@
This monitors the round trip network response time from the controller to the - agent, and if it goes above a threshold repeatedly, it marks the agent - offline. + agent, and if it goes above a threshold repeatedly, it disconnects the agent.

This is useful for detecting unresponsive agents, or other network problems diff --git a/core/src/main/resources/hudson/node_monitors/SwapSpaceMonitor/help.html b/core/src/main/resources/hudson/node_monitors/SwapSpaceMonitor/help.html new file mode 100644 index 000000000000..f1827bdccbbe --- /dev/null +++ b/core/src/main/resources/hudson/node_monitors/SwapSpaceMonitor/help.html @@ -0,0 +1,22 @@ +

+ This monitors the available virtual memory (also known as + swap space + ). +

The exact definition of swap space is platform dependent.

+
    +
  • + On Windows this is the available space of the page file. As Windows can + automatically increase the page file size, this value doesn't mean much. +
  • +
  • + On Linux this value is retrieved from + /proc/meminfo + . +
  • +
  • + For other Unix systems, the value is obtained from the + top + command. +
  • +
+
diff --git a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/loginLink.jelly b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/loginLink.jelly index ba75e740a89e..cd989c23f030 100644 --- a/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/loginLink.jelly +++ b/core/src/main/resources/hudson/security/HudsonPrivateSecurityRealm/loginLink.jelly @@ -26,7 +26,6 @@ THE SOFTWARE. - | - ${%sign up} + ${%sign up} diff --git a/core/src/main/resources/hudson/security/SecurityRealm/loginLink.jelly b/core/src/main/resources/hudson/security/SecurityRealm/loginLink.jelly index 8b065c318b2c..8fb92ed3dd1c 100644 --- a/core/src/main/resources/hudson/security/SecurityRealm/loginLink.jelly +++ b/core/src/main/resources/hudson/security/SecurityRealm/loginLink.jelly @@ -25,5 +25,5 @@ THE SOFTWARE. - ${%login} + ${%login} diff --git a/core/src/main/resources/hudson/triggers/SCMTrigger/DescriptorImpl/index.jelly b/core/src/main/resources/hudson/triggers/SCMTrigger/DescriptorImpl/index.jelly index 6495f391e85c..482473f16d43 100644 --- a/core/src/main/resources/hudson/triggers/SCMTrigger/DescriptorImpl/index.jelly +++ b/core/src/main/resources/hudson/triggers/SCMTrigger/DescriptorImpl/index.jelly @@ -46,24 +46,28 @@ THE SOFTWARE.

${%The following polling activities are currently in progress:}

- - - - - - +
${%Project}${%Running for}
+ - - + + - + + + + + + + + +
- ${r.target.asItem().fullDisplayName} - - ${r.duration} - ${%Project}${%Running for}
+ ${r.target.asItem().fullDisplayName} + + ${r.duration} +
- \ No newline at end of file + diff --git a/core/src/main/resources/jenkins/diagnosis/HsErrPidList/index.jelly b/core/src/main/resources/jenkins/diagnosis/HsErrPidList/index.jelly index c78c973137c6..cc1db0886eda 100644 --- a/core/src/main/resources/jenkins/diagnosis/HsErrPidList/index.jelly +++ b/core/src/main/resources/jenkins/diagnosis/HsErrPidList/index.jelly @@ -31,33 +31,37 @@ THE SOFTWARE.

${%blurb}

- - - - - - +
${%Name}${%Date} -
+ - - - + + + - + + + + + + + + + +
- - - ${f.path} - - - - - (${%ago(f.timeSpanString)}) - -
- - -
${%Name}${%Date}
+ + + ${f.path} + + + + + (${%ago(f.timeSpanString)}) + +
+ + +
- \ No newline at end of file + diff --git a/core/src/main/resources/jenkins/install/platform-plugins.json b/core/src/main/resources/jenkins/install/platform-plugins.json index 15dd708447c7..62885083fbdd 100644 --- a/core/src/main/resources/jenkins/install/platform-plugins.json +++ b/core/src/main/resources/jenkins/install/platform-plugins.json @@ -94,6 +94,10 @@ { "name": "mailer", "suggested": true } ] }, + { + "category": "Appearance", + "plugins": [{ "name": "dark-theme", "suggested": true }] + }, { "category": "Languages", "plugins": [{ "name": "locale" }, { "name": "localization-zh-cn" }] diff --git a/core/src/main/resources/jenkins/management/AdministrativeMonitorsDecorator/resources.css b/core/src/main/resources/jenkins/management/AdministrativeMonitorsDecorator/resources.css index 5960ecd93193..d5d817c6a223 100644 --- a/core/src/main/resources/jenkins/management/AdministrativeMonitorsDecorator/resources.css +++ b/core/src/main/resources/jenkins/management/AdministrativeMonitorsDecorator/resources.css @@ -1,5 +1,5 @@ .am-container { - height: 100%; + display: contents; } .am-button { @@ -14,89 +14,62 @@ border-radius: 50%; width: 0.65rem; height: 0.65rem; - background-color: #ff9800; + background-color: var(--warning-color); } .security-am .am-monitor__indicator-mobile { - background-color: #dc3545; + background-color: var(--error-color); } .am-button .am-monitor__count { - display: inline-block; display: inline-flex; justify-content: center; align-items: center; - height: 20px; - min-width: 20px; + height: 18px; + min-width: 18px; color: #fff; - background-color: #ff9800; - font-weight: bold; + background-color: var(--warning-color); + font-weight: 500; + font-size: var(--font-size-xs); - border-radius: 4px; + border-radius: 16px; } .am-button.security-am .am-monitor__count { color: #fff; - background-color: #dc3545; + background-color: var(--error-color); } .am-container div.am-list { position: absolute; top: 48px; right: 2%; height: auto; - z-index: 0; - padding: 2em; + padding: var(--section-padding); text-align: left; display: block; - background-color: #fff; background-color: var(--background); - border-radius: 5px; - - /* Darken the box shadow to make the popup visible over the search box */ - box-shadow: 0 1px 7px 0 rgba(0, 0, 0, 0.3); - - transition: all 0.15s cubic-bezier(0.84, 0.03, 0.21, 0.96); + box-shadow: var(--dropdown-box-shadow); + transition: var(--standard-transition); + border-radius: 15px; opacity: 0; - transform: scale(0); + transform: translateY(-10px) scale(0.975); + z-index: 1000; } .am-container.visible div.am-list { opacity: 1; transform: scale(1); - z-index: 1000; -} -.am-container.visible .am-button { - background-color: #404040; - background-color: var(--header-link-bg-classic-active); - text-decoration: none; -} -.am-container .am-button:after { - content: ""; - display: inline-block; - position: absolute; - bottom: 0; - left: 32%; - width: 0; - height: 0; - border-left: 7px solid transparent; - border-right: 7px solid transparent; - border-bottom: 7px solid #fff; - opacity: 0; - transition-property: all; - transition-delay: 0s; - z-index: 1001; -} -.am-container.visible .am-button:after { - opacity: 1; - transition-property: all; - transition-delay: 0.15s; } .am-container .am-message { display: block; line-height: 1.4em; margin-bottom: 1.4em; } +.am-container.visible .am-button:after { + background: var(--button-background--hover); +} .am-message-list { padding: 0; + margin: 0; } .am-container .am-message .alert form { @@ -123,22 +96,18 @@ /* Restore hyperlink style overriden by the page header */ .am-container .am-list a:link { display: inline-block; - color: #204a87; color: var(--link-color); text-decoration: underline; margin-right: 0; padding: 0; - font-weight: 600; font-weight: var(--link-font-weight); } .am-container .am-list a:visited { - color: #5c3566; color: var(--link-color); } .am-container .am-list a:hover, .am-container .am-list a:focus, .am-container .am-list a:active { - color: #5c3566; color: var(--link-color); background-color: transparent; text-decoration: underline; @@ -146,22 +115,18 @@ } .am-container .am-list .alert-success a { - color: #155724; color: var(--alert-success-text-color); } .am-container .am-list .alert-info a { - color: #31708f; color: var(--alert-info-text-color); } .am-container .am-list .alert-warning a { - color: #8a6d3b; color: var(--alert-warning-text-color); } .am-container .am-list .alert-danger a { - color: #a94442; color: var(--alert-danger-text-color); } diff --git a/core/src/main/resources/jenkins/model/Jenkins/oops.properties b/core/src/main/resources/jenkins/model/Jenkins/oops.properties index d7060ef24991..2d7f460ca626 100644 --- a/core/src/main/resources/jenkins/model/Jenkins/oops.properties +++ b/core/src/main/resources/jenkins/model/Jenkins/oops.properties @@ -1,4 +1,4 @@ -problemHappened=A problem occurred while processing the request. +problemHappened=A problem occurred while processing the request checkJIRA=Please check our bug tracker to see if a similar problem has already been reported. vote=If it is already reported, please vote and put a comment on it to let us gauge the impact of the problem. pleaseReport=If you think this is a new issue, please file a new issue. diff --git a/core/src/main/resources/jenkins/telemetry/impl/JavaSystemProperties/description.jelly b/core/src/main/resources/jenkins/telemetry/impl/JavaSystemProperties/description.jelly new file mode 100644 index 000000000000..02a39a039f16 --- /dev/null +++ b/core/src/main/resources/jenkins/telemetry/impl/JavaSystemProperties/description.jelly @@ -0,0 +1,24 @@ + + +

+ ${%blurb} +

+
    + +
  • + ${e.key} + + + (current value: undefined) + + + (current value: ${e.value}) + + +
  • +
    +
+

+ ${%blurb2} +

+
diff --git a/core/src/main/resources/jenkins/telemetry/impl/JavaSystemProperties/description.properties b/core/src/main/resources/jenkins/telemetry/impl/JavaSystemProperties/description.properties new file mode 100644 index 000000000000..8bdedbf8399e --- /dev/null +++ b/core/src/main/resources/jenkins/telemetry/impl/JavaSystemProperties/description.properties @@ -0,0 +1,5 @@ +blurb = This trial collects the values of some basic Java system properties, that provide information about basic system configuration \ + (OS, Java runtime, default language and character set). \ + The collected system properties and their values are listed below. +blurb2 = Additionally, this trial collects the list of installed plugins, their version, and the version of Jenkins. \ + This data will be used to understand the environments that Jenkins is running in. diff --git a/core/src/main/resources/lib/form/apply/apply.js b/core/src/main/resources/lib/form/apply/apply.js index c79c9ce7dbcf..c9752497d7a8 100644 --- a/core/src/main/resources/lib/form/apply/apply.js +++ b/core/src/main/resources/lib/form/apply/apply.js @@ -3,104 +3,59 @@ Behaviour.specify( "apply", 0, function (e) { - var id; - var containerId = "container" + iota++; - - var responseDialog = new YAHOO.widget.Panel("wait" + iota++, { - fixedcenter: true, - close: true, - draggable: true, - zindex: 4, - modal: true, - visible: false, - }); - - responseDialog.setHeader("Error"); - responseDialog.setBody("
"); - responseDialog.render(document.body); - var target; // iframe - - function attachIframeOnload(target, f) { - if (target.attachEvent) { - target.attachEvent("onload", f); - } else { - target.onload = f; - } - } - e.addEventListener("click", function (e) { - var f = e.target.closest("FORM"); + const f = e.target.closest("FORM"); // create a throw-away IFRAME to avoid back button from loading the POST result back - id = "iframe" + iota++; - target = document.createElement("iframe"); + const id = "iframe" + iota++; + const target = document.createElement("iframe"); target.setAttribute("id", id); target.setAttribute("name", id); target.style.height = "100%"; target.style.width = "100%"; - document.getElementById(containerId).appendChild(target); + document.querySelector("body").appendChild(target); - attachIframeOnload(target, function () { + f.target = target.id; + f.elements["core:apply"].value = "true"; + f.dispatchEvent(new Event("jenkins:apply")); // give everyone a chance to write back to DOM + + try { + buildFormTree(f); + f.submit(); + } finally { + f.elements["core:apply"].value = null; + f.target = "_self"; + } + + target.addEventListener("load", () => { if ( target.contentWindow && target.contentWindow.applyCompletionHandler ) { // apply-aware server is expected to set this handler target.contentWindow.applyCompletionHandler(window); - } else { - // otherwise this is possibly an error from the server, so we need to render the whole content. - var doc = target.contentDocument || target.contentWindow.document; - var error = doc.getElementById("error-description"); - var r = YAHOO.util.Dom.getClientRegion(); - var contentHeight = r.height / 5; - var contentWidth = r.width / 2; - if (!error) { - // fallback if it's not a regular error dialog from oops.jelly: use the entire body - error = document.createElement("div"); - error.setAttribute("id", "error-description"); - error.appendChild(doc.getElementsByTagName("body")[0]); - contentHeight = (r.height * 3) / 4; - contentWidth = (r.width * 3) / 4; - } - - let oldError = document.getElementById("error-description"); - if (oldError) { - // Remove old error if there is any - document.getElementById(containerId).removeChild(oldError); - } + // Remove the iframe from the DOM + target.remove(); + return; + } - document.getElementById(containerId).appendChild(error); + // otherwise this is possibly an error from the server, so we need to render the whole content. + const doc = target.contentDocument || target.contentWindow.document; + let error = doc.getElementById("error-description"); - var dialogStyleHeight = contentHeight + 40; - var dialogStyleWidth = contentWidth + 20; + if (!error) { + // Fallback if it's not a regular error dialog from oops.jelly: use the entire body + error = document.createElement("div"); + error.appendChild(doc.querySelector("#page-body")); + } - document.getElementById(containerId).style.height = - contentHeight + "px"; - document.getElementById(containerId).style.width = - contentWidth + "px"; - document.getElementById(containerId).style.overflow = "scroll"; + dialog.modal(error, { + minWidth: "850px", + }); - responseDialog.cfg.setProperty("width", dialogStyleWidth + "px"); - responseDialog.cfg.setProperty("height", dialogStyleHeight + "px"); - responseDialog.center(); - responseDialog.show(); - } - window.setTimeout(function () { - // otherwise Firefox will fail to leave the "connecting" state - document.getElementById(id).remove(); - }, 0); + // Remove the iframe from the DOM + target.remove(); }); - - f.target = target.id; - f.elements["core:apply"].value = "true"; - f.dispatchEvent(new Event("jenkins:apply")); // give everyone a chance to write back to DOM - try { - buildFormTree(f); - f.submit(); - } finally { - f.elements["core:apply"].value = null; - f.target = "_self"; - } }); }, ); diff --git a/core/src/main/resources/lib/hudson/queue.jelly b/core/src/main/resources/lib/hudson/queue.jelly index 33d3ba9109ac..f36c84a59d65 100644 --- a/core/src/main/resources/lib/hudson/queue.jelly +++ b/core/src/main/resources/lib/hudson/queue.jelly @@ -93,7 +93,7 @@ THE SOFTWARE. - + diff --git a/core/src/main/resources/lib/layout/layout.jelly b/core/src/main/resources/lib/layout/layout.jelly index 877a4463356a..371c14ab1633 100644 --- a/core/src/main/resources/lib/layout/layout.jelly +++ b/core/src/main/resources/lib/layout/layout.jelly @@ -192,16 +192,8 @@ THE SOFTWARE.
-
- - - - - - -
- -
+ +
diff --git a/core/src/main/resources/lib/layout/side-panel.jelly b/core/src/main/resources/lib/layout/side-panel.jelly index 26b8afa3b647..01595ee8c881 100644 --- a/core/src/main/resources/lib/layout/side-panel.jelly +++ b/core/src/main/resources/lib/layout/side-panel.jelly @@ -26,10 +26,22 @@ THE SOFTWARE. Generates a left side content as part of a Jenkins page. Typically known as two-column or left-side + main-content layouts + + Make the side panel sticky. Should not be used on pages that include widgets in the sidepanel and when plugins can + add their own tasks, so the number of tasks is not fixed. + + - +
+ + + + +
+ +
- \ No newline at end of file + diff --git a/core/src/spotbugs/excludesFilter.xml b/core/src/spotbugs/excludesFilter.xml index af99fff5055f..7d36952fc372 100644 --- a/core/src/spotbugs/excludesFilter.xml +++ b/core/src/spotbugs/excludesFilter.xml @@ -53,6 +53,125 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + 4.0.0 @@ -73,7 +73,7 @@ THE SOFTWARE. - 2.437 + 2.440 -SNAPSHOT @@ -86,11 +86,15 @@ THE SOFTWARE. https://www.jenkins.io/changelog - 3198.v03a_401881f3e + 3203.v94ce994fdb_31 4.13 + + + 4.8.2.0 Max + FindReturnRef,ConstructorThrow Medium 1.33 @@ -332,7 +336,7 @@ THE SOFTWARE. com.puppycrawl.tools checkstyle - 10.12.6 + 10.12.7 diff --git a/test/pom.xml b/test/pom.xml index 71d4556b7162..489e08dac486 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -22,7 +22,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. --> - + 4.0.0 @@ -88,7 +88,7 @@ THE SOFTWARE. io.jenkins.plugins plugin-util-api - 3.6.0 + 3.8.0 org.jenkins-ci.plugins @@ -105,7 +105,7 @@ THE SOFTWARE. org.jenkins-ci.plugins script-security - 1294.v99333c047434 + 1305.v487433146192 org.jenkins-ci.plugins.workflow @@ -131,7 +131,7 @@ THE SOFTWARE. ${project.groupId} jenkins-test-harness - 2135.v8f2e9795cf3f + 2140.ve736dc2b_b_d2c test @@ -212,7 +212,7 @@ THE SOFTWARE. org.jenkins-ci.plugins junit - 1240.vf9529b_881428 + 1252.vfc2e5efa_294f test @@ -230,7 +230,7 @@ THE SOFTWARE. org.jenkins-ci.plugins matrix-project - 818.v7eb_e657db_924 + 822.v01b_8c85d16d2 test diff --git a/test/src/test/java/hudson/model/NodeTest.java b/test/src/test/java/hudson/model/NodeTest.java index 7523f52c51a9..39ffe25f7643 100644 --- a/test/src/test/java/hudson/model/NodeTest.java +++ b/test/src/test/java/hudson/model/NodeTest.java @@ -58,7 +58,6 @@ import java.util.Collection; import java.util.GregorianCalendar; import java.util.List; -import java.util.Map; import jenkins.model.Jenkins; import jenkins.security.QueueItemAuthenticatorConfiguration; import org.htmlunit.HttpMethod; @@ -222,7 +221,7 @@ public void testCanTake() throws Exception { j.jenkins.setSecurityRealm(realm); realm.createAccount("John", ""); notTake = false; - QueueItemAuthenticatorConfiguration.get().getAuthenticators().add(new MockQueueItemAuthenticator(Map.of(project.getFullName(), user.impersonate2()))); + QueueItemAuthenticatorConfiguration.get().getAuthenticators().add(new MockQueueItemAuthenticator().authenticate(project.getFullName(), user.impersonate2())); assertNotNull("Node should not take project because user does not have build permission.", node.canTake(item)); message = Messages._Node_LackingBuildPermission(item.authenticate2().getName(), node.getNodeName()).toString(); assertEquals("Cause of blockage should be build permission label.", message, node.canTake(item).getShortDescription()); diff --git a/test/src/test/java/hudson/model/QueueTest.java b/test/src/test/java/hudson/model/QueueTest.java index bd46fc333e30..5e52bf6416d5 100644 --- a/test/src/test/java/hudson/model/QueueTest.java +++ b/test/src/test/java/hudson/model/QueueTest.java @@ -819,7 +819,7 @@ public boolean perform(AbstractBuild build, Launcher launcher, BuildListen */ @Test public void accessControl() throws Exception { FreeStyleProject p = r.createFreeStyleProject(); - QueueItemAuthenticatorConfiguration.get().getAuthenticators().add(new MockQueueItemAuthenticator(Map.of(p.getFullName(), alice))); + QueueItemAuthenticatorConfiguration.get().getAuthenticators().add(new MockQueueItemAuthenticator().authenticate(p.getFullName(), alice)); p.getBuildersList().add(new TestBuilder() { @Override public boolean perform(AbstractBuild build, Launcher launcher, BuildListener listener) { @@ -845,7 +845,7 @@ public boolean perform(AbstractBuild build, Launcher launcher, BuildListen DumbSlave s2 = r.createSlave(); FreeStyleProject p = r.createFreeStyleProject(); - QueueItemAuthenticatorConfiguration.get().getAuthenticators().add(new MockQueueItemAuthenticator(Map.of(p.getFullName(), alice))); + QueueItemAuthenticatorConfiguration.get().getAuthenticators().add(new MockQueueItemAuthenticator().authenticate(p.getFullName(), alice)); p.getBuildersList().add(new TestBuilder() { @Override public boolean perform(AbstractBuild build, Launcher launcher, BuildListener listener) { diff --git a/test/src/test/java/hudson/model/ViewTest.java b/test/src/test/java/hudson/model/ViewTest.java index 3ea19e1ee59c..1c32f3ed314a 100644 --- a/test/src/test/java/hudson/model/ViewTest.java +++ b/test/src/test/java/hudson/model/ViewTest.java @@ -700,7 +700,7 @@ public void simplifiedOriginalDescription() throws Exception { assertThat(e.getStatusCode(), equalTo(500)); // This should have a different message, but this is the current behavior demonstrating the problem. - assertThat(e.getResponse().getContentAsString(), containsString("A problem occurred while processing the request.")); + assertThat(e.getResponse().getContentAsString(), containsString("A problem occurred while processing the request")); OldDataMonitor odm = ExtensionList.lookupSingleton(OldDataMonitor.class); Map data = odm.getData(); @@ -744,7 +744,7 @@ public void simplifiedWithValidXmlAndBadField() throws Exception { assertThat(e.getStatusCode(), equalTo(500)); // This should have a different message, but this is the current behavior demonstrating the problem. - assertThat(e.getResponse().getContentAsString(), containsString("A problem occurred while processing the request.")); + assertThat(e.getResponse().getContentAsString(), containsString("A problem occurred while processing the request")); OldDataMonitor odm = ExtensionList.lookupSingleton(OldDataMonitor.class); Map data = odm.getData(); diff --git a/test/src/test/java/hudson/slaves/JNLPLauncherTest.java b/test/src/test/java/hudson/slaves/JNLPLauncherTest.java index 813c72364558..e71b2fbcce9c 100644 --- a/test/src/test/java/hudson/slaves/JNLPLauncherTest.java +++ b/test/src/test/java/hudson/slaves/JNLPLauncherTest.java @@ -157,12 +157,21 @@ private ArgumentListBuilder buildJnlpArgs(Computer c) throws Exception { ArgumentListBuilder args = new ArgumentListBuilder(); args.add(new File(new File(System.getProperty("java.home")), "bin/java").getPath(), "-jar"); args.add(Which.jarFile(Launcher.class).getAbsolutePath()); - // TODO deprecated mode - args.add("-jnlpUrl", j.getURL() + "computer/" + c.getName() + "/jenkins-agent.jnlp"); + args.add("-url"); + args.add(j.getURL()); + args.add("-name"); + args.add(c.getName()); if (c instanceof SlaveComputer) { SlaveComputer sc = (SlaveComputer) c; + args.add("-secret"); + args.add(sc.getJnlpMac()); ComputerLauncher launcher = sc.getLauncher(); + if (launcher instanceof ComputerLauncherFilter) { + launcher = ((ComputerLauncherFilter) launcher).getCore(); + } else if (launcher instanceof DelegatingComputerLauncher) { + launcher = ((DelegatingComputerLauncher) launcher).getLauncher(); + } if (launcher instanceof JNLPLauncher) { args.add(((JNLPLauncher) launcher).getWorkDirSettings().toCommandLineArgs(sc)); } diff --git a/test/src/test/java/hudson/tasks/BuildTriggerTest.java b/test/src/test/java/hudson/tasks/BuildTriggerTest.java index b8038afceebe..aa4569d104a6 100644 --- a/test/src/test/java/hudson/tasks/BuildTriggerTest.java +++ b/test/src/test/java/hudson/tasks/BuildTriggerTest.java @@ -152,7 +152,7 @@ public void downstreamProjectSecurity() throws Exception { j.jenkins.setAuthorizationStrategy(auth); final FreeStyleProject upstream = j. createFreeStyleProject("upstream"); Authentication alice = User.getOrCreateByIdOrFullName("alice").impersonate2(); - QueueItemAuthenticatorConfiguration.get().getAuthenticators().add(new MockQueueItemAuthenticator(Map.of("upstream", alice))); + QueueItemAuthenticatorConfiguration.get().getAuthenticators().add(new MockQueueItemAuthenticator().authenticate("upstream", alice)); Map> perms = new HashMap<>(); perms.put(Item.READ, Set.of("alice")); perms.put(Item.CONFIGURE, Set.of("alice")); @@ -207,7 +207,7 @@ public void downstreamProjectSecurity() throws Exception { assertNotNull(cause); assertEquals(b, cause.getUpstreamRun()); // Now if we have configured some QIA’s but they are not active on this job, we should normally fall back to running as anonymous. Which would normally have no permissions: - QueueItemAuthenticatorConfiguration.get().getAuthenticators().replace(new MockQueueItemAuthenticator(Map.of("upstream", Jenkins.ANONYMOUS2))); + QueueItemAuthenticatorConfiguration.get().getAuthenticators().replace(new MockQueueItemAuthenticator().authenticate("upstream", Jenkins.ANONYMOUS2)); assertDoCheck(alice, Messages.BuildTrigger_you_have_no_permission_to_build_(downstreamName), upstream, downstreamName); assertDoCheck(alice, null, null, downstreamName); b = j.buildAndAssertSuccess(upstream); diff --git a/test/src/test/java/hudson/tasks/MavenTest.java b/test/src/test/java/hudson/tasks/MavenTest.java index bd366adce71d..dbf745b672d9 100644 --- a/test/src/test/java/hudson/tasks/MavenTest.java +++ b/test/src/test/java/hudson/tasks/MavenTest.java @@ -66,6 +66,7 @@ import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.ToolInstallations; +import org.jvnet.hudson.test.recipes.WithTimeout; import org.kohsuke.stapler.jelly.JellyFacet; /** @@ -190,7 +191,7 @@ private void verify() throws Exception { assertNotNull(isp.installers.get(MavenInstaller.class)); } - @Test public void sensitiveParameters() throws Exception { + @Test @WithTimeout(500) public void sensitiveParameters() throws Exception { FreeStyleProject project = j.createFreeStyleProject(); ParametersDefinitionProperty pdb = new ParametersDefinitionProperty( new StringParameterDefinition("string", "defaultValue", "string description"), diff --git a/test/src/test/java/jenkins/model/RunIdMigratorTest.java b/test/src/test/java/jenkins/model/RunIdMigratorTest.java new file mode 100644 index 000000000000..4ade1afc84e1 --- /dev/null +++ b/test/src/test/java/jenkins/model/RunIdMigratorTest.java @@ -0,0 +1,100 @@ +/* + * The MIT License + * + * Copyright 2023 CloudBees, Inc. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +package jenkins.model; + +import static hudson.cli.CLICommandInvoker.Matcher.succeededSilently; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +import hudson.cli.CLICommandInvoker; +import hudson.cli.CreateJobCommand; +import hudson.model.FreeStyleProject; +import hudson.model.Item; +import hudson.model.User; +import java.io.ByteArrayInputStream; +import java.io.File; +import java.nio.charset.StandardCharsets; +import org.htmlunit.HttpMethod; +import org.htmlunit.WebRequest; +import org.junit.Ignore; +import org.junit.Rule; +import org.junit.Test; +import org.jvnet.hudson.test.Issue; +import org.jvnet.hudson.test.JenkinsRule; +import org.jvnet.hudson.test.MockAuthorizationStrategy; + +public class RunIdMigratorTest { + + @Rule + public JenkinsRule j = new JenkinsRule(); + + @Test + public void legacyIdsPresent() throws Exception { + FreeStyleProject p = j.createFreeStyleProject(); + File legacyIds = new File(p.getBuildDir(), "legacyIds"); + assertTrue(legacyIds.exists()); + } + + @Ignore("TODO Item#onCreatedFromScratch is not called") + @Issue("JENKINS-64356") + @Test + public void legacyIdsPresentViaRestApi() throws Exception { + User user = User.getById("user", true); + j.jenkins.setSecurityRealm(j.createDummySecurityRealm()); + j.jenkins.setAuthorizationStrategy(new MockAuthorizationStrategy() + .grant(Jenkins.READ, Item.CREATE) + .everywhere() + .to(user.getId())); + String jobName = "test" + j.jenkins.getItems().size(); + try (JenkinsRule.WebClient wc = j.createWebClient()) { + wc.login(user.getId()); + WebRequest req = new WebRequest(wc.createCrumbedUrl("createItem?name=" + jobName), HttpMethod.POST); + req.setAdditionalHeader("Content-Type", "application/xml"); + req.setRequestBody(""); + wc.getPage(req); + } + FreeStyleProject p = j.jenkins.getItemByFullName(jobName, FreeStyleProject.class); + assertNotNull(p); + File legacyIds = new File(p.getBuildDir(), "legacyIds"); + assertTrue(legacyIds.exists()); + } + + @Ignore("TODO Item#onCreatedFromScratch is not called") + @Issue("JENKINS-64356") + @Test + public void legacyIdsPresentViaCli() { + String jobName = "test" + j.jenkins.getItems().size(); + CLICommandInvoker invoker = new CLICommandInvoker(j, new CreateJobCommand()); + CLICommandInvoker.Result result = invoker.withStdin( + new ByteArrayInputStream("".getBytes(StandardCharsets.UTF_8))) + .invokeWithArgs(jobName); + assertThat(result, succeededSilently()); + FreeStyleProject p = j.jenkins.getItemByFullName(jobName, FreeStyleProject.class); + assertNotNull(p); + File legacyIds = new File(p.getBuildDir(), "legacyIds"); + assertTrue(legacyIds.exists()); + } +} diff --git a/test/src/test/java/jenkins/security/Security2278Test.java b/test/src/test/java/jenkins/security/Security2278Test.java index c556d5d079bf..7811c2afa884 100644 --- a/test/src/test/java/jenkins/security/Security2278Test.java +++ b/test/src/test/java/jenkins/security/Security2278Test.java @@ -70,7 +70,7 @@ public void testUi() throws Exception { assertThat(contentAsString, containsString("Build Executor Status")); assertThat(contentAsString, containsString("Unknown Task")); assertThat(contentAsString, not(containsString("job/foo/job/bar"))); - assertThat(contentAsString, not(containsString("icon-stop"))); + assertThat(contentAsString, not(containsString("stop-button-link"))); } @Test @@ -81,7 +81,7 @@ public void testUiWithPermission() throws Exception { assertThat(contentAsString, containsString("Build Executor Status")); assertThat(contentAsString, not(containsString("Unknown Task"))); assertThat(contentAsString, containsString("job/foo/job/bar")); - assertThat(contentAsString, containsString("icon-stop")); + assertThat(contentAsString, containsString("stop-button-link")); } @Test diff --git a/test/src/test/java/jenkins/security/StackTraceSuppressionTest.java b/test/src/test/java/jenkins/security/StackTraceSuppressionTest.java index 9e9b58777a52..b13a5d11c4d5 100644 --- a/test/src/test/java/jenkins/security/StackTraceSuppressionTest.java +++ b/test/src/test/java/jenkins/security/StackTraceSuppressionTest.java @@ -161,7 +161,7 @@ public void save() { } private void checBaseResponseContent(String content) { - assertThat(content, containsString("A problem occurred while processing the request.")); + assertThat(content, containsString("A problem occurred while processing the request")); assertThat(content, containsString("Logging ID=")); assertThat(content, containsString("Oops!")); } diff --git a/test/src/test/java/jenkins/triggers/ReverseBuildTriggerTest.java b/test/src/test/java/jenkins/triggers/ReverseBuildTriggerTest.java index 22dc81086364..a8b9022b03a1 100644 --- a/test/src/test/java/jenkins/triggers/ReverseBuildTriggerTest.java +++ b/test/src/test/java/jenkins/triggers/ReverseBuildTriggerTest.java @@ -42,9 +42,7 @@ import hudson.tasks.BuildTrigger; import hudson.tasks.BuildTriggerTest; import hudson.triggers.Trigger; -import java.util.HashMap; import java.util.List; -import java.util.Map; import java.util.Set; import jenkins.model.Jenkins; import jenkins.security.QueueItemAuthenticatorConfiguration; @@ -57,7 +55,6 @@ import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.MockAuthorizationStrategy; import org.jvnet.hudson.test.MockQueueItemAuthenticator; -import org.springframework.security.core.Authentication; public class ReverseBuildTriggerTest { @@ -116,40 +113,44 @@ public void runMoreQuickly() throws Exception { assertNotNull(JenkinsRule.getLog(b), downstream.getLastBuild()); assertEquals(1, downstream.getLastBuild().number); // A QIA is configured but does not specify any authentication for downstream, so upstream should not trigger it: - Map qiaConfig = new HashMap<>(); - qiaConfig.put(upstreamName, User.get("admin").impersonate2()); - qiaConfig.put(downstreamName, Jenkins.ANONYMOUS2); - QueueItemAuthenticatorConfiguration.get().getAuthenticators().add(new MockQueueItemAuthenticator(qiaConfig)); + QueueItemAuthenticatorConfiguration.get() + .getAuthenticators() + .add(new MockQueueItemAuthenticator() + .authenticate(upstreamName, User.get("admin").impersonate2()) + .authenticate(downstreamName, Jenkins.ANONYMOUS2)); b = r.buildAndAssertSuccess(upstream); r.assertLogContains(downstreamName, b); r.assertLogContains(Messages.ReverseBuildTrigger_running_as_cannot_even_see_for_trigger_f("anonymous", upstreamName, downstreamName), b); r.waitUntilNoActivity(); assertEquals(1, downstream.getLastBuild().number); // Auth for upstream is defined but cannot see downstream, so no message is printed about it: - qiaConfig = new HashMap<>(); - qiaConfig.put(upstreamName, User.get("bob").impersonate2()); - qiaConfig.put(downstreamName, Jenkins.ANONYMOUS2); - QueueItemAuthenticatorConfiguration.get().getAuthenticators().replace(new MockQueueItemAuthenticator(qiaConfig)); + QueueItemAuthenticatorConfiguration.get() + .getAuthenticators() + .replace(new MockQueueItemAuthenticator() + .authenticate(upstreamName, User.get("bob").impersonate2()) + .authenticate(downstreamName, Jenkins.ANONYMOUS2)); b = r.buildAndAssertSuccess(upstream); r.assertLogNotContains(downstreamName, b); r.waitUntilNoActivity(); assertEquals(1, downstream.getLastBuild().number); // Alice can see upstream, so downstream gets built, but the upstream build cannot see downstream: auth.grant(Item.READ).onItems(upstream).to("alice", "bob"); - qiaConfig = new HashMap<>(); - qiaConfig.put(upstreamName, User.get("bob").impersonate2()); - qiaConfig.put(downstreamName, User.get("alice").impersonate2()); - QueueItemAuthenticatorConfiguration.get().getAuthenticators().replace(new MockQueueItemAuthenticator(qiaConfig)); + QueueItemAuthenticatorConfiguration.get() + .getAuthenticators() + .replace(new MockQueueItemAuthenticator() + .authenticate(upstreamName, User.get("bob").impersonate2()) + .authenticate(downstreamName, User.get("alice").impersonate2())); b = r.buildAndAssertSuccess(upstream); r.assertLogNotContains(downstreamName, b); r.waitUntilNoActivity(); assertEquals(2, downstream.getLastBuild().number); assertEquals(new Cause.UpstreamCause((Run) b), downstream.getLastBuild().getCause(Cause.UpstreamCause.class)); // Now if upstream build is permitted to report on downstream: - qiaConfig = new HashMap<>(); - qiaConfig.put(upstreamName, User.get("admin").impersonate2()); - qiaConfig.put(downstreamName, User.get("alice").impersonate2()); - QueueItemAuthenticatorConfiguration.get().getAuthenticators().replace(new MockQueueItemAuthenticator(qiaConfig)); + QueueItemAuthenticatorConfiguration.get() + .getAuthenticators() + .replace(new MockQueueItemAuthenticator() + .authenticate(upstreamName, User.get("admin").impersonate2()) + .authenticate(downstreamName, User.get("alice").impersonate2())); b = r.buildAndAssertSuccess(upstream); r.assertLogContains(downstreamName, b); r.waitUntilNoActivity(); @@ -165,10 +166,11 @@ public void runMoreQuickly() throws Exception { .grant(Item.DISCOVER).onItems(upstream).to("alice"); r.jenkins.setAuthorizationStrategy(auth); auth.grant(Item.READ).onItems(downstream).to("alice"); - qiaConfig = new HashMap<>(); - qiaConfig.put(upstreamName, User.get("bob").impersonate2()); - qiaConfig.put(downstreamName, User.get("alice").impersonate2()); - QueueItemAuthenticatorConfiguration.get().getAuthenticators().replace(new MockQueueItemAuthenticator(qiaConfig)); + QueueItemAuthenticatorConfiguration.get() + .getAuthenticators() + .replace(new MockQueueItemAuthenticator() + .authenticate(upstreamName, User.get("bob").impersonate2()) + .authenticate(downstreamName, User.get("alice").impersonate2())); b = r.buildAndAssertSuccess(upstream); r.assertLogNotContains(downstreamName, b); r.waitUntilNoActivity(); @@ -178,10 +180,11 @@ public void runMoreQuickly() throws Exception { // so no message is printed about it, and no Exception neither (JENKINS-42707) auth.grant(Item.READ).onItems(upstream).to("bob"); auth.grant(Item.DISCOVER).onItems(upstream).to("anonymous"); - qiaConfig = new HashMap<>(); - qiaConfig.put(upstreamName, User.get("bob").impersonate2()); - qiaConfig.put(downstreamName, Jenkins.ANONYMOUS2); - QueueItemAuthenticatorConfiguration.get().getAuthenticators().replace(new MockQueueItemAuthenticator(qiaConfig)); + QueueItemAuthenticatorConfiguration.get() + .getAuthenticators() + .replace(new MockQueueItemAuthenticator() + .authenticate(upstreamName, User.get("bob").impersonate2()) + .authenticate(downstreamName, Jenkins.ANONYMOUS2)); b = r.buildAndAssertSuccess(upstream); r.assertLogNotContains(downstreamName, b); r.assertLogNotContains("Please login to access job " + upstreamName, b); diff --git a/core/src/test/java/jenkins/util/ResourceBundleUtilTest.java b/test/src/test/java/jenkins/util/ResourceBundleUtilTest.java similarity index 61% rename from core/src/test/java/jenkins/util/ResourceBundleUtilTest.java rename to test/src/test/java/jenkins/util/ResourceBundleUtilTest.java index a6265f0136db..d62ecdefd862 100644 --- a/core/src/test/java/jenkins/util/ResourceBundleUtilTest.java +++ b/test/src/test/java/jenkins/util/ResourceBundleUtilTest.java @@ -24,18 +24,23 @@ package jenkins.util; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertSame; import static org.junit.Assert.assertThrows; import java.util.Locale; import java.util.MissingResourceException; import net.sf.json.JSONObject; -import org.junit.Assert; +import org.junit.Rule; import org.junit.Test; +import org.jvnet.hudson.test.JenkinsRule; /** * @author tom.fennelly@gmail.com */ public class ResourceBundleUtilTest { + @Rule + public JenkinsRule j = new JenkinsRule(); /** * Test resource bundle loading for a defined locale. @@ -43,12 +48,20 @@ public class ResourceBundleUtilTest { @Test public void test_known_locale() { JSONObject bundle = ResourceBundleUtil.getBundle("hudson.logging.Messages", Locale.GERMAN); - Assert.assertEquals("Initialisiere Log-Rekorder", bundle.getString("LogRecorderManager.init")); + assertEquals("Initialisiere Log-Rekorder", bundle.getString("LogRecorderManager.init")); bundle = ResourceBundleUtil.getBundle("hudson.logging.Messages", new Locale("de")); - Assert.assertEquals("Initialisiere Log-Rekorder", bundle.getString("LogRecorderManager.init")); + assertEquals("Initialisiere Log-Rekorder", bundle.getString("LogRecorderManager.init")); // Test caching - should get the same bundle instance back... - Assert.assertSame(ResourceBundleUtil.getBundle("hudson.logging.Messages", new Locale("de")), bundle); + assertSame(ResourceBundleUtil.getBundle("hudson.logging.Messages", new Locale("de")), bundle); + } + + @Test + public void noFallbackLocale() { + try (var ignored = new DefaultLocale(new Locale("fr"))) { + var bundle = ResourceBundleUtil.getBundle("hudson.logging.Messages", new Locale("en")); + assertEquals("System Log", bundle.getString("LogRecorderManager.DisplayName")); + } } /** @@ -56,16 +69,8 @@ public void test_known_locale() { */ @Test public void test_unknown_locale() { - Locale defaultOSLocale = Locale.getDefault(); - try { - //Set Default-Locale to english - Locale.setDefault(new Locale("en", "US")); - - JSONObject bundle = ResourceBundleUtil.getBundle("hudson.logging.Messages", new Locale("kok")); // konkani - Assert.assertEquals("Initializing log recorders", bundle.getString("LogRecorderManager.init")); - } finally { - Locale.setDefault(defaultOSLocale); - } + JSONObject bundle = ResourceBundleUtil.getBundle("hudson.logging.Messages", new Locale("kok")); // konkani + assertEquals("Initializing log recorders", bundle.getString("LogRecorderManager.init")); } /** @@ -75,4 +80,18 @@ public void test_unknown_locale() { public void test_unknown_bundle() { assertThrows(MissingResourceException.class, () -> ResourceBundleUtil.getBundle("hudson.blah.Whatever")); } + + private static class DefaultLocale implements AutoCloseable { + private Locale previous; + + DefaultLocale(Locale locale) { + previous = Locale.getDefault(); + Locale.setDefault(locale); + } + + @Override + public void close() { + Locale.setDefault(previous); + } + } } diff --git a/war/package.json b/war/package.json index 93c6136fcfdf..a80238545ce3 100644 --- a/war/package.json +++ b/war/package.json @@ -24,25 +24,25 @@ }, "devDependencies": { "@babel/cli": "7.23.4", - "@babel/core": "7.23.5", - "@babel/preset-env": "7.23.5", + "@babel/core": "7.23.7", + "@babel/preset-env": "7.23.7", "babel-loader": "9.1.3", "clean-webpack-plugin": "4.0.0", "css-loader": "6.8.1", "css-minimizer-webpack-plugin": "5.0.1", - "eslint": "8.55.0", + "eslint": "8.56.0", "eslint-config-prettier": "9.1.0", "handlebars-loader": "1.7.3", "mini-css-extract-plugin": "2.7.6", "postcss": "8.4.32", - "postcss-loader": "7.3.3", + "postcss-loader": "7.3.4", "postcss-preset-env": "9.3.0", "postcss-scss": "4.0.9", "prettier": "3.1.1", - "sass": "1.69.5", - "sass-loader": "13.3.2", + "sass": "1.69.7", + "sass-loader": "13.3.3", "style-loader": "3.3.3", - "stylelint": "16.0.1", + "stylelint": "16.1.0", "stylelint-checkstyle-reporter": "0.2.0", "stylelint-config-standard": "33.0.0", "webpack": "5.89.0", diff --git a/war/pom.xml b/war/pom.xml index 2808d786b3d4..8d6d579e5919 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -22,7 +22,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. --> - + 4.0.0 @@ -403,14 +403,6 @@ THE SOFTWARE. hpi - - - io.jenkins.plugins - popper2-api - 2.11.6-4 - hpi - - io.jenkins.plugins diff --git a/war/src/main/js/section-to-sidebar-items.js b/war/src/main/js/section-to-sidebar-items.js index 282198ed26ff..38683e995f5b 100644 --- a/war/src/main/js/section-to-sidebar-items.js +++ b/war/src/main/js/section-to-sidebar-items.js @@ -5,13 +5,9 @@ const HEADER_SELECTOR = const DEFAULT_ICON = ``; window.addEventListener("load", function () { - const sidebar = document.querySelector("#side-panel"); const sidebarItems = document.querySelector("#tasks"); const sectionHeaders = document.querySelectorAll(HEADER_SELECTOR); - // Ensure sidebar is sticky - sidebar.classList.add("app-page-body__sidebar--sticky"); - // Create the sidebar items sectionHeaders.forEach(function (header, i) { const headerId = toId(header.textContent); diff --git a/war/src/main/scss/components/_page-header.scss b/war/src/main/scss/components/_page-header.scss index 13e63d91a771..e1b34ea09c71 100644 --- a/war/src/main/scss/components/_page-header.scss +++ b/war/src/main/scss/components/_page-header.scss @@ -1,3 +1,5 @@ +@use "../abstracts/mixins"; + .page-header { display: flex; align-items: center; @@ -36,8 +38,7 @@ a.page-header__brand-link { } .page-header__am-wrapper { - height: 100%; - padding: 0.5rem 0; + display: contents; } .page-header__hyperlinks { @@ -45,37 +46,22 @@ a.page-header__brand-link { align-items: center; } -.page-header__hyperlinks a { +.page-header__hyperlinks > a, +.am-container > a { + @include mixins.item; + --text-color: var(--header-link-color); display: inline-flex; align-items: center; - - // need to override an existing rule - /* stylelint-disable declaration-block-no-shorthand-property-overrides */ - padding-right: 0.5rem; + color: var(--text-color); + text-decoration: none; padding: 0.5rem; margin-right: 0 !important; - font-weight: bold; - - &:link, - &:visited { - color: var(--header-link-color); - border-radius: var(--header-item-border-radius); - text-decoration: none; - } - &:hover, - &:focus, - &.mouseIsOverMenuSelector { - color: var(--header-link-color-active); - background-color: var(--header-link-bg-classic-hover); - text-decoration: underline; - text-decoration-color: var(--header-link-color-active); - } - - &:active { - background-color: var(--header-link-bg-classic-active); + &::before, + &::after { + inset: 0 !important; } .jenkins-menu-dropdown-chevron { @@ -91,8 +77,6 @@ a.page-header__brand-link { } .page-header__hyperlinks a span { - font-weight: bold; - &:not(:first-child) { margin-left: 0.25rem; } diff --git a/war/src/main/scss/components/_side-panel-widgets.scss b/war/src/main/scss/components/_side-panel-widgets.scss index acf3e11eec32..9321c8613a29 100644 --- a/war/src/main/scss/components/_side-panel-widgets.scss +++ b/war/src/main/scss/components/_side-panel-widgets.scss @@ -5,6 +5,7 @@ background: var(--card-background); border: var(--card-border-width) solid var(--card-border-color); margin-left: 10px; + margin-bottom: calc(var(--section-padding) / 2); overflow: hidden; } @@ -84,15 +85,159 @@ } /** - * Build Queue + * Build history */ -#buildQueue { - margin-bottom: calc(var(--section-padding) / 2); +.build-row { + padding: 3px 4px; } -/** - * Executors - */ -#executors th.pane { - text-align: left; +.build-row.model-link-active { + background: var(--very-light-grey) !important; +} + +.build-row-cell { + font-size: var(--font-size-xs); +} + +.build-row-cell .pane.build-name { + width: 32%; + font-weight: 500; + vertical-align: top; +} + +.build-row-cell .pane.build-details { + width: 50%; +} + +.build-row-cell .pane.build-controls { + width: 18%; + text-align: right; +} + +.build-row-cell .pane.build-details.block { + width: 100%; +} + +.build-row.multi-line .build-row-cell .pane.build-name.block { + width: 100%; +} + +.build-row-cell .pane.build-controls.block { + width: 100%; +} + +.build-row-cell .pane.build-name .build-icon, +.build-row-cell .pane.build-name .display-name { + display: inline-block; +} + +.build-row-cell .pane.build-name .build-icon { + position: absolute; + margin-top: 2px; + z-index: 1; +} + +.build-row-cell .build-stop { + display: inline-block; + width: 30%; +} + +.build-row-cell .build-badge { + display: inline-block; + text-align: right; + width: 70%; + padding: 2px 0; +} + +.build-row-cell .build-badge > span { + display: inline-block; + max-width: 256px; + padding: 0 1px; + overflow: hidden; +} + +.build-row-cell .build-badge > span + span { + margin: 0 0 0 2px !important; +} + +@media (width >= 1170px) { + .build-row-cell .build-badge > span { + max-width: 296px; + } +} + +.build-row .build-name-controls .pane.build-name, +.build-row .build-details-controls .pane.build-details { + width: 70%; +} + +.build-row .build-row-cell .pane, +#side-panel .build-row .build-row-cell .pane { + padding: 0 2px; /* Sync changes with func expandControlsTo50Percent in hudson-behavior.js */ + display: inline-block; + overflow: hidden; +} + +.build-row.multi-line .build-row-cell .block { + display: block; + overflow: auto; +} + +.build-row.multi-line .build-row-cell .indent-multiline { + margin-top: 5px; +} + +.build-row.multi-line .build-row-cell .left-bar { + position: absolute; + top: 31px; + bottom: 10px; + left: 17px; + border-left: 1px solid var(--medium-grey); +} + +.build-row-cell .pane.build-name .display-name { + margin-left: 20px; + word-break: break-all; +} + +.build-row-cell .indent-multiline { + padding-left: 20px !important; /* Sync changes with func expandControlsTo50Percent in hudson-behavior.js */ +} + +.build-row.overflow-checked .build-row-cell { + visibility: visible; +} + +.jenkins-pane { + &__information { + text-align: center; + line-height: 80px; + background-color: var(--panel-header-bg-color); + margin-top: 10px; + font-weight: 600; + border-radius: var(--form-input-border-radius); + } + + .build-row { + transition: opacity 0.2s ease; + + &-cell { + padding: 4px 8px; + } + } + + &--loading .build-row { + opacity: 0.5; + } +} + +.jenkins-pane__header--build-history { + display: grid; + grid-template-columns: auto 1fr auto; + font-weight: 500 !important; + + .jenkins-table__cell--tight { + width: auto; + margin-right: 1rem; + } } diff --git a/war/yarn.lock b/war/yarn.lock index 630e7fe727e3..9565b31ec987 100644 --- a/war/yarn.lock +++ b/war/yarn.lock @@ -59,45 +59,45 @@ __metadata: languageName: node linkType: hard -"@babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.22.9, @babel/compat-data@npm:^7.23.3, @babel/compat-data@npm:^7.23.5": +"@babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.23.3, @babel/compat-data@npm:^7.23.5": version: 7.23.5 resolution: "@babel/compat-data@npm:7.23.5" checksum: 081278ed46131a890ad566a59c61600a5f9557bd8ee5e535890c8548192532ea92590742fd74bd9db83d74c669ef8a04a7e1c85cdea27f960233e3b83c3a957c languageName: node linkType: hard -"@babel/core@npm:7.23.5": - version: 7.23.5 - resolution: "@babel/core@npm:7.23.5" +"@babel/core@npm:7.23.7": + version: 7.23.7 + resolution: "@babel/core@npm:7.23.7" dependencies: "@ampproject/remapping": "npm:^2.2.0" "@babel/code-frame": "npm:^7.23.5" - "@babel/generator": "npm:^7.23.5" - "@babel/helper-compilation-targets": "npm:^7.22.15" + "@babel/generator": "npm:^7.23.6" + "@babel/helper-compilation-targets": "npm:^7.23.6" "@babel/helper-module-transforms": "npm:^7.23.3" - "@babel/helpers": "npm:^7.23.5" - "@babel/parser": "npm:^7.23.5" + "@babel/helpers": "npm:^7.23.7" + "@babel/parser": "npm:^7.23.6" "@babel/template": "npm:^7.22.15" - "@babel/traverse": "npm:^7.23.5" - "@babel/types": "npm:^7.23.5" + "@babel/traverse": "npm:^7.23.7" + "@babel/types": "npm:^7.23.6" convert-source-map: "npm:^2.0.0" debug: "npm:^4.1.0" gensync: "npm:^1.0.0-beta.2" json5: "npm:^2.2.3" semver: "npm:^6.3.1" - checksum: 311a512a870ee330a3f9a7ea89e5df790b2b5af0b1bd98b10b4edc0de2ac440f0df4d69ea2c0ee38a4b89041b9a495802741d93603be7d4fd834ec8bb6970bd2 + checksum: 38c9934973d384ed83369712978453eac91dc3f22167404dbdb272b64f602e74728a6f37012c53ee57e521b8ae2da60097f050497d9b6a212d28b59cdfb2cd1d languageName: node linkType: hard -"@babel/generator@npm:^7.23.5": - version: 7.23.5 - resolution: "@babel/generator@npm:7.23.5" +"@babel/generator@npm:^7.23.6": + version: 7.23.6 + resolution: "@babel/generator@npm:7.23.6" dependencies: - "@babel/types": "npm:^7.23.5" + "@babel/types": "npm:^7.23.6" "@jridgewell/gen-mapping": "npm:^0.3.2" "@jridgewell/trace-mapping": "npm:^0.3.17" jsesc: "npm:^2.5.1" - checksum: 14c6e874f796c4368e919bed6003bb0adc3ce837760b08f9e646d20aeb5ae7d309723ce6e4f06bcb4a2b5753145446c8e4425851380f695e40e71e1760f49e7b + checksum: 53540e905cd10db05d9aee0a5304e36927f455ce66f95d1253bb8a179f286b88fa7062ea0db354c566fe27f8bb96567566084ffd259f8feaae1de5eccc8afbda languageName: node linkType: hard @@ -119,16 +119,16 @@ __metadata: languageName: node linkType: hard -"@babel/helper-compilation-targets@npm:^7.22.15, @babel/helper-compilation-targets@npm:^7.22.6": - version: 7.22.15 - resolution: "@babel/helper-compilation-targets@npm:7.22.15" +"@babel/helper-compilation-targets@npm:^7.22.15, @babel/helper-compilation-targets@npm:^7.22.6, @babel/helper-compilation-targets@npm:^7.23.6": + version: 7.23.6 + resolution: "@babel/helper-compilation-targets@npm:7.23.6" dependencies: - "@babel/compat-data": "npm:^7.22.9" - "@babel/helper-validator-option": "npm:^7.22.15" - browserslist: "npm:^4.21.9" + "@babel/compat-data": "npm:^7.23.5" + "@babel/helper-validator-option": "npm:^7.23.5" + browserslist: "npm:^4.22.2" lru-cache: "npm:^5.1.1" semver: "npm:^6.3.1" - checksum: 45b9286861296e890f674a3abb199efea14a962a27d9b8adeb44970a9fd5c54e73a9e342e8414d2851cf4f98d5994537352fbce7b05ade32e9849bbd327f9ff1 + checksum: ba38506d11185f48b79abf439462ece271d3eead1673dd8814519c8c903c708523428806f05f2ec5efd0c56e4e278698fac967e5a4b5ee842c32415da54bc6fa languageName: node linkType: hard @@ -164,9 +164,9 @@ __metadata: languageName: node linkType: hard -"@babel/helper-define-polyfill-provider@npm:^0.4.3": - version: 0.4.3 - resolution: "@babel/helper-define-polyfill-provider@npm:0.4.3" +"@babel/helper-define-polyfill-provider@npm:^0.4.4": + version: 0.4.4 + resolution: "@babel/helper-define-polyfill-provider@npm:0.4.4" dependencies: "@babel/helper-compilation-targets": "npm:^7.22.6" "@babel/helper-plugin-utils": "npm:^7.22.5" @@ -175,7 +175,7 @@ __metadata: resolve: "npm:^1.14.2" peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 0007035157e0d32ee9cb4ca319b89d6f3705523383efe52a59eb3d4dfa2ed08c5147e49c10a6e6d69c15221d89c76c8e5875475d6710fb44a5c37b8e69388e40 + checksum: 60126f5f719b9e2114df62e3bf3ac0797b71d8dc733db60192eb169b004fde72ee309fa5848c5fdfe98b8e8863c46f55e16da5aa8a4e420b4d2670cd0c5dd708 languageName: node linkType: hard @@ -321,7 +321,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-validator-option@npm:^7.22.15, @babel/helper-validator-option@npm:^7.23.5": +"@babel/helper-validator-option@npm:^7.23.5": version: 7.23.5 resolution: "@babel/helper-validator-option@npm:7.23.5" checksum: af45d5c0defb292ba6fd38979e8f13d7da63f9623d8ab9ededc394f67eb45857d2601278d151ae9affb6e03d5d608485806cd45af08b4468a0515cf506510e94 @@ -339,14 +339,14 @@ __metadata: languageName: node linkType: hard -"@babel/helpers@npm:^7.23.5": - version: 7.23.5 - resolution: "@babel/helpers@npm:7.23.5" +"@babel/helpers@npm:^7.23.7": + version: 7.23.7 + resolution: "@babel/helpers@npm:7.23.7" dependencies: "@babel/template": "npm:^7.22.15" - "@babel/traverse": "npm:^7.23.5" - "@babel/types": "npm:^7.23.5" - checksum: a37e2728eb4378a4888e5d614e28de7dd79b55ac8acbecd0e5c761273e2a02a8f33b34b1932d9069db55417ace2937cbf8ec37c42f1030ce6d228857d7ccaa4f + "@babel/traverse": "npm:^7.23.7" + "@babel/types": "npm:^7.23.6" + checksum: f74a61ad28a1bc1fdd9133ad571c07787b66d6db017c707b87c203b0cd06879cea8b33e9c6a8585765a4949efa5df3cc9e19b710fe867f11be38ee29fd4a0488 languageName: node linkType: hard @@ -361,12 +361,12 @@ __metadata: languageName: node linkType: hard -"@babel/parser@npm:^7.22.15, @babel/parser@npm:^7.23.5": - version: 7.23.5 - resolution: "@babel/parser@npm:7.23.5" +"@babel/parser@npm:^7.22.15, @babel/parser@npm:^7.23.6": + version: 7.23.6 + resolution: "@babel/parser@npm:7.23.6" bin: parser: ./bin/babel-parser.js - checksum: 3356aa90d7bafb4e2c7310e7c2c3d443c4be4db74913f088d3d577a1eb914ea4188e05fd50a47ce907a27b755c4400c4e3cbeee73dbeb37761f6ca85954f5a20 + checksum: 6f76cd5ccae1fa9bcab3525b0865c6222e9c1d22f87abc69f28c5c7b2c8816a13361f5bd06bddbd5faf903f7320a8feba02545c981468acec45d12a03db7755e languageName: node linkType: hard @@ -394,15 +394,15 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:7.23.3" +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:^7.23.7": + version: 7.23.7 + resolution: "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@npm:7.23.7" dependencies: "@babel/helper-environment-visitor": "npm:^7.22.20" "@babel/helper-plugin-utils": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0 - checksum: 0f43b74741d50e637ba4dcef2786621126fe4da6ccf4ee2e94423ee23f6a04ecd91d458e59764c43e4968be139e5197ee43be8a2fea2c09f0b202a3391e548cc + checksum: 355746e21ad7f43e4f4daef54cfe2ef461ecd19446b2afedd53c39df1bf9aa2eeeeaabee2279b1321de89a97c9360e4f76e9ba950fee50ff1676c25f6929d625 languageName: node linkType: hard @@ -625,9 +625,9 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-async-generator-functions@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/plugin-transform-async-generator-functions@npm:7.23.4" +"@babel/plugin-transform-async-generator-functions@npm:^7.23.7": + version: 7.23.7 + resolution: "@babel/plugin-transform-async-generator-functions@npm:7.23.7" dependencies: "@babel/helper-environment-visitor": "npm:^7.22.20" "@babel/helper-plugin-utils": "npm:^7.22.5" @@ -635,7 +635,7 @@ __metadata: "@babel/plugin-syntax-async-generators": "npm:^7.8.4" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: f2eef4de609975a3f7da7832576b5ffc93e43c80f87e1a99e886b0f8591096cfc4c37e2d5f52fdeaa2a9c09a25a59f3e621159abaca75d3193922a5c0e4cbe0c + checksum: 63d314edc9fbeaf2700745ca0e19bf9840e87f2d7d1f6c5638e06d2aec3e7418d0d7493ed09087e2fe369cc15e9d96c113fb2cd367cb5e3ff922e3712c27b7d4 languageName: node linkType: hard @@ -800,14 +800,15 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-for-of@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/plugin-transform-for-of@npm:7.23.3" +"@babel/plugin-transform-for-of@npm:^7.23.6": + version: 7.23.6 + resolution: "@babel/plugin-transform-for-of@npm:7.23.6" dependencies: "@babel/helper-plugin-utils": "npm:^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.22.5" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 8a36202cfee312ba80e509c7c2131e6773524e572b4dc64a8ee95bd912634fdeb5ea91c6c7747ee30e03562d0f0d333f88ed7dbb929b36b60b8d74189189e12f + checksum: 46681b6ab10f3ca2d961f50d4096b62ab5d551e1adad84e64be1ee23e72eb2f26a1e30e617e853c74f1349fffe4af68d33921a128543b6f24b6d46c09a3e2aec languageName: node linkType: hard @@ -1194,17 +1195,17 @@ __metadata: languageName: node linkType: hard -"@babel/preset-env@npm:7.23.5": - version: 7.23.5 - resolution: "@babel/preset-env@npm:7.23.5" +"@babel/preset-env@npm:7.23.7": + version: 7.23.7 + resolution: "@babel/preset-env@npm:7.23.7" dependencies: "@babel/compat-data": "npm:^7.23.5" - "@babel/helper-compilation-targets": "npm:^7.22.15" + "@babel/helper-compilation-targets": "npm:^7.23.6" "@babel/helper-plugin-utils": "npm:^7.22.5" "@babel/helper-validator-option": "npm:^7.23.5" "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "npm:^7.23.3" "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "npm:^7.23.3" - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "npm:^7.23.3" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "npm:^7.23.7" "@babel/plugin-proposal-private-property-in-object": "npm:7.21.0-placeholder-for-preset-env.2" "@babel/plugin-syntax-async-generators": "npm:^7.8.4" "@babel/plugin-syntax-class-properties": "npm:^7.12.13" @@ -1225,7 +1226,7 @@ __metadata: "@babel/plugin-syntax-top-level-await": "npm:^7.14.5" "@babel/plugin-syntax-unicode-sets-regex": "npm:^7.18.6" "@babel/plugin-transform-arrow-functions": "npm:^7.23.3" - "@babel/plugin-transform-async-generator-functions": "npm:^7.23.4" + "@babel/plugin-transform-async-generator-functions": "npm:^7.23.7" "@babel/plugin-transform-async-to-generator": "npm:^7.23.3" "@babel/plugin-transform-block-scoped-functions": "npm:^7.23.3" "@babel/plugin-transform-block-scoping": "npm:^7.23.4" @@ -1239,7 +1240,7 @@ __metadata: "@babel/plugin-transform-dynamic-import": "npm:^7.23.4" "@babel/plugin-transform-exponentiation-operator": "npm:^7.23.3" "@babel/plugin-transform-export-namespace-from": "npm:^7.23.4" - "@babel/plugin-transform-for-of": "npm:^7.23.3" + "@babel/plugin-transform-for-of": "npm:^7.23.6" "@babel/plugin-transform-function-name": "npm:^7.23.3" "@babel/plugin-transform-json-strings": "npm:^7.23.4" "@babel/plugin-transform-literals": "npm:^7.23.3" @@ -1273,14 +1274,14 @@ __metadata: "@babel/plugin-transform-unicode-regex": "npm:^7.23.3" "@babel/plugin-transform-unicode-sets-regex": "npm:^7.23.3" "@babel/preset-modules": "npm:0.1.6-no-external-plugins" - babel-plugin-polyfill-corejs2: "npm:^0.4.6" - babel-plugin-polyfill-corejs3: "npm:^0.8.5" - babel-plugin-polyfill-regenerator: "npm:^0.5.3" + babel-plugin-polyfill-corejs2: "npm:^0.4.7" + babel-plugin-polyfill-corejs3: "npm:^0.8.7" + babel-plugin-polyfill-regenerator: "npm:^0.5.4" core-js-compat: "npm:^3.31.0" semver: "npm:^6.3.1" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 2a0e1274dec045186e131c6433659b75492583290e8d41633c616f6bff829cb2e4b2f9a57f556283a54db3bd6aa697911e56a36f607911a29b731c445a5b5a06 + checksum: ac9def873cec52ee02a550bde6e22eced16d1ae331bb8ebc82c03e4c91c12ac17e3e4027647e61612937bcc25ac46e71370aaf99dc2e85dbd11f7777ffeed54e languageName: node linkType: hard @@ -1324,32 +1325,32 @@ __metadata: languageName: node linkType: hard -"@babel/traverse@npm:^7.23.5": - version: 7.23.5 - resolution: "@babel/traverse@npm:7.23.5" +"@babel/traverse@npm:^7.23.7": + version: 7.23.7 + resolution: "@babel/traverse@npm:7.23.7" dependencies: "@babel/code-frame": "npm:^7.23.5" - "@babel/generator": "npm:^7.23.5" + "@babel/generator": "npm:^7.23.6" "@babel/helper-environment-visitor": "npm:^7.22.20" "@babel/helper-function-name": "npm:^7.23.0" "@babel/helper-hoist-variables": "npm:^7.22.5" "@babel/helper-split-export-declaration": "npm:^7.22.6" - "@babel/parser": "npm:^7.23.5" - "@babel/types": "npm:^7.23.5" - debug: "npm:^4.1.0" + "@babel/parser": "npm:^7.23.6" + "@babel/types": "npm:^7.23.6" + debug: "npm:^4.3.1" globals: "npm:^11.1.0" - checksum: c5ea793080ca6719b0a1612198fd25e361cee1f3c14142d7a518d2a1eeb5c1d21f7eec1b26c20ea6e1ddd8ed12ab50b960ff95ffd25be353b6b46e1b54d6f825 + checksum: e32fceb4249beec2bde83968ddffe17444221c1ee5cd18c543a2feaf94e3ca83f2a4dfbc2dcca87cf226e0105973e0fe3717063a21e982a9de9945615ab3f3f5 languageName: node linkType: hard -"@babel/types@npm:^7.22.15, @babel/types@npm:^7.22.19, @babel/types@npm:^7.22.5, @babel/types@npm:^7.23.0, @babel/types@npm:^7.23.5, @babel/types@npm:^7.4.4, @babel/types@npm:^7.8.3": - version: 7.23.5 - resolution: "@babel/types@npm:7.23.5" +"@babel/types@npm:^7.22.15, @babel/types@npm:^7.22.19, @babel/types@npm:^7.22.5, @babel/types@npm:^7.23.0, @babel/types@npm:^7.23.6, @babel/types@npm:^7.4.4, @babel/types@npm:^7.8.3": + version: 7.23.6 + resolution: "@babel/types@npm:7.23.6" dependencies: "@babel/helper-string-parser": "npm:^7.23.4" "@babel/helper-validator-identifier": "npm:^7.22.20" to-fast-properties: "npm:^2.0.0" - checksum: 7dd5e2f59828ed046ad0b06b039df2524a8b728d204affb4fc08da2502b9dd3140b1356b5166515d229dc811539a8b70dcd4bc507e06d62a89f4091a38d0b0fb + checksum: 42cefce8a68bd09bb5828b4764aa5586c53c60128ac2ac012e23858e1c179347a4aac9c66fc577994fbf57595227611c5ec8270bf0cfc94ff033bbfac0550b70 languageName: node linkType: hard @@ -1393,7 +1394,7 @@ __metadata: languageName: node linkType: hard -"@csstools/css-parser-algorithms@npm:2.3.2, @csstools/css-parser-algorithms@npm:^2.3.2": +"@csstools/css-parser-algorithms@npm:2.3.2": version: 2.3.2 resolution: "@csstools/css-parser-algorithms@npm:2.3.2" peerDependencies: @@ -1402,20 +1403,29 @@ __metadata: languageName: node linkType: hard -"@csstools/css-tokenizer@npm:^2.2.1": - version: 2.2.1 - resolution: "@csstools/css-tokenizer@npm:2.2.1" - checksum: 0c6901d291e99c567893846a47068057c2a28b3edc4219b6da589a530f55f51ddd4675f906f707b393bfe7a508ab2604bf3f75708f064db857bb277636bd5a44 +"@csstools/css-parser-algorithms@npm:^2.3.2, @csstools/css-parser-algorithms@npm:^2.4.0": + version: 2.4.0 + resolution: "@csstools/css-parser-algorithms@npm:2.4.0" + peerDependencies: + "@csstools/css-tokenizer": ^2.2.2 + checksum: bcfc067b9d1bd5e0bc6044bfbf6450a4a6837d88c5ffd081e2159d4e442c28f018b58c7c2b3ce176ba0bf76cbbce0fd3c65468a40b9867ad9b3e3ef90b9b2655 languageName: node linkType: hard -"@csstools/media-query-list-parser@npm:^2.1.5": - version: 2.1.5 - resolution: "@csstools/media-query-list-parser@npm:2.1.5" +"@csstools/css-tokenizer@npm:^2.2.1, @csstools/css-tokenizer@npm:^2.2.2": + version: 2.2.2 + resolution: "@csstools/css-tokenizer@npm:2.2.2" + checksum: 9e7374aab06a811f868a85127af1ff07ad7a56e22e8c46930e789a907098bdd4e6eec82e0cb0d4b8ac1cd5cd054c1f0e329ec50d8548f57d660aeee7cf9b3167 + languageName: node + linkType: hard + +"@csstools/media-query-list-parser@npm:^2.1.5, @csstools/media-query-list-parser@npm:^2.1.6": + version: 2.1.6 + resolution: "@csstools/media-query-list-parser@npm:2.1.6" peerDependencies: - "@csstools/css-parser-algorithms": ^2.3.2 - "@csstools/css-tokenizer": ^2.2.1 - checksum: ae0692c6f92cdc82053291c7a50028b692094dfed795f0259571c5eb40f4b3fa580182ac3701e56c2834e40a62a122ea6639299e43ae88b3a835ae4c869a1a12 + "@csstools/css-parser-algorithms": ^2.4.0 + "@csstools/css-tokenizer": ^2.2.2 + checksum: 06da3e5c01e4785963b821ee2eb31f4fcec622f3b0e4e0748113f287c876f241be211ba11d435d0cc1f0e9f2e26baf5fbf6f8563dc88a49709c3d49e79490b76 languageName: node linkType: hard @@ -1751,12 +1761,12 @@ __metadata: languageName: node linkType: hard -"@csstools/selector-specificity@npm:^3.0.0": - version: 3.0.0 - resolution: "@csstools/selector-specificity@npm:3.0.0" +"@csstools/selector-specificity@npm:^3.0.0, @csstools/selector-specificity@npm:^3.0.1": + version: 3.0.1 + resolution: "@csstools/selector-specificity@npm:3.0.1" peerDependencies: postcss-selector-parser: ^6.0.13 - checksum: 6f0e2fa9a3c5dcbc7a446fd827d3eb85ca775cc884f73f0bbb119ab49b4f5f0af8763dd23a37d423f4e7989069c09bb977e7e5f017db296e1417abb1fba75c30 + checksum: 4280f494726d5e38de74e28dee2ff74ec86244560dff4edeec3ddff3ac73c774c19535bd1bb70cad77949bfb359cf87e977d0ec3264591e3b7260342a20dd84f languageName: node linkType: hard @@ -1802,10 +1812,10 @@ __metadata: languageName: node linkType: hard -"@eslint/js@npm:8.55.0": - version: 8.55.0 - resolution: "@eslint/js@npm:8.55.0" - checksum: 88ab9fc57a651becd2b32ec40a3958db27fae133b1ae77bebd733aa5bbd00a92f325bb02f20ad680d31c731fa49b22f060a4777dd52eb3e27da013d940bd978d +"@eslint/js@npm:8.56.0": + version: 8.56.0 + resolution: "@eslint/js@npm:8.56.0" + checksum: 60b3a1cf240e2479cec9742424224465dc50e46d781da1b7f5ef240501b2d1202c225bd456207faac4b34a64f4765833345bc4ddffd00395e1db40fa8c426f5a languageName: node linkType: hard @@ -1841,6 +1851,20 @@ __metadata: languageName: node linkType: hard +"@isaacs/cliui@npm:^8.0.2": + version: 8.0.2 + resolution: "@isaacs/cliui@npm:8.0.2" + dependencies: + string-width: "npm:^5.1.2" + string-width-cjs: "npm:string-width@^4.2.0" + strip-ansi: "npm:^7.0.1" + strip-ansi-cjs: "npm:strip-ansi@^6.0.1" + wrap-ansi: "npm:^8.1.0" + wrap-ansi-cjs: "npm:wrap-ansi@^7.0.0" + checksum: b1bf42535d49f11dc137f18d5e4e63a28c5569de438a221c369483731e9dac9fb797af554e8bf02b6192d1e5eba6e6402cf93900c3d0ac86391d00d04876789e + languageName: node + linkType: hard + "@jest/schemas@npm:^29.4.3": version: 29.4.3 resolution: "@jest/schemas@npm:29.4.3" @@ -2017,6 +2041,13 @@ __metadata: languageName: node linkType: hard +"@pkgjs/parseargs@npm:^0.11.0": + version: 0.11.0 + resolution: "@pkgjs/parseargs@npm:0.11.0" + checksum: 5bd7576bb1b38a47a7fc7b51ac9f38748e772beebc56200450c4a817d712232b8f1d3ef70532c80840243c657d491cf6a6be1e3a214cff907645819fdc34aadd + languageName: node + linkType: hard + "@popperjs/core@npm:^2.9.0": version: 2.11.6 resolution: "@popperjs/core@npm:2.11.6" @@ -2503,6 +2534,13 @@ __metadata: languageName: node linkType: hard +"ansi-styles@npm:^6.1.0": + version: 6.2.1 + resolution: "ansi-styles@npm:6.2.1" + checksum: 5d1ec38c123984bcedd996eac680d548f31828bd679a66db2bdf11844634dde55fec3efa9c6bb1d89056a5e79c1ac540c4c784d592ea1d25028a92227d2f2d5c + languageName: node + linkType: hard + "ansis@npm:1.5.2": version: 1.5.2 resolution: "ansis@npm:1.5.2" @@ -2621,39 +2659,39 @@ __metadata: languageName: node linkType: hard -"babel-plugin-polyfill-corejs2@npm:^0.4.6": - version: 0.4.6 - resolution: "babel-plugin-polyfill-corejs2@npm:0.4.6" +"babel-plugin-polyfill-corejs2@npm:^0.4.7": + version: 0.4.7 + resolution: "babel-plugin-polyfill-corejs2@npm:0.4.7" dependencies: "@babel/compat-data": "npm:^7.22.6" - "@babel/helper-define-polyfill-provider": "npm:^0.4.3" + "@babel/helper-define-polyfill-provider": "npm:^0.4.4" semver: "npm:^6.3.1" peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 64a98811f343492aa6970ab253760194e389c0417e5b830522f944009c1f0c78e1251975fd1b9869cd48cc4623111b20a3389cf6732a1d10ba0d19de6fa5114f + checksum: f80f7284ec72c63e7dd751e0bdf25e9978df195a79e0887470603bfdea13ee518d62573cf360bb1bc01b80819e54915dd5edce9cff14c52d0af5f984aa3d36a3 languageName: node linkType: hard -"babel-plugin-polyfill-corejs3@npm:^0.8.5": - version: 0.8.5 - resolution: "babel-plugin-polyfill-corejs3@npm:0.8.5" +"babel-plugin-polyfill-corejs3@npm:^0.8.7": + version: 0.8.7 + resolution: "babel-plugin-polyfill-corejs3@npm:0.8.7" dependencies: - "@babel/helper-define-polyfill-provider": "npm:^0.4.3" - core-js-compat: "npm:^3.32.2" + "@babel/helper-define-polyfill-provider": "npm:^0.4.4" + core-js-compat: "npm:^3.33.1" peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: 577a072971bda2929a87655c816ad14b6a8f7276e6914851b98a6465bdb56f7f2e3db6136c8b8607bd6ba4cde3cd9cbde21f0078250cd93aee3df977c0a731d0 + checksum: 094e40f4ab9f131408202063964d63740609fd4fdb70a5b6332b371761921b540ffbcee7a434c0199b8317dfb2ba4675eef674867215fd3b85e24054607c1501 languageName: node linkType: hard -"babel-plugin-polyfill-regenerator@npm:^0.5.3": - version: 0.5.3 - resolution: "babel-plugin-polyfill-regenerator@npm:0.5.3" +"babel-plugin-polyfill-regenerator@npm:^0.5.4": + version: 0.5.4 + resolution: "babel-plugin-polyfill-regenerator@npm:0.5.4" dependencies: - "@babel/helper-define-polyfill-provider": "npm:^0.4.3" + "@babel/helper-define-polyfill-provider": "npm:^0.4.4" peerDependencies: "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - checksum: cc32313b9ebbf1d7bedc33524a861136b9e5d3b6e9be317ac360a1c2a59ae5ed1b465a6c68b2715cdefb089780ddfb0c11f4a148e49827a947beee76e43da598 + checksum: 0b903f5fe2f8c487b4260935dfe60bd9a95bcaee7ae63958f063045093b16d4e8288c232199d411261300aa21f6b106a3cb83c42cc996de013b337f5825a79fe languageName: node linkType: hard @@ -2720,17 +2758,17 @@ __metadata: languageName: node linkType: hard -"browserslist@npm:^4.0.0, browserslist@npm:^4.14.5, browserslist@npm:^4.21.10, browserslist@npm:^4.21.4, browserslist@npm:^4.21.9, browserslist@npm:^4.22.1": - version: 4.22.1 - resolution: "browserslist@npm:4.22.1" +"browserslist@npm:^4.0.0, browserslist@npm:^4.14.5, browserslist@npm:^4.21.10, browserslist@npm:^4.21.4, browserslist@npm:^4.22.1, browserslist@npm:^4.22.2": + version: 4.22.2 + resolution: "browserslist@npm:4.22.2" dependencies: - caniuse-lite: "npm:^1.0.30001541" - electron-to-chromium: "npm:^1.4.535" - node-releases: "npm:^2.0.13" + caniuse-lite: "npm:^1.0.30001565" + electron-to-chromium: "npm:^1.4.601" + node-releases: "npm:^2.0.14" update-browserslist-db: "npm:^1.0.13" bin: browserslist: cli.js - checksum: 6810f2d63f171d0b7b8d38cf091708e00cb31525501810a507839607839320d66e657293b0aa3d7f051ecbc025cb07390a90c037682c1d05d12604991e41050b + checksum: 2a331aab90503130043ca41dd5d281fa1e89d5e076d07a2d75e76bf4d693bd56e73d5abcd8c4f39119da6328d450578c216cf1cd5c99b82d8a90a2ae6271b465 languageName: node linkType: hard @@ -2786,10 +2824,10 @@ __metadata: languageName: node linkType: hard -"caniuse-lite@npm:^1.0.0, caniuse-lite@npm:^1.0.30001538, caniuse-lite@npm:^1.0.30001541": - version: 1.0.30001547 - resolution: "caniuse-lite@npm:1.0.30001547" - checksum: bd8ef400fdd6a76aa5a4bc490a5b9b8adffbff1657d36ee1516b4be30315f1a3cfaa51ab872a46d5e7db17424eaa335593cd27e640248b4df3897b113650a7d3 +"caniuse-lite@npm:^1.0.0, caniuse-lite@npm:^1.0.30001538, caniuse-lite@npm:^1.0.30001565": + version: 1.0.30001570 + resolution: "caniuse-lite@npm:1.0.30001570" + checksum: e47230d2016edea56e002fa462a5289f697b48dcfbf703fb01aecc6c98ad4ecaf945ab23c253cb7af056c2d05f266e4e4cbebf45132100e2c9367439cb95b95b languageName: node linkType: hard @@ -2994,24 +3032,29 @@ __metadata: languageName: node linkType: hard -"core-js-compat@npm:^3.31.0, core-js-compat@npm:^3.32.2": - version: 3.33.0 - resolution: "core-js-compat@npm:3.33.0" +"core-js-compat@npm:^3.31.0, core-js-compat@npm:^3.33.1": + version: 3.35.0 + resolution: "core-js-compat@npm:3.35.0" dependencies: - browserslist: "npm:^4.22.1" - checksum: 1db27222420548c65fdb92574192aa1ab434e8e3b80a347fc9c20004e459cc146e719dee8a8c3a3c0773190834e865542d3745ada27a160937fc312a14f66d5c + browserslist: "npm:^4.22.2" + checksum: 8c4379240b8decb94b21e81d5ba6f768418721061923b28c9dfc97574680c35d778d39c010207402fc7c8308a68a4cf6d5e02bcbcb96e931c52e6e0dce29a68c languageName: node linkType: hard -"cosmiconfig@npm:^8.2.0": - version: 8.2.0 - resolution: "cosmiconfig@npm:8.2.0" +"cosmiconfig@npm:^8.3.5": + version: 8.3.6 + resolution: "cosmiconfig@npm:8.3.6" dependencies: - import-fresh: "npm:^3.2.1" + import-fresh: "npm:^3.3.0" js-yaml: "npm:^4.1.0" - parse-json: "npm:^5.0.0" + parse-json: "npm:^5.2.0" path-type: "npm:^4.0.0" - checksum: 4180aa6d1881b75ba591b2fc04b022741a3a4b67e9e243c0eb8d169b6e1efbd3cdf7e8ca19243c0f2e53a9d59ac3eccd5cad5f95f487fcbf4e740f9e86745747 + peerDependencies: + typescript: ">=4.9.5" + peerDependenciesMeta: + typescript: + optional: true + checksum: 0382a9ed13208f8bfc22ca2f62b364855207dffdb73dc26e150ade78c3093f1cf56172df2dd460c8caf2afa91c0ed4ec8a88c62f8f9cd1cf423d26506aa8797a languageName: node linkType: hard @@ -3032,7 +3075,7 @@ __metadata: languageName: node linkType: hard -"cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.3": +"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.3": version: 7.0.3 resolution: "cross-spawn@npm:7.0.3" dependencies: @@ -3264,7 +3307,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4": +"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4": version: 4.3.4 resolution: "debug@npm:4.3.4" dependencies: @@ -3368,10 +3411,17 @@ __metadata: languageName: node linkType: hard -"electron-to-chromium@npm:^1.4.535": - version: 1.4.552 - resolution: "electron-to-chromium@npm:1.4.552" - checksum: ebb903d18fab159f7517bca266428a0139d8fc0472a71afc37819a18f5428637630b667bb14efeb45d92f7ddc9ab191f14b98c0b20117eb7c0415be8c7d4abe4 +"eastasianwidth@npm:^0.2.0": + version: 0.2.0 + resolution: "eastasianwidth@npm:0.2.0" + checksum: 26f364ebcdb6395f95124fda411f63137a4bfb5d3a06453f7f23dfe52502905bd84e0488172e0f9ec295fdc45f05c23d5d91baf16bd26f0fe9acd777a188dc39 + languageName: node + linkType: hard + +"electron-to-chromium@npm:^1.4.601": + version: 1.4.612 + resolution: "electron-to-chromium@npm:1.4.612" + checksum: 4afeae778beb67e81a47e362b72847efc24161b7673818b3d5a36fa0678f006629436a5cfa6b0bb0291927c61d01e58b66330942cc7f4109f170bdec6bfafd73 languageName: node linkType: hard @@ -3382,6 +3432,13 @@ __metadata: languageName: node linkType: hard +"emoji-regex@npm:^9.2.2": + version: 9.2.2 + resolution: "emoji-regex@npm:9.2.2" + checksum: af014e759a72064cf66e6e694a7fc6b0ed3d8db680427b021a89727689671cefe9d04151b2cad51dbaf85d5ba790d061cd167f1cf32eb7b281f6368b3c181639 + languageName: node + linkType: hard + "emojis-list@npm:^3.0.0": version: 3.0.0 resolution: "emojis-list@npm:3.0.0" @@ -3513,14 +3570,14 @@ __metadata: languageName: node linkType: hard -"eslint@npm:8.55.0": - version: 8.55.0 - resolution: "eslint@npm:8.55.0" +"eslint@npm:8.56.0": + version: 8.56.0 + resolution: "eslint@npm:8.56.0" dependencies: "@eslint-community/eslint-utils": "npm:^4.2.0" "@eslint-community/regexpp": "npm:^4.6.1" "@eslint/eslintrc": "npm:^2.1.4" - "@eslint/js": "npm:8.55.0" + "@eslint/js": "npm:8.56.0" "@humanwhocodes/config-array": "npm:^0.11.13" "@humanwhocodes/module-importer": "npm:^1.0.1" "@nodelib/fs.walk": "npm:^1.2.8" @@ -3557,7 +3614,7 @@ __metadata: text-table: "npm:^0.2.0" bin: eslint: bin/eslint.js - checksum: d28c0b60f19bb7d355cb8393e77b018c8f548dba3f820b799c89bb2e0c436ee26084e700c5e57e1e97e7972ec93065277849141b82e7b0c0d02c2dc1e553a2a1 + checksum: 2be598f7da1339d045ad933ffd3d4742bee610515cd2b0d9a2b8b729395a01d4e913552fff555b559fccaefd89d7b37632825789d1b06470608737ae69ab43fb languageName: node linkType: hard @@ -3694,12 +3751,12 @@ __metadata: languageName: node linkType: hard -"file-entry-cache@npm:^7.0.2": - version: 7.0.2 - resolution: "file-entry-cache@npm:7.0.2" +"file-entry-cache@npm:^8.0.0": + version: 8.0.0 + resolution: "file-entry-cache@npm:8.0.0" dependencies: - flat-cache: "npm:^3.2.0" - checksum: 822664e35c3e295e6a8ca7ec490d8d8077017607f41f94b29922f1f49c6dd07025048e3ed528e2909a1439eba66d60f802c0774aa612cf6ee053ee4ecc16c8c5 + flat-cache: "npm:^4.0.0" + checksum: 9e2b5938b1cd9b6d7e3612bdc533afd4ac17b2fc646569e9a8abbf2eb48e5eb8e316bc38815a3ef6a1b456f4107f0d0f055a614ca613e75db6bf9ff4d72c1638 languageName: node linkType: hard @@ -3752,7 +3809,7 @@ __metadata: languageName: node linkType: hard -"flat-cache@npm:^3.0.4, flat-cache@npm:^3.2.0": +"flat-cache@npm:^3.0.4": version: 3.2.0 resolution: "flat-cache@npm:3.2.0" dependencies: @@ -3763,6 +3820,17 @@ __metadata: languageName: node linkType: hard +"flat-cache@npm:^4.0.0": + version: 4.0.0 + resolution: "flat-cache@npm:4.0.0" + dependencies: + flatted: "npm:^3.2.9" + keyv: "npm:^4.5.4" + rimraf: "npm:^5.0.5" + checksum: 8f99e27bb3de94e91e7b4ca5120488cdc2b7f8cd952a538f1a566101963057eb42ca318e9fac0d36987dcca34316ff04b61c1dc3dcc8084f6f5e801a52a8e547 + languageName: node + linkType: hard + "flatted@npm:^3.2.9": version: 3.2.9 resolution: "flatted@npm:3.2.9" @@ -3770,6 +3838,16 @@ __metadata: languageName: node linkType: hard +"foreground-child@npm:^3.1.0": + version: 3.1.1 + resolution: "foreground-child@npm:3.1.1" + dependencies: + cross-spawn: "npm:^7.0.0" + signal-exit: "npm:^4.0.1" + checksum: 9700a0285628abaeb37007c9a4d92bd49f67210f09067638774338e146c8e9c825c5c877f072b2f75f41dc6a2d0be8664f79ffc03f6576649f54a84fb9b47de0 + languageName: node + linkType: hard + "fraction.js@npm:^4.3.6": version: 4.3.7 resolution: "fraction.js@npm:4.3.7" @@ -3874,6 +3952,21 @@ __metadata: languageName: node linkType: hard +"glob@npm:^10.3.7": + version: 10.3.10 + resolution: "glob@npm:10.3.10" + dependencies: + foreground-child: "npm:^3.1.0" + jackspeak: "npm:^2.3.5" + minimatch: "npm:^9.0.1" + minipass: "npm:^5.0.0 || ^6.0.2 || ^7.0.0" + path-scurry: "npm:^1.10.1" + bin: + glob: dist/esm/bin.mjs + checksum: 13d8a1feb7eac7945f8c8480e11cd4a44b24d26503d99a8d8ac8d5aefbf3e9802a2b6087318a829fad04cb4e829f25c5f4f1110c68966c498720dd261c7e344d + languageName: node + linkType: hard + "glob@npm:^7.0.3, glob@npm:^7.1.3, glob@npm:^7.1.4, glob@npm:^7.2.0": version: 7.2.3 resolution: "glob@npm:7.2.3" @@ -4335,18 +4428,31 @@ __metadata: languageName: node linkType: hard +"jackspeak@npm:^2.3.5": + version: 2.3.6 + resolution: "jackspeak@npm:2.3.6" + dependencies: + "@isaacs/cliui": "npm:^8.0.2" + "@pkgjs/parseargs": "npm:^0.11.0" + dependenciesMeta: + "@pkgjs/parseargs": + optional: true + checksum: f01d8f972d894cd7638bc338e9ef5ddb86f7b208ce177a36d718eac96ec86638a6efa17d0221b10073e64b45edc2ce15340db9380b1f5d5c5d000cbc517dc111 + languageName: node + linkType: hard + "jenkins-ui@workspace:.": version: 0.0.0-use.local resolution: "jenkins-ui@workspace:." dependencies: "@babel/cli": "npm:7.23.4" - "@babel/core": "npm:7.23.5" - "@babel/preset-env": "npm:7.23.5" + "@babel/core": "npm:7.23.7" + "@babel/preset-env": "npm:7.23.7" babel-loader: "npm:9.1.3" clean-webpack-plugin: "npm:4.0.0" css-loader: "npm:6.8.1" css-minimizer-webpack-plugin: "npm:5.0.1" - eslint: "npm:8.55.0" + eslint: "npm:8.56.0" eslint-config-prettier: "npm:9.1.0" handlebars: "npm:4.7.8" handlebars-loader: "npm:1.7.3" @@ -4355,15 +4461,15 @@ __metadata: lodash: "npm:4.17.21" mini-css-extract-plugin: "npm:2.7.6" postcss: "npm:8.4.32" - postcss-loader: "npm:7.3.3" + postcss-loader: "npm:7.3.4" postcss-preset-env: "npm:9.3.0" postcss-scss: "npm:4.0.9" prettier: "npm:3.1.1" - sass: "npm:1.69.5" - sass-loader: "npm:13.3.2" + sass: "npm:1.69.7" + sass-loader: "npm:13.3.3" sortablejs: "npm:1.15.1" style-loader: "npm:3.3.3" - stylelint: "npm:16.0.1" + stylelint: "npm:16.1.0" stylelint-checkstyle-reporter: "npm:0.2.0" stylelint-config-standard: "npm:33.0.0" tippy.js: "npm:6.3.7" @@ -4411,12 +4517,12 @@ __metadata: languageName: node linkType: hard -"jiti@npm:^1.18.2": - version: 1.18.2 - resolution: "jiti@npm:1.18.2" +"jiti@npm:^1.20.0": + version: 1.21.0 + resolution: "jiti@npm:1.21.0" bin: jiti: bin/jiti.js - checksum: 578343e883838a5d6775350925d9e1a647e00132ade9c8cc318c163b692988612472f0af3cd9d92b8d8ca61e623092e86ab89563cbf6394900a5a39962e3c4e8 + checksum: 7f361219fe6c7a5e440d5f1dba4ab763a5538d2df8708cdc22561cf25ea3e44b837687931fca7cdd8cdd9f567300e90be989dd1321650045012d8f9ed6aab07f languageName: node linkType: hard @@ -4530,7 +4636,7 @@ __metadata: languageName: node linkType: hard -"keyv@npm:^4.5.3": +"keyv@npm:^4.5.3, keyv@npm:^4.5.4": version: 4.5.4 resolution: "keyv@npm:4.5.4" dependencies: @@ -4689,6 +4795,13 @@ __metadata: languageName: node linkType: hard +"lru-cache@npm:^9.1.1 || ^10.0.0": + version: 10.1.0 + resolution: "lru-cache@npm:10.1.0" + checksum: 778bc8b2626daccd75f24c4b4d10632496e21ba064b126f526c626fbdbc5b28c472013fccd45d7646b9e1ef052444824854aed617b59cd570d01a8b7d651fc1e + languageName: node + linkType: hard + "make-dir@npm:^2.1.0": version: 2.1.0 resolution: "make-dir@npm:2.1.0" @@ -4744,10 +4857,10 @@ __metadata: languageName: node linkType: hard -"meow@npm:^12.1.1": - version: 12.1.1 - resolution: "meow@npm:12.1.1" - checksum: a125ca99a32e2306e2f4cbe651a0d27f6eb67918d43a075f6e80b35e9bf372ebf0fc3a9fbc201cbbc9516444b6265fb3c9f80c5b7ebd32f548aa93eb7c28e088 +"meow@npm:^13.0.0": + version: 13.0.0 + resolution: "meow@npm:13.0.0" + checksum: fab0f91578154c048e792a81704f3f28099ffff900f364df8a85f6e770a57e1c124859a25e186186e149dad30692c7893af0dfd71517bea343bfe5d749b1fa04 languageName: node linkType: hard @@ -4820,6 +4933,15 @@ __metadata: languageName: node linkType: hard +"minimatch@npm:^9.0.1": + version: 9.0.3 + resolution: "minimatch@npm:9.0.3" + dependencies: + brace-expansion: "npm:^2.0.1" + checksum: 85f407dcd38ac3e180f425e86553911d101455ca3ad5544d6a7cec16286657e4f8a9aa6695803025c55e31e35a91a2252b5dc8e7d527211278b8b65b4dbd5eac + languageName: node + linkType: hard + "minimist@npm:^1.2.0, minimist@npm:^1.2.5": version: 1.2.7 resolution: "minimist@npm:1.2.7" @@ -4887,6 +5009,13 @@ __metadata: languageName: node linkType: hard +"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0": + version: 7.0.4 + resolution: "minipass@npm:7.0.4" + checksum: 6c7370a6dfd257bf18222da581ba89a5eaedca10e158781232a8b5542a90547540b4b9b7e7f490e4cda43acfbd12e086f0453728ecf8c19e0ef6921bc5958ac5 + languageName: node + linkType: hard + "minizlib@npm:^2.1.1, minizlib@npm:^2.1.2": version: 2.1.2 resolution: "minizlib@npm:2.1.2" @@ -4970,10 +5099,10 @@ __metadata: languageName: node linkType: hard -"node-releases@npm:^2.0.13": - version: 2.0.13 - resolution: "node-releases@npm:2.0.13" - checksum: 2fb44bf70fc949d27f3a48a7fd1a9d1d603ddad4ccd091f26b3fb8b1da976605d919330d7388ccd55ca2ade0dc8b2e12841ba19ef249c8bb29bf82532d401af7 +"node-releases@npm:^2.0.14": + version: 2.0.14 + resolution: "node-releases@npm:2.0.14" + checksum: 199fc93773ae70ec9969bc6d5ac5b2bbd6eb986ed1907d751f411fef3ede0e4bfdb45ceb43711f8078bea237b6036db8b1bf208f6ff2b70c7d615afd157f3ab9 languageName: node linkType: hard @@ -5139,7 +5268,7 @@ __metadata: languageName: node linkType: hard -"parse-json@npm:^5.0.0, parse-json@npm:^5.2.0": +"parse-json@npm:^5.2.0": version: 5.2.0 resolution: "parse-json@npm:5.2.0" dependencies: @@ -5193,6 +5322,16 @@ __metadata: languageName: node linkType: hard +"path-scurry@npm:^1.10.1": + version: 1.10.1 + resolution: "path-scurry@npm:1.10.1" + dependencies: + lru-cache: "npm:^9.1.1 || ^10.0.0" + minipass: "npm:^5.0.0 || ^6.0.2 || ^7.0.0" + checksum: e5dc78a7348d25eec61ab166317e9e9c7b46818aa2c2b9006c507a6ff48c672d011292d9662527213e558f5652ce0afcc788663a061d8b59ab495681840c0c1e + languageName: node + linkType: hard + "path-type@npm:^4.0.0": version: 4.0.0 resolution: "path-type@npm:4.0.0" @@ -5522,17 +5661,17 @@ __metadata: languageName: node linkType: hard -"postcss-loader@npm:7.3.3": - version: 7.3.3 - resolution: "postcss-loader@npm:7.3.3" +"postcss-loader@npm:7.3.4": + version: 7.3.4 + resolution: "postcss-loader@npm:7.3.4" dependencies: - cosmiconfig: "npm:^8.2.0" - jiti: "npm:^1.18.2" - semver: "npm:^7.3.8" + cosmiconfig: "npm:^8.3.5" + jiti: "npm:^1.20.0" + semver: "npm:^7.5.4" peerDependencies: postcss: ^7.0.0 || ^8.0.1 webpack: ^5.0.0 - checksum: d039654273f858be1f75dfdf8b550869d88905b73a7684b3e48a2937a6087619e84fd1a3551cdef78685a965a2573e985b29a532c3878d834071ecd2da0eb304 + checksum: 1bf7614aeea9ad1f8ee6be3a5451576c059391688ea67f825aedc2674056369597faeae4e4a81fe10843884c9904a71403d9a54197e1f560e8fbb9e61f2a2680 languageName: node linkType: hard @@ -6261,6 +6400,17 @@ __metadata: languageName: node linkType: hard +"rimraf@npm:^5.0.5": + version: 5.0.5 + resolution: "rimraf@npm:5.0.5" + dependencies: + glob: "npm:^10.3.7" + bin: + rimraf: dist/esm/bin.mjs + checksum: d50dbe724f33835decd88395b25ed35995077c60a50ae78ded06e0185418914e555817aad1b4243edbff2254548c2f6ad6f70cc850040bebb4da9e8cc016f586 + languageName: node + linkType: hard + "run-parallel@npm:^1.1.9": version: 1.2.0 resolution: "run-parallel@npm:1.2.0" @@ -6284,9 +6434,9 @@ __metadata: languageName: node linkType: hard -"sass-loader@npm:13.3.2": - version: 13.3.2 - resolution: "sass-loader@npm:13.3.2" +"sass-loader@npm:13.3.3": + version: 13.3.3 + resolution: "sass-loader@npm:13.3.3" dependencies: neo-async: "npm:^2.6.2" peerDependencies: @@ -6304,20 +6454,20 @@ __metadata: optional: true sass-embedded: optional: true - checksum: 7db8132101ed663f3cf936ce765b9b960a48b14f13f17d367a4e0c2ae259e91b6c401e33ab0f27ee88c98c8b5893c778848fc8366f1f387ac788ebef244e000a + checksum: 5e955a4ffce35ee0a46fce677ce51eaa69587fb5371978588c83af00f49e7edc36dcf3bb559cbae27681c5e24a71284463ebe03a1fb65e6ecafa1db0620e3fc8 languageName: node linkType: hard -"sass@npm:1.69.5": - version: 1.69.5 - resolution: "sass@npm:1.69.5" +"sass@npm:1.69.7": + version: 1.69.7 + resolution: "sass@npm:1.69.7" dependencies: chokidar: "npm:>=3.0.0 <4.0.0" immutable: "npm:^4.0.0" source-map-js: "npm:>=0.6.2 <2.0.0" bin: sass: sass.js - checksum: a9003a9482f2e467fc412cfe58ba4fa14fb78bef7e1283ce5d64a065f8a31114ec3bbf5d4e724f94eb8512c32c768a6f91f228c7f16a26a300bbf4db293b5608 + checksum: 773d0938e7d4ff3972d3fda3132f34fe98a2f712e028a58e28fecd615434795eff3266eddc38d5e13f03b90c0d6360d0e737b30bff2949a47280c64a18e0fb18 languageName: node linkType: hard @@ -6362,14 +6512,14 @@ __metadata: languageName: node linkType: hard -"semver@npm:^7.3.5, semver@npm:^7.3.8": - version: 7.3.8 - resolution: "semver@npm:7.3.8" +"semver@npm:^7.3.5, semver@npm:^7.3.8, semver@npm:^7.5.4": + version: 7.5.4 + resolution: "semver@npm:7.5.4" dependencies: lru-cache: "npm:^6.0.0" bin: semver: bin/semver.js - checksum: 7e581d679530db31757301c2117721577a2bb36a301a443aac833b8efad372cda58e7f2a464fe4412ae1041cc1f63a6c1fe0ced8c57ce5aca1e0b57bb0d627b9 + checksum: 5160b06975a38b11c1ab55950cb5b8a23db78df88275d3d8a42ccf1f29e55112ac995b3a26a522c36e3b5f76b0445f1eef70d696b8c7862a2b4303d7b0e7609e languageName: node linkType: hard @@ -6528,7 +6678,7 @@ __metadata: languageName: node linkType: hard -"string-width@npm:^1.0.2 || 2 || 3 || 4, string-width@npm:^4.2.3": +"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^1.0.2 || 2 || 3 || 4, string-width@npm:^4.1.0, string-width@npm:^4.2.3": version: 4.2.3 resolution: "string-width@npm:4.2.3" dependencies: @@ -6539,6 +6689,17 @@ __metadata: languageName: node linkType: hard +"string-width@npm:^5.0.1, string-width@npm:^5.1.2": + version: 5.1.2 + resolution: "string-width@npm:5.1.2" + dependencies: + eastasianwidth: "npm:^0.2.0" + emoji-regex: "npm:^9.2.2" + strip-ansi: "npm:^7.0.1" + checksum: ab9c4264443d35b8b923cbdd513a089a60de339216d3b0ed3be3ba57d6880e1a192b70ae17225f764d7adbf5994e9bb8df253a944736c15a0240eff553c678ca + languageName: node + linkType: hard + "string_decoder@npm:^1.1.1": version: 1.3.0 resolution: "string_decoder@npm:1.3.0" @@ -6548,7 +6709,7 @@ __metadata: languageName: node linkType: hard -"strip-ansi@npm:^6.0.1": +"strip-ansi-cjs@npm:strip-ansi@^6.0.1, strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": version: 6.0.1 resolution: "strip-ansi@npm:6.0.1" dependencies: @@ -6557,7 +6718,7 @@ __metadata: languageName: node linkType: hard -"strip-ansi@npm:^7.1.0": +"strip-ansi@npm:^7.0.1, strip-ansi@npm:^7.1.0": version: 7.1.0 resolution: "strip-ansi@npm:7.1.0" dependencies: @@ -6623,14 +6784,14 @@ __metadata: languageName: node linkType: hard -"stylelint@npm:16.0.1": - version: 16.0.1 - resolution: "stylelint@npm:16.0.1" +"stylelint@npm:16.1.0": + version: 16.1.0 + resolution: "stylelint@npm:16.1.0" dependencies: - "@csstools/css-parser-algorithms": "npm:^2.3.2" - "@csstools/css-tokenizer": "npm:^2.2.1" - "@csstools/media-query-list-parser": "npm:^2.1.5" - "@csstools/selector-specificity": "npm:^3.0.0" + "@csstools/css-parser-algorithms": "npm:^2.4.0" + "@csstools/css-tokenizer": "npm:^2.2.2" + "@csstools/media-query-list-parser": "npm:^2.1.6" + "@csstools/selector-specificity": "npm:^3.0.1" balanced-match: "npm:^2.0.0" colord: "npm:^2.9.3" cosmiconfig: "npm:^9.0.0" @@ -6639,7 +6800,7 @@ __metadata: debug: "npm:^4.3.4" fast-glob: "npm:^3.3.2" fastest-levenshtein: "npm:^1.0.16" - file-entry-cache: "npm:^7.0.2" + file-entry-cache: "npm:^8.0.0" global-modules: "npm:^2.0.0" globby: "npm:^11.1.0" globjoin: "npm:^0.1.4" @@ -6649,7 +6810,7 @@ __metadata: is-plain-object: "npm:^5.0.0" known-css-properties: "npm:^0.29.0" mathml-tag-names: "npm:^2.1.3" - meow: "npm:^12.1.1" + meow: "npm:^13.0.0" micromatch: "npm:^4.0.5" normalize-path: "npm:^3.0.0" picocolors: "npm:^1.0.0" @@ -6667,7 +6828,7 @@ __metadata: write-file-atomic: "npm:^5.0.1" bin: stylelint: bin/stylelint.mjs - checksum: 957bc845dfe76216c571567f10bdf209e93592146024a3e726d860c7dcc42b84ed2a5ef4a722784e07aa371709d49f0d21dc9abd66a3a36fdbbaafb1b9cee2de + checksum: 765eea0b07319d1e7989502c07b8b5794938e5a8542bec00990b09ec10c3f7006891689930099e948d06c9ef9982066edb98b1ea64a435138a6b0f0905eb2b87 languageName: node linkType: hard @@ -7103,6 +7264,28 @@ __metadata: languageName: node linkType: hard +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": + version: 7.0.0 + resolution: "wrap-ansi@npm:7.0.0" + dependencies: + ansi-styles: "npm:^4.0.0" + string-width: "npm:^4.1.0" + strip-ansi: "npm:^6.0.0" + checksum: d15fc12c11e4cbc4044a552129ebc75ee3f57aa9c1958373a4db0292d72282f54373b536103987a4a7594db1ef6a4f10acf92978f79b98c49306a4b58c77d4da + languageName: node + linkType: hard + +"wrap-ansi@npm:^8.1.0": + version: 8.1.0 + resolution: "wrap-ansi@npm:8.1.0" + dependencies: + ansi-styles: "npm:^6.1.0" + string-width: "npm:^5.0.1" + strip-ansi: "npm:^7.0.1" + checksum: 138ff58a41d2f877eae87e3282c0630fc2789012fc1af4d6bd626eeb9a2f9a65ca92005e6e69a75c7b85a68479fe7443c7dbe1eb8fbaa681a4491364b7c55c60 + languageName: node + linkType: hard + "wrappy@npm:1": version: 1.0.2 resolution: "wrappy@npm:1.0.2" diff --git a/websocket/jetty10/pom.xml b/websocket/jetty10/pom.xml index eb4a169a59d1..c91e1583c039 100644 --- a/websocket/jetty10/pom.xml +++ b/websocket/jetty10/pom.xml @@ -22,7 +22,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. --> - + 4.0.0 diff --git a/websocket/spi/pom.xml b/websocket/spi/pom.xml index 77abcc3b7248..a99aada6a446 100644 --- a/websocket/spi/pom.xml +++ b/websocket/spi/pom.xml @@ -22,7 +22,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. --> - + 4.0.0