blob: aab5a3e14030ec987cf70facb33e64767bc22d94 [file] [log] [blame]
/*
* Copyright 2011 gitblit.com.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.gitblit.utils;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.revwalk.RevCommit;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.gitblit.models.PathModel;
import com.gitblit.models.RefModel;
import com.gitblit.models.TicketModel;
import com.gitblit.models.TicketModel.Comment;
/**
* Utility class for reading Ticgit issues.
*
* @author James Moger
*
*/
public class TicgitUtils {
static final Logger LOGGER = LoggerFactory.getLogger(TicgitUtils.class);
/**
* Returns a RefModel for the Ticgit branch in the repository. If the branch
* can not be found, null is returned.
*
* @param repository
* @return a refmodel for the ticgit branch or null
*/
public static RefModel getTicketsBranch(Repository repository) {
return JGitUtils.getBranch(repository, "ticgit");
}
/**
* Returns a list of all tickets in the ticgit branch of the repository.
*
* @param repository
* @return list of tickets
*/
public static List<TicketModel> getTickets(Repository repository) {
RefModel ticgitBranch = getTicketsBranch(repository);
if (ticgitBranch == null) {
return null;
}
RevCommit commit = (RevCommit) ticgitBranch.referencedObject;
List<PathModel> paths = JGitUtils.getFilesInPath(repository, null, commit);
List<TicketModel> tickets = new ArrayList<TicketModel>();
for (PathModel ticketFolder : paths) {
if (ticketFolder.isTree()) {
try {
TicketModel t = new TicketModel(ticketFolder.name);
loadTicketContents(repository, ticgitBranch, t);
tickets.add(t);
} catch (Throwable t) {
LOGGER.error("Failed to get a ticket!", t);
}
}
}
Collections.sort(tickets);
Collections.reverse(tickets);
return tickets;
}
/**
* Returns a TicketModel for the specified ticgit ticket. Returns null if
* the ticket does not exist or some other error occurs.
*
* @param repository
* @param ticketFolder
* @return a ticket
*/
public static TicketModel getTicket(Repository repository, String ticketFolder) {
RefModel ticketsBranch = getTicketsBranch(repository);
if (ticketsBranch != null) {
try {
TicketModel ticket = new TicketModel(ticketFolder);
loadTicketContents(repository, ticketsBranch, ticket);
return ticket;
} catch (Throwable t) {
LOGGER.error("Failed to get ticket " + ticketFolder, t);
}
}
return null;
}
/**
* Loads the contents of the ticket.
*
* @param repository
* @param ticketsBranch
* @param ticket
*/
private static void loadTicketContents(Repository repository, RefModel ticketsBranch,
TicketModel ticket) {
RevCommit commit = (RevCommit) ticketsBranch.referencedObject;
List<PathModel> ticketFiles = JGitUtils.getFilesInPath(repository, ticket.name, commit);
for (PathModel file : ticketFiles) {
String content = JGitUtils.getStringContent(repository, commit.getTree(), file.path)
.trim();
if (file.name.equals("TICKET_ID")) {
ticket.id = content;
} else if (file.name.equals("TITLE")) {
ticket.title = content;
} else {
String[] chunks = file.name.split("_");
if (chunks[0].equals("ASSIGNED")) {
ticket.handler = content;
} else if (chunks[0].equals("COMMENT")) {
try {
Comment c = new Comment(file.name, content);
ticket.comments.add(c);
} catch (ParseException e) {
LOGGER.error("Failed to parse ticket comment", e);
}
} else if (chunks[0].equals("TAG")) {
if (content.startsWith("TAG_")) {
ticket.tags.add(content.substring(4));
} else {
ticket.tags.add(content);
}
} else if (chunks[0].equals("STATE")) {
ticket.state = content;
}
}
}
Collections.sort(ticket.comments);
}
}