It's useful to have ReflogEntry refactored out so it can be used by clients via the JGit API. Change-Id: I03044df9af9f9547777545b7c9b93bdf5f8b7cb5 Signed-off-by: Chris Aniszczyk <caniszczyk@gmail.com>tags/v1.1.0.201109011030-rc2
@@ -89,6 +89,7 @@ import org.eclipse.jgit.lib.Ref; | |||
import org.eclipse.jgit.lib.Repository; | |||
import org.eclipse.jgit.revwalk.RevBlob; | |||
import org.eclipse.jgit.revwalk.RevCommit; | |||
import org.eclipse.jgit.storage.file.ReflogEntry; | |||
import org.eclipse.jgit.storage.file.FileBasedConfig; | |||
import org.eclipse.jgit.storage.file.FileRepository; | |||
import org.eclipse.jgit.storage.file.ReflogReader; | |||
@@ -558,7 +559,7 @@ public class SmartClientSmartServerTest extends HttpTestCase { | |||
final ReflogReader log = remoteRepository.getReflogReader(dstName); | |||
assertNotNull("has log for " + dstName); | |||
final ReflogReader.Entry last = log.getLastEntry(); | |||
final ReflogEntry last = log.getLastEntry(); | |||
assertNotNull("has last entry", last); | |||
assertEquals(ObjectId.zeroId(), last.getOldId()); | |||
assertEquals(Q, last.getNewId()); |
@@ -121,14 +121,14 @@ public class RefUpdateTest extends SampleDataRepositoryTestCase { | |||
assertNotSame(newid, r.getObjectId()); | |||
assertSame(ObjectId.class, r.getObjectId().getClass()); | |||
assertEquals(newid, r.getObjectId()); | |||
List<org.eclipse.jgit.storage.file.ReflogReader.Entry> reverseEntries1 = db.getReflogReader("refs/heads/abc").getReverseEntries(); | |||
org.eclipse.jgit.storage.file.ReflogReader.Entry entry1 = reverseEntries1.get(0); | |||
List<org.eclipse.jgit.storage.file.ReflogEntry> reverseEntries1 = db.getReflogReader("refs/heads/abc").getReverseEntries(); | |||
org.eclipse.jgit.storage.file.ReflogEntry entry1 = reverseEntries1.get(0); | |||
assertEquals(1, reverseEntries1.size()); | |||
assertEquals(ObjectId.zeroId(), entry1.getOldId()); | |||
assertEquals(r.getObjectId(), entry1.getNewId()); | |||
assertEquals(new PersonIdent(db).toString(), entry1.getWho().toString()); | |||
assertEquals("", entry1.getComment()); | |||
List<org.eclipse.jgit.storage.file.ReflogReader.Entry> reverseEntries2 = db.getReflogReader("HEAD").getReverseEntries(); | |||
List<org.eclipse.jgit.storage.file.ReflogEntry> reverseEntries2 = db.getReflogReader("HEAD").getReverseEntries(); | |||
assertEquals(0, reverseEntries2.size()); | |||
} | |||
@@ -334,7 +334,7 @@ public class RefUpdateTest extends SampleDataRepositoryTestCase { | |||
// the branch HEAD referred to is left untouched | |||
assertEquals(pid, db.resolve("refs/heads/master")); | |||
ReflogReader reflogReader = new ReflogReader(db, "HEAD"); | |||
org.eclipse.jgit.storage.file.ReflogReader.Entry e = reflogReader.getReverseEntries().get(0); | |||
org.eclipse.jgit.storage.file.ReflogEntry e = reflogReader.getReverseEntries().get(0); | |||
assertEquals(pid, e.getOldId()); | |||
assertEquals(ppid, e.getNewId()); | |||
assertEquals("GIT_COMMITTER_EMAIL", e.getWho().getEmailAddress()); | |||
@@ -364,7 +364,7 @@ public class RefUpdateTest extends SampleDataRepositoryTestCase { | |||
// the branch HEAD referred to is left untouched | |||
assertNull(db.resolve("refs/heads/unborn")); | |||
ReflogReader reflogReader = new ReflogReader(db, "HEAD"); | |||
org.eclipse.jgit.storage.file.ReflogReader.Entry e = reflogReader.getReverseEntries().get(0); | |||
org.eclipse.jgit.storage.file.ReflogEntry e = reflogReader.getReverseEntries().get(0); | |||
assertEquals(ObjectId.zeroId(), e.getOldId()); | |||
assertEquals(ppid, e.getNewId()); | |||
assertEquals("GIT_COMMITTER_EMAIL", e.getWho().getEmailAddress()); | |||
@@ -701,9 +701,9 @@ public class RefUpdateTest extends SampleDataRepositoryTestCase { | |||
ObjectId oldHeadId = db.resolve(Constants.HEAD); | |||
writeReflog(db, oldfromId, oldfromId, "Just a message", | |||
fromName); | |||
List<org.eclipse.jgit.storage.file.ReflogReader.Entry> oldFromLog = db | |||
List<org.eclipse.jgit.storage.file.ReflogEntry> oldFromLog = db | |||
.getReflogReader(fromName).getReverseEntries(); | |||
List<org.eclipse.jgit.storage.file.ReflogReader.Entry> oldHeadLog = oldHeadId != null ? db | |||
List<org.eclipse.jgit.storage.file.ReflogEntry> oldHeadLog = oldHeadId != null ? db | |||
.getReflogReader(Constants.HEAD).getReverseEntries() : null; | |||
assertTrue("internal check, we have a log", new File(db.getDirectory(), |
@@ -57,7 +57,6 @@ import java.util.List; | |||
import org.eclipse.jgit.lib.ObjectId; | |||
import org.eclipse.jgit.lib.PersonIdent; | |||
import org.eclipse.jgit.lib.SampleDataRepositoryTestCase; | |||
import org.eclipse.jgit.storage.file.ReflogReader.Entry; | |||
import org.junit.Test; | |||
public class ReflogReaderTest extends SampleDataRepositoryTestCase { | |||
@@ -91,7 +90,7 @@ public class ReflogReaderTest extends SampleDataRepositoryTestCase { | |||
setupReflog("logs/refs/heads/master", oneLine); | |||
ReflogReader reader = new ReflogReader(db, "refs/heads/master"); | |||
Entry e = reader.getLastEntry(); | |||
ReflogEntry e = reader.getLastEntry(); | |||
assertEquals(ObjectId | |||
.fromString("da85355dfc525c9f6f3927b876f379f46ccf826e"), e | |||
.getOldId()); | |||
@@ -118,9 +117,9 @@ public class ReflogReaderTest extends SampleDataRepositoryTestCase { | |||
setupReflog("logs/refs/heads/master", twoLine); | |||
ReflogReader reader = new ReflogReader(db, "refs/heads/master"); | |||
List<Entry> reverseEntries = reader.getReverseEntries(); | |||
List<ReflogEntry> reverseEntries = reader.getReverseEntries(); | |||
assertEquals(2, reverseEntries.size()); | |||
Entry e = reverseEntries.get(0); | |||
ReflogEntry e = reverseEntries.get(0); | |||
assertEquals(ObjectId | |||
.fromString("c6734895958052a9dbc396cff4459dc1a25029ab"), e | |||
.getOldId()); | |||
@@ -153,9 +152,9 @@ public class ReflogReaderTest extends SampleDataRepositoryTestCase { | |||
public void testReadWhileAppendIsInProgress() throws Exception { | |||
setupReflog("logs/refs/heads/master", twoLineWithAppendInProgress); | |||
ReflogReader reader = new ReflogReader(db, "refs/heads/master"); | |||
List<Entry> reverseEntries = reader.getReverseEntries(); | |||
List<ReflogEntry> reverseEntries = reader.getReverseEntries(); | |||
assertEquals(2, reverseEntries.size()); | |||
Entry e = reverseEntries.get(0); | |||
ReflogEntry e = reverseEntries.get(0); | |||
assertEquals(ObjectId | |||
.fromString("c6734895958052a9dbc396cff4459dc1a25029ab"), e | |||
.getOldId()); | |||
@@ -191,7 +190,7 @@ public class ReflogReaderTest extends SampleDataRepositoryTestCase { | |||
public void testReadLineWithMissingComment() throws Exception { | |||
setupReflog("logs/refs/heads/master", oneLineWithoutComment); | |||
final ReflogReader reader = db.getReflogReader("master"); | |||
Entry e = reader.getLastEntry(); | |||
ReflogEntry e = reader.getLastEntry(); | |||
assertEquals(ObjectId | |||
.fromString("da85355dfc525c9f6f3927b876f379f46ccf826e"), e | |||
.getOldId()); |
@@ -0,0 +1,120 @@ | |||
/* | |||
* Copyright (C) 2011, Chris Aniszczyk <caniszczyk@gmail.com> | |||
* Copyright (C) 2009, Robin Rosenberg <robin.rosenberg@dewire.com> | |||
* and other copyright owners as documented in the project's IP log. | |||
* | |||
* This program and the accompanying materials are made available | |||
* under the terms of the Eclipse Distribution License v1.0 which | |||
* accompanies this distribution, is reproduced below, and is | |||
* available at http://www.eclipse.org/org/documents/edl-v10.php | |||
* | |||
* All rights reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or | |||
* without modification, are permitted provided that the following | |||
* conditions are met: | |||
* | |||
* - Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* - Redistributions in binary form must reproduce the above | |||
* copyright notice, this list of conditions and the following | |||
* disclaimer in the documentation and/or other materials provided | |||
* with the distribution. | |||
* | |||
* - Neither the name of the Eclipse Foundation, Inc. nor the | |||
* names of its contributors may be used to endorse or promote | |||
* products derived from this software without specific prior | |||
* written permission. | |||
* | |||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND | |||
* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, | |||
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | |||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR | |||
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | |||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | |||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | |||
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, | |||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | |||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF | |||
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||
*/ | |||
package org.eclipse.jgit.storage.file; | |||
import org.eclipse.jgit.JGitText; | |||
import org.eclipse.jgit.lib.Constants; | |||
import org.eclipse.jgit.lib.ObjectId; | |||
import org.eclipse.jgit.lib.PersonIdent; | |||
import org.eclipse.jgit.util.RawParseUtils; | |||
/** | |||
* Parsed reflog entry | |||
*/ | |||
public class ReflogEntry { | |||
private ObjectId oldId; | |||
private ObjectId newId; | |||
private PersonIdent who; | |||
private String comment; | |||
ReflogEntry(byte[] raw, int pos) { | |||
oldId = ObjectId.fromString(raw, pos); | |||
pos += Constants.OBJECT_ID_STRING_LENGTH; | |||
if (raw[pos++] != ' ') | |||
throw new IllegalArgumentException( | |||
JGitText.get().rawLogMessageDoesNotParseAsLogEntry); | |||
newId = ObjectId.fromString(raw, pos); | |||
pos += Constants.OBJECT_ID_STRING_LENGTH; | |||
if (raw[pos++] != ' ') { | |||
throw new IllegalArgumentException( | |||
JGitText.get().rawLogMessageDoesNotParseAsLogEntry); | |||
} | |||
who = RawParseUtils.parsePersonIdentOnly(raw, pos); | |||
int p0 = RawParseUtils.next(raw, pos, '\t'); | |||
if (p0 >= raw.length) | |||
comment = ""; // personident has no \t, no comment present | |||
else { | |||
int p1 = RawParseUtils.nextLF(raw, p0); | |||
comment = p1 > p0 ? RawParseUtils.decode(raw, p0, p1 - 1) : ""; | |||
} | |||
} | |||
/** | |||
* @return the commit id before the change | |||
*/ | |||
public ObjectId getOldId() { | |||
return oldId; | |||
} | |||
/** | |||
* @return the commit id after the change | |||
*/ | |||
public ObjectId getNewId() { | |||
return newId; | |||
} | |||
/** | |||
* @return user performin the change | |||
*/ | |||
public PersonIdent getWho() { | |||
return who; | |||
} | |||
/** | |||
* @return textual description of the change | |||
*/ | |||
public String getComment() { | |||
return comment; | |||
} | |||
@Override | |||
public String toString() { | |||
return "Entry[" + oldId.name() + ", " + newId.name() + ", " + getWho() + ", " | |||
+ getComment() + "]"; | |||
} | |||
} |
@@ -51,10 +51,6 @@ import java.util.ArrayList; | |||
import java.util.Collections; | |||
import java.util.List; | |||
import org.eclipse.jgit.JGitText; | |||
import org.eclipse.jgit.lib.Constants; | |||
import org.eclipse.jgit.lib.ObjectId; | |||
import org.eclipse.jgit.lib.PersonIdent; | |||
import org.eclipse.jgit.lib.Repository; | |||
import org.eclipse.jgit.util.IO; | |||
import org.eclipse.jgit.util.RawParseUtils; | |||
@@ -63,78 +59,13 @@ import org.eclipse.jgit.util.RawParseUtils; | |||
* Utility for reading reflog entries | |||
*/ | |||
public class ReflogReader { | |||
/** | |||
* Parsed reflog entry | |||
*/ | |||
static public class Entry { | |||
private ObjectId oldId; | |||
private ObjectId newId; | |||
private PersonIdent who; | |||
private String comment; | |||
Entry(byte[] raw, int pos) { | |||
oldId = ObjectId.fromString(raw, pos); | |||
pos += Constants.OBJECT_ID_STRING_LENGTH; | |||
if (raw[pos++] != ' ') | |||
throw new IllegalArgumentException( | |||
JGitText.get().rawLogMessageDoesNotParseAsLogEntry); | |||
newId = ObjectId.fromString(raw, pos); | |||
pos += Constants.OBJECT_ID_STRING_LENGTH; | |||
if (raw[pos++] != ' ') { | |||
throw new IllegalArgumentException( | |||
JGitText.get().rawLogMessageDoesNotParseAsLogEntry); | |||
} | |||
who = RawParseUtils.parsePersonIdentOnly(raw, pos); | |||
int p0 = RawParseUtils.next(raw, pos, '\t'); | |||
if (p0 >= raw.length) | |||
comment = ""; // personident has no \t, no comment present | |||
else { | |||
int p1 = RawParseUtils.nextLF(raw, p0); | |||
comment = p1 > p0 ? RawParseUtils.decode(raw, p0, p1 - 1) : ""; | |||
} | |||
} | |||
/** | |||
* @return the commit id before the change | |||
*/ | |||
public ObjectId getOldId() { | |||
return oldId; | |||
} | |||
/** | |||
* @return the commit id after the change | |||
*/ | |||
public ObjectId getNewId() { | |||
return newId; | |||
} | |||
/** | |||
* @return user performin the change | |||
*/ | |||
public PersonIdent getWho() { | |||
return who; | |||
} | |||
/** | |||
* @return textual description of the change | |||
*/ | |||
public String getComment() { | |||
return comment; | |||
} | |||
@Override | |||
public String toString() { | |||
return "Entry[" + oldId.name() + ", " + newId.name() + ", " + getWho() + ", " | |||
+ getComment() + "]"; | |||
} | |||
} | |||
private File logName; | |||
ReflogReader(Repository db, String refname) { | |||
/** | |||
* @param db | |||
* @param refname | |||
*/ | |||
public ReflogReader(Repository db, String refname) { | |||
logName = new File(db.getDirectory(), "logs/" + refname); | |||
} | |||
@@ -144,8 +75,8 @@ public class ReflogReader { | |||
* @return the latest reflog entry, or null if no log | |||
* @throws IOException | |||
*/ | |||
public Entry getLastEntry() throws IOException { | |||
List<Entry> entries = getReverseEntries(1); | |||
public ReflogEntry getLastEntry() throws IOException { | |||
List<ReflogEntry> entries = getReverseEntries(1); | |||
return entries.size() > 0 ? entries.get(0) : null; | |||
} | |||
@@ -153,7 +84,7 @@ public class ReflogReader { | |||
* @return all reflog entries in reverse order | |||
* @throws IOException | |||
*/ | |||
public List<Entry> getReverseEntries() throws IOException { | |||
public List<ReflogEntry> getReverseEntries() throws IOException { | |||
return getReverseEntries(Integer.MAX_VALUE); | |||
} | |||
@@ -163,7 +94,7 @@ public class ReflogReader { | |||
* @return all reflog entries in reverse order | |||
* @throws IOException | |||
*/ | |||
public List<Entry> getReverseEntries(int max) throws IOException { | |||
public List<ReflogEntry> getReverseEntries(int max) throws IOException { | |||
final byte[] log; | |||
try { | |||
log = IO.readFully(logName); | |||
@@ -172,10 +103,10 @@ public class ReflogReader { | |||
} | |||
int rs = RawParseUtils.prevLF(log, log.length); | |||
List<Entry> ret = new ArrayList<Entry>(); | |||
List<ReflogEntry> ret = new ArrayList<ReflogEntry>(); | |||
while (rs >= 0 && max-- > 0) { | |||
rs = RawParseUtils.prevLF(log, rs); | |||
Entry entry = new Entry(log, rs < 0 ? 0 : rs + 2); | |||
ReflogEntry entry = new ReflogEntry(log, rs < 0 ? 0 : rs + 2); | |||
ret.add(entry); | |||
} | |||
return ret; |