From 00f6fe72a744af56364b88fe2b59b8e7ab6d6ce9 Mon Sep 17 00:00:00 2001 From: Julian Ruppel Date: Sat, 18 Sep 2021 15:02:03 +0200 Subject: [PATCH] Support commit.template config property Fixes an issue that commit template file could not be found if it has a relative path instead of absolute path. Relative path is probably common if git config --local is used. Bug: 446355 Change-Id: I8ddf2be672647be825fd9c01af82809d31bb8356 --- .../tst/org/eclipse/jgit/lib/ConfigTest.java | 51 ++++++++++++++++--- .../org/eclipse/jgit/lib/CommitConfig.java | 17 +++++-- 2 files changed, 58 insertions(+), 10 deletions(-) diff --git a/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/ConfigTest.java b/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/ConfigTest.java index fe3c1db50..9ee54d5b6 100644 --- a/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/ConfigTest.java +++ b/org.eclipse.jgit.test/tst/org/eclipse/jgit/lib/ConfigTest.java @@ -55,6 +55,7 @@ import org.eclipse.jgit.junit.MockSystemReader; import org.eclipse.jgit.merge.MergeConfig; import org.eclipse.jgit.storage.file.FileBasedConfig; +import org.eclipse.jgit.storage.file.FileRepositoryBuilder; import org.eclipse.jgit.transport.RefSpec; import org.eclipse.jgit.util.FS; import org.eclipse.jgit.util.SystemReader; @@ -1471,14 +1472,17 @@ public void testCommitTemplateEmptyConfig() // no values defined nowhere Config config = new Config(null); assertNull(config.get(CommitConfig.KEY).getCommitTemplatePath()); - assertNull(config.get(CommitConfig.KEY).getCommitTemplateContent()); + assertNull(config.get(CommitConfig.KEY) + .getCommitTemplateContent(null)); } @Test public void testCommitTemplateConfig() throws ConfigInvalidException, IOException { + File workTree = tmp.newFolder("dummy-worktree"); File tempFile = tmp.newFile("testCommitTemplate-"); + Repository repo = FileRepositoryBuilder.create(workTree); String templateContent = "content of the template"; JGitTestUtil.write(tempFile, templateContent); String expectedTemplatePath = tempFile.getPath(); @@ -1492,7 +1496,32 @@ public void testCommitTemplateConfig() .getCommitEncoding(); assertEquals(expectedTemplatePath, templatePath); assertEquals(templateContent, - config.get(CommitConfig.KEY).getCommitTemplateContent()); + config.get(CommitConfig.KEY).getCommitTemplateContent(repo)); + assertNull("no commitEncoding has been set so it must be null", + commitEncoding); + } + + @Test + public void testCommitTemplateConfigRelativePath() + throws ConfigInvalidException, IOException { + + File workTree = tmp.newFolder("dummy-worktree"); + File tempFile = tmp.newFile("testCommitTemplate-"); + String templateContent = "content of the template"; + JGitTestUtil.write(tempFile, templateContent); + String expectedTemplatePath = "../" + tempFile.getName(); + + Config config = parse( + "[commit]\n\ttemplate = " + expectedTemplatePath + "\n"); + + String templatePath = config.get(CommitConfig.KEY) + .getCommitTemplatePath(); + String commitEncoding = config.get(CommitConfig.KEY) + .getCommitEncoding(); + assertEquals(expectedTemplatePath, templatePath); + assertEquals(templateContent, config.get(CommitConfig.KEY) + .getCommitTemplateContent( + new RepositoryBuilder().setWorkTree(workTree).build())); assertNull("no commitEncoding has been set so it must be null", commitEncoding); } @@ -1501,6 +1530,8 @@ public void testCommitTemplateConfig() public void testCommitTemplateEncoding() throws ConfigInvalidException, IOException { Config config = new Config(null); + File workTree = tmp.newFolder("dummy-worktree"); + Repository repo = FileRepositoryBuilder.create(workTree); File tempFile = tmp.newFile("testCommitTemplate-"); String templateContent = "content of the template"; JGitTestUtil.write(tempFile, templateContent); @@ -1508,7 +1539,7 @@ public void testCommitTemplateEncoding() config = parse("[i18n]\n\tcommitEncoding = utf-8\n" + "[commit]\n\ttemplate = " + expectedTemplatePath + "\n"); assertEquals(templateContent, - config.get(CommitConfig.KEY).getCommitTemplateContent()); + config.get(CommitConfig.KEY).getCommitTemplateContent(repo)); String commitEncoding = config.get(CommitConfig.KEY) .getCommitEncoding(); assertEquals("commitEncoding has been set to utf-8 it must be utf-8", @@ -1520,6 +1551,8 @@ public void testCommitTemplatePathInHomeDirecory() throws ConfigInvalidException, IOException { Config config = new Config(null); File tempFile = tmp.newFile("testCommitTemplate-"); + File workTree = tmp.newFolder("dummy-worktree"); + Repository repo = FileRepositoryBuilder.create(workTree); String templateContent = "content of the template"; JGitTestUtil.write(tempFile, templateContent); // proper evaluation of the ~/ directory @@ -1535,35 +1568,39 @@ public void testCommitTemplatePathInHomeDirecory() .getCommitTemplatePath(); assertEquals(expectedTemplatePath, templatePath); assertEquals(templateContent, - config.get(CommitConfig.KEY).getCommitTemplateContent()); + config.get(CommitConfig.KEY).getCommitTemplateContent(repo)); } @Test(expected = ConfigInvalidException.class) public void testCommitTemplateWithInvalidEncoding() throws ConfigInvalidException, IOException { Config config = new Config(null); + File workTree = tmp.newFolder("dummy-worktree"); File tempFile = tmp.newFile("testCommitTemplate-"); + Repository repo = FileRepositoryBuilder.create(workTree); String templateContent = "content of the template"; JGitTestUtil.write(tempFile, templateContent); config = parse("[i18n]\n\tcommitEncoding = invalidEcoding\n" + "[commit]\n\ttemplate = " + tempFile.getPath() + "\n"); - config.get(CommitConfig.KEY).getCommitTemplateContent(); + config.get(CommitConfig.KEY).getCommitTemplateContent(repo); } @Test(expected = FileNotFoundException.class) public void testCommitTemplateWithInvalidPath() throws ConfigInvalidException, IOException { Config config = new Config(null); + File workTree = tmp.newFolder("dummy-worktree"); File tempFile = tmp.newFile("testCommitTemplate-"); + Repository repo = FileRepositoryBuilder.create(workTree); String templateContent = "content of the template"; JGitTestUtil.write(tempFile, templateContent); // commit message encoding - String expectedTemplatePath = "nonExistingTemplate"; + String expectedTemplatePath = "/nonExistingTemplate"; config = parse("[commit]\n\ttemplate = " + expectedTemplatePath + "\n"); String templatePath = config.get(CommitConfig.KEY) .getCommitTemplatePath(); assertEquals(expectedTemplatePath, templatePath); - config.get(CommitConfig.KEY).getCommitTemplateContent(); + config.get(CommitConfig.KEY).getCommitTemplateContent(repo); } private static void assertValueRoundTrip(String value) diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/CommitConfig.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/CommitConfig.java index e4e7cd6e0..5e70556a3 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/CommitConfig.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/CommitConfig.java @@ -18,6 +18,8 @@ import java.nio.charset.StandardCharsets; import java.nio.charset.UnsupportedCharsetException; import java.text.MessageFormat; + +import org.eclipse.jgit.annotations.NonNull; import org.eclipse.jgit.annotations.Nullable; import org.eclipse.jgit.errors.ConfigInvalidException; import org.eclipse.jgit.internal.JGitText; @@ -77,6 +79,9 @@ public String getCommitEncoding() { * {@code commit.template}. If no {@code i18n.commitEncoding} is specified, * UTF-8 fallback is used. * + * @param repository + * to resolve relative path in local git repo config + * * @return content of the commit template or {@code null} if not present. * @throws IOException * if the template file can not be read @@ -86,7 +91,7 @@ public String getCommitEncoding() { * if a {@code commitEncoding} is specified and is invalid */ @Nullable - public String getCommitTemplateContent() + public String getCommitTemplateContent(@NonNull Repository repository) throws FileNotFoundException, IOException, ConfigInvalidException { if (commitTemplatePath == null) { @@ -94,11 +99,17 @@ public String getCommitTemplateContent() } File commitTemplateFile; + FS fileSystem = repository.getFS(); if (commitTemplatePath.startsWith("~/")) { //$NON-NLS-1$ - commitTemplateFile = FS.DETECTED.resolve(FS.DETECTED.userHome(), + commitTemplateFile = fileSystem.resolve(fileSystem.userHome(), commitTemplatePath.substring(2)); } else { - commitTemplateFile = FS.DETECTED.resolve(null, commitTemplatePath); + commitTemplateFile = fileSystem.resolve(null, commitTemplatePath); + } + if (!commitTemplateFile.isAbsolute()) { + commitTemplateFile = fileSystem.resolve( + repository.getWorkTree().getAbsoluteFile(), + commitTemplatePath); } Charset commitMessageEncoding = getEncoding();