Skip to content

Commit cd70b10

Browse files
authored
Merge pull request #704 from git-commit-id/701
#701: add testcases to for an issue with submodules
2 parents 33f1379 + 6097668 commit cd70b10

11 files changed

+198
-147
lines changed

src/main/java/pl/project13/maven/git/GitDirLocator.java

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -135,22 +135,28 @@ private File processGitDirFile(@Nonnull File file) {
135135
}
136136

137137
// All seems ok so return the "gitdir" value read from the file.
138-
File gitDir = resolveWorktree(new File(parts[1]));
138+
String extractFromConfig = parts[1];
139+
File gitDir = resolveWorktree(new File(extractFromConfig));
139140
if (gitDir.isAbsolute()) {
140141
// gitdir value is an absolute path. Return as-is
141142
return gitDir;
142143
} else {
143144
// gitdir value is relative.
144-
return new File(file.getParentFile(), parts[1]);
145+
return new File(file.getParentFile(), extractFromConfig);
145146
}
146147
} catch (IOException e) {
147148
return null;
148149
}
149150
}
150151

151152
/**
152-
* If the file looks like the location of a worktree, return the .git folder of the git repository
153-
* of the worktree. If not, return the file as is.
153+
* Attempts to resolve the actual location of the .git folder for a given
154+
* worktree.
155+
* For example for a worktree like {@code a/.git/worktrees/X} structure would
156+
* return {@code a/.git}.
157+
*
158+
* If the conditions for a git worktree like file structure are met simply return the provided
159+
* argument as is.
154160
*/
155161
static File resolveWorktree(File fileLocation) {
156162
Path parent = fileLocation.toPath().getParent();

src/test/java/pl/project13/maven/git/AvailableGitTestRepo.java

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,42 @@ public enum AvailableGitTestRepo {
5454
*/
5555
WITH_COMMIT_THAT_HAS_TWO_TAGS("src/test/resources/_git_with_commit_that_has_two_tags"),
5656
ON_A_TAG_DIRTY("src/test/resources/_git_on_a_tag_dirty"),
57+
58+
/**
59+
* <pre>
60+
* * 01ed93c - (11 years ago) any commit, just a readme - Konrad Malawski (HEAD -> master)
61+
* * 4ce26eb - (11 years ago) my submodules, yay - Konrad Malawski
62+
* </pre>
63+
* <pre>
64+
* $ git submodule status
65+
* -9fd4b69a5ca09b60884d4f8f49ce16ea071077be module1
66+
* -9fd4b69a5ca09b60884d4f8f49ce16ea071077be module2
67+
* -9fd4b69a5ca09b60884d4f8f49ce16ea071077be module3
68+
* -9fd4b69a5ca09b60884d4f8f49ce16ea071077be module4
69+
*
70+
* $ git config --file .gitmodules --get-regexp '\.url$'
71+
* submodule.module1.url /tmp/module1
72+
* submodule.module2.url /tmp/module1
73+
* submodule.module3.url /tmp/module1
74+
* submodule.module4.url /tmp/module1
75+
* </pre>
76+
*/
5777
WITH_SUBMODULES("src/test/resources/_git_with_submodules"),
78+
79+
/**
80+
* <pre>
81+
* 6455ccd - (3 minutes ago) init (HEAD -> master)
82+
* </pre>
83+
* <pre>
84+
* $ git submodule status
85+
* 945bfe60e8a3eff168e915c7ba5bac37c9d0165b remote-module (heads/empty-branch)
86+
*
87+
* $ git submodule foreach --recursive git remote get-url origin
88+
* Entering 'remote-module'
89+
* git@github.com:git-commit-id/git-test-resources.git
90+
* </pre>
91+
*/
92+
WITH_REMOTE_SUBMODULES("src/test/resources/_git_with_remote_submodules"),
5893
/**
5994
*
6095
*

src/test/java/pl/project13/maven/git/BigDiffTest.java

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -86,23 +86,6 @@ public void bigDiff() throws Exception {
8686
assertGitPropertiesPresentInProject(targetProject.getProperties());
8787
}
8888

89-
private void assertGitPropertiesPresentInProject(final Properties properties) {
90-
assertThat(properties).satisfies(new ContainsKeyCondition("git.build.time"));
91-
assertThat(properties).satisfies(new ContainsKeyCondition("git.build.host"));
92-
assertThat(properties).satisfies(new ContainsKeyCondition("git.branch"));
93-
assertThat(properties).satisfies(new ContainsKeyCondition("git.commit.id.full"));
94-
assertThat(properties).satisfies(new ContainsKeyCondition("git.commit.id.abbrev"));
95-
assertThat(properties).satisfies(new ContainsKeyCondition("git.commit.id.describe"));
96-
assertThat(properties).satisfies(new ContainsKeyCondition("git.build.user.name"));
97-
assertThat(properties).satisfies(new ContainsKeyCondition("git.build.user.email"));
98-
assertThat(properties).satisfies(new ContainsKeyCondition("git.commit.user.name"));
99-
assertThat(properties).satisfies(new ContainsKeyCondition("git.commit.user.email"));
100-
assertThat(properties).satisfies(new ContainsKeyCondition("git.commit.message.full"));
101-
assertThat(properties).satisfies(new ContainsKeyCondition("git.commit.message.short"));
102-
assertThat(properties).satisfies(new ContainsKeyCondition("git.commit.time"));
103-
assertThat(properties).satisfies(new ContainsKeyCondition("git.remote.origin.url"));
104-
}
105-
10689
private GitDescribeConfig createGitDescribeConfig(
10790
final boolean forceLongFormat, final int abbrev) {
10891
final GitDescribeConfig gitDescribeConfig = new GitDescribeConfig();

src/test/java/pl/project13/maven/git/GitCommitIdMojoIntegrationTest.java

Lines changed: 1 addition & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,13 @@
1818

1919
package pl.project13.maven.git;
2020

21-
import static java.util.Arrays.asList;
2221
import static org.assertj.core.api.Assertions.assertThat;
2322
import static org.assertj.core.api.Assertions.entry;
2423
import static org.mockito.Mockito.when;
2524

2625
import java.io.File;
2726
import java.text.SimpleDateFormat;
2827
import java.util.Arrays;
29-
import java.util.Collection;
3028
import java.util.Collections;
3129
import java.util.Date;
3230
import java.util.HashMap;
@@ -49,17 +47,6 @@
4947

5048
@RunWith(JUnitParamsRunner.class)
5149
public class GitCommitIdMojoIntegrationTest extends GitIntegrationTest {
52-
private static final boolean UseJGit = false;
53-
private static final boolean UseNativeGit = true;
54-
55-
public static Collection<?> useNativeGit() {
56-
return asList(UseJGit, UseNativeGit);
57-
}
58-
59-
public static Collection<?> useDirty() {
60-
return asList(true, false);
61-
}
62-
6350
@Test
6451
@Parameters(method = "useNativeGit")
6552
public void shouldIncludeExpectedProperties(boolean useNativeGit) throws Exception {
@@ -78,19 +65,7 @@ public void shouldIncludeExpectedProperties(boolean useNativeGit) throws Excepti
7865

7966
// then
8067
Properties properties = targetProject.getProperties();
81-
82-
assertThat(properties).satisfies(new ContainsKeyCondition("git.branch"));
83-
assertThat(properties).satisfies(new ContainsKeyCondition("git.dirty"));
84-
assertThat(properties).satisfies(new ContainsKeyCondition("git.commit.id.full"));
85-
assertThat(properties).satisfies(new ContainsKeyCondition("git.commit.id.abbrev"));
86-
assertThat(properties).satisfies(new ContainsKeyCondition("git.build.user.name"));
87-
assertThat(properties).satisfies(new ContainsKeyCondition("git.build.user.email"));
88-
assertThat(properties).satisfies(new ContainsKeyCondition("git.commit.user.name"));
89-
assertThat(properties).satisfies(new ContainsKeyCondition("git.commit.user.email"));
90-
assertThat(properties).satisfies(new ContainsKeyCondition("git.commit.message.full"));
91-
assertThat(properties).satisfies(new ContainsKeyCondition("git.commit.message.short"));
92-
assertThat(properties).satisfies(new ContainsKeyCondition("git.commit.time"));
93-
assertThat(properties).satisfies(new ContainsKeyCondition("git.remote.origin.url"));
68+
assertGitPropertiesPresentInProject(properties);
9469
}
9570

9671
@Test
@@ -1731,28 +1706,4 @@ private GitDescribeConfig createGitDescribeConfig(boolean forceLongFormat, int a
17311706
gitDescribeConfig.setDirty("");
17321707
return gitDescribeConfig;
17331708
}
1734-
1735-
private void assertPropertyPresentAndEqual(Properties properties, String key, String expected) {
1736-
assertThat(properties.stringPropertyNames()).contains(key);
1737-
assertThat(properties.getProperty(key)).isEqualTo(expected);
1738-
}
1739-
1740-
private void assertGitPropertiesPresentInProject(Properties properties) {
1741-
assertThat(properties).satisfies(new ContainsKeyCondition("git.build.time"));
1742-
assertThat(properties).satisfies(new ContainsKeyCondition("git.build.host"));
1743-
assertThat(properties).satisfies(new ContainsKeyCondition("git.branch"));
1744-
assertThat(properties).satisfies(new ContainsKeyCondition("git.commit.id.full"));
1745-
assertThat(properties).satisfies(new ContainsKeyCondition("git.commit.id.abbrev"));
1746-
assertThat(properties).satisfies(new ContainsKeyCondition("git.commit.id.describe"));
1747-
assertThat(properties).satisfies(new ContainsKeyCondition("git.build.user.name"));
1748-
assertThat(properties).satisfies(new ContainsKeyCondition("git.build.user.email"));
1749-
assertThat(properties).satisfies(new ContainsKeyCondition("git.commit.user.name"));
1750-
assertThat(properties).satisfies(new ContainsKeyCondition("git.commit.user.email"));
1751-
assertThat(properties).satisfies(new ContainsKeyCondition("git.commit.message.full"));
1752-
assertThat(properties).satisfies(new ContainsKeyCondition("git.commit.message.short"));
1753-
assertThat(properties).satisfies(new ContainsKeyCondition("git.commit.time"));
1754-
assertThat(properties).satisfies(new ContainsKeyCondition("git.remote.origin.url"));
1755-
assertThat(properties).satisfies(new ContainsKeyCondition("git.closest.tag.name"));
1756-
assertThat(properties).satisfies(new ContainsKeyCondition("git.closest.tag.commit.count"));
1757-
}
17581709
}

src/test/java/pl/project13/maven/git/GitDirLocatorTest.java

Lines changed: 62 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,9 @@
2525
import java.util.Collections;
2626
import java.util.List;
2727
import org.apache.maven.project.MavenProject;
28+
import org.junit.Rule;
2829
import org.junit.Test;
30+
import org.junit.rules.TemporaryFolder;
2931
import org.junit.runner.RunWith;
3032
import org.mockito.Mock;
3133
import org.mockito.junit.MockitoJUnitRunner;
@@ -37,18 +39,20 @@ public class GitDirLocatorTest {
3739

3840
List<MavenProject> reactorProjects = Collections.emptyList();
3941

42+
@Rule
43+
public TemporaryFolder folder = new TemporaryFolder();
44+
4045
@Test
4146
public void shouldUseTheManuallySpecifiedDirectory() throws Exception {
4247
// given
43-
File dotGitDir = Files.createTempDirectory("temp").toFile();
48+
File dotGitDir = folder.newFolder("temp");
4449
try {
45-
4650
// when
4751
GitDirLocator locator = new GitDirLocator(project, reactorProjects);
4852
File foundDirectory = locator.lookupGitDirectory(dotGitDir);
4953

5054
// then
51-
assert foundDirectory != null;
55+
assertThat(foundDirectory).isNotNull();
5256
assertThat(foundDirectory.getAbsolutePath()).isEqualTo(dotGitDir.getAbsolutePath());
5357
} finally {
5458
if (!dotGitDir.delete()) {
@@ -57,12 +61,66 @@ public void shouldUseTheManuallySpecifiedDirectory() throws Exception {
5761
}
5862
}
5963

64+
@Test
65+
public void shouldResolveRelativeSubmodule() throws Exception {
66+
// given
67+
folder.newFolder("main-project");
68+
folder.newFolder("main-project", ".git", "modules", "sub-module");
69+
folder.newFolder("main-project", "sub-module");
70+
71+
// and a .git dir in submodule that points to the main's project .git/modules/submodule
72+
File dotGitDir = folder.getRoot().toPath()
73+
.resolve("main-project")
74+
.resolve("sub-module")
75+
.resolve(".git")
76+
.toFile();
77+
Files.write(
78+
dotGitDir.toPath(),
79+
"gitdir: ../.git/modules/sub-module".getBytes()
80+
);
81+
82+
try {
83+
// when
84+
GitDirLocator locator = new GitDirLocator(project, reactorProjects);
85+
File foundDirectory = locator.lookupGitDirectory(dotGitDir);
86+
87+
// then
88+
assertThat(foundDirectory).isNotNull();
89+
assertThat(
90+
foundDirectory.getCanonicalFile()
91+
).isEqualTo(
92+
folder.getRoot().toPath()
93+
.resolve("main-project")
94+
.resolve(".git")
95+
.resolve("modules")
96+
.resolve("sub-module")
97+
.toFile()
98+
);
99+
} finally {
100+
if (!dotGitDir.delete()) {
101+
dotGitDir.deleteOnExit();
102+
}
103+
}
104+
}
105+
60106
@Test
61107
public void testWorktreeResolution() {
62-
String[] noopCases = {"", "a", "a/b", ".git/worktrees", ".git/worktrees/", "a.git/worktrees/b"};
108+
// tests to ensure we do not try to modify things that should not be modified
109+
String[] noopCases = {
110+
"",
111+
"a",
112+
"a/b",
113+
".git/worktrees",
114+
".git/worktrees/",
115+
"a.git/worktrees/b",
116+
".git/modules",
117+
".git/modules/",
118+
"a.git/modules/b",
119+
};
63120
for (String path : noopCases) {
64121
assertThat(GitDirLocator.resolveWorktree(new File(path))).isEqualTo(new File(path));
65122
}
123+
// tests that worktree resolution works
66124
assertThat(GitDirLocator.resolveWorktree(new File("a/.git/worktrees/b")))
67125
.isEqualTo(new File("a/.git"));
68126
assertThat(GitDirLocator.resolveWorktree(new File("/a/.git/worktrees/b")))

src/test/java/pl/project13/maven/git/GitIntegrationTest.java

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,16 @@
1818

1919
package pl.project13.maven.git;
2020

21+
import static java.util.Arrays.asList;
22+
import static org.assertj.core.api.Assertions.assertThat;
2123
import static org.mockito.Mockito.mock;
2224
import static org.mockito.Mockito.spy;
2325
import static org.mockito.Mockito.when;
2426

2527
import java.io.File;
2628
import java.io.IOException;
2729
import java.util.ArrayList;
30+
import java.util.Collection;
2831
import java.util.List;
2932
import java.util.Optional;
3033
import java.util.Properties;
@@ -47,6 +50,13 @@ public abstract class GitIntegrationTest {
4750
private static final String SANDBOX_DIR = "target" + File.separator + "sandbox" + File.separator;
4851
protected static final String evaluateOnCommit = "HEAD";
4952

53+
private static final boolean UseJGit = false;
54+
private static final boolean UseNativeGit = true;
55+
56+
public static Collection<?> useNativeGit() {
57+
return asList(UseJGit, UseNativeGit);
58+
}
59+
5060
/** Sandbox directory with unique name for current test. */
5161
private String currSandbox;
5262

@@ -156,4 +166,47 @@ private static List<MavenProject> getReactorProjects(@Nonnull MavenProject proje
156166
}
157167
return reactorProjects;
158168
}
169+
170+
public static void assertPropertyPresentAndEqual(
171+
Properties properties, String key, String expected) {
172+
assertThat(properties.stringPropertyNames()).contains(key);
173+
assertThat(properties.getProperty(key)).isEqualTo(expected);
174+
}
175+
176+
/**
177+
* Ensures that the provided properties contain the properties the plugin can generate.
178+
* See also {@link pl.project13.core.GitCommitPropertyConstant}
179+
*
180+
* @param properties The properties that should be verified
181+
*/
182+
public static void assertGitPropertiesPresentInProject(Properties properties) {
183+
assertThat(properties).satisfies(new ContainsKeyCondition("git.branch"));
184+
assertThat(properties).satisfies(new ContainsKeyCondition("git.local.branch.ahead"));
185+
assertThat(properties).satisfies(new ContainsKeyCondition("git.local.branch.behind"));
186+
assertThat(properties).satisfies(new ContainsKeyCondition("git.dirty"));
187+
assertThat(properties).satisfies(new ContainsKeyCondition("git.commit.id.full"));
188+
assertThat(properties).satisfies(new ContainsKeyCondition("git.commit.id.abbrev"));
189+
assertThat(properties).satisfies(new ContainsKeyCondition("git.commit.id.describe"));
190+
assertThat(properties).satisfies(new ContainsKeyCondition("git.commit.id.describe-short"));
191+
assertThat(properties).satisfies(new ContainsKeyCondition("git.build.user.name"));
192+
assertThat(properties).satisfies(new ContainsKeyCondition("git.build.user.email"));
193+
assertThat(properties).satisfies(new ContainsKeyCondition("git.build.time"));
194+
assertThat(properties).satisfies(new ContainsKeyCondition("git.build.version"));
195+
assertThat(properties).satisfies(new ContainsKeyCondition("git.build.host"));
196+
// assertThat(properties).satisfies(new ContainsKeyCondition("git.build.number"));
197+
// assertThat(properties).satisfies(new ContainsKeyCondition("git.build.number.unique"));
198+
assertThat(properties).satisfies(new ContainsKeyCondition("git.commit.user.name"));
199+
assertThat(properties).satisfies(new ContainsKeyCondition("git.commit.user.email"));
200+
assertThat(properties).satisfies(new ContainsKeyCondition("git.commit.message.full"));
201+
assertThat(properties).satisfies(new ContainsKeyCondition("git.commit.message.short"));
202+
assertThat(properties).satisfies(new ContainsKeyCondition("git.commit.time"));
203+
assertThat(properties).satisfies(new ContainsKeyCondition("git.commit.author.time"));
204+
assertThat(properties).satisfies(new ContainsKeyCondition("git.commit.committer.time"));
205+
assertThat(properties).satisfies(new ContainsKeyCondition("git.remote.origin.url"));
206+
assertThat(properties).satisfies(new ContainsKeyCondition("git.tags"));
207+
assertThat(properties).satisfies(new ContainsKeyCondition("git.closest.tag.name"));
208+
// assertThat(properties).satisfies(new ContainsKeyCondition("git.tag"));
209+
assertThat(properties).satisfies(new ContainsKeyCondition("git.closest.tag.commit.count"));
210+
assertThat(properties).satisfies(new ContainsKeyCondition("git.total.commit.count"));
211+
}
159212
}

