diff --git a/bot/src/main/java/org/openjdk/skara/bot/BotRunnerConfiguration.java b/bot/src/main/java/org/openjdk/skara/bot/BotRunnerConfiguration.java index 1ea73f919..59f4924c6 100644 --- a/bot/src/main/java/org/openjdk/skara/bot/BotRunnerConfiguration.java +++ b/bot/src/main/java/org/openjdk/skara/bot/BotRunnerConfiguration.java @@ -154,7 +154,9 @@ private Map parseRepositories(JSONObject config) throw throw new ConfigurationError("Repository " + entry.name() + " uses undefined host '" + hostName + "'"); } var host = repositoryHosts.get(hostName); - var repo = host.repository(entry.value().get("repository").asString()); + var repo = host.repository(entry.value().get("repository").asString()).orElseThrow(() -> + new ConfigurationError("Repository " + entry.value().get("repository").asString() + " is not available at " + hostName) + ); ret.put(entry.name(), repo); } @@ -181,7 +183,9 @@ private RepositoryEntry parseRepositoryEntry(String entry) throws ConfigurationE throw new ConfigurationError("Repository entry " + entry + " uses undefined host '" + hostName + "'"); } var repositoryName = entry.substring(hostSeparatorIndex + 1); - ret.repository = host.repository(repositoryName); + ret.repository = host.repository(repositoryName).orElseThrow(() -> + new ConfigurationError("Repository " + repositoryName + " is not available at " + hostName) + ); } else { if (!repositories.containsKey(entry)) { throw new ConfigurationError("Repository " + entry + " is not defined!"); diff --git a/bots/pr/src/main/java/org/openjdk/skara/bots/pr/CheckRun.java b/bots/pr/src/main/java/org/openjdk/skara/bots/pr/CheckRun.java index 7ce7e3e4e..c671112f3 100644 --- a/bots/pr/src/main/java/org/openjdk/skara/bots/pr/CheckRun.java +++ b/bots/pr/src/main/java/org/openjdk/skara/bots/pr/CheckRun.java @@ -137,7 +137,9 @@ private List botSpecificChecks() throws IOException { var sourceBranch = mergeSourceBranch(); if (sourceBranch.isPresent() && sourceRepo.isPresent()) { try { - var mergeSourceRepo = pr.repository().forge().repository(sourceRepo.get()); + var mergeSourceRepo = pr.repository().forge().repository(sourceRepo.get()).orElseThrow(() -> + new RuntimeException("Could not find repository " + sourceRepo.get()) + ); try { var sourceHash = prInstance.localRepo().fetch(mergeSourceRepo.url(), sourceBranch.get()); if (!prInstance.localRepo().isAncestor(commits.get(1).hash(), sourceHash)) { diff --git a/bots/tester/src/test/java/org/openjdk/skara/bots/tester/InMemoryHost.java b/bots/tester/src/test/java/org/openjdk/skara/bots/tester/InMemoryHost.java index ae7f2008b..acda49f91 100644 --- a/bots/tester/src/test/java/org/openjdk/skara/bots/tester/InMemoryHost.java +++ b/bots/tester/src/test/java/org/openjdk/skara/bots/tester/InMemoryHost.java @@ -37,8 +37,8 @@ public boolean isValid() { } @Override - public HostedRepository repository(String name) { - return null; + public Optional repository(String name) { + return Optional.empty(); } @Override diff --git a/cli/src/main/java/org/openjdk/skara/cli/GitFork.java b/cli/src/main/java/org/openjdk/skara/cli/GitFork.java index 01e140ecf..27f965430 100644 --- a/cli/src/main/java/org/openjdk/skara/cli/GitFork.java +++ b/cli/src/main/java/org/openjdk/skara/cli/GitFork.java @@ -157,7 +157,10 @@ public static void main(String[] args) throws IOException { path = path.substring(1); } - var fork = host.get().repository(path).fork(); + var hostedRepo = host.get().repository(path).orElseThrow(() -> + new IOException("Could not find repository at " + uri.toString()) + ); + var fork = hostedRepo.fork(); if (token == null) { GitCredentials.approve(credentials); diff --git a/cli/src/main/java/org/openjdk/skara/cli/GitPr.java b/cli/src/main/java/org/openjdk/skara/cli/GitPr.java index c1bf9cd8c..dfddea9e0 100644 --- a/cli/src/main/java/org/openjdk/skara/cli/GitPr.java +++ b/cli/src/main/java/org/openjdk/skara/cli/GitPr.java @@ -108,7 +108,9 @@ private static HostedRepository getHostedRepositoryFor(URI uri, GitCredentials c if (host.isEmpty() || !host.get().isValid()) { exit("error: failed to connect to host " + uri); } - var remoteRepo = host.get().repository(projectName(uri)); + var remoteRepo = host.get().repository(projectName(uri)).orElseThrow(() -> + new IOException("Could not find repository at: " + uri.toString()) + ); var parentRepo = remoteRepo.parent(); var targetRepo = parentRepo.isPresent() ? parentRepo.get() : remoteRepo; return targetRepo; @@ -418,7 +420,9 @@ public static void main(String[] args) throws IOException, InterruptedException System.exit(1); } - var remoteRepo = host.get().repository(projectName(uri)); + var remoteRepo = host.get().repository(projectName(uri)).orElseThrow(() -> + new IOException("Could not find repository at " + uri.toString()) + ); if (token == null) { GitCredentials.approve(credentials); } @@ -575,7 +579,9 @@ public static void main(String[] args) throws IOException, InterruptedException System.exit(1); } - var remoteRepo = host.get().repository(projectName(uri)); + var remoteRepo = host.get().repository(projectName(uri)).orElseThrow(() -> + new IOException("Could not find repository at " + uri.toString()) + ); if (token == null) { GitCredentials.approve(credentials); } diff --git a/cli/src/main/java/org/openjdk/skara/cli/GitSync.java b/cli/src/main/java/org/openjdk/skara/cli/GitSync.java index d37242ea0..1f0c732f5 100644 --- a/cli/src/main/java/org/openjdk/skara/cli/GitSync.java +++ b/cli/src/main/java/org/openjdk/skara/cli/GitSync.java @@ -24,9 +24,11 @@ import org.openjdk.skara.args.*; import org.openjdk.skara.vcs.*; +import org.openjdk.skara.forge.*; +import org.openjdk.skara.proxy.HttpProxy; import java.io.*; -import java.net.URI; +import java.net.*; import java.nio.file.*; import java.util.*; import java.util.logging.*; @@ -101,6 +103,8 @@ public static void main(String[] args) throws IOException, InterruptedException die("error: no repository found at " + cwd.toString()) ); + HttpProxy.setup(); + var remotes = repo.remotes(); String upstream = null; @@ -111,9 +115,25 @@ public static void main(String[] args) throws IOException, InterruptedException if (lines.size() == 1 && remotes.contains(lines.get(0))) { upstream = lines.get(0); } else { - die("No remote provided to fetch from, please set the --from flag"); + if (remotes.contains("origin")) { + var originPullPath = repo.pullPath("origin"); + try { + var uri = Remote.toWebURI(originPullPath); + upstream = Forge.from(URI.create(uri.getScheme() + "://" + uri.getHost())) + .flatMap(f -> f.repository(uri.getPath().substring(1))) + .flatMap(r -> r.parent()) + .map(p -> p.webUrl().toString()) + .orElse(null); + } catch (IllegalArgumentException e) { + upstream = null; + } + } } } + + if (upstream == null) { + die("Could not find upstream repository, please specify one with --from"); + } var upstreamPullPath = remotes.contains(upstream) ? Remote.toURI(repo.pullPath(upstream)) : URI.create(upstream); diff --git a/cli/src/main/java/org/openjdk/skara/cli/Remote.java b/cli/src/main/java/org/openjdk/skara/cli/Remote.java index 334f597cd..c71f3ca6e 100644 --- a/cli/src/main/java/org/openjdk/skara/cli/Remote.java +++ b/cli/src/main/java/org/openjdk/skara/cli/Remote.java @@ -34,6 +34,9 @@ public static URI toWebURI(String remotePath) throws IOException { if (remotePath.startsWith("git+")) { remotePath = remotePath.substring("git+".length()); } + if (remotePath.endsWith(".git")) { + remotePath = remotePath.substring(0, remotePath.length() - ".git".length()); + } if (remotePath.startsWith("http")) { return URI.create(remotePath); } else { 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 90dbc58bc..6f7b9a514 100644 --- a/forge/src/main/java/org/openjdk/skara/forge/Forge.java +++ b/forge/src/main/java/org/openjdk/skara/forge/Forge.java @@ -30,7 +30,7 @@ import java.util.stream.Collectors; public interface Forge extends Host { - HostedRepository repository(String name); + Optional repository(String name); boolean supportsReviewBody(); static Forge from(String name, URI uri, Credential credential, JSONObject configuration) { 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 b3fafbf79..adcf15083 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 @@ -30,7 +30,7 @@ import java.io.IOException; import java.net.*; import java.nio.charset.StandardCharsets; -import java.util.Arrays; +import java.util.*; import java.util.logging.Logger; import java.util.regex.Pattern; @@ -169,8 +169,12 @@ JSONObject runSearch(String query) { } @Override - public HostedRepository repository(String name) { - return new GitHubRepository(this, name); + public Optional repository(String name) { + try { + return Optional.of(new GitHubRepository(this, name)); + } catch (Throwable t) { + return Optional.empty(); + } } @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 ff1980fe5..c89301d79 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 @@ -190,7 +190,7 @@ public Optional parseWebHook(JSONValue body) { @Override public HostedRepository fork() { var response = request.post("forks").execute(); - return gitHubHost.repository(response.get("full_name").asString()); + return gitHubHost.repository(response.get("full_name").asString()).orElseThrow(RuntimeException::new); } @Override 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 71f450926..6cb5029a3 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 @@ -102,8 +102,12 @@ JSONObject getProjectInfo(String name) { } @Override - public HostedRepository repository(String name) { - return new GitLabRepository(this, name); + public Optional repository(String name) { + try { + return Optional.of(new GitLabRepository(this, name)); + } catch (Throwable t) { + return Optional.empty(); + } } private HostUser parseUserDetails(JSONObject details) { diff --git a/forge/src/main/java/org/openjdk/skara/forge/gitlab/GitLabRepository.java b/forge/src/main/java/org/openjdk/skara/forge/gitlab/GitLabRepository.java index 553d4e3e1..faa52ec5a 100644 --- a/forge/src/main/java/org/openjdk/skara/forge/gitlab/GitLabRepository.java +++ b/forge/src/main/java/org/openjdk/skara/forge/gitlab/GitLabRepository.java @@ -235,7 +235,7 @@ public HostedRepository fork() { e.printStackTrace(); } } - return gitLabHost.repository(forkedRepoName); + return gitLabHost.repository(forkedRepoName).orElseThrow(RuntimeException::new); } @Override diff --git a/test/src/main/java/org/openjdk/skara/test/CensusBuilder.java b/test/src/main/java/org/openjdk/skara/test/CensusBuilder.java index 6d4196962..7780d2ae7 100644 --- a/test/src/main/java/org/openjdk/skara/test/CensusBuilder.java +++ b/test/src/main/java/org/openjdk/skara/test/CensusBuilder.java @@ -208,7 +208,7 @@ private void generateVersion(Path folder) throws IOException { public HostedRepository build() { try { var host = TestHost.createNew(List.of(new HostUser(1, "cu", "Census User"))); - var repository = host.repository("census"); + var repository = host.repository("census").orElseThrow(); var folder = Files.createTempDirectory("censusbuilder"); var localRepository = Repository.init(folder, VCS.GIT); diff --git a/test/src/main/java/org/openjdk/skara/test/HostCredentials.java b/test/src/main/java/org/openjdk/skara/test/HostCredentials.java index 9ab0d76d7..ee7a38a72 100644 --- a/test/src/main/java/org/openjdk/skara/test/HostCredentials.java +++ b/test/src/main/java/org/openjdk/skara/test/HostCredentials.java @@ -91,7 +91,7 @@ public IssueTracker createIssueHost(int userIndex) { @Override public HostedRepository getHostedRepository(Forge host) { - return host.repository(config.get("project").asString()); + return host.repository(config.get("project").asString()).orElseThrow(); } @Override @@ -128,7 +128,7 @@ public IssueTracker createIssueHost(int userIndex) { @Override public HostedRepository getHostedRepository(Forge host) { - return host.repository(config.get("project").asString()); + return host.repository(config.get("project").asString()).orElseThrow(); } @Override @@ -165,7 +165,7 @@ public IssueTracker createIssueHost(int userIndex) { @Override public HostedRepository getHostedRepository(Forge host) { - return host.repository(config.get("project").asString()); + return host.repository(config.get("project").asString()).orElseThrow(); } @Override @@ -209,7 +209,7 @@ public IssueTracker createIssueHost(int userIndex) { @Override public HostedRepository getHostedRepository(Forge host) { - return host.repository("test"); + return host.repository("test").orElseThrow(); } @Override diff --git a/test/src/main/java/org/openjdk/skara/test/TestHost.java b/test/src/main/java/org/openjdk/skara/test/TestHost.java index caedb9cea..6bdc3b0fc 100644 --- a/test/src/main/java/org/openjdk/skara/test/TestHost.java +++ b/test/src/main/java/org/openjdk/skara/test/TestHost.java @@ -85,7 +85,7 @@ public boolean isValid() { } @Override - public HostedRepository repository(String name) { + public Optional repository(String name) { Repository localRepository; if (data.repositories.containsKey(name)) { localRepository = data.repositories.get(name); @@ -96,7 +96,7 @@ public HostedRepository repository(String name) { localRepository = createLocalRepository(); data.repositories.put(name, localRepository); } - return new TestHostedRepository(this, name, localRepository); + return Optional.of(new TestHostedRepository(this, name, localRepository)); } @Override