Signed-off-by: Florian Koeberle <florianskarten@xxxxxx> --- .../FileIterableFactoryForAddCommand.java | 118 ++++++++++++++++++++ 1 files changed, 118 insertions(+), 0 deletions(-) create mode 100644 org.spearce.jgit/src/org/spearce/jgit/lib/fileiteration/FileIterableFactoryForAddCommand.java diff --git a/org.spearce.jgit/src/org/spearce/jgit/lib/fileiteration/FileIterableFactoryForAddCommand.java b/org.spearce.jgit/src/org/spearce/jgit/lib/fileiteration/FileIterableFactoryForAddCommand.java new file mode 100644 index 0000000..4674a87 --- /dev/null +++ b/org.spearce.jgit/src/org/spearce/jgit/lib/fileiteration/FileIterableFactoryForAddCommand.java @@ -0,0 +1,118 @@ +/* + * Copyright (C) 2008 Florian Köberle + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public + * License, version 2, as published by the Free Software Foundation. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + */ +package org.spearce.jgit.lib.fileiteration; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import org.spearce.jgit.errors.InvalidPatternException; +import org.spearce.jgit.errors.PathNotInProjectDirectoryException; +import org.spearce.jgit.lib.GitPathConstants; +import org.spearce.jgit.lib.Project; + +/** + * This class is designed to serve the needs of someone who want to implement a + * git-add command and needs to determine the files to add. + * + * @author Florian Köberle + * + */ +public class FileIterableFactoryForAddCommand { + private final RuleListToObjectConverter converter = new RuleListToObjectConverter(); + + private final IgnoreRuleListFactory ignoreRuleListFactory = new IgnoreRuleListFactory(); + + private final AddRuleListFactory addRuleListFactory = new AddRuleListFactory(); + + /** + * @param project + * a git project. + * @param projectSubDirectory + * a directory in the projectDirectory. + * @param filePatternsOfAddCommand + * determines the files to iterate over. + * @return an {@link Iterable} which can be used to iterate over all + * matching files in the project directory which are not ignored by + * some ignore rules. + * @throws InvalidPatternException + * @throws IOException + * for some reasons. + * @throws PathNotInProjectDirectoryException + * if projectSubDirectory isn't a subdirectory of the project + * directory. + */ + public Iterable<File> createFileTreeIterable(Project project, + File projectSubDirectory, List<String> filePatternsOfAddCommand) + throws InvalidPatternException, PathNotInProjectDirectoryException, + IOException { + final File gitDirectory = project.getRepository().getDirectory(); + final Rules rules = createRules(project.getDirectory(), gitDirectory, + projectSubDirectory, filePatternsOfAddCommand); + return new FileTreeIterable(project.getDirectory(), rules, false); + } + + private Rules createRules(File projectDirectory, File gitDirectory, + File workingDirectory, List<String> filePatternsOfAddCommand) + throws InvalidPatternException, PathNotInProjectDirectoryException, + IOException { + final Rule gitDirectoryIgnoreRule = createGitDirectoryIgnoreRule(); + final List<Rule> ignoreRuleListFromFiles = createExcludeRules( + projectDirectory, gitDirectory); + final List<Rule> includeRules = addRuleListFactory.createRuleList( + projectDirectory, workingDirectory, filePatternsOfAddCommand); + final List<Rule> ruleList = new ArrayList<Rule>(); + + ruleList.add(gitDirectoryIgnoreRule); + ruleList.addAll(ignoreRuleListFromFiles); + ruleList.addAll(includeRules); + ruleList.add(new Rule(true, FilePattern.MATCH_ALWAYS)); + + return converter.createIgnoreRules(ruleList.iterator()); + } + + private List<Rule> createExcludeRules(File projectDirectory, + File gitDirectory) { + final List<File> possibleIgnoreFiles = new ArrayList<File>(2); + possibleIgnoreFiles.add(new File(projectDirectory, ".gitignore")); + possibleIgnoreFiles.add(new File(new File(gitDirectory, "info"), + "exclude")); + + final List<File> ignoreFiles = new ArrayList<File>(); + for (File possibleIgnoreFile : possibleIgnoreFiles) { + if (possibleIgnoreFile.isFile()) { + ignoreFiles.add(possibleIgnoreFile); + } + } + + try { + return ignoreRuleListFactory.createIgnoreRuleList(ignoreFiles); + } catch (FileNotFoundException e) { + throw new RuntimeException("unexpected removal of ignore files", e); + } + } + + private Rule createGitDirectoryIgnoreRule() { + final FilePattern gitDirectoryPattern = new ComplexFilePattern(Arrays + .asList(GitPathConstants.REPOSITORY_DIRECTORY_NAME), true); + final Rule gitDirectoryIgnoreRule = new Rule(true, gitDirectoryPattern); + return gitDirectoryIgnoreRule; + } +} -- 1.5.2.5 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html