From 06dd0e9e27a342f74ec97648ab1fbf101af383a4 Mon Sep 17 00:00:00 2001 From: Christian Halstrick Date: Fri, 19 Jul 2013 13:37:58 +0200 Subject: [PATCH] Add path option to StatusCommand Allow filtering of the status. Only files which match given paths are inspected and only their state is reported. Change-Id: I3c4b1b46bf297cd4ebdb4997cfa14c8752a36411 Signed-off-by: Christian Halstrick Signed-off-by: Chris Aniszczyk --- .../src/org/eclipse/jgit/pgm/Status.java | 11 +++++- .../eclipse/jgit/api/StatusCommandTest.java | 36 +++++++++++++++++++ .../org/eclipse/jgit/api/StatusCommand.java | 36 +++++++++++++++++++ 3 files changed, 82 insertions(+), 1 deletion(-) diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Status.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Status.java index 45cfd92ffd..0214ed00e0 100644 --- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Status.java +++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Status.java @@ -52,11 +52,13 @@ import java.util.List; import java.util.Map; import org.eclipse.jgit.api.Git; +import org.eclipse.jgit.api.StatusCommand; import org.eclipse.jgit.lib.Constants; import org.eclipse.jgit.lib.IndexDiff.StageState; import org.eclipse.jgit.lib.Ref; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.pgm.internal.CLIText; +import org.kohsuke.args4j.Option; @Command(usage = "usage_Status", common = true) class Status extends TextBuiltin { @@ -69,6 +71,9 @@ class Status extends TextBuiltin { protected final String statusFileListFormatUnmerged = CLIText.get().statusFileListFormatUnmerged; + @Option(name = "--", metaVar = "metaVar_path", multiValued = true) + protected List filterPaths; + @Override protected void run() throws Exception { // Print current branch name @@ -81,7 +86,11 @@ class Status extends TextBuiltin { } else outw.println(CLIText.formatLine(CLIText.get().notOnAnyBranch)); // List changes - org.eclipse.jgit.api.Status status = new Git(db).status().call(); + StatusCommand statusCommand = new Git(db).status(); + if (filterPaths != null && filterPaths.size() > 0) + for (String path : filterPaths) + statusCommand.addPath(path); + org.eclipse.jgit.api.Status status = statusCommand.call(); Collection added = status.getAdded(); Collection changed = status.getChanged(); Collection removed = status.getRemoved(); diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/StatusCommandTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/StatusCommandTest.java index e98263a2ac..8b3e87f2dc 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/StatusCommandTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/api/StatusCommandTest.java @@ -132,6 +132,42 @@ public class StatusCommandTest extends RepositoryTestCase { assertTrue(stat.getUntrackedFolders().contains("sub")); } + @Test + public void testDifferentStatesWithPaths() throws IOException, + NoFilepatternException, GitAPIException { + Git git = new Git(db); + writeTrashFile("a", "content of a"); + writeTrashFile("D/b", "content of b"); + writeTrashFile("D/c", "content of c"); + writeTrashFile("D/D/d", "content of d"); + git.add().addFilepattern(".").call(); + + writeTrashFile("a", "new content of a"); + writeTrashFile("D/b", "new content of b"); + writeTrashFile("D/D/d", "new content of d"); + + + // filter on an not existing path + Status stat = git.status().addPath("x").call(); + assertEquals(0, stat.getModified().size()); + + // filter on an existing file + stat = git.status().addPath("a").call(); + assertEquals(set("a"), stat.getModified()); + + // filter on an existing folder + stat = git.status().addPath("D").call(); + assertEquals(set("D/b", "D/D/d"), stat.getModified()); + + // filter on an existing folder and file + stat = git.status().addPath("D/D").addPath("a").call(); + assertEquals(set("a", "D/D/d"), stat.getModified()); + + // do not filter at all + stat = git.status().call(); + assertEquals(set("a", "D/b", "D/D/d"), stat.getModified()); + } + public static Set set(String... elements) { Set ret = new HashSet(); for (String element : elements) diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/api/StatusCommand.java b/org.eclipse.jgit/src/org/eclipse/jgit/api/StatusCommand.java index b3e112fc6a..182ffa84b1 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/api/StatusCommand.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/api/StatusCommand.java @@ -43,6 +43,8 @@ package org.eclipse.jgit.api; import java.io.IOException; +import java.util.LinkedList; +import java.util.List; import org.eclipse.jgit.api.errors.GitAPIException; import org.eclipse.jgit.api.errors.JGitInternalException; @@ -52,6 +54,7 @@ import org.eclipse.jgit.lib.IndexDiff; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.treewalk.FileTreeIterator; import org.eclipse.jgit.treewalk.WorkingTreeIterator; +import org.eclipse.jgit.treewalk.filter.PathFilterGroup; /** * A class used to execute a {@code Status} command. It has setters for all @@ -65,6 +68,7 @@ import org.eclipse.jgit.treewalk.WorkingTreeIterator; */ public class StatusCommand extends GitCommand { private WorkingTreeIterator workingTreeIt; + private List paths = null; /** * @param repo @@ -73,6 +77,36 @@ public class StatusCommand extends GitCommand { super(repo); } + /** + * Show only the status of files which match the given paths. The path must + * either name a file or a directory exactly. All paths are always relative + * to the repository root. If a directory is specified all files recursively + * underneath that directory are matched. If this method is called multiple + * times then the status of those files is reported which match at least one + * of the given paths. Note that regex expressions or wildcards are not + * supported. + * + * @param path + * a path is relative to the top level of the repository + * @return {@code this} + */ + public StatusCommand addPath(String path) { + if (paths == null) + paths = new LinkedList(); + paths.add(path); + return this; + } + + /** + * Returns the paths filtering this status. + * + * @return the paths for which the status is shown or null if + * the complete status for the whole repo is shown. + */ + public List getPaths() { + return paths; + } + /** * Executes the {@code Status} command with all the options and parameters * collected by the setter methods of this class. Each instance of this @@ -88,6 +122,8 @@ public class StatusCommand extends GitCommand { try { IndexDiff diff = new IndexDiff(repo, Constants.HEAD, workingTreeIt); + if (paths != null) + diff.setFilter(PathFilterGroup.createFromStrings(paths)); diff.diff(); return new Status(diff); } catch (IOException e) { -- 2.39.5