xref: /JGit/org.eclipse.jgit.lfs/src/org/eclipse/jgit/lfs/InstallBuiltinLfsCommand.java (revision 5c5f7c6b146b24f2bd4afae1902df85ad6e57ea3)
10f9ec9e4SMarkus Duft /*
2*5c5f7c6bSMatthias Sohn  * Copyright (C) 2018, Markus Duft <markus.duft@ssi-schaefer.com> and others
30f9ec9e4SMarkus 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.
70f9ec9e4SMarkus Duft  *
8*5c5f7c6bSMatthias Sohn  * SPDX-License-Identifier: BSD-3-Clause
90f9ec9e4SMarkus Duft  */
100f9ec9e4SMarkus Duft package org.eclipse.jgit.lfs;
110f9ec9e4SMarkus Duft 
120f9ec9e4SMarkus Duft import java.io.IOException;
130f9ec9e4SMarkus Duft 
14f383206aSMatthias Sohn import org.eclipse.jgit.api.errors.InvalidConfigurationException;
150f9ec9e4SMarkus Duft import org.eclipse.jgit.errors.ConfigInvalidException;
160f9ec9e4SMarkus Duft import org.eclipse.jgit.lib.ConfigConstants;
170f9ec9e4SMarkus Duft import org.eclipse.jgit.lib.Repository;
180f9ec9e4SMarkus Duft import org.eclipse.jgit.lib.StoredConfig;
190f9ec9e4SMarkus Duft import org.eclipse.jgit.util.FS;
200f9ec9e4SMarkus Duft import org.eclipse.jgit.util.LfsFactory.LfsInstallCommand;
210f9ec9e4SMarkus Duft import org.eclipse.jgit.util.SystemReader;
220f9ec9e4SMarkus Duft 
230f9ec9e4SMarkus Duft /**
240f9ec9e4SMarkus Duft  * Installs all required LFS properties for the current user, analogous to 'git
250f9ec9e4SMarkus Duft  * lfs install', but defaulting to using JGit builtin hooks.
260f9ec9e4SMarkus Duft  *
270f9ec9e4SMarkus Duft  * @since 4.11
280f9ec9e4SMarkus Duft  */
290f9ec9e4SMarkus Duft public class InstallBuiltinLfsCommand implements LfsInstallCommand {
300f9ec9e4SMarkus Duft 
310f9ec9e4SMarkus Duft 	private static final String[] ARGS_USER = new String[] { "lfs", "install" }; //$NON-NLS-1$//$NON-NLS-2$
320f9ec9e4SMarkus Duft 
330f9ec9e4SMarkus Duft 	private static final String[] ARGS_LOCAL = new String[] { "lfs", "install", //$NON-NLS-1$//$NON-NLS-2$
340f9ec9e4SMarkus Duft 			"--local" }; //$NON-NLS-1$
350f9ec9e4SMarkus Duft 
360f9ec9e4SMarkus Duft 	private Repository repository;
370f9ec9e4SMarkus Duft 
38f383206aSMatthias Sohn 	/**
39f383206aSMatthias Sohn 	 * {@inheritDoc}
40f383206aSMatthias Sohn 	 *
41f383206aSMatthias Sohn 	 * @throws IOException
42f383206aSMatthias Sohn 	 *             if an I/O error occurs while accessing a git config or
43f383206aSMatthias Sohn 	 *             executing {@code git lfs install} in an external process
44f383206aSMatthias Sohn 	 * @throws InvalidConfigurationException
45f383206aSMatthias Sohn 	 *             if a git configuration is invalid
46f383206aSMatthias Sohn 	 * @throws InterruptedException
47f383206aSMatthias Sohn 	 *             if the current thread is interrupted while waiting for the
48f383206aSMatthias Sohn 	 *             {@code git lfs install} executed in an external process
49f383206aSMatthias Sohn 	 */
500f9ec9e4SMarkus Duft 	@Override
call()51f383206aSMatthias Sohn 	public Void call() throws IOException, InvalidConfigurationException,
52f383206aSMatthias Sohn 			InterruptedException {
530f9ec9e4SMarkus Duft 		StoredConfig cfg = null;
540f9ec9e4SMarkus Duft 		if (repository == null) {
55f383206aSMatthias Sohn 			try {
56f383206aSMatthias Sohn 				cfg = SystemReader.getInstance().getUserConfig();
57f383206aSMatthias Sohn 			} catch (ConfigInvalidException e) {
58f383206aSMatthias Sohn 				throw new InvalidConfigurationException(e.getMessage(), e);
59f383206aSMatthias Sohn 			}
600f9ec9e4SMarkus Duft 		} else {
610f9ec9e4SMarkus Duft 			cfg = repository.getConfig();
620f9ec9e4SMarkus Duft 		}
630f9ec9e4SMarkus Duft 
640f9ec9e4SMarkus Duft 		cfg.setBoolean(ConfigConstants.CONFIG_FILTER_SECTION,
650f9ec9e4SMarkus Duft 				ConfigConstants.CONFIG_SECTION_LFS,
660f9ec9e4SMarkus Duft 				ConfigConstants.CONFIG_KEY_USEJGITBUILTIN, true);
670f9ec9e4SMarkus Duft 		cfg.setBoolean(ConfigConstants.CONFIG_FILTER_SECTION,
680f9ec9e4SMarkus Duft 				ConfigConstants.CONFIG_SECTION_LFS,
690f9ec9e4SMarkus Duft 				ConfigConstants.CONFIG_KEY_REQUIRED, true);
700f9ec9e4SMarkus Duft 
710f9ec9e4SMarkus Duft 		cfg.save();
720f9ec9e4SMarkus Duft 
730f9ec9e4SMarkus Duft 		// try to run git lfs install, we really don't care if it is present
740f9ec9e4SMarkus Duft 		// and/or works here (yet).
750f9ec9e4SMarkus Duft 		ProcessBuilder builder = FS.DETECTED.runInShell("git", //$NON-NLS-1$
760f9ec9e4SMarkus Duft 				repository == null ? ARGS_USER : ARGS_LOCAL);
770f9ec9e4SMarkus Duft 		if (repository != null) {
780f9ec9e4SMarkus Duft 			builder.directory(repository.isBare() ? repository.getDirectory()
790f9ec9e4SMarkus Duft 					: repository.getWorkTree());
800f9ec9e4SMarkus Duft 		}
810f9ec9e4SMarkus Duft 		FS.DETECTED.runProcess(builder, null, null, (String) null);
820f9ec9e4SMarkus Duft 
830f9ec9e4SMarkus Duft 		return null;
840f9ec9e4SMarkus Duft 	}
850f9ec9e4SMarkus Duft 
860f9ec9e4SMarkus Duft 	/**
870f9ec9e4SMarkus Duft 	 * Set the repository to install LFS for
880f9ec9e4SMarkus Duft 	 *
890f9ec9e4SMarkus Duft 	 * @param repo
900f9ec9e4SMarkus Duft 	 *            the repository to install LFS into locally instead of the user
910f9ec9e4SMarkus Duft 	 *            configuration
920f9ec9e4SMarkus Duft 	 * @return this command
930f9ec9e4SMarkus Duft 	 */
940f9ec9e4SMarkus Duft 	@Override
setRepository(Repository repo)950f9ec9e4SMarkus Duft 	public LfsInstallCommand setRepository(Repository repo) {
960f9ec9e4SMarkus Duft 		this.repository = repo;
970f9ec9e4SMarkus Duft 		return this;
980f9ec9e4SMarkus Duft 	}
990f9ec9e4SMarkus Duft 
1000f9ec9e4SMarkus Duft }
101