From 00fae69c06eb055a0f5b132dedbacc4491afd854 Mon Sep 17 00:00:00 2001 From: Adam Batkin Date: Tue, 2 Dec 2014 14:51:28 -0500 Subject: [PATCH 1/3] add boolean property: 'files.dirty' if working dir is dirty --- .../java/pl/project13/maven/git/GitCommitIdMojo.java | 1 + .../java/pl/project13/maven/git/GitDataProvider.java | 3 +++ src/main/java/pl/project13/maven/git/JGitProvider.java | 10 ++++++++++ .../java/pl/project13/maven/git/NativeGitProvider.java | 6 ++++++ 4 files changed, 20 insertions(+) diff --git a/src/main/java/pl/project13/maven/git/GitCommitIdMojo.java b/src/main/java/pl/project13/maven/git/GitCommitIdMojo.java index b7787690..aa94f603 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 = "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..eef6bd85 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, isDirty()? "true" : "false"); // 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\""); From 0cc24593d7a76932cd1f04a373c752bbca8fb05a Mon Sep 17 00:00:00 2001 From: Adam Batkin Date: Wed, 3 Dec 2014 00:00:26 -0500 Subject: [PATCH 2/3] Small cleanups --- src/main/java/pl/project13/maven/git/GitCommitIdMojo.java | 2 +- src/main/java/pl/project13/maven/git/GitDataProvider.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/pl/project13/maven/git/GitCommitIdMojo.java b/src/main/java/pl/project13/maven/git/GitCommitIdMojo.java index aa94f603..95dae012 100644 --- a/src/main/java/pl/project13/maven/git/GitCommitIdMojo.java +++ b/src/main/java/pl/project13/maven/git/GitCommitIdMojo.java @@ -59,7 +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 = "files.dirty"; + 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 eef6bd85..3ea21dba 100644 --- a/src/main/java/pl/project13/maven/git/GitDataProvider.java +++ b/src/main/java/pl/project13/maven/git/GitDataProvider.java @@ -67,7 +67,7 @@ public void loadGitData(@NotNull Properties properties) throws IOException, Mojo // git.commit.id.abbrev put(properties, GitCommitIdMojo.COMMIT_ID_ABBREV, getAbbrevCommitId()); // git.files.dirty - put(properties, GitCommitIdMojo.FILES_DIRTY, isDirty()? "true" : "false"); + put(properties, GitCommitIdMojo.FILES_DIRTY, Boolean.toString(isDirty())); // git.commit.author.name put(properties, GitCommitIdMojo.COMMIT_AUTHOR_NAME, getCommitAuthorName()); // git.commit.author.email From f1108b5fefc21d31fb0e8a1fab19c4e706963468 Mon Sep 17 00:00:00 2001 From: Adam Batkin Date: Wed, 3 Dec 2014 01:46:44 -0500 Subject: [PATCH 3/3] add unit test checking for dirty files --- .../maven/git/AvailableGitTestRepo.java | 2 + .../git/GitCommitIdMojoDirtyFilesTest.java | 103 ++++++++++++++++++ .../maven/git/GitCommitIdMojoTest.java | 1 + .../_git_with_changes/_git_dir/COMMIT_EDITMSG | 1 + .../resources/_git_with_changes/_git_dir/HEAD | 1 + .../_git_with_changes/_git_dir/ORIG_HEAD | 1 + .../_git_with_changes/_git_dir/config | 5 + .../_git_with_changes/_git_dir/description | 1 + .../_git_with_changes/_git_dir/index | Bin 0 -> 104 bytes .../_git_with_changes/_git_dir/info/exclude | 7 ++ .../_git_with_changes/_git_dir/info/refs | 1 + .../_git_with_changes/_git_dir/logs/HEAD | 1 + .../_git_dir/logs/refs/heads/master | 1 + .../_git_dir/objects/info/packs | 2 + ...141c03c134fe0537a3990df45432bf0bf0396e.idx | Bin 0 -> 1156 bytes ...41c03c134fe0537a3990df45432bf0bf0396e.pack | Bin 0 -> 208 bytes .../_git_with_changes/_git_dir/packed-refs | 2 + .../resources/_git_with_changes/another.txt | 0 src/test/resources/_git_with_changes/file.txt | 0 .../_git_dir/COMMIT_EDITMSG | 17 +++ .../_git_with_no_changes/_git_dir/HEAD | 1 + .../_git_with_no_changes/_git_dir/config | 5 + .../_git_with_no_changes/_git_dir/description | 1 + .../_git_with_no_changes/_git_dir/index | Bin 0 -> 104 bytes .../_git_dir/info/exclude | 7 ++ .../_git_with_no_changes/_git_dir/info/refs | 1 + .../_git_with_no_changes/_git_dir/logs/HEAD | 3 + .../_git_dir/logs/refs/heads/master | 3 + .../_git_dir/objects/info/packs | 2 + ...9f4a0163258377aa2befda15661493c77f3ee1.idx | Bin 0 -> 1268 bytes ...f4a0163258377aa2befda15661493c77f3ee1.pack | Bin 0 -> 475 bytes .../_git_with_no_changes/_git_dir/packed-refs | 2 + .../resources/_git_with_no_changes/file.txt | 0 33 files changed, 171 insertions(+) create mode 100644 src/test/java/pl/project13/maven/git/GitCommitIdMojoDirtyFilesTest.java create mode 100644 src/test/resources/_git_with_changes/_git_dir/COMMIT_EDITMSG create mode 100644 src/test/resources/_git_with_changes/_git_dir/HEAD create mode 100644 src/test/resources/_git_with_changes/_git_dir/ORIG_HEAD create mode 100755 src/test/resources/_git_with_changes/_git_dir/config create mode 100644 src/test/resources/_git_with_changes/_git_dir/description create mode 100644 src/test/resources/_git_with_changes/_git_dir/index create mode 100644 src/test/resources/_git_with_changes/_git_dir/info/exclude create mode 100644 src/test/resources/_git_with_changes/_git_dir/info/refs create mode 100644 src/test/resources/_git_with_changes/_git_dir/logs/HEAD create mode 100644 src/test/resources/_git_with_changes/_git_dir/logs/refs/heads/master create mode 100644 src/test/resources/_git_with_changes/_git_dir/objects/info/packs create mode 100644 src/test/resources/_git_with_changes/_git_dir/objects/pack/pack-ca141c03c134fe0537a3990df45432bf0bf0396e.idx create mode 100644 src/test/resources/_git_with_changes/_git_dir/objects/pack/pack-ca141c03c134fe0537a3990df45432bf0bf0396e.pack create mode 100644 src/test/resources/_git_with_changes/_git_dir/packed-refs create mode 100644 src/test/resources/_git_with_changes/another.txt create mode 100644 src/test/resources/_git_with_changes/file.txt create mode 100644 src/test/resources/_git_with_no_changes/_git_dir/COMMIT_EDITMSG create mode 100644 src/test/resources/_git_with_no_changes/_git_dir/HEAD create mode 100755 src/test/resources/_git_with_no_changes/_git_dir/config create mode 100644 src/test/resources/_git_with_no_changes/_git_dir/description create mode 100644 src/test/resources/_git_with_no_changes/_git_dir/index create mode 100644 src/test/resources/_git_with_no_changes/_git_dir/info/exclude create mode 100644 src/test/resources/_git_with_no_changes/_git_dir/info/refs create mode 100644 src/test/resources/_git_with_no_changes/_git_dir/logs/HEAD create mode 100644 src/test/resources/_git_with_no_changes/_git_dir/logs/refs/heads/master create mode 100644 src/test/resources/_git_with_no_changes/_git_dir/objects/info/packs create mode 100644 src/test/resources/_git_with_no_changes/_git_dir/objects/pack/pack-789f4a0163258377aa2befda15661493c77f3ee1.idx create mode 100644 src/test/resources/_git_with_no_changes/_git_dir/objects/pack/pack-789f4a0163258377aa2befda15661493c77f3ee1.pack create mode 100644 src/test/resources/_git_with_no_changes/_git_dir/packed-refs create mode 100644 src/test/resources/_git_with_no_changes/file.txt 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 0000000000000000000000000000000000000000..c96b5f315a15c34e0ffdeb81f0e121ef0170c073
GIT binary patch
literal 104
zcmZ?q402{*U|<4b#*n(T<%}7@fiRkZfrEuX!A6LIp>YWV1M>?AW?* 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 0000000000000000000000000000000000000000..660540a7c2f8da790577dca783f465d43ab86b63
GIT binary patch
literal 1156
zcmexg;-AdGz`z8=qhR=l03*n=YpA|n*gb!G
z05AVgK|@Ob00062000A<3V58A%TWr0Fbsg<_nsmbm?W;Y5r)j&ByB1yTNNaO
z9befE_W1qq+g=JJ)xZg<$1EdV*=GtE{MmdKro>B#Iri-2W6y1eS*5{4>{VB|$%%XV
zp<9bhK%U~jj3dJZ2Sk^*)~Z?gdvu}-OMRElzUB@eE;7la0(hJ=G%zqTF;Pg%%t_TN
zsVHH1Huur&O&6~@dv|NDE04Ny=t)oTL;wLt5QZ>#oC5#=0005X6dVJ=H2wuQqnQo#
KR5HH{@HuX{FImYWV1M>?AW?* 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 0000000000000000000000000000000000000000..e2a7d429693e486a893c159ff69ac4584ef9e547
GIT binary patch
literal 1268
zcmexg;-AdGz`z8=qhN4_03*;jLmh+C)nLZVK=;uavjFX&1hWD4(;Bm<$eqV5g>`fQ1
zIeT|&t}Bnaap*};@WlU$-)x>RJpRwVVY9?tpTq^f&AKmD%vmNN?kjn6L9~i?l}z~_
zfqByl^2!)AYm5q;0y1cDUT1ShWHqB7IG&5GM|K8iPsfk`Tzb7=OD(Ba(k@j)5y5l-Ox3T-pj-||p
zgT8V-(dc=zsJGyd;Ke6fzb}jWFKub`&rNyhfje=f7y4)E%e^-`0kPa0WI4lyT0cYa
z4Ju}n`8@*jjZXR)WJGBwSJb%LG@RaEv8$V*U8QeA_G1xYOZ(|NSrm^*JewrDwWBA3
z*Y@kSw*`q(1*&_$i~4;zxU`z86r)|!?|FJ67B-f-!g`ila_TmDV(
zjL*6^WsdQT7mN*+6?3A`?wD10Xi4Y9J2f$#nwnghGc8wEsfwz`Fr+Wz;9SB~F~``%
zz`)or(Bt$O&#T%iH4-b#zF&OfE56>cx;%TGcK@!z7oPqfTo@SL1=iPaNV(+f;KAyU6zFEr(F9JqCY?oVLT`}i!
qzyEoiPXCiSm!2~*h-Wgds+jM^n5^1dzDoQ3EzvZQ$;a#M9s&S~NYZBj

literal 0
HcmV?d00001

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