From: Yuxuan 'fishy' Wang Date: Fri, 18 Dec 2015 02:27:56 +0000 (-0800) Subject: Skip nested copyfiles in RepoCommand. X-Git-Tag: v4.2.0.201601211800-r~4^2~59 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=refs%2Fchanges%2F83%2F62983%2F8;p=jgit.git Skip nested copyfiles in RepoCommand. Similar to nested directories, nested copyfiles won't work with git submodule either. Change-Id: Idbe965ec20a682fca0432802858162f8238f05de Signed-off-by: Yuxuan 'fishy' Wang --- diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/gitrepo/RepoCommandTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/gitrepo/RepoCommandTest.java index b6649b3f05..524d0b8e7e 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/gitrepo/RepoCommandTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/gitrepo/RepoCommandTest.java @@ -409,6 +409,7 @@ public class RepoCommandTest extends RepositoryTestCase { .append("") .append("") + .append("") .append("").append(""); JGitTestUtil.writeTrashFile(tempDb, "manifest.xml", xmlContent.toString()); @@ -423,8 +424,12 @@ public class RepoCommandTest extends RepositoryTestCase { .getRepository(); // The Hello file should exist File hello = new File(localDb.getWorkTree(), "Hello"); - localDb.close(); assertTrue("The Hello file should exist", hello.exists()); + // The foo/Hello file should be skipped. + File foohello = new File(localDb.getWorkTree(), "foo/Hello"); + assertFalse( + "The foo/Hello file should be skipped", foohello.exists()); + localDb.close(); // The content of Hello file should be expected BufferedReader reader = new BufferedReader(new FileReader(hello)); String content = reader.readLine(); diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/gitrepo/ManifestParser.java b/org.eclipse.jgit/src/org/eclipse/jgit/gitrepo/ManifestParser.java index 891479d1f4..7eb955006e 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/gitrepo/ManifestParser.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/gitrepo/ManifestParser.java @@ -338,6 +338,20 @@ public class ManifestParser extends DefaultHandler { else last = p; } + removeNestedCopyfiles(); + } + + /** Remove copyfiles that sit in a subdirectory of any other project. */ + void removeNestedCopyfiles() { + for (RepoProject proj : filteredProjects) { + List copyfiles = new ArrayList<>(proj.getCopyFiles()); + proj.clearCopyFiles(); + for (CopyFile copyfile : copyfiles) { + if (!isNestedCopyfile(copyfile)) { + proj.addCopyFile(copyfile); + } + } + } } boolean inGroups(RepoProject proj) { @@ -357,4 +371,22 @@ public class ManifestParser extends DefaultHandler { } return false; } + + private boolean isNestedCopyfile(CopyFile copyfile) { + if (copyfile.dest.indexOf('/') == -1) { + // If the copyfile is at root level then it won't be nested. + return false; + } + for (RepoProject proj : filteredProjects) { + if (proj.getPath().compareTo(copyfile.dest) > 0) { + // Early return as remaining projects can't be ancestor of this + // copyfile config (filteredProjects is sorted). + return false; + } + if (proj.isAncestorOf(copyfile.dest)) { + return true; + } + } + return false; + } } diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/gitrepo/RepoProject.java b/org.eclipse.jgit/src/org/eclipse/jgit/gitrepo/RepoProject.java index 9a072114a7..915066d58f 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/gitrepo/RepoProject.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/gitrepo/RepoProject.java @@ -258,6 +258,15 @@ public class RepoProject implements Comparable { this.copyfiles.addAll(copyfiles); } + /** + * Clear all the copyfiles. + * + * @since 4.2 + */ + public void clearCopyFiles() { + this.copyfiles.clear(); + } + private String getPathWithSlash() { if (path.endsWith("/")) //$NON-NLS-1$ return path; @@ -273,7 +282,19 @@ public class RepoProject implements Comparable { * @return true if this sub repo is the ancestor of given sub repo. */ public boolean isAncestorOf(RepoProject that) { - return that.getPathWithSlash().startsWith(this.getPathWithSlash()); + return isAncestorOf(that.getPathWithSlash()); + } + + /** + * Check if this sub repo is an ancestor of the given path. + * + * @param path + * path to be checked to see if it is within this repository + * @return true if this sub repo is an ancestor of the given path. + * @since 4.2 + */ + public boolean isAncestorOf(String path) { + return path.startsWith(getPathWithSlash()); } @Override