Store repository id in native config file

Hooks can read this repository type dependant config file and handle
the changes for the correct repository id
This commit is contained in:
René Pfeuffer
2018-11-26 17:22:17 +01:00
parent 6b663de7dd
commit 00ab764dab
17 changed files with 204 additions and 175 deletions

View File

@@ -38,21 +38,24 @@ package org.eclipse.jgit.transport;
import com.google.common.collect.ImmutableSet;
import com.google.inject.Inject;
import com.google.inject.Provider;
import org.eclipse.jgit.errors.NoRemoteRepositoryException;
import org.eclipse.jgit.errors.NotSupportedException;
import org.eclipse.jgit.errors.TransportException;
import org.eclipse.jgit.internal.JGitText;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.lib.RepositoryCache;
import sonia.scm.repository.RepositoryDAO;
import sonia.scm.repository.GitRepositoryHandler;
import sonia.scm.repository.spi.HookEventFacade;
import sonia.scm.web.GitReceiveHook;
import java.io.File;
import java.util.Set;
//~--- JDK imports ------------------------------------------------------------
import java.io.File;
import java.util.Set;
/**
*
* @author Sebastian Sdorra
@@ -72,15 +75,24 @@ public class ScmTransportProtocol extends TransportProtocol
* Constructs ...
*
*/
// public ScmTransportProtocol() {}
public ScmTransportProtocol() {}
/**
* Constructs ...
*
*
*
* @param hookEventFacadeProvider
*
* @param repositoryHandlerProvider
*/
@Inject
public ScmTransportProtocol(
Provider<HookEventFacade> hookEventFacadeProvider,
RepositoryDAO repositoryDAO)
Provider<GitRepositoryHandler> repositoryHandlerProvider)
{
this.hookEventFacadeProvider = hookEventFacadeProvider;
this.repositoryDAO = repositoryDAO;
this.repositoryHandlerProvider = repositoryHandlerProvider;
}
//~--- methods --------------------------------------------------------------
@@ -138,7 +150,8 @@ public class ScmTransportProtocol extends TransportProtocol
//J-
return new TransportLocalWithHooks(
hookEventFacadeProvider.get(),
local, uri, gitDir, repositoryDAO
repositoryHandlerProvider.get(),
local, uri, gitDir
);
//J+
}
@@ -181,12 +194,23 @@ public class ScmTransportProtocol extends TransportProtocol
private static class TransportLocalWithHooks extends TransportLocal
{
/**
* Constructs ...
*
*
*
* @param hookEventFacade
* @param handler
* @param local
* @param uri
* @param gitDir
*/
public TransportLocalWithHooks(HookEventFacade hookEventFacade,
Repository local, URIish uri, File gitDir, RepositoryDAO repositoryDAO)
GitRepositoryHandler handler, Repository local, URIish uri, File gitDir)
{
super(local, uri, gitDir);
this.hookEventFacade = hookEventFacade;
this.repositoryDAO = repositoryDAO;
this.handler = handler;
}
//~--- methods ------------------------------------------------------------
@@ -204,9 +228,9 @@ public class ScmTransportProtocol extends TransportProtocol
{
ReceivePack pack = new ReceivePack(dst);
if (hookEventFacade != null)
if ((hookEventFacade != null) && (handler != null))
{
GitReceiveHook hook = new GitReceiveHook(hookEventFacade, repositoryDAO);
GitReceiveHook hook = new GitReceiveHook(hookEventFacade, handler);
pack.setPreReceiveHook(hook);
pack.setPostReceiveHook(hook);
@@ -217,9 +241,11 @@ public class ScmTransportProtocol extends TransportProtocol
//~--- fields -------------------------------------------------------------
/** Field description */
private GitRepositoryHandler handler;
/** Field description */
private HookEventFacade hookEventFacade;
private RepositoryDAO repositoryDAO;
}
@@ -228,5 +254,6 @@ public class ScmTransportProtocol extends TransportProtocol
/** Field description */
private Provider<HookEventFacade> hookEventFacadeProvider;
private RepositoryDAO repositoryDAO;
/** Field description */
private Provider<GitRepositoryHandler> repositoryHandlerProvider;
}

View File

@@ -38,6 +38,7 @@ package sonia.scm.repository;
import com.google.common.base.Strings;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import org.eclipse.jgit.lib.StoredConfig;
import org.eclipse.jgit.storage.file.FileRepositoryBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -88,6 +89,8 @@ public class GitRepositoryHandler
GitRepositoryServiceProvider.COMMANDS);
private static final Object LOCK = new Object();
private static final String CONFIG_SECTION_SCMM = "scmm";
private static final String CONFIG_KEY_REPOSITORY_ID = "repositoryid";
private final Scheduler scheduler;
@@ -176,15 +179,26 @@ public class GitRepositoryHandler
return getStringFromResource(RESOURCE_VERSION, DEFAULT_VERSION_INFORMATION);
}
public GitWorkdirFactory getWorkdirFactory() {
return workdirFactory;
}
public String getRepositoryId(StoredConfig gitConfig) {
return gitConfig.getString(GitRepositoryHandler.CONFIG_SECTION_SCMM, null, GitRepositoryHandler.CONFIG_KEY_REPOSITORY_ID);
}
//~--- methods --------------------------------------------------------------
@Override
protected void create(Repository repository, File directory) throws IOException {
try (org.eclipse.jgit.lib.Repository gitRepository = build(directory)) {
gitRepository.create(true);
StoredConfig config = gitRepository.getConfig();
config.setString(CONFIG_SECTION_SCMM, null, CONFIG_KEY_REPOSITORY_ID, repository.getId());
config.save();
}
}
private org.eclipse.jgit.lib.Repository build(File directory) throws IOException {
return new FileRepositoryBuilder()
.setGitDir(directory)
@@ -218,8 +232,4 @@ public class GitRepositoryHandler
{
return GitConfig.class;
}
public GitWorkdirFactory getWorkdirFactory() {
return workdirFactory;
}
}

