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