1d3ed64bcSMarkus Duft /* 2*5c5f7c6bSMatthias Sohn * Copyright (C) 2017, Markus Duft <markus.duft@ssi-schaefer.com> and others 3d3ed64bcSMarkus Duft * 4*5c5f7c6bSMatthias Sohn * This program and the accompanying materials are made available under the 5*5c5f7c6bSMatthias Sohn * terms of the Eclipse Distribution License v. 1.0 which is available at 6*5c5f7c6bSMatthias Sohn * https://www.eclipse.org/org/documents/edl-v10.php. 7d3ed64bcSMarkus Duft * 8*5c5f7c6bSMatthias Sohn * SPDX-License-Identifier: BSD-3-Clause 9d3ed64bcSMarkus Duft */ 10d3ed64bcSMarkus Duft package org.eclipse.jgit.lfs; 11d3ed64bcSMarkus Duft 12d3ed64bcSMarkus Duft import java.io.IOException; 13d3ed64bcSMarkus Duft import java.io.InputStream; 14d3ed64bcSMarkus Duft import java.io.PrintStream; 15d3ed64bcSMarkus Duft 16d3ed64bcSMarkus Duft import org.eclipse.jgit.annotations.Nullable; 17d3ed64bcSMarkus Duft import org.eclipse.jgit.attributes.Attribute; 18d3ed64bcSMarkus Duft import org.eclipse.jgit.hooks.PrePushHook; 19d3ed64bcSMarkus Duft import org.eclipse.jgit.lib.ConfigConstants; 20d3ed64bcSMarkus Duft import org.eclipse.jgit.lib.ObjectLoader; 21d3ed64bcSMarkus Duft import org.eclipse.jgit.lib.Repository; 22d3ed64bcSMarkus Duft import org.eclipse.jgit.util.LfsFactory; 23d3ed64bcSMarkus Duft 24d3ed64bcSMarkus Duft /** 25d3ed64bcSMarkus Duft * Implementation of {@link LfsFactory}, using built-in (optional) LFS support. 26d3ed64bcSMarkus Duft * 27d3ed64bcSMarkus Duft * @since 4.11 28d3ed64bcSMarkus Duft */ 29d3ed64bcSMarkus Duft public class BuiltinLFS extends LfsFactory { 30d3ed64bcSMarkus Duft BuiltinLFS()31d3ed64bcSMarkus Duft private BuiltinLFS() { 32d3ed64bcSMarkus Duft SmudgeFilter.register(); 33d3ed64bcSMarkus Duft CleanFilter.register(); 34d3ed64bcSMarkus Duft } 35d3ed64bcSMarkus Duft 36d3ed64bcSMarkus Duft /** 37d3ed64bcSMarkus Duft * Activates the built-in LFS support. 38d3ed64bcSMarkus Duft */ register()39d3ed64bcSMarkus Duft public static void register() { 40d3ed64bcSMarkus Duft setInstance(new BuiltinLFS()); 41d3ed64bcSMarkus Duft } 42d3ed64bcSMarkus Duft 43d3ed64bcSMarkus Duft @Override isAvailable()44d3ed64bcSMarkus Duft public boolean isAvailable() { 45d3ed64bcSMarkus Duft return true; 46d3ed64bcSMarkus Duft } 47d3ed64bcSMarkus Duft 48d3ed64bcSMarkus Duft @Override applySmudgeFilter(Repository db, ObjectLoader loader, Attribute attribute)49d3ed64bcSMarkus Duft public ObjectLoader applySmudgeFilter(Repository db, ObjectLoader loader, 50d3ed64bcSMarkus Duft Attribute attribute) throws IOException { 51d3ed64bcSMarkus Duft if (isEnabled(db) && (attribute == null || isEnabled(db, attribute))) { 52d3ed64bcSMarkus Duft return LfsBlobFilter.smudgeLfsBlob(db, loader); 53d3ed64bcSMarkus Duft } 5498cdca9bSDavid Pursehouse return loader; 55d3ed64bcSMarkus Duft } 56d3ed64bcSMarkus Duft 57d3ed64bcSMarkus Duft @Override applyCleanFilter(Repository db, InputStream input, long length, Attribute attribute)58d3ed64bcSMarkus Duft public LfsInputStream applyCleanFilter(Repository db, InputStream input, 59d3ed64bcSMarkus Duft long length, Attribute attribute) throws IOException { 60d3ed64bcSMarkus Duft if (isEnabled(db, attribute)) { 61d3ed64bcSMarkus Duft return new LfsInputStream(LfsBlobFilter.cleanLfsBlob(db, input)); 62d3ed64bcSMarkus Duft } 6398cdca9bSDavid Pursehouse return new LfsInputStream(input, length); 64d3ed64bcSMarkus Duft } 65d3ed64bcSMarkus Duft 66d3ed64bcSMarkus Duft @Override 67608b6b03SJonathan Nieder @Nullable getPrePushHook(Repository repo, PrintStream outputStream)68608b6b03SJonathan Nieder public PrePushHook getPrePushHook(Repository repo, 69d3ed64bcSMarkus Duft PrintStream outputStream) { 70d3ed64bcSMarkus Duft if (isEnabled(repo)) { 71d3ed64bcSMarkus Duft return new LfsPrePushHook(repo, outputStream); 72d3ed64bcSMarkus Duft } 73d3ed64bcSMarkus Duft return null; 74d3ed64bcSMarkus Duft } 75d3ed64bcSMarkus Duft 7623125abcSTim Neumann @Override 7723125abcSTim Neumann @Nullable getPrePushHook(Repository repo, PrintStream outputStream, PrintStream errorStream)7823125abcSTim Neumann public PrePushHook getPrePushHook(Repository repo, PrintStream outputStream, 7923125abcSTim Neumann PrintStream errorStream) { 8023125abcSTim Neumann if (isEnabled(repo)) { 8123125abcSTim Neumann return new LfsPrePushHook(repo, outputStream, errorStream); 8223125abcSTim Neumann } 8323125abcSTim Neumann return null; 8423125abcSTim Neumann } 8523125abcSTim Neumann 86d3ed64bcSMarkus Duft /** 87d3ed64bcSMarkus Duft * @param db 88d3ed64bcSMarkus Duft * the repository 89d3ed64bcSMarkus Duft * @return whether LFS is requested for the given repo. 90d3ed64bcSMarkus Duft */ 910f9ec9e4SMarkus Duft @Override isEnabled(Repository db)920f9ec9e4SMarkus Duft public boolean isEnabled(Repository db) { 93d3ed64bcSMarkus Duft if (db == null) { 94d3ed64bcSMarkus Duft return false; 95d3ed64bcSMarkus Duft } 96d3ed64bcSMarkus Duft return db.getConfig().getBoolean(ConfigConstants.CONFIG_FILTER_SECTION, 9760b43c03SDavid Pursehouse ConfigConstants.CONFIG_SECTION_LFS, 9860b43c03SDavid Pursehouse ConfigConstants.CONFIG_KEY_USEJGITBUILTIN, 99d3ed64bcSMarkus Duft false); 100d3ed64bcSMarkus Duft } 101d3ed64bcSMarkus Duft 102d3ed64bcSMarkus Duft /** 103d3ed64bcSMarkus Duft * @param db 104d3ed64bcSMarkus Duft * the repository 105d3ed64bcSMarkus Duft * @param attribute 106d3ed64bcSMarkus Duft * the attribute to check 107d3ed64bcSMarkus Duft * @return whether LFS filter is enabled for the given .gitattribute 108d3ed64bcSMarkus Duft * attribute. 109d3ed64bcSMarkus Duft */ isEnabled(Repository db, Attribute attribute)110d3ed64bcSMarkus Duft private boolean isEnabled(Repository db, Attribute attribute) { 111d3ed64bcSMarkus Duft if (attribute == null) { 112d3ed64bcSMarkus Duft return false; 113d3ed64bcSMarkus Duft } 11460b43c03SDavid Pursehouse return isEnabled(db) && ConfigConstants.CONFIG_SECTION_LFS 11560b43c03SDavid Pursehouse .equals(attribute.getValue()); 116d3ed64bcSMarkus Duft } 117d3ed64bcSMarkus Duft 1180f9ec9e4SMarkus Duft @Override getInstallCommand()1190f9ec9e4SMarkus Duft public LfsInstallCommand getInstallCommand() { 1200f9ec9e4SMarkus Duft return new InstallBuiltinLfsCommand(); 1210f9ec9e4SMarkus Duft } 1220f9ec9e4SMarkus Duft 123d3ed64bcSMarkus Duft } 124