View File

@@ -36,18 +36,18 @@ package sonia.scm.web;
//~--- non-JDK imports --------------------------------------------------------
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.lib.StoredConfig;
import org.eclipse.jgit.transport.PostReceiveHook;
import org.eclipse.jgit.transport.PreReceiveHook;
import org.eclipse.jgit.transport.ReceiveCommand;
import org.eclipse.jgit.transport.ReceivePack;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import sonia.scm.repository.RepositoryDAO;
import sonia.scm.repository.GitRepositoryHandler;
import sonia.scm.repository.RepositoryHookType;
import sonia.scm.repository.spi.GitHookContextProvider;
import sonia.scm.repository.spi.HookEventFacade;
import java.io.File;
import java.io.IOException;
import java.util.Collection;
import java.util.List;
@@ -67,10 +67,19 @@ public class GitReceiveHook implements PreReceiveHook, PostReceiveHook
//~--- constructors ---------------------------------------------------------
public GitReceiveHook(HookEventFacade hookEventFacade, RepositoryDAO repositoryDAO)
/**
* Constructs ...
*
*
*
* @param hookEventFacade
* @param handler
*/
public GitReceiveHook(HookEventFacade hookEventFacade,
GitRepositoryHandler handler)
{
this.hookEventFacade = hookEventFacade;
this.repositoryDAO = repositoryDAO;
this.handler = handler;
}
//~--- methods --------------------------------------------------------------
@@ -118,14 +127,14 @@ public class GitReceiveHook implements PreReceiveHook, PostReceiveHook
try
{
Repository repository = rpack.getRepository();
sonia.scm.repository.Repository scmRepository = resolveRepositoryId(repository);
String repositoryId = resolveRepositoryId(repository);
logger.trace("resolved repository to {}", scmRepository.getNamespaceAndName());
logger.trace("resolved repository to {}", repositoryId);
GitHookContextProvider context = new GitHookContextProvider(rpack,
receiveCommands);
hookEventFacade.handle(scmRepository).fireHookEvent(type, context);
hookEventFacade.handle(repositoryId).fireHookEvent(type, context);
}
catch (Exception ex)
@@ -177,26 +186,17 @@ public class GitReceiveHook implements PreReceiveHook, PostReceiveHook
*
* @throws IOException
*/
private sonia.scm.repository.Repository resolveRepositoryId(Repository repository)
private String resolveRepositoryId(Repository repository)
{
File directory;
if (repository.isBare())
{
directory = repository.getDirectory();
}
else
{
directory = repository.getWorkTree();
}
return repositoryDAO.getRepositoryForDirectory(directory);
StoredConfig gitConfig = repository.getConfig();
return handler.getRepositoryId(gitConfig);
}
//~--- fields ---------------------------------------------------------------
/** Field description */
private HookEventFacade hookEventFacade;
private GitRepositoryHandler handler;
private final RepositoryDAO repositoryDAO;
/** Field description */
private HookEventFacade hookEventFacade;
}

View File

@@ -36,19 +36,21 @@ package sonia.scm.web;
//~--- non-JDK imports --------------------------------------------------------
import com.google.inject.Inject;
import org.eclipse.jgit.http.server.resolver.DefaultReceivePackFactory;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.transport.ReceivePack;
import org.eclipse.jgit.transport.resolver.ReceivePackFactory;
import org.eclipse.jgit.transport.resolver.ServiceNotAuthorizedException;
import org.eclipse.jgit.transport.resolver.ServiceNotEnabledException;
import sonia.scm.repository.RepositoryDAO;
import sonia.scm.repository.GitRepositoryHandler;
import sonia.scm.repository.spi.HookEventFacade;
import javax.servlet.http.HttpServletRequest;
//~--- JDK imports ------------------------------------------------------------
import javax.servlet.http.HttpServletRequest;
/**
*
* @author Sebastian Sdorra
@@ -57,10 +59,19 @@ public class GitReceivePackFactory
implements ReceivePackFactory<HttpServletRequest>
{
/**
* Constructs ...
*
*
*
* @param hookEventFacade
* @param handler
*/
@Inject
public GitReceivePackFactory(HookEventFacade hookEventFacade, RepositoryDAO repositoryDAO)
public GitReceivePackFactory(HookEventFacade hookEventFacade,
GitRepositoryHandler handler)
{
hook = new GitReceiveHook(hookEventFacade, repositoryDAO);
hook = new GitReceiveHook(hookEventFacade, handler);
}
//~--- methods --------------------------------------------------------------

View File

@@ -127,7 +127,15 @@ public class AbstractRemoteCommandTestBase
{
return null;
}
}, null);
}, new Provider<GitRepositoryHandler>()
{
@Override
public GitRepositoryHandler get()
{
return null;
}
});
Transport.register(proto);
}