From 77fb869ce46d2e8a499d031c58ebb536c550b8c5 Mon Sep 17 00:00:00 2001 From: Mohamed Karray Date: Mon, 11 Mar 2019 18:42:10 +0100 Subject: [PATCH 1/6] fix there is no error on missing revision --- .../sonia/scm/repository/spi/GitBrowseCommand.java | 6 +++++- .../java/sonia/scm/repository/spi/GitLogCommand.java | 11 ++++++++--- .../scm/api/v2/resources/SourceRootResource.java | 5 ++++- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitBrowseCommand.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitBrowseCommand.java index 9186572858..6a4d0d9983 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitBrowseCommand.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitBrowseCommand.java @@ -65,6 +65,9 @@ import java.util.Collections; import java.util.List; import java.util.Map; +import static sonia.scm.ContextEntry.ContextBuilder.entity; +import static sonia.scm.NotFoundException.notFound; + //~--- JDK imports ------------------------------------------------------------ /** @@ -128,10 +131,11 @@ public class GitBrowseCommand extends AbstractGitCommand if (Util.isNotEmpty(request.getRevision())) { logger.error("could not find revision {}", request.getRevision()); + throw notFound(entity("Revision", request.getRevision()).in(this.repository)); } else if (logger.isWarnEnabled()) { - logger.warn("coul not find head of repository, empty?"); + logger.warn("could not find head of repository, empty?"); } result = new BrowserResult(Constants.HEAD, createEmtpyRoot()); diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitLogCommand.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitLogCommand.java index bdbb87f2aa..cae62ad362 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitLogCommand.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitLogCommand.java @@ -79,6 +79,7 @@ public class GitLogCommand extends AbstractGitCommand implements LogCommand */ private static final Logger logger = LoggerFactory.getLogger(GitLogCommand.class); + public static final String REVISION = "Revision"; //~--- constructors --------------------------------------------------------- @@ -143,6 +144,10 @@ public class GitLogCommand extends AbstractGitCommand implements LogCommand { logger.error("could not open repository", ex); } + catch (NullPointerException e) + { + throw notFound(entity(REVISION, revision).in(this.repository)); + } finally { IOUtil.close(converter); @@ -208,7 +213,7 @@ public class GitLogCommand extends AbstractGitCommand implements LogCommand if (!Strings.isNullOrEmpty(request.getAncestorChangeset())) { ancestorId = repository.resolve(request.getAncestorChangeset()); if (ancestorId == null) { - throw notFound(entity("Revision", request.getAncestorChangeset()).in(this.repository)); + throw notFound(entity(REVISION, request.getAncestorChangeset()).in(this.repository)); } } @@ -250,7 +255,7 @@ public class GitLogCommand extends AbstractGitCommand implements LogCommand } } } else if (ancestorId != null) { - throw notFound(entity("Revision", request.getBranch()).in(this.repository)); + throw notFound(entity(REVISION, request.getBranch()).in(this.repository)); } if (branch != null) { @@ -267,7 +272,7 @@ public class GitLogCommand extends AbstractGitCommand implements LogCommand } catch (MissingObjectException e) { - throw notFound(entity("Revision", e.getObjectId().getName()).in(repository)); + throw notFound(entity(REVISION, e.getObjectId().getName()).in(repository)); } catch (NotFoundException e) { diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/SourceRootResource.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/SourceRootResource.java index d507a59f14..b5091a8b5f 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/SourceRootResource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/SourceRootResource.java @@ -15,6 +15,9 @@ import javax.ws.rs.Produces; import javax.ws.rs.core.Response; import java.io.IOException; +import static sonia.scm.ContextEntry.ContextBuilder.entity; +import static sonia.scm.NotFoundException.notFound; + public class SourceRootResource { private final RepositoryServiceFactory serviceFactory; @@ -62,7 +65,7 @@ public class SourceRootResource { if (browserResult != null) { return Response.ok(browserResultToFileObjectDtoMapper.map(browserResult, namespaceAndName)).build(); } else { - return Response.status(Response.Status.NOT_FOUND).build(); + throw notFound(entity("sources", path).in(namespaceAndName)); } } } From 6ebbfa97a3077197167a55e960de86f8e0b17f0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Tue, 12 Mar 2019 15:10:43 +0100 Subject: [PATCH 2/6] Start entity types with a capital char --- .../main/java/sonia/scm/repository/spi/HookEventFacade.java | 2 +- .../src/main/java/sonia/scm/repository/GitUtil.java | 2 +- .../main/java/sonia/scm/repository/spi/GitBlameCommand.java | 2 +- .../main/java/sonia/scm/repository/spi/GitBrowseCommand.java | 2 +- .../main/java/sonia/scm/repository/spi/GitMergeCommand.java | 4 ++-- .../main/java/sonia/scm/repository/HgRepositoryHandler.java | 2 +- .../main/java/sonia/scm/repository/SvnRepositoryHandler.java | 2 +- .../sonia/scm/api/v2/resources/FileHistoryRootResource.java | 2 +- .../api/v2/resources/RepositoryPermissionRootResource.java | 2 +- .../java/sonia/scm/api/v2/resources/SourceRootResource.java | 2 +- .../src/main/java/sonia/scm/security/PermissionAssigner.java | 2 +- .../src/main/java/sonia/scm/user/DefaultUserManager.java | 4 ++-- 12 files changed, 14 insertions(+), 14 deletions(-) diff --git a/scm-core/src/main/java/sonia/scm/repository/spi/HookEventFacade.java b/scm-core/src/main/java/sonia/scm/repository/spi/HookEventFacade.java index 27cafd1a16..fd785e2138 100644 --- a/scm-core/src/main/java/sonia/scm/repository/spi/HookEventFacade.java +++ b/scm-core/src/main/java/sonia/scm/repository/spi/HookEventFacade.java @@ -77,7 +77,7 @@ public final class HookEventFacade Repository repository = repositoryManagerProvider.get().get(id); if (repository == null) { - throw notFound(entity("repository", id)); + throw notFound(entity("Repository", id)); } return handle(repository); } diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/GitUtil.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/GitUtil.java index f490b7ea4f..7aacdb256a 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/GitUtil.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/GitUtil.java @@ -205,7 +205,7 @@ public final class GitUtil } catch (GitAPIException ex) { - throw new InternalRepositoryException(ContextEntry.ContextBuilder.entity("remote", directory.toString()).in(remoteRepository), "could not fetch", ex); + throw new InternalRepositoryException(ContextEntry.ContextBuilder.entity("Remote", directory.toString()).in(remoteRepository), "could not fetch", ex); } } diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitBlameCommand.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitBlameCommand.java index 2ad38648da..5787842b9a 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitBlameCommand.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitBlameCommand.java @@ -110,7 +110,7 @@ public class GitBlameCommand extends AbstractGitCommand implements BlameCommand if (gitBlameResult == null) { - throw new InternalRepositoryException(entity("path", request.getPath()).in(repository), + throw new InternalRepositoryException(entity("Path", request.getPath()).in(repository), "could not create blame result for path"); } diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitBrowseCommand.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitBrowseCommand.java index 6a4d0d9983..93fb01176b 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitBrowseCommand.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitBrowseCommand.java @@ -358,7 +358,7 @@ public class GitBrowseCommand extends AbstractGitCommand } } - throw new NotFoundException("file", request.getPath()); + throw notFound(entity("File", request.getPath()).in("Revision", revId.getName()).in(this.repository)); } @SuppressWarnings("unchecked") diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitMergeCommand.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitMergeCommand.java index 64fbadd5a2..f328011815 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitMergeCommand.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitMergeCommand.java @@ -74,7 +74,7 @@ public class GitMergeCommand extends AbstractGitCommand implements MergeCommand private ObjectId resolveRevisionOrThrowNotFound(Repository repository, String revision) throws IOException { ObjectId resolved = repository.resolve(revision); if (resolved == null) { - throw notFound(entity("revision", revision).in(context.getRepository())); + throw notFound(entity("Revision", revision).in(context.getRepository())); } else { return resolved; } @@ -125,7 +125,7 @@ public class GitMergeCommand extends AbstractGitCommand implements MergeCommand clone.checkout().setStartPoint(targetRevision.getName()).setName(target).setCreateBranch(true).call(); } catch (RefNotFoundException e) { logger.debug("could not checkout target branch {} for merge as local branch", target, e); - throw notFound(entity("revision", target).in(context.getRepository())); + throw notFound(entity("Revision", target).in(context.getRepository())); } catch (GitAPIException e) { throw new InternalRepositoryException(context.getRepository(), "could not checkout target branch for merge as local branch: " + target, e); } diff --git a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/HgRepositoryHandler.java b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/HgRepositoryHandler.java index 7db9a8becb..d2da936c48 100644 --- a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/HgRepositoryHandler.java +++ b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/HgRepositoryHandler.java @@ -349,7 +349,7 @@ public class HgRepositoryHandler try { return new INIConfigurationReader().read(new File(directory, PATH_HGRC)).getSection(CONFIG_SECTION_SCMM).getParameter(CONFIG_KEY_REPOSITORY_ID); } catch (IOException e) { - throw new InternalRepositoryException(ContextEntry.ContextBuilder.entity("directory", directory.toString()), "could not read scm configuration file", e); + throw new InternalRepositoryException(ContextEntry.ContextBuilder.entity("Directory", directory.toString()), "could not read scm configuration file", e); } } diff --git a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/SvnRepositoryHandler.java b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/SvnRepositoryHandler.java index 639a16968c..c32310e7e7 100644 --- a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/SvnRepositoryHandler.java +++ b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/SvnRepositoryHandler.java @@ -234,7 +234,7 @@ public class SvnRepositoryHandler try { return new INIConfigurationReader().read(new File(directory, CONFIG_FILE_NAME)).getSection(CONFIG_SECTION_SCMM).getParameter(CONFIG_KEY_REPOSITORY_ID); } catch (IOException e) { - throw new InternalRepositoryException(ContextEntry.ContextBuilder.entity("directory", directory.toString()), "could not read scm configuration file", e); + throw new InternalRepositoryException(ContextEntry.ContextBuilder.entity("Directory", directory.toString()), "could not read scm configuration file", e); } } } diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/FileHistoryRootResource.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/FileHistoryRootResource.java index 017568b613..5e087dc7ca 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/FileHistoryRootResource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/FileHistoryRootResource.java @@ -85,7 +85,7 @@ public class FileHistoryRootResource { } else { String message = String.format("for the revision %s and the file %s there are no changesets", revision, path); log.error(message); - throw notFound(entity("path", path).in("revision", revision).in(namespaceAndName)); + throw notFound(entity("Path", path).in("revision", revision).in(namespaceAndName)); } } } diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/RepositoryPermissionRootResource.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/RepositoryPermissionRootResource.java index d149f55401..b87a4911a5 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/RepositoryPermissionRootResource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/RepositoryPermissionRootResource.java @@ -258,7 +258,7 @@ public class RepositoryPermissionRootResource { */ private void checkPermissionAlreadyExists(RepositoryPermissionDto permission, Repository repository) { if (isPermissionExist(permission, repository)) { - throw alreadyExists(entity("permission", permission.getName()).in(repository)); + throw alreadyExists(entity("Permission", permission.getName()).in(repository)); } } diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/SourceRootResource.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/SourceRootResource.java index b5091a8b5f..a48b68633e 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/SourceRootResource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/SourceRootResource.java @@ -65,7 +65,7 @@ public class SourceRootResource { if (browserResult != null) { return Response.ok(browserResultToFileObjectDtoMapper.map(browserResult, namespaceAndName)).build(); } else { - throw notFound(entity("sources", path).in(namespaceAndName)); + throw notFound(entity("Source", path).in(namespaceAndName)); } } } diff --git a/scm-webapp/src/main/java/sonia/scm/security/PermissionAssigner.java b/scm-webapp/src/main/java/sonia/scm/security/PermissionAssigner.java index faa25d7817..cc0428071a 100644 --- a/scm-webapp/src/main/java/sonia/scm/security/PermissionAssigner.java +++ b/scm-webapp/src/main/java/sonia/scm/security/PermissionAssigner.java @@ -77,7 +77,7 @@ public class PermissionAssigner { private Predicate permissionExists(Collection availablePermissions, Collection existingPermissions) { return p -> { if (!availablePermissions.contains(p) && existingPermissions.stream().map(AssignedPermission::getPermission).noneMatch(e -> e.equals(p))) { - throw NotFoundException.notFound(ContextEntry.ContextBuilder.entity("permission", p.getValue())); + throw NotFoundException.notFound(ContextEntry.ContextBuilder.entity("Permission", p.getValue())); } return true; }; diff --git a/scm-webapp/src/main/java/sonia/scm/user/DefaultUserManager.java b/scm-webapp/src/main/java/sonia/scm/user/DefaultUserManager.java index 33762a5941..709987fb1b 100644 --- a/scm-webapp/src/main/java/sonia/scm/user/DefaultUserManager.java +++ b/scm-webapp/src/main/java/sonia/scm/user/DefaultUserManager.java @@ -403,7 +403,7 @@ public class DefaultUserManager extends AbstractUserManager User user = get((String) SecurityUtils.getSubject().getPrincipals().getPrimaryPrincipal()); if (!user.getPassword().equals(oldPassword)) { - throw new InvalidPasswordException(ContextEntry.ContextBuilder.entity("passwordChange", "-").in(User.class, user.getName())); + throw new InvalidPasswordException(ContextEntry.ContextBuilder.entity("PasswordChange", "-").in(User.class, user.getName())); } user.setPassword(newPassword); @@ -422,7 +422,7 @@ public class DefaultUserManager extends AbstractUserManager throw new NotFoundException(User.class, userId); } if (!isTypeDefault(user)) { - throw new ChangePasswordNotAllowedException(ContextEntry.ContextBuilder.entity("passwordChange", "-").in(User.class, user.getName()), user.getType()); + throw new ChangePasswordNotAllowedException(ContextEntry.ContextBuilder.entity("PasswordChange", "-").in(User.class, user.getName()), user.getType()); } user.setPassword(newPassword); this.modify(user); From be83f87b148a8091af7ade77994738713b96ca85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Tue, 12 Mar 2019 15:10:59 +0100 Subject: [PATCH 3/6] Remove dead code --- .../sonia/scm/repository/spi/GitLogCommand.java | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitLogCommand.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitLogCommand.java index cae62ad362..a42abca5f0 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitLogCommand.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitLogCommand.java @@ -43,7 +43,6 @@ import org.eclipse.jgit.lib.Ref; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.revwalk.RevCommit; import org.eclipse.jgit.revwalk.RevWalk; -import org.eclipse.jgit.revwalk.filter.RevFilter; import org.eclipse.jgit.treewalk.filter.AndTreeFilter; import org.eclipse.jgit.treewalk.filter.PathFilter; import org.eclipse.jgit.treewalk.filter.TreeFilter; @@ -290,17 +289,4 @@ public class GitLogCommand extends AbstractGitCommand implements LogCommand return changesets; } - - private ObjectId computeCommonAncestor(LogCommandRequest request, Repository repository, ObjectId startId, Ref branch) throws IOException { - try (RevWalk mergeBaseWalk = new RevWalk(repository)) { - mergeBaseWalk.setRevFilter(RevFilter.MERGE_BASE); - if (startId != null) { - mergeBaseWalk.markStart(mergeBaseWalk.lookupCommit(startId)); - } else { - mergeBaseWalk.markStart(mergeBaseWalk.lookupCommit(branch.getObjectId())); - } - mergeBaseWalk.markStart(mergeBaseWalk.parseCommit(repository.resolve(request.getAncestorChangeset()))); - return mergeBaseWalk.next().getId(); - } - } } From f814e664cdbdf4f899a52a1b3b4123ee09c8e762 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Tue, 12 Mar 2019 15:44:13 +0100 Subject: [PATCH 4/6] Handle revision not found for svn --- .../sonia/scm/repository/spi/SvnBrowseCommand.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnBrowseCommand.java b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnBrowseCommand.java index df266a11af..99dae0e77b 100644 --- a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnBrowseCommand.java +++ b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnBrowseCommand.java @@ -53,6 +53,10 @@ import sonia.scm.util.Util; import java.util.Collection; +import static org.tmatesoft.svn.core.SVNErrorCode.FS_NO_SUCH_REVISION; +import static sonia.scm.ContextEntry.ContextBuilder.entity; +import static sonia.scm.NotFoundException.notFound; + //~--- JDK imports ------------------------------------------------------------ /** @@ -107,6 +111,9 @@ public class SvnBrowseCommand extends AbstractSvnCommand } catch (SVNException ex) { + if (FS_NO_SUCH_REVISION.equals(ex.getErrorMessage().getErrorCode())) { + throw notFound(entity("Revision", Long.toString(revisionNumber)).in(this.repository)); + } logger.error("could not open repository", ex); } @@ -153,6 +160,9 @@ public class SvnBrowseCommand extends AbstractSvnCommand private FileObject createFileObject(BrowseCommandRequest request, SVNRepository repository, long revision, SVNDirEntry entry, String path) { + if (entry == null) { + throw notFound(entity("Path", path).in("Revision", Long.toString(revision)).in(this.repository)); + } FileObject fileObject = new FileObject(); fileObject.setName(entry.getName()); From c8b19a9d6625149aeabe42b3907a111cb8c1250b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Tue, 12 Mar 2019 15:44:23 +0100 Subject: [PATCH 5/6] Add revision to context --- .../java/sonia/scm/api/v2/resources/SourceRootResource.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/SourceRootResource.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/SourceRootResource.java index a48b68633e..b5c7e205be 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/SourceRootResource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/SourceRootResource.java @@ -65,7 +65,7 @@ public class SourceRootResource { if (browserResult != null) { return Response.ok(browserResultToFileObjectDtoMapper.map(browserResult, namespaceAndName)).build(); } else { - throw notFound(entity("Source", path).in(namespaceAndName)); + throw notFound(entity("Source", path).in("Revision", revision).in(namespaceAndName)); } } } From e7a6a2c2c787dfdffcd7d891192f43ea3ff16784 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Tue, 12 Mar 2019 15:37:33 +0000 Subject: [PATCH 6/6] Close branch bugfix/show_error_on_missing_branch