Skip to content

Commit 8b6885a

Browse files
committed
Merge remote-tracking branch 'origin/main' into just-jdk25
2 parents 010a2fe + ca3821a commit 8b6885a

40 files changed

+616
-576
lines changed

.github/ghprcomment.yml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -88,8 +88,8 @@
8888
8989
# CHANGELOG.md and *.md
9090

91-
- jobName: 'CHANGELOG.md needs to be modified'
92-
workflowName: 'PR Tests'
91+
- jobName: 'CHANGELOG.md needs to be modified if indicated'
92+
workflowName: 'Check PR CHANGELOG.md'
9393
message: >
9494
You ticked that you modified `CHANGELOG.md`, but no new entry was found there.
9595
@@ -127,14 +127,14 @@
127127
# Submodules and branches
128128

129129
- jobName: 'Submodules not modified'
130-
workflowName: 'PR Tests'
130+
workflowName: 'Check PR Modifications'
131131
message: >
132132
Your pull request modified git submodules.
133133
134134
135135
Please follow our [FAQ on submodules](https://devdocs.jabref.org/code-howtos/faq.html#submodules) to fix.
136136
- jobName: no-force-push
137-
workflowName: 'PR Tests'
137+
workflowName: 'Check PR Modifications'
138138
always: true
139139
message: >
140140
Hey, we noticed that you **force-pushed** your changes.
@@ -156,7 +156,7 @@
156156
Please [merge `upstream/main`](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/syncing-a-fork#syncing-a-fork-branch-from-the-command-line) with your code.
157157
For a step-by-step guide to resolve merge conflicts, see <https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/addressing-merge-conflicts/resolving-a-merge-conflict-using-the-command-line>.
158158
- jobName: 'Source branch is other than "main"'
159-
workflowName: 'PR Tests'
159+
workflowName: 'Check PR Modifications'
160160
message: >
161161
You committed your code on the `main` brach of your fork. This is a bad practice.
162162
The right way is to branch out from `main`, work on your patch/feature in that new branch, and then get that branch merged via the pull request (see [GitHub flow](https://docs.github.com/en/get-started/using-github/github-flow)).

.github/workflows/delete-old-runs-automatically.yml

Lines changed: 0 additions & 19 deletions
This file was deleted.

.github/workflows/on-pr-opened.yml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,17 @@ jobs:
1515
- uses: plbstl/first-contribution@v4
1616
with:
1717
labels: first contrib
18-
pr-opened-msg: |
18+
pr-opened-msg: >
1919
### Hey @{fc-author}!
2020
21+
2122
Thank you for contributing to JabRef! Your help is truly appreciated :heart:.
2223
24+
2325
We have automatic checks in place, based on which you will soon get automated feedback if any of them are failing.
2426
We also use [TragBot](https://usetrag.com/) with custom rules that scans your changes and provides some preliminary comments, before a maintainer takes a look.
2527
TragBot is still learning, and may not always be accurate.
2628
In the "Files changed" tab, you can go through its comments and just click on "Resolve conversation" if you are sure that it is incorrect, or comment on the conversation if you are doubtful.
2729
30+
2831
Please re-check our [contribution guide](https://github.com/JabRef/jabref/blob/main/CONTRIBUTING.md) in case of any other doubts related to our contribution workflow.

CHANGELOG.md

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,11 @@ Note that this project **does not** adhere to [Semantic Versioning](https://semv
4444
- We added support for using Medline/Pubmed fetcher with an API key. [#11296](https://github.com/JabRef/jabref/issues/11296#issuecomment-3289005011)
4545
- We added support for using OpenAlex fetcher. [#13940](https://github.com/JabRef/jabref/issues/13940)
4646
- We added an option to choose the group during import of the entry(s). [#9191](https://github.com/JabRef/jabref/issues/9191)
47+
- We added an option to search and filter the fields and formatters in the Clean up entries dialog. [#13890](https://github.com/JabRef/jabref/issues/13890)
4748

4849
### Changed
4950

51+
- We merged `Citation information` and `Citation relations` into a singular tab. [#13618](https://github.com/JabRef/jabref/issues/13618)
5052
- We changed `ISSNCleanup` into `NormalizeIssn` a `ISSN` formatter. [#13748](https://github.com/JabRef/jabref/issues/13748)
5153
- We changed Citation Relations tab and gave tab panes more descriptive titles and tooltips. [#13619](https://github.com/JabRef/jabref/issues/13619)
5254
- We changed the name from Open AI Provider to Open AI (or API compatible). [#13585](https://github.com/JabRef/jabref/issues/13585)
@@ -103,8 +105,9 @@ Note that this project **does not** adhere to [Semantic Versioning](https://semv
103105

104106
### Fixed
105107

108+
- We fixed an issue where search results would show stale entries after deleting entries from search results. [#13984](https://github.com/JabRef/jabref/issues/13984)
106109
- When filename pattern is missing for linked files, pattern handling has been introduced to avoid suggesting meaningless filenames like "-". [#13735](https://github.com/JabRef/jabref/issues/13735)
107-
- We fixed an issue where "Specify Bib(La)TeX" tab was not focused when Bib(La)TeX was in the clipboard [#13597](https://github.com/JabRef/jabref/issues/13597)
110+
- We fixed an issue where "Specify Bib(La)TeX" tab was not focused when Bib(La)TeX was in the clipboard. [#13597](https://github.com/JabRef/jabref/issues/13597)
108111
- We fixed an issue whereby the 'About' dialog was not honouring the user's configured font preferences. [#13558](https://github.com/JabRef/jabref/issues/13558)
109112
- We fixed an issue where the Pagetotal column was sorting the values alphabetically instead of numerically. [#12533](https://github.com/JabRef/jabref/issues/12533)
110113
- We fixed an issue where URLs starting with "www." (without a protocol) in file fields caused an `IllegalArgumentException: URI is not absolute` error. [#12186](https://github.com/JabRef/jabref/issues/12186)
@@ -145,7 +148,10 @@ Note that this project **does not** adhere to [Semantic Versioning](https://semv
145148
- We fixed an issue where hierarchical keywords would only show the parent keyword in the entry editor. [#11390](https://github.com/JabRef/jabref/issues/11390)
146149
- We fixed an issue where some file choosers regarding LaTeX-aux files did not open in the directory of the last selected file. [#13861](https://github.com/JabRef/jabref/pull/13861)
147150
- We fixed an issue where the LaTeX file directory was not stored correctly in combination with the usage of groups from aux files. [#8344](https://github.com/JabRef/jabref/issues/8344)
151+
- We prevented a brief flash of the default JavaFX (Modena) theme on startup. [#13877](https://github.com/JabRef/jabref/pull/13877)
152+
- We fixed an issue where button-bar buttons truncated long text with ellipsis. [#13877](https://github.com/JabRef/jabref/pull/13877)
148153
- We fixed an issue where ignoring of subdirectories via `.gitingore` patterns did not work in the "Find unlinked files dialog". [forum#5425](https://discourse.jabref.org/t/set-list-of-ignored-folders-paths/5425/6)
154+
- We fixed an issue where the "Applications to push entries to" list in the preferences was not sorted alphabetically. [#14058](https://github.com/JabRef/jabref/issues/14058)
149155

150156
### Removed
151157

build-logic/src/main/kotlin/org.jabref.gradle.base.dependency-rules.gradle.kts

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
import org.gradle.api.internal.artifacts.dsl.dependencies.DependenciesExtensionModule.module
2-
31
plugins {
42
id("org.gradlex.extra-java-module-info")
53
id("org.gradlex.jvm-dependency-conflict-resolution")
@@ -662,4 +660,25 @@ extraJavaModuleInfo {
662660
module("org.openjdk.jmh:jmh-generator-bytecode", "jmh.generator.bytecode")
663661
module("org.openjdk.jmh:jmh-generator-reflection", "jmh.generator.reflection")
664662
module("org.apache.commons:commons-math3", "commons.math3")
663+
664+
// We need to transform this, because the java modules plugin touches all Java paths
665+
// Otherwise, one gets following errormessage
666+
// configuration ':jablib:annotationProcessor'.
667+
668+
module("javax.inject:javax.inject", "javax.inject")
669+
module("com.google.auto.value:auto-value-annotations", "auto.value.annotations")
670+
module("io.github.eisop:dataflow-errorprone", "org.checkerframework.dataflow")
671+
module("com.google.googlejavaformat:google-java-format", "com.google.googlejavaformat")
672+
module("com.google.errorprone:error_prone_core", "com.google.errorprone.core")
673+
module("com.google.errorprone:error_prone_check_api", "com.google.errorprone.check.api")
674+
module("com.google.errorprone:error_prone_annotation", "com.google.errorprone.annotation")
675+
module("com.google.auto:auto-common", "auto.common")
676+
module("com.google.auto.service:auto-service-annotations", "com.google.auto.service")
677+
module("com.google.protobuf:protobuf-java", "com.google.protobuf")
678+
module("com.github.kevinstern:software-and-algorithms", "software.and.algorithms")
679+
680+
module("com.uber.nullaway:nullaway", "nullaway")
681+
module("org.checkerframework:dataflow-nullaway", "org.checkerframework.dataflow") {
682+
exportAllPackages()
683+
}
665684
}

docs/decisions/0051-jspecify-nullable-annotations renamed to docs/decisions/0052-jspecify-nullable-annotations.md

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
---
2-
title: Adopt JSpecify nullness annotations for compile-time null safety
3-
nav_order: 51
2+
nav_order: 52
43
parent: Decision Records
5-
status: pending
64
---
75

86
# Adopt JSpecify nullness annotations for compile-time null safety
@@ -28,7 +26,7 @@ We want to detect null-safety issues earlier at compile time and improve API cla
2826

2927
## Decision Outcome
3028

31-
Chosen option: "Adopt JSpecify annotations" because comes out best (see below).
29+
Chosen option: "Adopt JSpecify annotations" because it comes out best (see below).
3230

3331
## Consequences
3432

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
---
2+
nav_order: 53
3+
parent: Decision Records
4+
---
5+
6+
# Null Checking Framework Selection
7+
8+
## Context and Problem Statement
9+
10+
Null pointer exceptions are a pervasive source of bugs in Java. To alleviate this, we want a compile-time null‐checking / nullness analysis framework. Two major contenders are Checker Framework and Error Prone (with NullAway). We also want our solution to align with modern nullness specification efforts such as JSpecify.
11+
12+
## Decision Drivers
13+
14+
* Static prevention of null dereference errors.
15+
* Developer experience: low friction, good IDE, and build integration.
16+
* Scalability to our codebase.
17+
* Interoperability with JSpecify and future ecosystem alignment.
18+
* Incremental adoption: we should not be forced to annotate everything at once.
19+
20+
## Considered Options
21+
22+
* Error Prone + NullAway
23+
* Checker Framework
24+
* No nullness analysis (status quo)
25+
26+
## Decision Outcome
27+
28+
Chosen option: "Error Prone + NullAway" because it comes out best (see below).
29+
30+
## Consequences
31+
32+
* We will annotate public APIs (interfaces, service endpoints, widely used modules) using JSpecify `@Nullable` / `@NonNull` (or `@NullMarked` scoping) progressively.
33+
* We enable NullAway in CI builds; thus violations break the build.
34+
* NullAway may not check some corner cases (especially around generics); therefore, manual reviews need to keep that in mind.
35+
* Developers must be trained on JSpecify and on how NullAway behaves.
36+
* Over time, we gradually annotate more of the codebase; initially non-annotated code will be treated as “unspecified nullness” until annotated.
37+
38+
## Pros and Cons of the Options
39+
40+
### Checker Framework
41+
42+
* Good, because it supports advanced nullness contracts, refinement, and pluggability.
43+
* Bad, because compile times increase significantly.
44+
* Bad, because it lacks support for JSpecify’s `@NullMarked` / `@NullUnmarked` scopes.
45+
46+
## Error Prone + NullAway
47+
48+
* Good, because it is lightweight, fast, and has a low overhead.
49+
* Good, because support for JSpecify is built-in.
50+
* Good, because it fully supports JSpecify annotations.
51+
* Good, because it is [endorsed by JUnit 6](https://github.com/junit-team/junit-framework/wiki/Upgrading-to-JUnit-6.0#null-safety).
52+
* Bad, because it lacks support for advanced nullness contracts, refinement, and pluggability, and misses some edge cases.
53+
54+
## No Nullness Framework
55+
56+
* Good, because zero overhead or tooling complexity.
57+
* Bad, because we suffer from null pointer exceptions at runtime.

jabgui/src/main/java/org/jabref/gui/JabRefGUI.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -292,7 +292,7 @@ private void openWindow() {
292292
Scene scene = new Scene(JabRefGUI.mainFrame);
293293

294294
LOGGER.debug("installing CSS");
295-
themeManager.installCss(scene);
295+
themeManager.installCssImmediately(scene);
296296

297297
LOGGER.debug("Handle TextEditor key bindings");
298298
scene.addEventFilter(KeyEvent.KEY_PRESSED, event -> {

jabgui/src/main/java/org/jabref/gui/commonfxcontrols/FieldFormatterCleanupsPanel.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
import javafx.beans.value.ObservableValue;
77
import javafx.fxml.FXML;
88
import javafx.scene.control.CheckBox;
9-
import javafx.scene.control.ComboBox;
109
import javafx.scene.control.SelectionMode;
1110
import javafx.scene.control.TableColumn;
1211
import javafx.scene.control.TableView;
@@ -27,6 +26,7 @@
2726

2827
import com.airhacks.afterburner.views.ViewLoader;
2928
import jakarta.inject.Inject;
29+
import org.controlsfx.control.SearchableComboBox;
3030

3131
public class FieldFormatterCleanupsPanel extends VBox {
3232

@@ -35,8 +35,8 @@ public class FieldFormatterCleanupsPanel extends VBox {
3535
@FXML private TableColumn<FieldFormatterCleanup, Field> fieldColumn;
3636
@FXML private TableColumn<FieldFormatterCleanup, Formatter> formatterColumn;
3737
@FXML private TableColumn<FieldFormatterCleanup, Field> actionsColumn;
38-
@FXML private ComboBox<Field> addableFields;
39-
@FXML private ComboBox<Formatter> addableFormatters;
38+
@FXML private SearchableComboBox<Field> addableFields;
39+
@FXML private SearchableComboBox<Formatter> addableFormatters;
4040

4141
@Inject private StateManager stateManager;
4242

jabgui/src/main/java/org/jabref/gui/entryeditor/EntryEditor.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -324,7 +324,6 @@ private List<EntryEditorTab> createTabs() {
324324

325325
tabs.add(new MathSciNetTab());
326326
tabs.add(new FileAnnotationTab(stateManager, preferences));
327-
tabs.add(new SciteTab(preferences, taskExecutor, dialogService));
328327
tabs.add(new CitationRelationsTab(
329328
dialogService,
330329
undoManager,
@@ -376,7 +375,6 @@ private Map<String, Set<Field>> getAdditionalUserConfiguredTabs() {
376375
// Same order as in org.jabref.gui.entryeditor.EntryEditor.createTabs after the call of getAdditionalUserConfiguredTabs
377376
entryEditorTabList.remove(MathSciNetTab.NAME);
378377
entryEditorTabList.remove(FileAnnotationTab.NAME);
379-
entryEditorTabList.remove(SciteTab.NAME);
380378
entryEditorTabList.remove(CitationRelationsTab.NAME);
381379
entryEditorTabList.remove(RelatedArticlesTab.NAME);
382380
// SourceTab is not listed, because it has different names for BibTeX and biblatex mode

0 commit comments

Comments
 (0)