import java.io.IOException;
import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.ConfigTest;
import org.eclipse.jgit.util.FS;
import org.eclipse.jgit.util.FileUtils;
import org.eclipse.jgit.util.IO;
assertArrayEquals(bos2.toByteArray(), IO.readFully(file));
}
+ @Test
+ public void testIncludeAbsolute()
+ throws IOException, ConfigInvalidException {
+ final File includedFile = createFile(CONTENT1.getBytes());
+ final ByteArrayOutputStream bos = new ByteArrayOutputStream();
+ bos.write("[include]\npath=".getBytes());
+ bos.write(ConfigTest.pathToString(includedFile).getBytes());
+
+ final File file = createFile(bos.toByteArray());
+ final FileBasedConfig config = new FileBasedConfig(file, FS.DETECTED);
+ config.load();
+ assertEquals(ALICE, config.getString(USER, null, NAME));
+ }
+
+ @Test
+ public void testIncludeRelativeDot()
+ throws IOException, ConfigInvalidException {
+ final File includedFile = createFile(CONTENT1.getBytes(), "dir1");
+ final ByteArrayOutputStream bos = new ByteArrayOutputStream();
+ bos.write("[include]\npath=".getBytes());
+ bos.write(("./" + includedFile.getName()).getBytes());
+
+ final File file = createFile(bos.toByteArray(), "dir1");
+ final FileBasedConfig config = new FileBasedConfig(file, FS.DETECTED);
+ config.load();
+ assertEquals(ALICE, config.getString(USER, null, NAME));
+ }
+
+ @Test
+ public void testIncludeRelativeDotDot()
+ throws IOException, ConfigInvalidException {
+ final File includedFile = createFile(CONTENT1.getBytes(), "dir1");
+ final ByteArrayOutputStream bos = new ByteArrayOutputStream();
+ bos.write("[include]\npath=".getBytes());
+ bos.write(("../" + includedFile.getParentFile().getName() + "/"
+ + includedFile.getName()).getBytes());
+
+ final File file = createFile(bos.toByteArray(), "dir2");
+ final FileBasedConfig config = new FileBasedConfig(file, FS.DETECTED);
+ config.load();
+ assertEquals(ALICE, config.getString(USER, null, NAME));
+ }
+
+ @Test
+ public void testIncludeRelativeDotDotNotFound()
+ throws IOException, ConfigInvalidException {
+ final File includedFile = createFile(CONTENT1.getBytes());
+ final ByteArrayOutputStream bos = new ByteArrayOutputStream();
+ bos.write("[include]\npath=".getBytes());
+ bos.write(("../" + includedFile.getName()).getBytes());
+
+ final File file = createFile(bos.toByteArray());
+ final FileBasedConfig config = new FileBasedConfig(file, FS.DETECTED);
+ config.load();
+ assertEquals(null, config.getString(USER, null, NAME));
+ }
+
+ @Test
+ public void testIncludeWithTilde()
+ throws IOException, ConfigInvalidException {
+ final File includedFile = createFile(CONTENT1.getBytes(), "home");
+ final ByteArrayOutputStream bos = new ByteArrayOutputStream();
+ bos.write("[include]\npath=".getBytes());
+ bos.write(("~/" + includedFile.getName()).getBytes());
+
+ final File file = createFile(bos.toByteArray(), "repo");
+ final FS fs = FS.DETECTED.newInstance();
+ fs.setUserHome(includedFile.getParentFile());
+
+ final FileBasedConfig config = new FileBasedConfig(file, fs);
+ config.load();
+ assertEquals(ALICE, config.getString(USER, null, NAME));
+ }
+
private File createFile(byte[] content) throws IOException {
- trash.mkdirs();
- File f = File.createTempFile(getClass().getName(), null, trash);
+ return createFile(content, null);
+ }
+
+ private File createFile(byte[] content, String subdir) throws IOException {
+ File dir = subdir != null ? new File(trash, subdir) : trash;
+ dir.mkdirs();
+
+ File f = File.createTempFile(getClass().getName(), null, dir);
FileOutputStream os = new FileOutputStream(f, true);
try {
os.write(content);
import java.io.IOException;
import java.text.MessageFormat;
+import org.eclipse.jgit.annotations.Nullable;
import org.eclipse.jgit.errors.ConfigInvalidException;
import org.eclipse.jgit.errors.LockFailedException;
import org.eclipse.jgit.internal.JGitText;
public class FileBasedConfig extends StoredConfig {
private final File configFile;
+ private final FS fs;
+
private boolean utf8Bom;
private volatile FileSnapshot snapshot;
public FileBasedConfig(Config base, File cfgLocation, FS fs) {
super(base);
configFile = cfgLocation;
+ this.fs = fs;
this.snapshot = FileSnapshot.DIRTY;
this.hash = ObjectId.zeroId();
}
public boolean isOutdated() {
return snapshot.isModified(getFile());
}
+
+ /**
+ * @since 4.10
+ */
+ @Override
+ @Nullable
+ protected byte[] readIncludedConfig(String relPath)
+ throws ConfigInvalidException {
+ final File file;
+ if (relPath.startsWith("~/")) { //$NON-NLS-1$
+ file = fs.resolve(fs.userHome(), relPath.substring(2));
+ } else {
+ file = fs.resolve(configFile.getParentFile(), relPath);
+ }
+
+ if (!file.exists()) {
+ return null;
+ }
+
+ try {
+ return IO.readFully(file);
+ } catch (IOException ioe) {
+ throw new ConfigInvalidException(MessageFormat
+ .format(JGitText.get().cannotReadFile, relPath), ioe);
+ }
+ }
}