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
This commit is contained in:
Julian Ruppel 2021-09-18 15:02:03 +02:00 committed by Thomas Wolf
parent 2e2a3642c3
commit 00f6fe72a7
2 changed files with 58 additions and 10 deletions

View File

@ -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)

View File

@ -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();