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 792fea216..e7acaeb2a 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 @@ -351,17 +351,22 @@ public boolean isMemberOf(String groupId, HostUser user) { @Override public Optional search(Hash hash) { - var orgsToSearch = orgs.stream().map(o -> "org:" + o).collect(Collectors.joining("+")); + var orgsToSearch = orgs.stream().map(o -> "org:" + o).collect(Collectors.joining(" ")); if (!orgsToSearch.isEmpty()) { - orgsToSearch = "+" + orgsToSearch; + orgsToSearch = " " + orgsToSearch; } var result = runSearch("commits", "hash:" + hash.hex() + orgsToSearch); var items = result.get("items").asArray(); if (items.isEmpty()) { return Optional.empty(); } - var first = items.get(0); - var repo = repository(first.get("repository").get("full_name").asString()); - return repo.get().commit(hash); + // When searching for a commit, there may be hits in multiple repositories. + // There is no good way of knowing for sure which repository we would rather + // get the commit from, but a reasonable default is to go by the shortest + // name as that is most likely the main repository of the project. + var shortestName = items.stream() + .map(o -> o.get("repository").get("full_name").asString()) + .min(Comparator.comparing(String::length)); + return shortestName.flatMap(this::repository).flatMap(r -> r.commit(hash)); } } 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 3953e6171..67f1802c7 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 @@ -232,6 +232,11 @@ public Optional search(Hash hash) { var ids = request.get("groups/" + group + "/projects") .execute() .stream() + // When searching for a commit, there may be hits in multiple repositories. + // There is no good way of knowing for sure which repository we would rather + // get the commit from, but a reasonable default is to go by the shortest + // path name as that is most likely the main repository of the project. + .sorted(Comparator.comparing(o -> o.get("path").asString().length())) .map(o -> o.get("id").asInt()) .collect(Collectors.toList()); for (var id : ids) {