Use api to set system config for lfs

Could be so simple if this works :-)
This commit is contained in:
Rene Pfeuffer
2020-03-03 16:13:17 +01:00
parent a4f15f1e87
commit e0b02ea1a3
2 changed files with 11 additions and 39 deletions

View File

@@ -4,54 +4,34 @@ import com.google.common.io.ByteStreams;
import org.eclipse.jgit.attributes.FilterCommand;
import org.eclipse.jgit.attributes.FilterCommandRegistry;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.util.FS;
import org.eclipse.jgit.util.SystemReader;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import sonia.scm.SCMContextProvider;
import sonia.scm.plugin.Extension;
import javax.inject.Inject;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.regex.Pattern;
import static java.nio.file.StandardOpenOption.CREATE;
import static java.nio.file.StandardOpenOption.TRUNCATE_EXISTING;
@Extension
public class GitLfsFilterContextListener implements ServletContextListener {
public static final String GITCONFIG = "[filter \"lfs\"]\n" +
"clean = git-lfs clean -- %f\n" +
"smudge = git-lfs smudge -- %f\n" +
"process = git-lfs filter-process\n" +
"required = true\n";
public static final Pattern COMMAND_NAME_PATTERN = Pattern.compile("git-lfs (smudge|clean) -- .*");
private static final Logger LOG = LoggerFactory.getLogger(GitLfsFilterContextListener.class);
private final SCMContextProvider contextProvider;
@Inject
public GitLfsFilterContextListener(SCMContextProvider contextProvider) {
this.contextProvider = contextProvider;
}
@Override
public void contextInitialized(ServletContextEvent sce) {
Path gitconfig = contextProvider.getBaseDirectory().toPath().resolve("gitconfig");
try {
Files.write(gitconfig, GITCONFIG.getBytes(Charset.defaultCharset()), TRUNCATE_EXISTING, CREATE);
FS.DETECTED.setGitSystemConfig(gitconfig.toFile());
LOG.info("wrote git config file: {}", gitconfig);
} catch (IOException e) {
LOG.error("could not write git config in path {}; git lfs support may not work correctly", gitconfig, e);
SystemReader.getInstance().getSystemConfig().setString("filter", "lfs", "clean", "git-lfs clean -- %f");
SystemReader.getInstance().getSystemConfig().setString("filter", "lfs", "smudge", "git-lfs smudge -- %f");
SystemReader.getInstance().getSystemConfig().setString("filter", "lfs", "process", "git-lfs filter-process");
SystemReader.getInstance().getSystemConfig().setString("filter", "lfs", "required", "true");
} catch (Exception e) {
LOG.error("could not set git config; git lfs support may not work correctly", e);
}
FilterCommandRegistry.register(COMMAND_NAME_PATTERN, NoOpFilterCommand::new);
}

View File

@@ -10,12 +10,10 @@ import org.junit.BeforeClass;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
import sonia.scm.SCMContextProvider;
import sonia.scm.repository.Person;
import sonia.scm.repository.util.WorkdirProvider;
import sonia.scm.store.Blob;
import sonia.scm.store.BlobStore;
import sonia.scm.util.IOUtil;
import sonia.scm.web.lfs.LfsBlobStoreFactory;
import java.io.ByteArrayOutputStream;
@@ -31,8 +29,6 @@ import static org.mockito.Mockito.when;
@SubjectAware(configuration = "classpath:sonia/scm/configuration/shiro.ini", username = "admin", password = "secret")
public class GitModifyCommand_LFSTest extends AbstractGitCommandTestBase {
private static File contextDir;
@Rule
public TemporaryFolder temporaryFolder = new TemporaryFolder();
@Rule
@@ -43,17 +39,13 @@ public class GitModifyCommand_LFSTest extends AbstractGitCommandTestBase {
private final LfsBlobStoreFactory lfsBlobStoreFactory = mock(LfsBlobStoreFactory.class);
@BeforeClass
public static void registerFilter() throws IOException {
SCMContextProvider contextProvider = mock(SCMContextProvider.class);
contextDir = Files.createTempDirectory("scm").toFile();
when(contextProvider.getBaseDirectory()).thenReturn(contextDir);
new GitLfsFilterContextListener(contextProvider).contextInitialized(null);
public static void registerFilter() {
new GitLfsFilterContextListener().contextInitialized(null);
}
@AfterClass
public static void unregisterFilter() throws IOException {
new GitLfsFilterContextListener(null).contextDestroyed(null);
IOUtil.delete(contextDir);
public static void unregisterFilter() {
new GitLfsFilterContextListener().contextDestroyed(null);
}
@Test