Browse Source

Refactor out ReflogEntry

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
Chris Aniszczyk 13 years ago
parent
commit
65606dc086

+ 2
- 1
org.eclipse.jgit.http.test/tst/org/eclipse/jgit/http/test/SmartClientSmartServerTest.java View File

@@ -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());

+ 7
- 7
org.eclipse.jgit.test/tst/org/eclipse/jgit/storage/file/RefUpdateTest.java View File

@@ -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(),

+ 6
- 7
org.eclipse.jgit.test/tst/org/eclipse/jgit/storage/file/ReflogReaderTest.java View File

@@ -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());

+ 120
- 0
org.eclipse.jgit/src/org/eclipse/jgit/storage/file/ReflogEntry.java View File

@@ -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() + "]";
}
}

+ 11
- 80
org.eclipse.jgit/src/org/eclipse/jgit/storage/file/ReflogReader.java View File

@@ -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;

Loading…
Cancel
Save