git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[JGIT PATCH v3 22/23] Added findWorkTree method to Repository class.

From
FKFlorian Koeberle <florianskarten@web.de>
Date
May 23, 2008, 20:34 UTC
Message-ID
<1211574872-23676-23-git-send-email-florianskarten@web.de>
In-Reply-To
<1211574872-23676-1-git-send-email-florianskarten@web.de>
Signed-off-by: Florian Koeberle <florianskarten@web.de>
---
 .../src/org/spearce/jgit/lib/Repository.java       |   80 ++++++++++++++++++++
 1 files changed, 80 insertions(+), 0 deletions(-)
diff --git a/org.spearce.jgit/src/org/spearce/jgit/lib/Repository.java b/org.spearce.jgit/src/org/spearce/jgit/lib/Repository.java
index 06e686f..71e0e04 100644
--- a/org.spearce.jgit/src/org/spearce/jgit/lib/Repository.java
+++ b/org.spearce.jgit/src/org/spearce/jgit/lib/Repository.java
@@ -16,6 +16,11 @@
  */
 package org.spearce.jgit.lib;
 
+import static org.spearce.jgit.lib.Constants.HEAD;
+import static org.spearce.jgit.lib.Constants.OBJECTS_DIRECTORY_NAME;
+import static org.spearce.jgit.lib.Constants.REFS_DIRECTORY_NAME;
+import static org.spearce.jgit.lib.Constants.REPOSITORY_DIRECTORY_NAME;
+
 import java.io.BufferedReader;
 import java.io.File;
 import java.io.FileNotFoundException;
@@ -29,6 +34,7 @@ import java.util.Map;
 import java.util.Set;
 
 import org.spearce.jgit.errors.IncorrectObjectTypeException;
+import org.spearce.jgit.errors.NoGitRepositoryFoundException;
 import org.spearce.jgit.errors.ObjectWritingException;
 import org.spearce.jgit.errors.RevisionSyntaxException;
 import org.spearce.jgit.stgit.StGitPatch;
@@ -1253,4 +1259,78 @@ public class Repository {
 		}
 	}
 
+	/**
+	 * Find the git repository for the current working directory.
+	 * 
+	 * @return a {@link Repository}.
+	 * @throws NoGitRepositoryFoundException
+	 *             if no git repository could be found for the current
+	 *             directory.
+	 * @throws IOException
+	 *             if not able to determine the absolute path of the current
+	 *             working directory.
+	 */
+	public static WorkTree findWorkTree() throws NoGitRepositoryFoundException,
+			IOException {
+		return findWorkTree(new File("."));
+	}
+
+	/**
+	 * Checks if a path is a valid git repository. Works similar like the method
+	 * is_git_directory from the original setup.c file.
+	 * 
+	 * @param directory
+	 *            the path which should be checked.
+	 * @return true if the path is a valid git repository.
+	 */
+	private static boolean isRepository(File directory) {
+		if (!directory.isDirectory()) {
+			return false;
+		}
+
+		final File objectDirectory = new File(directory, OBJECTS_DIRECTORY_NAME);
+		if (!objectDirectory.isDirectory()) {
+			return false;
+		}
+
+		final File refsDirectory = new File(directory, REFS_DIRECTORY_NAME);
+		if (!refsDirectory.isDirectory()) {
+			return false;
+		}
+
+		final File head = new File(directory, HEAD);
+		if (!hasValidateHeadRef(head)) {
+			return false;
+		}
+
+		return true;
+	}
+
+	/**
+	 * Checks for example if a path is a valid HEAD file.
+	 * 
+	 * @param path
+	 *            is the path of the HEAD file.
+	 * @return true if it has a valid head reference.
+	 */
+	private static final boolean hasValidateHeadRef(File path) {
+		return true; // TODO implement this method
+	}
+
+	private static WorkTree findWorkTree(final File directory)
+			throws IOException, NoGitRepositoryFoundException {
+		File currentDirectory = directory.getAbsoluteFile();
+		while (currentDirectory != null) {
+			final File commonGitDirectory = new File(directory,
+					REPOSITORY_DIRECTORY_NAME);
+			if (isRepository(commonGitDirectory))
+				return new WorkTree(currentDirectory, new Repository(
+						commonGitDirectory));
+			if (isRepository(currentDirectory))
+				return new WorkTree(null, new Repository(currentDirectory));
+			currentDirectory = currentDirectory.getParentFile();
+		}
+		throw new NoGitRepositoryFoundException(directory);
+	}
+
 }
