From e703b6c640f7b8b4aee84ce2661fce1da281d926 Mon Sep 17 00:00:00 2001 From: Matthias Sohn Date: Wed, 23 Feb 2011 23:44:50 +0100 Subject: [PATCH] Respect core.excludesfile to enable global ignore rules Also use FS.resolve() to properly resolve files from path strings. Bug: 328428 (partial fix) Change-Id: I41d94694f220dcb85605c9acadfffb1fa23beaeb Signed-off-by: Matthias Sohn --- .../org/eclipse/jgit/lib/ConfigConstants.java | 3 +++ .../src/org/eclipse/jgit/lib/CoreConfig.java | 11 ++++++++ .../jgit/treewalk/WorkingTreeIterator.java | 27 ++++++++++++++++--- 3 files changed, 38 insertions(+), 3 deletions(-) diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ConfigConstants.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ConfigConstants.java index ccadf6bfe..7e4cb3bee 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/ConfigConstants.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/ConfigConstants.java @@ -72,6 +72,9 @@ public class ConfigConstants { /** The "bare" key */ public static final String CONFIG_KEY_BARE = "bare"; + /** The "excludesfile" key */ + public static final String CONFIG_KEY_EXCLUDESFILE = "excludesfile"; + /** The "filemode" key */ public static final String CONFIG_KEY_FILEMODE = "filemode"; diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/CoreConfig.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/CoreConfig.java index a6da60ffd..2d9f44aad 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/CoreConfig.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/CoreConfig.java @@ -80,10 +80,14 @@ public static enum AutoCRLF { private final boolean logAllRefUpdates; + private final String excludesfile; + private CoreConfig(final Config rc) { compression = rc.getInt("core", "compression", DEFAULT_COMPRESSION); packIndexVersion = rc.getInt("pack", "indexversion", 2); logAllRefUpdates = rc.getBoolean("core", "logallrefupdates", true); + excludesfile = rc.getString(ConfigConstants.CONFIG_CORE_SECTION, null, + ConfigConstants.CONFIG_KEY_EXCLUDESFILE); } /** @@ -106,4 +110,11 @@ public int getPackIndexVersion() { public boolean isLogAllRefUpdates() { return logAllRefUpdates; } + + /** + * @return path of excludesfile + */ + public String getExcludesFile() { + return excludesfile; + } } diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/WorkingTreeIterator.java b/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/WorkingTreeIterator.java index e2dd0c773..d067e9099 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/WorkingTreeIterator.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/treewalk/WorkingTreeIterator.java @@ -48,6 +48,7 @@ import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileInputStream; +import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.nio.ByteBuffer; @@ -69,8 +70,10 @@ import org.eclipse.jgit.ignore.IgnoreNode; import org.eclipse.jgit.ignore.IgnoreRule; import org.eclipse.jgit.lib.Constants; +import org.eclipse.jgit.lib.CoreConfig; import org.eclipse.jgit.lib.FileMode; import org.eclipse.jgit.lib.Repository; +import org.eclipse.jgit.util.FS; import org.eclipse.jgit.util.IO; import org.eclipse.jgit.util.io.EolCanonicalizingInputStream; @@ -897,7 +900,27 @@ IgnoreNode load() throws IOException { r = new IgnoreNode(); } - File exclude = new File(repository.getDirectory(), "info/exclude"); + FS fs = repository.getFS(); + String path = repository.getConfig().get(CoreConfig.KEY) + .getExcludesFile(); + if (path != null) { + File excludesfile; + if (path.startsWith("~/")) + excludesfile = fs.resolve(fs.userHome(), path.substring(2)); + else + excludesfile = fs.resolve(null, path); + loadRulesFromFile(r, excludesfile); + } + + File exclude = fs + .resolve(repository.getDirectory(), "info/exclude"); + loadRulesFromFile(r, exclude); + + return r.getRules().isEmpty() ? null : r; + } + + private void loadRulesFromFile(IgnoreNode r, File exclude) + throws FileNotFoundException, IOException { if (exclude.exists()) { FileInputStream in = new FileInputStream(exclude); try { @@ -906,8 +929,6 @@ IgnoreNode load() throws IOException { in.close(); } } - - return r.getRules().isEmpty() ? null : r; } }