src/test/java/pl/project13/maven/git/GitPropertiesFileTest.java

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -108,25 +108,4 @@ public void shouldConformPropertiesFileWhenSpecialCharactersInValueString(boolea
108108
}
109109
}
110110
}
111-
112-
private void assertGitPropertiesPresentInProject(Properties properties) {
113-
assertThat(properties).satisfies(new ContainsKeyCondition("git.build.time"));
114-
assertThat(properties).satisfies(new ContainsKeyCondition("git.build.host"));
115-
assertThat(properties).satisfies(new ContainsKeyCondition("git.branch"));
116-
assertThat(properties).satisfies(new ContainsKeyCondition("git.commit.id.full"));
117-
assertThat(properties).satisfies(new ContainsKeyCondition("git.commit.id.abbrev"));
118-
assertThat(properties).satisfies(new ContainsKeyCondition("git.commit.id.describe"));
119-
assertThat(properties).satisfies(new ContainsKeyCondition("git.build.user.name"));
120-
assertThat(properties).satisfies(new ContainsKeyCondition("git.build.user.email"));
121-
assertThat(properties).satisfies(new ContainsKeyCondition("git.commit.user.name"));
122-
assertThat(properties).satisfies(new ContainsKeyCondition("git.commit.user.email"));
123-
assertThat(properties).satisfies(new ContainsKeyCondition("git.commit.message.full"));
124-
assertThat(properties).satisfies(new ContainsKeyCondition("git.commit.message.short"));
125-
assertThat(properties).satisfies(new ContainsKeyCondition("git.commit.time"));
126-
assertThat(properties).satisfies(new ContainsKeyCondition("git.commit.committer.time"));
127-
assertThat(properties).satisfies(new ContainsKeyCondition("git.commit.author.time"));
128-
assertThat(properties).satisfies(new ContainsKeyCondition("git.remote.origin.url"));
129-
assertThat(properties).satisfies(new ContainsKeyCondition("git.closest.tag.name"));
130-
assertThat(properties).satisfies(new ContainsKeyCondition("git.closest.tag.commit.count"));
131-
}
132111
}

0 commit comments

Comments
 (0)