xref: /JGit/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/BuiltinLFS.java (revision 5c5f7c6b146b24f2bd4afae1902df85ad6e57ea3)
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