diff --git a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/RepositoryFilter.java b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/RepositoryFilter.java index 571183682..5b336b2f9 100644 --- a/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/RepositoryFilter.java +++ b/org.eclipse.jgit.http.server/src/org/eclipse/jgit/http/server/RepositoryFilter.java @@ -65,6 +65,7 @@ import org.eclipse.jgit.errors.RepositoryNotFoundException; import org.eclipse.jgit.lib.Repository; +import org.eclipse.jgit.transport.ServiceMayNotContinueException; import org.eclipse.jgit.transport.resolver.RepositoryResolver; import org.eclipse.jgit.transport.resolver.ServiceNotAuthorizedException; import org.eclipse.jgit.transport.resolver.ServiceNotEnabledException; @@ -141,6 +142,9 @@ public void doFilter(final ServletRequest request, } catch (ServiceNotAuthorizedException e) { res.sendError(SC_UNAUTHORIZED); return; + } catch (ServiceMayNotContinueException e) { + sendError(req, res, SC_INTERNAL_SERVER_ERROR, e.getMessage()); + return; } try { request.setAttribute(ATTRIBUTE_REPOSITORY, db); diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/Daemon.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/Daemon.java index e301f4242..78306766d 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/Daemon.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/Daemon.java @@ -366,7 +366,8 @@ synchronized DaemonService matchService(final String cmd) { return null; } - Repository openRepository(DaemonClient client, String name) { + Repository openRepository(DaemonClient client, String name) + throws ServiceMayNotContinueException { // Assume any attempt to use \ was by a Windows client // and correct to the more typical / used in Git URIs. // diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/DaemonService.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/DaemonService.java index e88b4abb7..a9481c4d2 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/DaemonService.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/DaemonService.java @@ -130,7 +130,16 @@ void execute(final DaemonClient client, final String commandLine) throws IOException, ServiceNotEnabledException, ServiceNotAuthorizedException { final String name = commandLine.substring(command.length() + 1); - Repository db = client.getDaemon().openRepository(client, name); + Repository db; + try { + db = client.getDaemon().openRepository(client, name); + } catch (ServiceMayNotContinueException e) { + // An error when opening the repo means the client is expecting a ref + // advertisement, so use that style of error. + PacketLineOut pktOut = new PacketLineOut(client.getOutputStream()); + pktOut.writeString("ERR " + e.getMessage() + "\n"); + db = null; + } if (db == null) return; try { diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/resolver/RepositoryResolver.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/resolver/RepositoryResolver.java index 611d9a921..c7f0d32cb 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/resolver/RepositoryResolver.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/resolver/RepositoryResolver.java @@ -45,6 +45,7 @@ import org.eclipse.jgit.errors.RepositoryNotFoundException; import org.eclipse.jgit.lib.Repository; +import org.eclipse.jgit.transport.ServiceMayNotContinueException; /** * Locate a Git {@link Repository} by name from the URL. @@ -82,7 +83,12 @@ public Repository open(Object req, String name) * @throws ServiceNotEnabledException * the repository may exist, but HTTP access is not allowed on the * target repository, for the current user. + * @throws ServiceMayNotContinueException + * the repository may exist, but HTTP access is not allowed for + * the current request. The exception message contains a detailed + * message that should be shown to the user. */ Repository open(C req, String name) throws RepositoryNotFoundException, - ServiceNotAuthorizedException, ServiceNotEnabledException; + ServiceNotAuthorizedException, ServiceNotEnabledException, + ServiceMayNotContinueException; }