diff --git a/src/main/java/pl/project13/maven/git/GitCommitIdMojo.java b/src/main/java/pl/project13/maven/git/GitCommitIdMojo.java index b7787690..95dae012 100644 --- a/src/main/java/pl/project13/maven/git/GitCommitIdMojo.java +++ b/src/main/java/pl/project13/maven/git/GitCommitIdMojo.java @@ -59,6 +59,7 @@ public class GitCommitIdMojo extends AbstractMojo { public static final String BRANCH = "branch"; public static final String COMMIT_ID = "commit.id"; public static final String COMMIT_ID_ABBREV = "commit.id.abbrev"; + public static final String FILES_DIRTY = "commit.files.dirty"; public static final String COMMIT_DESCRIBE = "commit.id.describe"; public static final String COMMIT_SHORT_DESCRIBE = "commit.id.describe-short"; public static final String BUILD_AUTHOR_NAME = "build.user.name"; diff --git a/src/main/java/pl/project13/maven/git/GitDataProvider.java b/src/main/java/pl/project13/maven/git/GitDataProvider.java index d1960bee..3ea21dba 100644 --- a/src/main/java/pl/project13/maven/git/GitDataProvider.java +++ b/src/main/java/pl/project13/maven/git/GitDataProvider.java @@ -37,6 +37,7 @@ public abstract class GitDataProvider { protected abstract String getGitDescribe() throws MojoExecutionException; protected abstract String getCommitId(); protected abstract String getAbbrevCommitId() throws MojoExecutionException; + protected abstract boolean isDirty() throws MojoExecutionException; protected abstract String getCommitAuthorName(); protected abstract String getCommitAuthorEmail(); protected abstract String getCommitMessageFull(); @@ -65,6 +66,8 @@ public void loadGitData(@NotNull Properties properties) throws IOException, Mojo put(properties, GitCommitIdMojo.COMMIT_ID, getCommitId()); // git.commit.id.abbrev put(properties, GitCommitIdMojo.COMMIT_ID_ABBREV, getAbbrevCommitId()); + // git.files.dirty + put(properties, GitCommitIdMojo.FILES_DIRTY, Boolean.toString(isDirty())); // git.commit.author.name put(properties, GitCommitIdMojo.COMMIT_AUTHOR_NAME, getCommitAuthorName()); // git.commit.author.email diff --git a/src/main/java/pl/project13/maven/git/JGitProvider.java b/src/main/java/pl/project13/maven/git/JGitProvider.java index 5564632b..9b2f785e 100644 --- a/src/main/java/pl/project13/maven/git/JGitProvider.java +++ b/src/main/java/pl/project13/maven/git/JGitProvider.java @@ -135,6 +135,16 @@ protected String getAbbrevCommitId() throws MojoExecutionException { return abbrevCommitId; } + @Override + protected boolean isDirty() throws MojoExecutionException { + Git gitObject = Git.wrap(git); + try { + return !gitObject.status().call().isClean(); + } catch (GitAPIException e) { + throw new MojoExecutionException("Failed to get git status: " + e.getMessage(), e); + } + } + @Override protected String getCommitAuthorName() { String commitAuthor = headCommit.getAuthorIdent().getName(); diff --git a/src/main/java/pl/project13/maven/git/NativeGitProvider.java b/src/main/java/pl/project13/maven/git/NativeGitProvider.java index 089f494f..a3b9074a 100644 --- a/src/main/java/pl/project13/maven/git/NativeGitProvider.java +++ b/src/main/java/pl/project13/maven/git/NativeGitProvider.java @@ -175,6 +175,12 @@ protected String getAbbrevCommitId() throws MojoExecutionException { return abbrevCommitId; } + @Override + protected boolean isDirty() throws MojoExecutionException { + String output = tryToRunGitCommand(canonical, "status --porcelain"); + return !output.trim().isEmpty(); + } + @Override protected String getCommitAuthorName() { return tryToRunGitCommand(canonical, "log -1 --pretty=format:\"%cn\""); diff --git a/src/test/java/pl/project13/maven/git/AvailableGitTestRepo.java b/src/test/java/pl/project13/maven/git/AvailableGitTestRepo.java index ff377d10..7c07b05b 100644 --- a/src/test/java/pl/project13/maven/git/AvailableGitTestRepo.java +++ b/src/test/java/pl/project13/maven/git/AvailableGitTestRepo.java @@ -25,6 +25,8 @@ public enum AvailableGitTestRepo { WITH_ONE_COMMIT("src/test/resources/_git_one_commit"), WITH_ONE_COMMIT_DIRTY("src/test/resources/_git_one_commit_dirty"), GIT_COMMIT_ID("src/test/resources/_git_of_git_commit_id"), + GIT_WITH_NO_CHANGES("src/test/resources/_git_with_no_changes/_git_dir"), + GIT_WITH_CHANGES("src/test/resources/_git_with_changes/_git_dir"), ON_A_TAG("src/test/resources/_git_on_a_tag"), /** *
diff --git a/src/test/java/pl/project13/maven/git/GitCommitIdMojoDirtyFilesTest.java b/src/test/java/pl/project13/maven/git/GitCommitIdMojoDirtyFilesTest.java
new file mode 100644
index 00000000..2913ba51
--- /dev/null
+++ b/src/test/java/pl/project13/maven/git/GitCommitIdMojoDirtyFilesTest.java
@@ -0,0 +1,103 @@
+/*
+ * This file is part of git-commit-id-plugin by Konrad Malawski 
+ *
+ * git-commit-id-plugin is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * git-commit-id-plugin is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with git-commit-id-plugin.  If not, see .
+ */
+
+package pl.project13.maven.git;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Maps;
+import org.apache.maven.project.MavenProject;
+import org.eclipse.jgit.lib.Repository;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Map;
+import java.util.Properties;
+
+import static org.fest.assertions.Assertions.assertThat;
+import static org.mockito.Mockito.*;
+
+/**
+ * @author Adam Batkin
+ */
+public class GitCommitIdMojoDirtyFilesTest {
+
+  @Test
+  public void testDetectCleanWorkingDirectory() throws Exception {
+    File dotGitDirectory = AvailableGitTestRepo.GIT_WITH_NO_CHANGES.getDir();
+    GitDescribeConfig gitDescribeConfig = new GitDescribeConfig();
+    gitDescribeConfig.setSkip(false);
+
+    String prefix = "git";
+    int abbrevLength = 7;
+    String dateFormat = "dd.MM.yyyy '@' HH:mm:ss z";
+    boolean verbose = true;
+
+    GitCommitIdMojo mojo = new GitCommitIdMojo();
+    mojo.setDotGitDirectory(dotGitDirectory);
+    mojo.setPrefix(prefix);
+    mojo.setAbbrevLength(abbrevLength);
+    mojo.setDateFormat(dateFormat);
+    mojo.setVerbose(verbose);
+    mojo.useNativeGit(false);
+    mojo.setGitDescribe(gitDescribeConfig);
+
+
+    mojo.runningTests = true;
+    mojo.project = mock(MavenProject.class, RETURNS_MOCKS);
+    when(mojo.project.getPackaging()).thenReturn("jar");
+
+    mojo.execute();
+
+    Properties properties = mojo.getProperties();
+
+    assertThat(properties.get("git.commit.files.dirty")).isEqualTo("false");
+  }
+
+  @Test
+  public void testDetectDirtyWorkingDirectory() throws Exception {
+    File dotGitDirectory = AvailableGitTestRepo.GIT_WITH_CHANGES.getDir();
+    GitDescribeConfig gitDescribeConfig = new GitDescribeConfig();
+    gitDescribeConfig.setSkip(false);
+
+    String prefix = "git";
+    int abbrevLength = 7;
+    String dateFormat = "dd.MM.yyyy '@' HH:mm:ss z";
+    boolean verbose = true;
+
+    GitCommitIdMojo mojo = new GitCommitIdMojo();
+    mojo.setDotGitDirectory(dotGitDirectory);
+    mojo.setPrefix(prefix);
+    mojo.setAbbrevLength(abbrevLength);
+    mojo.setDateFormat(dateFormat);
+    mojo.setVerbose(verbose);
+    mojo.useNativeGit(false);
+    mojo.setGitDescribe(gitDescribeConfig);
+
+
+    mojo.runningTests = true;
+    mojo.project = mock(MavenProject.class, RETURNS_MOCKS);
+    when(mojo.project.getPackaging()).thenReturn("jar");
+
+    mojo.execute();
+
+    Properties properties = mojo.getProperties();
+
+    assertThat(properties.get("git.commit.files.dirty")).isEqualTo("true");
+  }
+}
diff --git a/src/test/java/pl/project13/maven/git/GitCommitIdMojoTest.java b/src/test/java/pl/project13/maven/git/GitCommitIdMojoTest.java
index 60c4db37..a267e23d 100644
--- a/src/test/java/pl/project13/maven/git/GitCommitIdMojoTest.java
+++ b/src/test/java/pl/project13/maven/git/GitCommitIdMojoTest.java
@@ -81,6 +81,7 @@ public void shouldIncludeExpectedProperties() throws Exception {
     assertThat(properties).satisfies(new ContainsKeyCondition("git.branch"));
     assertThat(properties).satisfies(new ContainsKeyCondition("git.commit.id"));
     assertThat(properties).satisfies(new ContainsKeyCondition("git.commit.id.abbrev"));
+    assertThat(properties).satisfies(new ContainsKeyCondition("git.commit.files.dirty"));
     assertThat(properties).satisfies(new ContainsKeyCondition("git.build.user.name"));
     assertThat(properties).satisfies(new ContainsKeyCondition("git.build.user.email"));
     assertThat(properties).satisfies(new ContainsKeyCondition("git.commit.user.name"));
diff --git a/src/test/resources/_git_with_changes/_git_dir/COMMIT_EDITMSG b/src/test/resources/_git_with_changes/_git_dir/COMMIT_EDITMSG
new file mode 100644
index 00000000..cbf2d906
--- /dev/null
+++ b/src/test/resources/_git_with_changes/_git_dir/COMMIT_EDITMSG
@@ -0,0 +1 @@
+add file.txt
diff --git a/src/test/resources/_git_with_changes/_git_dir/HEAD b/src/test/resources/_git_with_changes/_git_dir/HEAD
new file mode 100644
index 00000000..cb089cd8
--- /dev/null
+++ b/src/test/resources/_git_with_changes/_git_dir/HEAD
@@ -0,0 +1 @@
+ref: refs/heads/master
diff --git a/src/test/resources/_git_with_changes/_git_dir/ORIG_HEAD b/src/test/resources/_git_with_changes/_git_dir/ORIG_HEAD
new file mode 100644
index 00000000..9cd33698
--- /dev/null
+++ b/src/test/resources/_git_with_changes/_git_dir/ORIG_HEAD
@@ -0,0 +1 @@
+79c5c38ca494525c1d2d3127af13476f9759957d
diff --git a/src/test/resources/_git_with_changes/_git_dir/config b/src/test/resources/_git_with_changes/_git_dir/config
new file mode 100755
index 00000000..515f4836
--- /dev/null
+++ b/src/test/resources/_git_with_changes/_git_dir/config
@@ -0,0 +1,5 @@
+[core]
+	repositoryformatversion = 0
+	filemode = true
+	bare = false
+	logallrefupdates = true
diff --git a/src/test/resources/_git_with_changes/_git_dir/description b/src/test/resources/_git_with_changes/_git_dir/description
new file mode 100644
index 00000000..498b267a
--- /dev/null
+++ b/src/test/resources/_git_with_changes/_git_dir/description
@@ -0,0 +1 @@
+Unnamed repository; edit this file 'description' to name the repository.
diff --git a/src/test/resources/_git_with_changes/_git_dir/index b/src/test/resources/_git_with_changes/_git_dir/index
new file mode 100644
index 00000000..c96b5f31
Binary files /dev/null and b/src/test/resources/_git_with_changes/_git_dir/index differ
diff --git a/src/test/resources/_git_with_changes/_git_dir/info/exclude b/src/test/resources/_git_with_changes/_git_dir/info/exclude
new file mode 100644
index 00000000..84c07bce
--- /dev/null
+++ b/src/test/resources/_git_with_changes/_git_dir/info/exclude
@@ -0,0 +1,7 @@
+# git ls-files --others --exclude-from=.git/info/exclude
+# Lines that start with '#' are comments.
+# For a project mostly in C, the following would be a good set of
+# exclude patterns (uncomment them if you want to use them):
+# *.[oa]
+# *~
+/_git_dir/
diff --git a/src/test/resources/_git_with_changes/_git_dir/info/refs b/src/test/resources/_git_with_changes/_git_dir/info/refs
new file mode 100644
index 00000000..5a58f017
--- /dev/null
+++ b/src/test/resources/_git_with_changes/_git_dir/info/refs
@@ -0,0 +1 @@
+79c5c38ca494525c1d2d3127af13476f9759957d	refs/heads/master
diff --git a/src/test/resources/_git_with_changes/_git_dir/logs/HEAD b/src/test/resources/_git_with_changes/_git_dir/logs/HEAD
new file mode 100644
index 00000000..9cc14adf
--- /dev/null
+++ b/src/test/resources/_git_with_changes/_git_dir/logs/HEAD
@@ -0,0 +1 @@
+0000000000000000000000000000000000000000 79c5c38ca494525c1d2d3127af13476f9759957d Adam Batkin  1417588098 -0500	commit (initial): add file.txt
diff --git a/src/test/resources/_git_with_changes/_git_dir/logs/refs/heads/master b/src/test/resources/_git_with_changes/_git_dir/logs/refs/heads/master
new file mode 100644
index 00000000..9cc14adf
--- /dev/null
+++ b/src/test/resources/_git_with_changes/_git_dir/logs/refs/heads/master
@@ -0,0 +1 @@
+0000000000000000000000000000000000000000 79c5c38ca494525c1d2d3127af13476f9759957d Adam Batkin  1417588098 -0500	commit (initial): add file.txt
diff --git a/src/test/resources/_git_with_changes/_git_dir/objects/info/packs b/src/test/resources/_git_with_changes/_git_dir/objects/info/packs
new file mode 100644
index 00000000..d3f9cb8b
--- /dev/null
+++ b/src/test/resources/_git_with_changes/_git_dir/objects/info/packs
@@ -0,0 +1,2 @@
+P pack-ca141c03c134fe0537a3990df45432bf0bf0396e.pack
+
diff --git a/src/test/resources/_git_with_changes/_git_dir/objects/pack/pack-ca141c03c134fe0537a3990df45432bf0bf0396e.idx b/src/test/resources/_git_with_changes/_git_dir/objects/pack/pack-ca141c03c134fe0537a3990df45432bf0bf0396e.idx
new file mode 100644
index 00000000..660540a7
Binary files /dev/null and b/src/test/resources/_git_with_changes/_git_dir/objects/pack/pack-ca141c03c134fe0537a3990df45432bf0bf0396e.idx differ
diff --git a/src/test/resources/_git_with_changes/_git_dir/objects/pack/pack-ca141c03c134fe0537a3990df45432bf0bf0396e.pack b/src/test/resources/_git_with_changes/_git_dir/objects/pack/pack-ca141c03c134fe0537a3990df45432bf0bf0396e.pack
new file mode 100644
index 00000000..46a4fe5e
Binary files /dev/null and b/src/test/resources/_git_with_changes/_git_dir/objects/pack/pack-ca141c03c134fe0537a3990df45432bf0bf0396e.pack differ
diff --git a/src/test/resources/_git_with_changes/_git_dir/packed-refs b/src/test/resources/_git_with_changes/_git_dir/packed-refs
new file mode 100644
index 00000000..20bd732f
--- /dev/null
+++ b/src/test/resources/_git_with_changes/_git_dir/packed-refs
@@ -0,0 +1,2 @@
+# pack-refs with: peeled fully-peeled 
+79c5c38ca494525c1d2d3127af13476f9759957d refs/heads/master
diff --git a/src/test/resources/_git_with_changes/another.txt b/src/test/resources/_git_with_changes/another.txt
new file mode 100644
index 00000000..e69de29b
diff --git a/src/test/resources/_git_with_changes/file.txt b/src/test/resources/_git_with_changes/file.txt
new file mode 100644
index 00000000..e69de29b
diff --git a/src/test/resources/_git_with_no_changes/_git_dir/COMMIT_EDITMSG b/src/test/resources/_git_with_no_changes/_git_dir/COMMIT_EDITMSG
new file mode 100644
index 00000000..7c04b16b
--- /dev/null
+++ b/src/test/resources/_git_with_no_changes/_git_dir/COMMIT_EDITMSG
@@ -0,0 +1,17 @@
+add file.txt
+
+# Please enter the commit message for your changes. Lines starting
+# with '#' will be ignored, and an empty message aborts the commit.
+#
+# Date:      Wed Dec 3 00:35:29 2014 -0500
+#
+# On branch master
+#
+# Initial commit
+#
+# Changes to be committed:
+#	new file:   file.txt
+#
+# Untracked files:
+#	_git_dir/
+#
diff --git a/src/test/resources/_git_with_no_changes/_git_dir/HEAD b/src/test/resources/_git_with_no_changes/_git_dir/HEAD
new file mode 100644
index 00000000..cb089cd8
--- /dev/null
+++ b/src/test/resources/_git_with_no_changes/_git_dir/HEAD
@@ -0,0 +1 @@
+ref: refs/heads/master
diff --git a/src/test/resources/_git_with_no_changes/_git_dir/config b/src/test/resources/_git_with_no_changes/_git_dir/config
new file mode 100755
index 00000000..515f4836
--- /dev/null
+++ b/src/test/resources/_git_with_no_changes/_git_dir/config
@@ -0,0 +1,5 @@
+[core]
+	repositoryformatversion = 0
+	filemode = true
+	bare = false
+	logallrefupdates = true
diff --git a/src/test/resources/_git_with_no_changes/_git_dir/description b/src/test/resources/_git_with_no_changes/_git_dir/description
new file mode 100644
index 00000000..498b267a
--- /dev/null
+++ b/src/test/resources/_git_with_no_changes/_git_dir/description
@@ -0,0 +1 @@
+Unnamed repository; edit this file 'description' to name the repository.
diff --git a/src/test/resources/_git_with_no_changes/_git_dir/index b/src/test/resources/_git_with_no_changes/_git_dir/index
new file mode 100644
index 00000000..aa4d9cfb
Binary files /dev/null and b/src/test/resources/_git_with_no_changes/_git_dir/index differ
diff --git a/src/test/resources/_git_with_no_changes/_git_dir/info/exclude b/src/test/resources/_git_with_no_changes/_git_dir/info/exclude
new file mode 100644
index 00000000..84c07bce
--- /dev/null
+++ b/src/test/resources/_git_with_no_changes/_git_dir/info/exclude
@@ -0,0 +1,7 @@
+# git ls-files --others --exclude-from=.git/info/exclude
+# Lines that start with '#' are comments.
+# For a project mostly in C, the following would be a good set of
+# exclude patterns (uncomment them if you want to use them):
+# *.[oa]
+# *~
+/_git_dir/
diff --git a/src/test/resources/_git_with_no_changes/_git_dir/info/refs b/src/test/resources/_git_with_no_changes/_git_dir/info/refs
new file mode 100644
index 00000000..56a93133
--- /dev/null
+++ b/src/test/resources/_git_with_no_changes/_git_dir/info/refs
@@ -0,0 +1 @@
+e65f5b15be7a302936db2cf50430eae7ef4ecc6f	refs/heads/master
diff --git a/src/test/resources/_git_with_no_changes/_git_dir/logs/HEAD b/src/test/resources/_git_with_no_changes/_git_dir/logs/HEAD
new file mode 100644
index 00000000..3a36f199
--- /dev/null
+++ b/src/test/resources/_git_with_no_changes/_git_dir/logs/HEAD
@@ -0,0 +1,3 @@
+0000000000000000000000000000000000000000 ff21f63ce400e3ff07b0b318dd4c61a0fb368bd2 Adam Batkin  1417584929 -0500	commit (initial): add file.txt
+ff21f63ce400e3ff07b0b318dd4c61a0fb368bd2 95412a0871d9c4e1421d71d4fc513556e8d6f985 Adam Batkin  1417588894 -0500	commit (amend): add file.txt
+95412a0871d9c4e1421d71d4fc513556e8d6f985 e65f5b15be7a302936db2cf50430eae7ef4ecc6f Adam Batkin  1417588980 -0500	commit (amend): add file.txt
diff --git a/src/test/resources/_git_with_no_changes/_git_dir/logs/refs/heads/master b/src/test/resources/_git_with_no_changes/_git_dir/logs/refs/heads/master
new file mode 100644
index 00000000..3a36f199
--- /dev/null
+++ b/src/test/resources/_git_with_no_changes/_git_dir/logs/refs/heads/master
@@ -0,0 +1,3 @@
+0000000000000000000000000000000000000000 ff21f63ce400e3ff07b0b318dd4c61a0fb368bd2 Adam Batkin  1417584929 -0500	commit (initial): add file.txt
+ff21f63ce400e3ff07b0b318dd4c61a0fb368bd2 95412a0871d9c4e1421d71d4fc513556e8d6f985 Adam Batkin  1417588894 -0500	commit (amend): add file.txt
+95412a0871d9c4e1421d71d4fc513556e8d6f985 e65f5b15be7a302936db2cf50430eae7ef4ecc6f Adam Batkin  1417588980 -0500	commit (amend): add file.txt
diff --git a/src/test/resources/_git_with_no_changes/_git_dir/objects/info/packs b/src/test/resources/_git_with_no_changes/_git_dir/objects/info/packs
new file mode 100644
index 00000000..b2239d57
--- /dev/null
+++ b/src/test/resources/_git_with_no_changes/_git_dir/objects/info/packs
@@ -0,0 +1,2 @@
+P pack-789f4a0163258377aa2befda15661493c77f3ee1.pack
+
diff --git a/src/test/resources/_git_with_no_changes/_git_dir/objects/pack/pack-789f4a0163258377aa2befda15661493c77f3ee1.idx b/src/test/resources/_git_with_no_changes/_git_dir/objects/pack/pack-789f4a0163258377aa2befda15661493c77f3ee1.idx
new file mode 100644
index 00000000..e2a7d429
Binary files /dev/null and b/src/test/resources/_git_with_no_changes/_git_dir/objects/pack/pack-789f4a0163258377aa2befda15661493c77f3ee1.idx differ
diff --git a/src/test/resources/_git_with_no_changes/_git_dir/objects/pack/pack-789f4a0163258377aa2befda15661493c77f3ee1.pack b/src/test/resources/_git_with_no_changes/_git_dir/objects/pack/pack-789f4a0163258377aa2befda15661493c77f3ee1.pack
new file mode 100644
index 00000000..ace0aee8
Binary files /dev/null and b/src/test/resources/_git_with_no_changes/_git_dir/objects/pack/pack-789f4a0163258377aa2befda15661493c77f3ee1.pack differ
diff --git a/src/test/resources/_git_with_no_changes/_git_dir/packed-refs b/src/test/resources/_git_with_no_changes/_git_dir/packed-refs
new file mode 100644
index 00000000..a9e92821
--- /dev/null
+++ b/src/test/resources/_git_with_no_changes/_git_dir/packed-refs
@@ -0,0 +1,2 @@
+# pack-refs with: peeled fully-peeled 
+e65f5b15be7a302936db2cf50430eae7ef4ecc6f refs/heads/master
diff --git a/src/test/resources/_git_with_no_changes/file.txt b/src/test/resources/_git_with_no_changes/file.txt
new file mode 100644
index 00000000..e69de29b