diff --git a/forge/src/main/java/org/openjdk/skara/forge/Forge.java b/forge/src/main/java/org/openjdk/skara/forge/Forge.java index b2e60d9bd..62832fb36 100644 --- a/forge/src/main/java/org/openjdk/skara/forge/Forge.java +++ b/forge/src/main/java/org/openjdk/skara/forge/Forge.java @@ -32,6 +32,14 @@ public interface Forge extends Host { String name(); + + /** + * Gets a HostedRepository on this Forge. This method should verify that the + * repository exists. + * @param name Name of repository to get + * @return Optional containing the repository, or empty if the repository + * does not exist on the Forge. + */ Optional repository(String name); boolean supportsReviewBody(); Optional search(Hash hash); diff --git a/forge/src/main/java/org/openjdk/skara/forge/github/GitHubHost.java b/forge/src/main/java/org/openjdk/skara/forge/github/GitHubHost.java index c2c5adad5..792fea216 100644 --- a/forge/src/main/java/org/openjdk/skara/forge/github/GitHubHost.java +++ b/forge/src/main/java/org/openjdk/skara/forge/github/GitHubHost.java @@ -31,7 +31,6 @@ import java.io.IOException; import java.net.*; import java.nio.charset.StandardCharsets; -import java.nio.file.Path; import java.time.*; import java.util.*; import java.util.stream.Collectors; @@ -239,10 +238,14 @@ public boolean isValid() { } } - JSONObject getProjectInfo(String name) { + Optional getProjectInfo(String name) { var project = request.get("repos/" + name) - .execute(); - return project.asObject(); + .onError(r -> r.statusCode() == 404 ? Optional.of(JSON.object().put("NOT_FOUND", true)) : Optional.empty()) + .execute(); + if (project.contains("NOT_FOUND")) { + return Optional.empty(); + } + return Optional.of(project.asObject()); } JSONObject runSearch(String category, String query) { @@ -268,11 +271,8 @@ JSONObject runSearch(String category, String query) { @Override public Optional repository(String name) { - try { - return Optional.of(new GitHubRepository(this, name)); - } catch (Throwable t) { - return Optional.empty(); - } + return getProjectInfo(name) + .map(jsonObject -> new GitHubRepository(this, name, jsonObject)); } @Override diff --git a/forge/src/main/java/org/openjdk/skara/forge/github/GitHubRepository.java b/forge/src/main/java/org/openjdk/skara/forge/github/GitHubRepository.java index e7b02481e..f892ee1d0 100644 --- a/forge/src/main/java/org/openjdk/skara/forge/github/GitHubRepository.java +++ b/forge/src/main/java/org/openjdk/skara/forge/github/GitHubRepository.java @@ -46,6 +46,11 @@ public class GitHubRepository implements HostedRepository { private JSONValue cachedJSON; private List branches; + GitHubRepository(GitHubHost gitHubHost, String repository, JSONValue json) { + this(gitHubHost, repository); + cachedJSON = json; + } + GitHubRepository(GitHubHost gitHubHost, String repository) { this.gitHubHost = gitHubHost; this.repository = repository; @@ -69,14 +74,14 @@ public class GitHubRepository implements HostedRepository { } return headers; }); - this.cachedJSON = null; var urlPattern = gitHubHost.getWebURI("/" + repository + "/pull/").toString(); pullRequestPattern = Pattern.compile(urlPattern + "(\\d+)"); } private JSONValue json() { if (cachedJSON == null) { - cachedJSON = gitHubHost.getProjectInfo(repository); + cachedJSON = gitHubHost.getProjectInfo(repository) + .orElseThrow(() -> new RuntimeException("Repository not found: " + repository)); } return cachedJSON; } diff --git a/forge/src/main/java/org/openjdk/skara/forge/gitlab/GitLabHost.java b/forge/src/main/java/org/openjdk/skara/forge/gitlab/GitLabHost.java index 00d6c5239..947671371 100644 --- a/forge/src/main/java/org/openjdk/skara/forge/gitlab/GitLabHost.java +++ b/forge/src/main/java/org/openjdk/skara/forge/gitlab/GitLabHost.java @@ -138,11 +138,8 @@ Optional getProjectInfo(int id) { @Override public Optional repository(String name) { - try { - return Optional.of(new GitLabRepository(this, name)); - } catch (Throwable t) { - return Optional.empty(); - } + return getProjectInfo(name) + .map(jsonObject -> new GitLabRepository(this, jsonObject)); } HostUser parseAuthorField(JSONValue json) {