blob: 21b5a54eb7ade1d84f8f7541fed2614071ac5f05 [file] [log] [blame]
/*
* Copyright (C) 2009, Robin Rosenberg <robin.rosenberg@dewire.com> and others
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Distribution License v. 1.0 which is available at
* https://www.eclipse.org/org/documents/edl-v10.php.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
package org.eclipse.jgit.internal.storage.file;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.ReflogEntry;
import org.eclipse.jgit.lib.ReflogReader;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.util.IO;
import org.eclipse.jgit.util.RawParseUtils;
/**
* Utility for reading reflog entries
*/
class ReflogReaderImpl implements ReflogReader {
private File logName;
/**
* @param db
* repository to read reflogs from
* @param refname
* {@code Ref} name
*/
ReflogReaderImpl(Repository db, String refname) {
logName = new File(db.getDirectory(), Constants.LOGS + '/' + refname);
}
/* (non-Javadoc)
* @see org.eclipse.jgit.internal.storage.file.ReflogReaader#getLastEntry()
*/
@Override
public ReflogEntry getLastEntry() throws IOException {
return getReverseEntry(0);
}
/* (non-Javadoc)
* @see org.eclipse.jgit.internal.storage.file.ReflogReaader#getReverseEntries()
*/
@Override
public List<ReflogEntry> getReverseEntries() throws IOException {
return getReverseEntries(Integer.MAX_VALUE);
}
/* (non-Javadoc)
* @see org.eclipse.jgit.internal.storage.file.ReflogReaader#getReverseEntry(int)
*/
@Override
public ReflogEntry getReverseEntry(int number) throws IOException {
if (number < 0)
throw new IllegalArgumentException();
final byte[] log;
try {
log = IO.readFully(logName);
} catch (FileNotFoundException e) {
if (logName.exists()) {
throw e;
}
return null;
}
int rs = RawParseUtils.prevLF(log, log.length);
int current = 0;
while (rs >= 0) {
rs = RawParseUtils.prevLF(log, rs);
if (number == current)
return new ReflogEntryImpl(log, rs < 0 ? 0 : rs + 2);
current++;
}
return null;
}
/* (non-Javadoc)
* @see org.eclipse.jgit.internal.storage.file.ReflogReaader#getReverseEntries(int)
*/
@Override
public List<ReflogEntry> getReverseEntries(int max) throws IOException {
final byte[] log;
try {
log = IO.readFully(logName);
} catch (FileNotFoundException e) {
if (logName.exists()) {
throw e;
}
return Collections.emptyList();
}
int rs = RawParseUtils.prevLF(log, log.length);
List<ReflogEntry> ret = new ArrayList<>();
while (rs >= 0 && max-- > 0) {
rs = RawParseUtils.prevLF(log, rs);
ReflogEntry entry = new ReflogEntryImpl(log, rs < 0 ? 0 : rs + 2);
ret.add(entry);
}
return ret;
}
}