From cc63c9c8e50a27b78874ac67f48584e232c4e1b5 Mon Sep 17 00:00:00 2001 From: Jan Faracik <43062514+janfaracik@users.noreply.github.com> Date: Tue, 10 Dec 2024 21:37:09 +0000 Subject: [PATCH 01/99] Refine command palette --- .../js/components/command-palette/index.js | 18 ++++- .../scss/components/_command-palette.scss | 73 +++++++++++++------ src/main/scss/components/_dialogs.scss | 6 ++ src/main/scss/form/_search-bar.scss | 2 +- 4 files changed, 72 insertions(+), 27 deletions(-) diff --git a/src/main/js/components/command-palette/index.js b/src/main/js/components/command-palette/index.js index dfb3c6eb7e..5ece1106ae 100644 --- a/src/main/js/components/command-palette/index.js +++ b/src/main/js/components/command-palette/index.js @@ -94,18 +94,23 @@ function init() { } searchResultsContainer.style.height = searchResults.offsetHeight + "px"; + debouncedSpinner.cancel(); commandPaletteSearchBarContainer.classList.remove( "jenkins-search--loading", ); }); } + const debouncedSpinner = debounce(() => { + commandPaletteSearchBarContainer.classList.add("jenkins-search--loading"); + }, 150); + const debouncedLoad = debounce(() => { renderResults(); }, 150); commandPaletteInput.addEventListener("input", () => { - commandPaletteSearchBarContainer.classList.add("jenkins-search--loading"); + debouncedSpinner(); debouncedLoad(); }); @@ -119,7 +124,16 @@ function init() { } function hideCommandPalette() { - commandPalette.close(); + commandPalette.setAttribute("closing", ""); + + commandPalette.addEventListener( + "animationend", + () => { + commandPalette.removeAttribute("closing"); + commandPalette.close(); + }, + { once: true }, + ); } function itemMouseEnter(item) { diff --git a/src/main/scss/components/_command-palette.scss b/src/main/scss/components/_command-palette.scss index 6c3b16517e..8aadde5460 100644 --- a/src/main/scss/components/_command-palette.scss +++ b/src/main/scss/components/_command-palette.scss @@ -1,13 +1,5 @@ @use "../abstracts/mixins"; -.jenkins-command-palette__dialog { - &::backdrop { - background: var(--command-palette-backdrop-background); - backdrop-filter: contrast(0.7) brightness(0.9) saturate(1.25) blur(3px); - animation: jenkins-modal-backdrop-animate-in 0.3s; - } -} - .jenkins-command-palette__dialog { background: none; border: none; @@ -17,6 +9,41 @@ max-width: 100vw !important; margin: 0 !important; padding: 0 !important; + user-select: none; + + &::backdrop { + background: var(--command-palette-backdrop-background); + backdrop-filter: contrast(0.7) brightness(0.9) saturate(1.25) blur(3px); + animation: jenkins-dialog-backdrop-animate-in 0.1s linear; + } + + &[open] { + animation: command-palette-animate-in 0.1s cubic-bezier(0, 0.68, 0.5, 1.5); + } + + &[closing] { + animation: command-palette-animate-out 0.1s linear; + + &::backdrop { + animation: jenkins-dialog-backdrop-animate-out 0.1s linear; + } + } +} + +@keyframes command-palette-animate-in { + from { + translate: 0 4px; + scale: 98.5%; + opacity: 0; + transform: rotateX(30deg); + } +} + +@keyframes command-palette-animate-out { + to { + scale: 98.5%; + opacity: 0; + } } .jenkins-command-palette__wrapper { @@ -40,9 +67,7 @@ --search-bar-height: 3rem !important; background: transparent; - box-shadow: - 0 0 0 20px transparent, - var(--command-palette-inset-shadow); + box-shadow: var(--command-palette-inset-shadow); margin-bottom: 1.5rem; border-radius: 1rem; transition: var(--standard-transition); @@ -71,7 +96,8 @@ border-radius: 1rem; backdrop-filter: var(--command-palette-results-backdrop-filter); box-shadow: var(--command-palette-inset-shadow); - height: 0; + // If set to 0, Safari won't always show the backdrop-filter + height: 1px; transition: height var(--standard-transition); overflow: hidden; will-change: height; @@ -83,8 +109,8 @@ padding: 0.5rem; &__heading { - font-weight: 600; - font-size: 0.85rem; + font-weight: 500; + font-size: 0.875rem; margin: 0; padding: 0.75rem 0.75rem 0.625rem; color: var(--text-color-secondary); @@ -113,8 +139,7 @@ justify-content: flex-start; background: transparent; padding: 0.75rem; - border-radius: 0.66rem; - font-weight: 600; + border-radius: 0.5rem; cursor: pointer; color: var(--text-color) !important; transition: var(--standard-transition); @@ -132,17 +157,17 @@ display: flex; align-items: center; justify-content: center; - width: 1.4rem; - height: 1.4rem; - margin-right: 12.5px; + width: 1.375rem; + height: 1.375rem; + margin-right: 0.75rem; overflow: hidden; pointer-events: none; color: var(--text-color); svg, img { - width: 1.2rem; - height: 1.2rem; + width: 1.125rem; + height: 1.125rem; } } @@ -163,10 +188,10 @@ } &__info { - font-weight: 600; - font-size: 0.85rem; + font-size: 0.875rem; margin: 0; - padding: 12.5px 12.5px 10px; + padding: 0 14px; + line-height: 46px; color: var(--text-color); span { diff --git a/src/main/scss/components/_dialogs.scss b/src/main/scss/components/_dialogs.scss index 7040c70af0..fbefb7bbe2 100644 --- a/src/main/scss/components/_dialogs.scss +++ b/src/main/scss/components/_dialogs.scss @@ -87,6 +87,12 @@ $jenkins-dialog-padding: 1.3rem; } } +@keyframes jenkins-dialog-backdrop-animate-out { + to { + opacity: 0; + } +} + @keyframes jenkins-dialog-animate-in { from { scale: 85%; diff --git a/src/main/scss/form/_search-bar.scss b/src/main/scss/form/_search-bar.scss index ab4f6e9718..e520f9c7e6 100644 --- a/src/main/scss/form/_search-bar.scss +++ b/src/main/scss/form/_search-bar.scss @@ -133,7 +133,7 @@ place-self: center center; opacity: 0; scale: 0; - filter: blur(5px); + filter: blur(2.5px); } &::after { From d43a8d3b2f4121e234ef16a7b4723e271cd9c43e Mon Sep 17 00:00:00 2001 From: Jan Faracik <43062514+janfaracik@users.noreply.github.com> Date: Tue, 10 Dec 2024 21:54:23 +0000 Subject: [PATCH 02/99] Init --- core/src/main/java/hudson/model/Computer.java | 5 ++ core/src/main/java/hudson/model/Job.java | 5 ++ core/src/main/java/hudson/model/User.java | 6 ++ core/src/main/java/hudson/model/View.java | 5 ++ core/src/main/java/hudson/search/Search.java | 33 ++++++++- .../main/java/hudson/search/SearchItem.java | 9 +++ core/src/main/java/jenkins/model/Jenkins.java | 27 ++++++- .../components/command-palette/datasources.js | 3 +- .../js/components/command-palette/index.js | 18 ++++- .../js/components/command-palette/symbols.js | 1 - .../scss/components/_command-palette.scss | 73 +++++++++++++------ .../main/resources/images/symbols/jobs.svg | 5 ++ 12 files changed, 154 insertions(+), 36 deletions(-) create mode 100644 war/src/main/resources/images/symbols/jobs.svg diff --git a/core/src/main/java/hudson/model/Computer.java b/core/src/main/java/hudson/model/Computer.java index 0c525dfabe..383361ee9a 100644 --- a/core/src/main/java/hudson/model/Computer.java +++ b/core/src/main/java/hudson/model/Computer.java @@ -1109,6 +1109,11 @@ public /*transient*/ abstract class Computer extends Actionable implements Acces return getUrl(); } + @Override + public String getSearchIcon() { + return this.getIconClassName(); + } + /** * {@link RetentionStrategy} associated with this computer. * diff --git a/core/src/main/java/hudson/model/Job.java b/core/src/main/java/hudson/model/Job.java index 7d140656e3..643e3d186e 100644 --- a/core/src/main/java/hudson/model/Job.java +++ b/core/src/main/java/hudson/model/Job.java @@ -519,6 +519,11 @@ public abstract class Job, RunT extends Run e.getIconFileName() != null).forEach(action -> builder.add(new SearchItem() { + @Override + public String getSearchName() { + return action.getDisplayName(); + } + + @Override + public String getSearchUrl() { + return action.getUrlName(); + } + + @Override + public String getSearchIcon() { + return action.getIconFileName(); + } + + @Override + public SearchIndex getSearchIndex() { + return SearchIndex.EMPTY; + } + })); + builder.add(new CollectionSearchIndex() { @Override protected SearchItem get(String key) { return getItemByFullName(key, TopLevelItem.class); } diff --git a/src/main/js/components/command-palette/datasources.js b/src/main/js/components/command-palette/datasources.js index 8357fca3fe..20a380eb91 100644 --- a/src/main/js/components/command-palette/datasources.js +++ b/src/main/js/components/command-palette/datasources.js @@ -1,6 +1,5 @@ import { LinkResult } from "./models"; import Search from "@/api/search"; -import * as Symbols from "./symbols"; export const JenkinsSearchSource = { execute(query) { @@ -18,7 +17,7 @@ export const JenkinsSearchSource = { rsp.json().then((data) => { return data["suggestions"].slice().map((e) => LinkResult({ - icon: Symbols.SEARCH, + icon: e.iconXml, label: e.name, url: correctAddress(e.url), }), diff --git a/src/main/js/components/command-palette/index.js b/src/main/js/components/command-palette/index.js index dfb3c6eb7e..5ece1106ae 100644 --- a/src/main/js/components/command-palette/index.js +++ b/src/main/js/components/command-palette/index.js @@ -94,18 +94,23 @@ function init() { } searchResultsContainer.style.height = searchResults.offsetHeight + "px"; + debouncedSpinner.cancel(); commandPaletteSearchBarContainer.classList.remove( "jenkins-search--loading", ); }); } + const debouncedSpinner = debounce(() => { + commandPaletteSearchBarContainer.classList.add("jenkins-search--loading"); + }, 150); + const debouncedLoad = debounce(() => { renderResults(); }, 150); commandPaletteInput.addEventListener("input", () => { - commandPaletteSearchBarContainer.classList.add("jenkins-search--loading"); + debouncedSpinner(); debouncedLoad(); }); @@ -119,7 +124,16 @@ function init() { } function hideCommandPalette() { - commandPalette.close(); + commandPalette.setAttribute("closing", ""); + + commandPalette.addEventListener( + "animationend", + () => { + commandPalette.removeAttribute("closing"); + commandPalette.close(); + }, + { once: true }, + ); } function itemMouseEnter(item) { diff --git a/src/main/js/components/command-palette/symbols.js b/src/main/js/components/command-palette/symbols.js index f1d7b63c4b..14fc815519 100644 --- a/src/main/js/components/command-palette/symbols.js +++ b/src/main/js/components/command-palette/symbols.js @@ -1,3 +1,2 @@ export const EXTERNAL_LINK = ``; export const HELP = ``; -export const SEARCH = `Search`; diff --git a/src/main/scss/components/_command-palette.scss b/src/main/scss/components/_command-palette.scss index 6c3b16517e..ebd634cb9c 100644 --- a/src/main/scss/components/_command-palette.scss +++ b/src/main/scss/components/_command-palette.scss @@ -1,13 +1,5 @@ @use "../abstracts/mixins"; -.jenkins-command-palette__dialog { - &::backdrop { - background: var(--command-palette-backdrop-background); - backdrop-filter: contrast(0.7) brightness(0.9) saturate(1.25) blur(3px); - animation: jenkins-modal-backdrop-animate-in 0.3s; - } -} - .jenkins-command-palette__dialog { background: none; border: none; @@ -17,6 +9,41 @@ max-width: 100vw !important; margin: 0 !important; padding: 0 !important; + user-select: none; + + &::backdrop { + background: var(--command-palette-backdrop-background); + backdrop-filter: contrast(0.7) brightness(0.9) saturate(1.25) blur(3px); + animation: jenkins-dialog-backdrop-animate-in 0.1s linear; + } + + &[open] { + animation: command-palette-animate-in 0.1s cubic-bezier(0, 0.68, 0.5, 1.5); + } + + &[closing] { + animation: command-palette-animate-out 0.1s linear; + + &::backdrop { + animation: jenkins-dialog-backdrop-animate-out 0.1s linear; + } + } +} + +@keyframes command-palette-animate-in { + from { + translate: 0 4px; + scale: 98.5%; + opacity: 0; + transform: rotateX(30deg); + } +} + +@keyframes command-palette-animate-out { + to { + scale: 98.5%; + opacity: 0; + } } .jenkins-command-palette__wrapper { @@ -40,9 +67,7 @@ --search-bar-height: 3rem !important; background: transparent; - box-shadow: - 0 0 0 20px transparent, - var(--command-palette-inset-shadow); + box-shadow: var(--command-palette-inset-shadow); margin-bottom: 1.5rem; border-radius: 1rem; transition: var(--standard-transition); @@ -71,7 +96,8 @@ border-radius: 1rem; backdrop-filter: var(--command-palette-results-backdrop-filter); box-shadow: var(--command-palette-inset-shadow); - height: 0; + // If set to 0, Safari won't always show the backdrop-filter + height: 1px; transition: height var(--standard-transition); overflow: hidden; will-change: height; @@ -83,8 +109,8 @@ padding: 0.5rem; &__heading { - font-weight: 600; - font-size: 0.85rem; + font-weight: 500; + font-size: 0.875rem; margin: 0; padding: 0.75rem 0.75rem 0.625rem; color: var(--text-color-secondary); @@ -113,8 +139,7 @@ justify-content: flex-start; background: transparent; padding: 0.75rem; - border-radius: 0.66rem; - font-weight: 600; + border-radius: 0.5rem; cursor: pointer; color: var(--text-color) !important; transition: var(--standard-transition); @@ -132,17 +157,17 @@ display: flex; align-items: center; justify-content: center; - width: 1.4rem; - height: 1.4rem; - margin-right: 12.5px; + width: 1.375rem; + height: 1.375rem; + margin-right: 0.75rem; overflow: hidden; pointer-events: none; color: var(--text-color); svg, img { - width: 1.2rem; - height: 1.2rem; + width: 1.25rem; + height: 1.25rem; } } @@ -163,10 +188,10 @@ } &__info { - font-weight: 600; - font-size: 0.85rem; + font-size: 0.875rem; margin: 0; - padding: 12.5px 12.5px 10px; + padding: 0 14px; + line-height: 46px; color: var(--text-color); span { diff --git a/war/src/main/resources/images/symbols/jobs.svg b/war/src/main/resources/images/symbols/jobs.svg new file mode 100644 index 0000000000..b17b227c64 --- /dev/null +++ b/war/src/main/resources/images/symbols/jobs.svg @@ -0,0 +1,5 @@ + + + + + From 24837ea667183f189ee0ab73e86cb8cda58c8fe2 Mon Sep 17 00:00:00 2001 From: Jan Faracik <43062514+janfaracik@users.noreply.github.com> Date: Tue, 10 Dec 2024 21:59:03 +0000 Subject: [PATCH 03/99] Update Search.java --- core/src/main/java/hudson/search/Search.java | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/core/src/main/java/hudson/search/Search.java b/core/src/main/java/hudson/search/Search.java index a3c76a7fc9..853c8ea851 100644 --- a/core/src/main/java/hudson/search/Search.java +++ b/core/src/main/java/hudson/search/Search.java @@ -160,14 +160,19 @@ public class Search implements StaplerProxy { public void doSuggest(StaplerRequest2 req, StaplerResponse2 rsp, @QueryParameter String query) throws IOException, ServletException { Result r = new Result(); for (SuggestedItem item : getSuggestions(req, query)) { - String symbolName = item.item.getSearchIcon(); + String icon = item.item.getSearchIcon(); + String iconXml = null; - if (symbolName == null || !symbolName.startsWith("symbol-")) { - symbolName = "symbol-search"; + if (icon == null) { + iconXml = Symbol.get(new SymbolRequest.Builder().withRaw("symbol-search").build()); + } else if (icon.startsWith("symbol-")) { + icon = null; + iconXml = Symbol.get(new SymbolRequest.Builder().withRaw(icon).build()); + } else { + icon = item.item.getSearchIcon(); } - r.suggestions.add(new Item(item.getPath(), item.getUrl(), "", - Symbol.get(new SymbolRequest.Builder().withRaw(symbolName).build()))); + r.suggestions.add(new Item(item.getPath(), item.getUrl(), icon, iconXml)); } rsp.serveExposedBean(req, r, Flavor.JSON); } From a9aadbab3068e2f456866523f94ff88fa9052184 Mon Sep 17 00:00:00 2001 From: Jan Faracik <43062514+janfaracik@users.noreply.github.com> Date: Tue, 10 Dec 2024 22:25:40 +0000 Subject: [PATCH 04/99] Revert "Update Search.java" This reverts commit 24837ea667183f189ee0ab73e86cb8cda58c8fe2. --- core/src/main/java/hudson/search/Search.java | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/core/src/main/java/hudson/search/Search.java b/core/src/main/java/hudson/search/Search.java index 853c8ea851..a3c76a7fc9 100644 --- a/core/src/main/java/hudson/search/Search.java +++ b/core/src/main/java/hudson/search/Search.java @@ -160,19 +160,14 @@ public class Search implements StaplerProxy { public void doSuggest(StaplerRequest2 req, StaplerResponse2 rsp, @QueryParameter String query) throws IOException, ServletException { Result r = new Result(); for (SuggestedItem item : getSuggestions(req, query)) { - String icon = item.item.getSearchIcon(); - String iconXml = null; + String symbolName = item.item.getSearchIcon(); - if (icon == null) { - iconXml = Symbol.get(new SymbolRequest.Builder().withRaw("symbol-search").build()); - } else if (icon.startsWith("symbol-")) { - icon = null; - iconXml = Symbol.get(new SymbolRequest.Builder().withRaw(icon).build()); - } else { - icon = item.item.getSearchIcon(); + if (symbolName == null || !symbolName.startsWith("symbol-")) { + symbolName = "symbol-search"; } - r.suggestions.add(new Item(item.getPath(), item.getUrl(), icon, iconXml)); + r.suggestions.add(new Item(item.getPath(), item.getUrl(), "", + Symbol.get(new SymbolRequest.Builder().withRaw(symbolName).build()))); } rsp.serveExposedBean(req, r, Flavor.JSON); } From ea67d6a554417f3a976918b242b78ee3a816b2a9 Mon Sep 17 00:00:00 2001 From: Jan Faracik <43062514+janfaracik@users.noreply.github.com> Date: Tue, 10 Dec 2024 22:26:16 +0000 Subject: [PATCH 05/99] Update Search.java --- core/src/main/java/hudson/search/Search.java | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/core/src/main/java/hudson/search/Search.java b/core/src/main/java/hudson/search/Search.java index a3c76a7fc9..54813d1f66 100644 --- a/core/src/main/java/hudson/search/Search.java +++ b/core/src/main/java/hudson/search/Search.java @@ -166,7 +166,7 @@ public class Search implements StaplerProxy { symbolName = "symbol-search"; } - r.suggestions.add(new Item(item.getPath(), item.getUrl(), "", + r.suggestions.add(new Item(item.getPath(), item.getUrl(), Symbol.get(new SymbolRequest.Builder().withRaw(symbolName).build()))); } rsp.serveExposedBean(req, r, Flavor.JSON); @@ -268,18 +268,15 @@ public class Search implements StaplerProxy { private final String url; - public final String icon; - public final String iconXml; public Item(String name) { - this(name, null, null, null); + this(name, null, null); } - public Item(String name, String url, String icon, String iconXml) { + public Item(String name, String url, String iconXml) { this.name = name; this.url = url; - this.icon = icon; this.iconXml = iconXml; } @@ -288,11 +285,6 @@ public class Search implements StaplerProxy { return url; } - @Exported - public String getIcon() { - return icon; - } - @Exported public String getIconXml() { return iconXml; From 436a02b9d307183e6cdedca66ec565f639896474 Mon Sep 17 00:00:00 2001 From: Tim Jacomb Date: Wed, 11 Dec 2024 16:35:24 +0000 Subject: [PATCH 06/99] Add support for images --- core/src/main/java/hudson/search/Search.java | 36 +++++++++++++++---- .../components/command-palette/datasources.js | 1 + .../js/components/command-palette/index.js | 1 + .../js/components/command-palette/models.js | 6 ++-- 4 files changed, 34 insertions(+), 10 deletions(-) diff --git a/core/src/main/java/hudson/search/Search.java b/core/src/main/java/hudson/search/Search.java index 54813d1f66..1edbfdb5dc 100644 --- a/core/src/main/java/hudson/search/Search.java +++ b/core/src/main/java/hudson/search/Search.java @@ -58,6 +58,7 @@ import org.kohsuke.stapler.StaplerRequest2; import org.kohsuke.stapler.StaplerResponse; import org.kohsuke.stapler.StaplerResponse2; import org.kohsuke.stapler.export.DataWriter; +import org.kohsuke.stapler.export.ExportConfig; import org.kohsuke.stapler.export.Exported; import org.kohsuke.stapler.export.ExportedBean; import org.kohsuke.stapler.export.Flavor; @@ -159,17 +160,23 @@ public class Search implements StaplerProxy { */ public void doSuggest(StaplerRequest2 req, StaplerResponse2 rsp, @QueryParameter String query) throws IOException, ServletException { Result r = new Result(); - for (SuggestedItem item : getSuggestions(req, query)) { - String symbolName = item.item.getSearchIcon(); + for (SuggestedItem curItem : getSuggestions(req, query)) { + String iconName = curItem.item.getSearchIcon(); - if (symbolName == null || !symbolName.startsWith("symbol-")) { - symbolName = "symbol-search"; + if (iconName == null || + (!iconName.startsWith("symbol-") && !iconName.startsWith("http")) + ) { + iconName = "symbol-search"; } - r.suggestions.add(new Item(item.getPath(), item.getUrl(), - Symbol.get(new SymbolRequest.Builder().withRaw(symbolName).build()))); + if (iconName.startsWith("symbol")) { + r.suggestions.add(new Item(curItem.getPath(), curItem.getUrl(), + Symbol.get(new SymbolRequest.Builder().withRaw(iconName).build()))); + } else { + r.suggestions.add(new Item(curItem.getPath(), curItem.getUrl(), iconName, "image")); + } } - rsp.serveExposedBean(req, r, Flavor.JSON); + rsp.serveExposedBean(req, r, new ExportConfig()); } /** @@ -268,6 +275,8 @@ public class Search implements StaplerProxy { private final String url; + private final String type; + public final String iconXml; public Item(String name) { @@ -278,6 +287,14 @@ public class Search implements StaplerProxy { this.name = name; this.url = url; this.iconXml = iconXml; + this.type = "symbol"; + } + + public Item(String name, String url, String iconXml, String type) { + this.name = name; + this.url = url; + this.iconXml = iconXml; + this.type = type; } @Exported @@ -289,6 +306,11 @@ public class Search implements StaplerProxy { public String getIconXml() { return iconXml; } + + @Exported + public String getType() { + return type; + } } private enum Mode { diff --git a/src/main/js/components/command-palette/datasources.js b/src/main/js/components/command-palette/datasources.js index 20a380eb91..c1666101d4 100644 --- a/src/main/js/components/command-palette/datasources.js +++ b/src/main/js/components/command-palette/datasources.js @@ -18,6 +18,7 @@ export const JenkinsSearchSource = { return data["suggestions"].slice().map((e) => LinkResult({ icon: e.iconXml, + type: e.type, label: e.name, url: correctAddress(e.url), }), diff --git a/src/main/js/components/command-palette/index.js b/src/main/js/components/command-palette/index.js index 5ece1106ae..8530ae3d4a 100644 --- a/src/main/js/components/command-palette/index.js +++ b/src/main/js/components/command-palette/index.js @@ -59,6 +59,7 @@ function init() { results = Promise.all([ LinkResult({ icon: Symbols.HELP, + type: "symbol", label: i18n.dataset.getHelp, url: headerCommandPaletteButton.dataset.searchHelpUrl, isExternal: true, diff --git a/src/main/js/components/command-palette/models.js b/src/main/js/components/command-palette/models.js index 8159ce68c9..b3b06f2271 100644 --- a/src/main/js/components/command-palette/models.js +++ b/src/main/js/components/command-palette/models.js @@ -5,6 +5,7 @@ import { xmlEscape } from "@/util/security"; * @param {Object} params * @param {string} params.icon * @param {string} params.label + * @param {string} params.type * @param {string} params.url * @param {boolean | undefined} params.isExternal */ @@ -16,9 +17,8 @@ export function LinkResult(params) { return ` -
${ - params.icon - }
+ ${params.type === "image" ? `${xmlEscape(params.label)}` : ""} + ${params.type !== "image" ? `
${params.icon}
` : ""} ${xmlEscape(params.label)} ${params.isExternal ? Symbols.EXTERNAL_LINK : ""}
`; From 26738449cd62ea3c007503c0bebff4872b1fc14b Mon Sep 17 00:00:00 2001 From: Jan Faracik <43062514+janfaracik@users.noreply.github.com> Date: Wed, 11 Dec 2024 21:03:29 +0000 Subject: [PATCH 07/99] Implement IconSpec in IComputer --- core/src/main/java/hudson/model/Computer.java | 5 ----- core/src/main/java/jenkins/model/IComputer.java | 3 ++- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/core/src/main/java/hudson/model/Computer.java b/core/src/main/java/hudson/model/Computer.java index 383361ee9a..0c525dfabe 100644 --- a/core/src/main/java/hudson/model/Computer.java +++ b/core/src/main/java/hudson/model/Computer.java @@ -1109,11 +1109,6 @@ public /*transient*/ abstract class Computer extends Actionable implements Acces return getUrl(); } - @Override - public String getSearchIcon() { - return this.getIconClassName(); - } - /** * {@link RetentionStrategy} associated with this computer. * diff --git a/core/src/main/java/jenkins/model/IComputer.java b/core/src/main/java/jenkins/model/IComputer.java index 37fe0af985..e00ee78bd3 100644 --- a/core/src/main/java/jenkins/model/IComputer.java +++ b/core/src/main/java/jenkins/model/IComputer.java @@ -35,6 +35,7 @@ import java.util.concurrent.Future; import jenkins.agents.IOfflineCause; import org.jenkins.ui.icon.Icon; import org.jenkins.ui.icon.IconSet; +import org.jenkins.ui.icon.IconSpec; import org.kohsuke.accmod.Restricted; import org.kohsuke.accmod.restrictions.Beta; @@ -44,7 +45,7 @@ import org.kohsuke.accmod.restrictions.Beta; * @since 2.480 */ @Restricted(Beta.class) -public interface IComputer extends AccessControlled { +public interface IComputer extends AccessControlled, IconSpec { /** * Returns {@link Node#getNodeName() the name of the node}. */ From d6868c970a06a17633cf7d145beef28598730a0b Mon Sep 17 00:00:00 2001 From: Tim Jacomb Date: Wed, 11 Dec 2024 21:11:41 +0000 Subject: [PATCH 08/99] Reword javadoc --- core/src/main/java/org/jenkins/ui/icon/IconSpec.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/core/src/main/java/org/jenkins/ui/icon/IconSpec.java b/core/src/main/java/org/jenkins/ui/icon/IconSpec.java index c44e577e1c..f1bf535b6c 100644 --- a/core/src/main/java/org/jenkins/ui/icon/IconSpec.java +++ b/core/src/main/java/org/jenkins/ui/icon/IconSpec.java @@ -27,8 +27,7 @@ package org.jenkins.ui.icon; /** * Icon Specification. *
- * Plugin extension points that implement/extend Action/ManagementLink should - * also implement this interface. + * If your class provides an icon spec you should implement this interface. * * @author tom.fennelly@gmail.com * @since 2.0 From 80f24cbfdcbadd52801c987e75cffec761df8fc6 Mon Sep 17 00:00:00 2001 From: Jan Faracik <43062514+janfaracik@users.noreply.github.com> Date: Wed, 11 Dec 2024 21:25:23 +0000 Subject: [PATCH 09/99] Init --- .../main/java/hudson/search/SearchGroup.java | 31 +++++++++++++++++++ .../hudson/search/Messages.properties | 6 ++++ 2 files changed, 37 insertions(+) create mode 100644 core/src/main/java/hudson/search/SearchGroup.java diff --git a/core/src/main/java/hudson/search/SearchGroup.java b/core/src/main/java/hudson/search/SearchGroup.java new file mode 100644 index 0000000000..fc13f724a4 --- /dev/null +++ b/core/src/main/java/hudson/search/SearchGroup.java @@ -0,0 +1,31 @@ +package hudson.search; + +import org.kohsuke.stapler.export.Exported; +import org.kohsuke.stapler.export.ExportedBean; + +@ExportedBean(defaultVisibility = 999) +public class SearchGroup { + + private final String displayName; + + public SearchGroup(String displayName) { + this.displayName = displayName; + } + + @Exported + public String getDisplayName() { + return displayName; + } + + public static final SearchGroup VIEW = new SearchGroup(Messages.SearchGroup_views()); + + public static final SearchGroup BUILD = new SearchGroup(Messages.SearchGroup_builds()); + + public static final SearchGroup COMPUTER = new SearchGroup(Messages.SearchGroup_nodes()); + + public static final SearchGroup PROJECT = new SearchGroup(Messages.SearchGroup_projects()); + + public static final SearchGroup PEOPLE = new SearchGroup(Messages.SearchGroup_people()); + + public static final SearchGroup OTHER = new SearchGroup(Messages.SearchGroup_other()); +} diff --git a/core/src/main/resources/hudson/search/Messages.properties b/core/src/main/resources/hudson/search/Messages.properties index de6cfa4f1c..f147e47eaf 100644 --- a/core/src/main/resources/hudson/search/Messages.properties +++ b/core/src/main/resources/hudson/search/Messages.properties @@ -21,3 +21,9 @@ # THE SOFTWARE. UserSearchProperty.DisplayName=Setting for search +SearchGroup.views=Views +SearchGroup.builds=Builds +SearchGroup.nodes=Nodes +SearchGroup.other=Other +SearchGroup.people=People +SearchGroup.projects=Projects From 3d45ca7c3926586e17f8aed1f31f556109e63ea2 Mon Sep 17 00:00:00 2001 From: Jan Faracik <43062514+janfaracik@users.noreply.github.com> Date: Wed, 11 Dec 2024 21:29:27 +0000 Subject: [PATCH 10/99] Add group field --- core/src/main/java/hudson/model/Computer.java | 6 ++++++ core/src/main/java/hudson/search/Search.java | 15 ++++++++++++--- core/src/main/java/hudson/search/SearchItem.java | 4 ++++ 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/hudson/model/Computer.java b/core/src/main/java/hudson/model/Computer.java index 0c525dfabe..14f0b3de4f 100644 --- a/core/src/main/java/hudson/model/Computer.java +++ b/core/src/main/java/hudson/model/Computer.java @@ -48,6 +48,7 @@ import hudson.node_monitors.DiskSpaceMonitorNodeProperty; import hudson.node_monitors.NodeMonitor; import hudson.remoting.Channel; import hudson.remoting.VirtualChannel; +import hudson.search.SearchGroup; import hudson.security.ACL; import hudson.security.AccessControlled; import hudson.security.Permission; @@ -1109,6 +1110,11 @@ public /*transient*/ abstract class Computer extends Actionable implements Acces return getUrl(); } + @Override + public SearchGroup getSearchGroup() { + return SearchGroup.COMPUTER; + } + /** * {@link RetentionStrategy} associated with this computer. * diff --git a/core/src/main/java/hudson/search/Search.java b/core/src/main/java/hudson/search/Search.java index 1edbfdb5dc..6f12405603 100644 --- a/core/src/main/java/hudson/search/Search.java +++ b/core/src/main/java/hudson/search/Search.java @@ -173,7 +173,7 @@ public class Search implements StaplerProxy { r.suggestions.add(new Item(curItem.getPath(), curItem.getUrl(), Symbol.get(new SymbolRequest.Builder().withRaw(iconName).build()))); } else { - r.suggestions.add(new Item(curItem.getPath(), curItem.getUrl(), iconName, "image")); + r.suggestions.add(new Item(curItem.getPath(), curItem.getUrl(), iconName, "image", curItem.item.getSearchGroup())); } } rsp.serveExposedBean(req, r, new ExportConfig()); @@ -277,7 +277,9 @@ public class Search implements StaplerProxy { private final String type; - public final String iconXml; + private final String iconXml; + + private final SearchGroup group; public Item(String name) { this(name, null, null); @@ -288,13 +290,15 @@ public class Search implements StaplerProxy { this.url = url; this.iconXml = iconXml; this.type = "symbol"; + this.group = null; } - public Item(String name, String url, String iconXml, String type) { + public Item(String name, String url, String iconXml, String type, SearchGroup group) { this.name = name; this.url = url; this.iconXml = iconXml; this.type = type; + this.group = group; } @Exported @@ -311,6 +315,11 @@ public class Search implements StaplerProxy { public String getType() { return type; } + + @Exported + public SearchGroup getGroup() { + return group; + } } private enum Mode { diff --git a/core/src/main/java/hudson/search/SearchItem.java b/core/src/main/java/hudson/search/SearchItem.java index e64efb0257..2cb70a3a89 100644 --- a/core/src/main/java/hudson/search/SearchItem.java +++ b/core/src/main/java/hudson/search/SearchItem.java @@ -63,6 +63,10 @@ public interface SearchItem { return "symbol-search"; } + default SearchGroup getSearchGroup() { + return SearchGroup.OTHER; + } + /** * Returns the {@link SearchIndex} to further search sub items inside this item. * From 809d2e6120b36093c60ab88e2794d14fb3aaa5ea Mon Sep 17 00:00:00 2001 From: Jan Faracik <43062514+janfaracik@users.noreply.github.com> Date: Wed, 11 Dec 2024 21:37:47 +0000 Subject: [PATCH 11/99] Make iconXml private, rename to icon --- core/src/main/java/hudson/search/Search.java | 14 +++++++------- .../js/components/command-palette/datasources.js | 2 +- src/main/js/components/command-palette/models.js | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/core/src/main/java/hudson/search/Search.java b/core/src/main/java/hudson/search/Search.java index 1edbfdb5dc..97d15b65c2 100644 --- a/core/src/main/java/hudson/search/Search.java +++ b/core/src/main/java/hudson/search/Search.java @@ -277,23 +277,23 @@ public class Search implements StaplerProxy { private final String type; - public final String iconXml; + private final String icon; public Item(String name) { this(name, null, null); } - public Item(String name, String url, String iconXml) { + public Item(String name, String url, String icon) { this.name = name; this.url = url; - this.iconXml = iconXml; + this.icon = icon; this.type = "symbol"; } - public Item(String name, String url, String iconXml, String type) { + public Item(String name, String url, String icon, String type) { this.name = name; this.url = url; - this.iconXml = iconXml; + this.icon = icon; this.type = type; } @@ -303,8 +303,8 @@ public class Search implements StaplerProxy { } @Exported - public String getIconXml() { - return iconXml; + public String getIcon() { + return icon; } @Exported diff --git a/src/main/js/components/command-palette/datasources.js b/src/main/js/components/command-palette/datasources.js index c1666101d4..58dd5389d5 100644 --- a/src/main/js/components/command-palette/datasources.js +++ b/src/main/js/components/command-palette/datasources.js @@ -17,7 +17,7 @@ export const JenkinsSearchSource = { rsp.json().then((data) => { return data["suggestions"].slice().map((e) => LinkResult({ - icon: e.iconXml, + icon: e.icon, type: e.type, label: e.name, url: correctAddress(e.url), diff --git a/src/main/js/components/command-palette/models.js b/src/main/js/components/command-palette/models.js index b3b06f2271..0c6a733e0d 100644 --- a/src/main/js/components/command-palette/models.js +++ b/src/main/js/components/command-palette/models.js @@ -5,7 +5,7 @@ import { xmlEscape } from "@/util/security"; * @param {Object} params * @param {string} params.icon * @param {string} params.label - * @param {string} params.type + * @param {'symbol' | 'image'} params.type * @param {string} params.url * @param {boolean | undefined} params.isExternal */ From 2b6ffc85f33c17a095dffc770b5c383293d5d261 Mon Sep 17 00:00:00 2001 From: Jan Faracik <43062514+janfaracik@users.noreply.github.com> Date: Wed, 11 Dec 2024 22:09:09 +0000 Subject: [PATCH 12/99] Init --- core/src/main/java/hudson/model/Computer.java | 2 +- core/src/main/java/hudson/model/Job.java | 6 ++++ core/src/main/java/hudson/model/User.java | 6 ++++ core/src/main/java/hudson/model/View.java | 6 ++++ core/src/main/java/hudson/search/Search.java | 18 ++++-------- .../main/java/hudson/search/SearchGroup.java | 29 +++++-------------- .../main/java/hudson/search/SearchItem.java | 2 +- .../components/command-palette/datasources.js | 1 + .../js/components/command-palette/index.js | 23 +++++++++++---- .../js/components/command-palette/models.js | 2 ++ .../js/components/command-palette/utils.js | 13 +++++++++ .../scss/components/_command-palette.scss | 8 ++--- 12 files changed, 70 insertions(+), 46 deletions(-) create mode 100644 src/main/js/components/command-palette/utils.js diff --git a/core/src/main/java/hudson/model/Computer.java b/core/src/main/java/hudson/model/Computer.java index 14f0b3de4f..3b9566d861 100644 --- a/core/src/main/java/hudson/model/Computer.java +++ b/core/src/main/java/hudson/model/Computer.java @@ -1111,7 +1111,7 @@ public /*transient*/ abstract class Computer extends Actionable implements Acces } @Override - public SearchGroup getSearchGroup() { + public String getSearchGroup() { return SearchGroup.COMPUTER; } diff --git a/core/src/main/java/hudson/model/Job.java b/core/src/main/java/hudson/model/Job.java index 643e3d186e..2abf1677fe 100644 --- a/core/src/main/java/hudson/model/Job.java +++ b/core/src/main/java/hudson/model/Job.java @@ -48,6 +48,7 @@ import hudson.model.listeners.ItemListener; import hudson.scm.ChangeLogSet; import hudson.scm.SCM; import hudson.search.QuickSilver; +import hudson.search.SearchGroup; import hudson.search.SearchIndex; import hudson.search.SearchIndexBuilder; import hudson.search.SearchItem; @@ -524,6 +525,11 @@ public abstract class Job, RunT extends Run { + results = groupResultsByCategory(results); + // Clear current search results searchResults.innerHTML = ""; if (query.length === 0 || Object.keys(results).length > 0) { - results.forEach(function (obj) { - const link = createElementFromHtml(obj.render()); - link.addEventListener("mouseenter", (e) => itemMouseEnter(e)); - searchResults.append(link); - }); + for (const [group, items] of Object.entries(results)) { + if (group !== 'null') { + const heading = document.createElement("p"); + heading.className = "jenkins-command-palette__results__heading"; + heading.innerText = group; + searchResults.append(heading); + } + + items.forEach(function (obj) { + const link = createElementFromHtml(obj.render()); + link.addEventListener("mouseenter", (e) => itemMouseEnter(e)); + searchResults.append(link); + }); + } updateSelectedItem(0); } else { diff --git a/src/main/js/components/command-palette/models.js b/src/main/js/components/command-palette/models.js index b3b06f2271..c6c53119e0 100644 --- a/src/main/js/components/command-palette/models.js +++ b/src/main/js/components/command-palette/models.js @@ -7,12 +7,14 @@ import { xmlEscape } from "@/util/security"; * @param {string} params.label * @param {string} params.type * @param {string} params.url + * @param {string | null} params.group * @param {boolean | undefined} params.isExternal */ export function LinkResult(params) { return { label: params.label, url: params.url, + group: params.group, render: () => { return ` Date: Mon, 3 Feb 2025 16:09:14 -0500 Subject: [PATCH 19/99] [JENKINS-75232] Prevent dynamic plugin installation from registering the same extension twice in some cases Co-authored-by: Julien Greffe --- core/src/main/java/hudson/ExtensionList.java | 15 +++++---- core/src/main/java/jenkins/model/Jenkins.java | 14 +++++++-- test/plugins/README.md | 2 ++ .../pom.xml | 29 ++++++++++++++++++ .../CustomExtension.java | 16 ++++++++++ .../CustomPeriodicWork.java | 26 ++++++++++++++++ .../src/main/resources/index.jelly | 4 +++ .../hudson/ExtensionListListenerTest.java | 13 ++++++++ .../extension-list-listener-dynamic-load.hpi | Bin 0 -> 6703 bytes 9 files changed, 111 insertions(+), 8 deletions(-) create mode 100644 test/plugins/README.md create mode 100644 test/plugins/extension-list-listener-dynamic-load/pom.xml create mode 100644 test/plugins/extension-list-listener-dynamic-load/src/main/java/io/jenkins/plugins/extension_list_listener_dynamic_load/CustomExtension.java create mode 100644 test/plugins/extension-list-listener-dynamic-load/src/main/java/io/jenkins/plugins/extension_list_listener_dynamic_load/CustomPeriodicWork.java create mode 100644 test/plugins/extension-list-listener-dynamic-load/src/main/resources/index.jelly create mode 100644 test/src/test/resources/plugins/extension-list-listener-dynamic-load.hpi diff --git a/core/src/main/java/hudson/ExtensionList.java b/core/src/main/java/hudson/ExtensionList.java index c333b2de9f..fc31dc31ad 100644 --- a/core/src/main/java/hudson/ExtensionList.java +++ b/core/src/main/java/hudson/ExtensionList.java @@ -48,6 +48,8 @@ import java.util.logging.Logger; import jenkins.ExtensionComponentSet; import jenkins.model.Jenkins; import jenkins.util.io.OnMaster; +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.NoExternalUse; /** * Retains the known extension instances for the given type 'T'. @@ -335,12 +337,14 @@ public class ExtensionList extends AbstractList implements OnMaster { /** * Used during {@link Jenkins#refreshExtensions()} to add new components into existing {@link ExtensionList}s. * Do not call from anywhere else. + * @return true if {@link #fireOnChangeListeners} should be called on {@code this} after all lists have been refreshed. */ - public void refresh(ExtensionComponentSet delta) { + @Restricted(NoExternalUse.class) + public boolean refresh(ExtensionComponentSet delta) { boolean fireOnChangeListeners = false; synchronized (getLoadLock()) { if (extensions == null) - return; // not yet loaded. when we load it, we'll load everything visible by then, so no work needed + return false; // not yet loaded. when we load it, we'll load everything visible by then, so no work needed Collection> found = load(delta); if (!found.isEmpty()) { @@ -350,12 +354,11 @@ public class ExtensionList extends AbstractList implements OnMaster { fireOnChangeListeners = true; } } - if (fireOnChangeListeners) { - fireOnChangeListeners(); - } + return fireOnChangeListeners; } - private void fireOnChangeListeners() { + @Restricted(NoExternalUse.class) + public void fireOnChangeListeners() { for (ExtensionListListener listener : listeners) { try { listener.onChange(); diff --git a/core/src/main/java/jenkins/model/Jenkins.java b/core/src/main/java/jenkins/model/Jenkins.java index 802681c939..a53dff0024 100644 --- a/core/src/main/java/jenkins/model/Jenkins.java +++ b/core/src/main/java/jenkins/model/Jenkins.java @@ -2864,11 +2864,21 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve delta = ExtensionComponentSet.union(delta, ef.refresh().filtered()); } + List listsToFireOnChangeListeners = new ArrayList<>(); for (ExtensionList el : extensionLists.values()) { - el.refresh(delta); + if (el.refresh(delta)) { + listsToFireOnChangeListeners.add(el); + } } for (ExtensionList el : descriptorLists.values()) { - el.refresh(delta); + if (el.refresh(delta)) { + listsToFireOnChangeListeners.add(el); + } + } + // Refresh all extension lists before firing any listeners in case a listener would cause any new extension + // lists to be forcibly loaded, which may lead to duplicate entries for the same extension object in a list. + for (var el : listsToFireOnChangeListeners) { + el.fireOnChangeListeners(); } // TODO: we need some generalization here so that extension points can be notified when a refresh happens? diff --git a/test/plugins/README.md b/test/plugins/README.md new file mode 100644 index 0000000000..d950346dce --- /dev/null +++ b/test/plugins/README.md @@ -0,0 +1,2 @@ +Directory containing plugin sources for tests. +The generated hpi should be manually copied into src/test/resources/plugins/ when needed. diff --git a/test/plugins/extension-list-listener-dynamic-load/pom.xml b/test/plugins/extension-list-listener-dynamic-load/pom.xml new file mode 100644 index 0000000000..64357841c4 --- /dev/null +++ b/test/plugins/extension-list-listener-dynamic-load/pom.xml @@ -0,0 +1,29 @@ + + 4.0.0 + + org.jenkins-ci.plugins + plugin + 5.6 + + + io.jenkins.plugins + extension-list-listener-dynamic-load + 0.1-SNAPSHOT + hpi + + ExtensionListListenerTest#checkDynamicLoad_singleRegistration + + + + repo.jenkins-ci.org + https://repo.jenkins-ci.org/public/ + + + + + repo.jenkins-ci.org + https://repo.jenkins-ci.org/public/ + + + + diff --git a/test/plugins/extension-list-listener-dynamic-load/src/main/java/io/jenkins/plugins/extension_list_listener_dynamic_load/CustomExtension.java b/test/plugins/extension-list-listener-dynamic-load/src/main/java/io/jenkins/plugins/extension_list_listener_dynamic_load/CustomExtension.java new file mode 100644 index 0000000000..fd11c580c5 --- /dev/null +++ b/test/plugins/extension-list-listener-dynamic-load/src/main/java/io/jenkins/plugins/extension_list_listener_dynamic_load/CustomExtension.java @@ -0,0 +1,16 @@ +package io.jenkins.plugins.extension_list_listener_dynamic_load; + +import hudson.Extension; +import java.util.logging.Level; +import java.util.logging.Logger; + +@Extension +public class CustomExtension { + private static final Logger LOGGER = Logger.getLogger(CustomExtension.class.getName()); + + public long recurrencePeriod = 120; + + public CustomExtension() { + LOGGER.log(Level.INFO, null, new Exception("Instantiating CustomExtension")); + } +} diff --git a/test/plugins/extension-list-listener-dynamic-load/src/main/java/io/jenkins/plugins/extension_list_listener_dynamic_load/CustomPeriodicWork.java b/test/plugins/extension-list-listener-dynamic-load/src/main/java/io/jenkins/plugins/extension_list_listener_dynamic_load/CustomPeriodicWork.java new file mode 100644 index 0000000000..dd2ab2ca5f --- /dev/null +++ b/test/plugins/extension-list-listener-dynamic-load/src/main/java/io/jenkins/plugins/extension_list_listener_dynamic_load/CustomPeriodicWork.java @@ -0,0 +1,26 @@ +package io.jenkins.plugins.extension_list_listener_dynamic_load; + +import hudson.Extension; +import hudson.ExtensionList; +import hudson.model.PeriodicWork; +import java.util.logging.Level; +import java.util.logging.Logger; + +@Extension +public class CustomPeriodicWork extends PeriodicWork { + + private static final Logger LOGGER = Logger.getLogger(CustomPeriodicWork.class.getName()); + + public CustomPeriodicWork() { + LOGGER.log(Level.INFO, null, new Exception("Instantiating CustomPeriodicWork")); + } + + @Override + protected void doRun() {} + + @Override + public long getRecurrencePeriod() { + LOGGER.log(Level.INFO, null, new Exception("Loading CustomExtension")); + return ExtensionList.lookupSingleton(CustomExtension.class).recurrencePeriod; + } +} diff --git a/test/plugins/extension-list-listener-dynamic-load/src/main/resources/index.jelly b/test/plugins/extension-list-listener-dynamic-load/src/main/resources/index.jelly new file mode 100644 index 0000000000..3cb56850e4 --- /dev/null +++ b/test/plugins/extension-list-listener-dynamic-load/src/main/resources/index.jelly @@ -0,0 +1,4 @@ + +
+A simple test plugin that loads an extension from within the context of a ExtensionListListener.onChange method. +
diff --git a/test/src/test/java/hudson/ExtensionListListenerTest.java b/test/src/test/java/hudson/ExtensionListListenerTest.java index 4e53c5d2a6..eb3a485086 100644 --- a/test/src/test/java/hudson/ExtensionListListenerTest.java +++ b/test/src/test/java/hudson/ExtensionListListenerTest.java @@ -24,6 +24,8 @@ package hudson; +import static org.junit.Assert.assertNotNull; + import jenkins.model.TransientActionFactory; import org.junit.Assert; import org.junit.Rule; @@ -65,4 +67,15 @@ public class ExtensionListListenerTest { onChangeCallCount++; } } + + /** + * Check that dynamically loading a plugin containing an extension that is used by an {@link ExtensionListListener} + * and that loads other extensions internally does not lead to extension lists with duplicate entries. + */ + @Test + public void checkDynamicLoad_singleRegistration() throws Throwable { + PluginManagerUtil.dynamicLoad("extension-list-listener-dynamic-load.hpi", r.jenkins); + var fqcn = "io.jenkins.plugins.extension_list_listener_dynamic_load.CustomExtension"; + assertNotNull(ExtensionList.lookupSingleton(r.jenkins.pluginManager.uberClassLoader.loadClass(fqcn))); + } } diff --git a/test/src/test/resources/plugins/extension-list-listener-dynamic-load.hpi b/test/src/test/resources/plugins/extension-list-listener-dynamic-load.hpi new file mode 100644 index 0000000000000000000000000000000000000000..ba78c90e6cca5fb404351d437415f3ca4a995292 GIT binary patch literal 6703 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 ZG0)YN&@Z<}008Im5r3J4Sn{iP{{vEeW-R~! literal 0 HcmV?d00001 From 2be0a08202b82cddf8e7c792622853b7170639b1 Mon Sep 17 00:00:00 2001 From: yen-cheng Date: Mon, 10 Feb 2025 10:15:32 +0800 Subject: [PATCH 20/99] Fix menu can stay open when parent menu closes --- src/main/js/components/dropdowns/utils.js | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/main/js/components/dropdowns/utils.js b/src/main/js/components/dropdowns/utils.js index 588e1c232b..ded1220f5b 100644 --- a/src/main/js/components/dropdowns/utils.js +++ b/src/main/js/components/dropdowns/utils.js @@ -19,15 +19,26 @@ function generateDropdown(element, callback, immediate) { tippy( element, Object.assign({}, Templates.dropdown(), { - hideOnClick: element.dataset["hideOnClick"] !== "false", + hideOnClick: false, onCreate(instance) { const onload = () => { if (instance.loaded) { return; } - instance.popper.addEventListener("click", () => { - instance.hide(); + document.addEventListener("click", (event) => { + const visibleDropdowns = Array.from(document.querySelectorAll('[data-tippy-root]')) + .filter(dropdown => window.getComputedStyle(dropdown).visibility === 'visible'); + + const isClickInAnyDropdown = visibleDropdowns.some(dropdown => + dropdown.contains(event.target) + ); + + const isClickOnReference = instance.reference.contains(event.target); + + if (!isClickInAnyDropdown && !isClickOnReference) { + instance.hide(); + } }); callback(instance); From b746fba008faf4784747c7494a4995628c02726e Mon Sep 17 00:00:00 2001 From: Jan Faracik <43062514+janfaracik@users.noreply.github.com> Date: Mon, 10 Feb 2025 15:53:53 +0000 Subject: [PATCH 21/99] Move to extensionpoint --- core/src/main/java/hudson/model/Computer.java | 7 +- core/src/main/java/hudson/model/Job.java | 7 +- core/src/main/java/hudson/model/User.java | 7 +- core/src/main/java/hudson/model/View.java | 7 +- .../main/java/hudson/search/SearchGroup.java | 16 ----- .../main/java/hudson/search/SearchItem.java | 5 +- .../main/java/jenkins/search/SearchGroup.java | 67 +++++++++++++++++++ .../hudson/search/Messages.properties | 6 -- 8 files changed, 86 insertions(+), 36 deletions(-) delete mode 100644 core/src/main/java/hudson/search/SearchGroup.java create mode 100644 core/src/main/java/jenkins/search/SearchGroup.java diff --git a/core/src/main/java/hudson/model/Computer.java b/core/src/main/java/hudson/model/Computer.java index 3b9566d861..94f822d77e 100644 --- a/core/src/main/java/hudson/model/Computer.java +++ b/core/src/main/java/hudson/model/Computer.java @@ -48,7 +48,7 @@ import hudson.node_monitors.DiskSpaceMonitorNodeProperty; import hudson.node_monitors.NodeMonitor; import hudson.remoting.Channel; import hudson.remoting.VirtualChannel; -import hudson.search.SearchGroup; + import hudson.security.ACL; import hudson.security.AccessControlled; import hudson.security.Permission; @@ -111,6 +111,7 @@ import jenkins.model.DisplayExecutor; import jenkins.model.IComputer; import jenkins.model.IDisplayExecutor; import jenkins.model.Jenkins; +import jenkins.search.SearchGroup; import jenkins.security.ImpersonatingExecutorService; import jenkins.security.MasterToSlaveCallable; import jenkins.security.stapler.StaplerDispatchable; @@ -1111,8 +1112,8 @@ public /*transient*/ abstract class Computer extends Actionable implements Acces } @Override - public String getSearchGroup() { - return SearchGroup.COMPUTER; + public SearchGroup getSearchGroup() { + return SearchGroup.get(SearchGroup.ComputerSearchGroup.class); } /** diff --git a/core/src/main/java/hudson/model/Job.java b/core/src/main/java/hudson/model/Job.java index 0d4409e765..c6fdeeb4bb 100644 --- a/core/src/main/java/hudson/model/Job.java +++ b/core/src/main/java/hudson/model/Job.java @@ -48,7 +48,7 @@ import hudson.model.listeners.ItemListener; import hudson.scm.ChangeLogSet; import hudson.scm.SCM; import hudson.search.QuickSilver; -import hudson.search.SearchGroup; + import hudson.search.SearchIndex; import hudson.search.SearchIndexBuilder; import hudson.search.SearchItem; @@ -101,6 +101,7 @@ import jenkins.model.ProjectNamingStrategy; import jenkins.model.RunIdMigrator; import jenkins.model.lazy.LazyBuildMixIn; import jenkins.scm.RunWithSCM; +import jenkins.search.SearchGroup; import jenkins.security.HexStringConfidentialKey; import jenkins.security.stapler.StaplerNotDispatchable; import jenkins.triggers.SCMTriggerItem; @@ -528,8 +529,8 @@ public abstract class Job, RunT extends Run all() { + return ExtensionList.lookup(SearchGroup.class); + } + + static @NonNull T get(Class type) { + T category = all().get(type); + if (category == null) { + throw new AssertionError("Group not found. It seems the " + type + " is not annotated with @Extension and so not registered"); + } + return category; + } + + @Extension + class UnclassifiedSearchGroup implements SearchGroup { + + @Override + public String getDisplayName() { + return "Other"; + } + } + + @Extension + class JobSearchGroup implements SearchGroup { + + @Override + public String getDisplayName() { + return "Projects"; + } + } + + @Extension + class ComputerSearchGroup implements SearchGroup { + + @Override + public String getDisplayName() { + return "Computers"; + } + } + + @Extension + class ViewSearchGroup implements SearchGroup { + + @Override + public String getDisplayName() { + return "Views"; + } + } + + @Extension + class UserSearchGroup implements SearchGroup { + + @Override + public String getDisplayName() { + return "Users"; + } + } +} diff --git a/core/src/main/resources/hudson/search/Messages.properties b/core/src/main/resources/hudson/search/Messages.properties index f147e47eaf..de6cfa4f1c 100644 --- a/core/src/main/resources/hudson/search/Messages.properties +++ b/core/src/main/resources/hudson/search/Messages.properties @@ -21,9 +21,3 @@ # THE SOFTWARE. UserSearchProperty.DisplayName=Setting for search -SearchGroup.views=Views -SearchGroup.builds=Builds -SearchGroup.nodes=Nodes -SearchGroup.other=Other -SearchGroup.people=People -SearchGroup.projects=Projects From b2da3f8d39c2c606c293919562528732390f386c Mon Sep 17 00:00:00 2001 From: Jan Faracik <43062514+janfaracik@users.noreply.github.com> Date: Mon, 10 Feb 2025 16:03:37 +0000 Subject: [PATCH 22/99] Tidy up --- core/src/main/java/hudson/model/Computer.java | 1 - core/src/main/java/hudson/model/Job.java | 1 - core/src/main/java/hudson/model/User.java | 1 - core/src/main/java/hudson/model/View.java | 1 - core/src/main/java/hudson/search/Search.java | 4 ++-- src/main/js/components/command-palette/index.js | 4 ++-- src/main/scss/components/_command-palette.scss | 9 +++++---- 7 files changed, 9 insertions(+), 12 deletions(-) diff --git a/core/src/main/java/hudson/model/Computer.java b/core/src/main/java/hudson/model/Computer.java index 94f822d77e..c6f7801270 100644 --- a/core/src/main/java/hudson/model/Computer.java +++ b/core/src/main/java/hudson/model/Computer.java @@ -48,7 +48,6 @@ import hudson.node_monitors.DiskSpaceMonitorNodeProperty; import hudson.node_monitors.NodeMonitor; import hudson.remoting.Channel; import hudson.remoting.VirtualChannel; - import hudson.security.ACL; import hudson.security.AccessControlled; import hudson.security.Permission; diff --git a/core/src/main/java/hudson/model/Job.java b/core/src/main/java/hudson/model/Job.java index c6fdeeb4bb..ee03581011 100644 --- a/core/src/main/java/hudson/model/Job.java +++ b/core/src/main/java/hudson/model/Job.java @@ -48,7 +48,6 @@ import hudson.model.listeners.ItemListener; import hudson.scm.ChangeLogSet; import hudson.scm.SCM; import hudson.search.QuickSilver; - import hudson.search.SearchIndex; import hudson.search.SearchIndexBuilder; import hudson.search.SearchItem; diff --git a/core/src/main/java/hudson/model/User.java b/core/src/main/java/hudson/model/User.java index 6900dc1f54..e67e2c7200 100644 --- a/core/src/main/java/hudson/model/User.java +++ b/core/src/main/java/hudson/model/User.java @@ -40,7 +40,6 @@ import hudson.XmlFile; import hudson.init.InitMilestone; import hudson.init.Initializer; import hudson.model.listeners.SaveableListener; - import hudson.security.ACL; import hudson.security.AccessControlled; import hudson.security.SecurityRealm; diff --git a/core/src/main/java/hudson/model/View.java b/core/src/main/java/hudson/model/View.java index 60474395ff..1f03c3f813 100644 --- a/core/src/main/java/hudson/model/View.java +++ b/core/src/main/java/hudson/model/View.java @@ -42,7 +42,6 @@ import hudson.init.Initializer; import hudson.model.Descriptor.FormException; import hudson.model.listeners.ItemListener; import hudson.search.CollectionSearchIndex; - import hudson.search.SearchIndexBuilder; import hudson.security.ACL; import hudson.security.AccessControlled; diff --git a/core/src/main/java/hudson/search/Search.java b/core/src/main/java/hudson/search/Search.java index a9af0b8759..7bd44a7256 100644 --- a/core/src/main/java/hudson/search/Search.java +++ b/core/src/main/java/hudson/search/Search.java @@ -171,9 +171,9 @@ public class Search implements StaplerProxy { if (iconName.startsWith("symbol")) { r.suggestions.add(new Item(curItem.getPath(), curItem.getUrl(), - Symbol.get(new SymbolRequest.Builder().withRaw(iconName).build()), "symbol", curItem.item.getSearchGroup())); + Symbol.get(new SymbolRequest.Builder().withRaw(iconName).build()), "symbol", curItem.item.getSearchGroup().getDisplayName())); } else { - r.suggestions.add(new Item(curItem.getPath(), curItem.getUrl(), iconName, "image", curItem.item.getSearchGroup())); + r.suggestions.add(new Item(curItem.getPath(), curItem.getUrl(), iconName, "image", curItem.item.getSearchGroup().getDisplayName())); } } rsp.serveExposedBean(req, r, new ExportConfig()); diff --git a/src/main/js/components/command-palette/index.js b/src/main/js/components/command-palette/index.js index 8549457622..85b5b2e7c0 100644 --- a/src/main/js/components/command-palette/index.js +++ b/src/main/js/components/command-palette/index.js @@ -69,7 +69,7 @@ function init() { label: i18n.dataset.getHelp, url: headerCommandPaletteButton.dataset.searchHelpUrl, isExternal: true, - group: null + group: null, }), ]); } else { @@ -86,7 +86,7 @@ function init() { if (query.length === 0 || Object.keys(results).length > 0) { for (const [group, items] of Object.entries(results)) { - if (group !== 'null') { + if (group !== "null") { const heading = document.createElement("p"); heading.className = "jenkins-command-palette__results__heading"; heading.innerText = group; diff --git a/src/main/scss/components/_command-palette.scss b/src/main/scss/components/_command-palette.scss index 1ae23772d5..94ab94acfd 100644 --- a/src/main/scss/components/_command-palette.scss +++ b/src/main/scss/components/_command-palette.scss @@ -14,7 +14,7 @@ &::backdrop { background: var(--command-palette-backdrop-background); - backdrop-filter: contrast(0.7) brightness(0.9) saturate(1.25) blur(3px); + backdrop-filter: brightness(0.9) saturate(1.25) blur(2px); animation: jenkins-dialog-backdrop-animate-in 0.1s linear; } @@ -76,7 +76,7 @@ &__search { --search-bar-height: 3rem !important; - background: transparent; + background: color-mix(in sRGB, var(--card-background), transparent); box-shadow: var(--command-palette-inset-shadow); margin-bottom: var(--section-padding); border-radius: 1rem; @@ -109,6 +109,7 @@ display: flex; flex-direction: column; border-radius: 1rem; + background: color-mix(in sRGB, var(--card-background), transparent); backdrop-filter: var(--command-palette-results-backdrop-filter); box-shadow: var(--command-palette-inset-shadow); @@ -132,7 +133,7 @@ color: var(--text-color-secondary); &:not(:first-of-type) { - padding-top: 1.5rem; + padding-top: 1.375rem; } } @@ -153,7 +154,7 @@ display: flex; align-items: center; justify-content: flex-start; - padding: 0.75rem; + padding: 0.625rem; border-radius: 0.5rem; color: var(--text-color) !important; transition: var(--standard-transition); From d7270b1fa49b27c2005e86807400f033969d7a41 Mon Sep 17 00:00:00 2001 From: Jan Faracik <43062514+janfaracik@users.noreply.github.com> Date: Mon, 10 Feb 2025 16:06:04 +0000 Subject: [PATCH 23/99] Tidy --- src/main/scss/abstracts/_theme.scss | 6 +++++- src/main/scss/components/_command-palette.scss | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/scss/abstracts/_theme.scss b/src/main/scss/abstracts/_theme.scss index 11d6543d8d..2752638850 100644 --- a/src/main/scss/abstracts/_theme.scss +++ b/src/main/scss/abstracts/_theme.scss @@ -202,7 +202,11 @@ $semantics: ( var(--jenkins-border--subtle-shadow); ::backdrop { - --command-palette-backdrop-background: rgb(0 0 0 / 0.2); + --command-palette-backdrop-background: color-mix( + in sRGB, + var(--text-color) 30%, + transparent + ); } // Tooltips diff --git a/src/main/scss/components/_command-palette.scss b/src/main/scss/components/_command-palette.scss index 94ab94acfd..a487f3429b 100644 --- a/src/main/scss/components/_command-palette.scss +++ b/src/main/scss/components/_command-palette.scss @@ -14,7 +14,7 @@ &::backdrop { background: var(--command-palette-backdrop-background); - backdrop-filter: brightness(0.9) saturate(1.25) blur(2px); + backdrop-filter: saturate(1.25) blur(2px); animation: jenkins-dialog-backdrop-animate-in 0.1s linear; } From 46a9e5681a98d86914123c50cec31ea6d3d01d0c Mon Sep 17 00:00:00 2001 From: Jan Faracik <43062514+janfaracik@users.noreply.github.com> Date: Mon, 10 Feb 2025 16:28:15 +0000 Subject: [PATCH 24/99] Tidy --- .../main/java/jenkins/search/SearchGroup.java | 20 +++++++++----- .../jenkins/search/Messages.properties | 27 +++++++++++++++++++ src/main/scss/abstracts/_theme.scss | 8 +++--- .../scss/components/_command-palette.scss | 15 +++++++---- 4 files changed, 54 insertions(+), 16 deletions(-) create mode 100644 core/src/main/resources/jenkins/search/Messages.properties diff --git a/core/src/main/java/jenkins/search/SearchGroup.java b/core/src/main/java/jenkins/search/SearchGroup.java index 203defaba6..2871396af6 100644 --- a/core/src/main/java/jenkins/search/SearchGroup.java +++ b/core/src/main/java/jenkins/search/SearchGroup.java @@ -6,6 +6,12 @@ import hudson.ExtensionList; import hudson.ExtensionPoint; import hudson.model.ModelObject; +import static jenkins.search.Messages.SearchGroup_ComputerSearchGroup_DisplayName; +import static jenkins.search.Messages.SearchGroup_JobSearchGroup_DisplayName; +import static jenkins.search.Messages.SearchGroup_UnclassifiedSearchGroup_DisplayName; +import static jenkins.search.Messages.SearchGroup_UserSearchGroup_DisplayName; +import static jenkins.search.Messages.SearchGroup_ViewSearchGroup_DisplayName; + public interface SearchGroup extends ExtensionPoint, ModelObject { static ExtensionList all() { @@ -20,21 +26,21 @@ public interface SearchGroup extends ExtensionPoint, ModelObject { return category; } - @Extension + @Extension(ordinal = -1) class UnclassifiedSearchGroup implements SearchGroup { @Override public String getDisplayName() { - return "Other"; + return SearchGroup_UnclassifiedSearchGroup_DisplayName(); } } - @Extension + @Extension(ordinal = 999) class JobSearchGroup implements SearchGroup { @Override public String getDisplayName() { - return "Projects"; + return SearchGroup_JobSearchGroup_DisplayName(); } } @@ -43,7 +49,7 @@ public interface SearchGroup extends ExtensionPoint, ModelObject { @Override public String getDisplayName() { - return "Computers"; + return SearchGroup_ComputerSearchGroup_DisplayName(); } } @@ -52,7 +58,7 @@ public interface SearchGroup extends ExtensionPoint, ModelObject { @Override public String getDisplayName() { - return "Views"; + return SearchGroup_ViewSearchGroup_DisplayName(); } } @@ -61,7 +67,7 @@ public interface SearchGroup extends ExtensionPoint, ModelObject { @Override public String getDisplayName() { - return "Users"; + return SearchGroup_UserSearchGroup_DisplayName(); } } } diff --git a/core/src/main/resources/jenkins/search/Messages.properties b/core/src/main/resources/jenkins/search/Messages.properties new file mode 100644 index 0000000000..26523266ce --- /dev/null +++ b/core/src/main/resources/jenkins/search/Messages.properties @@ -0,0 +1,27 @@ +# The MIT License +# +# Copyright (c) 2025 Jan Faracik +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 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. + +SearchGroup.UnclassifiedSearchGroup.DisplayName=Other +SearchGroup.JobSearchGroup.DisplayName=Projects +SearchGroup.ComputerSearchGroup.DisplayName=Nodes +SearchGroup.ViewSearchGroup.DisplayName=Views +SearchGroup.UserSearchGroup.DisplayName=Users diff --git a/src/main/scss/abstracts/_theme.scss b/src/main/scss/abstracts/_theme.scss index 2752638850..daba530f8c 100644 --- a/src/main/scss/abstracts/_theme.scss +++ b/src/main/scss/abstracts/_theme.scss @@ -196,15 +196,15 @@ $semantics: ( --link-font-weight: var(--font-bold-weight); // Command Palette - --command-palette-results-backdrop-filter: contrast(0.7) brightness(1.5) - saturate(1.4) blur(20px); + --command-palette-results-backdrop-filter: saturate(1.4) blur(20px); --command-palette-inset-shadow: inset 0 0 2px 2px rgb(255 255 255 / 0.1), - var(--jenkins-border--subtle-shadow); + var(--jenkins-border--subtle-shadow), + 0 5px 10px var(--jenkins-border-color--subtle); ::backdrop { --command-palette-backdrop-background: color-mix( in sRGB, - var(--text-color) 30%, + var(--black) 17.5%, transparent ); } diff --git a/src/main/scss/components/_command-palette.scss b/src/main/scss/components/_command-palette.scss index a487f3429b..2d5322edcb 100644 --- a/src/main/scss/components/_command-palette.scss +++ b/src/main/scss/components/_command-palette.scss @@ -1,6 +1,12 @@ @use "../abstracts/mixins"; @use "../base/breakpoints"; +$command-palette-background: color-mix( + in sRGB, + var(--card-background) 90%, + transparent +); + .jenkins-command-palette__dialog { background: none; border: none; @@ -14,7 +20,7 @@ &::backdrop { background: var(--command-palette-backdrop-background); - backdrop-filter: saturate(1.25) blur(2px); + backdrop-filter: blur(1px); animation: jenkins-dialog-backdrop-animate-in 0.1s linear; } @@ -48,7 +54,7 @@ } .jenkins-command-palette__wrapper { - --inset: 15vh; + --inset: 14vh; width: 100%; height: 100%; @@ -76,7 +82,7 @@ &__search { --search-bar-height: 3rem !important; - background: color-mix(in sRGB, var(--card-background), transparent); + background: $command-palette-background; box-shadow: var(--command-palette-inset-shadow); margin-bottom: var(--section-padding); border-radius: 1rem; @@ -109,7 +115,7 @@ display: flex; flex-direction: column; border-radius: 1rem; - background: color-mix(in sRGB, var(--card-background), transparent); + background: $command-palette-background; backdrop-filter: var(--command-palette-results-backdrop-filter); box-shadow: var(--command-palette-inset-shadow); @@ -126,7 +132,6 @@ padding: 0.5rem; &__heading { - font-weight: var(--font-bold-weight); font-size: var(--font-size-sm); margin: 0; padding: 0.5rem 0.625rem; From 14a64885a2284883d86f2af8f7ce4745d34511db Mon Sep 17 00:00:00 2001 From: Jan Faracik <43062514+janfaracik@users.noreply.github.com> Date: Mon, 10 Feb 2025 16:44:39 +0000 Subject: [PATCH 25/99] Tidy up --- core/src/main/java/hudson/search/Search.java | 21 +++++++++++++++++++ .../main/java/jenkins/search/SearchGroup.java | 12 +++++------ 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/core/src/main/java/hudson/search/Search.java b/core/src/main/java/hudson/search/Search.java index 7bd44a7256..cfd905f7b2 100644 --- a/core/src/main/java/hudson/search/Search.java +++ b/core/src/main/java/hudson/search/Search.java @@ -29,6 +29,8 @@ import static jakarta.servlet.http.HttpServletResponse.SC_NOT_FOUND; import edu.umd.cs.findbugs.annotations.CheckForNull; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; +import hudson.ExtensionComponent; +import hudson.ExtensionList; import hudson.Util; import hudson.util.EditDistance; import io.jenkins.servlet.ServletExceptionWrapper; @@ -37,12 +39,16 @@ import java.io.IOException; import java.util.AbstractList; import java.util.ArrayList; import java.util.Collections; +import java.util.Comparator; import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; +import java.util.stream.Collectors; import jenkins.model.Jenkins; +import jenkins.search.SearchGroup; import jenkins.security.stapler.StaplerNotDispatchable; import jenkins.util.MemoryReductionUtil; import jenkins.util.SystemProperties; @@ -176,6 +182,21 @@ public class Search implements StaplerProxy { r.suggestions.add(new Item(curItem.getPath(), curItem.getUrl(), iconName, "image", curItem.item.getSearchGroup().getDisplayName())); } } + + // Sort results by group + ExtensionList groupsExtensionList = ExtensionList.lookup(SearchGroup.class); + List> components = groupsExtensionList.getComponents(); + Map searchGroupOrdinal = components.stream() + .collect(Collectors.toMap( + (k) -> k.getInstance().getDisplayName(), + ExtensionComponent::ordinal + )); + r.suggestions.sort( + Comparator.comparingDouble((Item item) -> searchGroupOrdinal.getOrDefault(item.getGroup(), Double.MAX_VALUE)) + .reversed() + .thenComparing(item -> item.name) + ); + rsp.serveExposedBean(req, r, new ExportConfig()); } diff --git a/core/src/main/java/jenkins/search/SearchGroup.java b/core/src/main/java/jenkins/search/SearchGroup.java index 2871396af6..bba3643ff8 100644 --- a/core/src/main/java/jenkins/search/SearchGroup.java +++ b/core/src/main/java/jenkins/search/SearchGroup.java @@ -1,17 +1,17 @@ package jenkins.search; -import edu.umd.cs.findbugs.annotations.NonNull; -import hudson.Extension; -import hudson.ExtensionList; -import hudson.ExtensionPoint; -import hudson.model.ModelObject; - import static jenkins.search.Messages.SearchGroup_ComputerSearchGroup_DisplayName; import static jenkins.search.Messages.SearchGroup_JobSearchGroup_DisplayName; import static jenkins.search.Messages.SearchGroup_UnclassifiedSearchGroup_DisplayName; import static jenkins.search.Messages.SearchGroup_UserSearchGroup_DisplayName; import static jenkins.search.Messages.SearchGroup_ViewSearchGroup_DisplayName; +import edu.umd.cs.findbugs.annotations.NonNull; +import hudson.Extension; +import hudson.ExtensionList; +import hudson.ExtensionPoint; +import hudson.model.ModelObject; + public interface SearchGroup extends ExtensionPoint, ModelObject { static ExtensionList all() { From 2120a9fa5b24f83ca2da41db261d5f59a6843c1a Mon Sep 17 00:00:00 2001 From: yen-cheng Date: Tue, 11 Feb 2025 10:58:27 +0800 Subject: [PATCH 26/99] Update utils.js --- src/main/js/components/dropdowns/utils.js | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/main/js/components/dropdowns/utils.js b/src/main/js/components/dropdowns/utils.js index ded1220f5b..7bf405fccf 100644 --- a/src/main/js/components/dropdowns/utils.js +++ b/src/main/js/components/dropdowns/utils.js @@ -27,13 +27,7 @@ function generateDropdown(element, callback, immediate) { } document.addEventListener("click", (event) => { - const visibleDropdowns = Array.from(document.querySelectorAll('[data-tippy-root]')) - .filter(dropdown => window.getComputedStyle(dropdown).visibility === 'visible'); - - const isClickInAnyDropdown = visibleDropdowns.some(dropdown => - dropdown.contains(event.target) - ); - + const isClickInAnyDropdown = !!event.target.closest('[data-tippy-root]'); const isClickOnReference = instance.reference.contains(event.target); if (!isClickInAnyDropdown && !isClickOnReference) { From ec6a5e5ee01879fe817a6827ed42e238f6d46217 Mon Sep 17 00:00:00 2001 From: Jan Faracik <43062514+janfaracik@users.noreply.github.com> Date: Tue, 11 Feb 2025 08:51:16 +0000 Subject: [PATCH 27/99] Fix test --- core/src/main/java/hudson/search/Search.java | 2 +- test/src/test/java/hudson/model/AbstractProjectTest.java | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/hudson/search/Search.java b/core/src/main/java/hudson/search/Search.java index cfd905f7b2..5040d9b28e 100644 --- a/core/src/main/java/hudson/search/Search.java +++ b/core/src/main/java/hudson/search/Search.java @@ -303,7 +303,7 @@ public class Search implements StaplerProxy { private final String group; public Item(String name) { - this(name, null, null, null, null); + this(name, null, null, "symbol", null); } public Item(String name, String url, String icon, String type, String group) { diff --git a/test/src/test/java/hudson/model/AbstractProjectTest.java b/test/src/test/java/hudson/model/AbstractProjectTest.java index b8a9d8e1ea..ab1cc450c9 100644 --- a/test/src/test/java/hudson/model/AbstractProjectTest.java +++ b/test/src/test/java/hudson/model/AbstractProjectTest.java @@ -666,6 +666,7 @@ public class AbstractProjectTest { o.put("url", JSONObject.fromObject(null)); o.put("icon", JSONObject.fromObject(null)); o.put("type", "symbol"); + o.put("group", JSONObject.fromObject(null)); expected.add(o); } assertThat(suggestions.containsAll(expected), is(true)); From 7c9e172b2f427ffd9b1a85594615261bea327477 Mon Sep 17 00:00:00 2001 From: Jan Faracik <43062514+janfaracik@users.noreply.github.com> Date: Tue, 11 Feb 2025 11:23:27 +0000 Subject: [PATCH 28/99] Update Messages.properties --- core/src/main/resources/jenkins/search/Messages.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/resources/jenkins/search/Messages.properties b/core/src/main/resources/jenkins/search/Messages.properties index 26523266ce..54a48f1691 100644 --- a/core/src/main/resources/jenkins/search/Messages.properties +++ b/core/src/main/resources/jenkins/search/Messages.properties @@ -21,7 +21,7 @@ # THE SOFTWARE. SearchGroup.UnclassifiedSearchGroup.DisplayName=Other -SearchGroup.JobSearchGroup.DisplayName=Projects +SearchGroup.JobSearchGroup.DisplayName=Jobs SearchGroup.ComputerSearchGroup.DisplayName=Nodes SearchGroup.ViewSearchGroup.DisplayName=Views SearchGroup.UserSearchGroup.DisplayName=Users From d65817ada8c50f54b83eaf41a4621e632e278b77 Mon Sep 17 00:00:00 2001 From: yen-cheng Date: Tue, 11 Feb 2025 20:42:51 +0800 Subject: [PATCH 29/99] Update utils.js --- src/main/js/components/dropdowns/utils.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/js/components/dropdowns/utils.js b/src/main/js/components/dropdowns/utils.js index 7bf405fccf..219b3c5362 100644 --- a/src/main/js/components/dropdowns/utils.js +++ b/src/main/js/components/dropdowns/utils.js @@ -19,7 +19,7 @@ function generateDropdown(element, callback, immediate) { tippy( element, Object.assign({}, Templates.dropdown(), { - hideOnClick: false, + hideOnClick: "toggle", onCreate(instance) { const onload = () => { if (instance.loaded) { From 29c617cd65e94c7a419c4164a4831c699962ca3d Mon Sep 17 00:00:00 2001 From: yen-cheng Date: Tue, 11 Feb 2025 21:35:17 +0800 Subject: [PATCH 30/99] Update utils.js --- src/main/js/components/dropdowns/utils.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/js/components/dropdowns/utils.js b/src/main/js/components/dropdowns/utils.js index 219b3c5362..b109cc3894 100644 --- a/src/main/js/components/dropdowns/utils.js +++ b/src/main/js/components/dropdowns/utils.js @@ -19,7 +19,7 @@ function generateDropdown(element, callback, immediate) { tippy( element, Object.assign({}, Templates.dropdown(), { - hideOnClick: "toggle", + hideOnClick: element.dataset["hideOnClick"] !== "false" ? "toggle" : false, onCreate(instance) { const onload = () => { if (instance.loaded) { From 04dc6cd2225f4635a5f91c648d9e3dbbb0a7350d Mon Sep 17 00:00:00 2001 From: Jan Faracik <43062514+janfaracik@users.noreply.github.com> Date: Tue, 11 Feb 2025 17:06:31 +0000 Subject: [PATCH 31/99] Reduce spacing a touch, fix icon spacing --- src/main/scss/components/_command-palette.scss | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/scss/components/_command-palette.scss b/src/main/scss/components/_command-palette.scss index 2d5322edcb..c2798d7645 100644 --- a/src/main/scss/components/_command-palette.scss +++ b/src/main/scss/components/_command-palette.scss @@ -134,7 +134,7 @@ $command-palette-background: color-mix( &__heading { font-size: var(--font-size-sm); margin: 0; - padding: 0.5rem 0.625rem; + padding: 0.375rem 0.625rem; color: var(--text-color-secondary); &:not(:first-of-type) { @@ -177,7 +177,7 @@ $command-palette-background: color-mix( justify-content: center; width: 1.375rem; height: 1.375rem; - margin-right: 0.75rem; + margin-right: 0.625rem; overflow: hidden; pointer-events: none; color: var(--text-color); From 24f86ad1b18e485e8512f15fed014ba4d3dfd12c Mon Sep 17 00:00:00 2001 From: Devin Nusbaum Date: Fri, 14 Feb 2025 14:13:37 -0500 Subject: [PATCH 32/99] [JENKINS-75232] Simplify ExtensionList.refresh --- core/src/main/java/hudson/ExtensionList.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/hudson/ExtensionList.java b/core/src/main/java/hudson/ExtensionList.java index fc31dc31ad..3987056dbc 100644 --- a/core/src/main/java/hudson/ExtensionList.java +++ b/core/src/main/java/hudson/ExtensionList.java @@ -341,7 +341,6 @@ public class ExtensionList extends AbstractList implements OnMaster { */ @Restricted(NoExternalUse.class) public boolean refresh(ExtensionComponentSet delta) { - boolean fireOnChangeListeners = false; synchronized (getLoadLock()) { if (extensions == null) return false; // not yet loaded. when we load it, we'll load everything visible by then, so no work needed @@ -351,10 +350,10 @@ public class ExtensionList extends AbstractList implements OnMaster { List> l = new ArrayList<>(extensions); l.addAll(found); extensions = sort(l); - fireOnChangeListeners = true; + return true; } } - return fireOnChangeListeners; + return false; } @Restricted(NoExternalUse.class) From 42ecfcac5c555800d3b24fe6af6705e62073ddec Mon Sep 17 00:00:00 2001 From: Jan Faracik <43062514+janfaracik@users.noreply.github.com> Date: Sun, 16 Feb 2025 17:10:48 +0000 Subject: [PATCH 33/99] Rename to Items --- core/src/main/java/hudson/model/Job.java | 2 +- core/src/main/java/jenkins/search/SearchGroup.java | 6 +++--- core/src/main/resources/jenkins/search/Messages.properties | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/core/src/main/java/hudson/model/Job.java b/core/src/main/java/hudson/model/Job.java index ee03581011..0142c63d50 100644 --- a/core/src/main/java/hudson/model/Job.java +++ b/core/src/main/java/hudson/model/Job.java @@ -529,7 +529,7 @@ public abstract class Job, RunT extends Run Date: Sun, 16 Feb 2025 17:11:18 +0000 Subject: [PATCH 34/99] Update _theme.scss --- src/main/scss/abstracts/_theme.scss | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/scss/abstracts/_theme.scss b/src/main/scss/abstracts/_theme.scss index ba422f5cda..8368c0957b 100644 --- a/src/main/scss/abstracts/_theme.scss +++ b/src/main/scss/abstracts/_theme.scss @@ -198,7 +198,8 @@ $semantics: ( // Command Palette --command-palette-results-backdrop-filter: saturate(1.4) blur(20px); - --command-palette-inset-shadow: inset 0 0 2px 2px rgb(255 255 255 / 0.1), + --command-palette-inset-shadow: + inset 0 0 2px 2px rgb(255 255 255 / 0.1), var(--jenkins-border--subtle-shadow), 0 5px 10px var(--jenkins-border-color--subtle); From e2c133d1283e7e444fd49e21a26753f2085e925c Mon Sep 17 00:00:00 2001 From: Jan Faracik <43062514+janfaracik@users.noreply.github.com> Date: Sun, 16 Feb 2025 18:23:14 +0000 Subject: [PATCH 35/99] Update require-changelog-label.yml --- .github/workflows/require-changelog-label.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/require-changelog-label.yml b/.github/workflows/require-changelog-label.yml index 457d9f3e60..6cec0055b9 100644 --- a/.github/workflows/require-changelog-label.yml +++ b/.github/workflows/require-changelog-label.yml @@ -3,7 +3,7 @@ on: pull_request_target: types: [opened, labeled, unlabeled, synchronize] branches: - - 'master' + - "master" jobs: label: runs-on: ubuntu-latest From 6817532d561f2f117d5c4f88936ecd753c3519dc Mon Sep 17 00:00:00 2001 From: Devin Nusbaum Date: Fri, 14 Feb 2025 14:15:08 -0500 Subject: [PATCH 36/99] [JENKINS-75232] Prevent duplicates in ExtensionList.refresh --- core/src/main/java/hudson/ExtensionList.java | 25 ++++++++++++++++---- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/core/src/main/java/hudson/ExtensionList.java b/core/src/main/java/hudson/ExtensionList.java index 3987056dbc..fe61224c1a 100644 --- a/core/src/main/java/hudson/ExtensionList.java +++ b/core/src/main/java/hudson/ExtensionList.java @@ -36,10 +36,12 @@ import java.util.AbstractList; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.IdentityHashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.Set; import java.util.Vector; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.CopyOnWriteArrayList; @@ -345,11 +347,24 @@ public class ExtensionList extends AbstractList implements OnMaster { if (extensions == null) return false; // not yet loaded. when we load it, we'll load everything visible by then, so no work needed - Collection> found = load(delta); - if (!found.isEmpty()) { - List> l = new ArrayList<>(extensions); - l.addAll(found); - extensions = sort(l); + Collection> newComponents = load(delta); + if (!newComponents.isEmpty()) { + List> components = new ArrayList<>(extensions); + Set instances = Collections.newSetFromMap(new IdentityHashMap<>()); + for (ExtensionComponent component : components) { + instances.add(component.getInstance()); + } + // We check to ensure that we do not insert duplicate instances of already-loaded extensions into the list. + // This can happen when dynamically loading a plugin with an extension A that itself loads another + // extension B from the same plugin in some contexts, such as in A's constructor or via a method in A called + // by an ExtensionListListener. In those cases, ExtensionList.refresh may be called on a list that already + // includes the new extensions. + for (ExtensionComponent newComponent : newComponents) { + if (instances.add(newComponent.getInstance())) { + components.add(newComponent); + } + } + extensions = sort(new ArrayList<>(components)); return true; } } From 4b330592811f04a81373878960e1dcca3563185a Mon Sep 17 00:00:00 2001 From: Devin Nusbaum Date: Tue, 18 Feb 2025 13:47:39 -0500 Subject: [PATCH 37/99] [JENKINS-75232] Use RJR SyntheticPlugin for test and cover constructor-related case --- test/plugins/README.md | 2 - .../pom.xml | 29 --------- .../src/main/resources/index.jelly | 4 -- test/pom.xml | 14 ++++- .../java/hudson/ExtensionListRjrTest.java | 56 ++++++++++++++++++ .../CustomExtensionLoadedViaConstructor.java | 14 +++++ .../CustomExtensionLoadedViaListener.java} | 10 ++-- .../CustomPeriodicWork.java | 7 ++- .../package-info.java | 4 ++ .../extension-list-listener-dynamic-load.hpi | Bin 6703 -> 0 bytes 10 files changed, 96 insertions(+), 44 deletions(-) delete mode 100644 test/plugins/README.md delete mode 100644 test/plugins/extension-list-listener-dynamic-load/pom.xml delete mode 100644 test/plugins/extension-list-listener-dynamic-load/src/main/resources/index.jelly create mode 100644 test/src/test/java/hudson/ExtensionListRjrTest.java create mode 100644 test/src/test/java/jenkins/plugins/dynamic_extension_loading/CustomExtensionLoadedViaConstructor.java rename test/{plugins/extension-list-listener-dynamic-load/src/main/java/io/jenkins/plugins/extension_list_listener_dynamic_load/CustomExtension.java => src/test/java/jenkins/plugins/dynamic_extension_loading/CustomExtensionLoadedViaListener.java} (54%) rename test/{plugins/extension-list-listener-dynamic-load/src/main/java/io/jenkins/plugins/extension_list_listener_dynamic_load => src/test/java/jenkins/plugins/dynamic_extension_loading}/CustomPeriodicWork.java (69%) create mode 100644 test/src/test/java/jenkins/plugins/dynamic_extension_loading/package-info.java delete mode 100644 test/src/test/resources/plugins/extension-list-listener-dynamic-load.hpi diff --git a/test/plugins/README.md b/test/plugins/README.md deleted file mode 100644 index d950346dce..0000000000 --- a/test/plugins/README.md +++ /dev/null @@ -1,2 +0,0 @@ -Directory containing plugin sources for tests. -The generated hpi should be manually copied into src/test/resources/plugins/ when needed. diff --git a/test/plugins/extension-list-listener-dynamic-load/pom.xml b/test/plugins/extension-list-listener-dynamic-load/pom.xml deleted file mode 100644 index 64357841c4..0000000000 --- a/test/plugins/extension-list-listener-dynamic-load/pom.xml +++ /dev/null @@ -1,29 +0,0 @@ - - 4.0.0 - - org.jenkins-ci.plugins - plugin - 5.6 - - - io.jenkins.plugins - extension-list-listener-dynamic-load - 0.1-SNAPSHOT - hpi - - ExtensionListListenerTest#checkDynamicLoad_singleRegistration - - - - repo.jenkins-ci.org - https://repo.jenkins-ci.org/public/ - - - - - repo.jenkins-ci.org - https://repo.jenkins-ci.org/public/ - - - - diff --git a/test/plugins/extension-list-listener-dynamic-load/src/main/resources/index.jelly b/test/plugins/extension-list-listener-dynamic-load/src/main/resources/index.jelly deleted file mode 100644 index 3cb56850e4..0000000000 --- a/test/plugins/extension-list-listener-dynamic-load/src/main/resources/index.jelly +++ /dev/null @@ -1,4 +0,0 @@ - -
-A simple test plugin that loads an extension from within the context of a ExtensionListListener.onChange method. -
diff --git a/test/pom.xml b/test/pom.xml index 005b151c19..eddecac69c 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -92,6 +92,13 @@ THE SOFTWARE. plugin-util-api 5.1.0 + + org.jenkins-ci.main + jenkins-test-harness + + 2397.ve8774ea_1dd39 + test + org.jenkins-ci.plugins ant @@ -178,7 +185,6 @@ THE SOFTWARE. org.jenkins-ci.main jenkins-test-harness - 2391.v9b_3e2d3351a_2 test @@ -257,6 +263,12 @@ THE SOFTWARE. 338.v848422169819 test + + org.jenkins-ci.plugins + variant + 70.va_d9f17f859e0 + test + org.junit.jupiter junit-jupiter diff --git a/test/src/test/java/hudson/ExtensionListRjrTest.java b/test/src/test/java/hudson/ExtensionListRjrTest.java new file mode 100644 index 0000000000..d458ceedcd --- /dev/null +++ b/test/src/test/java/hudson/ExtensionListRjrTest.java @@ -0,0 +1,56 @@ +package hudson; + +import static org.junit.Assert.assertNotNull; + +import jenkins.model.Jenkins; +import jenkins.plugins.dynamic_extension_loading.CustomExtensionLoadedViaConstructor; +import jenkins.plugins.dynamic_extension_loading.CustomExtensionLoadedViaListener; +import jenkins.plugins.dynamic_extension_loading.CustomPeriodicWork; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; +import org.jvnet.hudson.test.JenkinsRule; +import org.jvnet.hudson.test.RealJenkinsRule; + +public class ExtensionListRjrTest { + @Rule + public RealJenkinsRule rjr = new RealJenkinsRule(); + + @Rule + public TemporaryFolder temp = new TemporaryFolder(); + + /** + * Check that dynamically loading a plugin does not lead to extension lists with duplicate entries. + * In particular we test extensions that load other extensions in their constructors and extensions that have + * methods that load other extensions and which are called by an {@link ExtensionListListener}. + */ + @Test + public void checkDynamicLoad_singleRegistration() throws Throwable { + var shortName = "dynamic-extension-loading"; + var pluginJpi = temp.newFile(shortName + ".jpi"); + var fqcn1 = CustomExtensionLoadedViaListener.class.getName(); + var fqcn2 = CustomExtensionLoadedViaConstructor.class.getName(); + rjr.then(r -> { + RealJenkinsRule.createSyntheticPlugin(CustomPeriodicWork.class.getPackage()) + .shortName(shortName) + .header("Plugin-Dependencies", "variant:0") + .writeTo(pluginJpi, Jenkins.getVersion().toString()); + r.jenkins.pluginManager.dynamicLoad(pluginJpi); + assertSingleton(r, fqcn1); + assertSingleton(r, fqcn2); + }); + } + + private static void assertSingleton(JenkinsRule r, String fqcn) throws Exception { + var clazz = r.jenkins.pluginManager.uberClassLoader.loadClass(fqcn); + try { + assertNotNull(ExtensionList.lookupSingleton(clazz)); + } catch (Throwable t) { + var list = ExtensionList.lookup(clazz).stream().map(e -> + // TODO: Objects.toIdentityString in Java 19+ + e.getClass().getName() + "@" + Integer.toHexString(System.identityHashCode(e))).toList(); + System.out.println("Duplicates are: " + list); + throw t; + } + } +} diff --git a/test/src/test/java/jenkins/plugins/dynamic_extension_loading/CustomExtensionLoadedViaConstructor.java b/test/src/test/java/jenkins/plugins/dynamic_extension_loading/CustomExtensionLoadedViaConstructor.java new file mode 100644 index 0000000000..bf77df5add --- /dev/null +++ b/test/src/test/java/jenkins/plugins/dynamic_extension_loading/CustomExtensionLoadedViaConstructor.java @@ -0,0 +1,14 @@ +package jenkins.plugins.dynamic_extension_loading; + +import hudson.Extension; +import java.util.logging.Level; +import java.util.logging.Logger; + +@Extension +public class CustomExtensionLoadedViaConstructor { + private static final Logger LOGGER = Logger.getLogger(CustomExtensionLoadedViaConstructor.class.getName()); + + public CustomExtensionLoadedViaConstructor() { + LOGGER.log(Level.INFO, null, new Exception("Instantiating CustomExtensionLoadedViaConstructor")); + } +} diff --git a/test/plugins/extension-list-listener-dynamic-load/src/main/java/io/jenkins/plugins/extension_list_listener_dynamic_load/CustomExtension.java b/test/src/test/java/jenkins/plugins/dynamic_extension_loading/CustomExtensionLoadedViaListener.java similarity index 54% rename from test/plugins/extension-list-listener-dynamic-load/src/main/java/io/jenkins/plugins/extension_list_listener_dynamic_load/CustomExtension.java rename to test/src/test/java/jenkins/plugins/dynamic_extension_loading/CustomExtensionLoadedViaListener.java index fd11c580c5..409350921f 100644 --- a/test/plugins/extension-list-listener-dynamic-load/src/main/java/io/jenkins/plugins/extension_list_listener_dynamic_load/CustomExtension.java +++ b/test/src/test/java/jenkins/plugins/dynamic_extension_loading/CustomExtensionLoadedViaListener.java @@ -1,16 +1,16 @@ -package io.jenkins.plugins.extension_list_listener_dynamic_load; +package jenkins.plugins.dynamic_extension_loading; import hudson.Extension; import java.util.logging.Level; import java.util.logging.Logger; @Extension -public class CustomExtension { - private static final Logger LOGGER = Logger.getLogger(CustomExtension.class.getName()); +public class CustomExtensionLoadedViaListener { + private static final Logger LOGGER = Logger.getLogger(CustomExtensionLoadedViaListener.class.getName()); public long recurrencePeriod = 120; - public CustomExtension() { - LOGGER.log(Level.INFO, null, new Exception("Instantiating CustomExtension")); + public CustomExtensionLoadedViaListener() { + LOGGER.log(Level.INFO, null, new Exception("Instantiating CustomExtensionLoadedViaListener")); } } diff --git a/test/plugins/extension-list-listener-dynamic-load/src/main/java/io/jenkins/plugins/extension_list_listener_dynamic_load/CustomPeriodicWork.java b/test/src/test/java/jenkins/plugins/dynamic_extension_loading/CustomPeriodicWork.java similarity index 69% rename from test/plugins/extension-list-listener-dynamic-load/src/main/java/io/jenkins/plugins/extension_list_listener_dynamic_load/CustomPeriodicWork.java rename to test/src/test/java/jenkins/plugins/dynamic_extension_loading/CustomPeriodicWork.java index dd2ab2ca5f..fe3f61016b 100644 --- a/test/plugins/extension-list-listener-dynamic-load/src/main/java/io/jenkins/plugins/extension_list_listener_dynamic_load/CustomPeriodicWork.java +++ b/test/src/test/java/jenkins/plugins/dynamic_extension_loading/CustomPeriodicWork.java @@ -1,4 +1,4 @@ -package io.jenkins.plugins.extension_list_listener_dynamic_load; +package jenkins.plugins.dynamic_extension_loading; import hudson.Extension; import hudson.ExtensionList; @@ -13,6 +13,7 @@ public class CustomPeriodicWork extends PeriodicWork { public CustomPeriodicWork() { LOGGER.log(Level.INFO, null, new Exception("Instantiating CustomPeriodicWork")); + ExtensionList.lookupSingleton(CustomExtensionLoadedViaConstructor.class); } @Override @@ -20,7 +21,7 @@ public class CustomPeriodicWork extends PeriodicWork { @Override public long getRecurrencePeriod() { - LOGGER.log(Level.INFO, null, new Exception("Loading CustomExtension")); - return ExtensionList.lookupSingleton(CustomExtension.class).recurrencePeriod; + LOGGER.log(Level.INFO, null, new Exception("Loading CustomExtensionLoadedViaListener")); + return ExtensionList.lookupSingleton(CustomExtensionLoadedViaListener.class).recurrencePeriod; } } diff --git a/test/src/test/java/jenkins/plugins/dynamic_extension_loading/package-info.java b/test/src/test/java/jenkins/plugins/dynamic_extension_loading/package-info.java new file mode 100644 index 0000000000..db5a09b6d7 --- /dev/null +++ b/test/src/test/java/jenkins/plugins/dynamic_extension_loading/package-info.java @@ -0,0 +1,4 @@ +@OptionalPackage(requirePlugins = "dynamic-extension-loading") +package jenkins.plugins.dynamic_extension_loading; + +import org.jenkinsci.plugins.variant.OptionalPackage; diff --git a/test/src/test/resources/plugins/extension-list-listener-dynamic-load.hpi b/test/src/test/resources/plugins/extension-list-listener-dynamic-load.hpi deleted file mode 100644 index ba78c90e6cca5fb404351d437415f3ca4a995292..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6703 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 ZG0)YN&@Z<}008Im5r3J4Sn{iP{{vEeW-R~! From 8f4f117bac52988dc2a3e11602159304bb43fd2c Mon Sep 17 00:00:00 2001 From: Jan Faracik <43062514+janfaracik@users.noreply.github.com> Date: Wed, 19 Feb 2025 15:43:50 +0000 Subject: [PATCH 38/99] Tighten up animations + improve contrast --- src/main/scss/abstracts/_theme.scss | 2 +- src/main/scss/components/_command-palette.scss | 15 +++++++-------- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/main/scss/abstracts/_theme.scss b/src/main/scss/abstracts/_theme.scss index 8368c0957b..555842288d 100644 --- a/src/main/scss/abstracts/_theme.scss +++ b/src/main/scss/abstracts/_theme.scss @@ -197,7 +197,7 @@ $semantics: ( --link-font-weight: var(--font-bold-weight); // Command Palette - --command-palette-results-backdrop-filter: saturate(1.4) blur(20px); + --command-palette-results-backdrop-filter: saturate(1.5) blur(5px); --command-palette-inset-shadow: inset 0 0 2px 2px rgb(255 255 255 / 0.1), var(--jenkins-border--subtle-shadow), diff --git a/src/main/scss/components/_command-palette.scss b/src/main/scss/components/_command-palette.scss index c2798d7645..8bec54eb62 100644 --- a/src/main/scss/components/_command-palette.scss +++ b/src/main/scss/components/_command-palette.scss @@ -3,7 +3,7 @@ $command-palette-background: color-mix( in sRGB, - var(--card-background) 90%, + var(--card-background) 92.5%, transparent ); @@ -21,18 +21,18 @@ $command-palette-background: color-mix( &::backdrop { background: var(--command-palette-backdrop-background); backdrop-filter: blur(1px); - animation: jenkins-dialog-backdrop-animate-in 0.1s linear; + animation: jenkins-dialog-backdrop-animate-in 0.075s linear; } &[open] { - animation: command-palette-animate-in 0.1s cubic-bezier(0, 0.68, 0.5, 1.5); + animation: command-palette-animate-in 0.075s cubic-bezier(0, 0.68, 0.5, 1.5); } &[closing] { - animation: command-palette-animate-out 0.1s linear; + animation: command-palette-animate-out 0.05s linear; &::backdrop { - animation: jenkins-dialog-backdrop-animate-out 0.1s linear; + animation: jenkins-dialog-backdrop-animate-out 0.05s linear; } } } @@ -54,7 +54,7 @@ $command-palette-background: color-mix( } .jenkins-command-palette__wrapper { - --inset: 14vh; + --inset: 10vh; width: 100%; height: 100%; @@ -121,7 +121,7 @@ $command-palette-background: color-mix( // If set to 0, Safari won't always show the backdrop-filter height: 1px; - transition: height var(--standard-transition); + transition: height 0.15s ease; overflow: hidden; will-change: height; } @@ -162,7 +162,6 @@ $command-palette-background: color-mix( padding: 0.625rem; border-radius: 0.5rem; color: var(--text-color) !important; - transition: var(--standard-transition); &--hover { &::before { From 85eedb7e88c38f0ae872f2f0a0c154162cf5c455 Mon Sep 17 00:00:00 2001 From: Jan Faracik <43062514+janfaracik@users.noreply.github.com> Date: Wed, 19 Feb 2025 16:11:24 +0000 Subject: [PATCH 39/99] Move to Item --- core/src/main/java/hudson/model/Item.java | 6 ++++++ core/src/main/java/hudson/model/Job.java | 6 ------ 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/core/src/main/java/hudson/model/Item.java b/core/src/main/java/hudson/model/Item.java index 838f4e6f75..dd2fd993cb 100644 --- a/core/src/main/java/hudson/model/Item.java +++ b/core/src/main/java/hudson/model/Item.java @@ -39,6 +39,7 @@ import hudson.util.Secret; import java.io.IOException; import java.util.Collection; import jenkins.model.Jenkins; +import jenkins.search.SearchGroup; import jenkins.util.SystemProperties; import jenkins.util.io.OnMaster; import org.kohsuke.stapler.StaplerRequest2; @@ -249,6 +250,11 @@ public interface Item extends PersistenceRoot, SearchableModelObject, AccessCont */ void delete() throws IOException, InterruptedException; + @Override + default SearchGroup getSearchGroup() { + return SearchGroup.get(SearchGroup.ItemSearchGroup.class); + } + PermissionGroup PERMISSIONS = new PermissionGroup(Item.class, Messages._Item_Permissions_Title()); Permission CREATE = new Permission( diff --git a/core/src/main/java/hudson/model/Job.java b/core/src/main/java/hudson/model/Job.java index 0142c63d50..2392c66aee 100644 --- a/core/src/main/java/hudson/model/Job.java +++ b/core/src/main/java/hudson/model/Job.java @@ -100,7 +100,6 @@ import jenkins.model.ProjectNamingStrategy; import jenkins.model.RunIdMigrator; import jenkins.model.lazy.LazyBuildMixIn; import jenkins.scm.RunWithSCM; -import jenkins.search.SearchGroup; import jenkins.security.HexStringConfidentialKey; import jenkins.security.stapler.StaplerNotDispatchable; import jenkins.triggers.SCMTriggerItem; @@ -527,11 +526,6 @@ public abstract class Job, RunT extends Run Date: Wed, 19 Feb 2025 11:20:29 -0500 Subject: [PATCH 40/99] [JENKINS-75232] Only fire listeners if a new component was actually added --- core/src/main/java/hudson/ExtensionList.java | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/core/src/main/java/hudson/ExtensionList.java b/core/src/main/java/hudson/ExtensionList.java index fe61224c1a..fb2eda55ce 100644 --- a/core/src/main/java/hudson/ExtensionList.java +++ b/core/src/main/java/hudson/ExtensionList.java @@ -349,23 +349,27 @@ public class ExtensionList extends AbstractList implements OnMaster { Collection> newComponents = load(delta); if (!newComponents.isEmpty()) { + // We check to ensure that we do not insert duplicate instances of already-loaded extensions into the list. + // This can happen when dynamically loading a plugin with an extension A that itself loads another + // extension B from the same plugin in some contexts, such as in A's constructor or via a method in A called + // by an ExtensionListListener. In those cases, ExtensionList.refresh may be called on a list that already + // includes the new extensions. Note that ExtensionComponent objects are always unique, even when + // ExtensionComponent.getInstance is identical, so we have to track the components and instances separately + // to handle ordinal sorting and check for dupes. List> components = new ArrayList<>(extensions); Set instances = Collections.newSetFromMap(new IdentityHashMap<>()); for (ExtensionComponent component : components) { instances.add(component.getInstance()); } - // We check to ensure that we do not insert duplicate instances of already-loaded extensions into the list. - // This can happen when dynamically loading a plugin with an extension A that itself loads another - // extension B from the same plugin in some contexts, such as in A's constructor or via a method in A called - // by an ExtensionListListener. In those cases, ExtensionList.refresh may be called on a list that already - // includes the new extensions. + boolean fireListeners = false; for (ExtensionComponent newComponent : newComponents) { if (instances.add(newComponent.getInstance())) { + fireListeners = true; components.add(newComponent); } } extensions = sort(new ArrayList<>(components)); - return true; + return fireListeners; } } return false; From 6c25f40714d1d9ccdbc2513aebc36ea6d24aec85 Mon Sep 17 00:00:00 2001 From: Devin Nusbaum Date: Wed, 19 Feb 2025 11:21:01 -0500 Subject: [PATCH 41/99] [JENKINS-75232] No need for scope in dependencyManagement --- test/pom.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/test/pom.xml b/test/pom.xml index aff4e9f390..3dfbfb256b 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -97,7 +97,6 @@ THE SOFTWARE. jenkins-test-harness 2397.ve8774ea_1dd39 - test org.jenkins-ci.plugins From b2e5e154f45fc0b1f1999cdb56ab6f7b8b1e10a1 Mon Sep 17 00:00:00 2001 From: Devin Nusbaum Date: Wed, 19 Feb 2025 11:21:30 -0500 Subject: [PATCH 42/99] [JENKINS-75232] Delete initial test --- .../test/java/hudson/ExtensionListListenerTest.java | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/test/src/test/java/hudson/ExtensionListListenerTest.java b/test/src/test/java/hudson/ExtensionListListenerTest.java index eb3a485086..4e53c5d2a6 100644 --- a/test/src/test/java/hudson/ExtensionListListenerTest.java +++ b/test/src/test/java/hudson/ExtensionListListenerTest.java @@ -24,8 +24,6 @@ package hudson; -import static org.junit.Assert.assertNotNull; - import jenkins.model.TransientActionFactory; import org.junit.Assert; import org.junit.Rule; @@ -67,15 +65,4 @@ public class ExtensionListListenerTest { onChangeCallCount++; } } - - /** - * Check that dynamically loading a plugin containing an extension that is used by an {@link ExtensionListListener} - * and that loads other extensions internally does not lead to extension lists with duplicate entries. - */ - @Test - public void checkDynamicLoad_singleRegistration() throws Throwable { - PluginManagerUtil.dynamicLoad("extension-list-listener-dynamic-load.hpi", r.jenkins); - var fqcn = "io.jenkins.plugins.extension_list_listener_dynamic_load.CustomExtension"; - assertNotNull(ExtensionList.lookupSingleton(r.jenkins.pluginManager.uberClassLoader.loadClass(fqcn))); - } } From 8af7aec33a42b8f798a4d7a87e973bb5d151fe28 Mon Sep 17 00:00:00 2001 From: Devin Nusbaum Date: Wed, 19 Feb 2025 12:51:18 -0500 Subject: [PATCH 43/99] [JENKINS-75232] Adapt to latest JTH changes --- test/pom.xml | 2 +- .../test/java/hudson/ExtensionListRjrTest.java | 15 ++++----------- 2 files changed, 5 insertions(+), 12 deletions(-) diff --git a/test/pom.xml b/test/pom.xml index 3dfbfb256b..19f5ffc8dc 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -96,7 +96,7 @@ THE SOFTWARE. org.jenkins-ci.main jenkins-test-harness - 2397.ve8774ea_1dd39 + 2399.v070266dc43f6 org.jenkins-ci.plugins diff --git a/test/src/test/java/hudson/ExtensionListRjrTest.java b/test/src/test/java/hudson/ExtensionListRjrTest.java index d458ceedcd..4402356a23 100644 --- a/test/src/test/java/hudson/ExtensionListRjrTest.java +++ b/test/src/test/java/hudson/ExtensionListRjrTest.java @@ -2,23 +2,19 @@ package hudson; import static org.junit.Assert.assertNotNull; -import jenkins.model.Jenkins; import jenkins.plugins.dynamic_extension_loading.CustomExtensionLoadedViaConstructor; import jenkins.plugins.dynamic_extension_loading.CustomExtensionLoadedViaListener; import jenkins.plugins.dynamic_extension_loading.CustomPeriodicWork; import org.junit.Rule; import org.junit.Test; -import org.junit.rules.TemporaryFolder; import org.jvnet.hudson.test.JenkinsRule; import org.jvnet.hudson.test.RealJenkinsRule; +import org.jvnet.hudson.test.RealJenkinsRule.SyntheticPlugin; public class ExtensionListRjrTest { @Rule public RealJenkinsRule rjr = new RealJenkinsRule(); - @Rule - public TemporaryFolder temp = new TemporaryFolder(); - /** * Check that dynamically loading a plugin does not lead to extension lists with duplicate entries. * In particular we test extensions that load other extensions in their constructors and extensions that have @@ -26,15 +22,12 @@ public class ExtensionListRjrTest { */ @Test public void checkDynamicLoad_singleRegistration() throws Throwable { - var shortName = "dynamic-extension-loading"; - var pluginJpi = temp.newFile(shortName + ".jpi"); + var pluginJpi = rjr.createSyntheticPlugin(new SyntheticPlugin(CustomPeriodicWork.class.getPackage()) + .shortName("dynamic-extension-loading") + .header("Plugin-Dependencies", "variant:0")); var fqcn1 = CustomExtensionLoadedViaListener.class.getName(); var fqcn2 = CustomExtensionLoadedViaConstructor.class.getName(); rjr.then(r -> { - RealJenkinsRule.createSyntheticPlugin(CustomPeriodicWork.class.getPackage()) - .shortName(shortName) - .header("Plugin-Dependencies", "variant:0") - .writeTo(pluginJpi, Jenkins.getVersion().toString()); r.jenkins.pluginManager.dynamicLoad(pluginJpi); assertSingleton(r, fqcn1); assertSingleton(r, fqcn2); From b4b60cd3e0caebfcb07280c0c706e3ef243c2cc8 Mon Sep 17 00:00:00 2001 From: Devin Nusbaum Date: Wed, 19 Feb 2025 13:24:10 -0500 Subject: [PATCH 44/99] [JENKINS-75232] Update to non-incremental version of JTH --- test/pom.xml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/test/pom.xml b/test/pom.xml index 19f5ffc8dc..ded010c9d5 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -95,8 +95,7 @@ THE SOFTWARE. org.jenkins-ci.main jenkins-test-harness - - 2399.v070266dc43f6 + 2397.v5992a_d47f025 org.jenkins-ci.plugins From d23f8bad7e79b3673d0566cd205712bd08fcd579 Mon Sep 17 00:00:00 2001 From: Devin Nusbaum Date: Wed, 19 Feb 2025 16:20:26 -0500 Subject: [PATCH 45/99] [JENKINS-75232] Still need to use OptionalExtension when using OptionalPackage --- .../CustomExtensionLoadedViaConstructor.java | 4 ++-- .../CustomExtensionLoadedViaListener.java | 4 ++-- .../plugins/dynamic_extension_loading/CustomPeriodicWork.java | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/test/src/test/java/jenkins/plugins/dynamic_extension_loading/CustomExtensionLoadedViaConstructor.java b/test/src/test/java/jenkins/plugins/dynamic_extension_loading/CustomExtensionLoadedViaConstructor.java index bf77df5add..aa268a43b1 100644 --- a/test/src/test/java/jenkins/plugins/dynamic_extension_loading/CustomExtensionLoadedViaConstructor.java +++ b/test/src/test/java/jenkins/plugins/dynamic_extension_loading/CustomExtensionLoadedViaConstructor.java @@ -1,10 +1,10 @@ package jenkins.plugins.dynamic_extension_loading; -import hudson.Extension; import java.util.logging.Level; import java.util.logging.Logger; +import org.jenkinsci.plugins.variant.OptionalExtension; -@Extension +@OptionalExtension public class CustomExtensionLoadedViaConstructor { private static final Logger LOGGER = Logger.getLogger(CustomExtensionLoadedViaConstructor.class.getName()); diff --git a/test/src/test/java/jenkins/plugins/dynamic_extension_loading/CustomExtensionLoadedViaListener.java b/test/src/test/java/jenkins/plugins/dynamic_extension_loading/CustomExtensionLoadedViaListener.java index 409350921f..acae8c68de 100644 --- a/test/src/test/java/jenkins/plugins/dynamic_extension_loading/CustomExtensionLoadedViaListener.java +++ b/test/src/test/java/jenkins/plugins/dynamic_extension_loading/CustomExtensionLoadedViaListener.java @@ -1,10 +1,10 @@ package jenkins.plugins.dynamic_extension_loading; -import hudson.Extension; import java.util.logging.Level; import java.util.logging.Logger; +import org.jenkinsci.plugins.variant.OptionalExtension; -@Extension +@OptionalExtension public class CustomExtensionLoadedViaListener { private static final Logger LOGGER = Logger.getLogger(CustomExtensionLoadedViaListener.class.getName()); diff --git a/test/src/test/java/jenkins/plugins/dynamic_extension_loading/CustomPeriodicWork.java b/test/src/test/java/jenkins/plugins/dynamic_extension_loading/CustomPeriodicWork.java index fe3f61016b..a89c180f84 100644 --- a/test/src/test/java/jenkins/plugins/dynamic_extension_loading/CustomPeriodicWork.java +++ b/test/src/test/java/jenkins/plugins/dynamic_extension_loading/CustomPeriodicWork.java @@ -1,12 +1,12 @@ package jenkins.plugins.dynamic_extension_loading; -import hudson.Extension; import hudson.ExtensionList; import hudson.model.PeriodicWork; import java.util.logging.Level; import java.util.logging.Logger; +import org.jenkinsci.plugins.variant.OptionalExtension; -@Extension +@OptionalExtension public class CustomPeriodicWork extends PeriodicWork { private static final Logger LOGGER = Logger.getLogger(CustomPeriodicWork.class.getName()); From 99b8be82e869505b4ccaccf6727b6cb97ad487d7 Mon Sep 17 00:00:00 2001 From: Devin Nusbaum Date: Thu, 20 Feb 2025 12:36:40 -0500 Subject: [PATCH 46/99] [JENKINS-75232] Update tests that were installing variant dynamically --- .../java/hudson/ExtensionListRjrTest.java | 31 ++++++++++++++ .../test/java/hudson/PluginManagerTest.java | 39 ------------------ .../hudson/cli/DisablePluginCommandTest.java | 15 +++---- .../hudson/cli/EnablePluginCommandTest.java | 2 +- .../jenkins/plugins/dependee/Dependee.java | 7 ++++ .../dependee/DependeeExtensionPoint.java | 6 +++ .../optional_depender/OptionalDepender.java | 9 ++++ .../OptionalDependerExtension.java | 9 ++++ .../test/resources/plugins/jenkins-50336.hpi | Bin 5058 -> 0 bytes test/src/test/resources/plugins/variant.hpi | Bin 10252 -> 0 bytes 10 files changed, 69 insertions(+), 49 deletions(-) create mode 100644 test/src/test/java/jenkins/plugins/dependee/Dependee.java create mode 100644 test/src/test/java/jenkins/plugins/dependee/DependeeExtensionPoint.java create mode 100644 test/src/test/java/jenkins/plugins/optional_depender/OptionalDepender.java create mode 100644 test/src/test/java/jenkins/plugins/optional_depender/OptionalDependerExtension.java delete mode 100644 test/src/test/resources/plugins/jenkins-50336.hpi delete mode 100644 test/src/test/resources/plugins/variant.hpi diff --git a/test/src/test/java/hudson/ExtensionListRjrTest.java b/test/src/test/java/hudson/ExtensionListRjrTest.java index 4402356a23..b35a8bd161 100644 --- a/test/src/test/java/hudson/ExtensionListRjrTest.java +++ b/test/src/test/java/hudson/ExtensionListRjrTest.java @@ -1,12 +1,20 @@ package hudson; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.empty; +import static org.hamcrest.Matchers.hasSize; import static org.junit.Assert.assertNotNull; +import java.util.Collection; +import jenkins.plugins.dependee.Dependee; +import jenkins.plugins.dependee.DependeeExtensionPoint; import jenkins.plugins.dynamic_extension_loading.CustomExtensionLoadedViaConstructor; import jenkins.plugins.dynamic_extension_loading.CustomExtensionLoadedViaListener; import jenkins.plugins.dynamic_extension_loading.CustomPeriodicWork; +import jenkins.plugins.optional_depender.OptionalDepender; 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.RealJenkinsRule; import org.jvnet.hudson.test.RealJenkinsRule.SyntheticPlugin; @@ -21,6 +29,7 @@ public class ExtensionListRjrTest { * methods that load other extensions and which are called by an {@link ExtensionListListener}. */ @Test + @Issue("JENKINS-75232") public void checkDynamicLoad_singleRegistration() throws Throwable { var pluginJpi = rjr.createSyntheticPlugin(new SyntheticPlugin(CustomPeriodicWork.class.getPackage()) .shortName("dynamic-extension-loading") @@ -46,4 +55,26 @@ public class ExtensionListRjrTest { throw t; } } + + @Test + @Issue({ "JENKINS-50336", "JENKINS-60449" }) + public void installDependedOptionalPluginWithoutRestart() throws Throwable { + var optionalDependerJpi = rjr.createSyntheticPlugin(new SyntheticPlugin(OptionalDepender.class.getPackage()) + .header("Plugin-Dependencies", "variant:0,dependee:0;resolution:=optional")); + var dependeeJpi = rjr.createSyntheticPlugin(new SyntheticPlugin(Dependee.class.getPackage()).shortName("dependee")); + var fqcn1 = OptionalDepender.class.getName(); + var fqcn2 = DependeeExtensionPoint.class.getName(); + rjr.then(r -> { + // Load optional-depender. + r.jenkins.pluginManager.dynamicLoad(optionalDependerJpi); + // JENKINS-60449: Extension depending on dependee class isn't loaded + assertThat((Collection) r.jenkins.getExtensionList(fqcn1), empty()); + // Load dependee. + r.jenkins.pluginManager.dynamicLoad(dependeeJpi); + // JENKINS-60449: Classes in depender are loaded prior to OptionalDepender being loaded. + assertThat((Collection) r.jenkins.getExtensionList(fqcn1), hasSize(1)); + // JENKINS-50336: Extension point from dependee now includes optional extension from optional-depender + assertThat((Collection) r.jenkins.getExtensionList(fqcn2), hasSize(1)); + }); + } } diff --git a/test/src/test/java/hudson/PluginManagerTest.java b/test/src/test/java/hudson/PluginManagerTest.java index ec25bc96a3..d4bcc4e9bf 100644 --- a/test/src/test/java/hudson/PluginManagerTest.java +++ b/test/src/test/java/hudson/PluginManagerTest.java @@ -86,7 +86,6 @@ import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; import jenkins.ClassLoaderReflectionToolkit; import jenkins.RestartRequiredException; -import jenkins.model.GlobalConfiguration; import jenkins.model.Jenkins; import net.sf.json.JSONArray; import net.sf.json.JSONObject; @@ -389,28 +388,6 @@ public class PluginManagerTest { assertEquals(1, r.jenkins.getExtensionList("org.jenkinsci.plugins.dependencytest.depender.DependerExtension").size()); } - /** - * Load "optional-depender" and then load "dependee". - * Asserts that "depender" can access to "dependee". - */ - @Issue("JENKINS-60449") - @WithPlugin("variant.hpi") - @Test public void installDependedOptionalPluginWithoutRestart() throws Exception { - // Load optional-depender. - { - dynamicLoad("optional-depender-0.0.2.hpi"); - } - // Extension depending on dependee class isn't loaded - assertTrue(r.jenkins.getExtensionList("org.jenkinsci.plugins.dependencytest.optionaldepender.OptionalDependerExtension").isEmpty()); - // Load dependee. - { - dynamicLoad("dependee-0.0.2.hpi"); - } - - // Extensions in depender are loaded. - assertEquals(1, r.jenkins.getExtensionList("org.jenkinsci.plugins.dependencytest.optionaldepender.OptionalDependerExtension").size()); - } - @Issue("JENKINS-21486") @Test public void installPluginWithObsoleteDependencyFails() throws Exception { // Load dependee 0.0.1. @@ -611,22 +588,6 @@ public class PluginManagerTest { assertEquals(fromPlugin, fromToolkit); } - // Sources for jenkins-50336.hpi are available at https://github.com/Vlatombe/jenkins-50336 - // - // package io.jenkins.plugins; - // import org.jenkinsci.plugins.variant.OptionalExtension; - // import jenkins.model.GlobalConfiguration; - // @OptionalExtension public class MyGlobalConfiguration extends GlobalConfiguration {} - // - @Issue("JENKINS-50336") - @Test - public void optionalExtensionCanBeFoundAfterDynamicLoadOfVariant() throws Exception { - dynamicLoad("variant.hpi"); - assertNotNull(r.jenkins.getPluginManager().getPlugin("variant")); - dynamicLoad("jenkins-50336.hpi"); - assertTrue(ExtensionList.lookup(GlobalConfiguration.class).stream().anyMatch(gc -> "io.jenkins.plugins.MyGlobalConfiguration".equals(gc.getClass().getName()))); - } - @Test @Issue("JENKINS-64840") @WithPlugin({"mandatory-depender-0.0.2.hpi", "dependee-0.0.2.hpi", "depender-0.0.2.hpi"}) public void getPluginsSortedByTitle() throws Exception { diff --git a/test/src/test/java/hudson/cli/DisablePluginCommandTest.java b/test/src/test/java/hudson/cli/DisablePluginCommandTest.java index 220998236b..b4a4f5f49c 100644 --- a/test/src/test/java/hudson/cli/DisablePluginCommandTest.java +++ b/test/src/test/java/hudson/cli/DisablePluginCommandTest.java @@ -190,11 +190,10 @@ public class DisablePluginCommandTest { @Ignore("TODO calling restart seems to break Surefire") @Test @Issue("JENKINS-27177") - @WithPlugin({"variant.hpi", "depender-0.0.2.hpi", "mandatory-depender-0.0.2.hpi", "plugin-first.hpi", "dependee-0.0.2.hpi"}) + @WithPlugin({"depender-0.0.2.hpi", "mandatory-depender-0.0.2.hpi", "plugin-first.hpi", "dependee-0.0.2.hpi"}) public void restartAfterDisablePluginsAndErrors() { assumeNotWindows(); - assertThat(disablePluginsCLiCommand("-restart", "variant", "dependee", "depender", "plugin-first", "mandatory-depender"), failedWith(RETURN_CODE_NOT_DISABLED_DEPENDANTS)); - assertPluginDisabled("variant"); + assertThat(disablePluginsCLiCommand("-restart", "dependee", "depender", "plugin-first", "mandatory-depender"), failedWith(RETURN_CODE_NOT_DISABLED_DEPENDANTS)); assertPluginEnabled("dependee"); assertPluginDisabled("depender"); assertPluginDisabled("plugin-first"); @@ -207,13 +206,12 @@ public class DisablePluginCommandTest { */ @Test @Issue("JENKINS-27177") - @WithPlugin({"variant.hpi", "depender-0.0.2.hpi", "mandatory-depender-0.0.2.hpi", "plugin-first.hpi", "dependee-0.0.2.hpi"}) + @WithPlugin({"depender-0.0.2.hpi", "mandatory-depender-0.0.2.hpi", "plugin-first.hpi", "dependee-0.0.2.hpi"}) public void disablePluginsStrategyAll() { assertPluginEnabled("dependee"); assertPluginEnabled("depender"); assertPluginEnabled("mandatory-depender"); - assertThat(disablePluginsCLiCommand("-strategy", "all", "variant", "dependee", "plugin-first"), succeeded()); - assertPluginDisabled("variant"); + assertThat(disablePluginsCLiCommand("-strategy", "all", "dependee", "plugin-first"), succeeded()); assertPluginDisabled("dependee"); assertPluginDisabled("depender"); assertPluginDisabled("plugin-first"); @@ -225,10 +223,9 @@ public class DisablePluginCommandTest { */ @Test @Issue("JENKINS-27177") - @WithPlugin({"variant.hpi", "depender-0.0.2.hpi", "mandatory-depender-0.0.2.hpi", "plugin-first.hpi", "dependee-0.0.2.hpi"}) + @WithPlugin({"depender-0.0.2.hpi", "mandatory-depender-0.0.2.hpi", "plugin-first.hpi", "dependee-0.0.2.hpi"}) public void disablePluginsStrategyMandatory() { - assertThat(disablePluginsCLiCommand("-strategy", "mandatory", "variant", "dependee", "plugin-first"), succeeded()); - assertPluginDisabled("variant"); + assertThat(disablePluginsCLiCommand("-strategy", "mandatory", "dependee", "plugin-first"), succeeded()); assertPluginDisabled("dependee"); assertPluginEnabled("depender"); assertPluginDisabled("plugin-first"); diff --git a/test/src/test/java/hudson/cli/EnablePluginCommandTest.java b/test/src/test/java/hudson/cli/EnablePluginCommandTest.java index e80b5e76b5..85d5c43aba 100644 --- a/test/src/test/java/hudson/cli/EnablePluginCommandTest.java +++ b/test/src/test/java/hudson/cli/EnablePluginCommandTest.java @@ -139,7 +139,7 @@ public class EnablePluginCommandTest { @Issue("JENKINS-52950") public void enableNoPluginsWithRestartIsNoOp() { assumeNotWindows(); - String name = "variant"; + String name = "icon-shim"; assertThat(installTestPlugin(name), succeeded()); assertThat(enablePlugins("-restart", name), succeeded()); assertJenkinsNotInQuietMode(); diff --git a/test/src/test/java/jenkins/plugins/dependee/Dependee.java b/test/src/test/java/jenkins/plugins/dependee/Dependee.java new file mode 100644 index 0000000000..3e795950f9 --- /dev/null +++ b/test/src/test/java/jenkins/plugins/dependee/Dependee.java @@ -0,0 +1,7 @@ +package jenkins.plugins.dependee; + +public class Dependee { + public static String getValue() { + return "dependee"; + } +} diff --git a/test/src/test/java/jenkins/plugins/dependee/DependeeExtensionPoint.java b/test/src/test/java/jenkins/plugins/dependee/DependeeExtensionPoint.java new file mode 100644 index 0000000000..3dd7c7bde2 --- /dev/null +++ b/test/src/test/java/jenkins/plugins/dependee/DependeeExtensionPoint.java @@ -0,0 +1,6 @@ +package jenkins.plugins.dependee; + +import hudson.ExtensionPoint; + +public class DependeeExtensionPoint implements ExtensionPoint { +} diff --git a/test/src/test/java/jenkins/plugins/optional_depender/OptionalDepender.java b/test/src/test/java/jenkins/plugins/optional_depender/OptionalDepender.java new file mode 100644 index 0000000000..95e4c61591 --- /dev/null +++ b/test/src/test/java/jenkins/plugins/optional_depender/OptionalDepender.java @@ -0,0 +1,9 @@ +package jenkins.plugins.optional_depender; + +import jenkins.plugins.dependee.Dependee; +import org.jenkinsci.plugins.variant.OptionalExtension; + +@OptionalExtension(requirePlugins = "dependee") +public class OptionalDepender { + private static void foo(Dependee d) {} +} diff --git a/test/src/test/java/jenkins/plugins/optional_depender/OptionalDependerExtension.java b/test/src/test/java/jenkins/plugins/optional_depender/OptionalDependerExtension.java new file mode 100644 index 0000000000..64f5ef386a --- /dev/null +++ b/test/src/test/java/jenkins/plugins/optional_depender/OptionalDependerExtension.java @@ -0,0 +1,9 @@ +package jenkins.plugins.optional_depender; + +import jenkins.plugins.dependee.DependeeExtensionPoint; +import org.jenkinsci.plugins.variant.OptionalExtension; + +@OptionalExtension(requirePlugins = "dependee") +public class OptionalDependerExtension extends DependeeExtensionPoint { + +} diff --git a/test/src/test/resources/plugins/jenkins-50336.hpi b/test/src/test/resources/plugins/jenkins-50336.hpi deleted file mode 100644 index 03578c6c8c9f620adc834ab3ed624f0edf7bd781..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5058 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 Date: Sun, 23 Feb 2025 14:52:50 +0530 Subject: [PATCH 47/99] Added empty state for no old data --- .../diagnosis/OldDataMonitor/manage.jelly | 85 ++++++++++--------- 1 file changed, 44 insertions(+), 41 deletions(-) diff --git a/core/src/main/resources/hudson/diagnosis/OldDataMonitor/manage.jelly b/core/src/main/resources/hudson/diagnosis/OldDataMonitor/manage.jelly index 1bcd7dce1f..46e7e161a5 100644 --- a/core/src/main/resources/hudson/diagnosis/OldDataMonitor/manage.jelly +++ b/core/src/main/resources/hudson/diagnosis/OldDataMonitor/manage.jelly @@ -31,44 +31,50 @@ THE SOFTWARE.

${%Manage Old Data}

${%blurb.1}

${%blurb.2}

- - - - - - - - - - - - - - - - - - - - - - - - - - - - -
${%Type}${%Name}${%Version}${%Error}
${obj.class.name}${obj.fullName?:obj.fullDisplayName?:obj.displayName?:obj.name} - - - ${item.value} - - - ${item.value} - - - ${item.value.extra}
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
${%Type}${%Name}${%Version}${%Error}
${obj.class.name}${obj.fullName?:obj.fullDisplayName?:obj.displayName?:obj.name} + + + ${item.value} + + + ${item.value} + + + ${item.value.extra}
+
+ + + + @@ -87,9 +93,6 @@ THE SOFTWARE. - - ${%No old data was found.} -
From a29bd84ff8bbb7f0f14ad757c4c0d27d958f162e Mon Sep 17 00:00:00 2001 From: SohamJuneja Date: Sun, 23 Feb 2025 17:27:15 +0530 Subject: [PATCH 48/99] polishing jelly file --- .../diagnosis/OldDataMonitor/manage.jelly | 88 ++++++++++--------- 1 file changed, 45 insertions(+), 43 deletions(-) diff --git a/core/src/main/resources/hudson/diagnosis/OldDataMonitor/manage.jelly b/core/src/main/resources/hudson/diagnosis/OldDataMonitor/manage.jelly index 46e7e161a5..b580f5935f 100644 --- a/core/src/main/resources/hudson/diagnosis/OldDataMonitor/manage.jelly +++ b/core/src/main/resources/hudson/diagnosis/OldDataMonitor/manage.jelly @@ -31,49 +31,51 @@ THE SOFTWARE.

${%Manage Old Data}

${%blurb.1}

${%blurb.2}

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
${%Type}${%Name}${%Version}${%Error}
${obj.class.name}${obj.fullName?:obj.fullDisplayName?:obj.displayName?:obj.name} - - - ${item.value} - - - ${item.value} - - - ${item.value.extra}
-
- - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
${%Type}${%Name}${%Version}${%Error}
${obj.class.name}${obj.fullName?:obj.fullDisplayName?:obj.displayName?:obj.name} + + + ${item.value} + + + ${item.value} + + + ${item.value.extra}
+
+ + + +
From 1fe8d924b1c48ab56c0fd480d14ba5654a2ac394 Mon Sep 17 00:00:00 2001 From: SohamJuneja Date: Sun, 23 Feb 2025 17:39:41 +0530 Subject: [PATCH 49/99] use if instead of otherwise --- .../resources/hudson/diagnosis/OldDataMonitor/manage.jelly | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/main/resources/hudson/diagnosis/OldDataMonitor/manage.jelly b/core/src/main/resources/hudson/diagnosis/OldDataMonitor/manage.jelly index b580f5935f..2b9bb5cd25 100644 --- a/core/src/main/resources/hudson/diagnosis/OldDataMonitor/manage.jelly +++ b/core/src/main/resources/hudson/diagnosis/OldDataMonitor/manage.jelly @@ -72,9 +72,9 @@ THE SOFTWARE. - + - +
From d54f35b07cc51c57fa7896bbce85f8c72d55696d Mon Sep 17 00:00:00 2001 From: SohamJuneja Date: Sun, 23 Feb 2025 19:26:43 +0530 Subject: [PATCH 50/99] Minor changes to file --- .../diagnosis/OldDataMonitor/manage.jelly | 38 +++++++++---------- 1 file changed, 18 insertions(+), 20 deletions(-) diff --git a/core/src/main/resources/hudson/diagnosis/OldDataMonitor/manage.jelly b/core/src/main/resources/hudson/diagnosis/OldDataMonitor/manage.jelly index 2b9bb5cd25..2088a04aa6 100644 --- a/core/src/main/resources/hudson/diagnosis/OldDataMonitor/manage.jelly +++ b/core/src/main/resources/hudson/diagnosis/OldDataMonitor/manage.jelly @@ -72,30 +72,28 @@ THE SOFTWARE. - + - + - - -

${%Old Data Format}

-

${%blurb.3}

-

${%blurb.4}

-
- ${%Resave data files with structure changes no newer than Jenkins} - - ${%blurb.5} -
- - -
-
+ +

${%Old Data Format}

+

${%blurb.3}

+

${%blurb.4}

+
+ ${%Resave data files with structure changes no newer than Jenkins} + + ${%blurb.5} +
+ + +

${%Unreadable Data}

From 42351c9e26490fab659841ed58ae9cd60a7c937d Mon Sep 17 00:00:00 2001 From: SohamJuneja Date: Mon, 24 Feb 2025 09:10:55 +0530 Subject: [PATCH 51/99] Added an initial loop to check data validity --- .../diagnosis/OldDataMonitor/manage.jelly | 57 ++++++++++--------- 1 file changed, 31 insertions(+), 26 deletions(-) diff --git a/core/src/main/resources/hudson/diagnosis/OldDataMonitor/manage.jelly b/core/src/main/resources/hudson/diagnosis/OldDataMonitor/manage.jelly index 2088a04aa6..0b2676aab9 100644 --- a/core/src/main/resources/hudson/diagnosis/OldDataMonitor/manage.jelly +++ b/core/src/main/resources/hudson/diagnosis/OldDataMonitor/manage.jelly @@ -22,7 +22,6 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --> - @@ -31,8 +30,20 @@ THE SOFTWARE.

${%Manage Old Data}

${%blurb.1}

${%blurb.2}

+ + + + + + + + + + + + - + @@ -44,30 +55,24 @@ THE SOFTWARE. - - - - - - - - - - - - - - - + + + + + + + + +
${obj.class.name}${obj.fullName?:obj.fullDisplayName?:obj.displayName?:obj.name} - - - ${item.value} - - - ${item.value} - - - ${item.value.extra}
${obj.class.name}${obj.fullName?:obj.fullDisplayName?:obj.displayName?:obj.name} + + + ${item.value} + + + ${item.value} + + + ${item.value.extra}
From f17cffd9fc507de8d4e64585016ba553dc17a5bc Mon Sep 17 00:00:00 2001 From: SohamJuneja Date: Mon, 24 Feb 2025 17:45:24 +0530 Subject: [PATCH 52/99] fix display condition for notice --- .../diagnosis/OldDataMonitor/manage.jelly | 70 ++++++++++--------- 1 file changed, 36 insertions(+), 34 deletions(-) diff --git a/core/src/main/resources/hudson/diagnosis/OldDataMonitor/manage.jelly b/core/src/main/resources/hudson/diagnosis/OldDataMonitor/manage.jelly index 0b2676aab9..ba452256f8 100644 --- a/core/src/main/resources/hudson/diagnosis/OldDataMonitor/manage.jelly +++ b/core/src/main/resources/hudson/diagnosis/OldDataMonitor/manage.jelly @@ -43,42 +43,44 @@ THE SOFTWARE. - - - - - - - - - - - - - - - - - - - - - - - -
${%Type}${%Name}${%Version}${%Error}
${obj.class.name}${obj.fullName?:obj.fullDisplayName?:obj.displayName?:obj.name} - - - ${item.value} - - - ${item.value} - - - ${item.value.extra}
+ + - + + + + + + + + + + + + + + + + + + + + + + + +
${%Type}${%Name}${%Version}${%Error}
${obj.class.name}${obj.fullName?:obj.fullDisplayName?:obj.displayName?:obj.name} + + + ${item.value} + + + ${item.value} + + + ${item.value.extra}
+
From 6b5196429cfb9dceb3c6202f54b7693f352f0d8f Mon Sep 17 00:00:00 2001 From: SohamJuneja Date: Tue, 25 Feb 2025 00:57:42 +0530 Subject: [PATCH 53/99] updated manage.jelly --- .../main/resources/hudson/diagnosis/OldDataMonitor/manage.jelly | 1 + 1 file changed, 1 insertion(+) diff --git a/core/src/main/resources/hudson/diagnosis/OldDataMonitor/manage.jelly b/core/src/main/resources/hudson/diagnosis/OldDataMonitor/manage.jelly index ba452256f8..102919b015 100644 --- a/core/src/main/resources/hudson/diagnosis/OldDataMonitor/manage.jelly +++ b/core/src/main/resources/hudson/diagnosis/OldDataMonitor/manage.jelly @@ -22,6 +22,7 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --> + From 86ffb0088f43ea5bbf496b15cf585623eb463294 Mon Sep 17 00:00:00 2001 From: SohamJuneja Date: Tue, 25 Feb 2025 04:10:58 +0530 Subject: [PATCH 54/99] removed text and dot --- .../main/resources/hudson/diagnosis/OldDataMonitor/manage.jelly | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/resources/hudson/diagnosis/OldDataMonitor/manage.jelly b/core/src/main/resources/hudson/diagnosis/OldDataMonitor/manage.jelly index 102919b015..88d6e651ae 100644 --- a/core/src/main/resources/hudson/diagnosis/OldDataMonitor/manage.jelly +++ b/core/src/main/resources/hudson/diagnosis/OldDataMonitor/manage.jelly @@ -45,7 +45,7 @@ THE SOFTWARE. - + From f97721e1fbc09fd77a81eed0ed9e064d8a38d95e Mon Sep 17 00:00:00 2001 From: SohamJuneja Date: Tue, 25 Feb 2025 20:55:54 +0530 Subject: [PATCH 55/99] changed title --- .../main/resources/hudson/diagnosis/OldDataMonitor/manage.jelly | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/resources/hudson/diagnosis/OldDataMonitor/manage.jelly b/core/src/main/resources/hudson/diagnosis/OldDataMonitor/manage.jelly index 88d6e651ae..c2180cf443 100644 --- a/core/src/main/resources/hudson/diagnosis/OldDataMonitor/manage.jelly +++ b/core/src/main/resources/hudson/diagnosis/OldDataMonitor/manage.jelly @@ -45,7 +45,7 @@ THE SOFTWARE. - + From 84ef1a4d4db17d0ce66522d0141f6e52e2a4c97c Mon Sep 17 00:00:00 2001 From: Daniel Beck Date: Tue, 25 Feb 2025 16:17:26 +0000 Subject: [PATCH 56/99] [SECURITY-3498] --- core/src/main/java/jenkins/model/Jenkins.java | 1 + core/src/main/resources/lib/hudson/executors.jelly | 4 +++- core/src/main/resources/lib/layout/pane.jelly | 4 +++- test/src/test/java/hudson/model/ComputerSetTest.java | 2 +- test/src/test/java/hudson/model/ComputerTest.java | 2 +- test/src/test/java/jenkins/model/JenkinsTest.java | 11 +++++++++++ test/src/test/java/lib/layout/AjaxTest.java | 4 ++-- 7 files changed, 22 insertions(+), 6 deletions(-) diff --git a/core/src/main/java/jenkins/model/Jenkins.java b/core/src/main/java/jenkins/model/Jenkins.java index 73ba937696..d246e60e30 100644 --- a/core/src/main/java/jenkins/model/Jenkins.java +++ b/core/src/main/java/jenkins/model/Jenkins.java @@ -4165,6 +4165,7 @@ public class Jenkins extends AbstractCIBase implements DirectlyModifiableTopLeve return new HttpRedirect("."); } + @POST public HttpResponse doToggleCollapse() throws ServletException, IOException { final StaplerRequest2 request = Stapler.getCurrentRequest2(); final String paneId = request.getParameter("paneId"); diff --git a/core/src/main/resources/lib/hudson/executors.jelly b/core/src/main/resources/lib/hudson/executors.jelly index 2c2b48159b..ef602de8c0 100644 --- a/core/src/main/resources/lib/hudson/executors.jelly +++ b/core/src/main/resources/lib/hudson/executors.jelly @@ -174,7 +174,9 @@ THE SOFTWARE. ${executorDetails} -
+ + diff --git a/core/src/main/resources/lib/layout/pane.jelly b/core/src/main/resources/lib/layout/pane.jelly index e7c4a04a82..b88c42df1b 100644 --- a/core/src/main/resources/lib/layout/pane.jelly +++ b/core/src/main/resources/lib/layout/pane.jelly @@ -59,7 +59,9 @@ THE SOFTWARE. - + + diff --git a/test/src/test/java/hudson/model/ComputerSetTest.java b/test/src/test/java/hudson/model/ComputerSetTest.java index e137cbfec8..2a091ca784 100644 --- a/test/src/test/java/hudson/model/ComputerSetTest.java +++ b/test/src/test/java/hudson/model/ComputerSetTest.java @@ -173,7 +173,7 @@ public class ComputerSetTest { new OfflineCause.ChannelTermination(new RuntimeException(message)) ); - WebClient wc = j.createWebClient(); + WebClient wc = j.createWebClient().withJavaScriptEnabled(false); Page page = wc.getPage(wc.createCrumbedUrl(HasWidgetHelper.getWidget(j.jenkins.getComputer(), ExecutorsWidget.class).orElseThrow().getUrl() + "ajax")); String content = page.getWebResponse().getContentAsString(); assertThat(content, not(containsString(message))); diff --git a/test/src/test/java/hudson/model/ComputerTest.java b/test/src/test/java/hudson/model/ComputerTest.java index 3acac9b9fc..ee0cf8a686 100644 --- a/test/src/test/java/hudson/model/ComputerTest.java +++ b/test/src/test/java/hudson/model/ComputerTest.java @@ -285,7 +285,7 @@ public class ComputerTest { new OfflineCause.ChannelTermination(new RuntimeException(message)) ); - WebClient wc = j.createWebClient(); + WebClient wc = j.createWebClient().withJavaScriptEnabled(false); Page page = wc.getPage(wc.createCrumbedUrl(HasWidgetHelper.getWidget(agent.toComputer(), ExecutorsWidget.class).orElseThrow().getUrl() + "ajax")); String content = page.getWebResponse().getContentAsString(); assertThat(content, not(containsString(message))); diff --git a/test/src/test/java/jenkins/model/JenkinsTest.java b/test/src/test/java/jenkins/model/JenkinsTest.java index acef3b6a23..f4a5b37616 100644 --- a/test/src/test/java/jenkins/model/JenkinsTest.java +++ b/test/src/test/java/jenkins/model/JenkinsTest.java @@ -72,6 +72,7 @@ import hudson.slaves.OfflineCause; import hudson.util.FormValidation; import hudson.util.HttpResponses; import hudson.util.VersionNumber; +import jakarta.servlet.http.HttpServletResponse; import java.io.File; import java.io.IOException; import java.net.HttpURLConnection; @@ -130,6 +131,16 @@ public class JenkinsTest { @Rule public TemporaryFolder tmp = new TemporaryFolder(); + @Test + @Issue("SECURITY-3498") + public void testPaneToggleCollapse() throws Exception { + try (WebClient wc = j.createWebClient()) { + final FailingHttpStatusCodeException ex = assertThrows(FailingHttpStatusCodeException.class, () -> wc.goTo("toggleCollapse?paneId=foo")); + // @POST responds 404 when the verb is wrong; @RequirePOST would respond 405. + assertThat(ex.getStatusCode(), is(HttpServletResponse.SC_NOT_FOUND)); + } + } + @Test @Issue("SECURITY-3073") public void verifyUploadedFingerprintFilePermission() throws Exception { diff --git a/test/src/test/java/lib/layout/AjaxTest.java b/test/src/test/java/lib/layout/AjaxTest.java index d25b4e34cd..f039d488df 100644 --- a/test/src/test/java/lib/layout/AjaxTest.java +++ b/test/src/test/java/lib/layout/AjaxTest.java @@ -61,7 +61,7 @@ public class AjaxTest { @Test @Issue("JENKINS-65288") public void ajaxPageRenderingPossibleWithoutJellyTrace() throws Exception { - JenkinsRule.WebClient wc = r.createWebClient(); + JenkinsRule.WebClient wc = r.createWebClient().withJavaScriptEnabled(false); HtmlPage htmlPage = wc.goTo(getExecutorsWidgetAjaxViewUrl()); r.assertGoodStatus(htmlPage); } @@ -76,7 +76,7 @@ public class AjaxTest { try { JellyFacet.TRACE = true; - JenkinsRule.WebClient wc = r.createWebClient(); + JenkinsRule.WebClient wc = r.createWebClient().withJavaScriptEnabled(false); HtmlPage htmlPage = wc.goTo(getExecutorsWidgetAjaxViewUrl()); r.assertGoodStatus(htmlPage); } finally { From 4a9a3ecd08fc00d2f1c1125be789d8be24f02c9e Mon Sep 17 00:00:00 2001 From: Daniel Beck Date: Tue, 25 Feb 2025 16:17:32 +0000 Subject: [PATCH 57/99] [SECURITY-3501] --- core/src/main/java/hudson/Util.java | 2 +- core/src/test/java/hudson/UtilTest.java | 6 +++- .../jenkins/security/Security3501Test.java | 33 +++++++++++++++++++ 3 files changed, 39 insertions(+), 2 deletions(-) create mode 100644 test/src/test/java/jenkins/security/Security3501Test.java diff --git a/core/src/main/java/hudson/Util.java b/core/src/main/java/hudson/Util.java index 8e9f1002f3..4783535bd8 100644 --- a/core/src/main/java/hudson/Util.java +++ b/core/src/main/java/hudson/Util.java @@ -1651,7 +1651,7 @@ public class Util { * @since 2.3 / 1.651.2 */ public static boolean isSafeToRedirectTo(@NonNull String uri) { - return !isAbsoluteUri(uri) && !uri.startsWith("//"); + return !isAbsoluteUri(uri) && !uri.startsWith("\\") && !uri.replace('\\', '/').startsWith("//"); } /** diff --git a/core/src/test/java/hudson/UtilTest.java b/core/src/test/java/hudson/UtilTest.java index ac08dccb5d..135da25628 100644 --- a/core/src/test/java/hudson/UtilTest.java +++ b/core/src/test/java/hudson/UtilTest.java @@ -416,12 +416,16 @@ public class UtilTest { } @Test - @Issue("SECURITY-276") + @Issue({"SECURITY-276", "SECURITY-3501"}) public void testIsSafeToRedirectTo() { assertFalse(Util.isSafeToRedirectTo("http://foobar/")); assertFalse(Util.isSafeToRedirectTo("mailto:kk@kohsuke.org")); assertFalse(Util.isSafeToRedirectTo("d123://test/")); assertFalse(Util.isSafeToRedirectTo("//google.com")); + assertFalse(Util.isSafeToRedirectTo("\\\\google.com")); + assertFalse(Util.isSafeToRedirectTo("\\/google.com")); + assertFalse(Util.isSafeToRedirectTo("/\\google.com")); + assertFalse(Util.isSafeToRedirectTo("\\google.com")); assertTrue(Util.isSafeToRedirectTo("foo/bar/abc:def")); assertTrue(Util.isSafeToRedirectTo("foo?abc:def")); diff --git a/test/src/test/java/jenkins/security/Security3501Test.java b/test/src/test/java/jenkins/security/Security3501Test.java new file mode 100644 index 0000000000..f266b2f4c1 --- /dev/null +++ b/test/src/test/java/jenkins/security/Security3501Test.java @@ -0,0 +1,33 @@ +package jenkins.security; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; + +import java.util.List; +import org.htmlunit.FailingHttpStatusCodeException; +import org.junit.Assert; +import org.junit.Rule; +import org.junit.Test; +import org.jvnet.hudson.test.JenkinsRule; +import org.jvnet.hudson.test.RealJenkinsRule; + +public class Security3501Test { + @Rule + public RealJenkinsRule jj = new RealJenkinsRule(); + + @Test + public void testRedirects() throws Throwable { + jj.then(Security3501Test::_testRedirects); + } + + public static void _testRedirects(JenkinsRule j) throws Exception { + List prohibitedPaths = List.of("%5C%5Cexample.org", "%5C/example.org", "/%5Cexample.org", "//example.org", "https://example.org", "\\example.org"); + for (String path : prohibitedPaths) { + try (JenkinsRule.WebClient wc = j.createWebClient().withRedirectEnabled(false)) { + final FailingHttpStatusCodeException fhsce = Assert.assertThrows(FailingHttpStatusCodeException.class, () -> wc.goTo("userContent?path=" + path)); + assertThat(fhsce.getStatusCode(), is(302)); + assertThat(fhsce.getResponse().getResponseHeaderValue("Location"), is(j.getURL().toExternalForm() + "userContent/")); + } + } + } +} From 923cdbc165e8b8523ae960dfee5f7354878532d5 Mon Sep 17 00:00:00 2001 From: Daniel Beck Date: Tue, 25 Feb 2025 16:17:38 +0000 Subject: [PATCH 58/99] [SECURITY-3495][SECURITY-3496] --- .../main/java/hudson/cli/GetNodeCommand.java | 14 +- .../main/java/hudson/cli/GetViewCommand.java | 15 +- core/src/main/java/hudson/model/Computer.java | 14 +- core/src/main/java/hudson/model/View.java | 13 +- test/src/test/java/lib/form/PasswordTest.java | 152 ++++++++++++++++++ 5 files changed, 204 insertions(+), 4 deletions(-) diff --git a/core/src/main/java/hudson/cli/GetNodeCommand.java b/core/src/main/java/hudson/cli/GetNodeCommand.java index 62dd218260..6b62729d2f 100644 --- a/core/src/main/java/hudson/cli/GetNodeCommand.java +++ b/core/src/main/java/hudson/cli/GetNodeCommand.java @@ -27,8 +27,11 @@ package hudson.cli; import hudson.Extension; import hudson.model.Computer; import hudson.model.Node; +import java.io.ByteArrayOutputStream; import java.io.IOException; +import java.nio.charset.StandardCharsets; import jenkins.model.Jenkins; +import jenkins.security.ExtendedReadRedaction; import org.kohsuke.args4j.Argument; /** @@ -52,7 +55,16 @@ public class GetNodeCommand extends CLICommand { node.checkPermission(Computer.EXTENDED_READ); - Jenkins.XSTREAM2.toXMLUTF8(node, stdout); + if (node.hasPermission(Computer.CONFIGURE)) { + Jenkins.XSTREAM2.toXMLUTF8(node, stdout); + } else { + var baos = new ByteArrayOutputStream(); + Jenkins.XSTREAM2.toXMLUTF8(node, baos); + String xml = baos.toString(StandardCharsets.UTF_8); + + xml = ExtendedReadRedaction.applyAll(xml); + org.apache.commons.io.IOUtils.write(xml, stdout, StandardCharsets.UTF_8); + } return 0; } diff --git a/core/src/main/java/hudson/cli/GetViewCommand.java b/core/src/main/java/hudson/cli/GetViewCommand.java index e94bb7947a..020b55f719 100644 --- a/core/src/main/java/hudson/cli/GetViewCommand.java +++ b/core/src/main/java/hudson/cli/GetViewCommand.java @@ -26,6 +26,9 @@ package hudson.cli; import hudson.Extension; import hudson.model.View; +import java.io.ByteArrayOutputStream; +import java.nio.charset.StandardCharsets; +import jenkins.security.ExtendedReadRedaction; import org.kohsuke.args4j.Argument; /** @@ -48,7 +51,17 @@ public class GetViewCommand extends CLICommand { protected int run() throws Exception { view.checkPermission(View.READ); - view.writeXml(stdout); + + if (view.hasPermission(View.CONFIGURE)) { + view.writeXml(stdout); + } else { + var baos = new ByteArrayOutputStream(); + view.writeXml(baos); + String xml = baos.toString(StandardCharsets.UTF_8); + + xml = ExtendedReadRedaction.applyAll(xml); + org.apache.commons.io.IOUtils.write(xml, stdout, StandardCharsets.UTF_8); + } return 0; } diff --git a/core/src/main/java/hudson/model/Computer.java b/core/src/main/java/hudson/model/Computer.java index 0c525dfabe..6539fa33ca 100644 --- a/core/src/main/java/hudson/model/Computer.java +++ b/core/src/main/java/hudson/model/Computer.java @@ -74,6 +74,7 @@ import hudson.util.RemotingDiagnostics; import hudson.util.RemotingDiagnostics.HeapDump; import hudson.util.RunList; import jakarta.servlet.ServletException; +import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import java.io.InputStream; @@ -83,6 +84,7 @@ import java.net.Inet4Address; import java.net.InetAddress; import java.net.NetworkInterface; import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.InvalidPathException; import java.nio.file.StandardCopyOption; @@ -110,6 +112,7 @@ import jenkins.model.DisplayExecutor; import jenkins.model.IComputer; import jenkins.model.IDisplayExecutor; import jenkins.model.Jenkins; +import jenkins.security.ExtendedReadRedaction; import jenkins.security.ImpersonatingExecutorService; import jenkins.security.MasterToSlaveCallable; import jenkins.security.stapler.StaplerDispatchable; @@ -1526,7 +1529,16 @@ public /*transient*/ abstract class Computer extends Actionable implements Acces if (node == null) { throw HttpResponses.notFound(); } - Jenkins.XSTREAM2.toXMLUTF8(node, rsp.getOutputStream()); + if (hasPermission(CONFIGURE)) { + Jenkins.XSTREAM2.toXMLUTF8(node, rsp.getOutputStream()); + } else { + var baos = new ByteArrayOutputStream(); + Jenkins.XSTREAM2.toXMLUTF8(node, baos); + String xml = baos.toString(StandardCharsets.UTF_8); + + xml = ExtendedReadRedaction.applyAll(xml); + org.apache.commons.io.IOUtils.write(xml, rsp.getOutputStream(), StandardCharsets.UTF_8); + } return; } if (req.getMethod().equals("POST")) { diff --git a/core/src/main/java/hudson/model/View.java b/core/src/main/java/hudson/model/View.java index 722254572c..56aa42744b 100644 --- a/core/src/main/java/hudson/model/View.java +++ b/core/src/main/java/hudson/model/View.java @@ -62,6 +62,7 @@ import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletResponse; import java.io.BufferedInputStream; import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; @@ -94,6 +95,7 @@ import jenkins.model.ModelObjectWithContextMenu; import jenkins.model.item_category.Categories; import jenkins.model.item_category.Category; import jenkins.model.item_category.ItemCategory; +import jenkins.security.ExtendedReadRedaction; import jenkins.security.stapler.StaplerNotDispatchable; import jenkins.util.xml.XMLUtils; import jenkins.widgets.HasWidgets; @@ -983,7 +985,16 @@ public abstract class View extends AbstractModelObject implements AccessControll @Override public void generateResponse(StaplerRequest2 req, StaplerResponse2 rsp, Object node) throws IOException, ServletException { rsp.setContentType("application/xml"); - View.this.writeXml(rsp.getOutputStream()); + if (hasPermission(CONFIGURE)) { + View.this.writeXml(rsp.getOutputStream()); + } else { + var baos = new ByteArrayOutputStream(); + View.this.writeXml(baos); + String xml = baos.toString(StandardCharsets.UTF_8); + + xml = ExtendedReadRedaction.applyAll(xml); + org.apache.commons.io.IOUtils.write(xml, rsp.getOutputStream(), StandardCharsets.UTF_8); + } } }; } diff --git a/test/src/test/java/lib/form/PasswordTest.java b/test/src/test/java/lib/form/PasswordTest.java index 526ef1586a..c3d6f7f17c 100644 --- a/test/src/test/java/lib/form/PasswordTest.java +++ b/test/src/test/java/lib/form/PasswordTest.java @@ -24,6 +24,7 @@ package lib.form; +import static java.nio.file.Files.readString; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.is; @@ -40,6 +41,8 @@ import hudson.FilePath; import hudson.Launcher; import hudson.cli.CopyJobCommand; import hudson.cli.GetJobCommand; +import hudson.cli.GetNodeCommand; +import hudson.cli.GetViewCommand; import hudson.model.AbstractProject; import hudson.model.Action; import hudson.model.Computer; @@ -48,25 +51,35 @@ import hudson.model.Item; import hudson.model.Job; import hudson.model.JobProperty; import hudson.model.JobPropertyDescriptor; +import hudson.model.ListView; +import hudson.model.Node; import hudson.model.RootAction; import hudson.model.Run; import hudson.model.TaskListener; import hudson.model.User; +import hudson.model.View; +import hudson.model.ViewProperty; +import hudson.security.ACL; +import hudson.slaves.DumbSlave; +import hudson.slaves.NodeProperty; import hudson.tasks.BuildStepDescriptor; import hudson.tasks.Builder; import hudson.util.FormValidation; import hudson.util.Secret; import java.io.ByteArrayOutputStream; +import java.io.File; import java.io.IOException; import java.io.PrintStream; import java.util.Arrays; import java.util.Collection; import java.util.List; import java.util.Locale; +import java.util.Map; import java.util.regex.Pattern; import jenkins.model.GlobalConfiguration; import jenkins.model.Jenkins; import jenkins.model.TransientActionFactory; +import jenkins.security.ExtendedReadRedaction; import jenkins.security.ExtendedReadSecretRedaction; import jenkins.tasks.SimpleBuildStep; import org.htmlunit.Page; @@ -124,6 +137,145 @@ public class PasswordTest { } } + @For({ExtendedReadRedaction.class, ExtendedReadSecretRedaction.class}) + @Issue("SECURITY-3495") + @Test + public void testNodeSecrets() throws Exception { + Computer.EXTENDED_READ.setEnabled(true); + j.jenkins.setSecurityRealm(j.createDummySecurityRealm()); + j.jenkins.setAuthorizationStrategy(new MockAuthorizationStrategy().grant(Jenkins.ADMINISTER).everywhere().to("alice").grant(Jenkins.READ, Computer.EXTENDED_READ).everywhere().to("bob")); + + final DumbSlave onlineSlave = j.createOnlineSlave(); + final String secretText = "t0ps3cr3td4t4_node"; + final Secret encryptedSecret = Secret.fromString(secretText); + final String encryptedSecretText = encryptedSecret.getEncryptedValue(); + + onlineSlave.getNodeProperties().add(new NodePropertyWithSecret(encryptedSecret)); + onlineSlave.save(); + + assertThat(readString(new File(onlineSlave.getRootDir(), "config.xml").toPath()), containsString(encryptedSecretText)); + + + { // admin can see encrypted value + GetNodeCommand command = new GetNodeCommand(); + try (JenkinsRule.WebClient wc = j.createWebClient().login("alice")) { + final Page page = wc.goTo(onlineSlave.getComputer().getUrl() + "config.xml", "application/xml"); + final String content = page.getWebResponse().getContentAsString(); + + assertThat(content, not(containsString(secretText))); + assertThat(content, containsString(encryptedSecretText)); + assertThat(content, containsString("" + encryptedSecretText + "")); + + var baos = new ByteArrayOutputStream(); + try (var unused = ACL.as(User.get("alice", true, Map.of()))) { + command.setTransportAuth2(Jenkins.getAuthentication2()); + command.main(List.of(onlineSlave.getNodeName()), Locale.US, System.in, new PrintStream(baos), System.err); + } + assertEquals(content, baos.toString(page.getWebResponse().getContentCharset())); + } + } + + { // extended reader gets only redacted value + GetNodeCommand command = new GetNodeCommand(); + try (JenkinsRule.WebClient wc = j.createWebClient().login("bob")) { + final Page page = wc.goTo(onlineSlave.getComputer().getUrl() + "config.xml", "application/xml"); + final String content = page.getWebResponse().getContentAsString(); + + assertThat(content, not(containsString(secretText))); + assertThat(content, not(containsString(encryptedSecretText))); + assertThat(content, containsString("********")); + + var baos = new ByteArrayOutputStream(); + try (var unused = ACL.as(User.get("bob", true, Map.of()))) { + command.setTransportAuth2(Jenkins.getAuthentication2()); + command.main(List.of(onlineSlave.getNodeName()), Locale.US, System.in, new PrintStream(baos), System.err); + } + assertEquals(content, baos.toString(page.getWebResponse().getContentCharset())); + } + } + } + + public static class NodePropertyWithSecret extends NodeProperty { + private final Secret secret; + + public NodePropertyWithSecret(Secret secret) { + this.secret = secret; + } + + public Secret getSecret() { + return secret; + } + } + + @For({ExtendedReadRedaction.class, ExtendedReadSecretRedaction.class}) + @Issue("SECURITY-3496") + @Test + public void testViewSecrets() throws Exception { + j.jenkins.setSecurityRealm(j.createDummySecurityRealm()); + j.jenkins.setAuthorizationStrategy(new MockAuthorizationStrategy().grant(Jenkins.ADMINISTER).everywhere().to("alice").grant(Jenkins.READ, View.READ).everywhere().to("bob")); + + final String secretText = "t0ps3cr3td4t4_view"; + final Secret encryptedSecret = Secret.fromString(secretText); + final String encryptedSecretText = encryptedSecret.getEncryptedValue(); + + final ListView v = new ListView("security-3496"); + v.getProperties().add(new ViewPropertyWithSecret(encryptedSecret)); + j.jenkins.addView(v); + + assertThat(readString(new File(j.jenkins.getRootDir(), "config.xml").toPath()), containsString(encryptedSecretText)); + + + { // admin can see encrypted value + var command = new GetViewCommand(); + try (JenkinsRule.WebClient wc = j.createWebClient().login("alice")) { + final Page page = wc.goTo(v.getUrl() + "config.xml", "application/xml"); + final String content = page.getWebResponse().getContentAsString(); + + assertThat(content, not(containsString(secretText))); + assertThat(content, containsString(encryptedSecretText)); + assertThat(content, containsString("" + encryptedSecretText + "")); + + var baos = new ByteArrayOutputStream(); + try (var unused = ACL.as(User.get("alice", true, Map.of()))) { + command.setTransportAuth2(Jenkins.getAuthentication2()); + command.main(List.of(v.getViewName()), Locale.US, System.in, new PrintStream(baos), System.err); + } + assertEquals(content, baos.toString(page.getWebResponse().getContentCharset())); + } + } + + { // extended reader gets only redacted value + var command = new GetViewCommand(); + try (JenkinsRule.WebClient wc = j.createWebClient().login("bob")) { + final Page page = wc.goTo(v.getUrl() + "config.xml", "application/xml"); + final String content = page.getWebResponse().getContentAsString(); + + assertThat(content, not(containsString(secretText))); + assertThat(content, not(containsString(encryptedSecretText))); + assertThat(content, containsString("********")); + + var baos = new ByteArrayOutputStream(); + try (var unused = ACL.as(User.get("bob", true, Map.of()))) { + command.setTransportAuth2(Jenkins.getAuthentication2()); + command.main(List.of(v.getViewName()), Locale.US, System.in, new PrintStream(baos), System.err); + } + assertEquals(content, baos.toString(page.getWebResponse().getContentCharset())); + } + } + } + + public static class ViewPropertyWithSecret extends ViewProperty { + private final Secret secret; + + public ViewPropertyWithSecret(Secret secret) { + this.secret = secret; + } + + public Secret getSecret() { + return secret; + } + } + @Issue({"SECURITY-266", "SECURITY-304"}) @Test @For(ExtendedReadSecretRedaction.class) From a48a0864b29ad6ba48c8df9c6b5b94d830337932 Mon Sep 17 00:00:00 2001 From: SohamJuneja Date: Tue, 25 Feb 2025 23:21:40 +0530 Subject: [PATCH 59/99] Set hasExtra to be false originally --- .../main/resources/hudson/diagnosis/OldDataMonitor/manage.jelly | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/resources/hudson/diagnosis/OldDataMonitor/manage.jelly b/core/src/main/resources/hudson/diagnosis/OldDataMonitor/manage.jelly index c2180cf443..89c631396d 100644 --- a/core/src/main/resources/hudson/diagnosis/OldDataMonitor/manage.jelly +++ b/core/src/main/resources/hudson/diagnosis/OldDataMonitor/manage.jelly @@ -39,7 +39,7 @@ THE SOFTWARE. - + From f7fc2cf6927f1c40a30bf2cfc2a0a32b9fe4f3ef Mon Sep 17 00:00:00 2001 From: Soham Juneja <138424822+SohamJuneja@users.noreply.github.com> Date: Wed, 26 Feb 2025 14:48:00 +0530 Subject: [PATCH 60/99] Update manage.jelly Co-authored-by: Kris Stern --- .../resources/hudson/diagnosis/OldDataMonitor/manage.jelly | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/src/main/resources/hudson/diagnosis/OldDataMonitor/manage.jelly b/core/src/main/resources/hudson/diagnosis/OldDataMonitor/manage.jelly index 89c631396d..84e5c70ae3 100644 --- a/core/src/main/resources/hudson/diagnosis/OldDataMonitor/manage.jelly +++ b/core/src/main/resources/hudson/diagnosis/OldDataMonitor/manage.jelly @@ -34,12 +34,13 @@ THE SOFTWARE. + - + From 532f9064cf013ddb446e86e0ec74db34605f4783 Mon Sep 17 00:00:00 2001 From: Basil Crow Date: Thu, 27 Feb 2025 14:35:18 -0800 Subject: [PATCH 61/99] Import `isOverridden` from the same repository --- core/src/main/java/hudson/model/ModifiableItemGroup.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/hudson/model/ModifiableItemGroup.java b/core/src/main/java/hudson/model/ModifiableItemGroup.java index d0bcda3118..a9d16491fb 100644 --- a/core/src/main/java/hudson/model/ModifiableItemGroup.java +++ b/core/src/main/java/hudson/model/ModifiableItemGroup.java @@ -24,11 +24,11 @@ package hudson.model; +import hudson.Util; import io.jenkins.servlet.ServletExceptionWrapper; import jakarta.servlet.ServletException; import java.io.IOException; import jenkins.security.stapler.StaplerNotDispatchable; -import org.kohsuke.stapler.ReflectionUtils; import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerRequest2; import org.kohsuke.stapler.StaplerResponse; @@ -53,7 +53,7 @@ public interface ModifiableItemGroup extends ItemGroup { */ @RequirePOST default T doCreateItem(StaplerRequest2 req, StaplerResponse2 rsp) throws IOException, ServletException { - if (ReflectionUtils.isOverridden( + if (Util.isOverridden( ModifiableItemGroup.class, getClass(), "doCreateItem", @@ -76,7 +76,7 @@ public interface ModifiableItemGroup extends ItemGroup { @Deprecated @StaplerNotDispatchable default T doCreateItem(StaplerRequest req, StaplerResponse rsp) throws IOException, javax.servlet.ServletException { - if (ReflectionUtils.isOverridden( + if (Util.isOverridden( ModifiableItemGroup.class, getClass(), "doCreateItem", From 2b67c901cd1190a66384130a12d1631127738baa Mon Sep 17 00:00:00 2001 From: Harsh Wasnik Date: Sat, 1 Mar 2025 12:37:11 +0530 Subject: [PATCH 62/99] Provides the deprecated plugins in sorted order --- core/src/main/java/hudson/PluginManager.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/hudson/PluginManager.java b/core/src/main/java/hudson/PluginManager.java index b90b2eb9f6..8547347f89 100644 --- a/core/src/main/java/hudson/PluginManager.java +++ b/core/src/main/java/hudson/PluginManager.java @@ -101,6 +101,7 @@ import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.LinkedHashSet; +import java.util.LinkedHashMap; import java.util.List; import java.util.Locale; import java.util.Map; @@ -2661,7 +2662,10 @@ public abstract class PluginManager extends AbstractModelObject implements OnMas public Map getDeprecatedPlugins() { return Jenkins.get().getPluginManager().getPlugins().stream() .filter(PluginWrapper::isDeprecated) - .collect(Collectors.toMap(Function.identity(), it -> it.getDeprecations().get(0).url)); + .sorted(Comparator.comparing(PluginWrapper::getDisplayName)) // Sort by plugin name + .collect(LinkedHashMap::new, + (map, plugin) -> map.put(plugin, plugin.getDeprecations().get(0).url), + Map::putAll); } } From e48d35d9f4dfa9f83e99b4a894c56e909178274c Mon Sep 17 00:00:00 2001 From: Harsh Wasnik Date: Sat, 1 Mar 2025 13:11:57 +0530 Subject: [PATCH 63/99] fixed spotbugs issue --- core/src/main/java/hudson/PluginManager.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/core/src/main/java/hudson/PluginManager.java b/core/src/main/java/hudson/PluginManager.java index 8547347f89..7161293300 100644 --- a/core/src/main/java/hudson/PluginManager.java +++ b/core/src/main/java/hudson/PluginManager.java @@ -100,8 +100,8 @@ import java.util.Enumeration; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; -import java.util.LinkedHashSet; import java.util.LinkedHashMap; +import java.util.LinkedHashSet; import java.util.List; import java.util.Locale; import java.util.Map; @@ -115,7 +115,6 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.Future; -import java.util.function.Function; import java.util.function.Supplier; import java.util.jar.JarEntry; import java.util.jar.JarFile; From cb753134b40dde5feeb228f5f2c90d03184fe063 Mon Sep 17 00:00:00 2001 From: Jenkins Release Bot <66998184+jenkins-release-bot@users.noreply.github.com> Date: Tue, 4 Mar 2025 10:34:35 +0000 Subject: [PATCH 64/99] [maven-release-plugin] prepare release jenkins-2.500 --- bom/pom.xml | 2 +- cli/pom.xml | 2 +- core/pom.xml | 2 +- coverage/pom.xml | 2 +- pom.xml | 6 +++--- test/pom.xml | 2 +- war/pom.xml | 2 +- websocket/jetty12-ee9/pom.xml | 2 +- websocket/spi/pom.xml | 2 +- 9 files changed, 11 insertions(+), 11 deletions(-) diff --git a/bom/pom.xml b/bom/pom.xml index 7ebb05d082..8a8561f180 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main jenkins-parent - ${revision}${changelist} + 2.500 jenkins-bom diff --git a/cli/pom.xml b/cli/pom.xml index cf30714cac..0d78eac977 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main jenkins-parent - ${revision}${changelist} + 2.500 cli diff --git a/core/pom.xml b/core/pom.xml index 0c9b072e0b..2289c7fce7 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main jenkins-parent - ${revision}${changelist} + 2.500 jenkins-core diff --git a/coverage/pom.xml b/coverage/pom.xml index fe1e89a120..f39ee44404 100644 --- a/coverage/pom.xml +++ b/coverage/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main jenkins-parent - ${revision}${changelist} + 2.500 jenkins-coverage diff --git a/pom.xml b/pom.xml index 74fe1325fc..bc1e35bb01 100644 --- a/pom.xml +++ b/pom.xml @@ -34,7 +34,7 @@ THE SOFTWARE. org.jenkins-ci.main jenkins-parent - ${revision}${changelist} + 2.500 pom Jenkins main module @@ -63,7 +63,7 @@ THE SOFTWARE. scm:git:https://github.com/jenkinsci/jenkins.git scm:git:git@github.com:jenkinsci/jenkins.git - ${scmTag} + jenkins-2.500 https://github.com/jenkinsci/jenkins @@ -75,7 +75,7 @@ THE SOFTWARE. 2.500 -SNAPSHOT - 2025-02-25T15:56:49Z + 2025-03-04T07:20:13Z github diff --git a/test/pom.xml b/test/pom.xml index 63e98847f4..777a0e4293 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main jenkins-parent - ${revision}${changelist} + 2.500 jenkins-test diff --git a/war/pom.xml b/war/pom.xml index 4a7d62d991..3b4ab85ed9 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main jenkins-parent - ${revision}${changelist} + 2.500 jenkins-war diff --git a/websocket/jetty12-ee9/pom.xml b/websocket/jetty12-ee9/pom.xml index 2253163b3c..4e33bb1d6f 100644 --- a/websocket/jetty12-ee9/pom.xml +++ b/websocket/jetty12-ee9/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main jenkins-parent - ${revision}${changelist} + 2.500 ../.. diff --git a/websocket/spi/pom.xml b/websocket/spi/pom.xml index 178413f92c..0bbdd1106e 100644 --- a/websocket/spi/pom.xml +++ b/websocket/spi/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main jenkins-parent - ${revision}${changelist} + 2.500 ../.. From 6169ddd214021506aa64faa457f447ede9a3a27c Mon Sep 17 00:00:00 2001 From: Jenkins Release Bot <66998184+jenkins-release-bot@users.noreply.github.com> Date: Tue, 4 Mar 2025 10:34:52 +0000 Subject: [PATCH 65/99] [maven-release-plugin] prepare for next development iteration --- bom/pom.xml | 2 +- cli/pom.xml | 2 +- core/pom.xml | 2 +- coverage/pom.xml | 2 +- pom.xml | 8 ++++---- test/pom.xml | 2 +- war/pom.xml | 2 +- websocket/jetty12-ee9/pom.xml | 2 +- websocket/spi/pom.xml | 2 +- 9 files changed, 12 insertions(+), 12 deletions(-) diff --git a/bom/pom.xml b/bom/pom.xml index 8a8561f180..7ebb05d082 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main jenkins-parent - 2.500 + ${revision}${changelist} jenkins-bom diff --git a/cli/pom.xml b/cli/pom.xml index 0d78eac977..cf30714cac 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main jenkins-parent - 2.500 + ${revision}${changelist} cli diff --git a/core/pom.xml b/core/pom.xml index 2289c7fce7..0c9b072e0b 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main jenkins-parent - 2.500 + ${revision}${changelist} jenkins-core diff --git a/coverage/pom.xml b/coverage/pom.xml index f39ee44404..fe1e89a120 100644 --- a/coverage/pom.xml +++ b/coverage/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main jenkins-parent - 2.500 + ${revision}${changelist} jenkins-coverage diff --git a/pom.xml b/pom.xml index bc1e35bb01..e71994c1f1 100644 --- a/pom.xml +++ b/pom.xml @@ -34,7 +34,7 @@ THE SOFTWARE. org.jenkins-ci.main jenkins-parent - 2.500 + ${revision}${changelist} pom Jenkins main module @@ -63,7 +63,7 @@ THE SOFTWARE. scm:git:https://github.com/jenkinsci/jenkins.git scm:git:git@github.com:jenkinsci/jenkins.git - jenkins-2.500 + ${scmTag} https://github.com/jenkinsci/jenkins @@ -73,9 +73,9 @@ THE SOFTWARE. - 2.500 + 2.501 -SNAPSHOT - 2025-03-04T07:20:13Z + 2025-03-04T10:34:35Z github diff --git a/test/pom.xml b/test/pom.xml index 777a0e4293..63e98847f4 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main jenkins-parent - 2.500 + ${revision}${changelist} jenkins-test diff --git a/war/pom.xml b/war/pom.xml index 3b4ab85ed9..4a7d62d991 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main jenkins-parent - 2.500 + ${revision}${changelist} jenkins-war diff --git a/websocket/jetty12-ee9/pom.xml b/websocket/jetty12-ee9/pom.xml index 4e33bb1d6f..2253163b3c 100644 --- a/websocket/jetty12-ee9/pom.xml +++ b/websocket/jetty12-ee9/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main jenkins-parent - 2.500 + ${revision}${changelist} ../.. diff --git a/websocket/spi/pom.xml b/websocket/spi/pom.xml index 0bbdd1106e..178413f92c 100644 --- a/websocket/spi/pom.xml +++ b/websocket/spi/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main jenkins-parent - 2.500 + ${revision}${changelist} ../.. From 87577aed38c005725fffde5ac451b2ca763ff566 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 5 Mar 2025 09:43:20 -0800 Subject: [PATCH 66/99] Update dependency io.jenkins.plugins:echarts-api to v5.6.0-2 (#10334) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- war/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/war/pom.xml b/war/pom.xml index 765fd8abc4..c39d18c5ef 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -367,7 +367,7 @@ THE SOFTWARE. io.jenkins.plugins echarts-api - 5.5.1-6 + 5.6.0-2 hpi From dfd1c8cf98afc648db7d2dda0fd4b20de7a844e2 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 5 Mar 2025 09:43:43 -0800 Subject: [PATCH 67/99] Update dependency org.slf4j:slf4j-bom to v2.0.17 (#10340) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- bom/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bom/pom.xml b/bom/pom.xml index 7ebb05d082..78dcd42bf5 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -56,7 +56,7 @@ THE SOFTWARE. org.slf4j slf4j-bom - 2.0.16 + 2.0.17 pom import From 1eac33e001ab1994691346acfb4219f285465eb5 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 5 Mar 2025 09:44:06 -0800 Subject: [PATCH 68/99] Update dependency org.jenkins-ci.main:remoting to v3291 (#10336) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index e71994c1f1..eb25798766 100644 --- a/pom.xml +++ b/pom.xml @@ -87,7 +87,7 @@ THE SOFTWARE. https://www.jenkins.io/changelog - 3283.v92c105e0f819 + 3291.vb_131b_dc231fa_ Max Medium From 73b258f0efb2314952fe1912a6a9708a8168d367 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 5 Mar 2025 09:44:39 -0800 Subject: [PATCH 69/99] Update dependency io.jenkins.plugins:jaxb to v2.3.9-133.vb_ec76a_73f706 (#10347) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- war/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/war/pom.xml b/war/pom.xml index c39d18c5ef..61701a7d5c 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -455,7 +455,7 @@ THE SOFTWARE. io.jenkins.plugins jaxb - 2.3.9-1 + 2.3.9-133.vb_ec76a_73f706 hpi From 6409792c97bf02e1b7dadb249eb65e955e0af988 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 5 Mar 2025 09:44:59 -0800 Subject: [PATCH 70/99] Update dependency org.jenkins-ci.plugins:scm-api to v704 (#10350) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- test/pom.xml | 2 +- war/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/test/pom.xml b/test/pom.xml index bd81136104..16bb0f68a6 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -112,7 +112,7 @@ THE SOFTWARE. org.jenkins-ci.plugins scm-api - 703.v72ff4b_259600 + 704.v3ce5c542825a_ diff --git a/war/pom.xml b/war/pom.xml index 61701a7d5c..633dc30a80 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -420,7 +420,7 @@ THE SOFTWARE. org.jenkins-ci.plugins scm-api - 703.v72ff4b_259600 + 704.v3ce5c542825a_ hpi From f038c9dca4f1d34fff19829bc034a037cad8a94c Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 5 Mar 2025 09:45:20 -0800 Subject: [PATCH 71/99] Update dependency eslint-config-prettier to v10.0.2 (#10359) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 7152a1156c..a5dfa487fc 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,7 @@ "css-loader": "7.1.2", "css-minimizer-webpack-plugin": "7.0.0", "eslint": "9.21.0", - "eslint-config-prettier": "10.0.1", + "eslint-config-prettier": "10.0.2", "eslint-formatter-checkstyle": "8.40.0", "globals": "16.0.0", "handlebars-loader": "1.7.3", diff --git a/yarn.lock b/yarn.lock index 4be9571e00..f80a74c10a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3463,14 +3463,14 @@ __metadata: languageName: node linkType: hard -"eslint-config-prettier@npm:10.0.1": - version: 10.0.1 - resolution: "eslint-config-prettier@npm:10.0.1" +"eslint-config-prettier@npm:10.0.2": + version: 10.0.2 + resolution: "eslint-config-prettier@npm:10.0.2" peerDependencies: eslint: ">=7.0.0" bin: eslint-config-prettier: build/bin/cli.js - checksum: 10c0/e2434931669d211663c0493f2c1640a670a02ba4503a68f056a7eda133f383acbbb983a4a7bd0ad6cb3b2bc4d5731c3be8b32fe28e35087a76fea45f7061ae70 + checksum: 10c0/e0ef3c442661a26fc6e82acec5bb9a418c4a8f65ec8adf0983d3aaba7716d2ed448358b063cce6e3c272c847d14cb856ddf30031770c6571e2b2c3e2a439afd4 languageName: node linkType: hard @@ -4378,7 +4378,7 @@ __metadata: css-loader: "npm:7.1.2" css-minimizer-webpack-plugin: "npm:7.0.0" eslint: "npm:9.21.0" - eslint-config-prettier: "npm:10.0.1" + eslint-config-prettier: "npm:10.0.2" eslint-formatter-checkstyle: "npm:8.40.0" globals: "npm:16.0.0" handlebars: "npm:4.7.8" From ea23e476df6a72d635ef26b1312e0752e4143d4b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 5 Mar 2025 09:46:50 -0800 Subject: [PATCH 72/99] Update dependency org.jenkins-ci.plugins:trilead-api to v2.192.vc50a_d147e369 (#10341) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- war/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/war/pom.xml b/war/pom.xml index 633dc30a80..337782e8da 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -469,7 +469,7 @@ THE SOFTWARE. org.jenkins-ci.plugins trilead-api - 2.190.v1ed19f8137f8 + 2.192.vc50a_d147e369 hpi From 69901fcf9b55d20bb1383b108bd25910177b589f Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 5 Mar 2025 09:47:25 -0800 Subject: [PATCH 73/99] Update dependency io.jenkins.plugins:checks-api to v367 (#10342) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- war/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/war/pom.xml b/war/pom.xml index 337782e8da..a8432e9e75 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -344,7 +344,7 @@ THE SOFTWARE. io.jenkins.plugins checks-api - 2.2.3 + 367.v18b_7f530e54a_ hpi From c25c243ce39a87603da0b0004c1b9ef5cfb55d58 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 5 Mar 2025 09:48:10 -0800 Subject: [PATCH 74/99] Update dependency io.jenkins.plugins:design-library to v358 (#10343) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- test/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/pom.xml b/test/pom.xml index 16bb0f68a6..3a56481847 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -344,7 +344,7 @@ THE SOFTWARE. io.jenkins.plugins design-library - 355.v0f007356e15d + 358.vcc903045e088 hpi ${project.build.outputDirectory}/plugins design-library.jpi From 8783fda72d256e83126a42083d517a7029b91580 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 5 Mar 2025 09:52:33 -0800 Subject: [PATCH 75/99] Update dependency org.jenkins-ci.main:jenkins-test-harness to v2411 (#10353) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- test/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/pom.xml b/test/pom.xml index 3a56481847..6181c6bd24 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -178,7 +178,7 @@ THE SOFTWARE. org.jenkins-ci.main jenkins-test-harness - 2403.v256947ecb_c8a_ + 2411.v1e79b_0dc94b_7 test From ca6362b7cf8f7ec0dc19d87870be6e3b79731b9a Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 5 Mar 2025 09:53:11 -0800 Subject: [PATCH 76/99] Update dependency org.jenkins-ci:jenkins to v1.129 (#10370) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index eb25798766..ab35c746b3 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci jenkins - 1.128 + 1.129 From f22f8a779e225018a052a6123fcf94a4eef15bae Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 5 Mar 2025 09:53:58 -0800 Subject: [PATCH 77/99] Update dependency com.puppycrawl.tools:checkstyle to v10.21.4 (#10371) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index ab35c746b3..47de5737e7 100644 --- a/pom.xml +++ b/pom.xml @@ -281,7 +281,7 @@ THE SOFTWARE. com.puppycrawl.tools checkstyle - 10.21.3 + 10.21.4 From 75ce30d0ecffd604af6c67b865a6d5872a4b38f2 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 5 Mar 2025 09:56:01 -0800 Subject: [PATCH 78/99] Update peter-evans/create-pull-request digest to 271a8d0 (#10372) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/run-since-updater.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/run-since-updater.yml b/.github/workflows/run-since-updater.yml index 619adca29c..45fc101d60 100644 --- a/.github/workflows/run-since-updater.yml +++ b/.github/workflows/run-since-updater.yml @@ -29,7 +29,7 @@ jobs: id: run_script shell: bash - name: Create Pull Request - uses: peter-evans/create-pull-request@dd2324fc52d5d43c699a5636bcf19fceaa70c284 # v7 + uses: peter-evans/create-pull-request@271a8d0340265f705b14b6d32b9829c1cb33d45e # v7 with: token: ${{ secrets.GITHUB_TOKEN }} commit-message: Fill in since annotations From b69b0495c84eb3f7f7c684cf40d695dc4764fcbe Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 5 Mar 2025 09:57:44 -0800 Subject: [PATCH 79/99] Update dependency prettier to v3.5.2 (#10337) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index a5dfa487fc..b95de2c50d 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,7 @@ "postcss-loader": "8.1.1", "postcss-preset-env": "10.1.4", "postcss-scss": "4.0.9", - "prettier": "3.5.1", + "prettier": "3.5.2", "sass": "1.85.0", "sass-loader": "16.0.5", "style-loader": "4.0.0", diff --git a/yarn.lock b/yarn.lock index f80a74c10a..0135971a08 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4391,7 +4391,7 @@ __metadata: postcss-loader: "npm:8.1.1" postcss-preset-env: "npm:10.1.4" postcss-scss: "npm:4.0.9" - prettier: "npm:3.5.1" + prettier: "npm:3.5.2" sass: "npm:1.85.0" sass-loader: "npm:16.0.5" sortablejs: "npm:1.15.6" @@ -6135,12 +6135,12 @@ __metadata: languageName: node linkType: hard -"prettier@npm:3.5.1": - version: 3.5.1 - resolution: "prettier@npm:3.5.1" +"prettier@npm:3.5.2": + version: 3.5.2 + resolution: "prettier@npm:3.5.2" bin: prettier: bin/prettier.cjs - checksum: 10c0/9f6f810eae455d6e4213845151a484a2338f2e0d6a8b84ee8e13a83af8a2421ef6c1e31e61e4b135671fb57b9541f6624648880cc2061ac803e243ac898c0123 + checksum: 10c0/d7b597ed33f39c32ace675896ad187f06a3e48dc8a1e80051b5c5f0dae3586d53981704b8fda5ac3b080e6c2e0e197d239131b953702674f044351621ca5e1ac languageName: node linkType: hard From 8555e58eeaa0c40db4975655e5cdaa28500638f4 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 5 Mar 2025 09:58:16 -0800 Subject: [PATCH 80/99] Update dependency postcss-preset-env to v10.1.5 (#10348) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 240 +++++++++++++++++++++++++-------------------------- 2 files changed, 121 insertions(+), 121 deletions(-) diff --git a/package.json b/package.json index b95de2c50d..f35058d7b7 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,7 @@ "mini-css-extract-plugin": "2.9.2", "postcss": "8.5.3", "postcss-loader": "8.1.1", - "postcss-preset-env": "10.1.4", + "postcss-preset-env": "10.1.5", "postcss-scss": "4.0.9", "prettier": "3.5.2", "sass": "1.85.0", diff --git a/yarn.lock b/yarn.lock index 0135971a08..9fba8e8f34 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1137,33 +1137,33 @@ __metadata: languageName: node linkType: hard -"@csstools/color-helpers@npm:^5.0.1": - version: 5.0.1 - resolution: "@csstools/color-helpers@npm:5.0.1" - checksum: 10c0/77fa3b7236eaa3f36dea24708ac0d5e53168903624ac5aed54615752a0730cd20773fda50e742ce868012eca8c000cc39688e05869e79f34714230ab6968d1e6 +"@csstools/color-helpers@npm:^5.0.2": + version: 5.0.2 + resolution: "@csstools/color-helpers@npm:5.0.2" + checksum: 10c0/bebaddb28b9eb58b0449edd5d0c0318fa88f3cb079602ee27e88c9118070d666dcc4e09a5aa936aba2fde6ba419922ade07b7b506af97dd7051abd08dfb2959b languageName: node linkType: hard -"@csstools/css-calc@npm:^2.1.1": - version: 2.1.1 - resolution: "@csstools/css-calc@npm:2.1.1" +"@csstools/css-calc@npm:^2.1.2": + version: 2.1.2 + resolution: "@csstools/css-calc@npm:2.1.2" peerDependencies: "@csstools/css-parser-algorithms": ^3.0.4 "@csstools/css-tokenizer": ^3.0.3 - checksum: 10c0/857c8dac40eb6ba8810408dad141bbcad060b28bce69dfd3bcf095a060fcaa23d5c4dbf52be88fcb57e12ce32c666e855dc68de1d8020851f6b432e3f9b29950 + checksum: 10c0/34ced30553968ef5d5f9e00e3b90b48c47480cf130e282e99d57ec9b09f803aab8bc06325683e72a1518b5e7180a3da8b533f1b462062757c21989a53b482e1a languageName: node linkType: hard -"@csstools/css-color-parser@npm:^3.0.7": - version: 3.0.7 - resolution: "@csstools/css-color-parser@npm:3.0.7" +"@csstools/css-color-parser@npm:^3.0.8": + version: 3.0.8 + resolution: "@csstools/css-color-parser@npm:3.0.8" dependencies: - "@csstools/color-helpers": "npm:^5.0.1" - "@csstools/css-calc": "npm:^2.1.1" + "@csstools/color-helpers": "npm:^5.0.2" + "@csstools/css-calc": "npm:^2.1.2" peerDependencies: "@csstools/css-parser-algorithms": ^3.0.4 "@csstools/css-tokenizer": ^3.0.3 - checksum: 10c0/b81780e6c50f0b0605776bd39bbd6203780231a561601853a9835cc70788560e7a281d0fbfe47ebe8affcb07dd64b0b1dcd4b67552520cfbe0e5088df158f12c + checksum: 10c0/90722c5a62ca94e9d578ddf59be604a76400b932bd3d4bd23cb1ae9b7ace8fcf83c06995d2b31f96f4afef24a7cefba79beb11ed7ee4999d7ecfec3869368359 languageName: node linkType: hard @@ -1205,33 +1205,33 @@ __metadata: languageName: node linkType: hard -"@csstools/postcss-color-function@npm:^4.0.7": - version: 4.0.7 - resolution: "@csstools/postcss-color-function@npm:4.0.7" +"@csstools/postcss-color-function@npm:^4.0.8": + version: 4.0.8 + resolution: "@csstools/postcss-color-function@npm:4.0.8" dependencies: - "@csstools/css-color-parser": "npm:^3.0.7" + "@csstools/css-color-parser": "npm:^3.0.8" "@csstools/css-parser-algorithms": "npm:^3.0.4" "@csstools/css-tokenizer": "npm:^3.0.3" "@csstools/postcss-progressive-custom-properties": "npm:^4.0.0" "@csstools/utilities": "npm:^2.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/0f466e1d8863800f6428d7801e2134a834c9ea4b8098f84df41379cd3c3ba84f62588b46e03b26cf13c7d61b1112d22bdfd72adbcec7f5cb27f1149e855cd3ab + checksum: 10c0/d52c65bb4ed28f62b3fc9c0b2ce068e58395345dcead797ed8f7e4f5f469a9311607d39dd409c571ccc94d6c5c84171aff62d51d4f53fdcf6e1cca23fc31d4f1 languageName: node linkType: hard -"@csstools/postcss-color-mix-function@npm:^3.0.7": - version: 3.0.7 - resolution: "@csstools/postcss-color-mix-function@npm:3.0.7" +"@csstools/postcss-color-mix-function@npm:^3.0.8": + version: 3.0.8 + resolution: "@csstools/postcss-color-mix-function@npm:3.0.8" dependencies: - "@csstools/css-color-parser": "npm:^3.0.7" + "@csstools/css-color-parser": "npm:^3.0.8" "@csstools/css-parser-algorithms": "npm:^3.0.4" "@csstools/css-tokenizer": "npm:^3.0.3" "@csstools/postcss-progressive-custom-properties": "npm:^4.0.0" "@csstools/utilities": "npm:^2.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/e663615c7fde6effe9888c049bf74373c55d7d69e36c239eb1343c4aa86810b2407baebedd9fd67c6374fbecc32b4b96d11cdba6099473e4551ce7a1e9613513 + checksum: 10c0/3fe7093b38f2b469462fa942af5a54a1ad68b07cd33267288e5c9e865d3a871c04774463136e4af24955316f40560dda1371d02cfd5595475a742afae13a37ba languageName: node linkType: hard @@ -1249,16 +1249,16 @@ __metadata: languageName: node linkType: hard -"@csstools/postcss-exponential-functions@npm:^2.0.6": - version: 2.0.6 - resolution: "@csstools/postcss-exponential-functions@npm:2.0.6" +"@csstools/postcss-exponential-functions@npm:^2.0.7": + version: 2.0.7 + resolution: "@csstools/postcss-exponential-functions@npm:2.0.7" dependencies: - "@csstools/css-calc": "npm:^2.1.1" + "@csstools/css-calc": "npm:^2.1.2" "@csstools/css-parser-algorithms": "npm:^3.0.4" "@csstools/css-tokenizer": "npm:^3.0.3" peerDependencies: postcss: ^8.4 - checksum: 10c0/e8b5bdde8e60cdd628c6654f2336921fa0df1a9468ce3b7cd40c9f27457cd1f8a2ffc9c6380487d55c6188bed6e772679cefa4dfa5ba90229957a030df9403ce + checksum: 10c0/9d02076135ee9bf82bf911f577c9fda42bf00347f3c519fa83e32e83f5b8a98649b97e13ba3a42ed906467729d7b69574595556dfb9e865c86d3bbae5ffbc918 languageName: node linkType: hard @@ -1274,46 +1274,46 @@ __metadata: languageName: node linkType: hard -"@csstools/postcss-gamut-mapping@npm:^2.0.7": - version: 2.0.7 - resolution: "@csstools/postcss-gamut-mapping@npm:2.0.7" +"@csstools/postcss-gamut-mapping@npm:^2.0.8": + version: 2.0.8 + resolution: "@csstools/postcss-gamut-mapping@npm:2.0.8" dependencies: - "@csstools/css-color-parser": "npm:^3.0.7" + "@csstools/css-color-parser": "npm:^3.0.8" "@csstools/css-parser-algorithms": "npm:^3.0.4" "@csstools/css-tokenizer": "npm:^3.0.3" peerDependencies: postcss: ^8.4 - checksum: 10c0/823603b1083ce2372ccbb2c25b744739cec8371ce593460a85896163fc8eb2b8e992497611af22dd765c2fccd8998b3d683732d61579d40bda0d3f21e6d74e06 + checksum: 10c0/81daaba0e774ed3ab97e2c7c93dcae16d1e8447a27f0e82ddf8a176e8f1e93b444f463284105fd312c6234d4210372d6d69d96efcfb05bc5b6adfba6fcfd6f44 languageName: node linkType: hard -"@csstools/postcss-gradients-interpolation-method@npm:^5.0.7": - version: 5.0.7 - resolution: "@csstools/postcss-gradients-interpolation-method@npm:5.0.7" +"@csstools/postcss-gradients-interpolation-method@npm:^5.0.8": + version: 5.0.8 + resolution: "@csstools/postcss-gradients-interpolation-method@npm:5.0.8" dependencies: - "@csstools/css-color-parser": "npm:^3.0.7" + "@csstools/css-color-parser": "npm:^3.0.8" "@csstools/css-parser-algorithms": "npm:^3.0.4" "@csstools/css-tokenizer": "npm:^3.0.3" "@csstools/postcss-progressive-custom-properties": "npm:^4.0.0" "@csstools/utilities": "npm:^2.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/2998d28cd27ecf052da08679ca2fc5c8fcee68ade96cc32db4b4ae44f2b364954804e1e182cb547d6e8e4b5c84d6269763e12e3dfe1fd47c165c539c423b2ea0 + checksum: 10c0/832bfb663b334be9783f49c354cbeec3cede1830a576b91a101456db33207e9651f97624f0df92e5d01a39b68a215ad4b20621ee229b92b51607e889093bc590 languageName: node linkType: hard -"@csstools/postcss-hwb-function@npm:^4.0.7": - version: 4.0.7 - resolution: "@csstools/postcss-hwb-function@npm:4.0.7" +"@csstools/postcss-hwb-function@npm:^4.0.8": + version: 4.0.8 + resolution: "@csstools/postcss-hwb-function@npm:4.0.8" dependencies: - "@csstools/css-color-parser": "npm:^3.0.7" + "@csstools/css-color-parser": "npm:^3.0.8" "@csstools/css-parser-algorithms": "npm:^3.0.4" "@csstools/css-tokenizer": "npm:^3.0.3" "@csstools/postcss-progressive-custom-properties": "npm:^4.0.0" "@csstools/utilities": "npm:^2.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/fa8e329ec92a9a04ba8d41d6640e39ea109c8d9ea1c90eaa141e303ae9bc41eca2c7bec72e4211f79a48b7e6746d754a66045b10da04ca9953c8a394a3bc1099 + checksum: 10c0/d6196e2acfc0a6fd61fe254385049fb784abb862c724543940dbba8ffe29bbdbedd83985a517132a21073435445486f918da170fb0f710dbe40a798b9abc41e7 languageName: node linkType: hard @@ -1415,17 +1415,17 @@ __metadata: languageName: node linkType: hard -"@csstools/postcss-media-minmax@npm:^2.0.6": - version: 2.0.6 - resolution: "@csstools/postcss-media-minmax@npm:2.0.6" +"@csstools/postcss-media-minmax@npm:^2.0.7": + version: 2.0.7 + resolution: "@csstools/postcss-media-minmax@npm:2.0.7" dependencies: - "@csstools/css-calc": "npm:^2.1.1" + "@csstools/css-calc": "npm:^2.1.2" "@csstools/css-parser-algorithms": "npm:^3.0.4" "@csstools/css-tokenizer": "npm:^3.0.3" "@csstools/media-query-list-parser": "npm:^4.0.2" peerDependencies: postcss: ^8.4 - checksum: 10c0/9cae49dcbba3f6818b679490665b48f13ab6c57f323a7e614e53a850503b6c5957a0de8dfff7184332c82f6f8570846283a96698791afb367457e4b24a4437f9 + checksum: 10c0/03b7a5603437d5be17e9c0d951ca0b7b3b6f437fd4e24e3ac3f70ed9d573ef67641821fe209b5764c54aa36e841c830a5d8cf3a3dd97fd2fa774b7ceba7ba038 languageName: node linkType: hard @@ -1465,18 +1465,18 @@ __metadata: languageName: node linkType: hard -"@csstools/postcss-oklab-function@npm:^4.0.7": - version: 4.0.7 - resolution: "@csstools/postcss-oklab-function@npm:4.0.7" +"@csstools/postcss-oklab-function@npm:^4.0.8": + version: 4.0.8 + resolution: "@csstools/postcss-oklab-function@npm:4.0.8" dependencies: - "@csstools/css-color-parser": "npm:^3.0.7" + "@csstools/css-color-parser": "npm:^3.0.8" "@csstools/css-parser-algorithms": "npm:^3.0.4" "@csstools/css-tokenizer": "npm:^3.0.3" "@csstools/postcss-progressive-custom-properties": "npm:^4.0.0" "@csstools/utilities": "npm:^2.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/16d438aee2340dedd27249b540e261ea07bad56ceba507f6118e3eb44c693a977a374b554a1006a14c5d6d024f62d7cc468d7f4351a1c4e04e3a58142a3026a3 + checksum: 10c0/8a62f3875bb9026c95758a0b834e876a8f07dd1a5ba36c3967e230565fbd9afd21ec714c8590cb4ea594fd214e68f2ccf58456ed6e919a47d2ed17d5b63a925a languageName: node linkType: hard @@ -1491,31 +1491,31 @@ __metadata: languageName: node linkType: hard -"@csstools/postcss-random-function@npm:^1.0.2": - version: 1.0.2 - resolution: "@csstools/postcss-random-function@npm:1.0.2" +"@csstools/postcss-random-function@npm:^1.0.3": + version: 1.0.3 + resolution: "@csstools/postcss-random-function@npm:1.0.3" dependencies: - "@csstools/css-calc": "npm:^2.1.1" + "@csstools/css-calc": "npm:^2.1.2" "@csstools/css-parser-algorithms": "npm:^3.0.4" "@csstools/css-tokenizer": "npm:^3.0.3" peerDependencies: postcss: ^8.4 - checksum: 10c0/b0bc235999685045ca91f8f18eb56ced68747aec6e8b7ff57ac86b1c385d6c2526a528fde5fd32e0987b4387b22a75c73e2d2ebd57974c4ca32d3d60a1eb093a + checksum: 10c0/c3bf319a6f79c0e372e4754e7888a4cd3a97b81e480662b1d1cb193949670bbcd5995c42483390a996e66d6dd81c9ad753836cc617aac2e3acbd542faa56f907 languageName: node linkType: hard -"@csstools/postcss-relative-color-syntax@npm:^3.0.7": - version: 3.0.7 - resolution: "@csstools/postcss-relative-color-syntax@npm:3.0.7" +"@csstools/postcss-relative-color-syntax@npm:^3.0.8": + version: 3.0.8 + resolution: "@csstools/postcss-relative-color-syntax@npm:3.0.8" dependencies: - "@csstools/css-color-parser": "npm:^3.0.7" + "@csstools/css-color-parser": "npm:^3.0.8" "@csstools/css-parser-algorithms": "npm:^3.0.4" "@csstools/css-tokenizer": "npm:^3.0.3" "@csstools/postcss-progressive-custom-properties": "npm:^4.0.0" "@csstools/utilities": "npm:^2.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/8741e3c337e5f321569fd41dac2442641390716bc67175faa3301bbbeaf23fe5b722b3b0b8f133ad0b927f32a2ed5fb73565fa8ee88685239d781f1826142405 + checksum: 10c0/fcd14fb1c3f103dbaaf88afa2540f9946313d48515fa24fffcde4200e7dc4aa767d186ecf2e12bb0501dd946a824f118cd4ad5d44899c8d6d9d8d9d9b99a123e languageName: node linkType: hard @@ -1530,54 +1530,54 @@ __metadata: languageName: node linkType: hard -"@csstools/postcss-sign-functions@npm:^1.1.1": - version: 1.1.1 - resolution: "@csstools/postcss-sign-functions@npm:1.1.1" +"@csstools/postcss-sign-functions@npm:^1.1.2": + version: 1.1.2 + resolution: "@csstools/postcss-sign-functions@npm:1.1.2" dependencies: - "@csstools/css-calc": "npm:^2.1.1" + "@csstools/css-calc": "npm:^2.1.2" "@csstools/css-parser-algorithms": "npm:^3.0.4" "@csstools/css-tokenizer": "npm:^3.0.3" peerDependencies: postcss: ^8.4 - checksum: 10c0/d9ebbbba833307aba0f490e527dd88a4796e94cc3ae0ba8ad1ada2830cdadfd3f9c9c37e18152903277905f847b71dac2ac1f9f78752aabc4c03a5c5c10157b1 + checksum: 10c0/15a1c434c3059ab884634d32374d53265c0ea5b5d1f6cb979dcfef18903edbafbf334fcbabd5b24869356db93792adfe95d88efef998b7d6b4c6f4b8393faca1 languageName: node linkType: hard -"@csstools/postcss-stepped-value-functions@npm:^4.0.6": - version: 4.0.6 - resolution: "@csstools/postcss-stepped-value-functions@npm:4.0.6" +"@csstools/postcss-stepped-value-functions@npm:^4.0.7": + version: 4.0.7 + resolution: "@csstools/postcss-stepped-value-functions@npm:4.0.7" dependencies: - "@csstools/css-calc": "npm:^2.1.1" + "@csstools/css-calc": "npm:^2.1.2" "@csstools/css-parser-algorithms": "npm:^3.0.4" "@csstools/css-tokenizer": "npm:^3.0.3" peerDependencies: postcss: ^8.4 - checksum: 10c0/9da91f2ca041a4c4a3118c3ac92b9c9ae244442423bb2d20f6861c5e8225af8f7e05b0d794ae0600dd7a23ca565f7714e066e7a3ea180350534dc0a30ae0d7f4 + checksum: 10c0/1e664f0b169abe0e8ad832844ff06b219702ba7e6af795801109bd2e90403295d5cdb2e27c17f92e60d9704b30726b4564da79e0bf66dec852d50704a8813053 languageName: node linkType: hard -"@csstools/postcss-text-decoration-shorthand@npm:^4.0.1": - version: 4.0.1 - resolution: "@csstools/postcss-text-decoration-shorthand@npm:4.0.1" +"@csstools/postcss-text-decoration-shorthand@npm:^4.0.2": + version: 4.0.2 + resolution: "@csstools/postcss-text-decoration-shorthand@npm:4.0.2" dependencies: - "@csstools/color-helpers": "npm:^5.0.1" + "@csstools/color-helpers": "npm:^5.0.2" postcss-value-parser: "npm:^4.2.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/81950e248d6019c0066353895e0fa2a5c684b754c9af349218cb919534f5ebf79e5e9c7a10b3af1e9c56de2f246968de3b87a00d8c4102e5f88e0f05c04f9889 + checksum: 10c0/01e2f3717e7a42224dc1a746491c55a381cf208cb7588f0308eeefe730675be4c7bb56c0cc557e75999c981e67da7d0b0bb68610635752c89ef251ee435b9cac languageName: node linkType: hard -"@csstools/postcss-trigonometric-functions@npm:^4.0.6": - version: 4.0.6 - resolution: "@csstools/postcss-trigonometric-functions@npm:4.0.6" +"@csstools/postcss-trigonometric-functions@npm:^4.0.7": + version: 4.0.7 + resolution: "@csstools/postcss-trigonometric-functions@npm:4.0.7" dependencies: - "@csstools/css-calc": "npm:^2.1.1" + "@csstools/css-calc": "npm:^2.1.2" "@csstools/css-parser-algorithms": "npm:^3.0.4" "@csstools/css-tokenizer": "npm:^3.0.3" peerDependencies: postcss: ^8.4 - checksum: 10c0/b5aae978bbdca94c4a0f292ab5ec01750d8aeb62d68e0f9326b49ce94166886dfbfb48f169c9a053e874c9df78243053a30ceec91270a6022396d541d8c44ce9 + checksum: 10c0/2b01608a9f7dba6f73febfdd75269f6f88eb2a653de38a0adc6e81de57de4248bedd39b3e8b219cc49ce73b99118e285a870711953a553ddddb0bd5b2f9a5852 languageName: node linkType: hard @@ -4389,7 +4389,7 @@ __metadata: mini-css-extract-plugin: "npm:2.9.2" postcss: "npm:8.5.3" postcss-loader: "npm:8.1.1" - postcss-preset-env: "npm:10.1.4" + postcss-preset-env: "npm:10.1.5" postcss-scss: "npm:4.0.9" prettier: "npm:3.5.2" sass: "npm:1.85.0" @@ -5358,18 +5358,18 @@ __metadata: languageName: node linkType: hard -"postcss-color-functional-notation@npm:^7.0.7": - version: 7.0.7 - resolution: "postcss-color-functional-notation@npm:7.0.7" +"postcss-color-functional-notation@npm:^7.0.8": + version: 7.0.8 + resolution: "postcss-color-functional-notation@npm:7.0.8" dependencies: - "@csstools/css-color-parser": "npm:^3.0.7" + "@csstools/css-color-parser": "npm:^3.0.8" "@csstools/css-parser-algorithms": "npm:^3.0.4" "@csstools/css-tokenizer": "npm:^3.0.3" "@csstools/postcss-progressive-custom-properties": "npm:^4.0.0" "@csstools/utilities": "npm:^2.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/d9f64abb54da1e2e2641d68548e5fe3685e1b5f85cd39059f1e9312f9c897eef80a76d1e9b9271d4700a5954fc0c0b6494fc8ed4a25fe64a25525b3973be4a36 + checksum: 10c0/4180e2f6ee9c925d6c47e727cfc50de2186d4a5cfda6e1ccf28f60e5536b418ddd90f9cc5f9cbcd1900f74098101bca8f844867e16b591e66760300e34257e47 languageName: node linkType: hard @@ -5580,18 +5580,18 @@ __metadata: languageName: node linkType: hard -"postcss-lab-function@npm:^7.0.7": - version: 7.0.7 - resolution: "postcss-lab-function@npm:7.0.7" +"postcss-lab-function@npm:^7.0.8": + version: 7.0.8 + resolution: "postcss-lab-function@npm:7.0.8" dependencies: - "@csstools/css-color-parser": "npm:^3.0.7" + "@csstools/css-color-parser": "npm:^3.0.8" "@csstools/css-parser-algorithms": "npm:^3.0.4" "@csstools/css-tokenizer": "npm:^3.0.3" "@csstools/postcss-progressive-custom-properties": "npm:^4.0.0" "@csstools/utilities": "npm:^2.0.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/bee0f50c3f59da04b219b528cdd63b8f2600fd9bbaa02ba101593f29f4cd090c25acc40254a41a11e3db221cc98b7a1b2600fd3abe3065262c2cb5c7501a3dba + checksum: 10c0/5f7b6f95cb3d1aa099c16dcdd89c575f112387600f30949f74c205e0846c9303ca851be794fad9fd56825859d38ac811f972cc34bbc2dfcf71371c640165ddfb languageName: node linkType: hard @@ -5615,14 +5615,14 @@ __metadata: languageName: node linkType: hard -"postcss-logical@npm:^8.0.0": - version: 8.0.0 - resolution: "postcss-logical@npm:8.0.0" +"postcss-logical@npm:^8.1.0": + version: 8.1.0 + resolution: "postcss-logical@npm:8.1.0" dependencies: postcss-value-parser: "npm:^4.2.0" peerDependencies: postcss: ^8.4 - checksum: 10c0/2caa04e45227ab9dec728416ccde47514e1c347ee72aac58e13ecee3bc7fbc8b53e3fe4f1e2e4396432feb1d54e70a1f06ec5a74d60e84bafff05ab82f196475 + checksum: 10c0/0e2e9e901d8a550db7f682d46b1f7e4f363c1ada061dc8e4548e2b563c5e39f3684a2d7c3f11fe061188782bca37874e34967fc6179fa6d98a49ff66a0076d27 languageName: node linkType: hard @@ -5915,19 +5915,19 @@ __metadata: languageName: node linkType: hard -"postcss-preset-env@npm:10.1.4": - version: 10.1.4 - resolution: "postcss-preset-env@npm:10.1.4" +"postcss-preset-env@npm:10.1.5": + version: 10.1.5 + resolution: "postcss-preset-env@npm:10.1.5" dependencies: "@csstools/postcss-cascade-layers": "npm:^5.0.1" - "@csstools/postcss-color-function": "npm:^4.0.7" - "@csstools/postcss-color-mix-function": "npm:^3.0.7" + "@csstools/postcss-color-function": "npm:^4.0.8" + "@csstools/postcss-color-mix-function": "npm:^3.0.8" "@csstools/postcss-content-alt-text": "npm:^2.0.4" - "@csstools/postcss-exponential-functions": "npm:^2.0.6" + "@csstools/postcss-exponential-functions": "npm:^2.0.7" "@csstools/postcss-font-format-keywords": "npm:^4.0.0" - "@csstools/postcss-gamut-mapping": "npm:^2.0.7" - "@csstools/postcss-gradients-interpolation-method": "npm:^5.0.7" - "@csstools/postcss-hwb-function": "npm:^4.0.7" + "@csstools/postcss-gamut-mapping": "npm:^2.0.8" + "@csstools/postcss-gradients-interpolation-method": "npm:^5.0.8" + "@csstools/postcss-hwb-function": "npm:^4.0.8" "@csstools/postcss-ic-unit": "npm:^4.0.0" "@csstools/postcss-initial": "npm:^2.0.1" "@csstools/postcss-is-pseudo-class": "npm:^5.0.1" @@ -5937,19 +5937,19 @@ __metadata: "@csstools/postcss-logical-overscroll-behavior": "npm:^2.0.0" "@csstools/postcss-logical-resize": "npm:^3.0.0" "@csstools/postcss-logical-viewport-units": "npm:^3.0.3" - "@csstools/postcss-media-minmax": "npm:^2.0.6" + "@csstools/postcss-media-minmax": "npm:^2.0.7" "@csstools/postcss-media-queries-aspect-ratio-number-values": "npm:^3.0.4" "@csstools/postcss-nested-calc": "npm:^4.0.0" "@csstools/postcss-normalize-display-values": "npm:^4.0.0" - "@csstools/postcss-oklab-function": "npm:^4.0.7" + "@csstools/postcss-oklab-function": "npm:^4.0.8" "@csstools/postcss-progressive-custom-properties": "npm:^4.0.0" - "@csstools/postcss-random-function": "npm:^1.0.2" - "@csstools/postcss-relative-color-syntax": "npm:^3.0.7" + "@csstools/postcss-random-function": "npm:^1.0.3" + "@csstools/postcss-relative-color-syntax": "npm:^3.0.8" "@csstools/postcss-scope-pseudo-class": "npm:^4.0.1" - "@csstools/postcss-sign-functions": "npm:^1.1.1" - "@csstools/postcss-stepped-value-functions": "npm:^4.0.6" - "@csstools/postcss-text-decoration-shorthand": "npm:^4.0.1" - "@csstools/postcss-trigonometric-functions": "npm:^4.0.6" + "@csstools/postcss-sign-functions": "npm:^1.1.2" + "@csstools/postcss-stepped-value-functions": "npm:^4.0.7" + "@csstools/postcss-text-decoration-shorthand": "npm:^4.0.2" + "@csstools/postcss-trigonometric-functions": "npm:^4.0.7" "@csstools/postcss-unset-value": "npm:^4.0.0" autoprefixer: "npm:^10.4.19" browserslist: "npm:^4.24.4" @@ -5959,7 +5959,7 @@ __metadata: cssdb: "npm:^8.2.3" postcss-attribute-case-insensitive: "npm:^7.0.1" postcss-clamp: "npm:^4.1.0" - postcss-color-functional-notation: "npm:^7.0.7" + postcss-color-functional-notation: "npm:^7.0.8" postcss-color-hex-alpha: "npm:^10.0.0" postcss-color-rebeccapurple: "npm:^10.0.0" postcss-custom-media: "npm:^11.0.5" @@ -5972,8 +5972,8 @@ __metadata: postcss-font-variant: "npm:^5.0.0" postcss-gap-properties: "npm:^6.0.0" postcss-image-set-function: "npm:^7.0.0" - postcss-lab-function: "npm:^7.0.7" - postcss-logical: "npm:^8.0.0" + postcss-lab-function: "npm:^7.0.8" + postcss-logical: "npm:^8.1.0" postcss-nesting: "npm:^13.0.1" postcss-opacity-percentage: "npm:^3.0.0" postcss-overflow-shorthand: "npm:^6.0.0" @@ -5984,7 +5984,7 @@ __metadata: postcss-selector-not: "npm:^8.0.1" peerDependencies: postcss: ^8.4 - checksum: 10c0/bd3ad0a32fa30e53f4fdfb980b77d4e86a53ad40681dd8f7d2d9fb00728730b426cd7d039b57f0849261014e4c9e5a55f72edfda1c70165c96a52f246d273ebb + checksum: 10c0/5ed5aeb7c9718230742a56d9b49e05a90135bc4bb77f97d9978bdb0b999d36a2d6175d99360c966cb7a307c9efe4b8792f4c0b79ec99a233f9e1c1ebae4244f0 languageName: node linkType: hard From 63cfaf7a6d19ce1827e2f84455af492b6c742f41 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 5 Mar 2025 10:00:39 -0800 Subject: [PATCH 81/99] Update dependency sass to v1.85.1 (#10356) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index f35058d7b7..83a8741eb7 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "postcss-preset-env": "10.1.5", "postcss-scss": "4.0.9", "prettier": "3.5.2", - "sass": "1.85.0", + "sass": "1.85.1", "sass-loader": "16.0.5", "style-loader": "4.0.0", "stylelint": "16.14.1", diff --git a/yarn.lock b/yarn.lock index 9fba8e8f34..931d3f8a0e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4392,7 +4392,7 @@ __metadata: postcss-preset-env: "npm:10.1.5" postcss-scss: "npm:4.0.9" prettier: "npm:3.5.2" - sass: "npm:1.85.0" + sass: "npm:1.85.1" sass-loader: "npm:16.0.5" sortablejs: "npm:1.15.6" style-loader: "npm:4.0.0" @@ -6414,9 +6414,9 @@ __metadata: languageName: node linkType: hard -"sass@npm:1.85.0": - version: 1.85.0 - resolution: "sass@npm:1.85.0" +"sass@npm:1.85.1": + version: 1.85.1 + resolution: "sass@npm:1.85.1" dependencies: "@parcel/watcher": "npm:^2.4.1" chokidar: "npm:^4.0.0" @@ -6427,7 +6427,7 @@ __metadata: optional: true bin: sass: sass.js - checksum: 10c0/a1af0c0596ae1904f66337d0c70a684db6e12210f97be4326cc3dcf18b0f956d7bc45ab2bcc7a8422d433d3eb3c9cb2cc8e60b2dafbdd01fb1ae5a23f5424690 + checksum: 10c0/f843aa1df1dca2f0e9cb2fb247e4939fd514ae4c182cdd1900a0622c0d71b40dfb1c4225f78b78e165a318287ca137ec597695db3e496408bd16a921a2bc2b3f languageName: node linkType: hard From 13c0d9dd2f8be4a9e7dc34978da7a44f2160eccc Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 5 Mar 2025 10:01:43 -0800 Subject: [PATCH 82/99] Update dependency babel-loader to v10 (#10367) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 92 ++++------------------------------------------------ 2 files changed, 8 insertions(+), 86 deletions(-) diff --git a/package.json b/package.json index 83a8741eb7..353308fe4d 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "@babel/core": "7.26.9", "@babel/preset-env": "7.26.9", "@eslint/js": "9.21.0", - "babel-loader": "9.2.1", + "babel-loader": "10.0.0", "clean-webpack-plugin": "4.0.0", "css-loader": "7.1.2", "css-minimizer-webpack-plugin": "7.0.0", diff --git a/yarn.lock b/yarn.lock index 931d3f8a0e..ba3289eb4d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2618,16 +2618,15 @@ __metadata: languageName: node linkType: hard -"babel-loader@npm:9.2.1": - version: 9.2.1 - resolution: "babel-loader@npm:9.2.1" +"babel-loader@npm:10.0.0": + version: 10.0.0 + resolution: "babel-loader@npm:10.0.0" dependencies: - find-cache-dir: "npm:^4.0.0" - schema-utils: "npm:^4.0.0" + find-up: "npm:^5.0.0" peerDependencies: "@babel/core": ^7.12.0 - webpack: ">=5" - checksum: 10c0/efb82faff4c7c27e9c15bb28bf11c73200e61cf365118a9514e8d74dd489d0afc2a0d5aaa62cb4254eefc2ab631579224d95a03fd245410f28ea75e24de54ba4 + webpack: ">=5.61.0" + checksum: 10c0/882dfacde3ee24b432ad57e468832cd0821e2a410f6c5b75ff945f069a8956592b28c6c357df5bb03db73d2741ec3db5febb106ac0bb3591c3d4288f2cf4df0e languageName: node linkType: hard @@ -2963,13 +2962,6 @@ __metadata: languageName: node linkType: hard -"common-path-prefix@npm:^3.0.0": - version: 3.0.0 - resolution: "common-path-prefix@npm:3.0.0" - checksum: 10c0/c4a74294e1b1570f4a8ab435285d185a03976c323caa16359053e749db4fde44e3e6586c29cd051100335e11895767cbbd27ea389108e327d62f38daf4548fdb - languageName: node - linkType: hard - "concat-map@npm:0.0.1": version: 0.0.1 resolution: "concat-map@npm:0.0.1" @@ -3729,16 +3721,6 @@ __metadata: languageName: node linkType: hard -"find-cache-dir@npm:^4.0.0": - version: 4.0.0 - resolution: "find-cache-dir@npm:4.0.0" - dependencies: - common-path-prefix: "npm:^3.0.0" - pkg-dir: "npm:^7.0.0" - checksum: 10c0/0faa7956974726c8769671de696d24c643ca1e5b8f7a2401283caa9e07a5da093293e0a0f4bd18c920ec981d2ef945c7f5b946cde268dfc9077d833ad0293cff - languageName: node - linkType: hard - "find-up@npm:^4.0.0": version: 4.1.0 resolution: "find-up@npm:4.1.0" @@ -3759,16 +3741,6 @@ __metadata: languageName: node linkType: hard -"find-up@npm:^6.3.0": - version: 6.3.0 - resolution: "find-up@npm:6.3.0" - dependencies: - locate-path: "npm:^7.1.0" - path-exists: "npm:^5.0.0" - checksum: 10c0/07e0314362d316b2b13f7f11ea4692d5191e718ca3f7264110127520f3347996349bf9e16805abae3e196805814bc66ef4bff2b8904dc4a6476085fc9b0eba07 - languageName: node - linkType: hard - "flat-cache@npm:^4.0.0": version: 4.0.1 resolution: "flat-cache@npm:4.0.1" @@ -4373,7 +4345,7 @@ __metadata: "@babel/core": "npm:7.26.9" "@babel/preset-env": "npm:7.26.9" "@eslint/js": "npm:9.21.0" - babel-loader: "npm:9.2.1" + babel-loader: "npm:10.0.0" clean-webpack-plugin: "npm:4.0.0" css-loader: "npm:7.1.2" css-minimizer-webpack-plugin: "npm:7.0.0" @@ -4662,15 +4634,6 @@ __metadata: languageName: node linkType: hard -"locate-path@npm:^7.1.0": - version: 7.2.0 - resolution: "locate-path@npm:7.2.0" - dependencies: - p-locate: "npm:^6.0.0" - checksum: 10c0/139e8a7fe11cfbd7f20db03923cacfa5db9e14fa14887ea121345597472b4a63c1a42a8a5187defeeff6acf98fd568da7382aa39682d38f0af27433953a97751 - languageName: node - linkType: hard - "lodash.debounce@npm:^4.0.8": version: 4.0.8 resolution: "lodash.debounce@npm:4.0.8" @@ -5118,15 +5081,6 @@ __metadata: languageName: node linkType: hard -"p-limit@npm:^4.0.0": - version: 4.0.0 - resolution: "p-limit@npm:4.0.0" - dependencies: - yocto-queue: "npm:^1.0.0" - checksum: 10c0/a56af34a77f8df2ff61ddfb29431044557fcbcb7642d5a3233143ebba805fc7306ac1d448de724352861cb99de934bc9ab74f0d16fe6a5460bdbdf938de875ad - languageName: node - linkType: hard - "p-locate@npm:^4.1.0": version: 4.1.0 resolution: "p-locate@npm:4.1.0" @@ -5145,15 +5099,6 @@ __metadata: languageName: node linkType: hard -"p-locate@npm:^6.0.0": - version: 6.0.0 - resolution: "p-locate@npm:6.0.0" - dependencies: - p-limit: "npm:^4.0.0" - checksum: 10c0/d72fa2f41adce59c198270aa4d3c832536c87a1806e0f69dffb7c1a7ca998fb053915ca833d90f166a8c082d3859eabfed95f01698a3214c20df6bb8de046312 - languageName: node - linkType: hard - "p-map@npm:^2.0.0": version: 2.1.0 resolution: "p-map@npm:2.1.0" @@ -5210,13 +5155,6 @@ __metadata: languageName: node linkType: hard -"path-exists@npm:^5.0.0": - version: 5.0.0 - resolution: "path-exists@npm:5.0.0" - checksum: 10c0/b170f3060b31604cde93eefdb7392b89d832dfbc1bed717c9718cbe0f230c1669b7e75f87e19901da2250b84d092989a0f9e44d2ef41deb09aa3ad28e691a40a - languageName: node - linkType: hard - "path-is-absolute@npm:^1.0.0": version: 1.0.1 resolution: "path-is-absolute@npm:1.0.1" @@ -5315,15 +5253,6 @@ __metadata: languageName: node linkType: hard -"pkg-dir@npm:^7.0.0": - version: 7.0.0 - resolution: "pkg-dir@npm:7.0.0" - dependencies: - find-up: "npm:^6.3.0" - checksum: 10c0/1afb23d2efb1ec9d8b2c4a0c37bf146822ad2774f074cb05b853be5dca1b40815c5960dd126df30ab8908349262a266f31b771e877235870a3b8fd313beebec5 - languageName: node - linkType: hard - "postcss-attribute-case-insensitive@npm:^7.0.1": version: 7.0.1 resolution: "postcss-attribute-case-insensitive@npm:7.0.1" @@ -7312,10 +7241,3 @@ __metadata: checksum: 10c0/dceb44c28578b31641e13695d200d34ec4ab3966a5729814d5445b194933c096b7ced71494ce53a0e8820685d1d010df8b2422e5bf2cdea7e469d97ffbea306f languageName: node linkType: hard - -"yocto-queue@npm:^1.0.0": - version: 1.1.1 - resolution: "yocto-queue@npm:1.1.1" - checksum: 10c0/cb287fe5e6acfa82690acb43c283de34e945c571a78a939774f6eaba7c285bacdf6c90fbc16ce530060863984c906d2b4c6ceb069c94d1e0a06d5f2b458e2a92 - languageName: node - linkType: hard From af7383ea38841905f030da4e32168d0334942ee9 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 5 Mar 2025 10:02:30 -0800 Subject: [PATCH 83/99] Update dependency stylelint to v16.15.0 (#10369) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 76 ++++++++++++++++++++++++++-------------------------- 2 files changed, 39 insertions(+), 39 deletions(-) diff --git a/package.json b/package.json index 353308fe4d..30cd8f2f86 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,7 @@ "sass": "1.85.1", "sass-loader": "16.0.5", "style-loader": "4.0.0", - "stylelint": "16.14.1", + "stylelint": "16.15.0", "stylelint-checkstyle-reporter": "1.0.0", "stylelint-config-standard-scss": "14.0.0", "webpack": "5.98.0", diff --git a/yarn.lock b/yarn.lock index ba3289eb4d..45e46c93dd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2787,13 +2787,13 @@ __metadata: languageName: node linkType: hard -"cacheable@npm:^1.8.7": - version: 1.8.7 - resolution: "cacheable@npm:1.8.7" +"cacheable@npm:^1.8.8": + version: 1.8.8 + resolution: "cacheable@npm:1.8.8" dependencies: - hookified: "npm:^1.6.0" + hookified: "npm:^1.7.0" keyv: "npm:^5.2.3" - checksum: 10c0/3403c2afe9f8bb804b2371e2aa45f10c1f817945ce20b3da2338d2f0b099c9a9d28e59939592e832ba0e6b1d932f8555cc0a0d815ca7bd68a086e1ad131ae40a + checksum: 10c0/24e0f93782015be75b1ec9fe3fb151b2921f61c282091b873f78a0efeb141e95a21d8aa5f4c6bd99a8acb0b485deb5801aa32b4ecf4b666efa7446739368588b languageName: node linkType: hard @@ -3694,12 +3694,12 @@ __metadata: languageName: node linkType: hard -"file-entry-cache@npm:^10.0.5": - version: 10.0.5 - resolution: "file-entry-cache@npm:10.0.5" +"file-entry-cache@npm:^10.0.6": + version: 10.0.6 + resolution: "file-entry-cache@npm:10.0.6" dependencies: - flat-cache: "npm:^6.1.5" - checksum: 10c0/c7d9bd537d1862db5357ecc688a22dc9287c2590e9eba04e85e0601d6143905eaa5edc5534f1dd92e24713f230ee69d99e150d7b6120c6d940f40beccdd5caf3 + flat-cache: "npm:^6.1.6" + checksum: 10c0/4e7226a5dbe7b5130c848c5fd3a352bb16e4ddb1de10cb4b3ea8375f6ab6085ed10da4db2db8119c61fc7e56fc59a40eeb837a4ae1a3a7c8357a17e69004f113 languageName: node linkType: hard @@ -3751,14 +3751,14 @@ __metadata: languageName: node linkType: hard -"flat-cache@npm:^6.1.5": - version: 6.1.5 - resolution: "flat-cache@npm:6.1.5" +"flat-cache@npm:^6.1.6": + version: 6.1.6 + resolution: "flat-cache@npm:6.1.6" dependencies: - cacheable: "npm:^1.8.7" + cacheable: "npm:^1.8.8" flatted: "npm:^3.3.2" - hookified: "npm:^1.6.0" - checksum: 10c0/b107edc1c24a8fabe89645001fb8b1479016177d92be45dc6ba739e688131fe35fffbf13516d2f7bb3dc5c1256ff8721f16ec1858c4ee77e46f93c9093c53689 + hookified: "npm:^1.7.0" + checksum: 10c0/2aeba555b61d32d7f0803e6b6b3ba959610cdc0e5b591ed0f80a3ad70c4e80e81afb6853c495cafdcbc3a02386d76a1522babcf04e50c4a1e81df2decfd02e9f languageName: node linkType: hard @@ -4043,10 +4043,10 @@ __metadata: languageName: node linkType: hard -"hookified@npm:^1.6.0": - version: 1.6.0 - resolution: "hookified@npm:1.6.0" - checksum: 10c0/00ae9502315a21b559c2d057e02d1418a812e015df701b89f590ddbce135e422058e6e97b1047ef4b0b96477bf08e36f3f572fe247c8f3370a126555800ae46f +"hookified@npm:^1.7.0": + version: 1.7.1 + resolution: "hookified@npm:1.7.1" + checksum: 10c0/779cb2f912d19f9cf00ec081d2fb07068553093e8cfaab7fb536b45a04b5743ac836e7fd4d09f1473f82c105338aa2539a104e5fb28e55f4ec1ce0be28ea9acc languageName: node linkType: hard @@ -4368,7 +4368,7 @@ __metadata: sass-loader: "npm:16.0.5" sortablejs: "npm:1.15.6" style-loader: "npm:4.0.0" - stylelint: "npm:16.14.1" + stylelint: "npm:16.15.0" stylelint-checkstyle-reporter: "npm:1.0.0" stylelint-config-standard-scss: "npm:14.0.0" tippy.js: "npm:6.3.7" @@ -6006,13 +6006,13 @@ __metadata: languageName: node linkType: hard -"postcss-selector-parser@npm:^7.0.0": - version: 7.0.0 - resolution: "postcss-selector-parser@npm:7.0.0" +"postcss-selector-parser@npm:^7.0.0, postcss-selector-parser@npm:^7.1.0": + version: 7.1.0 + resolution: "postcss-selector-parser@npm:7.1.0" dependencies: cssesc: "npm:^3.0.0" util-deprecate: "npm:^1.0.2" - checksum: 10c0/e96e096afcce70bf5c97789f5ea09d7415ae5eb701d82b05b5e8532885d31363b484fcb1ca9488c9a331f30508d9e5bb6c3109eb2eb5067ef3d3919f9928cd9d + checksum: 10c0/0fef257cfd1c0fe93c18a3f8a6e739b4438b527054fd77e9a62730a89b2d0ded1b59314a7e4aaa55bc256204f40830fecd2eb50f20f8cb7ab3a10b52aa06c8aa languageName: node linkType: hard @@ -6046,7 +6046,7 @@ __metadata: languageName: node linkType: hard -"postcss@npm:8.5.3, postcss@npm:^8.4.33, postcss@npm:^8.4.38, postcss@npm:^8.5.1": +"postcss@npm:8.5.3, postcss@npm:^8.4.33, postcss@npm:^8.4.38, postcss@npm:^8.5.3": version: 8.5.3 resolution: "postcss@npm:8.5.3" dependencies: @@ -6698,9 +6698,9 @@ __metadata: languageName: node linkType: hard -"stylelint@npm:16.14.1": - version: 16.14.1 - resolution: "stylelint@npm:16.14.1" +"stylelint@npm:16.15.0": + version: 16.15.0 + resolution: "stylelint@npm:16.15.0" dependencies: "@csstools/css-parser-algorithms": "npm:^3.0.4" "@csstools/css-tokenizer": "npm:^3.0.3" @@ -6715,7 +6715,7 @@ __metadata: debug: "npm:^4.3.7" fast-glob: "npm:^3.3.3" fastest-levenshtein: "npm:^1.0.16" - file-entry-cache: "npm:^10.0.5" + file-entry-cache: "npm:^10.0.6" global-modules: "npm:^2.0.0" globby: "npm:^11.1.0" globjoin: "npm:^0.1.4" @@ -6729,20 +6729,20 @@ __metadata: micromatch: "npm:^4.0.8" normalize-path: "npm:^3.0.0" picocolors: "npm:^1.1.1" - postcss: "npm:^8.5.1" + postcss: "npm:^8.5.3" postcss-resolve-nested-selector: "npm:^0.1.6" postcss-safe-parser: "npm:^7.0.1" - postcss-selector-parser: "npm:^7.0.0" + postcss-selector-parser: "npm:^7.1.0" postcss-value-parser: "npm:^4.2.0" resolve-from: "npm:^5.0.0" string-width: "npm:^4.2.3" - supports-hyperlinks: "npm:^3.1.0" + supports-hyperlinks: "npm:^3.2.0" svg-tags: "npm:^1.0.0" table: "npm:^6.9.0" write-file-atomic: "npm:^5.0.1" bin: stylelint: bin/stylelint.mjs - checksum: 10c0/cce94374dc721d491d955f548ee81ba835d4955fa37d58a11323454f9f3721e5644fa89a04c14f85bdfa12790bdd043a41be2001a99cb0bfe23b38eb933199d7 + checksum: 10c0/32dee221fe8980e08adcdc7c48ddab51eac263784b0cc2f4eb9c029e3589ad6ce7dae710ec2aadb57bdbfecec579326c75918686f1563576715cbd3095c5dd12 languageName: node linkType: hard @@ -6764,13 +6764,13 @@ __metadata: languageName: node linkType: hard -"supports-hyperlinks@npm:^3.1.0": - version: 3.1.0 - resolution: "supports-hyperlinks@npm:3.1.0" +"supports-hyperlinks@npm:^3.2.0": + version: 3.2.0 + resolution: "supports-hyperlinks@npm:3.2.0" dependencies: has-flag: "npm:^4.0.0" supports-color: "npm:^7.0.0" - checksum: 10c0/78cc3e17eb27e6846fa355a8ebf343befe36272899cd409e45317a06c1997e95c23ff99d91080a517bd8c96508d4fa456e6ceb338c02ba5d7544277dbec0f10f + checksum: 10c0/bca527f38d4c45bc95d6a24225944675746c515ddb91e2456d00ae0b5c537658e9dd8155b996b191941b0c19036195a098251304b9082bbe00cd1781f3cd838e languageName: node linkType: hard From 4721709e9319d08b8f6d3e148e06bda7095bfff9 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 5 Mar 2025 10:03:39 -0800 Subject: [PATCH 84/99] Update Yarn to v4.7.0 (#10373) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 30cd8f2f86..b532409c2d 100644 --- a/package.json +++ b/package.json @@ -68,5 +68,5 @@ "engines": { "node": ">=20.0.0" }, - "packageManager": "yarn@4.6.0" + "packageManager": "yarn@4.7.0" } From f964e565ee54fda6c006e02cac5b23e9ef43fa62 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 5 Mar 2025 10:14:19 -0800 Subject: [PATCH 85/99] Update dependency prettier to v3.5.3 (#10375) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index b532409c2d..4d3f190e0d 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,7 @@ "postcss-loader": "8.1.1", "postcss-preset-env": "10.1.5", "postcss-scss": "4.0.9", - "prettier": "3.5.2", + "prettier": "3.5.3", "sass": "1.85.1", "sass-loader": "16.0.5", "style-loader": "4.0.0", diff --git a/yarn.lock b/yarn.lock index 45e46c93dd..dec3527375 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4363,7 +4363,7 @@ __metadata: postcss-loader: "npm:8.1.1" postcss-preset-env: "npm:10.1.5" postcss-scss: "npm:4.0.9" - prettier: "npm:3.5.2" + prettier: "npm:3.5.3" sass: "npm:1.85.1" sass-loader: "npm:16.0.5" sortablejs: "npm:1.15.6" @@ -6064,12 +6064,12 @@ __metadata: languageName: node linkType: hard -"prettier@npm:3.5.2": - version: 3.5.2 - resolution: "prettier@npm:3.5.2" +"prettier@npm:3.5.3": + version: 3.5.3 + resolution: "prettier@npm:3.5.3" bin: prettier: bin/prettier.cjs - checksum: 10c0/d7b597ed33f39c32ace675896ad187f06a3e48dc8a1e80051b5c5f0dae3586d53981704b8fda5ac3b080e6c2e0e197d239131b953702674f044351621ca5e1ac + checksum: 10c0/3880cb90b9dc0635819ab52ff571518c35bd7f15a6e80a2054c05dbc8a3aa6e74f135519e91197de63705bcb38388ded7e7230e2178432a1468005406238b877 languageName: node linkType: hard From 4c96f3a6fbd570fc9898cca6c9d24fcecfc0172a Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 5 Mar 2025 13:15:53 -0800 Subject: [PATCH 86/99] Update dependency org.jenkins-ci.plugins:cloudbees-folder to v6.985.va_f1635030cc5 (#10374) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- test/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/pom.xml b/test/pom.xml index 942067ea13..97f51d7196 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -218,7 +218,7 @@ THE SOFTWARE. org.jenkins-ci.plugins cloudbees-folder - 6.982.vf165a_16c9507 + 6.985.va_f1635030cc5 test From 560e57ffae7f613a419aa53e8151c6c913a2b920 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 5 Mar 2025 14:43:28 -0800 Subject: [PATCH 87/99] Update dependency org.jenkins-ci:jenkins to v1.130 (#10376) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- cli/src/main/java/hudson/cli/CLI.java | 4 ++-- core/src/main/java/hudson/DescriptorExtensionList.java | 2 ++ core/src/main/java/hudson/console/ModelHyperlinkNote.java | 2 ++ .../main/java/hudson/model/AutoCompletionCandidates.java | 2 -- core/src/main/java/hudson/model/FileParameterValue.java | 2 +- core/src/main/java/hudson/model/UpdateSite.java | 2 +- .../hudson/security/AuthenticationProcessingFilter2.java | 1 - .../java/hudson/security/BasicAuthenticationFilter.java | 2 -- .../java/hudson/security/HudsonPrivateSecurityRealm.java | 3 +-- core/src/main/java/hudson/slaves/SlaveComputer.java | 8 ++++++-- core/src/main/java/hudson/util/RemotingDiagnostics.java | 8 ++++++-- core/src/main/java/hudson/util/jna/Advapi32.java | 1 - core/src/main/java/hudson/util/jna/SHELLEXECUTEINFO.java | 2 -- .../java/jenkins/fingerprints/FileFingerprintStorage.java | 1 - .../formelementpath/FormElementPathPageDecorator.java | 2 -- core/src/main/java/jenkins/install/SetupWizard.java | 3 --- core/src/main/java/jenkins/security/ApiTokenProperty.java | 4 ---- .../java/jenkins/security/apitoken/ApiTokenStore.java | 1 - .../main/java/jenkins/util/JSONSignatureValidator.java | 1 - core/src/main/java/jenkins/util/ScriptListener.java | 3 --- core/src/main/java/jenkins/util/io/PathRemover.java | 3 --- core/src/main/java/jenkins/widgets/HistoryPageFilter.java | 1 - core/src/main/java/org/jenkins/ui/symbol/Symbol.java | 2 -- pom.xml | 2 +- 24 files changed, 22 insertions(+), 40 deletions(-) diff --git a/cli/src/main/java/hudson/cli/CLI.java b/cli/src/main/java/hudson/cli/CLI.java index 988e9f1635..3dc65e7dfb 100644 --- a/cli/src/main/java/hudson/cli/CLI.java +++ b/cli/src/main/java/hudson/cli/CLI.java @@ -318,7 +318,7 @@ public class CLI { throw new AssertionError(); } - @SuppressFBWarnings(value = {"PATH_TRAVERSAL_IN", "URLCONNECTION_SSRF_FD"}, justification = "User provided values for running the program.") + @SuppressFBWarnings(value = "PATH_TRAVERSAL_IN", justification = "User provided value for running the program.") private static String readAuthFromFile(String auth) throws IOException { Path path; try { @@ -329,7 +329,7 @@ public class CLI { return Files.readString(path, Charset.defaultCharset()); } - @SuppressFBWarnings(value = {"PATH_TRAVERSAL_IN", "URLCONNECTION_SSRF_FD"}, justification = "User provided values for running the program.") + @SuppressFBWarnings(value = "PATH_TRAVERSAL_IN", justification = "User provided value for running the program.") private static File getFileFromArguments(List args) { return new File(args.get(1)); } diff --git a/core/src/main/java/hudson/DescriptorExtensionList.java b/core/src/main/java/hudson/DescriptorExtensionList.java index c658c83fe1..18876582e5 100644 --- a/core/src/main/java/hudson/DescriptorExtensionList.java +++ b/core/src/main/java/hudson/DescriptorExtensionList.java @@ -26,6 +26,7 @@ package hudson; import edu.umd.cs.findbugs.annotations.CheckForNull; import edu.umd.cs.findbugs.annotations.NonNull; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import hudson.model.Describable; import hudson.model.Descriptor; import hudson.model.Descriptor.FormException; @@ -274,6 +275,7 @@ public class DescriptorExtensionList, D extends Descrip /** * Exposed just for the test harness. Clear legacy instances. */ + @SuppressFBWarnings(value = "HSM_HIDING_METHOD", justification = "TODO needs triage") public static void clearLegacyInstances() { legacyDescriptors.clear(); } diff --git a/core/src/main/java/hudson/console/ModelHyperlinkNote.java b/core/src/main/java/hudson/console/ModelHyperlinkNote.java index abf6e371cf..3e8d045366 100644 --- a/core/src/main/java/hudson/console/ModelHyperlinkNote.java +++ b/core/src/main/java/hudson/console/ModelHyperlinkNote.java @@ -1,6 +1,7 @@ package hudson.console; import edu.umd.cs.findbugs.annotations.NonNull; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import hudson.Extension; import hudson.model.Computer; import hudson.model.Item; @@ -66,6 +67,7 @@ public class ModelHyperlinkNote extends HyperlinkNote { return encodeTo("/" + label.getUrl(), label.getName()); } + @SuppressFBWarnings(value = "HSM_HIDING_METHOD", justification = "TODO needs triage") public static String encodeTo(String url, String text) { return HyperlinkNote.encodeTo(url, text, ModelHyperlinkNote::new); } diff --git a/core/src/main/java/hudson/model/AutoCompletionCandidates.java b/core/src/main/java/hudson/model/AutoCompletionCandidates.java index 366f626e31..0e487ef2f4 100644 --- a/core/src/main/java/hudson/model/AutoCompletionCandidates.java +++ b/core/src/main/java/hudson/model/AutoCompletionCandidates.java @@ -25,7 +25,6 @@ package hudson.model; import edu.umd.cs.findbugs.annotations.CheckForNull; -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import hudson.search.Search; import hudson.search.UserSearchProperty; import jakarta.servlet.ServletException; @@ -109,7 +108,6 @@ public class AutoCompletionCandidates implements HttpResponse { * The nearby contextual {@link ItemGroup} to resolve relative job names from. * @since 1.553 */ - @SuppressFBWarnings(value = "SBSC_USE_STRINGBUFFER_CONCATENATION", justification = "no big deal") public static AutoCompletionCandidates ofJobNames(final Class type, final String value, ItemGroup container) { final AutoCompletionCandidates candidates = new AutoCompletionCandidates(); class Visitor extends ItemVisitor { diff --git a/core/src/main/java/hudson/model/FileParameterValue.java b/core/src/main/java/hudson/model/FileParameterValue.java index abeb1f4181..85b4635123 100644 --- a/core/src/main/java/hudson/model/FileParameterValue.java +++ b/core/src/main/java/hudson/model/FileParameterValue.java @@ -164,7 +164,7 @@ public class FileParameterValue extends ParameterValue { @Override public BuildWrapper createBuildWrapper(AbstractBuild build) { return new BuildWrapper() { - @SuppressFBWarnings(value = {"FILE_UPLOAD_FILENAME", "NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE"}, justification = "TODO needs triage") + @SuppressFBWarnings(value = "NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE", justification = "TODO needs triage") @Override public Environment setUp(AbstractBuild build, Launcher launcher, BuildListener listener) throws IOException, InterruptedException { if (location != null && !location.isEmpty() && file.getName() != null && !file.getName().isEmpty()) { diff --git a/core/src/main/java/hudson/model/UpdateSite.java b/core/src/main/java/hudson/model/UpdateSite.java index b0c30e861e..2dd9f90610 100644 --- a/core/src/main/java/hudson/model/UpdateSite.java +++ b/core/src/main/java/hudson/model/UpdateSite.java @@ -1088,7 +1088,7 @@ public class UpdateSite { * {@code false} if it does; and {@code null} when the affected component isn't being offered, or it's a warning * for something other than core or a plugin. */ - @SuppressFBWarnings(value = "NP_BOOLEAN_RETURN_NULL") + @SuppressFBWarnings(value = "NP_BOOLEAN_RETURN_NULL", justification = "TODO needs triage") public Boolean isFixable() { final Data data = UpdateSite.this.data; if (data == null) { diff --git a/core/src/main/java/hudson/security/AuthenticationProcessingFilter2.java b/core/src/main/java/hudson/security/AuthenticationProcessingFilter2.java index 0c9559bf14..a8913772dc 100644 --- a/core/src/main/java/hudson/security/AuthenticationProcessingFilter2.java +++ b/core/src/main/java/hudson/security/AuthenticationProcessingFilter2.java @@ -62,7 +62,6 @@ public final class AuthenticationProcessingFilter2 extends UsernamePasswordAuthe setPasswordParameter("j_password"); } - @SuppressFBWarnings(value = "RV_RETURN_VALUE_IGNORED_NO_SIDE_EFFECT", justification = "request.getSession(true) does in fact have a side effect") @Override protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain, Authentication authResult) throws IOException, ServletException { if (SystemProperties.getInteger(SecurityRealm.class.getName() + ".sessionFixationProtectionMode", 1) == 2) { diff --git a/core/src/main/java/hudson/security/BasicAuthenticationFilter.java b/core/src/main/java/hudson/security/BasicAuthenticationFilter.java index 8586fb0317..b9c1f8e9b2 100644 --- a/core/src/main/java/hudson/security/BasicAuthenticationFilter.java +++ b/core/src/main/java/hudson/security/BasicAuthenticationFilter.java @@ -24,7 +24,6 @@ package hudson.security; -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import hudson.model.User; import hudson.util.Scrambler; import jakarta.servlet.FilterChain; @@ -173,7 +172,6 @@ public class BasicAuthenticationFilter implements CompatibleFilter { d.include(req, rsp); } - @SuppressFBWarnings(value = "UNVALIDATED_REDIRECT", justification = "Redirect is validated as processed.") private void prepareRedirect(HttpServletResponse rsp, String path) { rsp.setStatus(HttpServletResponse.SC_MOVED_TEMPORARILY); rsp.setHeader("Location", path); diff --git a/core/src/main/java/hudson/security/HudsonPrivateSecurityRealm.java b/core/src/main/java/hudson/security/HudsonPrivateSecurityRealm.java index f55576dec4..24014707fa 100644 --- a/core/src/main/java/hudson/security/HudsonPrivateSecurityRealm.java +++ b/core/src/main/java/hudson/security/HudsonPrivateSecurityRealm.java @@ -940,7 +940,6 @@ public class HudsonPrivateSecurityRealm extends AbstractPasswordBasedSecurityRea static class JBCryptEncoder implements PasswordHashEncoder { // in jBCrypt the maximum is 30, which takes ~22h with laptop late-2017 // and for 18, it's "only" 20s - @SuppressFBWarnings(value = "MS_SHOULD_BE_FINAL", justification = "Accessible via System Groovy Scripts") @Restricted(NoExternalUse.class) private static int MAXIMUM_BCRYPT_LOG_ROUND = SystemProperties.getInteger(HudsonPrivateSecurityRealm.class.getName() + ".maximumBCryptLogRound", 18); @@ -1135,7 +1134,7 @@ public class HudsonPrivateSecurityRealm extends AbstractPasswordBasedSecurityRea */ private static final String ENCODED_INVALID_USER_PASSWORD = PASSWORD_ENCODER.encode(generatePassword()); - @SuppressFBWarnings(value = {"DMI_RANDOM_USED_ONLY_ONCE", "PREDICTABLE_RANDOM"}, justification = "https://github.com/spotbugs/spotbugs/issues/1539 and doesn't need to be secure, we're just not hardcoding a 'wrong' password") + @SuppressFBWarnings(value = "PREDICTABLE_RANDOM", justification = "Doesn't need to be secure, we're just not hardcoding a 'wrong' password") private static String generatePassword() { String password = new Random().ints(20, 33, 127).mapToObj(i -> (char) i) .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append).toString(); diff --git a/core/src/main/java/hudson/slaves/SlaveComputer.java b/core/src/main/java/hudson/slaves/SlaveComputer.java index 4165f53a72..901030bc0a 100644 --- a/core/src/main/java/hudson/slaves/SlaveComputer.java +++ b/core/src/main/java/hudson/slaves/SlaveComputer.java @@ -1116,10 +1116,14 @@ public class SlaveComputer extends Computer { this.ringBufferSize = ringBufferSize; } - @Override @SuppressFBWarnings(value = "ST_WRITE_TO_STATIC_FROM_INSTANCE_METHOD", justification = "field is static for the reason explained in the Javadoc for LogHolder") - public Void call() { + private void setLogHandler() { SLAVE_LOG_HANDLER = new RingBufferLogHandler(ringBufferSize); + } + + @Override + public Void call() { + setLogHandler(); // avoid double installation of the handler. Inbound agents can reconnect to the controller multiple times // and each connection gets a different RemoteClassLoader, so we need to evict them by class name, diff --git a/core/src/main/java/hudson/util/RemotingDiagnostics.java b/core/src/main/java/hudson/util/RemotingDiagnostics.java index c18e056e42..ad59767907 100644 --- a/core/src/main/java/hudson/util/RemotingDiagnostics.java +++ b/core/src/main/java/hudson/util/RemotingDiagnostics.java @@ -142,7 +142,6 @@ public final class RemotingDiagnostics { } @Override - @SuppressFBWarnings(value = "GROOVY_SHELL", justification = "script console is a feature, not a bug") public String call() throws RuntimeException { // if we run locally, cl!=null. Otherwise the delegating classloader will be available as context classloader. if (cl == null) cl = Thread.currentThread().getContextClassLoader(); @@ -158,7 +157,7 @@ public final class RemotingDiagnostics { PrintWriter pw = new PrintWriter(out); shell.setVariable("out", pw); try { - Object output = shell.evaluate(script); + Object output = evaluateScript(shell); if (output != null) pw.println("Result: " + output); } catch (Throwable t) { @@ -167,6 +166,11 @@ public final class RemotingDiagnostics { return out.toString(); } + @SuppressFBWarnings(value = "GROOVY_SHELL", justification = "script console is a feature, not a bug") + private Object evaluateScript(GroovyShell shell) { + return shell.evaluate(script); + } + private static final long serialVersionUID = 1L; } diff --git a/core/src/main/java/hudson/util/jna/Advapi32.java b/core/src/main/java/hudson/util/jna/Advapi32.java index 22433e0e91..a020861824 100644 --- a/core/src/main/java/hudson/util/jna/Advapi32.java +++ b/core/src/main/java/hudson/util/jna/Advapi32.java @@ -32,7 +32,6 @@ import java.util.List; * * @author TB */ -@SuppressFBWarnings(value = "MS_OOI_PKGPROTECT", justification = "for backward compatibility") @SuppressWarnings("UnusedReturnValue") public interface Advapi32 extends StdCallLibrary { Advapi32 INSTANCE = (Advapi32) Native.load("Advapi32", Advapi32.class, Options.UNICODE_OPTIONS); diff --git a/core/src/main/java/hudson/util/jna/SHELLEXECUTEINFO.java b/core/src/main/java/hudson/util/jna/SHELLEXECUTEINFO.java index bca0345730..5180fe0adf 100644 --- a/core/src/main/java/hudson/util/jna/SHELLEXECUTEINFO.java +++ b/core/src/main/java/hudson/util/jna/SHELLEXECUTEINFO.java @@ -89,8 +89,6 @@ public class SHELLEXECUTEINFO extends Structure { "hProcess"); } - @SuppressFBWarnings(value = {"UUF_UNUSED_PUBLIC_OR_PROTECTED_FIELD", "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD"}, - justification = "JNA Data Structure") public static class DUMMYUNIONNAME_union extends Union { public Pointer hIcon; public Pointer hMonitor; diff --git a/core/src/main/java/jenkins/fingerprints/FileFingerprintStorage.java b/core/src/main/java/jenkins/fingerprints/FileFingerprintStorage.java index 409788ba57..ae8cfda28f 100644 --- a/core/src/main/java/jenkins/fingerprints/FileFingerprintStorage.java +++ b/core/src/main/java/jenkins/fingerprints/FileFingerprintStorage.java @@ -334,7 +334,6 @@ public class FileFingerprintStorage extends FingerprintStorage { /** * Deletes a directory if it's empty. */ - @SuppressFBWarnings(value = "RCN_REDUNDANT_NULLCHECK_WOULD_HAVE_BEEN_A_NPE", justification = "https://github.com/spotbugs/spotbugs/issues/756") private void deleteIfEmpty(File dir) { try { if (Files.isDirectory(dir.toPath())) { diff --git a/core/src/main/java/jenkins/formelementpath/FormElementPathPageDecorator.java b/core/src/main/java/jenkins/formelementpath/FormElementPathPageDecorator.java index 8a1df70781..0579b083ac 100644 --- a/core/src/main/java/jenkins/formelementpath/FormElementPathPageDecorator.java +++ b/core/src/main/java/jenkins/formelementpath/FormElementPathPageDecorator.java @@ -1,6 +1,5 @@ package jenkins.formelementpath; -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import hudson.Extension; import hudson.model.PageDecorator; import jenkins.util.SystemProperties; @@ -8,7 +7,6 @@ import jenkins.util.SystemProperties; @Extension public class FormElementPathPageDecorator extends PageDecorator { - @SuppressFBWarnings(value = "MS_SHOULD_BE_FINAL", justification = "for script console") private static /*almost final */ boolean ENABLED = SystemProperties.getBoolean(FormElementPathPageDecorator.class.getName() + ".enabled"); diff --git a/core/src/main/java/jenkins/install/SetupWizard.java b/core/src/main/java/jenkins/install/SetupWizard.java index 2707807906..a0ee143ea3 100644 --- a/core/src/main/java/jenkins/install/SetupWizard.java +++ b/core/src/main/java/jenkins/install/SetupWizard.java @@ -128,7 +128,6 @@ public class SetupWizard extends PageDecorator { * @since 2.260 (with NoExternalUse) */ @Restricted(NoExternalUse.class) - @SuppressFBWarnings(value = "MS_SHOULD_BE_FINAL", justification = "Accessible via System Groovy Scripts") private static /* not final */ String ADMIN_INITIAL_API_TOKEN = SystemProperties.getString(ADMIN_INITIAL_API_TOKEN_PROPERTY_NAME); @NonNull @@ -212,7 +211,6 @@ public class SetupWizard extends PageDecorator { } } - @SuppressFBWarnings(value = "UNSAFE_HASH_EQUALS", justification = "only checked against true") private void createInitialApiToken(User user) throws IOException, InterruptedException { ApiTokenProperty apiTokenProperty = user.getProperty(ApiTokenProperty.class); @@ -763,7 +761,6 @@ public class SetupWizard extends PageDecorator { } @Override - @SuppressFBWarnings(value = "UNVALIDATED_REDIRECT", justification = "TODO needs triage") public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // Force root requests to the setup wizard if (request instanceof HttpServletRequest && !Jenkins.get().getInstallState().isSetupComplete()) { diff --git a/core/src/main/java/jenkins/security/ApiTokenProperty.java b/core/src/main/java/jenkins/security/ApiTokenProperty.java index 804b8edbc5..95cfd4c994 100644 --- a/core/src/main/java/jenkins/security/ApiTokenProperty.java +++ b/core/src/main/java/jenkins/security/ApiTokenProperty.java @@ -26,7 +26,6 @@ package jenkins.security; import edu.umd.cs.findbugs.annotations.CheckForNull; import edu.umd.cs.findbugs.annotations.NonNull; -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import hudson.Extension; import hudson.Util; import hudson.model.Descriptor.FormException; @@ -89,7 +88,6 @@ public class ApiTokenProperty extends UserProperty { * * @since 1.638 */ - @SuppressFBWarnings(value = "MS_SHOULD_BE_FINAL", justification = "Accessible via System Groovy Scripts") private static /* not final */ boolean SHOW_LEGACY_TOKEN_TO_ADMINS = SystemProperties.getBoolean(ApiTokenProperty.class.getName() + ".showTokenToAdmins"); @@ -102,7 +100,6 @@ public class ApiTokenProperty extends UserProperty { * * @since 2.129 */ - @SuppressFBWarnings(value = "MS_SHOULD_BE_FINAL", justification = "Accessible via System Groovy Scripts") private static /* not final */ boolean ADMIN_CAN_GENERATE_NEW_TOKENS = SystemProperties.getBoolean(ApiTokenProperty.class.getName() + ".adminCanGenerateNewTokens"); @@ -175,7 +172,6 @@ public class ApiTokenProperty extends UserProperty { @NonNull @Restricted(NoExternalUse.class) - @SuppressFBWarnings(value = "UNSAFE_HASH_EQUALS", justification = "Used to prevent use of pre-2013 API tokens, then returning the API token value") /*package*/ String getApiTokenInsecure() { if (apiToken == null) { return Messages.ApiTokenProperty_NoLegacyToken(); diff --git a/core/src/main/java/jenkins/security/apitoken/ApiTokenStore.java b/core/src/main/java/jenkins/security/apitoken/ApiTokenStore.java index 917be3b0fa..67945ac673 100644 --- a/core/src/main/java/jenkins/security/apitoken/ApiTokenStore.java +++ b/core/src/main/java/jenkins/security/apitoken/ApiTokenStore.java @@ -304,7 +304,6 @@ public class ApiTokenStore { * @param tokenUuid The identifier of the token, could be retrieved directly from the {@link HashedToken#getUuid()} * @return the revoked token corresponding to the given {@code tokenUuid} if one was found, otherwise {@code null} */ - @SuppressFBWarnings(value = "UNSAFE_HASH_EQUALS", justification = "Only used during revocation.") public synchronized @CheckForNull HashedToken revokeToken(@NonNull String tokenUuid) { for (Iterator iterator = tokenList.iterator(); iterator.hasNext(); ) { HashedToken token = iterator.next(); diff --git a/core/src/main/java/jenkins/util/JSONSignatureValidator.java b/core/src/main/java/jenkins/util/JSONSignatureValidator.java index d3f416a91f..39ba704071 100644 --- a/core/src/main/java/jenkins/util/JSONSignatureValidator.java +++ b/core/src/main/java/jenkins/util/JSONSignatureValidator.java @@ -245,7 +245,6 @@ public class JSONSignatureValidator { } - @SuppressFBWarnings(value = {"NP_LOAD_OF_KNOWN_NULL_VALUE", "RCN_REDUNDANT_NULLCHECK_OF_NULL_VALUE"}, justification = "https://github.com/spotbugs/spotbugs/issues/756") protected Set loadTrustAnchors(CertificateFactory cf) throws IOException { // if we trust default root CAs, we end up trusting anyone who has a valid certificate, // which isn't useful at all diff --git a/core/src/main/java/jenkins/util/ScriptListener.java b/core/src/main/java/jenkins/util/ScriptListener.java index f75596b8c8..cf987d535e 100644 --- a/core/src/main/java/jenkins/util/ScriptListener.java +++ b/core/src/main/java/jenkins/util/ScriptListener.java @@ -26,7 +26,6 @@ package jenkins.util; import edu.umd.cs.findbugs.annotations.CheckForNull; import edu.umd.cs.findbugs.annotations.NonNull; -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import groovy.lang.Binding; import hudson.ExtensionPoint; import hudson.model.User; @@ -141,7 +140,6 @@ public interface ScriptListener extends ExtensionPoint { private final String correlationId; private final User user; - @SuppressFBWarnings("EI_EXPOSE_REP2") public ListenerWriter(Writer writer, Object feature, Object context, String correlationId, User user) { this.writer = writer; this.feature = feature; @@ -182,7 +180,6 @@ public interface ScriptListener extends ExtensionPoint { private final String correlationId; private final User user; - @SuppressFBWarnings("EI_EXPOSE_REP2") public ListenerOutputStream(OutputStream os, Charset charset, Object feature, Object context, String correlationId, User user) { this.os = os; this.charset = charset; diff --git a/core/src/main/java/jenkins/util/io/PathRemover.java b/core/src/main/java/jenkins/util/io/PathRemover.java index 06d611febc..4bb293c6ae 100644 --- a/core/src/main/java/jenkins/util/io/PathRemover.java +++ b/core/src/main/java/jenkins/util/io/PathRemover.java @@ -25,7 +25,6 @@ package jenkins.util.io; import edu.umd.cs.findbugs.annotations.NonNull; -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import hudson.Functions; import hudson.Util; import java.io.IOException; @@ -135,8 +134,6 @@ public class PathRemover { this.waitBetweenRetries = waitBetweenRetries; } - @SuppressFBWarnings(value = "DM_GC", justification = "Garbage collection happens only when " - + "GC_AFTER_FAILED_DELETE is true. It's an experimental feature in Jenkins.") private void gcIfEnabled() { /* If the Jenkins process had the file open earlier, and it has not * closed it then Windows won't let us delete it until the Java object diff --git a/core/src/main/java/jenkins/widgets/HistoryPageFilter.java b/core/src/main/java/jenkins/widgets/HistoryPageFilter.java index f51c27c221..de9030b4b0 100644 --- a/core/src/main/java/jenkins/widgets/HistoryPageFilter.java +++ b/core/src/main/java/jenkins/widgets/HistoryPageFilter.java @@ -67,7 +67,6 @@ public class HistoryPageFilter { public boolean hasDownPage = false; // there are older builds than on this page @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD", justification = "read by Stapler") public long nextBuildNumber; - @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD", justification = "read by Stapler") public HistoryWidget widget; public long newestOnPage = Long.MIN_VALUE; // see updateNewestOldest() diff --git a/core/src/main/java/org/jenkins/ui/symbol/Symbol.java b/core/src/main/java/org/jenkins/ui/symbol/Symbol.java index 52c7faee02..604221d07d 100644 --- a/core/src/main/java/org/jenkins/ui/symbol/Symbol.java +++ b/core/src/main/java/org/jenkins/ui/symbol/Symbol.java @@ -2,7 +2,6 @@ package org.jenkins.ui.symbol; import edu.umd.cs.findbugs.annotations.CheckForNull; import edu.umd.cs.findbugs.annotations.NonNull; -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import hudson.Functions; import hudson.PluginWrapper; import hudson.Util; @@ -91,7 +90,6 @@ public final class Symbol { } - @SuppressFBWarnings(value = {"NP_LOAD_OF_KNOWN_NULL_VALUE", "RCN_REDUNDANT_NULLCHECK_OF_NULL_VALUE"}, justification = "Spotbugs doesn't grok try-with-resources") private static String loadSymbol(String namespace, String name) { String markup = PLACEHOLDER_SVG; ClassLoader classLoader = getClassLoader(namespace); diff --git a/pom.xml b/pom.xml index 47de5737e7..1918308aaf 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci jenkins - 1.129 + 1.130 From 6229954ee0e42e058baee98887b717f502704105 Mon Sep 17 00:00:00 2001 From: Jan Faracik <43062514+janfaracik@users.noreply.github.com> Date: Fri, 7 Mar 2025 11:33:41 +0000 Subject: [PATCH 88/99] Remove SuppressFBWarnings --- core/src/main/java/hudson/search/Search.java | 1 - 1 file changed, 1 deletion(-) diff --git a/core/src/main/java/hudson/search/Search.java b/core/src/main/java/hudson/search/Search.java index 5040d9b28e..4959b52995 100644 --- a/core/src/main/java/hudson/search/Search.java +++ b/core/src/main/java/hudson/search/Search.java @@ -291,7 +291,6 @@ public class Search implements StaplerProxy { public static class Item { @Exported - @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD", justification = "read by Stapler") public String name; private final String url; From 7f7954d3ce2d471caaf1773342bd172874fc63ab Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 7 Mar 2025 08:36:03 -0800 Subject: [PATCH 89/99] Update dependency org.jenkins-ci.modules:instance-identity to v203 (#10378) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- test/pom.xml | 2 +- war/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/test/pom.xml b/test/pom.xml index 97f51d7196..e720357916 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -206,7 +206,7 @@ THE SOFTWARE. org.jenkins-ci.modules instance-identity - 201.vd2a_b_5a_468a_a_6 + 203.v15e81a_1b_7a_38 test diff --git a/war/pom.xml b/war/pom.xml index a8432e9e75..7c762fc7ff 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -490,7 +490,7 @@ THE SOFTWARE. org.jenkins-ci.modules instance-identity - 201.vd2a_b_5a_468a_a_6 + 203.v15e81a_1b_7a_38 hpi From 231d3ea0a90e6c4fb21e75f3f33076b19664a589 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 7 Mar 2025 08:36:37 -0800 Subject: [PATCH 90/99] Update dependency org.jenkins-ci.plugins:jackson2-api to v2.18.3-399.v74c9ce452ea_8 (#10381) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- war/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/war/pom.xml b/war/pom.xml index 7c762fc7ff..e63bfb9328 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -360,7 +360,7 @@ THE SOFTWARE. org.jenkins-ci.plugins jackson2-api - 2.17.0-389.va_5c7e45cd806 + 2.18.3-399.v74c9ce452ea_8 hpi From ebc33aee9428e5de3f5ca422976017bbcc1b33b0 Mon Sep 17 00:00:00 2001 From: Markus Winter Date: Sat, 8 Mar 2025 21:11:08 +0100 Subject: [PATCH 91/99] Add some margin below Add/Edit description button --- core/src/main/resources/lib/hudson/editableDescription.jelly | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/resources/lib/hudson/editableDescription.jelly b/core/src/main/resources/lib/hudson/editableDescription.jelly index 30eba0b393..6af6dc6b78 100644 --- a/core/src/main/resources/lib/hudson/editableDescription.jelly +++ b/core/src/main/resources/lib/hudson/editableDescription.jelly @@ -47,7 +47,7 @@ THE SOFTWARE. -
+
From 2152a47a54c46fa6e2ee50159b0463c2a5b0ac71 Mon Sep 17 00:00:00 2001 From: yen-cheng Date: Sun, 9 Mar 2025 21:21:40 +0800 Subject: [PATCH 92/99] Update utils.js --- src/main/js/components/dropdowns/utils.js | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/main/js/components/dropdowns/utils.js b/src/main/js/components/dropdowns/utils.js index b109cc3894..1240c9874e 100644 --- a/src/main/js/components/dropdowns/utils.js +++ b/src/main/js/components/dropdowns/utils.js @@ -19,7 +19,8 @@ function generateDropdown(element, callback, immediate) { tippy( element, Object.assign({}, Templates.dropdown(), { - hideOnClick: element.dataset["hideOnClick"] !== "false" ? "toggle" : false, + hideOnClick: + element.dataset["hideOnClick"] !== "false" ? "toggle" : false, onCreate(instance) { const onload = () => { if (instance.loaded) { @@ -27,8 +28,11 @@ function generateDropdown(element, callback, immediate) { } document.addEventListener("click", (event) => { - const isClickInAnyDropdown = !!event.target.closest('[data-tippy-root]'); - const isClickOnReference = instance.reference.contains(event.target); + const isClickInAnyDropdown = + !!event.target.closest("[data-tippy-root]"); + const isClickOnReference = instance.reference.contains( + event.target, + ); if (!isClickInAnyDropdown && !isClickOnReference) { instance.hide(); From 7d391b228ac96547574f420531039ecd5cd7c690 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 10 Mar 2025 10:16:17 -0700 Subject: [PATCH 93/99] Update eslint monorepo to v9.22.0 (#10385) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 4 ++-- yarn.lock | 40 ++++++++++++++++++++++++---------------- 2 files changed, 26 insertions(+), 18 deletions(-) diff --git a/package.json b/package.json index 4d3f190e0d..579733f767 100644 --- a/package.json +++ b/package.json @@ -26,12 +26,12 @@ "@babel/cli": "7.26.4", "@babel/core": "7.26.9", "@babel/preset-env": "7.26.9", - "@eslint/js": "9.21.0", + "@eslint/js": "9.22.0", "babel-loader": "10.0.0", "clean-webpack-plugin": "4.0.0", "css-loader": "7.1.2", "css-minimizer-webpack-plugin": "7.0.0", - "eslint": "9.21.0", + "eslint": "9.22.0", "eslint-config-prettier": "10.0.2", "eslint-formatter-checkstyle": "8.40.0", "globals": "16.0.0", diff --git a/yarn.lock b/yarn.lock index dec3527375..60ff359486 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1660,6 +1660,13 @@ __metadata: languageName: node linkType: hard +"@eslint/config-helpers@npm:^0.1.0": + version: 0.1.0 + resolution: "@eslint/config-helpers@npm:0.1.0" + checksum: 10c0/3562b5325f42740fc83b0b92b7d13a61b383f8db064915143eec36184f09a09fad73eca6c2955ab6c248b0d04fa03c140f9af2f2c4c06770781a6b79f300a01e + languageName: node + linkType: hard + "@eslint/core@npm:^0.12.0": version: 0.12.0 resolution: "@eslint/core@npm:0.12.0" @@ -1686,10 +1693,10 @@ __metadata: languageName: node linkType: hard -"@eslint/js@npm:9.21.0": - version: 9.21.0 - resolution: "@eslint/js@npm:9.21.0" - checksum: 10c0/86c24a2668808995037e3f40c758335df2ae277c553ac0cf84381a1a8698f3099d8a22dd9c388947e6b7f93fcc1142f62406072faaa2b83c43ca79993fc01bb3 +"@eslint/js@npm:9.22.0": + version: 9.22.0 + resolution: "@eslint/js@npm:9.22.0" + checksum: 10c0/5bcd009bb579dc6c6ed760703bdd741e08a48cd9decd677aa2cf67fe66236658cb09a00185a0369f3904e5cffba9e6e0f2ff4d9ba4fdf598fcd81d34c49213a5 languageName: node linkType: hard @@ -3483,13 +3490,13 @@ __metadata: languageName: node linkType: hard -"eslint-scope@npm:^8.2.0": - version: 8.2.0 - resolution: "eslint-scope@npm:8.2.0" +"eslint-scope@npm:^8.3.0": + version: 8.3.0 + resolution: "eslint-scope@npm:8.3.0" dependencies: esrecurse: "npm:^4.3.0" estraverse: "npm:^5.2.0" - checksum: 10c0/8d2d58e2136d548ac7e0099b1a90d9fab56f990d86eb518de1247a7066d38c908be2f3df477a79cf60d70b30ba18735d6c6e70e9914dca2ee515a729975d70d6 + checksum: 10c0/23bf54345573201fdf06d29efa345ab508b355492f6c6cc9e2b9f6d02b896f369b6dd5315205be94b8853809776c4d13353b85c6b531997b164ff6c3328ecf5b languageName: node linkType: hard @@ -3507,16 +3514,17 @@ __metadata: languageName: node linkType: hard -"eslint@npm:9.21.0": - version: 9.21.0 - resolution: "eslint@npm:9.21.0" +"eslint@npm:9.22.0": + version: 9.22.0 + resolution: "eslint@npm:9.22.0" dependencies: "@eslint-community/eslint-utils": "npm:^4.2.0" "@eslint-community/regexpp": "npm:^4.12.1" "@eslint/config-array": "npm:^0.19.2" + "@eslint/config-helpers": "npm:^0.1.0" "@eslint/core": "npm:^0.12.0" "@eslint/eslintrc": "npm:^3.3.0" - "@eslint/js": "npm:9.21.0" + "@eslint/js": "npm:9.22.0" "@eslint/plugin-kit": "npm:^0.2.7" "@humanfs/node": "npm:^0.16.6" "@humanwhocodes/module-importer": "npm:^1.0.1" @@ -3528,7 +3536,7 @@ __metadata: cross-spawn: "npm:^7.0.6" debug: "npm:^4.3.2" escape-string-regexp: "npm:^4.0.0" - eslint-scope: "npm:^8.2.0" + eslint-scope: "npm:^8.3.0" eslint-visitor-keys: "npm:^4.2.0" espree: "npm:^10.3.0" esquery: "npm:^1.5.0" @@ -3552,7 +3560,7 @@ __metadata: optional: true bin: eslint: bin/eslint.js - checksum: 10c0/558edb25b440cd51825d66fed3e84f1081bd6f4cb2cf994e60ece4c5978fa0583e88b75faf187c1fc21688c4ff7072f12bf5f6d1be1e09a4d6af78cff39dc520 + checksum: 10c0/7b5ab6f2365971c16efe97349565f75d8343347562fb23f12734c6ab2cd5e35301373a0d51e194789ddcfdfca21db7b62ff481b03d524b8169896c305b65ff48 languageName: node linkType: hard @@ -4344,12 +4352,12 @@ __metadata: "@babel/cli": "npm:7.26.4" "@babel/core": "npm:7.26.9" "@babel/preset-env": "npm:7.26.9" - "@eslint/js": "npm:9.21.0" + "@eslint/js": "npm:9.22.0" babel-loader: "npm:10.0.0" clean-webpack-plugin: "npm:4.0.0" css-loader: "npm:7.1.2" css-minimizer-webpack-plugin: "npm:7.0.0" - eslint: "npm:9.21.0" + eslint: "npm:9.22.0" eslint-config-prettier: "npm:10.0.2" eslint-formatter-checkstyle: "npm:8.40.0" globals: "npm:16.0.0" From 5ac7090057a7a2a2ac442c215fd8d0e05840d2b1 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 10 Mar 2025 10:20:26 -0700 Subject: [PATCH 94/99] Update dependency eslint-config-prettier to v10.1.1 (#10384) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index 579733f767..85f50df6ed 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,7 @@ "css-loader": "7.1.2", "css-minimizer-webpack-plugin": "7.0.0", "eslint": "9.22.0", - "eslint-config-prettier": "10.0.2", + "eslint-config-prettier": "10.1.1", "eslint-formatter-checkstyle": "8.40.0", "globals": "16.0.0", "handlebars-loader": "1.7.3", diff --git a/yarn.lock b/yarn.lock index 60ff359486..7085803f67 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3462,14 +3462,14 @@ __metadata: languageName: node linkType: hard -"eslint-config-prettier@npm:10.0.2": - version: 10.0.2 - resolution: "eslint-config-prettier@npm:10.0.2" +"eslint-config-prettier@npm:10.1.1": + version: 10.1.1 + resolution: "eslint-config-prettier@npm:10.1.1" peerDependencies: eslint: ">=7.0.0" bin: - eslint-config-prettier: build/bin/cli.js - checksum: 10c0/e0ef3c442661a26fc6e82acec5bb9a418c4a8f65ec8adf0983d3aaba7716d2ed448358b063cce6e3c272c847d14cb856ddf30031770c6571e2b2c3e2a439afd4 + eslint-config-prettier: bin/cli.js + checksum: 10c0/3dbfdf6495dd62e2e1644ea9e8e978100dabcd8740fd264df1222d130001a1e8de05d6ed6c67d3a60727386a07507f067d1ca79af6d546910414beab19e7966e languageName: node linkType: hard @@ -4358,7 +4358,7 @@ __metadata: css-loader: "npm:7.1.2" css-minimizer-webpack-plugin: "npm:7.0.0" eslint: "npm:9.22.0" - eslint-config-prettier: "npm:10.0.2" + eslint-config-prettier: "npm:10.1.1" eslint-formatter-checkstyle: "npm:8.40.0" globals: "npm:16.0.0" handlebars: "npm:4.7.8" From b7be006144668a8ee5ea8c55f011cc01784489b3 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 10 Mar 2025 10:20:53 -0700 Subject: [PATCH 95/99] Update dependency css-minimizer-webpack-plugin to v7.0.2 (#10383) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index 85f50df6ed..6b6389ede7 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "babel-loader": "10.0.0", "clean-webpack-plugin": "4.0.0", "css-loader": "7.1.2", - "css-minimizer-webpack-plugin": "7.0.0", + "css-minimizer-webpack-plugin": "7.0.2", "eslint": "9.22.0", "eslint-config-prettier": "10.1.1", "eslint-formatter-checkstyle": "8.40.0", diff --git a/yarn.lock b/yarn.lock index 7085803f67..af7846e32b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3084,14 +3084,14 @@ __metadata: languageName: node linkType: hard -"css-minimizer-webpack-plugin@npm:7.0.0": - version: 7.0.0 - resolution: "css-minimizer-webpack-plugin@npm:7.0.0" +"css-minimizer-webpack-plugin@npm:7.0.2": + version: 7.0.2 + resolution: "css-minimizer-webpack-plugin@npm:7.0.2" dependencies: "@jridgewell/trace-mapping": "npm:^0.3.25" - cssnano: "npm:^7.0.1" + cssnano: "npm:^7.0.4" jest-worker: "npm:^29.7.0" - postcss: "npm:^8.4.38" + postcss: "npm:^8.4.40" schema-utils: "npm:^4.2.0" serialize-javascript: "npm:^6.0.2" peerDependencies: @@ -3109,7 +3109,7 @@ __metadata: optional: true lightningcss: optional: true - checksum: 10c0/607258ea16b753b42cbcf88b0b20c99406d7f162ad3a4da50ec3e23d1fb652d1304815c0d0c577944256c76dff3df64e1708e5c5e255318694ba8aaba7820ca3 + checksum: 10c0/da12f3214220cec8240af7206477f1d1a0036943b704ae36c75617bda8f1905b4d0f71869eda70dfbb184d3e200be541fc5b8b65781294bde71ede1660406a5b languageName: node linkType: hard @@ -3237,7 +3237,7 @@ __metadata: languageName: node linkType: hard -"cssnano@npm:^7.0.1": +"cssnano@npm:^7.0.4": version: 7.0.6 resolution: "cssnano@npm:7.0.6" dependencies: @@ -4356,7 +4356,7 @@ __metadata: babel-loader: "npm:10.0.0" clean-webpack-plugin: "npm:4.0.0" css-loader: "npm:7.1.2" - css-minimizer-webpack-plugin: "npm:7.0.0" + css-minimizer-webpack-plugin: "npm:7.0.2" eslint: "npm:9.22.0" eslint-config-prettier: "npm:10.1.1" eslint-formatter-checkstyle: "npm:8.40.0" @@ -6054,7 +6054,7 @@ __metadata: languageName: node linkType: hard -"postcss@npm:8.5.3, postcss@npm:^8.4.33, postcss@npm:^8.4.38, postcss@npm:^8.5.3": +"postcss@npm:8.5.3, postcss@npm:^8.4.33, postcss@npm:^8.4.40, postcss@npm:^8.5.3": version: 8.5.3 resolution: "postcss@npm:8.5.3" dependencies: From 4f227519b8b40738a04a41a30e3c498147ce3873 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 10 Mar 2025 10:21:27 -0700 Subject: [PATCH 96/99] Update dependency org.jenkins-ci.plugins:jackson2-api to v2.18.3-402.v74c4eb_f122b_2 (#10388) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- war/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/war/pom.xml b/war/pom.xml index e63bfb9328..3afd42a7bd 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -360,7 +360,7 @@ THE SOFTWARE. org.jenkins-ci.plugins jackson2-api - 2.18.3-399.v74c9ce452ea_8 + 2.18.3-402.v74c4eb_f122b_2 hpi From 1454a968c0c8f9a15114ecd5ff12d35fc480a307 Mon Sep 17 00:00:00 2001 From: Jenkins Release Bot <66998184+jenkins-release-bot@users.noreply.github.com> Date: Tue, 11 Mar 2025 13:49:05 +0000 Subject: [PATCH 97/99] [maven-release-plugin] prepare release jenkins-2.501 --- bom/pom.xml | 2 +- cli/pom.xml | 2 +- core/pom.xml | 2 +- coverage/pom.xml | 2 +- pom.xml | 6 +++--- test/pom.xml | 2 +- war/pom.xml | 2 +- websocket/jetty12-ee9/pom.xml | 2 +- websocket/spi/pom.xml | 2 +- 9 files changed, 11 insertions(+), 11 deletions(-) diff --git a/bom/pom.xml b/bom/pom.xml index 78dcd42bf5..4d2ffea630 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main jenkins-parent - ${revision}${changelist} + 2.501 jenkins-bom diff --git a/cli/pom.xml b/cli/pom.xml index cf30714cac..07c038a83f 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main jenkins-parent - ${revision}${changelist} + 2.501 cli diff --git a/core/pom.xml b/core/pom.xml index 0c9b072e0b..5eee11fe73 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main jenkins-parent - ${revision}${changelist} + 2.501 jenkins-core diff --git a/coverage/pom.xml b/coverage/pom.xml index fe1e89a120..0de6e6ab74 100644 --- a/coverage/pom.xml +++ b/coverage/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main jenkins-parent - ${revision}${changelist} + 2.501 jenkins-coverage diff --git a/pom.xml b/pom.xml index 1918308aaf..217dccbd0d 100644 --- a/pom.xml +++ b/pom.xml @@ -34,7 +34,7 @@ THE SOFTWARE. org.jenkins-ci.main jenkins-parent - ${revision}${changelist} + 2.501 pom Jenkins main module @@ -63,7 +63,7 @@ THE SOFTWARE. scm:git:https://github.com/jenkinsci/jenkins.git scm:git:git@github.com:jenkinsci/jenkins.git - ${scmTag} + jenkins-2.501 https://github.com/jenkinsci/jenkins @@ -75,7 +75,7 @@ THE SOFTWARE. 2.501 -SNAPSHOT - 2025-03-04T10:34:35Z + 2025-03-11T10:34:27Z github diff --git a/test/pom.xml b/test/pom.xml index e720357916..5e3e62b453 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main jenkins-parent - ${revision}${changelist} + 2.501 jenkins-test diff --git a/war/pom.xml b/war/pom.xml index 3afd42a7bd..f55b2188cf 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main jenkins-parent - ${revision}${changelist} + 2.501 jenkins-war diff --git a/websocket/jetty12-ee9/pom.xml b/websocket/jetty12-ee9/pom.xml index 2253163b3c..48464dd7f5 100644 --- a/websocket/jetty12-ee9/pom.xml +++ b/websocket/jetty12-ee9/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main jenkins-parent - ${revision}${changelist} + 2.501 ../.. diff --git a/websocket/spi/pom.xml b/websocket/spi/pom.xml index 178413f92c..bd569aaa83 100644 --- a/websocket/spi/pom.xml +++ b/websocket/spi/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main jenkins-parent - ${revision}${changelist} + 2.501 ../.. From 8fdc5eb1b36e04da264b4fcebfa275e0ee40649e Mon Sep 17 00:00:00 2001 From: Jenkins Release Bot <66998184+jenkins-release-bot@users.noreply.github.com> Date: Tue, 11 Mar 2025 13:49:30 +0000 Subject: [PATCH 98/99] [maven-release-plugin] prepare for next development iteration --- bom/pom.xml | 2 +- cli/pom.xml | 2 +- core/pom.xml | 2 +- coverage/pom.xml | 2 +- pom.xml | 8 ++++---- test/pom.xml | 2 +- war/pom.xml | 2 +- websocket/jetty12-ee9/pom.xml | 2 +- websocket/spi/pom.xml | 2 +- 9 files changed, 12 insertions(+), 12 deletions(-) diff --git a/bom/pom.xml b/bom/pom.xml index 4d2ffea630..78dcd42bf5 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main jenkins-parent - 2.501 + ${revision}${changelist} jenkins-bom diff --git a/cli/pom.xml b/cli/pom.xml index 07c038a83f..cf30714cac 100644 --- a/cli/pom.xml +++ b/cli/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main jenkins-parent - 2.501 + ${revision}${changelist} cli diff --git a/core/pom.xml b/core/pom.xml index 5eee11fe73..0c9b072e0b 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -29,7 +29,7 @@ THE SOFTWARE. org.jenkins-ci.main jenkins-parent - 2.501 + ${revision}${changelist} jenkins-core diff --git a/coverage/pom.xml b/coverage/pom.xml index 0de6e6ab74..fe1e89a120 100644 --- a/coverage/pom.xml +++ b/coverage/pom.xml @@ -5,7 +5,7 @@ org.jenkins-ci.main jenkins-parent - 2.501 + ${revision}${changelist} jenkins-coverage diff --git a/pom.xml b/pom.xml index 217dccbd0d..7f0cf7e828 100644 --- a/pom.xml +++ b/pom.xml @@ -34,7 +34,7 @@ THE SOFTWARE. org.jenkins-ci.main jenkins-parent - 2.501 + ${revision}${changelist} pom Jenkins main module @@ -63,7 +63,7 @@ THE SOFTWARE. scm:git:https://github.com/jenkinsci/jenkins.git scm:git:git@github.com:jenkinsci/jenkins.git - jenkins-2.501 + ${scmTag} https://github.com/jenkinsci/jenkins @@ -73,9 +73,9 @@ THE SOFTWARE. - 2.501 + 2.502 -SNAPSHOT - 2025-03-11T10:34:27Z + 2025-03-11T13:49:05Z github diff --git a/test/pom.xml b/test/pom.xml index 5e3e62b453..e720357916 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main jenkins-parent - 2.501 + ${revision}${changelist} jenkins-test diff --git a/war/pom.xml b/war/pom.xml index f55b2188cf..3afd42a7bd 100644 --- a/war/pom.xml +++ b/war/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main jenkins-parent - 2.501 + ${revision}${changelist} jenkins-war diff --git a/websocket/jetty12-ee9/pom.xml b/websocket/jetty12-ee9/pom.xml index 48464dd7f5..2253163b3c 100644 --- a/websocket/jetty12-ee9/pom.xml +++ b/websocket/jetty12-ee9/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main jenkins-parent - 2.501 + ${revision}${changelist} ../.. diff --git a/websocket/spi/pom.xml b/websocket/spi/pom.xml index bd569aaa83..178413f92c 100644 --- a/websocket/spi/pom.xml +++ b/websocket/spi/pom.xml @@ -28,7 +28,7 @@ THE SOFTWARE. org.jenkins-ci.main jenkins-parent - 2.501 + ${revision}${changelist} ../.. From 558e5a630e2d710ab4c394b2cf9cd987232ec3f1 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 11 Mar 2025 16:14:54 -0700 Subject: [PATCH 99/99] Update dependency io.jenkins.plugins:prism-api to v1.30.0-1 (#10389) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- test/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/pom.xml b/test/pom.xml index e720357916..e2d9fda289 100644 --- a/test/pom.xml +++ b/test/pom.xml @@ -358,7 +358,7 @@ THE SOFTWARE. io.jenkins.plugins prism-api - 1.29.0-19 + 1.30.0-1 hpi ${project.build.outputDirectory}/plugins prism-api.jpi