From: "Shawn O. Pearce" <spearce@spearce.org>
To: Florian Koeberle <florianskarten@web.de>
Cc: git@vger.kernel.org
Subject: Re: [JGIT PATCH v2 07/24] Added findWorkTree method to Repository class.
Date: Mon, 12 May 2008 20:24:09 -0400 [thread overview]
Message-ID: <20080513002409.GC29038@spearce.org> (raw)
In-Reply-To: <1210623222-24908-8-git-send-email-florianskarten@web.de>
Florian Koeberle <florianskarten@web.de> wrote:
> @@ -1242,4 +1247,89 @@ public class Repository {
> }
> }
>
> + /**
> + * Find the git repository for the current working directory.
> + *
> + * @return a {@link Repository}.
> + * @throws IOException
> + * if the system property user.dir isn't set or if it is
> + * invalid.
> + */
> + public static WorkTree findWorkTree() throws IOException {
> + final String workingDirectoryPath = System.getProperty("user.dir");
> + if (workingDirectoryPath == null) {
> + throw new IOException("unable to get working directory");
> + }
> + final File workingDirectoryFile = new File(workingDirectoryPath);
Isn't `final File workingDirectoryFile = new File(".")` easier to write?
And if we are going to throw a checked exception because we cannot
find a repository in ".", maybe that should be a new checked
exception, like NoGitRepositoryFoundException?
> + /**
> + * Checks if a path is a valid git repository. Works similar like the method
> + * is_git_directory from the original setup.c file.
References to C Git aren't common in jgit source code. We aren't
a reference implementation, but that hasn't stopped people from
finding out code a sane description of "how things work". I'd rather
not describe our code in terms of C Git's code; especially what
happens if C Git refactors one day, this reference might no longer
make sense. Anyone coming back here to improve jgit or use this
method will be confused about what we are doing.
> + *
> + * @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;
> + }
We usually omit { and } on simple conditions like this. Its a coding
pattern we stole from C Git, which stole it from the Linux kernel.
> + private static WorkTree findWorkTree(File directory) throws IOException {
> + File currentDirectory = directory.getAbsoluteFile();
> + while (true) {
> + 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();
> + if (currentDirectory == null) {
> + throw new IOException("Can't find git repository");
> + }
> + }
Would this perhaps be a shorter, easier to follow variant of the
same algorithm?
directory = directory.getAbsoluteFile();
File workdir = directory;
while (workdir != null) {
final File gitdir = new File(workdir, REPOSITORY_DIRECTORY_NAME);
if (isRepository(gitdir))
return new WorkTree(workdir, new Repository(gitdir));
if (isRepository(workdir))
return new WorkTree(null, new Repository(workdir));
workdir = workdir.getParentFile();
}
throw new NoGitRepositoryFoundException("No repository for " + directory);
I often do write infinite loops with "for (;;) {", but usually its
because the loop condition is based on an iterator-style method
returning null at the end and I want to store the result in a local
variable scoped to only the body of the loop:
for (;;) {
final RevCommit next = walk.next();
if (next == null)
break;
// use next somehow
}
Otherwise I try to avoid infinite loops in my final version
of something. Though on a recent job interview the interviewer
noticed I tend to start writing code with an infinite loop, then
go back and correct the loop condition before saying "done". ;-)
--
Shawn.
next prev parent reply other threads:[~2008-05-13 0:25 UTC|newest]
Thread overview: 46+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-05-12 20:13 [JGIT PATCH v2 0/24] Implementation of a file tree iteration using ignore rules Florian Koeberle
2008-05-12 20:13 ` [JGIT PATCH v2 01/24] Start of an implementation of a git like command line tool Florian Koeberle
2008-05-12 20:13 ` [JGIT PATCH v2 02/24] Formatted Repository class Florian Koeberle
2008-05-12 20:13 ` [JGIT PATCH v2 03/24] Formatted Constats class Florian Koeberle
2008-05-12 20:13 ` [JGIT PATCH v2 04/24] Added path related constats to " Florian Koeberle
2008-05-12 23:54 ` Shawn O. Pearce
2008-05-23 15:46 ` Florian Köberle
2008-05-12 20:13 ` [JGIT PATCH v2 05/24] Added WorkTree class which can be constructed over Repository Florian Koeberle
2008-05-13 0:04 ` Shawn O. Pearce
2008-05-13 21:13 ` Robin Rosenberg
2008-05-14 0:35 ` Shawn O. Pearce
2008-05-12 20:13 ` [JGIT PATCH v2 06/24] Added a "init" command to the git like command line tool Florian Koeberle
2008-05-12 20:13 ` [JGIT PATCH v2 07/24] Added findWorkTree method to Repository class Florian Koeberle
2008-05-13 0:24 ` Shawn O. Pearce [this message]
2008-05-23 18:12 ` Florian Köberle
2008-05-23 18:31 ` Miklos Vajna
2008-05-23 20:39 ` Shawn O. Pearce
2008-05-23 21:28 ` Robin Rosenberg
2008-05-12 20:13 ` [JGIT PATCH v2 08/24] Added the interface FilePattern Florian Koeberle
2008-05-12 20:13 ` [JGIT PATCH v2 09/24] Added the class Rule Florian Koeberle
2008-05-12 20:13 ` [JGIT PATCH v2 10/24] Added the iterface Rules Florian Koeberle
2008-05-12 20:13 ` [JGIT PATCH v2 11/24] Added the class FNMatchPattern Florian Koeberle
2008-05-13 0:38 ` Shawn O. Pearce
2008-05-12 20:13 ` [JGIT PATCH v2 12/24] Added the class GlobalFilePattern Florian Koeberle
2008-05-12 20:13 ` [JGIT PATCH v2 13/24] Added the class ComplexFilePattern Florian Koeberle
2008-05-12 20:13 ` [JGIT PATCH v2 14/24] Added the class IgnoreRuleListFactory Florian Koeberle
2008-05-13 1:08 ` Shawn O. Pearce
2008-05-13 10:19 ` Florian Köberle
2008-05-14 1:06 ` Shawn O. Pearce
2008-05-12 20:13 ` [JGIT PATCH v2 15/24] Added a Rules interface implementation and a factory for it Florian Koeberle
2008-05-12 20:13 ` [JGIT PATCH v2 16/24] Added test class OverallIgnoreRulestest Florian Koeberle
2008-05-12 20:13 ` [JGIT PATCH v2 17/24] Added the class TreeFilePattern Florian Koeberle
2008-05-13 1:22 ` Shawn O. Pearce
2008-05-12 20:13 ` [JGIT PATCH v2 18/24] Added InvalidPatternException and PathNotInProjectDirectoryException Florian Koeberle
2008-05-12 20:13 ` [JGIT PATCH v2 19/24] Added the class AddRuleListFactory Florian Koeberle
2008-05-13 1:29 ` Shawn O. Pearce
2008-05-13 11:24 ` Florian Köberle
2008-05-13 20:55 ` Robin Rosenberg
2008-05-14 1:49 ` Shawn O. Pearce
2008-05-12 20:13 ` [JGIT PATCH v2 20/24] Added class AddRulesFactory Florian Koeberle
2008-05-12 20:13 ` [JGIT PATCH v2 21/24] Added the class LightFileTreeIterator and a test for it Florian Koeberle
2008-05-14 14:27 ` Paolo Bonzini
2008-05-12 20:13 ` [JGIT PATCH v2 22/24] Added class LightFileTreeIterable Florian Koeberle
2008-05-12 20:13 ` [JGIT PATCH v2 23/24] Added the test class AddCommandIterationTest Florian Koeberle
2008-05-12 20:13 ` [JGIT PATCH v2 24/24] Added a "add" command to the git like command line tool Florian Koeberle
2008-05-12 20:43 ` [JGIT PATCH v2 0/24] Implementation of a file tree iteration using ignore rules Miklos Vajna
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20080513002409.GC29038@spearce.org \
--to=spearce@spearce.org \
--cc=florianskarten@web.de \
--cc=git@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.