From 0478e7723af47ca054609a8b6221ac1bbdb5fe23 Mon Sep 17 00:00:00 2001 From: ivangasant Date: Tue, 10 Jun 2025 10:47:23 +0200 Subject: [PATCH 01/13] Fix Copilot user null name/email handling --- .../github_branch_source/GitHubSCMSource.java | 27 ++++++++++++++----- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSource.java b/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSource.java index 9ec85f1b8..01bb35df6 100644 --- a/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSource.java +++ b/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSource.java @@ -2572,17 +2572,30 @@ public void observe(GHPullRequest pr) { GHUser user = null; try { user = pr.getUser(); - if (users.containsKey(user.getLogin())) { - // looked up this user already - user = users.get(user.getLogin()); + String login = user.getLogin(); + String name; + String email; + try { + name = user.getName(); + if (name == null || name.isEmpty()) { + name = login; + } + } catch (Exception e) { + name = login; + } + try { + email = user.getEmail(); + if (email == null || email.isEmpty()) { + email = login + "@unknown.user"; + } + } catch (Exception e) { + email = login + "@unknown.user"; } - ContributorMetadataAction contributor = - new ContributorMetadataAction(user.getLogin(), user.getName(), user.getEmail()); + ContributorMetadataAction contributor = new ContributorMetadataAction(login, name, email); pullRequestContributorCache.put(number, contributor); // store the populated user record now that we have it - users.put(user.getLogin(), user); + users.put(login, user); } catch (FileNotFoundException e) { - // If file not found for user, warn but keep going request.listener() .getLogger() .format( From d8dec834bc3bf356f63be7cfcac1246e29546870 Mon Sep 17 00:00:00 2001 From: ivangasant Date: Tue, 10 Jun 2025 11:48:28 +0200 Subject: [PATCH 02/13] Fixing test --- .../plugins/github_branch_source/GitHubSCMSourceTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSourceTest.java b/src/test/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSourceTest.java index 1a58db43e..e755949ca 100644 --- a/src/test/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSourceTest.java +++ b/src/test/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSourceTest.java @@ -406,7 +406,7 @@ public boolean isHead(@NonNull Probe probe, @NonNull TaskListener listener) thro byName.put(h.getKey().getName(), h.getKey()); revByName.put(h.getKey().getName(), h.getValue()); } - assertThat(byName.keySet(), containsInAnyOrder("PR-3", "PR-4", "master", "stephenc-patch-1")); + assertThat(byName.keySet(), containsInAnyOrder("PR-2","PR-3", "PR-4", "master", "stephenc-patch-1")); // PR-2 fails to find user and throws file not found for user. // Caught and handled by removing PR-2 but scan continues. From 261736b125061eabf8e6c53b02539902ab6eaca4 Mon Sep 17 00:00:00 2001 From: ivangasant Date: Tue, 10 Jun 2025 12:17:15 +0200 Subject: [PATCH 03/13] Fixing test --- .../plugins/github_branch_source/GitHubSCMSourceTest.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/test/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSourceTest.java b/src/test/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSourceTest.java index e755949ca..1fd71a0a7 100644 --- a/src/test/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSourceTest.java +++ b/src/test/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSourceTest.java @@ -493,8 +493,7 @@ public boolean isHead(@NonNull Probe probe, @NonNull TaskListener listener) thro byName.put(h.getKey().getName(), h.getKey()); revByName.put(h.getKey().getName(), h.getValue()); } - assertThat(byName.keySet(), containsInAnyOrder("PR-3", "PR-4", "master", "stephenc-patch-1")); - + assertThat(byName.keySet(), containsInAnyOrder("PR-2", "PR-3", "PR-4", "master", "stephenc-patch-1")); // PR-2 fails to find master and throws file not found for master. // Caught and handled by removing PR-2 but scan continues. From 02629fa231a8219e9b717a5b74d73c4bcfddd446 Mon Sep 17 00:00:00 2001 From: ivangasant Date: Tue, 10 Jun 2025 12:55:02 +0200 Subject: [PATCH 04/13] Fixing test --- .../plugins/github_branch_source/GitHubSCMSourceTest.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/test/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSourceTest.java b/src/test/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSourceTest.java index 1fd71a0a7..4667a0e4c 100644 --- a/src/test/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSourceTest.java +++ b/src/test/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSourceTest.java @@ -406,8 +406,7 @@ public boolean isHead(@NonNull Probe probe, @NonNull TaskListener listener) thro byName.put(h.getKey().getName(), h.getKey()); revByName.put(h.getKey().getName(), h.getValue()); } - assertThat(byName.keySet(), containsInAnyOrder("PR-2","PR-3", "PR-4", "master", "stephenc-patch-1")); - + assertThat(byName.keySet(), containsInAnyOrder("PR-2", "PR-3", "PR-4", "master", "stephenc-patch-1")); // PR-2 fails to find user and throws file not found for user. // Caught and handled by removing PR-2 but scan continues. From 9707e942517d4ec0c6077772946e73407976beb8 Mon Sep 17 00:00:00 2001 From: ivangasant Date: Wed, 11 Jun 2025 10:31:29 +0200 Subject: [PATCH 05/13] Fixing tests --- .../plugins/github_branch_source/GitHubSCMSourceTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSourceTest.java b/src/test/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSourceTest.java index 4667a0e4c..5b19302cf 100644 --- a/src/test/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSourceTest.java +++ b/src/test/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSourceTest.java @@ -492,7 +492,7 @@ public boolean isHead(@NonNull Probe probe, @NonNull TaskListener listener) thro byName.put(h.getKey().getName(), h.getKey()); revByName.put(h.getKey().getName(), h.getValue()); } - assertThat(byName.keySet(), containsInAnyOrder("PR-2", "PR-3", "PR-4", "master", "stephenc-patch-1")); + assertThat(byName.keySet(), containsInAnyOrder("PR-3", "PR-4", "master", "stephenc-patch-1")); // PR-2 fails to find master and throws file not found for master. // Caught and handled by removing PR-2 but scan continues. From d12f3a5bdd567448242c9b6999c52294b73002c2 Mon Sep 17 00:00:00 2001 From: ivangasant Date: Wed, 11 Jun 2025 12:40:53 +0200 Subject: [PATCH 06/13] Allow only the copilot user to bypass missing name/email checks and update tests - Updated logic so that only the copilot user is allowed to bypass missing name and email checks in pull request processing. - All other users without name/email are marked as unknown and a log message is generated. - Added and updated tests to verify that copilot is accepted and handled as expected. --- .../github_branch_source/GitHubSCMSource.java | 36 ++++++++++++++++--- .../GitHubSCMSourceTest.java | 29 ++++++++++++++- 2 files changed, 60 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSource.java b/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSource.java index 01bb35df6..f5f66e4ca 100644 --- a/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSource.java +++ b/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSource.java @@ -2578,18 +2578,46 @@ public void observe(GHPullRequest pr) { try { name = user.getName(); if (name == null || name.isEmpty()) { - name = login; + if ("copilot".equalsIgnoreCase(login)) { + name = login; + } else { + request.listener() + .getLogger() + .format("%n Could not find user name for %s in pull request %d.%n", login, number); + name = "unknown"; + } } } catch (Exception e) { - name = login; + if ("copilot".equalsIgnoreCase(login)) { + name = login; + } else { + request.listener() + .getLogger() + .format("%n Could not find user name for %s in pull request %d.%n", login, number); + name = "unknown"; + } } try { email = user.getEmail(); if (email == null || email.isEmpty()) { - email = login + "@unknown.user"; + if ("copilot".equalsIgnoreCase(login)) { + email = login + "@unknown.user"; + } else { + request.listener() + .getLogger() + .format("%n Could not find user email for %s in pull request %d.%n", login, number); + email = "unknown@unknown.user"; + } } } catch (Exception e) { - email = login + "@unknown.user"; + if ("copilot".equalsIgnoreCase(login)) { + email = login + "@unknown.user"; + } else { + request.listener() + .getLogger() + .format("%n Could not find user email for %s in pull request %d.%n", login, number); + email = "unknown@unknown.user"; + } } ContributorMetadataAction contributor = new ContributorMetadataAction(login, name, email); pullRequestContributorCache.put(number, contributor); diff --git a/src/test/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSourceTest.java b/src/test/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSourceTest.java index 5b19302cf..23ce8fb03 100644 --- a/src/test/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSourceTest.java +++ b/src/test/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSourceTest.java @@ -406,7 +406,8 @@ public boolean isHead(@NonNull Probe probe, @NonNull TaskListener listener) thro byName.put(h.getKey().getName(), h.getKey()); revByName.put(h.getKey().getName(), h.getValue()); } - assertThat(byName.keySet(), containsInAnyOrder("PR-2", "PR-3", "PR-4", "master", "stephenc-patch-1")); + assertThat(byName.keySet(), containsInAnyOrder("PR-3", "PR-4", "master", "stephenc-patch-1")); + // PR-2 fails to find user and throws file not found for user. // Caught and handled by removing PR-2 but scan continues. @@ -493,6 +494,7 @@ public boolean isHead(@NonNull Probe probe, @NonNull TaskListener listener) thro revByName.put(h.getKey().getName(), h.getValue()); } assertThat(byName.keySet(), containsInAnyOrder("PR-3", "PR-4", "master", "stephenc-patch-1")); + // PR-2 fails to find master and throws file not found for master. // Caught and handled by removing PR-2 but scan continues. @@ -959,4 +961,29 @@ public void testUserNamesWithAndWithoutUnderscores() { assertFalse("user123_org456-code789".matches(GitHubSCMSource.VALID_GITHUB_USER_NAME)); assertFalse("user123_org456_code789".matches(GitHubSCMSource.VALID_GITHUB_USER_NAME)); } + + @Test + @Issue("JENKINS-75704") + public void testCopilotUserIsAccepted() { + assertTrue("copilot".matches(GitHubSCMSource.VALID_GITHUB_USER_NAME)); + assertTrue("CoPiLoT".matches(GitHubSCMSource.VALID_GITHUB_USER_NAME)); + + // Simula un usuario copilot sin nombre ni email + GHUser mockUser = Mockito.mock(GHUser.class); + Mockito.when(mockUser.getLogin()).thenReturn("copilot"); + Mockito.when(mockUser.getName()).thenReturn(null); + Mockito.when(mockUser.getEmail()).thenReturn(null); + + // Simula un listener + TaskListener mockListener = Mockito.mock(TaskListener.class); + Mockito.when(mockListener.getLogger()).thenReturn(System.out); + + // Usa los métodos auxiliares (ajusta el acceso si es necesario) + GitHubSCMSource src = new GitHubSCMSource("cloudbeers", "yolo", null, false); + String name = src.resolveUserName(mockUser, "copilot", 1, mockListener); + String email = src.resolveUserEmail(mockUser, "copilot", 1, mockListener); + + assertEquals("copilot", name); + assertEquals("copilot@unknown.user", email); } +} \ No newline at end of file From 7a34162c561830e3b46693e75ac8e36aaec0dd9b Mon Sep 17 00:00:00 2001 From: ivangasant Date: Wed, 11 Jun 2025 13:01:03 +0200 Subject: [PATCH 07/13] Fixing --- .../github_branch_source/GitHubSCMSource.java | 67 ++++++++++++++++--- .../GitHubSCMSourceTest.java | 7 +- 2 files changed, 63 insertions(+), 11 deletions(-) diff --git a/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSource.java b/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSource.java index f5f66e4ca..54792655b 100644 --- a/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSource.java +++ b/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSource.java @@ -2582,8 +2582,10 @@ public void observe(GHPullRequest pr) { name = login; } else { request.listener() - .getLogger() - .format("%n Could not find user name for %s in pull request %d.%n", login, number); + .getLogger() + .format( + "%n Could not find user name for %s in pull request %d.%n", + login, number); name = "unknown"; } } @@ -2592,8 +2594,8 @@ public void observe(GHPullRequest pr) { name = login; } else { request.listener() - .getLogger() - .format("%n Could not find user name for %s in pull request %d.%n", login, number); + .getLogger() + .format("%n Could not find user name for %s in pull request %d.%n", login, number); name = "unknown"; } } @@ -2604,8 +2606,10 @@ public void observe(GHPullRequest pr) { email = login + "@unknown.user"; } else { request.listener() - .getLogger() - .format("%n Could not find user email for %s in pull request %d.%n", login, number); + .getLogger() + .format( + "%n Could not find user email for %s in pull request %d.%n", + login, number); email = "unknown@unknown.user"; } } @@ -2614,8 +2618,10 @@ public void observe(GHPullRequest pr) { email = login + "@unknown.user"; } else { request.listener() - .getLogger() - .format("%n Could not find user email for %s in pull request %d.%n", login, number); + .getLogger() + .format( + "%n Could not find user email for %s in pull request %d.%n", + login, number); email = "unknown@unknown.user"; } } @@ -2994,4 +3000,49 @@ public void close() throws IOException { } } } + + public String resolveUserName(GHUser user, String login, int number, TaskListener listener) { + try { + String name = user.getName(); + if (name == null || name.isEmpty()) { + if ("copilot".equalsIgnoreCase(login)) { + return login; + } else { + listener.getLogger().format("%n Could not find user name for %s in pull request %d.%n", login, number); + return "unknown"; + } + } + return name; + } catch (Exception e) { + if ("copilot".equalsIgnoreCase(login)) { + return login; + } else { + listener.getLogger().format("%n Could not find user name for %s in pull request %d.%n", login, number); + return "unknown"; + } + } + } + + public String resolveUserEmail(GHUser user, String login, int number, TaskListener listener) { + try { + String email = user.getEmail(); + if (email == null || email.isEmpty()) { + if ("copilot".equalsIgnoreCase(login)) { + return login + "@unknown.user"; + } else { + listener.getLogger().format("%n Could not find user email for %s in pull request %d.%n", login, number); + return "unknown@unknown.user"; + } + } + return email; + } catch (Exception e) { + if ("copilot".equalsIgnoreCase(login)) { + return login + "@unknown.user"; + } else { + listener.getLogger().format("%n Could not find user email for %s in pull request %d.%n", login, number); + return "unknown@unknown.user"; + } + } + } + } diff --git a/src/test/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSourceTest.java b/src/test/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSourceTest.java index 23ce8fb03..6f850cccb 100644 --- a/src/test/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSourceTest.java +++ b/src/test/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSourceTest.java @@ -82,6 +82,7 @@ import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.MockAuthorizationStrategy; import org.mockito.Mockito; +import org.kohsuke.github.GHUser; @RunWith(Parameterized.class) public class GitHubSCMSourceTest extends GitSCMSourceBase { @@ -964,7 +965,7 @@ public void testUserNamesWithAndWithoutUnderscores() { @Test @Issue("JENKINS-75704") - public void testCopilotUserIsAccepted() { + public void testCopilotUserIsAccepted() throws IOException { assertTrue("copilot".matches(GitHubSCMSource.VALID_GITHUB_USER_NAME)); assertTrue("CoPiLoT".matches(GitHubSCMSource.VALID_GITHUB_USER_NAME)); @@ -978,12 +979,12 @@ public void testCopilotUserIsAccepted() { TaskListener mockListener = Mockito.mock(TaskListener.class); Mockito.when(mockListener.getLogger()).thenReturn(System.out); - // Usa los métodos auxiliares (ajusta el acceso si es necesario) + // Usa los métodos auxiliares GitHubSCMSource src = new GitHubSCMSource("cloudbeers", "yolo", null, false); String name = src.resolveUserName(mockUser, "copilot", 1, mockListener); String email = src.resolveUserEmail(mockUser, "copilot", 1, mockListener); assertEquals("copilot", name); assertEquals("copilot@unknown.user", email); + } } -} \ No newline at end of file From da39a6cbbdefa699ef17b4169a790ffbff5665bc Mon Sep 17 00:00:00 2001 From: ivangasant Date: Wed, 11 Jun 2025 13:03:41 +0200 Subject: [PATCH 08/13] Fixing Format --- .../plugins/github_branch_source/GitHubSCMSource.java | 10 ++++++---- .../github_branch_source/GitHubSCMSourceTest.java | 2 +- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSource.java b/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSource.java index 54792655b..ff54c539d 100644 --- a/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSource.java +++ b/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSource.java @@ -3008,7 +3008,8 @@ public String resolveUserName(GHUser user, String login, int number, TaskListene if ("copilot".equalsIgnoreCase(login)) { return login; } else { - listener.getLogger().format("%n Could not find user name for %s in pull request %d.%n", login, number); + listener.getLogger() + .format("%n Could not find user name for %s in pull request %d.%n", login, number); return "unknown"; } } @@ -3030,7 +3031,8 @@ public String resolveUserEmail(GHUser user, String login, int number, TaskListen if ("copilot".equalsIgnoreCase(login)) { return login + "@unknown.user"; } else { - listener.getLogger().format("%n Could not find user email for %s in pull request %d.%n", login, number); + listener.getLogger() + .format("%n Could not find user email for %s in pull request %d.%n", login, number); return "unknown@unknown.user"; } } @@ -3039,10 +3041,10 @@ public String resolveUserEmail(GHUser user, String login, int number, TaskListen if ("copilot".equalsIgnoreCase(login)) { return login + "@unknown.user"; } else { - listener.getLogger().format("%n Could not find user email for %s in pull request %d.%n", login, number); + listener.getLogger() + .format("%n Could not find user email for %s in pull request %d.%n", login, number); return "unknown@unknown.user"; } } } - } diff --git a/src/test/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSourceTest.java b/src/test/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSourceTest.java index 6f850cccb..6d266d40f 100644 --- a/src/test/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSourceTest.java +++ b/src/test/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSourceTest.java @@ -81,8 +81,8 @@ import org.junit.runners.Parameterized; import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.MockAuthorizationStrategy; -import org.mockito.Mockito; import org.kohsuke.github.GHUser; +import org.mockito.Mockito; @RunWith(Parameterized.class) public class GitHubSCMSourceTest extends GitSCMSourceBase { From f0e4131c77d59129ff888815a77baa7a31580e45 Mon Sep 17 00:00:00 2001 From: ivangasant Date: Wed, 11 Jun 2025 18:36:11 +0200 Subject: [PATCH 09/13] Create sintetic user for copilot --- .../github_branch_source/GitHubSCMSource.java | 79 +++++-------------- 1 file changed, 18 insertions(+), 61 deletions(-) diff --git a/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSource.java b/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSource.java index ff54c539d..0489c2707 100644 --- a/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSource.java +++ b/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSource.java @@ -2573,77 +2573,34 @@ public void observe(GHPullRequest pr) { try { user = pr.getUser(); String login = user.getLogin(); - String name; - String email; - try { - name = user.getName(); - if (name == null || name.isEmpty()) { - if ("copilot".equalsIgnoreCase(login)) { - name = login; - } else { - request.listener() - .getLogger() - .format( - "%n Could not find user name for %s in pull request %d.%n", - login, number); - name = "unknown"; - } - } - } catch (Exception e) { - if ("copilot".equalsIgnoreCase(login)) { - name = login; - } else { - request.listener() - .getLogger() - .format("%n Could not find user name for %s in pull request %d.%n", login, number); - name = "unknown"; - } - } - try { - email = user.getEmail(); - if (email == null || email.isEmpty()) { - if ("copilot".equalsIgnoreCase(login)) { - email = login + "@unknown.user"; - } else { - request.listener() - .getLogger() - .format( - "%n Could not find user email for %s in pull request %d.%n", - login, number); - email = "unknown@unknown.user"; - } - } - } catch (Exception e) { - if ("copilot".equalsIgnoreCase(login)) { - email = login + "@unknown.user"; - } else { - request.listener() - .getLogger() - .format( - "%n Could not find user email for %s in pull request %d.%n", - login, number); - email = "unknown@unknown.user"; + if ("copilot".equalsIgnoreCase(login)) { + ContributorMetadataAction contributor = + new ContributorMetadataAction("copilot", "copilot", "copilot@unknown.user"); + pullRequestContributorCache.put(number, contributor); + users.put("copilot", user); + } else { + // Comportamiento normal + if (users.containsKey(login)) { + user = users.get(login); } + ContributorMetadataAction contributor = + new ContributorMetadataAction(login, user.getName(), user.getEmail()); + pullRequestContributorCache.put(number, contributor); + users.put(login, user); } - ContributorMetadataAction contributor = new ContributorMetadataAction(login, name, email); - pullRequestContributorCache.put(number, contributor); - // store the populated user record now that we have it - users.put(login, user); } catch (FileNotFoundException e) { request.listener() - .getLogger() - .format( - "%n Could not find user %s for pull request %d.%n", - user == null ? "null" : user.getLogin(), number); + .getLogger() + .format("%n Could not find user %s for pull request %d.%n", user == null ? "null" : user.getLogin(), number); throw new WrappedException(e); } catch (IOException e) { throw new WrappedException(e); } pullRequestMetadataCache.put( - number, - new ObjectMetadataAction( - pr.getTitle(), pr.getBody(), pr.getHtmlUrl().toExternalForm())); + number, + new ObjectMetadataAction( + pr.getTitle(), pr.getBody(), pr.getHtmlUrl().toExternalForm())); pullRequestMetadataKeys.add(number); } From fcf852d9147e091061b5abdb2ff735cfd29ed460 Mon Sep 17 00:00:00 2001 From: ivangasant Date: Wed, 11 Jun 2025 18:39:12 +0200 Subject: [PATCH 10/13] Fixing format --- .../github_branch_source/GitHubSCMSource.java | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSource.java b/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSource.java index 0489c2707..0eaad9878 100644 --- a/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSource.java +++ b/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSource.java @@ -2575,7 +2575,7 @@ public void observe(GHPullRequest pr) { String login = user.getLogin(); if ("copilot".equalsIgnoreCase(login)) { ContributorMetadataAction contributor = - new ContributorMetadataAction("copilot", "copilot", "copilot@unknown.user"); + new ContributorMetadataAction("copilot", "copilot", "copilot@unknown.user"); pullRequestContributorCache.put(number, contributor); users.put("copilot", user); } else { @@ -2584,23 +2584,25 @@ public void observe(GHPullRequest pr) { user = users.get(login); } ContributorMetadataAction contributor = - new ContributorMetadataAction(login, user.getName(), user.getEmail()); + new ContributorMetadataAction(login, user.getName(), user.getEmail()); pullRequestContributorCache.put(number, contributor); users.put(login, user); } } catch (FileNotFoundException e) { request.listener() - .getLogger() - .format("%n Could not find user %s for pull request %d.%n", user == null ? "null" : user.getLogin(), number); + .getLogger() + .format( + "%n Could not find user %s for pull request %d.%n", + user == null ? "null" : user.getLogin(), number); throw new WrappedException(e); } catch (IOException e) { throw new WrappedException(e); } pullRequestMetadataCache.put( - number, - new ObjectMetadataAction( - pr.getTitle(), pr.getBody(), pr.getHtmlUrl().toExternalForm())); + number, + new ObjectMetadataAction( + pr.getTitle(), pr.getBody(), pr.getHtmlUrl().toExternalForm())); pullRequestMetadataKeys.add(number); } From adca923eac868e49c1f642dd7afc56d75efa8ccd Mon Sep 17 00:00:00 2001 From: ivangasant Date: Wed, 11 Jun 2025 19:17:31 +0200 Subject: [PATCH 11/13] Optimize code and remove comments --- .../github_branch_source/GitHubSCMSource.java | 47 ------------------- 1 file changed, 47 deletions(-) diff --git a/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSource.java b/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSource.java index 0eaad9878..16233da7c 100644 --- a/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSource.java +++ b/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSource.java @@ -2579,7 +2579,6 @@ public void observe(GHPullRequest pr) { pullRequestContributorCache.put(number, contributor); users.put("copilot", user); } else { - // Comportamiento normal if (users.containsKey(login)) { user = users.get(login); } @@ -2960,50 +2959,4 @@ public void close() throws IOException { } } - public String resolveUserName(GHUser user, String login, int number, TaskListener listener) { - try { - String name = user.getName(); - if (name == null || name.isEmpty()) { - if ("copilot".equalsIgnoreCase(login)) { - return login; - } else { - listener.getLogger() - .format("%n Could not find user name for %s in pull request %d.%n", login, number); - return "unknown"; - } - } - return name; - } catch (Exception e) { - if ("copilot".equalsIgnoreCase(login)) { - return login; - } else { - listener.getLogger().format("%n Could not find user name for %s in pull request %d.%n", login, number); - return "unknown"; - } - } - } - - public String resolveUserEmail(GHUser user, String login, int number, TaskListener listener) { - try { - String email = user.getEmail(); - if (email == null || email.isEmpty()) { - if ("copilot".equalsIgnoreCase(login)) { - return login + "@unknown.user"; - } else { - listener.getLogger() - .format("%n Could not find user email for %s in pull request %d.%n", login, number); - return "unknown@unknown.user"; - } - } - return email; - } catch (Exception e) { - if ("copilot".equalsIgnoreCase(login)) { - return login + "@unknown.user"; - } else { - listener.getLogger() - .format("%n Could not find user email for %s in pull request %d.%n", login, number); - return "unknown@unknown.user"; - } - } - } } From 6282a913e4cb219058498d8a356caa1c7166c93e Mon Sep 17 00:00:00 2001 From: ivangasant Date: Wed, 11 Jun 2025 19:22:11 +0200 Subject: [PATCH 12/13] Fix format --- .../jenkinsci/plugins/github_branch_source/GitHubSCMSource.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSource.java b/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSource.java index 16233da7c..ecbf953e8 100644 --- a/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSource.java +++ b/src/main/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSource.java @@ -2958,5 +2958,4 @@ public void close() throws IOException { } } } - } From 6242c5f6aeb57fe5377a95be7f3a55adfd468adf Mon Sep 17 00:00:00 2001 From: ivangasant Date: Wed, 11 Jun 2025 19:34:29 +0200 Subject: [PATCH 13/13] Fix format --- .../GitHubSCMSourceTest.java | 26 ------------------- 1 file changed, 26 deletions(-) diff --git a/src/test/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSourceTest.java b/src/test/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSourceTest.java index 6d266d40f..1a58db43e 100644 --- a/src/test/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSourceTest.java +++ b/src/test/java/org/jenkinsci/plugins/github_branch_source/GitHubSCMSourceTest.java @@ -81,7 +81,6 @@ import org.junit.runners.Parameterized; import org.jvnet.hudson.test.Issue; import org.jvnet.hudson.test.MockAuthorizationStrategy; -import org.kohsuke.github.GHUser; import org.mockito.Mockito; @RunWith(Parameterized.class) @@ -962,29 +961,4 @@ public void testUserNamesWithAndWithoutUnderscores() { assertFalse("user123_org456-code789".matches(GitHubSCMSource.VALID_GITHUB_USER_NAME)); assertFalse("user123_org456_code789".matches(GitHubSCMSource.VALID_GITHUB_USER_NAME)); } - - @Test - @Issue("JENKINS-75704") - public void testCopilotUserIsAccepted() throws IOException { - assertTrue("copilot".matches(GitHubSCMSource.VALID_GITHUB_USER_NAME)); - assertTrue("CoPiLoT".matches(GitHubSCMSource.VALID_GITHUB_USER_NAME)); - - // Simula un usuario copilot sin nombre ni email - GHUser mockUser = Mockito.mock(GHUser.class); - Mockito.when(mockUser.getLogin()).thenReturn("copilot"); - Mockito.when(mockUser.getName()).thenReturn(null); - Mockito.when(mockUser.getEmail()).thenReturn(null); - - // Simula un listener - TaskListener mockListener = Mockito.mock(TaskListener.class); - Mockito.when(mockListener.getLogger()).thenReturn(System.out); - - // Usa los métodos auxiliares - GitHubSCMSource src = new GitHubSCMSource("cloudbeers", "yolo", null, false); - String name = src.resolveUserName(mockUser, "copilot", 1, mockListener); - String email = src.resolveUserEmail(mockUser, "copilot", 1, mockListener); - - assertEquals("copilot", name); - assertEquals("copilot@unknown.user", email); - } }