package com.link_intersystems.gitdirstat.domain;
import java.io.IOException;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
import org.eclipse.jgit.internal.storage.file.ReflogWriter;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.PersonIdent;
import org.eclipse.jgit.lib.RefUpdate;
import org.eclipse.jgit.lib.ReflogEntry;
import org.eclipse.jgit.lib.ReflogReader;
import org.eclipse.jgit.lib.Repository;
public abstract class Ref {
private org.eclipse.jgit.lib.Ref jgitRef;
private GitRepository gitRepository;
Ref(GitRepository gitRepository, org.eclipse.jgit.lib.Ref jgitRef) {
this.gitRepository = gitRepository;
this.jgitRef = jgitRef;
}
org.eclipse.jgit.lib.Ref getJgitRef() {
return jgitRef;
}
public ObjectId getCommitId() {
return getObjectId();
}
private ObjectId getObjectId() {
return jgitRef.getObjectId();
}
public String getName() {
return jgitRef.getName();
}
public String getSimpleName() {
String name = jgitRef.getName();
String simpleName = StringUtils.substringAfterLast(name, "/");
return simpleName;
}
public List<ReflogEntry> getReflogEntries() throws IOException {
Repository repo = gitRepository.getRepository();
ReflogReader reflogReader = repo.getReflogReader(getName());
List<ReflogEntry> reverseEntries = reflogReader.getReverseEntries();
return reverseEntries;
}
@Override
public String toString() {
return getName();
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result
+ ((getObjectId() == null) ? 0 : getObjectId().hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Ref other = (Ref) obj;
if (getObjectId() == null) {
if (other.getObjectId() != null)
return false;
} else if (!getObjectId().equals(other.getObjectId()))
return false;
return true;
}
public void update(ObjectId newId) throws IOException {
String refName = getName();
Repository repository = gitRepository.getRepository();
RefUpdate ru = repository.updateRef(refName);
ru.setNewObjectId(newId);
ru.setForceUpdate(true);
ru.update();
}
public boolean isUpdateable() {
return true;
}
public abstract void clearReflog() throws IOException;
protected ReflogWriter getReflogWriter() {
Repository repository = gitRepository.getRepository();
ReflogWriter reflogWriter = new ReflogWriter(repository);
return reflogWriter;
}
public void addReflogEntries(List<ReflogEntry> reflogEntries)
throws IOException {
String refName = getName();
ReflogWriter reflogWriter = getReflogWriter();
for (ReflogEntry nonExpiredEntry : reflogEntries) {
ObjectId oldId = nonExpiredEntry.getOldId();
ObjectId newId = nonExpiredEntry.getNewId();
PersonIdent ident = nonExpiredEntry.getWho();
String message = nonExpiredEntry.getComment();
reflogWriter.log(refName, oldId, newId, ident, message);
}
}
protected GitRepository getGitRepository() {
return gitRepository;
}
}