/* * Copyright (c) 2011, 2012 Roberto Tyley * * This file is part of 'Agit' - an Android Git client. * * Agit is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Agit is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see http://www.gnu.org/licenses/ . */ package com.madgag.agit.git.model; import static com.google.common.collect.Iterables.transform; import static com.google.common.collect.Lists.newArrayList; import static com.madgag.agit.git.GitObjects.evaluate; import static com.madgag.agit.git.model.RDTTag.TagSummary.SORT_BY_TIME_AND_NAME; import static java.util.Collections.sort; import static org.eclipse.jgit.lib.Repository.shortenRefName; import com.google.common.base.Function; import com.google.common.primitives.Longs; import com.google.inject.Inject; import com.madgag.agit.git.GitObjectFunction; import com.madgag.agit.git.model.RDTTag.TagSummary; import java.io.IOException; import java.util.Comparator; import java.util.List; import org.eclipse.jgit.lib.PersonIdent; 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.revwalk.RevObject; import org.eclipse.jgit.revwalk.RevTag; import org.eclipse.jgit.revwalk.RevTree; import org.eclipse.jgit.revwalk.RevWalk; public class RDTTag extends RepoDomainType<TagSummary> { @Inject public RDTTag(Repository repository) { super(repository); } @Override public String name() { return "tag"; } public List<TagSummary> getAll() { final RevWalk revWalk = new RevWalk(repository); List<TagSummary> tagSummaries = newArrayList(transform(repository.getTags().values(), new TagSummaryFactory(revWalk))); sort(tagSummaries, SORT_BY_TIME_AND_NAME); return tagSummaries; } @Override String conciseSeparator() { return " • "; } @Override CharSequence conciseSummary(TagSummary tagRef) { return idFor(tagRef); } @Override public String idFor(TagSummary tagSummary) { return shortenRefName(tagSummary.getRef().getName()); } @Override public CharSequence conciseSummaryTitle() { return "Tags"; } @Override public CharSequence shortDescriptionOf(TagSummary tagSummary) { //ObjectId peeledObjectId = repository.peel(tagSummary.getRef()).getPeeledObjectId(); //ObjectId taggedId = peeledObjectId==null?ref.getObjectId():peeledObjectId; return evaluate(tagSummary.getTaggedObject(), GIT_OBJECT_SHORT_DESCRIPTION); } public static class TagSummary { public final static Comparator<TagSummary> SORT_BY_TIME_AND_NAME = new Comparator<TagSummary>() { public int compare(TagSummary t1, TagSummary t2) { int timeDiff = Longs.compare(t1.getTime(), t2.getTime()); if (timeDiff != 0) { return timeDiff; } return t1.name.compareTo(t2.name); } }; private final String name; private final Ref tagRef; private final RevTag tagObject; private final RevObject taggedObject; private final long time; public TagSummary(Ref tagRef, RevTag tagObject, RevObject taggedObject, long time) { this.tagRef = tagRef; this.time = time; name = shortenRefName(tagRef.getName()); this.tagObject = tagObject; this.taggedObject = taggedObject; } public CharSequence getName() { return name; } @Override public String toString() { return name; } public RevObject getTaggedObject() { return taggedObject; } public Ref getRef() { return tagRef; } public boolean isLightweight() { return tagObject == null; } public long getTime() { return time; } } static GitObjectFunction.Base<String> GIT_OBJECT_SHORT_DESCRIPTION = new GitObjectFunction.Base<String>() { public String apply(RevCommit commit) { return "Commit: " + commit.abbreviate(4).name() + " " + commit.getShortMessage(); } public String apply(RevTree tree) { return "Tree: " + tree.abbreviate(4).name() + " " + tree; } public String applyDefault(RevObject revObject) { return "..."; } }; private static class TagSummaryFactory implements Function<Ref, TagSummary> { private final RevWalk revWalk; public TagSummaryFactory(RevWalk revWalk) { this.revWalk = revWalk; } public GitObjectFunction<Long> gitObjectTime = new GitObjectFunction<Long>() { public Long apply(RevCommit commit) { return (long) commit.getCommitTime(); } public Long apply(RevTree tree) { return 0L; } public Long apply(RevBlob blob) { return 0L; } public Long apply(RevTag tag) { PersonIdent taggerIdent = tag.getTaggerIdent(); if (taggerIdent != null) { return taggerIdent.getWhen().getTime(); } try { return evaluate(revWalk.parseAny(tag.getObject()), this); } catch (IOException e) { throw new RuntimeException(); } } }; public TagSummary apply(Ref tagRef) { RevObject objectPointedToByRef; try { objectPointedToByRef = revWalk.parseAny(tagRef.getObjectId()); } catch (Exception e) { throw new RuntimeException(e); } RevTag tagObject = null; RevObject taggedObject; long time; if (objectPointedToByRef instanceof RevTag) { // annotated tagObject = (RevTag) objectPointedToByRef; try { taggedObject = revWalk.parseAny(tagObject.getObject()); time = evaluate(tagObject, gitObjectTime); } catch (Exception e) { throw new RuntimeException(e); } } else { // lightweight taggedObject = objectPointedToByRef; time = evaluate(taggedObject, gitObjectTime); } return new TagSummary(tagRef, tagObject, taggedObject, time); } } }