]> source.dussan.org Git - jgit.git/commitdiff
Add commit check for head references 58/101758/4
authorZhen Chen <czhen@google.com>
Fri, 21 Jul 2017 00:20:55 +0000 (17:20 -0700)
committerZhen Chen <czhen@google.com>
Wed, 26 Jul 2017 17:12:37 +0000 (10:12 -0700)
Make sure all refs/heads/* point to a commit object.

Change-Id: I9c7cf347aaf63d5ef604d520c2383c6cf3043890
Signed-off-by: Zhen Chen <czhen@google.com>
org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/dfs/DfsFsckTest.java
org.eclipse.jgit/src/org/eclipse/jgit/internal/fsck/FsckError.java
org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/dfs/DfsFsck.java

index 8d223c80d900d3fdd03d373a67d2016c4e58d1b2..804d744ae23fdfa34b4cfb5a81f7a22c6fa3d5e5 100644 (file)
@@ -240,4 +240,30 @@ public class DfsFsckTest {
                assertEquals(errors.getMissingObjects().size(), 1);
                assertEquals(errors.getMissingObjects().iterator().next(), blobId);
        }
+
+       @Test
+       public void testNonCommitHead() throws Exception {
+               RevCommit commit0 = git.commit().message("0").create();
+               StringBuilder b = new StringBuilder();
+               b.append("object ");
+               b.append(commit0.getName());
+               b.append('\n');
+               b.append("type commit\n");
+               b.append("tag test-tag\n");
+               b.append("tagger A. U. Thor <author@localhost> 1 +0000\n");
+
+               byte[] data = encodeASCII(b.toString());
+               ObjectId tagId = ins.insert(Constants.OBJ_TAG, data);
+               ins.flush();
+
+               git.update("master", tagId);
+
+               DfsFsck fsck = new DfsFsck(repo);
+               FsckError errors = fsck.check(null);
+               assertEquals(errors.getCorruptObjects().size(), 0);
+               assertEquals(errors.getNonCommitHeads().size(), 1);
+               assertEquals(errors.getNonCommitHeads().iterator().next(),
+                               "refs/heads/master");
+       }
+
 }
index b7aac1630bcf867e55486fa879d229fe079cc843..588ed9bf8acd7a116aa51b196b44f66a1152e451 100644 (file)
@@ -128,6 +128,8 @@ public class FsckError {
 
        private final Set<CorruptIndex> corruptIndices = new HashSet<>();
 
+       private final Set<String> nonCommitHeads = new HashSet<>();
+
        /** @return corrupt objects from all pack files. */
        public Set<CorruptObject> getCorruptObjects() {
                return corruptObjects;
@@ -142,4 +144,9 @@ public class FsckError {
        public Set<CorruptIndex> getCorruptIndices() {
                return corruptIndices;
        }
+
+       /** @return refs/heads/* point to non-commit object. */
+       public Set<String> getNonCommitHeads() {
+               return nonCommitHeads;
+       }
 }
index 9549dbb2eaee6b66f0f1ac2db09db8230a4c72d2..f90ba7d9861de5e2248b961b1fe18a870935ad5c 100644 (file)
@@ -52,6 +52,7 @@ import org.eclipse.jgit.internal.fsck.FsckError;
 import org.eclipse.jgit.internal.fsck.FsckError.CorruptIndex;
 import org.eclipse.jgit.internal.fsck.FsckPackParser;
 import org.eclipse.jgit.internal.storage.pack.PackExt;
+import org.eclipse.jgit.lib.Constants;
 import org.eclipse.jgit.lib.ObjectChecker;
 import org.eclipse.jgit.lib.ProgressMonitor;
 import org.eclipse.jgit.lib.Ref;
@@ -123,6 +124,13 @@ public class DfsFsck {
                                for (Ref r : repo.getAllRefs().values()) {
                                        try {
                                                RevObject tip = ow.parseAny(r.getObjectId());
+                                               if (r.getLeaf().getName().startsWith(Constants.R_HEADS)) {
+                                                       // check if heads point to a commit object
+                                                       if (tip.getType() != Constants.OBJ_COMMIT) {
+                                                               errors.getNonCommitHeads()
+                                                                               .add(r.getLeaf().getName());
+                                                       }
+                                               }
                                                ow.markStart(tip);
                                                ow.checkConnectivity();
                                                ow.markUninteresting(tip);