blob: 9a4a822b59a561a51088757781570a360b57306c [file] [log] [blame]
/*
* Copyright (C) 2011, Ketan Padegaonkar <ketanpadegaonkar@gmail.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.api;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.api.errors.JGitInternalException;
import org.eclipse.jgit.errors.IncorrectObjectTypeException;
import org.eclipse.jgit.errors.MissingObjectException;
import org.eclipse.jgit.lib.AnyObjectId;
import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.Ref;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.revwalk.RevWalk;
/**
* Used to obtain a list of tags.
*
* @see <a href="http://www.kernel.org/pub/software/scm/git/docs/git-tag.html"
* >Git documentation about Tag</a>
*/
public class ListTagCommand extends GitCommand<List<Ref>> {
private final RevWalk rw;
private RevCommit commit;
/**
* Constructor for ListTagCommand.
*
* @param repo
* a {@link org.eclipse.jgit.lib.Repository} object.
*/
protected ListTagCommand(Repository repo) {
super(repo);
rw = new RevWalk(repo);
}
/**
* Only list tags which contain the specified commit.
*
* @param commit
* the specified commit
* @return this command
* @throws IOException
* if an IO error occurred
* @throws IncorrectObjectTypeException
* if commit has an incorrect object type
* @throws MissingObjectException
* if the commit is missing
*
* @since 6.6
*/
public ListTagCommand setContains(AnyObjectId commit)
throws MissingObjectException, IncorrectObjectTypeException,
IOException {
checkCallable();
this.commit = rw.parseCommit(commit);
return this;
}
@Override
public List<Ref> call() throws GitAPIException {
checkCallable();
List<Ref> tags;
try {
List<Ref> refList = repo.getRefDatabase()
.getRefsByPrefix(Constants.R_TAGS);
if (commit != null) {
// if body is retained #getMergedInto needs to access data not
// available in commit graph which is slower
rw.setRetainBody(false);
tags = rw.getMergedInto(commit, refList);
} else {
tags = new ArrayList<>(refList);
}
} catch (IOException e) {
throw new JGitInternalException(e.getMessage(), e);
} finally {
rw.close();
}
Collections.sort(tags,
(Ref o1, Ref o2) -> o1.getName().compareTo(o2.getName()));
setCallable(false);
return tags;
}
}