145ee55d0SChristian Halstrick /* 2*5c5f7c6bSMatthias Sohn * Copyright (C) 2016, Christian Halstrick <christian.halstrick@sap.com> and others 345ee55d0SChristian Halstrick * 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. 745ee55d0SChristian Halstrick * 8*5c5f7c6bSMatthias Sohn * SPDX-License-Identifier: BSD-3-Clause 945ee55d0SChristian Halstrick */ 1045ee55d0SChristian Halstrick package org.eclipse.jgit.lfs; 1145ee55d0SChristian Halstrick 1259640fb4SDavid Turner import static org.eclipse.jgit.lib.Constants.OBJECTS; 1359640fb4SDavid Turner 1445ee55d0SChristian Halstrick import java.io.IOException; 1545ee55d0SChristian Halstrick import java.nio.file.Files; 1645ee55d0SChristian Halstrick import java.nio.file.Path; 1745ee55d0SChristian Halstrick 184b7747ccSMatthias Sohn import org.eclipse.jgit.lfs.lib.AnyLongObjectId; 1994bcde66SMarkus Duft import org.eclipse.jgit.lfs.lib.Constants; 2094bcde66SMarkus Duft import org.eclipse.jgit.lib.Repository; 2145ee55d0SChristian Halstrick 2245ee55d0SChristian Halstrick /** 232464fa44SMatthias Sohn * Class which represents the lfs folder hierarchy inside a {@code .git} folder 2445ee55d0SChristian Halstrick * 2545ee55d0SChristian Halstrick * @since 4.6 2645ee55d0SChristian Halstrick */ 2745ee55d0SChristian Halstrick public class Lfs { 2845ee55d0SChristian Halstrick private Path root; 2945ee55d0SChristian Halstrick 3045ee55d0SChristian Halstrick private Path objDir; 3145ee55d0SChristian Halstrick 3245ee55d0SChristian Halstrick private Path tmpDir; 3345ee55d0SChristian Halstrick 3445ee55d0SChristian Halstrick /** 35e0332bfbSMatthias Sohn * Constructor for Lfs. 36e0332bfbSMatthias Sohn * 3794bcde66SMarkus Duft * @param db 3894bcde66SMarkus Duft * the associated repo 3994bcde66SMarkus Duft * 4094bcde66SMarkus Duft * @since 4.11 4194bcde66SMarkus Duft */ Lfs(Repository db)4294bcde66SMarkus Duft public Lfs(Repository db) { 4394bcde66SMarkus Duft this.root = db.getDirectory().toPath().resolve(Constants.LFS); 4494bcde66SMarkus Duft } 4594bcde66SMarkus Duft 4694bcde66SMarkus Duft /** 47e0332bfbSMatthias Sohn * Get the LFS root directory 48e0332bfbSMatthias Sohn * 4945ee55d0SChristian Halstrick * @return the path to the LFS directory 5045ee55d0SChristian Halstrick */ getLfsRoot()5145ee55d0SChristian Halstrick public Path getLfsRoot() { 5245ee55d0SChristian Halstrick return root; 5345ee55d0SChristian Halstrick } 5445ee55d0SChristian Halstrick 5545ee55d0SChristian Halstrick /** 56e0332bfbSMatthias Sohn * Get the path to the temporary directory used by LFS. 57e0332bfbSMatthias Sohn * 58e0332bfbSMatthias Sohn * @return the path to the temporary directory used by LFS. Will be 59e0332bfbSMatthias Sohn * {@code <repo>/.git/lfs/tmp} 6045ee55d0SChristian Halstrick */ getLfsTmpDir()6145ee55d0SChristian Halstrick public Path getLfsTmpDir() { 6245ee55d0SChristian Halstrick if (tmpDir == null) { 6345ee55d0SChristian Halstrick tmpDir = root.resolve("tmp"); //$NON-NLS-1$ 6445ee55d0SChristian Halstrick } 6545ee55d0SChristian Halstrick return tmpDir; 6645ee55d0SChristian Halstrick } 6745ee55d0SChristian Halstrick 6845ee55d0SChristian Halstrick /** 69e0332bfbSMatthias Sohn * Get the object directory used by LFS 70e0332bfbSMatthias Sohn * 7145ee55d0SChristian Halstrick * @return the path to the object directory used by LFS. Will be 72e0332bfbSMatthias Sohn * {@code <repo>/.git/lfs/objects} 7345ee55d0SChristian Halstrick */ getLfsObjDir()7445ee55d0SChristian Halstrick public Path getLfsObjDir() { 7545ee55d0SChristian Halstrick if (objDir == null) { 7659640fb4SDavid Turner objDir = root.resolve(OBJECTS); 7745ee55d0SChristian Halstrick } 7845ee55d0SChristian Halstrick return objDir; 7945ee55d0SChristian Halstrick } 8045ee55d0SChristian Halstrick 8145ee55d0SChristian Halstrick /** 82e0332bfbSMatthias Sohn * Get the media file which stores the original content 83e0332bfbSMatthias Sohn * 8445ee55d0SChristian Halstrick * @param id 8545ee55d0SChristian Halstrick * the id of the mediafile 862464fa44SMatthias Sohn * @return the file which stores the original content. Its path will look 872464fa44SMatthias Sohn * like 882464fa44SMatthias Sohn * {@code "<repo>/.git/lfs/objects/<firstTwoLettersOfID>/<remainingLettersOfID>"} 8945ee55d0SChristian Halstrick */ getMediaFile(AnyLongObjectId id)904b7747ccSMatthias Sohn public Path getMediaFile(AnyLongObjectId id) { 914b7747ccSMatthias Sohn String idStr = id.name(); 9245ee55d0SChristian Halstrick return getLfsObjDir().resolve(idStr.substring(0, 2)) 9394bcde66SMarkus Duft .resolve(idStr.substring(2, 4)).resolve(idStr); 9445ee55d0SChristian Halstrick } 9545ee55d0SChristian Halstrick 9645ee55d0SChristian Halstrick /** 9745ee55d0SChristian Halstrick * Create a new temp file in the LFS directory 9845ee55d0SChristian Halstrick * 9945ee55d0SChristian Halstrick * @return a new temporary file in the LFS directory 100e0332bfbSMatthias Sohn * @throws java.io.IOException 10145ee55d0SChristian Halstrick * when the temp file could not be created 10245ee55d0SChristian Halstrick */ createTmpFile()10345ee55d0SChristian Halstrick public Path createTmpFile() throws IOException { 10445ee55d0SChristian Halstrick return Files.createTempFile(getLfsTmpDir(), null, null); 10545ee55d0SChristian Halstrick } 10645ee55d0SChristian Halstrick 10745ee55d0SChristian Halstrick } 108