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