-- 
1.5.4.3
Previous: Robin RosenbergNext: Florian Koeberle
Message 32 of 41 in “Implementation of a file tree iteration using ignore rules.”
  1. 0/23 Implementation of a file tree iteration using ignore rules.Florian Koeberle, May 23, 2008
  2. 01/23 Added the class InvalidPatternException.Florian Koeberle, May 23, 2008
  3. 02/23 Added the class FileNameMatcher and a test class for it.Florian Koeberle, May 23, 2008
  4. 03/23 Added the interface FilePattern.Florian Koeberle, May 23, 2008
  5. 04/23 Added the class Rule.Florian Koeberle, May 23, 2008
  6. 05/23 Added the iterface Rules.Florian Koeberle, May 23, 2008
  7. Robin RosenbergJun 6, 2008
  8. 06/23 Added the class FileNamePattern.Florian Koeberle, May 23, 2008
  9. Robin RosenbergJun 6, 2008
  10. 07/23 Added the class FilePathPattern.Florian Koeberle, May 23, 2008
  11. 08/23 Added the class IgnoreRuleListFactory.Florian Koeberle, May 23, 2008
  12. 09/23 Added a Rules interface implementation and a factory for it.Florian Koeberle, May 23, 2008
  13. Robin RosenbergJun 6, 2008
  14. 10/23 Added test class OverallIgnoreRulestest.Florian Koeberle, May 23, 2008
  15. 11/23 Added the class PathNotInProjectDirectoryException.Florian Koeberle, May 23, 2008
  16. 12/23 Added the class AddRuleListFactory.Florian Koeberle, May 23, 2008
  17. 13/23 Formatted Constants class.Florian Koeberle, May 23, 2008
  18. 14/23 Added constant REPOSITORY_DIRECTORY_NAME to Constants class.Florian Koeberle, May 23, 2008
  19. 15/23 Added class AddRulesFactory.Florian Koeberle, May 23, 2008
  20. 16/23 Added the class LightFileTreeIterator and a test for it.Florian Koeberle, May 23, 2008
  21. 16/23 Added the class LightFileTreeIterator and a test for it.Florian Koeberle, May 31, 2008
  22. 17/23 Added class LightFileTreeIterable.Florian Koeberle, May 23, 2008
  23. 18/23 Added path related constants to the Constants class.Florian Koeberle, May 23, 2008
  24. 19/23 Added WorkTree class which can be constructed over Repository.Florian Koeberle, May 23, 2008
  25. Robin RosenbergJun 6, 2008
  26. 20/23 Added the class NoGitRepositoryFoundException.Florian Koeberle, May 23, 2008
  27. Robin RosenbergJun 6, 2008
  28. Florian KöberleJun 8, 2008
  29. Robin RosenbergJun 8, 2008
  30. 21/23 Formatted Repository class.Florian Koeberle, May 23, 2008
  31. Robin RosenbergJun 6, 2008
  32. 22/23 Added findWorkTree method to Repository class.Florian Koeberle, May 23, 2008
  33. 23/23 Added the test class AddCommandIterationTest.Florian Koeberle, May 23, 2008
  34. 23/23 Added the test class AddCommandIterationTest.Florian Koeberle, May 31, 2008
  35. Robin RosenbergJun 6, 2008
  36. Florian KöberleMay 31, 2008
  37. Robin RosenbergJun 6, 2008
  38. Florian KöberleJun 8, 2008
  39. Robin RosenbergJun 8, 2008
  40. Florian KöberleJun 9, 2008
  41. Shawn O. PearceJun 7, 2008

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.