From 89ca933a7ff582a5c3ee9893cb5bdf5c526da4af Mon Sep 17 00:00:00 2001 From: hanweiwei Date: Sat, 4 Apr 2026 11:30:57 +0800 Subject: [PATCH 1/2] Add toString() to FetchResult and RebaseResult PullResult.toString() delegates to FetchResult and RebaseResult but neither class overrides toString(), resulting in unhelpful output like 'FetchResult@359d2e00'. Add meaningful toString() implementations that include key state such as URI, ref update counts, status, conflicts, and failing paths. Bug: https://github.com/eclipse-jgit/jgit/issues/256 Signed-off-by: hanweiwei Made-with: Cursor --- .../eclipse/jgit/api/RebaseResultTest.java | 66 +++++++++++++++++++ .../jgit/transport/FetchResultTest.java | 45 +++++++++++++ .../org/eclipse/jgit/api/RebaseResult.java | 21 ++++++ .../eclipse/jgit/transport/FetchResult.java | 24 +++++++ 4 files changed, 156 insertions(+) create mode 100644 org.eclipse.jgit.test/tst/org/eclipse/jgit/api/RebaseResultTest.java create mode 100644 org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/FetchResultTest.java diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/RebaseResultTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/RebaseResultTest.java new file mode 100644 index 00000000000..db89451ec68 --- /dev/null +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/RebaseResultTest.java @@ -0,0 +1,66 @@ +/* + * Copyright (C) 2026, hanweiwei and others + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Distribution License v. 1.0 which is available at + * https://www.eclipse.org/org/documents/edl-v10.php. + * + * SPDX-License-Identifier: BSD-3-Clause + */ +package org.eclipse.jgit.api; + +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +import java.util.List; + +import org.junit.Test; + +public class RebaseResultTest { + + @Test + public void toStringOk() { + String s = RebaseResult.OK_RESULT.toString(); + assertNotNull(s); + assertTrue(s.contains("status=OK")); + assertTrue(s.startsWith("RebaseResult[")); + assertTrue(s.endsWith("]")); + } + + @Test + public void toStringUpToDate() { + String s = RebaseResult.UP_TO_DATE_RESULT.toString(); + assertTrue(s.contains("status=UP_TO_DATE")); + } + + @Test + public void toStringFastForward() { + String s = RebaseResult.FAST_FORWARD_RESULT.toString(); + assertTrue(s.contains("status=FAST_FORWARD")); + } + + @Test + public void toStringConflicts() { + RebaseResult result = RebaseResult.conflicts( + List.of("file1.txt", "file2.txt")); + String s = result.toString(); + assertTrue(s.contains("status=CONFLICTS")); + assertTrue(s.contains("file1.txt")); + assertTrue(s.contains("file2.txt")); + } + + @Test + public void toStringUncommittedChanges() { + RebaseResult result = RebaseResult.uncommittedChanges( + List.of("dirty.java")); + String s = result.toString(); + assertTrue(s.contains("status=UNCOMMITTED_CHANGES")); + assertTrue(s.contains("dirty.java")); + } + + @Test + public void toStringAborted() { + String s = RebaseResult.ABORTED_RESULT.toString(); + assertTrue(s.contains("status=ABORTED")); + } +} diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/FetchResultTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/FetchResultTest.java new file mode 100644 index 00000000000..8ae45ef575a --- /dev/null +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/FetchResultTest.java @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2026, hanweiwei and others + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Distribution License v. 1.0 which is available at + * https://www.eclipse.org/org/documents/edl-v10.php. + * + * SPDX-License-Identifier: BSD-3-Clause + */ +package org.eclipse.jgit.transport; + +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +import org.junit.Test; + +public class FetchResultTest { + + @Test + public void toStringEmpty() { + FetchResult result = new FetchResult(); + String s = result.toString(); + assertNotNull(s); + assertTrue(s.startsWith("FetchResult[")); + assertTrue(s.contains("0 ref update(s)")); + assertTrue(s.endsWith("]")); + } + + @Test + public void toStringWithUri() throws Exception { + FetchResult result = new FetchResult(); + result.setAdvertisedRefs(new URIish("https://example.com/repo.git"), + java.util.Collections.emptyMap()); + String s = result.toString(); + assertTrue(s.contains("example.com")); + } + + @Test + public void toStringWithSubmodule() { + FetchResult result = new FetchResult(); + result.addSubmodule("sub/path", new FetchResult()); + String s = result.toString(); + assertTrue(s.contains("1 submodule(s)")); + } +} diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/RebaseResult.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/RebaseResult.java index 2aa64df46fb..a95ae94b24f 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/api/RebaseResult.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/RebaseResult.java @@ -303,4 +303,25 @@ public List getUncommittedChanges() { return uncommittedChanges; } + @SuppressWarnings("nls") + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("RebaseResult[status=").append(status); + if (currentCommit != null) { + sb.append(", currentCommit=") + .append(currentCommit.abbreviate(7).name()); + } + if (conflicts != null && !conflicts.isEmpty()) { + sb.append(", conflicts=").append(conflicts); + } + if (failingPaths != null && !failingPaths.isEmpty()) { + sb.append(", failingPaths=").append(failingPaths.keySet()); + } + if (uncommittedChanges != null && !uncommittedChanges.isEmpty()) { + sb.append(", uncommittedChanges=").append(uncommittedChanges); + } + sb.append("]"); + return sb.toString(); + } } diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/FetchResult.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/FetchResult.java index c55fb21d949..2e6f52a76cd 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/FetchResult.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/FetchResult.java @@ -63,4 +63,28 @@ public void addSubmodule(String path, FetchResult result) { public Map submoduleResults() { return Collections.unmodifiableMap(submodules); } + + @SuppressWarnings("nls") + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("FetchResult["); + if (uri != null) { + sb.append(uri); + } + sb.append(": "); + sb.append(updates.size()).append(" ref update(s)"); + if (!forMerge.isEmpty()) { + sb.append(", ").append(forMerge.size()).append(" for merge"); + } + if (!submodules.isEmpty()) { + sb.append(", ").append(submodules.size()).append(" submodule(s)"); + } + String msgs = getMessages(); + if (!msgs.isEmpty()) { + sb.append(", messages: ").append(msgs.trim()); + } + sb.append("]"); + return sb.toString(); + } } From 4784736dd426df12f10e9b105f38cbe0475a02ee Mon Sep 17 00:00:00 2001 From: hanweiwei Date: Tue, 7 Apr 2026 10:25:53 +0800 Subject: [PATCH 2/2] Use import for Collections in FetchResultTest --- .../tst/org/eclipse/jgit/transport/FetchResultTest.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/FetchResultTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/FetchResultTest.java index 8ae45ef575a..0e186c03eb4 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/FetchResultTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/transport/FetchResultTest.java @@ -12,6 +12,8 @@ import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; +import java.util.Collections; + import org.junit.Test; public class FetchResultTest { @@ -30,7 +32,7 @@ public void toStringEmpty() { public void toStringWithUri() throws Exception { FetchResult result = new FetchResult(); result.setAdvertisedRefs(new URIish("https://example.com/repo.git"), - java.util.Collections.emptyMap()); + Collections.emptyMap()); String s = result.toString(); assertTrue(s.contains("example.com")); }