Signed-off-by: Florian Koeberle <florianskarten@web.de>
---
.../jgit/treewalk/rules/AddRulesFactory.java | 91 ++++++++++++++++++++
1 files changed, 91 insertions(+), 0 deletions(-)
create mode 100644 org.spearce.jgit/src/org/spearce/jgit/treewalk/rules/AddRulesFactory.java
diff --git a/org.spearce.jgit/src/org/spearce/jgit/treewalk/rules/AddRulesFactory.java b/org.spearce.jgit/src/org/spearce/jgit/treewalk/rules/AddRulesFactory.java
new file mode 100644
index 0000000..c1f9a6f
--- /dev/null
+++ b/org.spearce.jgit/src/org/spearce/jgit/treewalk/rules/AddRulesFactory.java
@@ -0,0 +1,91 @@
+package org.spearce.jgit.treewalk.rules;
+
+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 static org.spearce.jgit.lib.Constants.REPOSITORY_DIRECTORY_NAME;
+
+/**
+ * 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.
+ *
+ */
+public class AddRulesFactory {
+ private final RuleListToObjectConverter converter = new RuleListToObjectConverter();
+
+ private final IgnoreRuleListFactory ignoreRuleListFactory = new IgnoreRuleListFactory();
+
+ private final AddRuleListFactory addRuleListFactory = new AddRuleListFactory();
+
+ /**
+ * @param workTreeDirectory
+ * The directory with the files of the project under version
+ * control.
+ * @param workingDirectory
+ * a directory within the workTreeDirectory.
+ * @param filePatternsOfAddCommand
+ * the file patterns passed to the add command.
+ * @return a {@link Rules} containing the specified rules, the .gitignore
+ * and the .git/info/exclude rules.
+ * @throws InvalidPatternException
+ * if a pattern is invalid.
+ * @throws PathNotInProjectDirectoryException
+ * if the directory workingDirectory is not in workTreeDirectory
+ * @throws IOException
+ * for some reasons.
+ */
+ public Rules createRules(File workTreeDirectory, File workingDirectory,
+ List<String> filePatternsOfAddCommand)
+ throws InvalidPatternException, PathNotInProjectDirectoryException,
+ IOException {
+ final Rule gitDirectoryIgnoreRule = createGitDirectoryIgnoreRule();
+ final File gitDirectory = new File(workTreeDirectory,
+ REPOSITORY_DIRECTORY_NAME);
+ final List<Rule> ignoreRuleListFromFiles = createExcludeRules(
+ workTreeDirectory, gitDirectory);
+ final List<Rule> includeRules = addRuleListFactory.createRuleList(
+ workTreeDirectory, 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(REPOSITORY_DIRECTORY_NAME), true);
+ final Rule gitDirectoryIgnoreRule = new Rule(true, gitDirectoryPattern);
+ return gitDirectoryIgnoreRule;
+ }
+}
--
1.5.4.3
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
| Mike Travis | [RFC 00/15] x86_64: Optimize percpu accesses |
| Nick Piggin | Re: [PATCH 0 of 4] Generic AIO by scheduling stacks |
| Trent Piepho | [PATCH] [POWERPC] Improve (in|out)_beXX() asm code |
| Bart Van Assche | Integration of SCST in the mainstream Linux kernel |
git: | |
| Kevin Ballard | Re: git on MacOSX and files with decomposed utf-8 file names |
| Jon Smirl | ! [rejected] master -> master (non-fast forward) |
| Linus Torvalds | Re: kernel.org mirroring (Re: [GIT PULL] MMC update) |
| Nguyen Thai Ngoc Duy | Re: VCS comparison table |
| Leon Dippenaar | New tcp stack attack |
| Richard Stallman | Real men don't attack straw men |
| Kevin Neff | Patching a SSH 'Weakness' |
| Chris | sudo & wheel group |
| David Miller | [GIT]: Networking |
| Wang Chen | [PATCH 2/15] netdevice 82596: Convert directly reference of netdev->priv to net... |
| Valentine Barshak | [PATCH] USB: net: Fix asix read transfer buffer allocations. |
| Natalie Protasevich | [BUG] New Kernel Bugs |
